diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 678486f019..1b5698ba5e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,8 +4,9 @@ # In the event that multiple org members are to be informed of changes # to the same file or dir, add them to the end under Multiple Owners -# ShadowLarkens -/code/__DEFINES/tgui.dm @ShadowLarkens -/code/controllers/subsystem/tgui.dm @ShadowLarkens -/code/modules/tgui @ShadowLarkens -/tgui @ShadowLarkens \ No newline at end of file +# ItsSelis + +/code/__DEFINES/tgui.dm @ItsSelis +/code/controllers/subsystem/tgui.dm @ItsSelis +/code/modules/tgui @ItsSelis +/tgui @ItsSelis diff --git a/code/__defines/cooldowns.dm b/code/__defines/cooldowns.dm new file mode 100644 index 0000000000..c3855d7ab3 --- /dev/null +++ b/code/__defines/cooldowns.dm @@ -0,0 +1,15 @@ +/* + * Cooldown system based on storing world.time on a variable, plus the cooldown time. + * Better performance over timer cooldowns, lower control. Same functionality. +*/ + +#define COOLDOWN_DECLARE(cd_index) var/##cd_index = 0 + +#define COOLDOWN_START(cd_source, cd_index, cd_time) (cd_source.cd_index = world.time + (cd_time)) + +//Returns true if the cooldown has run its course, false otherwise +#define COOLDOWN_FINISHED(cd_source, cd_index) (cd_source.cd_index < world.time) + +#define COOLDOWN_RESET(cd_source, cd_index) cd_source.cd_index = 0 + +#define COOLDOWN_TIMELEFT(cd_source, cd_index) (max(0, cd_source.cd_index - world.time)) \ No newline at end of file diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index d9a5f7a847..df7a90632c 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -447,3 +447,7 @@ #define DEATHGASP_NO_MESSAGE "no message" #define RESIST_COOLDOWN 2 SECONDS + +#define VISIBLE_GENDER_FORCE_PLURAL 1 // Used by get_visible_gender to return PLURAL +#define VISIBLE_GENDER_FORCE_IDENTIFYING 2 // Used by get_visible_gender to return the mob's identifying gender +#define VISIBLE_GENDER_FORCE_BIOLOGICAL 3 // Used by get_visible_gender to return the mob's biological gender diff --git a/code/__defines/tgui.dm b/code/__defines/tgui.dm index c261e5ecdc..1215382ce7 100644 --- a/code/__defines/tgui.dm +++ b/code/__defines/tgui.dm @@ -5,6 +5,8 @@ /// Maximum ping timeout allowed to detect zombie windows #define TGUI_PING_TIMEOUT 4 SECONDS +/// Used for rate-limiting to prevent DoS by excessively refreshing a TGUI window +#define TGUI_REFRESH_FULL_UPDATE_COOLDOWN 5 SECONDS /// Window does not exist #define TGUI_WINDOW_CLOSED 0 diff --git a/code/datums/supplypacks/materials.dm b/code/datums/supplypacks/materials.dm index 5e181d8af8..45951c516d 100644 --- a/code/datums/supplypacks/materials.dm +++ b/code/datums/supplypacks/materials.dm @@ -66,17 +66,18 @@ /obj/fiftyspawner/tealcarpet ) -/datum/supply_pack/materials/arcade_carpet - name = "Retro carpets" +/datum/supply_pack/materials/retrocarpet + name = "Retro carpet" containertype = /obj/structure/closet/crate/grayson - containername = "Retro carpets crate" + containername = "Retro carpet crate" cost = 15 contains = list( - /obj/fiftyspawner/decocarpet, - /obj/fiftyspawner/retrocarpet + /obj/fiftyspawner/geocarpet, + /obj/fiftyspawner/retrocarpet, + /obj/fiftyspawner/retrocarpet_red ) -/datum/supply_pack/misc/linoleum +/datum/supply_pack/materials/linoleum name = "Linoleum" containertype = /obj/structure/closet/crate/grayson containername = "Linoleum crate" diff --git a/code/datums/supplypacks/supply.dm b/code/datums/supplypacks/supply.dm index eff6fb84fd..70f8386a91 100644 --- a/code/datums/supplypacks/supply.dm +++ b/code/datums/supplypacks/supply.dm @@ -9,18 +9,30 @@ /datum/supply_pack/supply/food name = "Kitchen supply crate" contains = list( - /obj/item/weapon/reagent_containers/food/condiment/flour = 6, + /obj/item/weapon/reagent_containers/food/condiment/carton/flour = 6, /obj/item/weapon/reagent_containers/food/drinks/milk = 3, /obj/item/weapon/reagent_containers/food/drinks/soymilk = 2, /obj/item/weapon/storage/fancy/egg_box = 2, /obj/item/weapon/reagent_containers/food/snacks/tofu = 4, /obj/item/weapon/reagent_containers/food/snacks/meat = 4, - /obj/item/weapon/reagent_containers/food/condiment/yeast = 3 + /obj/item/weapon/reagent_containers/food/condiment/yeast = 3, + /obj/item/weapon/reagent_containers/food/condiment/sprinkles = 1 ) cost = 10 containertype = /obj/structure/closet/crate/freezer/centauri containername = "Food crate" +/datum/supply_pack/supply/fancyfood + name = "Artisanal food delivery" + contains = list( + /obj/item/weapon/reagent_containers/food/condiment/carton/flour/rustic = 6, + /obj/item/weapon/reagent_containers/food/condiment/carton/sugar/rustic = 6 + ) + cost = 25 + containertype = /obj/structure/closet/crate/freezer/centauri + containername = "Artisanal food crate" + + /datum/supply_pack/supply/toner name = "Toner cartridges" contains = list(/obj/item/device/toner = 6) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d56186f5b0..5ef2fd6818 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -27,7 +27,7 @@ // Overlays ///Our local copy of (non-priority) overlays without byond magic. Use procs in SSoverlays to manipulate - var/list/our_overlays + var/list/our_overlays ///Overlays that should remain on top and not normally removed when using cut_overlay functions, like c4. var/list/priority_overlays ///vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays @@ -35,7 +35,7 @@ ///Our local copy of filter data so we can add/remove it var/list/filter_data - + //Detective Work, used for the duplicate data points kept in the scanners var/list/original_atom // Track if we are already had initialize() called to prevent double-initialization. @@ -681,7 +681,7 @@ if(!isnull(.)) datum_flags |= DF_VAR_EDITED return - + . = ..() /atom/proc/atom_say(message) @@ -716,7 +716,7 @@ . = ..() SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, new_loc) -/atom/proc/get_visible_gender() +/atom/proc/get_visible_gender(mob/user, force) return gender /atom/proc/interact(mob/user) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 4a40ad8ed2..eab08e2e43 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -447,7 +447,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) return TRUE if("set_new_message") - msg = sanitize(tgui_input_message(usr, "Write your Feed story", "Network Channel Handler")) + msg = sanitize(tgui_input_text(usr, "Write your Feed story", "Network Channel Handler", multiline = TRUE)) return TRUE if("set_new_title") diff --git a/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm b/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm index a4a2f7739b..134fb9baf9 100644 --- a/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm +++ b/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm @@ -28,14 +28,18 @@ name = "stack of teal carpet" type_to_spawn = /obj/item/stack/tile/carpet/teal -/obj/fiftyspawner/decocarpet - name = "stack of deco carpet" - type_to_spawn = /obj/item/stack/tile/carpet/deco +/obj/fiftyspawner/geocarpet + name = "stack of geometric carpet" + type_to_spawn = /obj/item/stack/tile/carpet/geo /obj/fiftyspawner/retrocarpet - name = "stack of retro carpet" + name = "stack of blue retro carpet" type_to_spawn = /obj/item/stack/tile/carpet/retro +/obj/fiftyspawner/retrocarpet_red + name = "stack of red retro carpet" + type_to_spawn = /obj/item/stack/tile/carpet/retro_red + /obj/fiftyspawner/floor name = "stack of floor tiles" type_to_spawn = /obj/item/stack/tile/floor diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 286f368740..cabc1429f8 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -85,6 +85,26 @@ desc = "An easy to fit wooden floor tile. It's blue!" icon_state = "tile-sifwood" +/obj/item/stack/tile/wood/alt + name = "wood floor tile" + singular_name = "wood floor tile" + icon_state = "tile-wood_tile" + +/obj/item/stack/tile/wood/parquet + name = "parquet wood floor tile" + singular_name = "parquet wood floor tile" + icon_state = "tile-wood_parquet" + +/obj/item/stack/tile/wood/panel + name = "large wood floor tile" + singular_name = "large wood floor tile" + icon_state = "tile-wood_large" + +/obj/item/stack/tile/wood/tile + name = "tiled wood floor tile" + singular_name = "tiled wood floor tile" + icon_state = "tile-wood_tile" + /obj/item/stack/tile/wood/cyborg name = "wood floor tile synthesizer" desc = "A device that makes wood floor tiles." @@ -117,8 +137,19 @@ icon_state = "tile-tealcarpet" no_variants = FALSE -/obj/item/stack/tile/carpet/bcarpet //YW EDIT: Commented out to help with upstream merging. Get on this you fucking virgo bois. -yw //CHOMP Comment: Yawn commented out this block, but CHOMP already commented out this stuff so I just removed theirs. +/obj/item/stack/tile/carpet/geo + icon_state = "tile-carpet-deco" + desc = "A piece of carpet with a gnarly geometric design. It is the same size as a normal floor tile!" +/obj/item/stack/tile/carpet/retro + icon_state = "tile-carpet-retro" + desc = "A piece of carpet with totally wicked blue space patterns. It is the same size as a normal floor tile!" + +/obj/item/stack/tile/carpet/retro_red + icon_state = "tile-carpet-retro-red" + desc = "A piece of carpet with red-ical space patterns. It is the same size as a normal floor tile!" + +/obj/item/stack/tile/carpet/bcarpet //YW EDIT: Commented out to help with upstream merging. Get on this you fucking virgo bois. -yw //CHOMP Comment: Yawn commented out this block, but CHOMP already commented out this stuff so I just removed theirs. icon_state = "tile-carpet" /obj/item/stack/tile/carpet/blucarpet icon_state = "tile-carpet" @@ -133,10 +164,6 @@ /obj/item/stack/tile/carpet/oracarpet icon_state = "tile-carpet" */ -/obj/item/stack/tile/carpet/deco - icon_state = "tile-carpet-deco" -/obj/item/stack/tile/carpet/retro - icon_state = "tile-carpet-retro" /obj/item/stack/tile/floor name = "floor tile" diff --git a/code/game/objects/items/stacks/tiles/tile_types_ch.dm b/code/game/objects/items/stacks/tiles/tile_types_ch.dm index 06afcec73b..348423536d 100644 --- a/code/game/objects/items/stacks/tiles/tile_types_ch.dm +++ b/code/game/objects/items/stacks/tiles/tile_types_ch.dm @@ -101,4 +101,16 @@ singular_name = "orange carpet" desc = "A piece of orange carpet. It is the same size as a normal floor tile!" icon_state = "tile-carpet" - default_type = MAT_CARPET_ORANGE \ No newline at end of file + default_type = MAT_CARPET_ORANGE + +/obj/item/stack/tile/carpet/geo + icon_state = "tile-carpet-deco" + desc = "A piece of carpet with a gnarly geometric design. It is the same size as a normal floor tile!" + +/obj/item/stack/tile/carpet/retro + icon_state = "tile-carpet-retro" + desc = "A piece of carpet with totally wicked blue space patterns. It is the same size as a normal floor tile!" + +/obj/item/stack/tile/carpet/retro_red + icon_state = "tile-carpet-retro-red" + desc = "A piece of carpet with red-ical space patterns. It is the same size as a normal floor tile!" diff --git a/code/game/objects/items/surplus_voucher_ch.dm b/code/game/objects/items/surplus_voucher_ch.dm index 818bda9bbc..1b7fde05fd 100644 --- a/code/game/objects/items/surplus_voucher_ch.dm +++ b/code/game/objects/items/surplus_voucher_ch.dm @@ -161,7 +161,7 @@ /obj/item/surplus_voucher/ser/proc/spawn_item(var/turf/T) var/path = pick(prob(4);/obj/item/weapon/reagent_containers/food/drinks/milk, - prob(4);/obj/item/weapon/reagent_containers/food/condiment/flour, + prob(4);/obj/item/weapon/reagent_containers/food/condiment/carton/flour, prob(4);/obj/item/weapon/reagent_containers/food/drinks/soymilk, prob(4);/obj/item/weapon/storage/fancy/egg_box, prob(3);/obj/item/weapon/reagent_containers/food/snacks/meat, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index 63a5613c88..66695f3511 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -3,8 +3,10 @@ req_access = list(access_kitchen) starts_with = list( - /obj/item/weapon/reagent_containers/food/condiment/flour = 7, - /obj/item/weapon/reagent_containers/food/condiment/sugar = 2, + /obj/item/weapon/reagent_containers/food/condiment/carton/flour = 6, + /obj/item/weapon/reagent_containers/food/condiment/carton/sugar = 1, + /obj/item/weapon/reagent_containers/food/condiment/carton/flour/rustic = 1, + /obj/item/weapon/reagent_containers/food/condiment/carton/sugar/rustic = 1, /obj/item/weapon/reagent_containers/food/condiment/spacespice = 2 ) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 45cb599429..330c4e4046 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -90,7 +90,9 @@ src.set_dir(turn(src.dir, 90)) /obj/structure/closet/crate/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(opened) + if(W.is_wrench() && istype(src,/obj/structure/closet/crate/bin)) + return ..() + else if(opened) if(isrobot(user)) return if(W.loc != user) // This should stop mounted modules ending up outside the module. diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 760c111466..b18feb7f88 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -3,7 +3,7 @@ icon_state = "girder" anchored = TRUE density = TRUE - plane = PLATING_PLANE + layer = TABLE_LAYER //CHOMPEdit - moved so that they render above catwalks. w_class = ITEMSIZE_HUGE var/state = 0 var/health = 200 diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm index ec821278a8..03fe809961 100644 --- a/code/game/turfs/flooring/flooring.dm +++ b/code/game/turfs/flooring/flooring.dm @@ -332,18 +332,24 @@ var/list/flooring_types icon_base = "tealcarpet" build_type = /obj/item/stack/tile/carpet/teal -/decl/flooring/carpet/deco - name = "deco carpet" - icon_base = "decocarpet" - build_type = /obj/item/stack/tile/carpet/deco +/decl/flooring/carpet/geo + name = "geometric carpet" + icon_base = "geocarpet" + build_type = /obj/item/stack/tile/carpet/geo flags = TURF_REMOVE_CROWBAR | TURF_CAN_BURN /decl/flooring/carpet/retro - name = "retro carpet" + name = "blue retro carpet" icon_base = "retrocarpet" build_type = /obj/item/stack/tile/carpet/retro flags = TURF_REMOVE_CROWBAR | TURF_CAN_BURN +/decl/flooring/carpet/retro_red + name = "red retro carpet" + icon_base = "retrocarpet_red" + build_type = /obj/item/stack/tile/carpet/retro_red + flags = TURF_REMOVE_CROWBAR | TURF_CAN_BURN + /decl/flooring/tiling name = "floor" desc = "Scuffed from the passage of countless greyshirts." @@ -507,6 +513,31 @@ var/list/flooring_types icon_base = "sifwood" build_type = /obj/item/stack/tile/wood/sif +/decl/flooring/wood/alt + icon = 'icons/turf/flooring/wood.dmi' + icon_base = "wood" + build_type = /obj/item/stack/tile/wood/alt + +/decl/flooring/wood/alt/panel + desc = "Polished wooden panels." + icon = 'icons/turf/flooring/wood.dmi' + icon_base = "wood_panel" + has_damage_range = 2 + build_type = /obj/item/stack/tile/wood/panel + +/decl/flooring/wood/alt/parquet + desc = "Polished wooden tiles." + icon = 'icons/turf/flooring/wood.dmi' + icon_base = "wood_parquet" + build_type = /obj/item/stack/tile/wood/parquet + +/decl/flooring/wood/alt/tile + desc = "Polished wooden tiles." + icon = 'icons/turf/flooring/wood.dmi' + icon_base = "wood_tile" + has_damage_range = 2 + build_type = /obj/item/stack/tile/wood/tile + /decl/flooring/reinforced name = "reinforced floor" desc = "Heavily reinforced with steel rods." diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index 685f2ee374..a6e6d7b4b7 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -19,10 +19,10 @@ icon_state = "tealcarpet" initial_flooring = /decl/flooring/carpet/tealcarpet -/turf/simulated/floor/carpet/deco +/turf/simulated/floor/carpet/geo name = "deco carpet" icon_state = "decocarpet" - initial_flooring = /decl/flooring/carpet/deco + initial_flooring = /decl/flooring/carpet/geo /turf/simulated/floor/carpet/retro name = "retro carpet" @@ -60,6 +60,21 @@ icon_state = "oracarpet" initial_flooring = /decl/flooring/carpet/oracarpet +/turf/simulated/floor/carpet/geo + name = "geometric carpet" + icon_state = "geocarpet" + initial_flooring = /decl/flooring/carpet/geo + +/turf/simulated/floor/carpet/retro + name = "blue retro carpet" + icon_state = "retrocarpet" + initial_flooring = /decl/flooring/carpet/retro + +/turf/simulated/floor/carpet/retro_red + name = "red retro carpet" + icon_state = "retrocarpet_red" + initial_flooring = /decl/flooring/carpet/retro_red + /turf/simulated/floor/bluegrid name = "mainframe floor" icon = 'icons/turf/flooring/circuit.dmi' @@ -79,24 +94,67 @@ initial_flooring = /decl/flooring/wood /turf/simulated/floor/wood/broken - icon_state = "wood_broken0" // This gets changed when spawned. + icon_state = "wood-broken0" // This gets changed when spawned. -/turf/simulated/floor/wood/broken/Initialize() +/turf/simulated/floor/wood/broken/LateInitialize() + . = ..() break_tile() - return ..() /turf/simulated/floor/wood/sif name = "alien wooden floor" - icon = 'icons/turf/flooring/wood.dmi' icon_state = "sifwood" initial_flooring = /decl/flooring/wood/sif /turf/simulated/floor/wood/sif/broken - icon_state = "sifwood_broken0" // This gets changed when spawned. + icon_state = "sifwood-broken0" // This gets changed when spawned. -/turf/simulated/floor/wood/sif/broken/Initialize() +/turf/simulated/floor/wood/sif/broken/LateInitialize() + . = ..() + break_tile() + +/turf/simulated/floor/wood/alt + icon = 'icons/turf/flooring/wood.dmi' + initial_flooring = /decl/flooring/wood/alt + +/turf/simulated/floor/wood/alt/broken + icon_state = "wood-broken0" // This gets changed when spawned. + +/turf/simulated/floor/wood/alt/broken/LateInitialize() + . = ..() + break_tile() + +/turf/simulated/floor/wood/alt/tile + icon_state = "wood_tile" + initial_flooring = /decl/flooring/wood/alt/tile + +/turf/simulated/floor/wood/alt/tile/broken + icon_state = "wood_tile-broken0" // This gets changed when spawned. + +/turf/simulated/floor/wood/alt/tile/broken/LateInitialize() + . = ..() + break_tile() + +/turf/simulated/floor/wood/alt/panel + icon_state = "wood_panel" + initial_flooring = /decl/flooring/wood/alt/panel + +/turf/simulated/floor/wood/alt/panel/broken + icon_state = "wood_panel-broken0" // This gets changed when spawned. + +/turf/simulated/floor/wood/alt/panel/broken/LateInitialize() + . = ..() + break_tile() + +/turf/simulated/floor/wood/alt/parquet + icon_state = "wood_parquet" + initial_flooring = /decl/flooring/wood/alt/parquet + +/turf/simulated/floor/wood/alt/parquet/broken + icon_state = "wood_parquet-broken0" // This gets changed when spawned. + +/turf/simulated/floor/wood/alt/parquet/broken/LateInitialize() + . = ..() break_tile() - return ..() /turf/simulated/floor/grass name = "grass patch" diff --git a/code/game/turfs/simulated/floor_icon.dm b/code/game/turfs/simulated/floor_icon.dm index 420d8628b5..82153557a8 100644 --- a/code/game/turfs/simulated/floor_icon.dm +++ b/code/game/turfs/simulated/floor_icon.dm @@ -75,7 +75,10 @@ var/image/no_ceiling_image = null icon_state = "dmg[rand(1,4)]" else if(flooring) if(!isnull(broken) && (flooring.flags & TURF_CAN_BREAK)) - add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-broken-[broken]","broken[broken]")) + if(istype(src, /turf/simulated/floor/wood)) + add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-broken-[broken]","[flooring.icon_base]-broken[broken]")) + else + add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-broken-[broken]","broken[broken]")) if(!isnull(burnt) && (flooring.flags & TURF_CAN_BURN)) add_overlay(flooring.get_flooring_overlay("[flooring.icon_base]-burned-[burnt]","burned[burnt]")) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 08a3a99880..bb88d9d7fb 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -218,7 +218,6 @@ var/global/floorIsLava = 0 /datum/player_info/var/content // text content of the information /datum/player_info/var/timestamp // Because this is bloody annoying -#define PLAYER_NOTES_ENTRIES_PER_PAGE 50 /datum/admins/proc/PlayerNotes() set category = "Admin" set name = "Player Notes" @@ -235,56 +234,20 @@ var/global/floorIsLava = 0 if (!istype(src,/datum/admins)) to_chat(usr, "Error: you are not an admin!") return - var/filter = input(usr, "Filter string (case-insensitive regex)", "Player notes filter") as text|null + var/filter = tgui_input_text(usr, "Filter string (case-insensitive regex)", "Player notes filter") PlayerNotesPage(1, filter) /datum/admins/proc/PlayerNotesPage(page, filter) - var/dat = "Player notes - Apply Filter
| No keys found. |
| [t] |