From c1d356fe8bdc7128a0c654dbefd44e8b679837df Mon Sep 17 00:00:00 2001
From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com>
Date: Mon, 1 Apr 2019 12:28:02 +1000
Subject: [PATCH] Added a remains option to digesty vore
---
code/__defines/belly_modes_vr.dm | 6 +-
code/__defines/mobs_vr.dm | 5 +
code/_helpers/global_lists_vr.dm | 21 +++
.../carbon/human/species/station/monkey_vr.dm | 8 +-
code/modules/vore/eating/belly_obj_vr.dm | 2 +-
code/modules/vore/eating/bellymodes_vr.dm | 2 +
code/modules/vore/eating/digest_act_vr.dm | 2 +
code/modules/vore/eating/leave_remains_vr.dm | 156 ++++++++++++++++++
code/modules/vore/eating/living_vr.dm | 4 +
code/modules/vore/eating/vore_vr.dm | 13 +-
code/modules/vore/eating/vorepanel_vr.dm | 19 +++
icons/obj/bones_vr.dmi | Bin 0 -> 700 bytes
vorestation.dme | 1 +
13 files changed, 227 insertions(+), 12 deletions(-)
create mode 100644 code/modules/vore/eating/leave_remains_vr.dm
create mode 100644 icons/obj/bones_vr.dmi
diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm
index cd444abc183..c65a87d6c82 100644
--- a/code/__defines/belly_modes_vr.dm
+++ b/code/__defines/belly_modes_vr.dm
@@ -29,9 +29,9 @@
#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)"
//Addon mode flags
-#define DM_FLAG_NUMBING 0x1
-#define DM_FLAG_STRIPPING 0x2
-//#define DM_FLAG_ITEMWEAK 0x4
+#define DM_FLAG_NUMBING 0x1
+#define DM_FLAG_STRIPPING 0x2
+#define DM_FLAG_LEAVEREMAINS 0x4
//Item related modes
#define IM_HOLD "Hold"
diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm
index 0a2e49d907c..fadd802c84e 100644
--- a/code/__defines/mobs_vr.dm
+++ b/code/__defines/mobs_vr.dm
@@ -30,3 +30,8 @@
#define SPECIES_ZORREN_FLAT "Flatland Zorren"
#define SPECIES_ZORREN_HIGH "Highlander Zorren"
#define SPECIES_CUSTOM "Custom Species"
+
+#define SPECIES_MONKEY_AKULA "Sobaka"
+#define SPECIES_MONKEY_NEVREAN "Sparra"
+#define SPECIES_MONKEY_SERGAL "Saru"
+#define SPECIES_MONKEY_VULPKANIN "Wolpin"
diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index f5b8f8afd88..cf19a476a88 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -394,6 +394,27 @@ var/global/list/contamination_colors = list("green",
"beige",
"pink")
+//For the mechanic of leaving remains. Ones listed below are basically ones that got no bones.
+var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
+ SPECIES_DIONA,
+ SPECIES_ALRAUNE,
+ SPECIES_PROTEAN,
+ SPECIES_MONKEY, //Exclude all monkey subtypes, to prevent abuse of it. They aren't,
+ SPECIES_MONKEY_TAJ, //set to have remains anyway, but making double sure,
+ SPECIES_MONKEY_SKRELL,
+ SPECIES_MONKEY_UNATHI,
+ SPECIES_MONKEY_AKULA,
+ SPECIES_MONKEY_NEVREAN,
+ SPECIES_MONKEY_SERGAL,
+ SPECIES_MONKEY_VULPKANIN,
+ SPECIES_XENO, //Same for xenos,
+ SPECIES_XENO_DRONE,
+ SPECIES_XENO_HUNTER,
+ SPECIES_XENO_SENTINEL,
+ SPECIES_XENO_QUEEN,
+ SPECIES_SHADOW,
+ SPECIES_GOLEM) //Some special species that may or may not be ever used in event too
+
/hook/startup/proc/init_vore_datum_ref_lists()
var/paths
diff --git a/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm b/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm
index f56faa515a0..f8a783b162a 100644
--- a/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm
@@ -1,5 +1,5 @@
/datum/species/monkey/shark
- name = "Sobaka"
+ name = SPECIES_MONKEY_AKULA
name_plural = "Sobaka"
icobase = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
deform = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
@@ -8,7 +8,7 @@
default_language = "Skrellian" //Closest we have.
/datum/species/monkey/sergal
- name = "Saru"
+ name = SPECIES_MONKEY_SERGAL
greater_form = "Sergal"
icobase = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
deform = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
@@ -16,7 +16,7 @@
default_language = LANGUAGE_SAGARU
/datum/species/monkey/sparra
- name = "Sparra"
+ name = SPECIES_MONKEY_NEVREAN
name_plural = "Sparra"
greater_form = "Nevrean"
tail = null
@@ -41,7 +41,7 @@
*/
/datum/species/monkey/vulpkanin
- name = "Wolpin"
+ name = SPECIES_MONKEY_VULPKANIN
name_plural = "Wolpin"
icobase = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index dba128e7e07..6547aacd23f 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -38,7 +38,7 @@
//Actual full digest modes
var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL)
//Digest mode addon flags
- var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING)
+ var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS)
//Transformation modes
var/tmp/static/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG)
//Item related modes
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
index 61b29148289..886ca5830c0 100644
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ b/code/modules/vore/eating/bellymodes_vr.dm
@@ -138,6 +138,8 @@
to_chat(M,"" + digest_alert_prey + "")
play_sound = pick(death_sounds)
+ if((mode_flags & DM_FLAG_LEAVEREMAINS) && M.digest_leave_remains)
+ handle_remains_leaving(M)
digestion_death(M)
owner.update_icons()
if(compensation > 0)
diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm
index 2467f5aaa29..5799d399796 100644
--- a/code/modules/vore/eating/digest_act_vr.dm
+++ b/code/modules/vore/eating/digest_act_vr.dm
@@ -60,6 +60,8 @@
return FALSE //Sorta important to not digest your own beacons.
/obj/item/organ/internal/brain/slime/digest_act(var/atom/movable/item_storage = null)
return FALSE //so prometheans can be recovered
+/obj/item/weapon/digestion_remains/digest_act(var/atom/movable/item_storage = null)
+ return FALSE //Don't digest stuff we intentionally made
/////////////
// Some special treatment
diff --git a/code/modules/vore/eating/leave_remains_vr.dm b/code/modules/vore/eating/leave_remains_vr.dm
new file mode 100644
index 00000000000..79c315ff8e6
--- /dev/null
+++ b/code/modules/vore/eating/leave_remains_vr.dm
@@ -0,0 +1,156 @@
+/obj/belly/proc/handle_remains_leaving(var/mob/living/M)
+
+ if(istype(M,/mob/living/carbon/human)) //Are we even humanoid?
+ var/mob/living/carbon/human/H = M
+
+ if((H.species.name in remainless_species) || H.isSynthetic()) //Don't leave anything if there is nothing to leave
+ return
+
+ else
+ var/bones_amount = rand(2,3) //some random variety in amount of bones left
+
+ if(prob(20)) //ribcage surviving whole is some luck
+ new /obj/item/weapon/digestion_remains/ribcage(src)
+ bones_amount--
+
+ while(bones_amount) //throw in the rest
+ new /obj/item/weapon/digestion_remains(src)
+ bones_amount--
+
+ var/skull_amount = 1
+ switch(H.species.name) //oh boy here we go, finding us a right skull
+ if(SPECIES_HUMAN)
+ new /obj/item/weapon/digestion_remains/skull(src)
+ skull_amount--
+ if(SPECIES_TAJ)
+ new /obj/item/weapon/digestion_remains/skull/tajaran(src)
+ skull_amount--
+ if(SPECIES_UNATHI)
+ new /obj/item/weapon/digestion_remains/skull/unathi(src)
+ skull_amount--
+ if(SPECIES_SKRELL)
+ new /obj/item/weapon/digestion_remains/skull/skrell(src)
+ skull_amount--
+ if(SPECIES_VASILISSAN)
+ new /obj/item/weapon/digestion_remains/skull/vasilissan(src)
+ skull_amount--
+ if(SPECIES_AKULA)
+ new /obj/item/weapon/digestion_remains/skull/akula(src)
+ skull_amount--
+ if(SPECIES_RAPALA)
+ new /obj/item/weapon/digestion_remains/skull/rapala(src)
+ skull_amount--
+ if(SPECIES_VULPKANIN)
+ new /obj/item/weapon/digestion_remains/skull/vulpkanin(src)
+ skull_amount--
+ if(SPECIES_SERGAL)
+ new /obj/item/weapon/digestion_remains/skull/sergal(src)
+ skull_amount--
+ if(SPECIES_ZORREN_FLAT || SPECIES_ZORREN_HIGH)
+ new /obj/item/weapon/digestion_remains/skull/zorren(src)
+ skull_amount--
+ if(SPECIES_NEVREAN)
+ new /obj/item/weapon/digestion_remains/skull/nevrean(src)
+ skull_amount--
+ if(SPECIES_TESHARI)
+ new /obj/item/weapon/digestion_remains/skull/teshari(src)
+ skull_amount--
+ if(SPECIES_VOX)
+ new /obj/item/weapon/digestion_remains/skull/vox(src)
+ skull_amount--
+ if(SPECIES_XENOHYBRID)
+ new /obj/item/weapon/digestion_remains/skull/xenohybrid(src)
+ skull_amount--
+ if(skull_amount && H.species.selects_bodytype) //We still haven't found correct skull...
+ if(H.species.base_species == SPECIES_HUMAN)
+ new /obj/item/weapon/digestion_remains/skull/unknown(src)
+ else
+ new /obj/item/weapon/digestion_remains/skull/unknown/anthro(src)
+ else if(skull_amount) //Something entirely different...
+ new /obj/item/weapon/digestion_remains/skull/unknown(src)
+ else
+ return
+
+/obj/item/weapon/digestion_remains
+ name = "bone"
+ desc = "A bleached bone. It's very non-descript and its hard to tell what species or part of the body it came from."
+ icon = 'icons/obj/bones_vr.dmi'
+ icon_state = "generic"
+ force = 0
+ throwforce = 0
+ item_state = "bone"
+ w_class = ITEMSIZE_SMALL
+
+/obj/item/weapon/digestion_remains/attack_self(mob/user)
+ if(user.a_intent == I_HURT)
+ to_chat(user,"As you squeeze the [name], it crumbles into dust and falls apart into nothing!")
+ qdel(src)
+
+/obj/item/weapon/digestion_remains/ribcage
+ name = "ribcage"
+ desc = "A bleached ribcage. It's very white and definitely has seen better times. Hard to tell what it belonged to."
+ icon_state = "ribcage"
+
+/obj/item/weapon/digestion_remains/skull
+ name = "skull"
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a human."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/tajaran
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a tajara."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/unathi
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to an unathi."
+ icon_state = "skull_unathi"
+
+/obj/item/weapon/digestion_remains/skull/skrell
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a skrell."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/vasilissan
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vasilissan."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/akula
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to an akula."
+ icon_state = "skull_unathi"
+
+/obj/item/weapon/digestion_remains/skull/rapala
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a rapala."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/vulpkanin
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vulpkanin."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/sergal
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a sergal."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/zorren
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a zorren."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/nevrean
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a nevrean."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/teshari
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a teshari."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/vox
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vox."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/unknown
+ desc = "A bleached skull. It looks very weakened. You can't quite tell what species it belonged to."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/unknown/anthro
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/xenohybrid
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to something with prolonged head."
+ icon_state = "skull_xenohybrid"
\ No newline at end of file
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 26c03300a24..036dbf777de 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -1,6 +1,7 @@
///////////////////// Mob Living /////////////////////
/mob/living
var/digestable = 1 // Can the mob be digested inside a belly?
+ var/digest_leave_remains = 0 // Will this mob leave bones/skull/etc after the melty demise?
var/allowmobvore = 1 // Will simplemobs attempt to eat the mob?
var/showvoreprefs = 1 // Determines if the mechanical vore preferences button will be displayed on the mob or not.
var/obj/belly/vore_selected // Default to no vore capability.
@@ -195,6 +196,7 @@
var/datum/vore_preferences/P = client.prefs_vr
P.digestable = src.digestable
+ P.digest_leave_remains = src.digest_leave_remains
P.allowmobvore = src.allowmobvore
P.vore_taste = src.vore_taste
P.can_be_drop_prey = src.can_be_drop_prey
@@ -220,6 +222,7 @@
var/datum/vore_preferences/P = client.prefs_vr
digestable = P.digestable
+ digest_leave_remains = P.digest_leave_remains
allowmobvore = P.allowmobvore
vore_taste = P.vore_taste
can_be_drop_prey = P.can_be_drop_prey
@@ -664,6 +667,7 @@
CRASH("display_voreprefs() was called without an associated user.")
var/dispvoreprefs = "[src]'s vore preferences
"
dispvoreprefs += "Digestable: [digestable ? "Enabled" : "Disabled"]
"
+ dispvoreprefs += "Leaves Remains: [digest_leave_remains ? "Enabled" : "Disabled"]
"
dispvoreprefs += "Mob Vore: [allowmobvore ? "Enabled" : "Disabled"]
"
dispvoreprefs += "Drop-nom prey: [can_be_drop_prey ? "Enabled" : "Disabled"]
"
dispvoreprefs += "Drop-nom pred: [can_be_drop_pred ? "Enabled" : "Disabled"]
"
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index a3b5fec4a5c..f89462f23c6 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -42,6 +42,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
/datum/vore_preferences
//Actual preferences
var/digestable = TRUE
+ var/digest_leave_remains = FALSE
var/allowmobvore = TRUE
var/list/belly_prefs = list()
var/vore_taste = "nothing in particular"
@@ -92,9 +93,9 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
return 0 //Need to know what character to load!
slot = client.prefs.default_slot
-
+
load_path(client_ckey,slot)
-
+
if(!path) return 0 //Path couldn't be set?
if(!fexists(path)) //Never saved before
save_vore() //Make the file first
@@ -108,6 +109,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
json_from_file = patch_version(json_from_file,version)
digestable = json_from_file["digestable"]
+ digest_leave_remains = json_from_file["digest_leave_remains"]
allowmobvore = json_from_file["allowmobvore"]
vore_taste = json_from_file["vore_taste"]
can_be_drop_prey = json_from_file["can_be_drop_prey"]
@@ -117,6 +119,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
//Quick sanitize
if(isnull(digestable))
digestable = TRUE
+ if(isnull(digest_leave_remains))
+ digest_leave_remains = FALSE
if(isnull(allowmobvore))
allowmobvore = TRUE
if(isnull(can_be_drop_prey))
@@ -130,11 +134,12 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
/datum/vore_preferences/proc/save_vore()
if(!path) return 0
-
+
var/version = 1 //For "good times" use in the future
var/list/settings_list = list(
"version" = version,
"digestable" = digestable,
+ "digest_leave_remains" = digest_leave_remains,
"allowmobvore" = allowmobvore,
"vore_taste" = vore_taste,
"can_be_drop_prey" = can_be_drop_prey,
@@ -147,7 +152,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
if(!json_to_file)
log_debug("Saving: [path] failed jsonencode")
return 0
-
+
//Write it out
#ifdef RUST_G
call(RUST_G, "file_write")(json_to_file, path)
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index 1f97cc338b6..7de18033abb 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -298,6 +298,12 @@
if(0)
dat += "Toggle Digestable"
+ switch(user.digest_leave_remains)
+ if(1)
+ dat += "Toggle Leaving Remains"
+ if(0)
+ dat += "Toggle Leaving Remains"
+
switch(user.allowmobvore)
if(1)
dat += "Toggle Mob Vore"
@@ -837,6 +843,19 @@
if(user.client.prefs_vr)
user.client.prefs_vr.digestable = user.digestable
+ if(href_list["toggledlm"])
+ var/choice = alert(user, "This button allows preds to have your remains be left in their belly after you are digested. This will only happen if pred sets their belly to do so. Remains consist of skeletal parts. Currently you are [user.digest_leave_remains? "" : "not"] leaving remains.", "", "Allow Post-digestion Remains", "Cancel", "Disallow Post-digestion Remains")
+ switch(choice)
+ if("Cancel")
+ return 0
+ if("Allow Post-digestion Remains")
+ user.digest_leave_remains = TRUE
+ if("Disallow Post-digestion Remains")
+ user.digest_leave_remains = FALSE
+
+ if(user.client.prefs_vr)
+ user.client.prefs_vr.digest_leave_remains = user.digest_leave_remains
+
if(href_list["togglemv"])
var/choice = alert(user, "This button is for those who don't like being eaten by mobs. Messages admins when changed, so don't try to use it for mechanical benefit. Set it once and save it. Mobs are currently: [user.allowmobvore ? "Allowed to eat" : "Prevented from eating"] you.", "", "Allow Mob Predation", "Cancel", "Prevent Mob Predation")
switch(choice)
diff --git a/icons/obj/bones_vr.dmi b/icons/obj/bones_vr.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..ad384a69073ddd4c0d69c1863df3ec42d6f96abc
GIT binary patch
literal 700
zcmV;t0z>_YP)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM
z;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+JvA@2C^K1!i!&v&s2C_>$i#mdB2|{=C6;7l5~;W%H7`G-GN~vt1(yb81y?^8
zaBu+tSwLEtAW86(0004-NkldWZ
zW;fcfs0)S3jg~HMs4Q-!xUsu1`(uPb`0f%)8r|%h?z`{3``+E~4j{rW5DP1yG#o!q
z%OUwyr5J)A10Fvq9b%ng0lDC{N-+Pp(c1D$99TPBL)~Og<`cd9vs9`TQfcO@klnQn
z>rQg5Z_ft;9Ika9XS;UFvWAkO=5DQ0!Wkt+1v#3z)4c-#I_sK4o}dYfkuL~X6IW`3
zF;XGu3~eyB_7B)d>cEjB$k=mNxPcB5C{-!0r@d!fb_GWpT-_={?fdUCMG}x|FhNEK
z^5Fz3RSuH`v|Aws5h6tRGdRwZxRE;wXBl8+UQTw4`R8m3lE3us(i`LuwXP8dEU0N=R?moC#YXv3-B+i*|yQ^@B9tt
zmN|Birvy9Ku_fPe92Y%{(Vuy~gWu_kaU8yLO~VEuvq-xRo&envl->4_6HQW+GSs
inKx-eJs^ni&+rY6t6LUd)`c(t0000