diff --git a/code/game/objects/structures/watercloset_vr.dm b/code/game/objects/structures/watercloset_vr.dm
index 7e8790fbcc..2239764639 100644
--- a/code/game/objects/structures/watercloset_vr.dm
+++ b/code/game/objects/structures/watercloset_vr.dm
@@ -4,30 +4,55 @@
/obj/structure/toilet
var/teleplumbed = FALSE
var/exit_landmark
+ var/exit_container
+ var/refill_cooldown = 200
+ var/refilling = FALSE
/obj/structure/toilet/Initialize()
if(z in global.using_map.map_levels)
teleplumbed = TRUE
exit_landmark = locate(/obj/effect/landmark/teleplumb_exit)
+ exit_container = locate(/obj/structure/biowaste_tank)
+ if(exit_container)
+ exit_landmark = exit_container
if(teleplumbed && exit_landmark)
desc = "The BS-500, a bluespace rift-rotation-based waste disposal unit for small matter. This one seems remarkably clean."
return ..()
/obj/structure/toilet/attack_hand(mob/living/user as mob)
- if(open && teleplumbed && exit_landmark)
+ if(open && teleplumbed && exit_landmark && !refilling)
var/list/bowl_contents = list()
for(var/obj/item/I in loc.contents)
if(istype(I) && !I.anchored)
bowl_contents += I
if(bowl_contents.len)
+ refilling = TRUE
user.visible_message("[user] flushes the toilet.", "You flush the toilet.")
playsound(src, 'sound/vore/death7.ogg', 50, 1) //Got lazy about getting new sound files. Have a sick remix lmao.
playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
playsound(src, 'sound/mecha/powerup.ogg', 30, 1)
+ var/bowl_conga = 0
for(var/obj/item/F in bowl_contents)
- F.forceMove(get_turf(exit_landmark))
- bowl_contents -= F
+ if(bowl_conga < 150)
+ bowl_conga += 2
+ spawn(3 + bowl_conga)
+ F.SpinAnimation(5,3)
+ spawn(15)
+ F.forceMove(src)
+ spawn(refill_cooldown)
+ for(var/obj/item/F in bowl_contents)
+ F.forceMove(exit_landmark)
+ bowl_contents.Cut()
+ refilling = FALSE
return
+ if(refilling)
+ playsound(src, 'sound/machines/door_locked.ogg', 30, 1)
+ to_chat(user, "The toilet is still refilling its tank.")
+ return ..()
+
+/obj/structure/toilet/attackby(obj/item/I as obj, mob/living/user as mob)
+ if(refilling) //No cistern interactions until bowl contents have been dealt with.
+ return
return ..()
/obj/structure/toilet/attack_ai(mob/user as mob)
@@ -39,3 +64,78 @@
/obj/effect/landmark/teleplumb_exit
name = "teleplumbing exit"
+
+/obj/effect/landmark/teleplumb_exit/Entered(atom/movable/thing, atom/OldLoc)
+ thing.forceMove(get_turf(src))
+
+/obj/structure/biowaste_tank
+ name = "Bluespace Bio-Compostor Terminal"
+ icon = 'icons/obj/survival_pod_comp.dmi'
+ icon_state = "pod_computer"
+ desc = "It appears to be a massive sealed container attached to some heavy machinery and thick tubes containing a whole network of interdimensional pipeworks. It appears whatever vanished down the station's toilets ends up in this thing."
+ anchored = TRUE
+ density = TRUE
+ var/muffin_mode = FALSE
+ var/mob/living/simple_mob/vore/aggressive/corrupthound/muffinmonster
+
+/obj/structure/biowaste_tank/Initialize()
+ muffinmonster = new /mob/living/simple_mob/vore/aggressive/corrupthound/muffinmonster(src)
+ muffinmonster.name = "Activate Muffin Monster"
+ muffinmonster.voremob_loaded = TRUE
+ muffinmonster.init_vore()
+ return ..()
+
+/obj/structure/biowaste_tank/AllowDrop()
+ return TRUE
+
+/obj/structure/biowaste_tank/Entered(atom/movable/thing, atom/OldLoc)
+ if(istype(thing, /obj/item/weapon/reagent_containers/food))
+ qdel(thing)
+ return
+ if(istype(thing, /obj/item/organ))
+ qdel(thing)
+ return
+ if(istype(thing, /obj/item/weapon/storage/vore_egg))
+ if(thing.contents.len)
+ for(var/atom/movable/C in thing.contents)
+ C.forceMove(src)
+ qdel(thing)
+ return
+ if(muffin_mode)
+ if(muffinmonster)
+ thing.forceMove(muffinmonster.vore_selected)
+ else
+ muffin_mode = FALSE
+
+/obj/structure/biowaste_tank/attack_hand(var/mob/user as mob)
+ if(contents.len)
+ var/atom/movable/choice = tgui_input_list(usr, "It appears the machine has caught some items in the lost-and-found filter system. Would you like to eject something?", "Item Retrieval Console", contents)
+ if(choice)
+ if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
+ return
+ if(choice == muffinmonster && muffinmonster.loc == src)
+ muffin_mode = !muffin_mode
+ if(muffin_mode)
+ muffinmonster.name = "Deactivate Muffin Monster"
+ for(var/atom/movable/C in contents)
+ if(C == muffinmonster)
+ continue
+ C.forceMove(muffinmonster.vore_selected)
+ else
+ muffinmonster.name = "Activate Muffin Monster"
+ muffinmonster.release_vore_contents(include_absorbed = TRUE, silent = TRUE)
+ return
+ else
+ choice.forceMove(get_turf(src))
+
+/obj/structure/biowaste_tank/emag_act(var/remaining_charges, var/mob/user, var/emag_source)
+ if(muffinmonster && muffin_mode)
+ muffinmonster.name = "Muffin Monster"
+ muffinmonster.forceMove(get_turf(src))
+ muffinmonster = null
+ muffin_mode = FALSE
+
+/mob/living/simple_mob/vore/aggressive/corrupthound/muffinmonster
+ name = "Muffin Monster"
+ desc = "OH GOD IT'S LOOSE!"
+ vore_default_item_mode = IM_DIGEST
\ No newline at end of file
diff --git a/maps/southern_cross/southern_cross-2.dmm b/maps/southern_cross/southern_cross-2.dmm
index 35d5df7635..902c2c79e2 100644
--- a/maps/southern_cross/southern_cross-2.dmm
+++ b/maps/southern_cross/southern_cross-2.dmm
@@ -5073,7 +5073,7 @@
"cxn" = (/obj/machinery/conveyor{id = "garbage"},/turf/simulated/floor,/area/maintenance/disposal)
"cxo" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor,/area/maintenance/disposal)
"cxp" = (/turf/simulated/floor,/area/maintenance/disposal)
-"cxq" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/machinery/firealarm{layer = 3.3; pixel_y = 26},/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/random/trash,/obj/random/trash,/obj/random/trash,/turf/simulated/floor,/area/maintenance/disposal)
+"cxq" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/random/trash,/obj/random/trash,/obj/random/trash,/turf/simulated/floor,/area/maintenance/disposal)
"cxr" = (/obj/machinery/light/small{dir = 8},/obj/random/trash_pile,/turf/simulated/floor,/area/maintenance/cargo)
"cxs" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor,/area/maintenance/cargo)
"cxu" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor,/area/maintenance/cargo)
@@ -5318,7 +5318,7 @@
"cEa" = (/obj/machinery/door/blast/regular{id = "trash"; name = "disposal mass driver"},/turf/simulated/floor/airless,/area/maintenance/disposal)
"cEb" = (/obj/machinery/conveyor_switch/oneway{id = "garbage"; name = "disposal coveyor"},/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/button/remote/driver{id = "trash"; pixel_x = -26; pixel_y = -6},/turf/simulated/floor,/area/maintenance/disposal)
"cEc" = (/obj/item/weapon/stool/padded,/turf/simulated/floor,/area/maintenance/disposal)
-"cEd" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/item/weapon/storage/bag/trash,/obj/structure/table/gamblingtable,/turf/simulated/floor,/area/maintenance/disposal)
+"cEd" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/item/weapon/storage/bag/trash,/obj/structure/table/gamblingtable,/obj/machinery/firealarm{dir = 8; layer = 3.3; pixel_x = 26},/turf/simulated/floor,/area/maintenance/disposal)
"cEe" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/meter,/turf/simulated/floor,/area/maintenance/cargo)
"cEf" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor,/area/maintenance/cargo)
"cEg" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/floor_decal/industrial/warning,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "crg_aft_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = -25; req_one_access = null},/turf/simulated/floor,/area/maintenance/cargo)
@@ -6430,6 +6430,7 @@
"oqo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/hallway/primary/seconddeck/dockhallway)
"oqz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/machinery/status_display{pixel_x = 32},/turf/simulated/floor/tiled/white,/area/medical/medbay2)
"oqZ" = (/obj/structure/table/woodentable,/obj/item/device/camera,/turf/simulated/floor/carpet,/area/crew_quarters/seconddeck/gym)
+"orq" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/obj/structure/biowaste_tank,/obj/structure/railing,/turf/simulated/floor,/area/maintenance/disposal)
"osg" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals6{dir = 6},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/aft)
"ots" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2)
"ouo" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
@@ -6479,7 +6480,7 @@
"oYz" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/storage/primary)
"oZw" = (/obj/item/clothing/head/soft/mime,/obj/item/clothing/mask/gas/mime,/obj/item/clothing/shoes/mime,/obj/item/clothing/under/mime,/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/crew_quarters/seconddeck/gym)
"oZL" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/glass_external{frequency = null; icon_state = "door_locked"; id_tag = null; locked = 1; name = "Dock Two Internal Airlock"; req_access = list(13)},/obj/effect/map_helper/airlock/door/int_door,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2/arrivals)
-"oZN" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/effect/landmark/teleplumb_exit,/turf/simulated/floor,/area/maintenance/disposal)
+"oZN" = (/obj/machinery/conveyor{dir = 9; id = "garbage"},/obj/effect/landmark/teleplumb_exit,/turf/simulated/floor,/area/maintenance/disposal)
"pbb" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway2)
"pbf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/yellow/diagonal,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"pbF" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/cups,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/structure/extinguisher_cabinet{pixel_y = -30},/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/turf/simulated/floor/tiled,/area/medical/surgeryobs)
@@ -7300,7 +7301,7 @@ aaaaaaaaaaaaaagaaaaaaaaaaIZaJaaJaaJaaJaaJaaJaaJacifaJaaJaaJaaTiaWlcigcihciIciJci
aaaaaaaaaaaaaafaaaaaaaaaaTfbfFbfGbfFbfGbfFbfGbfFbfGbfFbfGbfFaTibfHaRpaRpcqfcqgcqhaTocqhcqjcfZcfZcqkaRpblXciObFHciPcqlcqmcqnbYUbYUcqpbYUqbwcqrcqscqtcsKcqucqvcqwcqxcqycqzcqAcqMcqMcqNckBcqOcqQcqRcqScqTcqUbXNcqVcqWcqXcqYcqZbXUiOIbYXuxtjiSiCsbYZaaaaaagfQgfQcrasqlcbgtBzcrlwdccrmbVDbVDbVDbVDcrnouTbZbouTbZdbZibZidJNbZibZibZicrobZjcbwbsgcrpbZkbZkaaaaaacmFuqjcbFcbFbZpbZqbZrbZscbJbZucrqbZvccQpxbcrrbZzbZzbZAbZBbZCcrsbZDcrtcaNcrucaMcrvcrwcrxcrycrzdOBcrAbZEbZFnjGbZGbZHbZIcdkbZKcrBbZLbZMbZMceBbZPbZQbAKceBceBcdraaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaqlFaafaaaaaaaaaaaa
aaaaaaaaaaaaqlFaaaaaaaaaaKRbiDaKRbiDaKRbiDaKRbiDaKRbiDaKRbiDaafaafaafaRqaRpaRpaRpaRpaRpaRpaRpaRpaRpaRpblXcrCbGbciPcrDcqmcrEcuecuecrIcuecuecrVcrWcrXcsKcrYcsKcrZcsacsKcsbcsccsecsecsfcsgcshcdFcsjcskcsocswbXNcqVcsxcsycszcqYcsAbXUiOIcsBjiSiCsbYZaaaaaaaaabWCcsCcsDcbgcsEcsGwlgcsHcsIcalcsJctcjqwctdbUmctejqwctfctgcthcticamctjctkctlcbwcbxcapceTaaaaaaaaacmFkOlcaucbFcawcaxcaycazcbJcaCctmcaCccQcaEcaFcaGcaHcaIcaJcaKctncaLctocaNctpcaMctqbYwctrbYwcaOdOBctsctthBTnjGcaQcaRcaScdkcaUcaVeHwctGcaWbZUcaXcaYcaZctPcbacdraaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaagaagaaaaaaaaaaaaaaa
aaaaaaaaaaaaaagaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaactQctRctSctTctUoZNctVctWctXctYctZcuaciPcubcuccudcuecrUcDacDccuecufcugcuecsKcuhcsKcuicujcsKcuCcuDcuEcuEcuGcuHcuCbXNcuIcuJcuKcuLbXNcuMcuMcuMcuNcuMcqYcqYcqYcsBjiSiCsjiSaaaaaaaaabWCbWCcuOcsDcbgcbgcuPcblcbncbncbocbpcbqcbrcbscbtcbqcuQcuRcuScuScuTcbucbwcbwcbxccEceTceTaaaaaaaaaclgkOlcbEcbFcbFcbGcbHcbIcbJcbKcuUcbLccQcbNcuVcbOcbPcbQcbRcbScuWcbTcbUcbVcuXdOBcvkcvlcvncvocvpdOBfmgcvqvzhnjGcbXcvrcvscdkcbZcdlccbcccccdceBccfccgcchcdrcdrcdraafaafaafhqqaafaaaaaaqlFaafaagaagaagaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaagaagaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaactQcvtcvJcvKcvLctQctQctQcvMcvOcvPcvQciPciPciPciPcuecElcvTcvUcEpcvVcvWcvXcvYcvZcwacwbcwccsKcwdcwecwfcwhcwucwvcwwbXNcdFcwxcdFcwybXNcwzcwAcwBcwCcuMjiSjiScwDjiSjiScwEjiSaaaaaaaaaaaabWCbWCcuOcsDsqlcwFcwGcwHcwHcsDcwIcwJcwKbUmcwMcwJcxccbxcxdcxdcxeccDbsgcbxccEceTceTaaaaaaaaaaaaclgkOlcxfcfccfdccLccMccNcxhccOcxiccPccQccQccQccQccTccSccTccUccWccVccWccXccWdOBcdbcdbcxjcdcdOBdOBcxkcxlcdfnjGcdkcdicdkcdkcbZcdlccbcxmcdmceBcdocdpcdqcdraaaaaaaaaaaaaaaaagaaaaaaaaaaaiuZKaaiaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaagaagaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaactQcvtcvJcvKcvLorqctQctQcvMcvOcvPcvQciPciPciPciPcuecElcvTcvUcEpcvVcvWcvXcvYcvZcwacwbcwccsKcwdcwecwfcwhcwucwvcwwbXNcdFcwxcdFcwybXNcwzcwAcwBcwCcuMjiSjiScwDjiSjiScwEjiSaaaaaaaaaaaabWCbWCcuOcsDsqlcwFcwGcwHcwHcsDcwIcwJcwKbUmcwMcwJcxccbxcxdcxdcxeccDbsgcbxccEceTceTaaaaaaaaaaaaclgkOlcxfcfccfdccLccMccNcxhccOcxiccPccQccQccQccQccTccSccTccUccWccVccWccXccWdOBcdbcdbcxjcdcdOBdOBcxkcxlcdfnjGcdkcdicdkcdkcbZcdlccbcxmcdmceBcdocdpcdqcdraaaaaaaaaaaaaaaaagaaaaaaaaaaaiuZKaaiaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaagaagaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacvKcxncvKcxocxpcxqctQcxrcxscGecxIcxKcxLcxMcxNcGfcuecxPkDdcxRcGmcxScxTcxUcxVcxWcuecxXcyicyjcykcymcwNcwNcyncyocypcyqcyrcyscytcyucuMcyvcywcyxcyycuMcyzcyAcyNcyPcyQcySjiSaaaaaaaaaaaaaaabWCbWCcyTcyUcyTcyVcyWcyVcyWcyWcyXiqfbUmiqfcyXcyYcyYmIdcyZcyYmIdczamIdceTceTaaaaaaaaaaaaaaaclgcdTcdUcfccdWcdXcdYcdZceacebcecceiczbceeczccefcegcehceicejcekcelcemczdbCYcencznceocepczpceqbCZcesczHcetceucevcewcexczIczJczKczYczZcAbceBceBceAceBcdraaaaaaaaaaaaaaaaagaaaaaaaaaaaiaaiaaiaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaagaagaagaagqlFaafaafaafqlFaagaagaagaagaafaagqlFaaaaaaaaacvKcAccAucAvcAxcAycAzcABcACcAJcAKcAMcxLcxMcxNfHhcuecANiYsoRMrRkcAPcAQcAVcAWcAXcAYpMvcBacBecBfcBgcBecBecBicBjcBkcBlcBscAZcBtcBucBvcBwcBxcBycBGcBHcyzcBIcBJcBKcqYcBLjiSaaaaaaaaacFUaaaaaabWCbWCgfQvpHcBMcBNcBOcBWvpHcBXiqfbUmiqfcBYklhcBZcCacCbcCeklhbZkceTceTaaaaaacFUaaaaaaaaaclgcfbcCfcfccfdcfecffcChcfgcClcCmcfocficfjcfkcfncfmcfncfocfpcfqcfrcfscftcfucfvcfxcfxcfycfzcfAcfBcCncfEcfDcfEcfFcfEcCocCpcCwcCCcCFcCGcCHcjqcfHcfIcfJcjuaaaaaacFUaaaaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiuZKaafaafaaaaaaaaactQcCIcCJcCKcCLcCSctQcCTcCUcCVcCWcCXvIDkhWvIDcCZcuecDblkicxRgXBcuerkXcDdnyycDfcDgrYBcDhcwNcDncwNcwNcwNcDhcDocDpcDpcDpcDpcDpcDpcDrcDscDtcDucDvcuMcyzcBIcDwcDxcDycDycDycDycDyaaaaaaaaaaaaaaaaaagfQgfQbWCbWCbWCgfQgfQgfQcDzcDAcDHgfQbZkbZkceTceTceTbZkbZkaaaaaaaaaaaaaaaaaackackackackacgkcjfcjfcgncgocjfcgqcjNcgscjNckjckEckHcjRcgycjRckHckHckHcgCcDIcgDckHcDMcgEcDNcDOcDNcDMcgGcgGcgGcgGcgGcgGcgHcgIcDPcDQcDScDWcDXcDYcjqcgKcgLcgMciHaaaaaaaaaaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa