From 15c9d5973a9329a0ee7a8ef4a2aef19507e3494a Mon Sep 17 00:00:00 2001 From: Verkister Date: Mon, 7 Feb 2022 21:38:55 +0200 Subject: [PATCH] Instead of instantly just zapping the contents away, they now swirl the stuff around before making it vanish one item at a time, keeping the things contained for a 20 sec cooldown time before it gets zapped to the exit landmark, this serving as both, spam protection and a chance for the possible player victim to watch the action finish before they're bluespaced away. Also makes the exit landmark use a new contained item retrieval system instead of just making a messy lagpile in the open. The machine also processes down certain things, these icluding foods, organs, and vore eggs, making the thing not be useful as a food vendor for your dear enemies, and popping open vore eggs so that nobody needs to end up blindly guessing mystery contents. Also the machine has a funny little feature to get rid of the unwanted contents as well. (SPOILERS: it's a "Muffin Monster" mode with a twist. The monster is an actual voremob contained within the machine, and if active, the contents will end up in its gut. Deactivating will release the contents back into the machine. Sounds like some sorta Bethesda level brainfart, right? But I did it on purpose for another even funnier feature: Emagging the machine while the mode is active will release the monster as a hostile mob lmao) Not even gonna bother marking as chompedit for now cause it was already all my code and I doubt anyone else up there's gonna be touching the file and might just end up porting it there anyway if I somehow get a charitable urge to provide them with non-critical funfeatures again :v --- .../game/objects/structures/watercloset_vr.dm | 106 +++++++++++++++++- maps/southern_cross/southern_cross-2.dmm | 9 +- 2 files changed, 108 insertions(+), 7 deletions(-) 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