diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 6b2ea7b2792..5c2aea57011 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -979,7 +979,7 @@
"asQ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/lobby)
"asR" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor,/area/security/prison/cell_block/C)
"asS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor,/area/security/prison/cell_block/C)
-"asT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor,/area/security/prison/cell_block/C)
+"asT" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
"asU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/security/prison/cell_block/C)
"asV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/security/prison/cell_block/C)
"asW" = (/obj/machinery/newscaster{pixel_x = -28; pixel_y = 1},/obj/structure/table/woodentable,/obj/machinery/light/small/lamp/green{on = 0; pixel_x = -3; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/flask/detflask,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
@@ -1365,8 +1365,8 @@
"aAm" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/stool/bed/chair/sofa,/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
"aAn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/barber{pixel_y = 30},/obj/structure/stool/bed/chair/sofa/left,/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
"aAo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
-"aAp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/space)
-"aAq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/space)
+"aAp" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck/black,/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
+"aAq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor,/area/security/prison/cell_block/C)
"aAr" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aAs" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/fsmaint2)
"aAt" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Fore Starboard Solar APC"; pixel_x = -25; pixel_y = 3},/turf/simulated/floor/plating,/area/solar/auxstarboard)
@@ -1522,7 +1522,7 @@
"aDn" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor,/area/crew_quarters/fitness)
"aDo" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"aDp" = (/turf/simulated/wall,/area/maintenance/abandonedbar)
-"aDq" = (/obj/structure/lattice,/turf/space,/area/maintenance/abandonedbar)
+"aDq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
"aDr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
"aDs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
"aDt" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_1_berth_hatch"; locked = 1; name = "Escape Pod"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
@@ -1572,8 +1572,8 @@
"aEl" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"aEm" = (/obj/structure/table,/obj/item/weapon/paper/holodeck,/turf/simulated/floor,/area/crew_quarters/fitness)
"aEn" = (/turf/simulated/floor/plating/airless,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_chapel_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk1"; icon_state = "catwalk1"},/area/solar/auxstarboard)
-"aEo" = (/turf/space,/area/maintenance/abandonedbar)
-"aEp" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck/black,/turf/simulated/floor/wood,/area/space)
+"aEo" = (/obj/structure/table/woodentable,/obj/structure/mirror{pixel_x = -28},/obj/item/weapon/storage/pill_bottle/random_drug_bottle,/turf/simulated/floor{dir = 10; icon_state = "purple"},/area/maintenance/abandonedbar)
+"aEp" = (/obj/item/weapon/stool,/turf/simulated/floor/plating{dir = 10; icon_regular_floor = "purplecorner"},/area/maintenance/abandonedbar)
"aEq" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
"aEr" = (/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
"aEs" = (/obj/item/stack/tile/wood,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
@@ -1628,8 +1628,8 @@
"aFp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/crew_quarters/fitness)
"aFq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aFr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aFs" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/plating,/area/space)
-"aFt" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/space)
+"aFs" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/random,/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
+"aFt" = (/turf/simulated/floor{dir = 4; icon_state = "whitecorner"},/area/maintenance/abandonedbar)
"aFu" = (/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
"aFv" = (/obj/item/trash/liquidfood,/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
"aFw" = (/obj/structure/sink/kitchen{pixel_y = 25},/obj/machinery/light_construct/small{dir = 4},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
@@ -1696,9 +1696,9 @@
"aGF" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"aGG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aGH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_chapel_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "solar_chapel_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "solar_chapel_airlock"; pixel_x = 25; req_access_txt = "13"; tag_airpump = "solar_chapel_pump"; tag_chamber_sensor = "solar_chapel_sensor"; tag_exterior_door = "solar_chapel_outer"; tag_interior_door = "solar_chapel_inner"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aGI" = (/obj/machinery/light_construct/small{dir = 8},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/space)
-"aGJ" = (/obj/machinery/vending/autodrobe,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aGK" = (/obj/item/weapon/shard,/obj/item/stack/rods,/obj/item/weapon/airlock_electronics,/turf/simulated/floor/plating{dir = 9; icon_regular_floor = "escape"},/area/space)
+"aGI" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating{dir = 10; icon_regular_floor = "escape"},/area/maintenance/abandonedbar)
+"aGJ" = (/obj/machinery/light_construct/small{dir = 1},/turf/simulated/floor/plating{dir = 4; icon_regular_floor = "whitecorner"},/area/maintenance/abandonedbar)
+"aGK" = (/obj/item/trash/cheesie,/turf/simulated/floor{icon_state = "whitehall"; dir = 5},/area/maintenance/abandonedbar)
"aGL" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "escape"},/area/maintenance/abandonedbar)
"aGM" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{dir = 5; icon_regular_floor = "escape"},/area/maintenance/abandonedbar)
"aGN" = (/obj/item/weapon/lighter/random,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
@@ -1762,10 +1762,10 @@
"aHT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aHU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aHV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aHW" = (/obj/item/trash/cheesie,/turf/simulated/floor{icon_state = "whitehall"; dir = 5},/area/maintenance/fsmaint2)
-"aHX" = (/obj/machinery/light_construct/small{dir = 1},/turf/simulated/floor/plating{dir = 4; icon_regular_floor = "whitecorner"},/area/maintenance/fsmaint2)
-"aHY" = (/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/space)
-"aHZ" = (/obj/structure/door_assembly,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aHW" = (/obj/structure/door_assembly,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
+"aHX" = (/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/maintenance/abandonedbar)
+"aHY" = (/obj/item/weapon/shard,/obj/item/stack/rods,/obj/item/weapon/airlock_electronics,/turf/simulated/floor/plating{dir = 9; icon_regular_floor = "escape"},/area/maintenance/abandonedbar)
+"aHZ" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/abandonedbar)
"aIa" = (/obj/item/stack/tile/plasteel,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
"aIb" = (/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating{dir = 4; icon_regular_floor = "escape"},/area/maintenance/abandonedbar)
"aIc" = (/obj/structure/stool,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
@@ -1816,9 +1816,9 @@
"aIV" = (/obj/machinery/power/solar_control{id = "auxsolareast"; name = "Fore Starboard Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aIW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_chapel_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aIX" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aIY" = (/turf/simulated/floor{dir = 4; icon_state = "whitecorner"},/area/maintenance/fsmaint2)
-"aIZ" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/random,/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aJa" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating{dir = 10; icon_regular_floor = "escape"},/area/space)
+"aIY" = (/obj/machinery/vending/autodrobe,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
+"aIZ" = (/obj/machinery/light_construct/small{dir = 8},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
+"aJa" = (/turf/simulated/wall,/area/civilian/pet_store)
"aJb" = (/obj/item/stack/rods,/turf/simulated/floor{dir = 2; icon_state = "escape"},/area/maintenance/abandonedbar)
"aJc" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{dir = 6; icon_state = "escape"},/area/maintenance/abandonedbar)
"aJd" = (/obj/item/trash/pistachios,/obj/machinery/light_construct,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
@@ -1878,8 +1878,8 @@
"aKf" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aKg" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aKh" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aKi" = (/obj/item/weapon/stool,/turf/simulated/floor/plating{dir = 10; icon_regular_floor = "purplecorner"},/area/maintenance/fsmaint2)
-"aKj" = (/obj/structure/table/woodentable,/obj/structure/mirror{pixel_x = -28},/obj/item/weapon/storage/pill_bottle/random_drug_bottle,/turf/simulated/floor{dir = 10; icon_state = "purple"},/area/maintenance/fsmaint2)
+"aKi" = (/obj/machinery/door/airlock/glass{name = "Pet Store"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/civilian/pet_store)
+"aKj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/civilian/pet_store)
"aKk" = (/turf/simulated/wall/r_wall,/area/maintenance/fsmaint2)
"aKl" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/arrival/station)
"aKm" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/arrival/station)
@@ -2487,7 +2487,7 @@
"aVQ" = (/turf/simulated/floor{dir = 2; icon_state = "asteroid"; tag = "icon-asteroid (NORTH)"},/turf/simulated/floor{tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; dir = 1},/turf/simulated/floor{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/hydroponics)
"aVR" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Hydroponics Pasture"; req_access_txt = "35"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
"aVS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
-"aVT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
+"aVT" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/hallway/primary/port)
"aVU" = (/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
"aVV" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = -31},/obj/machinery/light,/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
"aVW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
@@ -2619,7 +2619,7 @@
"aYs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/port)
"aYt" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "Port Hallway"; dir = 1},/turf/simulated/floor,/area/hallway/primary/port)
"aYu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/port)
-"aYv" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/hallway/primary/port)
+"aYv" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/primary/port)
"aYw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/hallway/primary/port)
"aYx" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/hallway/primary/port)
"aYy" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/hallway/primary/central/nw)
@@ -2693,9 +2693,9 @@
"aZO" = (/turf/simulated/wall,/area/maintenance/port)
"aZP" = (/turf/simulated/wall,/area/storage/emergency2)
"aZQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock{name = "Port Emergency Storage"; req_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency2)
-"aZR" = (/obj/structure/table,/turf/simulated/floor,/area/hallway/primary/port)
-"aZS" = (/obj/structure/table,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/primary/port)
-"aZT" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/closet/emcloset,/turf/simulated/floor,/area/hallway/primary/port)
+"aZR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor{icon_state = "wood"},/area/civilian/pet_store)
+"aZS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "wood"},/area/civilian/pet_store)
+"aZT" = (/obj/machinery/light_switch{pixel_x = -24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "wood"},/area/civilian/pet_store)
"aZU" = (/obj/structure/closet/emcloset,/turf/simulated/floor,/area/hallway/primary/port)
"aZV" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/hallway/primary/port)
"aZW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atm{pixel_x = 24},/turf/simulated/floor,/area/hallway/primary/port)
@@ -2792,9 +2792,9 @@
"bbJ" = (/obj/machinery/vending/shoedispenser,/turf/simulated/floor,/area/crew_quarters/locker)
"bbK" = (/turf/simulated/floor/plating,/area/maintenance/port)
"bbL" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/port)
-"bbM" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/storage/emergency2)
-"bbN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency2)
-"bbO" = (/obj/machinery/light_switch{pixel_y = 28},/obj/item/device/flashlight/flare,/turf/simulated/floor/plating,/area/storage/emergency2)
+"bbM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/storage/emergency2)
+"bbN" = (/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/carpet,/area/civilian/pet_store)
+"bbO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/civilian/pet_store)
"bbP" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/storage/emergency2)
"bbQ" = (/turf/simulated/wall,/area/storage/tools)
"bbR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/storage/tools)
@@ -2865,10 +2865,10 @@
"bde" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/port)
"bdf" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plating,/area/storage/emergency2)
"bdg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency2)
-"bdh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency2)
-"bdi" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/emergency2)
-"bdj" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/storage/emergency2)
-"bdk" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/storage/emergency2)
+"bdh" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/carpet,/area/civilian/pet_store)
+"bdi" = (/obj/item/device/flashlight/flare,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/emergency2)
+"bdj" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plating,/area/storage/emergency2)
+"bdk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor,/area/hallway/primary/port)
"bdl" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/camera{c_tag = "Auxiliary Tool Storage"; dir = 2},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/storage/tools)
"bdm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor,/area/storage/tools)
"bdn" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/storage/tools)
@@ -2938,9 +2938,9 @@
"bez" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/crew_quarters/locker)
"beA" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera{c_tag = "Locker Room East"; dir = 8; network = list("SS13")},/obj/machinery/light{dir = 4},/turf/simulated/floor,/area/crew_quarters/locker)
"beB" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/storage/emergency2)
-"beC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/storage/emergency2)
-"beD" = (/turf/simulated/floor/plating,/area/storage/emergency2)
-"beE" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/storage/emergency2)
+"beC" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
+"beD" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "wood"},/area/civilian/pet_store)
+"beE" = (/obj/structure/table/woodentable,/obj/machinery/fishtank/bowl,/turf/simulated/floor{icon_state = "wood"},/area/civilian/pet_store)
"beF" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/decal/warning_stripes/white/hollow,/turf/simulated/floor/plating,/area/storage/emergency2)
"beG" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor,/area/storage/tools)
"beH" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor,/area/storage/tools)
@@ -3110,7 +3110,7 @@
"bhP" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"bhQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
"bhR" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/port)
-"bhS" = (/obj/item/clothing/gloves/color/rainbow,/obj/item/clothing/shoes/rainbow,/obj/item/clothing/head/soft/rainbow,/obj/item/clothing/under/rainbow,/turf/simulated/floor/plating,/area/maintenance/port)
+"bhS" = (/obj/machinery/vending/crittercare,/turf/simulated/floor{icon_state = "wood"},/area/civilian/pet_store)
"bhT" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/storage/tools)
"bhU" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/storage/tools)
"bhV" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/rack{dir = 8; layer = 2.9},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/item/device/multitool,/turf/simulated/floor,/area/storage/tools)
@@ -3556,7 +3556,7 @@
"bqt" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "AI Upload APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"bqu" = (/obj/machinery/computer/borgupload,/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 0; pixel_y = -29},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"bqv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload)
-"bqw" = (/obj/structure/table,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access_txt = "20"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/aiModule/supplied/oxygen,/obj/item/weapon/aiModule/zeroth/oneHuman,/obj/item/weapon/aiModule/reset/purge,/obj/item/weapon/aiModule/core/full/antimov,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
+"bqw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small,/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/storage/emergency2)
"bqx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"bqy" = (/obj/machinery/light{dir = 8},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bqz" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain)
@@ -5655,6 +5655,7 @@
"ceM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/turf/simulated/floor/wood,/area/blueshield)
"ceN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall,/area/ntrep)
"ceO" = (/obj/structure/filingcabinet,/turf/simulated/floor/wood,/area/ntrep)
+"ceP" = (/turf/simulated/floor{icon_state = "wood"},/area/civilian/pet_store)
"ceQ" = (/obj/machinery/door_control{id = "representative"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "73"},/obj/machinery/computer/secure_data,/turf/simulated/floor/wood,/area/ntrep)
"ceR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/structure/closet/secure_closet/ntrep,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/ntrep)
"ceS" = (/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/camera{c_tag = "Aft Primary Hallway 1"; dir = 4; network = list("SS13")},/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
@@ -8106,6 +8107,7 @@
"cZU" = (/obj/structure/closet/wardrobe/black,/obj/machinery/camera{c_tag = "Aft Port Solar Access"; dir = 1; network = list("SS13")},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft)
"cZV" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
"cZW" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"cZX" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor{icon_state = "wood"},/area/civilian/pet_store)
"cZY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_control{id = "maint2"; name = "Blast Control Door B"; pixel_x = -28; pixel_y = 4},/obj/machinery/door_control{id = "maint1"; name = "Blast Control Door A"; pixel_x = -28; pixel_y = -6},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"cZZ" = (/obj/structure/janitorialcart,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"daa" = (/obj/structure/table/glass,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
@@ -8127,7 +8129,9 @@
"daq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/maintenance/electrical)
"dar" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plating,/area/maintenance/electrical)
"das" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating,/area/maintenance/electrical)
+"dat" = (/obj/item/clothing/gloves/color/rainbow,/obj/item/clothing/shoes/rainbow,/obj/item/clothing/head/soft/rainbow,/obj/item/clothing/under/rainbow,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"dau" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"dav" = (/obj/structure/table,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access_txt = "20"},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/aiModule/supplied/oxygen,/obj/item/weapon/aiModule/zeroth/oneHuman,/obj/item/weapon/aiModule/reset/purge,/obj/item/weapon/aiModule/core/full/antimov,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload)
"day" = (/obj/machinery/power/terminal,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/electrical)
"daz" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/electrical)
"daA" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/electrical)
@@ -8214,11 +8218,7 @@
"dcl" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/rust,/area/maintenance/abandonedbar)
"dcm" = (/turf/simulated/wall/rust,/area/maintenance/fsmaint2)
"dcn" = (/turf/simulated/wall/r_wall/rust,/area/maintenance/fsmaint2)
-"dco" = (/turf/simulated/wall/rust,/area/space)
"dcp" = (/obj/structure/mineral_door/wood{name = "Abandoned Bar"},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
-"dcr" = (/turf/simulated/floor/plating{icon_state = "panelscorched"},/area/maintenance/abandonedbar)
-"dcs" = (/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
-"dcu" = (/turf/space,/area/maintenance/fsmaint2)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8306,15 +8306,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaapBaaaasrassassassassastasuasvaswaswaswaswasxaaaaczaaaaaaaaaamlaoRaoRaoSamlaaaaaaaaaaoTaoUaoVaoWaoXaoYaoYaoYaoZaoZaoZaoZapaapbapcapcapcapdapeapfapdapcapcapcapgaphapiapjapkapiaplaphapmapmapmapnapoapmappapqaprapsaptapuapvaoIaoJapwapwamiapxapyapzamiapAamiaabasqaabaaaapCaqDapEaaaaaaapCaqDapEaaaaaaapCaqDapEaabaabaaaaabaoOaabaaaaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaaczaycatlatlatlatlatlaaaatmaaaatlatlatlatlatlaabaczaaaaaaaaaamUapGaoRapHamlampapIaocapJapKapLapMapNapOapPapQaoZapRapSapTapUapVapWapXapYapZaqaaqbaqcaqdaqeapWaqfaqgaqhaqiaqjaqkaqlaqgapmaqmaqnaqoaqpapmaqqaqraqsaqtaquaqvapvaoIaqwaqxaqyaqzaqAaqAaqBamiaqCamiaabasqaabaaaapCaqDapEaaaaaaapCaqDapEaaaaaaapCaqDapEaaaaaaaaaaabasqaabaaaaaaawTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaaczaaaaaaaaaaabaaaaaaaaaaxyaaaaaaaaaaabaaaaaaaaaaczaaaaaaaaaamlaqEaoRaoRaqFaqGaqHaqIaqJaqKanjaqLaqManeaneaqNaoZaqOaqPaqQaqRaqSaqTaqUaqVaqWaqXaqYaqZaqVaraarbarcardarearfargarhariarjarkarlarmarnaroapmarparqarqarrarqarsapvaoIanTanTanTanTartanTaruarvarwamiarxaxvarAaaaaaaaoOaabaabaabaabaoOaabaabaabaabaoOaabaabaabaabaxwaxxarAaabaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaaczaabarBarBarBarBarBaaaatmaaaarBarBarBarBarBaabaczaaaaaaaaaamlarDarDarDamlampamqamqarEarFarGaojarHarIanearJaoZarKarLarMarNarOarParQarRarSarTarUarVarWarXarParYarjarZasaasbarZariascapmasdaseasfasgapmashasiarqarrarqasjapvaskaslasmasnasmasoaspamiamiaoJamiasqaxWaxXaryaryaxvaryaryaryaryaxvaryaryaryaryaxvaryaryaryaxYaxZaxWasqaabaaaamjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaaaaIRaIRaApaAqaAqaDraDraDsaDpaDpaDqaDqaEoaEoaEoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaaczaaaasrassassassassastasuasvaswaswaswaswasxaaaaczaaaaaaaaaasyaszaszaszasAasBaaaaaaaoUaoUaoUaoUaoUasCaneasDasEaoZaoZaoZasFasGapcapcapcapcasHasIapcapcapcasJasKasLasMasNasOasPariasQapmasRasSasTasUasVasWasXasYasZarqataapvatbatcatdateatfatgathatiatjatkamiayKaxvayLaabaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabayPayQayLaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaIRaIRaFsaEpaFtaEraEsaEtaEuaEqaDpaDpaEoaEoaEoaEoaEoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaaabayZatlatlatlatlatlaaaatmaaaatlatlatlatlatlaabaczaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoUatnaneasDasEatoapSapTapUapVapWatpapYatqatratsattatuatvapWatwatxatyatzatAatAatBatCapmatDatEatFatGapmatHatIatJarrarqatKapvatbartatcatcatcatLanTatMatNatOamiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaabaabaabaabazDaabaabaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaIRaIRaIRaIRaGIaEraFuaEraFuaFvaEraEraEraFwaDpaEoaEoaEoaEoaEoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaaczaaaaaaaabaaaaabaaaaaaazJaaaaaaaabaaaaabaaaaaaaczaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaoUatPaneatQasEaqOatRatSatTatUatVatWatXatYatZauaaubaucaudaueaufaugaugauhaugaugauiaujaukaulaumapmaunapmauoaupauqaurausautapvatbauuauvauvauvauwauxauyauzauAamiaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaabaabaabaEnaabaabaaaaaaaabaaaaabaabaaaaaaaaaaaaaaaaaaaaaaIRaAsaGJdcmaGKaGLaGMaGNaEraEraGOaGPaEraGQaDpaEoaEoaEoaEoaEoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaaczaczaczaabaabaabaabaDxaDyaDxaabaabaabaabaczaczaczaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoUauBaneauCasEarKauDauEauFauGarParQauHauIauJauKauIauLarXarPauMauNauOauNauNauOauNauPapmasRauQapmauRapmauSauTauUauVauWauWauXauYauZavaavaavaavbavcavdaveaveaveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaabaabaFqaFraFqaabaabaaaaabaaaaaaaabaabaaaaaaaaaaaaaaaaaaaIRaHXaHWaHZaHYaIaaIbaEraEraEraIcaIdaEraIeaDpaEoaEoaEoaEoaEoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaagaaaaaaaaaaaaaabaaaaabaaaaaaaabaaaaEFaEGaEHaaaaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfavfavfavfavfavfaoUaoUavgaoUasEasEasEavhaviavjavkavkavlavkavlavkavkavmasJasJavnavoavpavqavoavpavqavravsavsavsavsavsapmavtavuavvavvavwavvavxavyavaavzavAavBavbavCavDavEavFavcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaabaaaaGGaGHaGGaaaaabaaaaabaaaaaaaaaaabaabaaaaaaaaaaaaaaaaIRaIZaIYdcmaJaaJbaJcaJdaEraJfaJgaJhaJiaDpaJjaDqaEoaEoaEoaEoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaaabaaaaabaaaaaaaabaFJaFKaFLaFMaFNaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfavGavHavIavJavKavLavMavNavMavOavMavMavPavQavQavQavQavQavRavSavTavQavQavQavQavUavQavQavQavQavVavWavXavYavZawaawbawcapuawdaweawfawgawhawiawjawkavaawlawmawnavbawoawpawoawqavcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaabaHRaHSaHTaHUaHVaabaaaaabaaaaaaaaaaaaaabaabaaaaaaaaaaaaaIRaKjaKidcmaIRdckdcodcldcpaDpaDpaDpaDpaMUaDpaDqaDqaEoaEoaEoaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaaaaaaaaaaaaaaaaaaaabaabaaaaabaaaaaaaabaHaaHbaHcaHdaHaaABaABaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfawrawsawtawuawYawvawwawxawyavVavVavVawzavVavVavVavVavVawAavVavVavVavVavVavVawBavVavVavVavVawCavVawDavVawEavVavVawFapuawGawHawIawJawfawKawjawLavaawMawNawOawPawQawRawSavFavcaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabaIUaIVaIWaIXaIUaabaaaaabaaaaaaaabaaaaaaaabaabaaaaaaaMUaMUdcmaMUdcmaLHdcrdcsdckdcsaLHaLHaAraMUdcudcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaABaABaABaABaABaabaabaHaaADaAGaIuaHaaBuaABaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfawUawVawWawXctIavfawZaxaaxbaxcaxdaxeaxfaxgaxaaxcaxcaxcaxhaxcaxcaxcaxcaxcaxcaxiaxjaxkaxkaxkaxlaxmaxnaxmaxoaxpaxmaxqapuaxraxraxraxraxraxrawjawkavaaxsawmaxtavbawoaxuawoawqavcaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaabaIUaKeaKfaKgaIUaabaaaaabaaaaaaaabaaaaaaaMUazCaMUazCaMUaAraLHaLHaLHaLHaLHaLHaLHaLHaLHaNaaAsaMUdcudcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaaczaabarBarBarBarBarBaaaatmaaaarBarBarBarBarBaabaczaaaaaaaaaamlarDarDarDamlampamqamqarEarFarGaojarHarIanearJaoZarKarLarMarNarOarParQarRarSarTarUarVarWarXarParYarjarZasaasbarZariascapmasdaseasfasgapmashasiarqarrarqasjapvaskaslasmasnasmasoaspamiamiaoJamiasqaxWaxXaryaryaxvaryaryaryaryaxvaryaryaryaryaxvaryaryaryaxYaxZaxWasqaabaaaamjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaaaaDpaDpaDqaDraDraDraDraDsaDpaDpaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaaczaaaasrassassassassastasuasvaswaswaswaswasxaaaaczaaaaaaaaaasyaszaszaszasAasBaaaaaaaoUaoUaoUaoUaoUasCaneasDasEaoZaoZaoZasFasGapcapcapcapcasHasIapcapcapcasJasKasLasMasNasOasPariasQapmasRasSaAqasUasVasWasXasYasZarqataapvatbatcatdateatfatgathatiatjatkamiayKaxvayLaabaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabayPayQayLaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaDpaDpasTaApaEqaEraEsaEtaEuaEqaDpaDpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaaabayZatlatlatlatlatlaaaatmaaaatlatlatlatlatlaabaczaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoUatnaneasDasEatoapSapTapUapVapWatpapYatqatratsattatuatvapWatwatxatyatzatAatAatBatCapmatDatEatFatGapmatHatIatJarrarqatKapvatbartatcatcatcatLanTatMatNatOamiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaabaabaabaabazDaabaabaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaDpaDpaDpaDpaIZaEraFuaEraFuaFvaEraEraEraFwaDpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaaczaaaaaaaabaaaaabaaaaaaazJaaaaaaaabaaaaabaaaaaaaczaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaoUatPaneatQasEaqOatRatSatTatUatVatWatXatYatZauaaubaucaudaueaufaugaugauhaugaugauiaujaukaulaumapmaunapmauoaupauqaurausautapvatbauuauvauvauvauwauxauyauzauAamiaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaabaabaabaEnaabaabaaaaaaaabaaaaabaabaaaaaaaaaaaaaaaaaaaaaaDpaHZaIYdckaHYaGLaGMaGNaEraEraGOaGPaEraGQaDpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaaczaczaczaabaabaabaabaDxaDyaDxaabaabaabaabaczaczaczaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoUauBaneauCasEarKauDauEauFauGarParQauHauIauJauKauIauLarXarPauMauNauOauNauNauOauNauPapmasRauQapmauRapmauSauTauUauVauWauWauXauYauZavaavaavaavbavcavdaveaveaveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaabaabaFqaFraFqaabaabaaaaabaaaaaaaabaabaaaaaaaaaaaaaaaaaaaDpaGJaGKaHWaHXaIaaIbaEraEraEraIcaIdaEraIeaDpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaagaaaaaaaaaaaaaabaaaaabaaaaaaaabaaaaEFaEGaEHaaaaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfavfavfavfavfavfaoUaoUavgaoUasEasEasEavhaviavjavkavkavlavkavlavkavkavmasJasJavnavoavpavqavoavpavqavravsavsavsavsavsapmavtavuavvavvavwavvavxavyavaavzavAavBavbavCavDavEavFavcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaabaaaaGGaGHaGGaaaaabaaaaabaaaaaaaaaaabaabaaaaaaaaaaaaaaaaDpaFsaFtdckaGIaJbaJcaJdaEraJfaJgaJhaJiaDpaJjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaoPaoPaaaaaaaaaaaaaaaaaaaabaaaaabaaaaaaaabaFJaFKaFLaFMaFNaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfavGavHavIavJavKavLavMavNavMavOavMavMavPavQavQavQavQavQavRavSavTavQavQavQavQavUavQavQavQavQavVavWavXavYavZawaawbawcapuawdaweawfawgawhawiawjawkavaawlawmawnavbawoawpawoawqavcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaabaHRaHSaHTaHUaHVaabaaaaabaaaaaaaaaaaaaabaabaaaaaaaaaaaaaDpaEoaEpdckaDpdckdckdcldcpaDpaDpaDpaDpaDpaDpaabaabaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoPaoPaoPaaaaaaaaaaaaaaaaaaaabaabaaaaabaaaaaaaabaHaaHbaHcaHdaHaaABaABaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfawrawsawtawuawYawvawwawxawyavVavVavVawzavVavVavVavVavVawAavVavVavVavVavVavVawBavVavVavVavVawCavVawDavVawEavVavVawFapuawGawHawIawJawfawKawjawLavaawMawNawOawPawQawRawSavFavcaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaabaIUaIVaIWaIXaIUaabaaaaabaaaaaaaabaaaaaaaabaabaaaaaaaMUaDpdckaDpdckaLHaKaaLHdcmaLHaLHaLHaAraMUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaABaABaABaABaABaabaabaHaaADaAGaIuaHaaBuaABaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfawUawVawWawXctIavfawZaxaaxbaxcaxdaxeaxfaxgaxaaxcaxcaxcaxhaxcaxcaxcaxcaxcaxcaxiaxjaxkaxkaxkaxlaxmaxnaxmaxoaxpaxmaxqapuaxraxraxraxraxraxrawjawkavaaxsawmaxtavbawoaxuawoawqavcaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaabaIUaKeaKfaKgaIUaabaaaaabaaaaaaaabaaaaaaaMUazCaMUazCaMUaAraLHaLHaLHaLHaLHaLHaLHaLHaLHaNaaAsaMUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaBAaBzaBAaaaaaaaaaaABaABaABaABaCCaBGaCDaABaaaaaaaHaaJtaCEaJvaDzayYaABaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfavfavfavfavfavfavfaxzaxzaxAaxBaxCaxDaxEaxFaxGaxHaxIaxGaxJaxGaxKaxKaxKaxKaxKaxKaxLaxKaxKaxMaxNaxOaxPaxzaxQaxzaxRaxzaxzaqzaBlanTanTanTanTaxSawkavaaxTawmaxUavbaxVawRawSavFavcaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaBAaChaBAaaaaabaIUaAtaLvaLwaIUaKkaKkaKkaKkaKkaAuaAwaAvaMUaBiaLHaNaaAsdcmaLHdcmdcmdcmaMUaBkaMUaMUaMUaMUaMUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaayaaybayaaaaaaaaabaABaBwaEIaEEayYaFOayYaABaGZaHeaHaaHaaHfaKBaDzayYaABaABaHhaHgaHeaABaABaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxAaydayeayfaxEaygaxGayhayiayjaykaylaymaynayoaypayqayraysaytayuayvavVavWaywayxayyayzayzayzayzayzayAayzayzayzayzayBayCayDayEayFayGayHayIayJawoawqavcaabayMayNayNayNayNayNayOaabaabaaaaaaaaaaaaaDkaCoaDkaaaaKkaIUaIUaMXaMYaIUaCqaLHaLHaLHdcmaBFaLHaCsaMUaLHaLHaLHaDbdcmaLHaMUaDhaDfaMUaLHaDiaMUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayRaySayTaaaayUayVayWaabaabayXayYayXaaaaaaaabaABaIqaItaIsaIyaIxaCraABaJrayYaMfaJsaKwaJuaJuaJuaJuaJuaJuaJuaJuaKxaABaaaaKyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazaazbazcazdaxEaygaxGazeazfazgaykazhaziazjazjazjazjazjaysazjazkavQavVavWaxzazlazmaznaznaznaznazoazpazqazqazqazqazqazqazrazsaztazuazvazwazxazyavcavcazzazAazBazBazBazBazBazAazzaabaaaaaaaaaaaaaHFaGDdbZaaaaKkaCBaEfaEcaEhaLHaLHaLHdcmaLHdcmaEiaLHaLHaMUaLHaEkaEjaEiaBkaLHaMUaFjaCFaMUaLHaDjaMUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8334,21 +8334,21 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPsaLMaLMaKnaLTaNxaLMaNxaPtaNxaLMaNxaLTaNyaNzaIhaGTaPuaJqaJqaPvaPwcZFaPwaJqczPczPczPczPcZHcZGcZJcZIczPaPCaPDaPEaMmaMmaPFaMmaPGaPHaPIaJwaaaaIAaIAaPJaPKaPJaIAaIAaaaaFPaFUaFVaPLaPMaPNaNYaPOaFVaCJaERaFWaFXaPPaKYaIGaFXaIHaFXaIGaLaaPQaERaERaERaPRaPSaPTaPUaPVaPWamiamiaPXaPYaPZaQaaILaQbaJQaILaQcaILaQdaILaQeaQfaQgaQhaQiaQjaQkaQlaQmaQnaQoaQpaQqaQoaQoaQraQoaQlaQsaQlaLFdbQaQldbRdbTdbSaQwdbUaQxdbVdbXdbWdbYaQBaLEaQCaQDaQEaQFaQGaQHaQIaQJaOUaQKaQLaOVaQMaQNaQOaQPaPbaQQaPdaPeaPfaUndcaaLJaQSaQTaQTaQUaPpaPpaPpaPpaPqaPraaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLUaQVaQWaNwaLTaNxaLMaNxaLMaNxaLMaNxaLTaNyaNzaIhaGTaQXaQYaQZaRaaRbaRbaFzaRdaReaRfaRgcZKcZMcZLcATcZNczPaRlaRmaRnaRoaRpcZOaRraRsaRtaRuaJwaaaaabaaaaRvaRwaRvaaaaabaaaazEaFUaFVaRxaRyaRzaRAaRBaFVaCJaERaRCaRDaHoaREaRFaHraRGaHraRHaRIaRJaERaRKaRLaRMaRNaROaRPaRQaRRaaaaaaaPXaRSaRTaRUaILaRVaRWaJQaJQaRXaJQaJQaJQaRYaINaRZaINaSaaSbaINaScaINaSdaSeaSfaSgaShaSiaSdaSjaSkaSlaSmaSlaSlaSlaSlaSnaSlaSlaSoaSldcbaUbaSlaSqaLHaOQaSraQFaSsaStaSuaSvaSwaSxaSyaSzaOVaSAaSBaSCaSDaSEaQQaPdaPeaPfaSFaSGaLJaSHaQTaQTaQUaPpaPpaPpaPpaPqaPraaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSIaSJaKmaLKaLTaLMaSKaSLaLMaLMaSMaSKaLTaLUaSNaSOaGTaSPaSQaSRaSSaSRaSRaSRaSRaSRaSTaFzczPcZQcZPcZQczPczPaSVaSWaSXaJzaJzaJzaJzaSVaSYaSZaJwaTaaTbaTbaTcaTdaTeaTbaTbaTfaTgaThaFVaTiaFVaTjaTkaTlaFVaTmaERaERaERaERaTnaToaTpaTqaTpaTraTsaERaERaTtaRNaRNaRNaRNaTuaTvaTwaTxaTyaPXaTzaRTaTAaILaILaILaILaILaILaILaINaINaRYaTBaTCaTDaTEaTFaTGaTHaTIaSdaTJaTKaTLaTMaTNaSdaTOaTPaTQaTRaTQaTSaTTaTUaTVaTWaTXaTYaTZdccaVUaSlaUcaOHaUdaUeaUfaSsaUgaSuaSvaUhaOVaUiaUjaUkaUlaUmaQPaQPaOVaOVaPdaPeaPfaUnaUoaLJaUpaUqaUraUsaUtaUuaPpaPpaUvaPraaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSIaKmaKnaKmaKmaKoaKpaKmaKmaKnaSJaUwazEaUxaSPaEvaUyaUyaUzaUyaUAaAyaUBaUCaFzaUDaYgaUGaUGaUHaUIaUGaUJaUGaUGaUGaUKaUGaUGaULaUMaUNaUOaUPaUQaUOaURaUOaUOaUOaUOaUSaUTaUUaUGaUGaUVaUWaUXaUYaUZaVaaVbaVcaVdaVeaVfaVfaVfaVfaVfaVfaVgaVhaViaVjaVkaVlaVmaVnaVoaVpaRNaRNaVqaVraVsaVraVsaVtaVuaVvaVwaVxaVyaINaVzaVAaVBaVCaVDaVDaVEaVFaVGaVHaSdaVIaVJaVKaVKaVLaSdaVMaVNaVOaVPaVQaVQaVRaVSaVTaVUaVVaVWaVXaVYaVUaSlaSqdauaOQaWbaWcaWcaWdaWeaWcaWfaOVaWgaWhaOVaWiaWjaQPaWkaOVaWlaWmaWnaPfaNqaNqaLJaWoaNsaWpaWqaNsaNsaNsaNsaNsabCacUaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEvaWraWsaJlaJlaJlaJlaWtaWraEvaJnazEaWuaWvaWwaWxaWyaWzaWzaWAaAyaWBaUCaWCaWDaYgcZRaWFaWGaWHaWHaWIaWJaWJaWJaWKaWLaWLaWMaWNaWOaWHaWHaWPaWQaWRaWSaWTaWTaWUaWTaWVaWQaWQaWQaWWaUWaUXaUYaUZaUZaUZaUZaWXaUZaUZaUZaUZaUZaUZaWYaWZaXaaXbaXcaXdaXeaXfaXgaXhaXiaXiaXiaXjaXkaXkaXkaXlaVyaVyaVyaXmaXnaVyaINaXoaXpaVDaVDaXqaVDaXraXsaVGaXtaSdaXuaXvaXwaXxaXyaSdaXzaXAaXBaXCaXDaXEaSlaXFaXGaXFaSlaSlaSlaSoaSlaSlaSqaLHaOQaXHaQFaQFaQFaXIaQFaXJaOVaOVaOVaOVaOVaOVaOVaXKaOVaPfaPfaPeaPfaXLaXMaNqaXNaXOaXPaXQaXRaXSaXTaXUaXVaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaIfazEaWwaCzaIhaXWaXXaXYaXZaIhaCzaYaaYbazEaYcaSPaWwaYdaYeaWzaWzaWAaAyaYfaUCaFzaWDaYgaUGaYhaYiaUGaUGaYjaYkaYlaUGaYmaYnaYoaYnaYpaYqaYnaYnaYraYnaYnaYsaYtaYnaYuaYnaYvaUGaUGaUGaYwaYxaYyaYzaYAaYBaYAaYCaYDaYCaYCaYCaYCaYCaYCaYEaYFaYGaYGaYGaYGaYHaYGaYIaYJaYGaYGaYKaYLaYMaYMaYMaYMaYMaYMaYMaYNaVyaVyaINaYOaYPaYQaYRaYRaYSaYTaXsaVGaYUaSdaSdaSdaSdaSdaYVaSdaYWaYXaYYaYZaTQaZaaSlaZbaZcaZdaZeaZfaZgaZhaZiaSlaSqaWaaOQaZjaZkaQFaZlaZmaQFaZnaZnaOQaZoaZpbeKaNqaZraZsaZtaPfaPfaZuaZvaNqaZwaNqaZxaXOaZyaZzaZAaXOaXOaZBaZCaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaAyaFxaWraSOaGTaFzaFzaGUaSOaWraSOaZDaZEaZFaZGaFxaZHaZHaUzaZHaUAaAyaZIaUCaFzaAyaSUaSUaZJaZKaZKaZKaZKaZKaZKaZLaZMaZKaZKaZKaZKaZKaZKaZNaZOaZPaZPaZQaZPaZPaZPaZRaZSaZTaZUaZVaZWaSUaZXaZXaZYaZYaZYaZZbaabaabaabaabaabaababbacbadbaebafbaebagbagbahbaibajbakbalbacbamaTxaTxaTxaTxaTxaTxbanbaobaobaoaINbapbaqbarbarbarbarbasbatbaubavbawbaxbcjbazbaAbaBaSdaSdbaCbaDbaEbaFbaGaSlbaHbaIbaJbaJbaJbaJbaKbaLaSlbaMdcjaOQbaNaQFaZlaZlaZmaZlaQFbaOaOQbaPbaQbaRaNqaPfbaSbaTbaUbaUbaVbaWbaXbaYbaZbbabbbbbcbbdaXQaXOaXObbeaZCaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtdcdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEvbbfaFzbbgbbhbbibbjbbkbblbbjbbmbbnbbjbbjbbobbpbbqbbrbbsbbsbbsbbtbbsbbubbvaAybbwbbxbbyaZKbbzbbAbbBbbCbbDbbBbbEbbFbbGbbHbbIbbJaZKbbKbbLaZPbbMbbNbbObbPaZPaZPaZPbbQbbQbbRbbSbbQbbQbbQbbTaUZaVebbUaaaaaaaaaaaaaaaaaaaaabacbbVbbWbbXbbYbbZbcabcbbccbcdbcebcfbacaaaaaaaaaaaaaaaaaaaaabcgbchaVybciaINcrgbaqbavbavbavbavbavbckbclbavbavbavbaybcmbcmbcnbcobcpbcqbcrbcsbctbcuaSlbcvbcwbcxbcybcybcxbczbcAaSlaSqaLHaOQbcCbcDaQFaZlaZmaQFbcEbcEaOQaOQbcFaOQaNqbcGaZsaZvbcHbcHbcIaZvaNqaNqaNqbcJaXObcKbcKbcLbcKaXObcMaZCaabaaaaaabcNaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFxbcObcPbcObcObcObcObcObcObcPbcObcObcQaFzbcRbcSbcTaFzbcUaFzbcVbcWbcXbcYbcZaAybbxbbxbdaaZKbdbbbBbbBbbBbbBbbBbbEbdcbbBbbBbbBbddaZKbbKbdeaZPbdfbdgbdhbdhbdibdjbdkbbQbdlbdmbdnbdobdpbdqbbTaUZaVebbUaaaaaaaaaaaabacbacbacbacbdrbdsbdtbdubdvbdwbdxbdybdzbdAbdBbacbacbacbacaaaaaaaaaaaabcgbchaVyaVybdCbavbdDbdEbdFbavbdGbdHaLmbdIbdJbdKbavbaybdLbcmbdMbdNbcmbdObdPbdQbdRbcmbdSbdTbdUbcxbcybcybcxbdVbdWaSlaSqdauaOQbaNaQFaZlaZlaZmaZlaQFaQFbdYbdZaQFbeaaNqbebbecbedbcHbcHbeebedbefaNqbegbehaXObeibeibejbeiaXObbebekbelbembembenaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazEazEbeobepbepbepbepbepbepbepaInazEaAybeqberbesbesbesbesbesbesbetbesbesbesaAybbxbbKbeuaZKbevbbBbbBbewbexbeybezbewbbBbbBbbBbeAaZKbbKbbLaZPbeBbeCbeDbeDbeEbeFbdkbbQbeGbeHbeIbeJbnEbeLbeMbeNaVebeObePbeQbacbacbacbeRbeSbeTbeUbeVbeVbeWbeXbeVbeYbeVbeZbfabfbbfcbfdbfebacbacbacbeQbambffbchaVyaVyaINbfgbdDbdJbdFbavbfhbfibavbfjbfkbdKbavbaybcmbcmbflbfmbfnbfobfpbfqbfrbcmbfsbdTbftbcxbcybcybfubfvbdWaSlaSqaLHaOQbfxbfybfzaZlaZmbfAaQFaQFbfBaQFbfCbfDaNqbfEbfFbfGbcHbcHbfHbfGbfIaNqbfJbehaXOaXOaXOaXQaXOaXObfKbfLbfMbfNbfObfPaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQaabbfRaIiaFBbfSbesbfTbfUbfVbfWbfXbfYbfZbgabesbjjbgcbgdbgeaZKbgfbbBbbBbewbeybggbghbewbbBbbBbgibgjaZKbbKbbLaZPaZPbgkaZPaZPaZPaZPaZPbbQbglbeJbgmbeJbgnbeLbbTbgoaVeaVfaVfbgpbgqbgrbacbgsbdtbgtbeVbeVbgubgvbgwbgxbgwbgybgzbgAbgBbgCbgDbgEbacbgFbgqbgGbgHbgIbchaVyaVybdCbavbgJbavbavbavbgKbgLbavbfjbgMbdKbavbaybcmbcmbgNbgObgPbgQbgRbgSbfrbgTaSlbgUbftbcxbcybcybcxbfvbgVaSlbgWbgXaOQbgYaOQaOQbgZaZmbhabhbaQFbhcbhdaUgbhebaZbhfbhgbhhbhibhibhjbhkbhlbaZbhmbhnaXObhoaXOaXQaXOaXObhpbhqbelbembembhraNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbhsbhtbhuaGTbcRbesbfTbhvbhwbfTbhxbhybhzbhAbesbhBbhCbhDaZOaZKbhEbhFbhGbhHbhIbhJbhKbhLbhLbhLbhMbhNaZKbbKbgcbhObhPbhQbbKbbKbhRaZObhSbbQbhTbhUbhVbhWbhXbhYbbTbgoaUZaUZaUZbhZbiabibbicbidbiebeVbifbigbihbiibijbikbilbimbinbiobipbidbiqbirbisbitbiubivbiwbixbiyaVybizaINbavbiAbiBbdKbavbiCbiDbavbiEbiFbdKbavbaybcmbcmbcmbcnbcmbiGbcmbgSbfrbiHaSlbiIbftbcxbcybcybcxbfvbiJaSlbiKbiLbiMbiNbiObiPbiQbiRbiSbiSbiSbiSbiSbiSbiTbiUbiVbcHbcHbcHbcHbcHbcHbiWbiXbiYbehaXOaXOaXOaXQaXOaXObiZaZCbjabjabjaaZCaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbjbbjcbjdbjebcRbesbjfbfTbjgbjgbjgbjhbfTbjibesbqbbjkbhDbjlbjlbjlbjlbjmbjlbjnbbBbjobjpbjqbjqbjrbjsaZKbjtbjubjvbjwbjxbjybjybjzbjAbjBbjCbjCbjCbjCbjCbjDbbQbbTbjEbjFbjGbjHbjIbjJbjKbjLbjMbikbjNbjObjPbjPbjPbjPbjQbjPbjRbjSbjTbjUbjNbjVbjWbacbjXbjYbjZbkabkbbkcaVyaVybdCbavbkdbavbavbavaOsbavbavbkebkebkfbkfbkgbcmbcmbkhbkibcmbcmbcmbkjbkkbklaSlbdWbftbcxbcxbcxbcxbfvbkmaSlbknbkobkobkpbkobkqaZlaZlaZlaZlbkraZlaZlaZlbksbiXbcHbcHbcHbcHbcHbcHbcHbiWbiXbiYbehaXObcKbcKbcLbcKaXObktaZCbkubkvbkwaZCaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSIaKmaKnaKmaKmaKoaKpaKmaKmaKnaSJaUwazEaUxaSPaEvaUyaUyaUzaUyaUAaAyaUBaUCaFzaUDaYgaUGaUGaUHaUIaUGaUJaUGaUGaUGaUKaUGaUGaULaUMaUNaUOaUPaUQaUOaURaUOaUOaUOaUOaUSaUTaUUaUGaUGaUVaUWaUXaUYaUZaVaaVbaVcaVdaVeaVfaVfaVfaVfaVfaVfaVgaVhaViaVjaVkaVlaVmaVnaVoaVpaRNaRNaVqaVraVsaVraVsaVtaVuaVvaVwaVxaVyaINaVzaVAaVBaVCaVDaVDaVEaVFaVGaVHaSdaVIaVJaVKaVKaVLaSdaVMaVNaVOaVPaVQaVQaVRaVSbeCaVUaVVaVWaVXaVYaVUaSlaSqdauaOQaWbaWcaWcaWdaWeaWcaWfaOVaWgaWhaOVaWiaWjaQPaWkaOVaWlaWmaWnaPfaNqaNqaLJaWoaNsaWpaWqaNsaNsaNsaNsaNsabCacUaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEvaWraWsaJlaJlaJlaJlaWtaWraEvaJnazEaWuaWvaWwaWxaWyaWzaWzaWAaAyaWBaUCaWCaWDaYgcZRaWFaWGaWHaWHaWIaWJaWJaWJaWKaWLaWLaWMaWNaWOaWHaWHaWPaWQaWRaWSaWTaWTaWUbdkaWVaWQaWQaWQaWWaUWaUXaUYaUZaUZaUZaUZaWXaUZaUZaUZaUZaUZaUZaWYaWZaXaaXbaXcaXdaXeaXfaXgaXhaXiaXiaXiaXjaXkaXkaXkaXlaVyaVyaVyaXmaXnaVyaINaXoaXpaVDaVDaXqaVDaXraXsaVGaXtaSdaXuaXvaXwaXxaXyaSdaXzaXAaXBaXCaXDaXEaSlaXFaXGaXFaSlaSlaSlaSoaSlaSlaSqaLHaOQaXHaQFaQFaQFaXIaQFaXJaOVaOVaOVaOVaOVaOVaOVaXKaOVaPfaPfaPeaPfaXLaXMaNqaXNaXOaXPaXQaXRaXSaXTaXUaXVaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaIfazEaWwaCzaIhaXWaXXaXYaXZaIhaCzaYaaYbazEaYcaSPaWwaYdaYeaWzaWzaWAaAyaYfaUCaFzaWDaYgaUGaYhaYiaUGaUGaYjaYkaYlaUGaYmaYnaYoaYnaYpaYqaYnaYnaYraYnaYnaYsaYtaYnaYuaYsaYvaVTaUGaUGaYwaYxaYyaYzaYAaYBaYAaYCaYDaYCaYCaYCaYCaYCaYCaYEaYFaYGaYGaYGaYGaYHaYGaYIaYJaYGaYGaYKaYLaYMaYMaYMaYMaYMaYMaYMaYNaVyaVyaINaYOaYPaYQaYRaYRaYSaYTaXsaVGaYUaSdaSdaSdaSdaSdaYVaSdaYWaYXaYYaYZaTQaZaaSlaZbaZcaZdaZeaZfaZgaZhaZiaSlaSqaWaaOQaZjaZkaQFaZlaZmaQFaZnaZnaOQaZoaZpbeKaNqaZraZsaZtaPfaPfaZuaZvaNqaZwaNqaZxaXOaZyaZzaZAaXOaXOaZBaZCaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaAyaFxaWraSOaGTaFzaFzaGUaSOaWraSOaZDaZEaZFaZGaFxaZHaZHaUzaZHaUAaAyaZIaUCaFzaAyaSUaSUaZJaZKaZKaZKaZKaZKaZKaZLaZMaZKaZKaZKaZKaZKaZKaZNaZOaZPaZPaZQaZPaJaaKjaKiaJaaJaaZUaZVaZWaSUaZXaZXaZYaZYaZYaZZbaabaabaabaabaabaababbacbadbaebafbaebagbagbahbaibajbakbalbacbamaTxaTxaTxaTxaTxaTxbanbaobaobaoaINbapbaqbarbarbarbarbasbatbaubavbawbaxbcjbazbaAbaBaSdaSdbaCbaDbaEbaFbaGaSlbaHbaIbaJbaJbaJbaJbaKbaLaSlbaMdcjaOQbaNaQFaZlaZlaZmaZlaQFbaOaOQbaPbaQbaRaNqaPfbaSbaTbaUbaUbaVbaWbaXbaYbaZbbabbbbbcbbdaXQaXOaXObbeaZCaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtdcdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEvbbfaFzbbgbbhbbibbjbbkbblbbjbbmbbnbbjbbjbbobbpbbqbbrbbsbbsbbsbbtbbsbbubbvaAybbwbbxbbyaZKbbzbbAbbBbbCbbDbbBbbEbbFbbGbbHbbIbbJaZKbbKbbLaZPbdjbdgbdiaJabdhbbObbNaJabbQbbRbbSbbQbbQbbQbbTaUZaVebbUaaaaaaaaaaaaaaaaaaaaabacbbVbbWbbXbbYbbZbcabcbbccbcdbcebcfbacaaaaaaaaaaaaaaaaaaaaabcgbchaVybciaINcrgbaqbavbavbavbavbavbckbclbavbavbavbaybcmbcmbcnbcobcpbcqbcrbcsbctbcuaSlbcvbcwbcxbcybcybcxbczbcAaSlaSqaLHaOQbcCbcDaQFaZlaZmaQFbcEbcEaOQaOQbcFaOQaNqbcGaZsaZvbcHbcHbcIaZvaNqaNqaNqbcJaXObcKbcKbcLbcKaXObcMaZCaabaaaaaabcNaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFxbcObcPbcObcObcObcObcObcObcPbcObcObcQaFzbcRbcSbcTaFzbcUaFzbcVbcWbcXbcYbcZaAybbxbbxbdaaZKbdbbbBbbBbbBbbBbbBbbEbdcbbBbbBbbBbddaZKbbKbdeaZPbdfbbMbeFaJaaZTaZSaZRaJabdlbdmbdnbdobdpbdqbbTaUZaVebbUaaaaaaaaaaaabacbacbacbacbdrbdsbdtbdubdvbdwbdxbdybdzbdAbdBbacbacbacbacaaaaaaaaaaaabcgbchaVyaVybdCbavbdDbdEbdFbavbdGbdHaLmbdIbdJbdKbavbaybdLbcmbdMbdNbcmbdObdPbdQbdRbcmbdSbdTbdUbcxbcybcybcxbdVbdWaSlaSqdauaOQbaNaQFaZlaZlaZmaZlaQFaQFbdYbdZaQFbeaaNqbebbecbedbcHbcHbeebedbefaNqbegbehaXObeibeibejbeiaXObbebekbelbembembenaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazEazEbeobepbepbepbepbepbepbepaInazEaAybeqberbesbesbesbesbesbesbetbesbesbesaAybbxbbKbeuaZKbevbbBbbBbewbexbeybezbewbbBbbBbbBbeAaZKbbKbbLaZPbeBbqwbbPaJabeEcePcZXaJabeGbeHbeIbeJbnEbeLbeMbeNaVebeObePbeQbacbacbacbeRbeSbeTbeUbeVbeVbeWbeXbeVbeYbeVbeZbfabfbbfcbfdbfebacbacbacbeQbambffbchaVyaVyaINbfgbdDbdJbdFbavbfhbfibavbfjbfkbdKbavbaybcmbcmbflbfmbfnbfobfpbfqbfrbcmbfsbdTbftbcxbcybcybfubfvbdWaSlaSqaLHaOQbfxbfybfzaZlaZmbfAaQFaQFbfBaQFbfCbfDaNqbfEbfFbfGbcHbcHbfHbfGbfIaNqbfJbehaXOaXOaXOaXQaXOaXObfKbfLbfMbfNbfObfPaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQaabbfRaIiaFBbfSbesbfTbfUbfVbfWbfXbfYbfZbgabesbjjbgcbgdbgeaZKbgfbbBbbBbewbeybggbghbewbbBbbBbgibgjaZKbbKbbLaZPaZPbgkaZPaJabeEbeDbhSaJabglbeJbgmbeJbgnbeLbbTbgoaVeaVfaVfbgpbgqbgrbacbgsbdtbgtbeVbeVbgubgvbgwbgxbgwbgybgzbgAbgBbgCbgDbgEbacbgFbgqbgGbgHbgIbchaVyaVybdCbavbgJbavbavbavbgKbgLbavbfjbgMbdKbavbaybcmbcmbgNbgObgPbgQbgRbgSbfrbgTaSlbgUbftbcxbcybcybcxbfvbgVaSlbgWbgXaOQbgYaOQaOQbgZaZmbhabhbaQFbhcbhdaUgbhebaZbhfbhgbhhbhibhibhjbhkbhlbaZbhmbhnaXObhoaXOaXQaXOaXObhpbhqbelbembembhraNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbhsbhtbhuaGTbcRbesbfTbhvbhwbfTbhxbhybhzbhAbesbhBbhCbhDaZOaZKbhEbhFbhGbhHbhIbhJbhKbhLbhLbhLbhMbhNaZKbbKbgcbhObhPbhQbhRaJaaJaaJaaJaaJabhTbhUbhVbhWbhXbhYbbTbgoaUZaUZaUZbhZbiabibbicbidbiebeVbifbigbihbiibijbikbilbimbinbiobipbidbiqbirbisbitbiubivbiwbixbiyaVybizaINbavbiAbiBbdKbavbiCbiDbavbiEbiFbdKbavbaybcmbcmbcmbcnbcmbiGbcmbgSbfrbiHaSlbiIbftbcxbcybcybcxbfvbiJaSlbiKbiLbiMbiNbiObiPbiQbiRbiSbiSbiSbiSbiSbiSbiTbiUbiVbcHbcHbcHbcHbcHbcHbiWbiXbiYbehaXOaXOaXOaXQaXOaXObiZaZCbjabjabjaaZCaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbjbbjcbjdbjebcRbesbjfbfTbjgbjgbjgbjhbfTbjibesbqbbjkbhDbjlbjlbjlbjlbjmbjlbjnbbBbjobjpbjqbjqbjrbjsaZKbjtbjubjvbjwbjxbjzbjAbjBdatbjBbjCbjCbjCbjCbjCbjDbbQbbTbjEbjFbjGbjHbjIbjJbjKbjLbjMbikbjNbjObjPbjPbjPbjPbjQbjPbjRbjSbjTbjUbjNbjVbjWbacbjXbjYbjZbkabkbbkcaVyaVybdCbavbkdbavbavbavaOsbavbavbkebkebkfbkfbkgbcmbcmbkhbkibcmbcmbcmbkjbkkbklaSlbdWbftbcxbcxbcxbcxbfvbkmaSlbknbkobkobkpbkobkqaZlaZlaZlaZlbkraZlaZlaZlbksbiXbcHbcHbcHbcHbcHbcHbcHbiWbiXbiYbehaXObcKbcKbcLbcKaXObktaZCbkubkvbkwaZCaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbkybkzbhubkAaZGbkBbfTbkCbjgbjgbjgbjhbkCbfTbesbkDbkEbhDbjlbkFbkGbkHbkIbjlbkJbkKbkLaZKbkMbkNbkObkPaZKbbKbkQbkRbkRbkSbkRbkRbkRbkRbkTbkUbkUbkUbkVbkUbkWbkXbkYbkZblablbblbblbblbblbblbblcbldblcbjPbjPbleblfblgblhblibljbleblkbjPbllblmbllbllbllbllbllbllbllbkcaVyaVyaINblnblobavblpbavblqbavblrblsbltbkfbluaSdblvblwaSdaSdblxblyblyblyaSdaSdaSlblzblAblBblBblBblBblAblCaSlblDbkobkobkpblEaOQblFblGblHblIblJblKblLblMblNaNqblOaPfblPbcHbcHblPaPfblQaNqblRbehaXObeibeibejbeiaXObiZaZCbjabjabjaaZCaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQblSaFxblTblUblVbesbhvbhvbhvbfTblWblXblYblZbesbmabmbbhDbjlbmcbjlbmdbmebjlbmfbmgbmhaZKbkMbkNbkObmiaZKbbKbkQbkRbmjbmkbmlbmmbmnbkRbmobmpbmqbmrbkXbkXbkXbkXbmsbmtbmublbbmvbmwbmxbmybmzbmAbmBbmCbjPbmDblgbmEbmFbmGbmFbmEblgbmHbjPbmIbmJbmKbmLbmMbmNbmObmPbllbmQbmRbmRbmSaINaINaINaINbmTbdCbmTbmUaINaSbaINaINaSdaSdaSdaSdbmVbmWbmWbmWbmWbmXbmYaSlbmZbnabmZbnbbnbbmZbnabmZaSlblDbkobkobncblEaOQaOQaOQaOQaOQbgYaOQaOQaOQaOQaNqbndbnebnfbnfbnfbnfbngaNqaNqbnhbniaXOaXOaXOaXQaXOaXObhpbekbnjbembembnkaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfazEbnlaJlbhuaAyaAyaAyaAyaAyaAybnmbnnbesbesbesbesbesbesbnobesbesbesbnpbnpbnqbjlbnrbnsbmdbntbjlbnubnvbnuaZKbkMbkNbkObnwaZKbbKbkQbkRbnxbnybnzbmmbnzbkRbmobnAbnBbnCbnDbEVbnFbkXbnGbnHbmubnIbnJbnKbnLbnMbnMbnLbnNbnObjPbnPblgblgbnQbnRbmFbmEblgbnSbjTbnTbnUbnVbnWbnXbnYbnVbnZbllboabobbocbodboebofbogbohbohbohbohbohbohboibojbokbolbohbombohbohbohbohbohbohbohbohbonboobopbopbopbopbopbopboqbofborbosbosbotboubovboubowbouboxboybozbouboAboBboCboDboEboEboEboEboEboEboEboFboGboHboHboHboHboIboHboJboKboLboMboNbfOboOaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPaaaaabboQaIiboRboSboTboUboUboUboUboUboVboWboXboYboZbpabnqbjlbjlbjlbpbbmebjlaZKaZKaZKaZKbkMbpcbpdbpeaZKbpfbpgbkRbphbpibmmbnzbpjbkRbmobpkbnBbnCbnCbplbpmbkXbpnbnHbmubpobppbpqbprbpsbptbpubnNbpvbjPbpwbnQblgbpxbpybpxblgbnQbpzblkbpAbnVbnVbnWbpBbnYbnVbpCbllbpDbocbocbodboebofbohbohbohbohbohbohbohbpEbohbohbohbohbohbohbpFbpGbpGbpGbpGbpGbpGbpGbpGbpGbpGbpGbpGbpGbpGbpHbpIbpJboEboEbpKbkobkobkobkobkobkpbkobkobkobkobkobkobkobkobkobkobkobkobpLbkobpMbpNaXOaXOaXOaXOaXOaXOaXObpObhqbelbembembenaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPboPbhsbhtbpPbpQbpRbpSbpSbpSbpTbpSbpSbpUbpVbpWaZOaZOaZObpXbjlbkFbpYbpZbntbjlbqabsubqaaZKaZKaZKaZKbqcaZKbqdbkQbkRbqebqfbnzbqgbqhbkRbmobkXbqibnCbnCbnCbqjbkXbqkbnHbmubqlbqmbpqbprbqnbqobpubnNbqpbjPbqqbqrblgbqsbqtbqubmEbqvbqwbqxbqybqzbqAbqBbqCbqDbnVbqEbllbqFbqGbocbodboebofbohbqHbohbohbohbohbqIbqJbqJbqJbqJbqKbohbohbohbohbqLbohbqHbqMbohbqNbqObqPbohbqQbqRbqRbqSbqTbqUbqVbkobkobkobkobkobkobkobqWbqXbqYbkobkobkobkobkobkobkobkobkobkobqZbrabrabrbbrcbrdbrebrfbrfbrfbrfbrgbrhbriaabaaaaaaaabaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtdcdaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPboPbhsbhtbpPbpQbpRbpSbpSbpSbpTbpSbpSbpUbpVbpWaZOaZOaZObpXbjlbkFbpYbpZbntbjlbqabsubqaaZKaZKaZKaZKbqcaZKbqdbkQbkRbqebqfbnzbqgbqhbkRbmobkXbqibnCbnCbnCbqjbkXbqkbnHbmubqlbqmbpqbprbqnbqobpubnNbqpbjPbqqbqrblgbqsbqtbqubmEbqvdavbqxbqybqzbqAbqBbqCbqDbnVbqEbllbqFbqGbocbodboebofbohbqHbohbohbohbohbqIbqJbqJbqJbqJbqKbohbohbohbohbqLbohbqHbqMbohbqNbqObqPbohbqQbqRbqRbqSbqTbqUbqVbkobkobkobkobkobkobkobqWbqXbqYbkobkobkobkobkobkobkobkobkobkobqZbrabrabrbbrcbrdbrebrfbrfbrfbrfbrgbrhbriaabaaaaaaaabaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtdcdaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPboPbrjbrkbrlbrmbrnbpSbrobrpbrqbrqbrrbrsbrtbrubrvbrvbrwbrxbjlbjlbjlbmdbrybmcaZOaZOaZOaZObrzbbKbbKbrAbjybrBbrCbrDbrEbrFbrGbrHbrIbkRbrJbkXbrKbnCbnCbnCbrLbrMbrNbnHbrOblbbrPbrQbnLbnLbnLbnLbnNbrRbjPbrSbrTbjPbjPbjPbjPbjPbjPbjPblkbllbrUbrVbrWbrXbrYbrZbsabllbsbbscbscbsdbsdbsdbsdbsdbsdbsdbsebsebsfbsgbshbshbsgbsfbsebsebsibsibsibsibsibsibsjbsjbskbsjbsjbsjbsjbsjbslbsmbsnbsobkobkobspbspbsqbsqbsqbsqbsqbsrbrabrabqZbrabkobrabrabrabrabssbstbstbstbstbsFbsvbsvbsvbsvbsvbsvbsvbsvbsvaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPboPbkybkzbpPbpQbswbpSbsxbpSbsybszbpSbpUbpUbdabsAbsBbsBbsCbjlbkFbsDbmdbsEbmcbsHbsGbujbsIbsJbsKbsKbsLbsKbsMbsNbkRbsObsPbsQbsRbsSbrDbsTbkXbsUbnCbnCbsVbsWbsXbrNbnHbsYblbbsZbtabtbbtcbtdbtebtfblbblbbtgbthbtibtjbtkbtjbtlbthaaabtmbllbtnbtobtpbtqbrYbnVbtrbllbtsbttbtubsdbtvbtwbtxbtybtzbtAbtBbtCbtDbtEbtFbtFbtEbtGbtHbtIbsibtJbtLbtKbtMbsibtNbtObtPbtQbtRbtSbtSbtTbslbtUbtVbtWbtXbtWbtYbtYbsqbtZbuabubbsqbucbudbucbsqbuebrabssbstbufbugbufbstbuhbuibstbuwbukbulbumaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPaaabunaWwbuoblUbupbpSbuqbpSburbusbutbuubpSbuvbwHbuxbuybsCbjlbjlbjlbjlbjlbjlbuzbuAbuBbuCbuDbkRbkRbkRbkRbkRbkRbkRbuEbkRbkRbkRbuFbkRbuGbuHbuIbnCbnCbnCbuJbrMbuKbnHbuLblbbuMbtablcblcblcblbbuNblbbuObuPbuQbuRbuSbuTbuUbuVbuWbuXbuYbllbuZbnVbvabvbbrYbvcbnVbllbvdbvebvfbsdbvgbvhbvibvjbvkbvlbvmbtFbtFbtFbtFbtFbtFbtFbvnbvobvpbvqbvrbvsbvtbsibvubvvbvwbvxbvybvzbvvbtTbslbvAbtVbvBbvCbvDbvEbvEbvFbvGbvHbvIbvJbvKbvLbvMbsqbvNbvObvPbstbvQbvRbvSbvTbvTbvUbstbvVbvWbvXbumaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 8e73f62d3ce..776108ecbef 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -14,8 +14,9 @@ var/const/supply_science = 5
var/const/supply_organic = 6
var/const/supply_materials = 7
var/const/supply_misc = 8
+var/const/supply_vend = 9
-var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engineer,supply_medical,supply_science,supply_organic,supply_materials,supply_misc)
+var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engineer,supply_medical,supply_science,supply_organic,supply_materials,supply_misc,supply_vend)
/proc/get_supply_group_name(var/cat)
switch(cat)
@@ -35,6 +36,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
return "Raw Materials"
if(8)
return "Miscellaneous"
+ if(9)
+ return "Vending"
/datum/supply_packs
@@ -961,17 +964,6 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "Beekeeping crate"
access = access_hydroponics
-/datum/supply_packs/organic/vending
- name = "Bartending Supply Crate"
- contains = list(/obj/item/weapon/vending_refill/boozeomat,
- /obj/item/weapon/vending_refill/boozeomat,
- /obj/item/weapon/vending_refill/boozeomat,
- /obj/item/weapon/vending_refill/coffee,
- /obj/item/weapon/vending_refill/coffee,
- /obj/item/weapon/vending_refill/coffee)
- cost = 20
- containername = "bartending supply crate"
-
/datum/supply_packs/organic/foodcart
name = "Food Cart crate"
contains = list(/obj/structure/foodcart)
@@ -979,30 +971,6 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containertype = /obj/structure/largecrate
containername = "food cart crate"
-/datum/supply_packs/organic/vending/snack
- name = "Snack Supply Crate"
- contains = list(/obj/item/weapon/vending_refill/snack,
- /obj/item/weapon/vending_refill/snack,
- /obj/item/weapon/vending_refill/snack)
- cost = 15
- containername = "snacks supply crate"
-
-/datum/supply_packs/organic/vending/cola
- name = "Softdrinks Supply Crate"
- contains = list(/obj/item/weapon/vending_refill/cola,
- /obj/item/weapon/vending_refill/cola,
- /obj/item/weapon/vending_refill/cola)
- cost = 15
- containername = "softdrinks supply crate"
-
-/datum/supply_packs/organic/vending/cigarette
- name = "Cigarette Supply Crate"
- contains = list(/obj/item/weapon/vending_refill/cigarette,
- /obj/item/weapon/vending_refill/cigarette,
- /obj/item/weapon/vending_refill/cigarette)
- cost = 15
- containername = "cigarette supply crate"
-
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Materials ///////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
@@ -1306,13 +1274,6 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "crate" //let's keep it subtle, eh?
contraband = 1
-/datum/supply_packs/misc/autodrobe
- name = "Autodrobe Supply Crate"
- contains = list(/obj/item/weapon/vending_refill/autodrobe,
- /obj/item/weapon/vending_refill/autodrobe)
- cost = 15
- containername = "autodrobe supply crate"
-
/datum/supply_packs/misc/formalwear //This is a very classy crate.
name = "Formal-wear Crate"
contains = list(/obj/item/clothing/under/blacktango,
@@ -1378,3 +1339,75 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/beach_ball)
cost = 20
containername = "polo supply crate"
+
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////// Vending /////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+/datum/supply_packs/vending
+ name = "HEADER"
+ group = supply_vend
+
+/datum/supply_packs/vending/autodrobe
+ name = "Autodrobe Supply Crate"
+ contains = list(/obj/item/weapon/vending_refill/autodrobe,
+ /obj/item/weapon/vending_refill/autodrobe)
+ cost = 15
+ containername = "autodrobe supply crate"
+
+/datum/supply_packs/vending/clothes
+ name = "Clothing Supply Crate"
+ contains = list(/obj/item/weapon/vending_refill/suitdispenser,
+ /obj/item/weapon/vending_refill/shoedispenser,
+ /obj/item/weapon/vending_refill/hatdispenser,
+ /obj/item/weapon/vending_refill/clothing)
+ cost = 15
+ containername = "clothing supply crate"
+
+/datum/supply_packs/vending/pets
+ name = "Pet Supply Crate"
+ contains = list(/obj/item/weapon/vending_refill/crittercare,
+ /obj/item/weapon/vending_refill/crittercare)
+ cost = 15
+ containername = "pet supply crate"
+
+/datum/supply_packs/vending/bar
+ name = "Bar Supply Crate"
+ contains = list(/obj/item/weapon/vending_refill/boozeomat,
+ /obj/item/weapon/vending_refill/boozeomat,
+ /obj/item/weapon/vending_refill/boozeomat)
+ cost = 15
+ containername = "bar supply crate"
+
+/datum/supply_packs/vending/coffee
+ name = "Coffee Supply Crate"
+ contains = list(/obj/item/weapon/vending_refill/coffee,
+ /obj/item/weapon/vending_refill/coffee,
+ /obj/item/weapon/vending_refill/coffee)
+ cost = 15
+ containername = "coffee supply crate"
+
+/datum/supply_packs/vending/snack
+ name = "Snack Supply Crate"
+ contains = list(/obj/item/weapon/vending_refill/snack,
+ /obj/item/weapon/vending_refill/snack,
+ /obj/item/weapon/vending_refill/snack)
+ cost = 15
+ containername = "snacks supply crate"
+
+/datum/supply_packs/vending/cola
+ name = "Softdrinks Supply Crate"
+ contains = list(/obj/item/weapon/vending_refill/cola,
+ /obj/item/weapon/vending_refill/cola,
+ /obj/item/weapon/vending_refill/cola)
+ cost = 15
+ containername = "softdrinks supply crate"
+
+/datum/supply_packs/vending/cigarette
+ name = "Cigarette Supply Crate"
+ contains = list(/obj/item/weapon/vending_refill/cigarette,
+ /obj/item/weapon/vending_refill/cigarette,
+ /obj/item/weapon/vending_refill/cigarette)
+ cost = 15
+ containername = "cigarette supply crate"
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index e6be0ea5281..eb1f76e48cd 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -1118,6 +1118,10 @@ var/list/ghostteleportlocs = list()
name = "\improper Clothing Shop"
icon_state = "Theatre"
+/area/civilian/pet_store
+ name = "\improper Pet Store"
+ icon_state = "Theatre"
+
/area/holodeck
name = "\improper Holodeck"
icon_state = "Holodeck"
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index b0c1ff709ea..a2042720a7f 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -199,7 +199,9 @@ to destroy them and players will be able to make replacements.
/obj/machinery/vending/autodrobe = "AutoDrobe",
/obj/machinery/vending/hatdispenser = "Hatlord 9000",
/obj/machinery/vending/suitdispenser = "Suitlord 9000",
- /obj/machinery/vending/shoedispenser = "Shoelord 9000")
+ /obj/machinery/vending/shoedispenser = "Shoelord 9000",
+ /obj/machinery/vending/clothing = "ClothesMate",
+ /obj/machinery/vending/crittercare = "CritterCare")
/obj/item/weapon/circuitboard/vendor/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/screwdriver))
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index bf18a7e5111..dad171e0e59 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1216,7 +1216,7 @@
/obj/item/clothing/accessory/scarf/purple=1,/obj/item/clothing/accessory/scarf/yellow=1,/obj/item/clothing/accessory/scarf/orange=1,
/obj/item/clothing/accessory/scarf/lightblue=1,/obj/item/clothing/accessory/scarf/white=1,/obj/item/clothing/accessory/scarf/black=1,
/obj/item/clothing/accessory/scarf/zebra=1,/obj/item/clothing/accessory/scarf/christmas=1,/obj/item/clothing/accessory/stripedredscarf=1,
- /obj/item/clothing/accessory/stripedbluescarf=1,/obj/item/clothing/accessory/stripedgreenscarf=1,/obj/item/clothing/accessory/petcollar =3,/obj/item/clothing/accessory/waistcoat=1,
+ /obj/item/clothing/accessory/stripedbluescarf=1,/obj/item/clothing/accessory/stripedgreenscarf=1,/obj/item/clothing/accessory/waistcoat=1,
/obj/item/clothing/under/sundress=2,/obj/item/clothing/under/stripeddress = 1, /obj/item/clothing/under/sailordress = 1, /obj/item/clothing/under/redeveninggown = 1, /obj/item/clothing/under/blacktango=1,/obj/item/clothing/suit/jacket=3,
/obj/item/clothing/glasses/regular=2,/obj/item/clothing/head/sombrero=1,/obj/item/clothing/suit/poncho=1,
/obj/item/clothing/suit/ianshirt=1,/obj/item/clothing/shoes/laceup=2,/obj/item/clothing/shoes/black=4,
@@ -1250,3 +1250,32 @@
/obj/item/weapon/pen/red = 5)
contraband = list(/obj/item/toy/crayon/mime = 1,/obj/item/toy/crayon/rainbow = 1)
premium = list(/obj/item/weapon/contraband/poster = 5)
+
+/obj/machinery/vending/crittercare
+ name = "CritterCare"
+ desc = "A vending machine for pet supplies."
+ product_slogans = "Stop by for all your animal's needs!;Cuddly pets deserve a stylish collar!;Pets in space, what could be more adorable?;Freshest fish eggs in the system!;Rocks are the perfect pet, buy one today!"
+ product_ads = "House-training costs extra!;Now with 1000% more cat hair!;Allergies are a sign of weakness!;Dogs are man's best friend. Remember that Vulpkanin!; Heat lamps for Unathi!; Vox-y want a cracker?"
+ vend_delay = 34
+ icon_state = "crittercare"
+ products = list(/obj/item/clothing/accessory/petcollar = 5, /obj/item/weapon/fish_net = 5, /obj/item/weapon/fishfood = 5,
+ /obj/item/weapon/tank_brush = 5, /obj/item/weapon/egg_scoop = 5, /obj/item/fish_eggs/goldfish = 5,
+ /obj/item/fish_eggs/clownfish = 5, /obj/item/fish_eggs/shark = 5, /obj/item/toy/pet_rock = 5,
+ )
+ prices = list(/obj/item/clothing/accessory/petcollar = 50, /obj/item/weapon/fish_net = 15, /obj/item/weapon/fishfood = 15,
+ /obj/item/weapon/tank_brush = 15, /obj/item/weapon/egg_scoop = 15, /obj/item/fish_eggs/goldfish = 10,
+ /obj/item/fish_eggs/clownfish = 10, /obj/item/fish_eggs/shark = 10, /obj/item/toy/pet_rock = 100,
+ )
+ contraband = list(/obj/item/fish_eggs/babycarp = 5)
+ premium = list(/obj/item/toy/pet_rock/fred = 1, /obj/item/toy/pet_rock/roxie = 1)
+ refill_canister = /obj/item/weapon/vending_refill/crittercare
+
+/obj/machinery/vending/crittercare/New()
+ ..()
+ component_parts = list()
+ var/obj/item/weapon/circuitboard/vendor/V = new(null)
+ V.set_type(type)
+ component_parts += V
+ component_parts += new /obj/item/weapon/vending_refill/crittercare(0)
+ component_parts += new /obj/item/weapon/vending_refill/crittercare(0)
+ component_parts += new /obj/item/weapon/vending_refill/crittercare(0)
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index d65a4d33383..b0cc8eb0ba0 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -42,7 +42,7 @@
user << "\b There is not enough wire in this coil. You need 5 lengths."
return
CC.use(5)
- user << "\blue You attach wire to the [name]."
+ user << "You attach wire to the [name]."
new /obj/item/stack/light_w(user.loc)
src.use(1)
else if( istype(W, /obj/item/stack/rods) )
@@ -64,12 +64,12 @@
if(!user || !src) return 0
if(!istype(user.loc,/turf)) return 0
if(!user.IsAdvancedToolUser())
- user << "\red You don't have the dexterity to do this!"
+ user << "You don't have the dexterity to do this!"
return 0
var/title = "Sheet-Glass"
title += " ([src.amount] sheet\s left)"
- switch(alert(title, "Would you like full tile glass or one direction?", "One Direction", "Full Window", "Cancel", null))
- if("One Direction")
+ switch(input(title, "What would you like to construct?") in list("One Direction Window", "Full Window", "Fishbowl", "Fish Tank", "Wall Aquarium", "Cancel"))
+ if("One Direction Window")
if(!src) return 1
if(src.loc != user) return 1
@@ -78,11 +78,11 @@
for (var/obj/structure/window/win in user.loc)
i++
if(i >= 4)
- user << "\red There are too many windows in this location."
+ user << "There are too many windows in this location."
return 1
directions-=win.dir
if(win.is_fulltile())
- user << "\red Can't let you do that."
+ user << "Can't let you do that."
return 1
//Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc.
@@ -108,16 +108,40 @@
if(!src) return 1
if(src.loc != user) return 1
if(src.amount < 2)
- user << "\red You need more glass to do that."
+ user << "You need more glass to do that."
return 1
if(locate(/obj/structure/window/full) in user.loc)
- user << "\red There is a full window in the way."
+ user << "There is a full window in the way."
return 1
var/obj/structure/window/W = new full_window( user.loc, 0 )
W.state = 0
W.anchored = 0
W.air_update_turf(1)
src.use(2)
+ if("Fishbowl")
+ if(!src) return 1
+ if(src.loc != user) return 1
+ var/obj/machinery/fishtank/F = new /obj/machinery/fishtank/bowl(user.loc, 0)
+ F.air_update_turf(1)
+ src.use(1)
+ if("Fish Tank")
+ if(!src) return 1
+ if(src.loc != user) return 1
+ if(src.amount < 3)
+ user << "You need more glass to do that."
+ return 1
+ var/obj/machinery/fishtank/F = new /obj/machinery/fishtank/tank(user.loc, 0)
+ F.air_update_turf(1)
+ src.use(3)
+ if("Wall Aquarium")
+ if(!src) return 1
+ if(src.loc != user) return 1
+ if(src.amount < 4)
+ user << "You need more glass to do that."
+ return 1
+ var/obj/machinery/fishtank/F = new /obj/machinery/fishtank/wall(user.loc, 0)
+ F.air_update_turf(1)
+ src.use(4)
return 0
@@ -150,7 +174,7 @@
if(!user || !src) return 0
if(!istype(user.loc,/turf)) return 0
if(!user.IsAdvancedToolUser())
- user << "\red You don't have the dexterity to do this!"
+ user << "You don't have the dexterity to do this!"
return 0
var/title = "Sheet Reinf. Glass"
title += " ([src.amount] sheet\s left)"
@@ -163,11 +187,11 @@
for (var/obj/structure/window/win in user.loc)
i++
if(i >= 4)
- user << "\red There are too many windows in this location."
+ user << "There are too many windows in this location."
return 1
directions-=win.dir
if(win.is_fulltile())
- user << "\red Can't let you do that."
+ user << "Can't let you do that."
return 1
//Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc.
@@ -193,10 +217,10 @@
if(!src) return 1
if(src.loc != user) return 1
if(src.amount < 2)
- user << "\red You need more glass to do that."
+ user << "You need more glass to do that."
return 1
if(locate(/obj/structure/window/full) in user.loc)
- user << "\red There is a window in the way."
+ user << "There is a window in the way."
return 1
var/obj/structure/window/W = new full_window( user.loc, 0 )
W.state = 0
@@ -207,15 +231,15 @@
if(!src || src.loc != user) return 1
if(isturf(user.loc) && locate(/obj/structure/windoor_assembly/, user.loc))
- user << "\red There is already a windoor assembly in that location."
+ user << "There is already a windoor assembly in that location."
return 1
if(isturf(user.loc) && locate(/obj/machinery/door/window/, user.loc))
- user << "\red There is already a windoor in that location."
+ user << "There is already a windoor in that location."
return 1
if(src.amount < 5)
- user << "\red You need more glass to do that."
+ user << "You need more glass to do that."
return 1
var/obj/structure/windoor_assembly/WD
@@ -278,7 +302,7 @@
if(!user || !src) return 0
if(!istype(user.loc,/turf)) return 0
if(!user.IsAdvancedToolUser())
- user << "\red You don't have the dexterity to do this!"
+ user << " You don't have the dexterity to do this!"
return 0
var/title = "Plasma-glass alloy"
title += " ([src.amount] sheet\s left)"
@@ -291,11 +315,11 @@
for (var/obj/structure/window/win in user.loc)
i++
if(i >= 4)
- user << "\red There are too many windows in this location."
+ user << "There are too many windows in this location."
return 1
directions-=win.dir
if(!(win.ini_dir in cardinal))
- user << "\red Can't let you do that."
+ user << "Can't let you do that."
return 1
//Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc.
var/dir_to_set = 2
@@ -318,10 +342,10 @@
if(!src) return 1
if(src.loc != user) return 1
if(src.amount < 2)
- user << "\red You need more glass to do that."
+ user << "You need more glass to do that."
return 1
if(locate(/obj/structure/window) in user.loc)
- user << "\red There is a window in the way."
+ user << "There is a window in the way."
return 1
var/obj/structure/window/W = new full_window( user.loc, 0 )
W.state = 0
@@ -351,7 +375,7 @@
if(!user || !src) return 0
if(!istype(user.loc,/turf)) return 0
if(!user.IsAdvancedToolUser())
- user << "\red You don't have the dexterity to do this!"
+ user << "You don't have the dexterity to do this!"
return 0
var/title = "Reinforced plasma-glass alloy"
title += " ([src.amount] sheet\s left)"
@@ -364,11 +388,11 @@
for (var/obj/structure/window/win in user.loc)
i++
if(i >= 4)
- user << "\red There are too many windows in this location."
+ user << "There are too many windows in this location."
return 1
directions-=win.dir
if(!(win.ini_dir in cardinal))
- user << "\red Can't let you do that."
+ user << "Can't let you do that."
return 1
//Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc.
var/dir_to_set = 2
@@ -391,10 +415,10 @@
if(!src) return 1
if(src.loc != user) return 1
if(src.amount < 2)
- user << "\red You need more glass to do that."
+ user << "You need more glass to do that."
return 1
if(locate(/obj/structure/window) in user.loc)
- user << "\red There is a window in the way."
+ user << "There is a window in the way."
return 1
var/obj/structure/window/W = new full_window( user.loc, 0 )
W.state = 0
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index f9441690da7..f675e472702 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -1365,4 +1365,27 @@ obj/item/toy/cards/deck/syndicate/black
new /obj/item/toy/character/thief(src)
new /obj/item/toy/character/wizard(src)
new /obj/item/toy/character/cthulhu(src)
- new /obj/item/toy/character/lich(src)
\ No newline at end of file
+ new /obj/item/toy/character/lich(src)
+
+
+//Pet Rocks, just like from the 70's!
+
+/obj/item/toy/pet_rock
+ name = "pet rock"
+ desc = "The perfect pet!"
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "pet_rock"
+ w_class = 2
+ force = 5
+ throwforce = 5
+ attack_verb = list("attacked", "bashed", "smashed", "stoned")
+
+/obj/item/toy/pet_rock/fred
+ name = "fred"
+ desc = "Fred, the bestest boy pet in the whole wide universe!"
+ icon_state = "fred"
+
+/obj/item/toy/pet_rock/roxie
+ name = "roxie"
+ desc = "Roxie, the bestest girl pet in the whole wide universe!"
+ icon_state = "roxie"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm
index e296670581a..306d0ba890a 100644
--- a/code/game/objects/items/weapons/vending_items.dm
+++ b/code/game/objects/items/weapons/vending_items.dm
@@ -76,4 +76,9 @@
/obj/item/weapon/vending_refill/clothing
machine_name = "ClothesMate"
icon_state = "refill_clothes"
- charges = 20// of 62
\ No newline at end of file
+ charges = 20// of 62
+
+/obj/item/weapon/vending_refill/crittercare
+ machine_name = "CritterCare"
+ icon_state = "refill_pet"
+ charges = 17// of 54
diff --git a/code/modules/fish/fish_eggs.dm b/code/modules/fish/fish_eggs.dm
new file mode 100644
index 00000000000..902616755dd
--- /dev/null
+++ b/code/modules/fish/fish_eggs.dm
@@ -0,0 +1,42 @@
+
+/obj/item/fish_eggs
+ name = "fish eggs"
+ desc = "Eggs laid by a fish. This cluster seems... empty?"
+ icon = 'icons/obj/fish_items.dmi'
+ icon_state = "eggs"
+ w_class = 2.0
+ var/fish_type = null //Holds the name of the fish that the egg is for
+
+/obj/item/fish_eggs/New()
+ ..()
+
+var/global/list/fish_eggs_list = list("dud" = /obj/item/fish_eggs,
+ "goldfish" = /obj/item/fish_eggs/goldfish,
+ "clownfish" = /obj/item/fish_eggs/clownfish,
+ "shark" = /obj/item/fish_eggs/shark,
+ "babycarp" = /obj/item/fish_eggs/babycarp,
+ )
+
+/obj/item/fish_eggs/goldfish
+ name = "goldfish eggs"
+ desc = "Goldfish eggs, surprisingly, don't contain actual gold."
+ icon_state = "gold_eggs"
+ fish_type = "goldfish"
+
+/obj/item/fish_eggs/clownfish
+ name = "clownfish eggs"
+ desc = "Even as eggs, they are funnier than the clown. HONK!"
+ icon_state = "clown_eggs"
+ fish_type = "clownfish"
+
+/obj/item/fish_eggs/shark
+ name = "shark eggs"
+ desc = "We're gonna need a- Oh wait, they're still eggs."
+ icon_state = "shark_eggs"
+ fish_type = "shark"
+
+/obj/item/fish_eggs/babycarp
+ name = "baby space carp eggs"
+ desc = "Eggs from the substantially smaller form of the intergalactic terror."
+ icon_state = "babycarp_eggs"
+ fish_type = "babycarp"
diff --git a/code/modules/fish/fish_items.dm b/code/modules/fish/fish_items.dm
new file mode 100644
index 00000000000..08254a072be
--- /dev/null
+++ b/code/modules/fish/fish_items.dm
@@ -0,0 +1,52 @@
+
+/obj/item/weapon/egg_scoop
+ name = "fish egg scoop"
+ desc = "A small scoop to collect fish eggs with."
+ icon = 'icons/obj/fish_items.dmi'
+ icon_state = "egg_scoop"
+ slot_flags = SLOT_BELT
+ throwforce = 0
+ w_class = 2.0
+ throw_speed = 3
+ throw_range = 7
+
+/obj/item/weapon/fish_net
+ name = "fish net"
+ desc = "A tiny net to capture fish with. It's a death sentence!"
+ icon = 'icons/obj/fish_items.dmi'
+ icon_state = "net"
+ slot_flags = SLOT_BELT
+ throwforce = 0
+ w_class = 2.0
+ throw_speed = 3
+ throw_range = 7
+
+ suicide_act(mob/user) //"A tiny net is a death sentence: it's a net and it's tiny!" https://www.youtube.com/watch?v=FCI9Y4VGCVw
+ viewers(user) << "[user] places the [src.name] on top of \his head, \his fingers tangled in the netting! It looks like \he's trying to commit suicide."
+ return(OXYLOSS)
+
+/obj/item/weapon/fishfood
+ name = "fish food can"
+ desc = "A small can of Carp's Choice brand fish flakes. The label shows a smiling Space Carp."
+ icon = 'icons/obj/fish_items.dmi'
+ icon_state = "fish_food"
+ throwforce = 1
+ w_class = 2.0
+ throw_speed = 3
+ throw_range = 7
+
+/obj/item/weapon/tank_brush
+ name = "aquarium brush"
+ desc = "A brush for cleaning the inside of aquariums. Contains a built-in odor neutralizer."
+ icon = 'icons/obj/fish_items.dmi'
+ icon_state = "brush"
+ slot_flags = SLOT_BELT
+ throwforce = 0
+ w_class = 2.0
+ throw_speed = 3
+ throw_range = 7
+ attack_verb = list("scrubbed", "brushed", "scraped")
+
+ suicide_act(mob/user)
+ viewers(user) << "[user] is vigorously scrubbing \himself raw with the [src.name]! It looks like \he's trying to commit suicide."
+ return(BRUTELOSS|FIRELOSS)
diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm
new file mode 100644
index 00000000000..108242809f6
--- /dev/null
+++ b/code/modules/fish/fishtank.dm
@@ -0,0 +1,701 @@
+
+//////////////////////////////
+// Fish Tanks! //
+//////////////////////////////
+
+
+/obj/machinery/fishtank
+ name = "placeholder tank"
+ desc = "So generic, it might as well have no description at all."
+ icon = 'icons/obj/fish_items.dmi'
+ icon_state = "tank1"
+ density = 0
+ anchored = 0
+ throwpass = 0
+
+ var/tank_type = "" // Type of aquarium, used for icon updating
+ var/water_capacity = 0 // Number of units the tank holds (varies with tank type)
+ var/water_level = 0 // Number of units currently in the tank (new tanks start empty)
+ var/light_switch = 0 // 0 = off, 1 = on (off by default)
+ var/filth_level = 0.0 // How dirty the tank is (max 10)
+ var/lid_switch = 0 // 0 = open, 1 = closed (open by default)
+ var/max_fish = 0 // How many fish the tank can support (varies with tank type, 1 fish per 50 units sounds reasonable)
+ var/food_level = 0 // Amount of fishfood floating in the tank (max 10)
+ var/fish_count = 0 // Number of fish in the tank
+ var/list/fish_list = null // Tracks the current types of fish in the tank
+ var/egg_count = 0 // How many fish eggs can be harvested from the tank (capped at the max_fish value)
+ var/list/egg_list = null // Tracks the current types of harvestable eggs in the tank
+
+ var/has_lid = 0 // 0 if the tank doesn't have a lid/light, 1 if it does
+ var/max_health = 0 // Can handle a couple hits
+ var/cur_health = 0 // Current health, starts at max_health
+ var/leaking = 0 // 0 if not leaking, 1 if minor leak, 2 if major leak (not leaking by default)
+ var/shard_count = 0 // Number of glass shards to salvage when broken (1 less than the number of sheets to build the tank)
+
+/obj/machinery/fishtank/bowl
+ name = "fish bowl"
+ desc = "A small bowl capable of housing a single fish, commonly found on desks. This one has a tiny treasure chest in it!"
+ icon_state = "bowl1"
+ density = 0 // Small enough to not block stuff
+ anchored = 0 // Small enough to move even when filled
+ throwpass = 1 // Just like at the county fair, you can't seem to throw the ball in to win the goldfish
+ pass_flags = PASSTABLE // Small enough to pull onto a table
+
+ tank_type = "bowl"
+ water_capacity = 50 // Not very big, therefore it can't hold much
+ max_fish = 1 // What a lonely fish
+
+ has_lid = 0
+ max_health = 15 // Not very sturdy
+ cur_health = 15
+ shard_count = 0 // No salvageable shards
+
+/obj/machinery/fishtank/tank
+ name = "fish tank"
+ desc = "A large glass tank designed to house aquatic creatures. Contains an integrated water circulation system."
+ icon = 'icons/obj/fish_items.dmi'
+ icon_state = "tank1"
+ density = 1
+ anchored = 1
+ throwpass = 1 // You can throw objects over this, despite it's density, because it's short enough.
+
+ tank_type = "tank"
+ water_capacity = 200 // Decent sized, holds almost 2 full buckets
+ max_fish = 4 // Room for a few fish
+
+ has_lid = 1
+ max_health = 50 // Average strength, will take a couple hits from a toolbox.
+ cur_health = 50
+ shard_count = 2
+
+
+/obj/machinery/fishtank/wall
+ name = "wall aquarium"
+ desc = "This aquarium is massive! It completely occupies the same space as a wall, and looks very sturdy too!"
+ icon_state = "wall1"
+ density = 1
+ anchored = 1
+ throwpass = 0 // This thing is the size of a wall, you can't throw past it.
+
+ tank_type = "wall"
+ water_capacity = 500 // This thing fills an entire tile, it holds a lot.
+ max_fish = 10 // Plenty of room for a lot of fish
+
+ has_lid = 1
+ max_health = 100 // This thing is a freaking wall, it can handle abuse.
+ cur_health = 100
+ shard_count = 3
+
+
+//////////////////////////////
+// VERBS & PROCS //
+//////////////////////////////
+
+/obj/machinery/fishtank/verb/toggle_lid_verb()
+ set name = "Toggle Tank Lid"
+ set category = "Object"
+ set src in view(1)
+ toggle_lid(usr)
+
+/obj/machinery/fishtank/proc/toggle_lid(var/mob/living/user)
+ lid_switch = !lid_switch
+ update_icon()
+
+/obj/machinery/fishtank/verb/toggle_light_verb()
+ set name = "Toggle Tank Light"
+ set category = "Object"
+ set src in view(1)
+ toggle_light(usr)
+
+/obj/machinery/fishtank/proc/toggle_light(var/mob/living/user)
+ light_switch = !light_switch
+ if(light_switch)
+ set_light(2,2,"#a0a080")
+ else
+ set_light(0)
+
+//////////////////////////////
+// NEW() PROCS //
+//////////////////////////////
+
+/obj/machinery/fishtank/New()
+ ..()
+ fish_list = new/list()
+ egg_list = new/list()
+ if(!has_lid) //Tank doesn't have a lid/light, remove the verbs for then
+ verbs -= /obj/machinery/fishtank/verb/toggle_lid_verb
+ verbs -= /obj/machinery/fishtank/verb/toggle_light_verb
+
+/obj/machinery/fishtank/tank/New()
+ ..()
+ if(prob(5)) //5% chance to get the castle decoration
+ icon_state = "tank2"
+
+//////////////////////////////
+// ICON PROCS //
+//////////////////////////////
+
+/obj/machinery/fishtank/update_icon()
+ overlays.Cut()
+
+ //Update Alert Lights
+ if(has_lid) //Skip the alert lights for aquariums that don't have lids (fishbowls)
+ if(egg_count > 0) //There is at least 1 egg to harvest
+ overlays += "over_egg"
+ if(lid_switch == 1) //Lid is closed, lid status light is red
+ overlays += "over_lid_1"
+ else //Lid is open, lid status light is green
+ overlays += "over_lid_0"
+ if(food_level > 5) //Food_level is high and isn't a concern yet
+ overlays += "over_food_0"
+ else if(food_level > 2) //Food_level is starting to get low, but still above the breeding threshold
+ overlays += "over_food_1"
+ else //Food_level is below breeding threshold, or fully consumed, feed the fish!
+ overlays += "over_food_2"
+ overlays += "over_leak_[leaking]" //Green if we aren't leaking, light blue and slow blink if minor link, dark blue and rapid flashing for major leak
+
+ //Update water overlay
+ if(water_level == 0) return //Skip the rest of this if there is no water in the aquarium
+ var/water_type = "_clean" //Default to clean water
+ if(filth_level > 5) water_type = "_dirty" //Show dirty water above filth_level 5 (breeding threshold)
+ if(water_level > (water_capacity * 0.85)) //Show full if the water_level is over 85% of water_capacity
+ overlays += "over_[tank_type]_full[water_type]"
+ else if(water_level > (water_capacity * 0.35)) //Show half-full if the water_level is over 35% of water_capacity
+ overlays += "over_[tank_type]_half[water_type]"
+
+ return
+
+//////////////////////////////
+// PROCESS PROC //
+//////////////////////////////
+
+//Stops atmos from passing wall tanks, since they are effectively full-windows.
+/obj/machinery/fishtank/wall/CanAtmosPass(var/turf/T)
+ return 0
+
+/obj/machinery/fishtank/process()
+ //Start by counting fish in the tank
+ fish_count = 0
+ for(var/fish in fish_list)
+ if(fish)
+ fish_count ++
+
+ //Check if the water level can support the current number of fish
+ if((fish_count * 50) > water_level)
+ if(prob(50)) //Not enough water for all the fish, chance to kill one
+ kill_fish() //Chance passed, kill a random fish
+ filth_level += 2 //Dead fish raise the filth level quite a bit, reflect this
+
+ //Check filth_level
+ check_filth_level()
+ if(filth_level == 10 && fish_count > 0) //This tank is nasty and possibly unsuitable for fish if any are in it
+ if(prob(30)) //Chance for a fish to die each cycle while the tank is this nasty
+ kill_fish() //Kill a random fish, don't raise filth level since we're at cap already
+
+ //Check breeding conditions
+ if(fish_count >=2 && egg_count < max_fish) //Need at least 2 fish to breed, but won't breed if there are as many eggs as max_fish
+ if(food_level > 2 && filth_level <=5) //Breeding is going to use extra food, and the filth_level shouldn't be too high
+ if(prob(((fish_count - 2) * 5)+10)) //Chances increase with each additional fish, 10% base + 5% per additional fish
+ egg_count ++ //A new set of eggs were laid, increase egg_count
+ egg_list.Add(select_egg_type()) //Add the new egg to the egg_list for storage
+ food_level -= 2 //Remove extra food for the breeding process
+
+ //Handle standard food and filth adjustments
+ check_food_level()
+ var/ate_food = 0
+ if(food_level > 0 && prob(50)) //Chance for the fish to eat some food
+ if(food_level >= (fish_count * 0.1)) //If there is at least enough food to go around, feed all the fish
+ food_level -= fish_count * 0.1
+ else //Use up the last of the food
+ food_level = 0
+ ate_food = 1
+ check_food_level()
+
+ if(water_level > 0) //Don't dirty the tank if it has no water
+ if(filth_level < 10 && prob(25)) //Chance for the tank to get dirtier if the filth_level isn't 10
+ if(ate_food && prob(30)) //If they ate this cycle, there is an additional chance they make a bigger mess
+ filth_level += fish_count * 0.1
+ else //If they didn't make the big mess, make a little one
+ filth_level += 0.1
+ check_filth_level()
+
+ //Handle special interactions
+ handle_special_interactions()
+
+ //Handle water leakage from damage
+ if(water_level > 0) //Can't leak water if there is no water in the tank
+ if(leaking == 2) //At or below 25% health, the tank will lose 10 water_level per cycle (major leak)
+ water_level -= 10
+ else if(leaking == 1) //At or below 50% health, the tank will lose 1 water_level per cycle (minor leak)
+ water_level -= 1
+ check_water_level()
+
+//////////////////////////////
+// SUPPORT PROCS //
+//////////////////////////////
+
+/obj/machinery/fishtank/proc/handle_special_interactions()
+ for(var/fish in fish_list)
+ switch(fish)
+ if("catfish") //Catfish have a small chance of cleaning some filth since they are a bottom-feeder
+ if((filth_level > 0) && prob(25))
+ filth_level -= 0.1
+ if("feederfish") //Feeder fish have a small chance of sacrificing themselves to produce some food
+ if(fish_count < 2) //Don't sacrifice the last fish, there's nothing to eat it
+ continue
+ if(food_level <= 7.5 && prob(25))
+ kill_fish("feederfish") //Kill the fish to reflect it's sacrifice, but don't increase the filth_level
+ food_level += 1 //The corpse became food for the other fish, ecology at it's finest
+ check_food_level()
+ check_filth_level()
+ check_water_level()
+
+/obj/machinery/fishtank/proc/check_water_level()
+ if(water_level < 0) //Water_level cannot be negative, set it to 0 if it is
+ water_level = 0
+ if(water_level > water_capacity) //Water_level cannot exceed capacity, set it to capacity if it does
+ water_level = water_capacity
+ update_icon()
+
+/obj/machinery/fishtank/proc/check_filth_level()
+ if(filth_level < 0) //Filth_level cannot be negative, set it to 0 if it is
+ filth_level = 0
+ if(filth_level > 10) //Filth_level cannot exceed 10 (cap), set it to 10 if it does
+ filth_level = 10
+
+/obj/machinery/fishtank/proc/check_food_level()
+ if(food_level < 0) //Food_level cannot be negative, set it to 0 if it is
+ food_level = 0
+ if(food_level > 10) //Food_level cannot exceed 10 (cap), set it to 10 if it does
+ food_level = 10
+
+/obj/machinery/fishtank/proc/check_health()
+ //Max value check
+ if(cur_health > max_health) //Cur_health cannot exceed max_health, set it to max_health if it does
+ cur_health = max_health
+ //Leaking status check
+ if(cur_health <= (max_health * 0.25)) //Major leak at or below 25% health (-10 water/cycle)
+ leaking = 2
+ else if(cur_health <= (max_health * 0.5)) //Minor leak at or below 50% health (-1 water/cycle)
+ leaking = 1
+ else //Not leaking above 50% health
+ leaking = 0
+ //Destruction check
+ if(cur_health <= 0) //The tank is broken, destroy it
+ destroy()
+
+/obj/machinery/fishtank/proc/kill_fish(var/type = null)
+ //Check if we were passed a fish to kill, otherwise kill a random one
+ if(type)
+ fish_list.Remove(type) //Kill a fish of the specified type
+ fish_count -- //Lower fish_count to reflect the death of a fish, so the everything else works fine
+ else
+ fish_list.Remove(pick(fish_list)) //Kill a random fish
+ fish_count -- //Lower fish_count to reflect the death of a fish, so the everything else works fine
+
+/obj/machinery/fishtank/proc/add_fish(var/type = null)
+ //Check if we were passed a fish type
+ if(type)
+ fish_list.Add("[type]") //Add a fish of the specified type
+ fish_count ++ //Increase fish_count to reflect the introduction of a fish, so the everything else works fine
+ //Announce the new fish
+ src.visible_message("A new [type] has hatched in \the [src]!")
+ //Null type fish are dud eggs, give a message to inform the player
+ else
+ usr << "The eggs disolve in the water. They were duds!"
+
+/obj/machinery/fishtank/proc/select_egg_type()
+ var/fish = pick(fish_list) //Select a fish from the fish in the tank
+ if(prob(25)) //25% chance to be a dud (blank) egg
+ fish = "dud"
+ var/obj/item/fish_eggs/egg_path = null //Create empty variable to receive the egg_path
+ egg_path = fish_eggs_list[fish] //Locate the corresponding path from fish_eggs_list that matches the fish
+ if(!egg_path) //The fish wasn't located in the fish_eggs_list, potentially due to a typo, so return a dud egg
+ return /obj/item/fish_eggs
+ else //The fish was located in the fish_eggs_list, so return the proper egg
+ return egg_path
+
+/obj/machinery/fishtank/proc/harvest_eggs(var/mob/user)
+ if(!egg_count) //Can't harvest non-existant eggs
+ return
+
+ if(egg_count > max_fish) //Make sure the number of eggs doesn't exceed the max_fish for the tank
+ egg_count = max_fish //If you somehow exceeded the cap, set the egg_count to max, destroy the excess later
+
+ while(egg_count > 0) //Loop until you've harvested all the eggs
+ var/obj/item/fish_eggs/egg = pick(egg_list) //Select an egg at random
+ egg = new egg(get_turf(user)) //Spawn the egg at the user's feet
+ egg_list.Remove(egg) //Remove the egg from the egg_list
+ egg_count -- //Decrease the egg_count and begin again
+
+ egg_list.Cut() //Destroy any excess eggs, clearing the egg_list
+
+/obj/machinery/fishtank/proc/destroy(var/deconstruct = 0)
+ var/turf/T = get_turf(src) //Store the tank's turf for atmos updating after deletion of tank
+ if(!deconstruct) //Check if we are deconstructing or breaking the tank
+ var/shards_left = shard_count
+ while(shards_left > 0) //Produce the appropriate number of glass shards
+ new /obj/item/weapon/shard(get_turf(src))
+ shards_left --
+ if(water_level) //Spill any water that was left in the tank when it broke
+ spill_water()
+ else //We are deconstructing, make glass sheets instead of shards
+ var/sheets = shard_count + 1 //Deconstructing it salvages all the glass used to build the tank
+ new /obj/item/stack/sheet/glass(get_turf(src), sheets) //Produce the appropriate number of glass sheets, in a single stack
+ qdel(src) //QDel the tank and it's contents
+ T.air_update_turf(1) //Update the air for the turf, to avoid permanent atmos sealing with wall tanks
+
+/obj/machinery/fishtank/proc/spill_water()
+ switch(tank_type)
+ if("bowl") //Fishbowl: Wets it's own tile
+ var/turf/T = get_turf(src)
+ if(!istype(T, /turf/simulated)) return
+ var/turf/simulated/S = T
+ S.MakeSlippery()
+ if("tank") //Fishtank: Wets it's own tile and the 4 adjacent tiles (cardinal directions)
+ var/turf/ST = get_turf(src)
+ if(istype(ST, /turf/simulated))
+ var/turf/simulated/ST2 = ST
+ ST2.MakeSlippery()
+ var/list/L = ST.CardinalTurfs()
+ for(var/turf/T in L)
+ if(!istype(T, /turf/simulated)) continue
+ var/turf/simulated/S = T
+ S.MakeSlippery()
+ if("wall") //Wall-tank: Wets it's own tile and the surrounding 8 tiles (3x3 square)
+ for(var/turf/T in trange(1, src.loc))
+ if(!istype(T, /turf/simulated)) continue
+ var/turf/simulated/S = T
+ S.MakeSlippery()
+
+////////////////////////////// Note from FalseIncarnate:
+// EXAMINE PROC // This proc is massive, messy, and probably could be handled better.
+////////////////////////////// Feel free to try cleaning it up if you think of a better way to do it.
+
+/obj/machinery/fishtank/examine()
+ ..()
+ var/examine_message = ""
+ //Approximate water level
+ if(water_level == 0)
+ examine_message += "\The [src] is empty! "
+ else if(water_level < water_capacity * 0.1)
+ examine_message += "\The [src] is nearly empty! "
+ else if(water_level <= water_capacity * 0.25)
+ examine_message += "\The [src] is about one-quarter filled. "
+ else if(water_level <= water_capacity * 0.5)
+ examine_message += "\The [src] is about half filled. "
+ else if(water_level <= water_capacity * 0.75)
+ examine_message += "\The [src] is about three-quarters filled. "
+ else if(water_level < water_capacity)
+ examine_message += "\The [src] is nearly full! "
+ else if (water_level == water_capacity)
+ examine_message += "\The [src] is full! "
+
+ //Approximate filth level
+ if(filth_level == 0)
+ examine_message += "[src] is spotless! "
+ else if(filth_level <= 2.5)
+ examine_message += "[src] looks like the glass has been smudged. "
+ else if(filth_level <= 5) //This is the breeding threshold
+ examine_message += "[src] has some algae growth in it. "
+ else if(filth_level <= 7.5)
+ examine_message += "[src] has a lot of algae growth in it. "
+ else if(filth_level < 10)
+ examine_message += "[src] is getting hard to see into! Someone should clean it soon! "
+ else if(filth_level == 10)
+ examine_message += "[src] is absolutely disgusting! Someone should clean it NOW! "
+
+ //Approximate food level
+ if(!fish_count) //Check if there are fish in the tank
+ if(food_level > 0) //Don't report a tank that has neither fish nor food in it
+ examine_message += "There's some food in [src], but no fish! "
+ else //We've got fish, report the food level
+ if(food_level == 0)
+ examine_message += "The fish look very hungry! "
+ else if(food_level < 2)
+ examine_message += "The fish are nibbling on the last of their food. "
+ else if(food_level < 10) //Breeding is possible
+ examine_message += "The fish seem happy! "
+ else if(food_level == 10)
+ examine_message += "There is a solid layer of fish food at the top. "
+
+ //Report the number of harvestable eggs
+ if(egg_count) //Don't bother if there isn't any eggs
+ examine_message += "There are [egg_count] eggs able to be harvested! "
+
+ //Report the number and types of live fish if there is water in the tank
+ if(fish_count == 0)
+ examine_message += "\The [src] doesn't contain any live fish. "
+ else
+ //Build a message reporting the types of fish
+ var/fish_num = fish_count
+ var/message = "You spot "
+ while(fish_num > 0)
+ if(fish_count > 1 && fish_num == 1) //If there were at least 2 fish, and this is the last one, add "and" to the message
+ message += "and "
+ message += "a [fish_list[fish_num]]"
+ fish_num --
+ if(fish_num > 0) //There's more fish, add a comma to the message
+ message +=", "
+ message +="." //No more fish, end the message with a period
+ //Display the number of fish and previously constructed message
+ examine_message += "\The [src] contains [fish_count] live fish. [message] "
+
+ //Report lid state for tanks and wall-tanks
+ if(has_lid) //Only report if the tank actually has a lid
+ //Report lid state
+ if(lid_switch)
+ examine_message += "The lid is closed. "
+ else
+ examine_message += "The lid is open. "
+
+ //Report if the tank is leaking/cracked
+ if(water_level > 0) //Tank has water, so it's actually leaking
+ if(leaking == 1) examine_message += "\The [src] is leaking."
+ if(leaking == 2) examine_message += "\The [src] is leaking profusely!"
+ else //No water, report the cracks instead
+ if(leaking == 1) examine_message += "\The [src] is cracked."
+ if(leaking == 2) examine_message += "\The [src] is nearly shattered!"
+
+
+ //Finally, report the full examine_message constructed from the above reports
+ usr << "[examine_message]"
+
+//////////////////////////////
+// ATACK PROCS //
+//////////////////////////////
+
+/obj/machinery/fishtank/attack_animal(mob/living/simple_animal/M as mob)
+ if(istype(M, /mob/living/simple_animal/pet/cat))
+ if(M.a_intent == "help") //Cats can try to fish in open tanks on help intent
+ if(lid_switch) //Can't fish in a closed tank. Fishbowls are ALWAYS open.
+ M.visible_message("[M.name] stares at into \the [src] while sitting perfectly still.", "The lid is closed, so you stare into \the [src] intently.")
+ else
+ if(fish_count) //Tank must actually have fish to try catching one
+ M.visible_message("[M.name] leaps up onto \the[src] and attempts to fish through the opening!", "You jump up onto \the [src] and begin fishing through the opening!")
+ spawn(10)
+ if(water_level && prob(45)) //If there is water, there is a chance the cat will slip, Syndicat will spark like E-N when this happens
+ M.visible_message("[M.name] slipped and got soaked!", "You slipped and got soaked!")
+ if(istype(M, /mob/living/simple_animal/pet/cat/Syndi))
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ else //No water or didn't slip, get that fish!
+ M.visible_message("[M.name] catches and devours a live fish!", "You catch and devour a live fish, yum!")
+ kill_fish() //Kill a random fish
+ M.health = M.maxHealth //Eating fish heals the predator
+ else
+ usr << "There are no fish in [src]!"
+ else
+ attack_generic(M, M.harm_intent_damage)
+ else if(istype(M, /mob/living/simple_animal/hostile/bear))
+ if(M.a_intent == "help") //Bears can try to fish in open tanks on help intent
+ if(lid_switch) //Can't fish in a closed tank. Fishbowls are ALWAYS open.
+ M.visible_message("[M.name] scrapes it's claws along \the [src]'s lid.", "The lid is closed, so you scrape your claws against \the [src]'s lid.")
+ else
+ if(fish_count) //Tank must actually have fish to try catching one
+ M.visible_message("[M.name] reaches into \the[src] and attempts to fish through the opening!", "You reach into \the [src] and begin fishing through the opening!")
+ spawn(5)
+ if(water_level && prob(5)) //Bears are good at catching fish, only a 5% chance to fail
+ M.visible_message("[M.name] swipes at the water!", "You just barely missed that fish!")
+ else //No water or didn't slip, get that fish!
+ M.visible_message("[M.name] catches and devours a live fish!", "You catch and devour a live fish, yum!")
+ kill_fish() //Kill a random fish
+ M.health = M.maxHealth //Eating fish heals the predator
+ else
+ usr << "There are no fish in [src]!"
+ else
+ attack_generic(M, M.harm_intent_damage)
+ else
+ if(M.melee_damage_upper > 0) //If the simple_animal has a melee_damage_upper defined, use that for the damage
+ attack_generic(M, M.melee_damage_upper)
+ else if(M.a_intent == "harm") //Let any simple_animal try to break tanks when on harm intent
+ if(M.harm_intent_damage <= 0) return //If it doesn't do damage, don't bother with the attack
+ attack_generic(M, M.harm_intent_damage)
+ check_health()
+
+/obj/machinery/fishtank/attack_alien(mob/living/user as mob)
+ if(islarva(user)) return
+ attack_generic(user, 15)
+
+/obj/machinery/fishtank/attack_slime(mob/living/user as mob)
+ var/mob/living/carbon/slime/S = user
+ if (!S.is_adult)
+ return
+ attack_generic(user, rand(10, 15))
+
+/obj/machinery/fishtank/attack_hand(mob/user as mob)
+ if(HULK in user.mutations)
+ user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!"))
+ user.visible_message("[user] smashes through [src]!")
+ destroy()
+ else if (usr.a_intent == "harm")
+ user.changeNext_move(CLICK_CD_MELEE)
+ playsound(get_turf(src), 'sound/effects/glassknock.ogg', 80, 1)
+ usr.visible_message("[usr.name] bangs against the [src.name]!", \
+ "You bang against the [src.name]!", \
+ "You hear a banging sound.")
+ else
+ user.changeNext_move(CLICK_CD_MELEE)
+ playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1)
+ usr.visible_message("[usr.name] taps on the [src.name].", \
+ "You tap on the [src.name].", \
+ "You hear a knocking sound.")
+ return
+
+/obj/machinery/fishtank/proc/hit(var/damage, var/sound_effect = 1)
+ cur_health = max(0, cur_health - damage)
+ if(sound_effect)
+ playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1)
+ check_health()
+
+/obj/machinery/fishtank/proc/attack_generic(mob/living/user as mob, damage = 0) //used by attack_alien, attack_animal, and attack_slime
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.do_attack_animation(src)
+ cur_health -= damage
+ if(cur_health <= 0)
+ user.visible_message("[user] smashes through \the [src]!")
+ destroy()
+ else //for nicer text~
+ user.visible_message("[user] smashes into \the [src]!")
+ playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
+ check_health()
+
+/obj/machinery/fishtank/attackby(var/obj/item/O, var/mob/user as mob)
+ //Welders repair damaged tanks on help intent, damage on all others
+ if(istype(O, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/W = O
+ if(user.a_intent == "help")
+ if(W.isOn())
+ if(cur_health < max_health)
+ usr << "You repair some of the cracks on \the [src]."
+ cur_health += 20
+ check_health()
+ else
+ usr << "There is no damage to fix!"
+ else
+ if(cur_health < max_health)
+ usr << "[W.name] must on to repair this damage."
+ else
+ user.changeNext_move(CLICK_CD_MELEE)
+ hit(W.force)
+ return
+ //Open reagent containers add and remove water
+ if(O.is_open_container())
+ if(istype(O, /obj/item/weapon/reagent_containers/glass))
+ if(lid_switch)
+ usr << "Open the lid on \the [src] first!"
+ return
+ var/obj/item/weapon/reagent_containers/glass/C = O
+ //Containers with any reagents will get dumped in
+ if(C.reagents.total_volume)
+ var/water_value = 0
+ water_value += C.reagents.get_reagent_amount("water") //Water is full value
+ water_value += C.reagents.get_reagent_amount("holywater") *1.1 //Holywater is (somehow) better. Who said religion had to make sense?
+ water_value += C.reagents.get_reagent_amount("tonic") * 0.25 //Tonic water is 25% value
+ water_value += C.reagents.get_reagent_amount("sodawater") * 0.50 //Sodawater is 50% value
+ water_value += C.reagents.get_reagent_amount("fishwater") * 0.75 //Fishwater is 75% value, to account for the fish poo
+ water_value += C.reagents.get_reagent_amount("ice") * 0.80 //Ice is 80% value
+ var/message = ""
+ if(!water_value) //The container has no water value, clear everything in it
+ message = "The filtration process removes everything, leaving the water level unchanged."
+ C.reagents.clear_reagents()
+ else
+ if(water_level == water_capacity)
+ usr << "[src] is already full!"
+ return
+ else
+ message = "The filtration process purifies the water, raising the water level."
+ water_level += water_value
+ if(water_level == water_capacity)
+ message += " You filled \the [src] to the brim!"
+ if(water_level > water_capacity)
+ message += " You overfilled \the [src] and some water runs down the side, wasted."
+ C.reagents.clear_reagents()
+ check_water_level()
+ user.visible_message("[user.name] pours the contents of [C.name] into \the [src].", "[message]")
+ return
+ //Empty containers will scoop out water, filling the container as much as possible from the water_level
+ else
+ if(water_level == 0)
+ usr << "[src] is empty!"
+ else
+ if(water_level >= C.volume) //Enough to fill the container completely
+ C.reagents.add_reagent("fishwater", C.volume)
+ water_level -= C.volume
+ user.visible_message("[user.name] scoops out some water from \the [src].", "You completely fill [C.name] from \the [src].")
+ else //Fill the container as much as possible with the water_level
+ C.reagents.add_reagent("fishwater", water_level)
+ water_level = 0
+ user.visible_message("[user.name] scoops out some water from \the [src].", "You fill [C.name] with the last of the water in \the [src].")
+ check_water_level()
+ return
+ //Wrenches can deconstruct empty tanks, but not tanks with any water. Kills any fish left inside and destroys any unharvested eggs in the process
+ if(istype(O, /obj/item/weapon/wrench))
+ if(water_level == 0)
+ usr << "Now disassembling [src]."
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ if(do_after(user,50))
+ destroy(1)
+ else
+ usr << "[src] must be empty before you disassemble it!"
+ return
+ //Fish eggs
+ else if(istype(O, /obj/item/fish_eggs))
+ var/obj/item/fish_eggs/egg = O
+ //Don't add eggs if there is no water (they kinda need that to live)
+ if(water_level == 0)
+ usr << "[src] has no water; [egg.name] won't hatch without water!"
+ else
+ //Don't add eggs if the tank already has the max number of fish
+ if(fish_count >= max_fish)
+ usr << "[src] can't hold any more fish."
+ else
+ add_fish(egg.fish_type)
+ qdel(egg)
+ return
+ //Fish food
+ else if(istype(O, /obj/item/weapon/fishfood))
+ //Only add food if there is water and it isn't already full of food
+ if(water_level)
+ if(food_level < 10)
+ if(fish_count == 0)
+ user.visible_message("[user.name] shakes some fish food into the empty [src]... How sad.", "You shake some fish food into the empty [src]... If only it had fish.")
+ else
+ user.visible_message("[user.name] feeds the fish in \the [src]. The fish look excited!", "You feed the fish in \the [src]. They look excited!")
+ food_level += 10
+ else
+ usr << "[src] already has plenty of food in it. You decide to not add more."
+ else
+ usr << "[src] doesn't have any water in it. You should fill it with water first."
+ check_food_level()
+ return
+ //Fish egg scoop
+ else if(istype(O, /obj/item/weapon/egg_scoop))
+ if(egg_count)
+ user.visible_message("[user.name] harvests some fish eggs from \the [src].", "You scoop the fish eggs out of \the [src].")
+ harvest_eggs(user)
+ else
+ user.visible_message("[user.name] fails to harvest any fish eggs from \the [src].", "There are no fish eggs in \the [src] to scoop out.")
+ return
+ //Fish net
+ if(istype(O, /obj/item/weapon/fish_net))
+ if(fish_count > 0)
+ var/caught_fish = pick(fish_list)
+ usr << "You catch and remove a [caught_fish] from \the [src]."
+ kill_fish(caught_fish)
+ //TODO: Fish object spawning, need to get sprites before I can code the fish objects
+ else
+ usr << "There are no fish in \the [src] to catch!"
+ return
+ //Tank brush
+ if(istype(O, /obj/item/weapon/tank_brush))
+ if(filth_level == 0)
+ usr << "[src] is already spotless!"
+ else
+ filth_level = 0
+ user.visible_message("[user.name] scrubs the inside of \the [src], cleaning the filth.", "You scrub the inside of \the [src], cleaning the filth.")
+ else if(O && O.force)
+ user.visible_message("\The [src] has been attacked by [user.name] with \the [O]!")
+ hit(O.force)
+ return
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index da6cf21d909..b142a1fa9b1 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -71,7 +71,8 @@
"adminordrazine" = 1,
"eznutrient" = 1,
"robustharvest" = 1,
- "left4zed" = 1
+ "left4zed" = 1,
+ "fishwater" = 0.75,
)
var/global/list/weedkiller_reagents = list(
"fluorine" = -4,
@@ -98,6 +99,7 @@
"phosphorus" = -0.5,
"water" = 1,
"sodawater" = 1,
+ "fishwater" = 1,
)
// Beneficial reagents also have values for modifying yield_mod and mut_mod (in that order).
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 61f1db03b17..fd0b5638d68 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -205,6 +205,29 @@ datum
reagent_state = LIQUID
color = "#B97A57"
+ fishwater
+ name = "Fish Water"
+ id = "fishwater"
+ description = "Smelly water from a fish tank. Gross!"
+ reagent_state = LIQUID
+ color = "#757547"
+
+ reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+ if(!istype(M, /mob/living))
+ return
+ if(method == INGEST)
+ M << "Oh god, why did you drink that?"
+
+ on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(prob(30)) // Nasty, you drank this stuff? 30% chance of the fakevomit (non-stunning version)
+ if(prob(50)) // 50/50 chance of green vomit vs normal vomit
+ M.fakevomit(1)
+ else
+ M.fakevomit(0)
+ ..()
+ return
+
water
name = "Water"
id = "water"
diff --git a/icons/obj/fish_items.dmi b/icons/obj/fish_items.dmi
new file mode 100644
index 00000000000..f21be0bb9e6
Binary files /dev/null and b/icons/obj/fish_items.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index 6eec85eca71..0bd2935fe91 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi
index 3368ccb5331..95bb1778cde 100755
Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ
diff --git a/icons/obj/vending_restock.dmi b/icons/obj/vending_restock.dmi
index aa9f2873f02..548f5ce5869 100644
Binary files a/icons/obj/vending_restock.dmi and b/icons/obj/vending_restock.dmi differ
diff --git a/paradise.dme b/paradise.dme
index d73f4d8fc86..eecaee51b2c 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1118,6 +1118,9 @@
#include "code\modules\events\tgevents\vent_clog.dm"
#include "code\modules\ext_scripts\irc.dm"
#include "code\modules\ext_scripts\python.dm"
+#include "code\modules\fish\fish_eggs.dm"
+#include "code\modules\fish\fish_items.dm"
+#include "code\modules\fish\fishtank.dm"
#include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm"