diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 16a2426569e..def6c6e4c11 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -92,7 +92,8 @@ /atom/proc/emp_act(var/severity) return -/atom/proc/bullet_act(var/obj/item/projectile/Proj) +/atom/proc/bullet_act(var/obj/item/projectile/Proj, def_zone) + Proj.on_hit(src, 0, def_zone) return 0 /atom/proc/in_contents_of(container)//can take class or object instance as argument diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index b0e04695ef0..624453380d3 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -423,20 +423,20 @@ var/reagent_id = null if(emagged == 2) //Emagged! Time to poison everybody. - reagent_id = "toxin" - - if(treat_virus) - var/virus = 0 - if(C:virus2.len) - for (var/ID in C.virus2) - if (ID in virusDB) // If the virus is known, the medbot is aware of it and will try to cure it - virus = 1 - - if (!reagent_id && (virus)) - if(!C.reagents.has_reagent(treatment_virus)) - reagent_id = treatment_virus + reagent_id = "toxin" else + if(treat_virus) + var/virus = 0 + if(C:virus2.len) + for (var/ID in C.virus2) + if (ID in virusDB) // If the virus is known, the medbot is aware of it and will try to cure it + virus = 1 + + if (!reagent_id && (virus)) + if(!C.reagents.has_reagent(treatment_virus)) + reagent_id = treatment_virus + if (!reagent_id && (C.getBruteLoss() >= heal_threshold)) if(!C.reagents.has_reagent(treatment_brute)) reagent_id = treatment_brute diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index 7bfab1eddec..dbaa9686fb1 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -190,6 +190,13 @@ targeting_active = 1 target() targeting_active = 0 + + if(prob(15)) + if(prob(50)) + playsound(get_turf(src), 'sound/effects/turret/move1.wav', 60, 1) + else + playsound(get_turf(src), 'sound/effects/turret/move2.wav', 60, 1) + else if(!isPopping())//else, pop down if(!isDown()) popDown() @@ -229,6 +236,10 @@ else A = new /obj/item/projectile/energy/electrode( loc ) use_power(200) + if(src.lasers) + playsound(get_turf(src), 'sound/weapons/Laser.ogg', 60, 1) + else + playsound(get_turf(src), 'sound/weapons/Taser.ogg', 60, 1) A.current = T A.yo = U.y - T.y A.xo = U.x - T.x @@ -244,6 +255,7 @@ if ((!isPopping()) || src.popping==-1) invisibility = 0 popping = 1 + playsound(get_turf(src), 'sound/effects/turret/open.wav', 60, 1) if (src.cover!=null) flick("popup", src.cover) src.cover.icon_state = "openTurretCover" @@ -253,6 +265,7 @@ /obj/machinery/turret/proc/popDown() if ((!isPopping()) || src.popping==1) popping = -1 + playsound(get_turf(src), 'sound/effects/turret/open.wav', 60, 1) if (src.cover!=null) flick("popdown", src.cover) src.cover.icon_state = "turretCover" @@ -272,7 +285,7 @@ /obj/machinery/turret/attackby(obj/item/weapon/W, mob/user)//I can't believe no one added this before/N ..() - playsound(src.loc, 'sound/weapons/smash.ogg', 60, 1) + playsound(get_turf(src), 'sound/weapons/smash.ogg', 60, 1) src.spark_system.start() src.health -= W.force * 0.5 if (src.health <= 0) @@ -422,7 +435,7 @@ /obj/machinery/turret/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if(!(stat & BROKEN)) - playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1) + playsound(get_turf(src), 'sound/weapons/slash.ogg', 25, 1, -1) visible_message("\red [] has slashed at []!", M, src) src.health -= 15 if (src.health <= 0) @@ -609,7 +622,7 @@ return if (targloc == curloc) return - playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1) + playsound(get_turf(src), 'sound/weapons/Gunshot.ogg', 60, 1) var/obj/item/projectile/A = new /obj/item/projectile/bullet(curloc) A.current = curloc A.yo = targloc.y - curloc.y diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index e92a2f2cb3b..3f30f0c03e7 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -4,7 +4,7 @@ icon_state = "intercom" anchored = 1 w_class = 4.0 - canhear_range = 2 + canhear_range = 5 flags = FPRINT | CONDUCT | TABLEPASS | NOBLOODY var/number = 0 var/anyai = 1 diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 4838c848339..a72e1a7239e 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -487,12 +487,6 @@ if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M H.updatehealth() - if(istype(M,/mob/living/carbon/human/machine) && M.stat == 0) // If an IPC is brought back to life by welding it, which is possible, update the mob list - if(M in dead_mob_list) - dead_mob_list -= M - respawnable_list -= M - living_mob_list += M - mob_list += M return else user << "\red You need more welding fuel to complete this task." diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 2de850b7412..5308a6f449c 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -18,8 +18,11 @@ if (!H.amputated) if ((health >= (config.health_threshold_dead/100*75)) && stat == DEAD) //need to get them 25% away from death point before reviving them dead_mob_list -= src + respawnable_list -= src living_mob_list += src + mob_list += src stat = CONSCIOUS + ear_deaf = 0 return /mob/living/carbon/human/getBrainLoss() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 3353b07b6dd..50282c53026 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1292,7 +1292,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc see_invisible = SEE_INVISIBLE_LIVING seer = 0 + var/tmp/has_ninja_mask = 0 if(istype(wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)) + has_ninja_mask = 1 var/obj/item/clothing/mask/gas/voice/space_ninja/O = wear_mask switch(O.mode) if(0) @@ -1305,7 +1307,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(!druggy) see_invisible = SEE_INVISIBLE_LIVING if(1) see_in_dark = 5 - if(!druggy) see_invisible = SEE_INVISIBLE_LIVING + if(!druggy) see_invisible = SEE_INVISIBLE_MINIMUM if(2) sight |= SEE_MOBS if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO @@ -1340,7 +1342,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc see_invisible = SEE_INVISIBLE_LIVING if(istype(O,/obj/item/clothing/glasses/hud/security/night) || istype(O,/obj/item/clothing/glasses/hud/health/night)) see_invisible = SEE_INVISIBLE_MINIMUM - else if(!seer) + else if(!seer && !has_ninja_mask) see_in_dark = species.darksight see_invisible = SEE_INVISIBLE_LIVING diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 1223913f0ce..c688127ad2b 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -633,12 +633,6 @@ obj/structure/cable/proc/cableColor(var/colorC) if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M H.updatehealth() - if(istype(M,/mob/living/carbon/human/machine) && M.stat == 0) // If an IPC is brought back to life by welding it, which is possible, update the mob list - if(M in dead_mob_list) - dead_mob_list -= M - respawnable_list -= M - living_mob_list += M - mob_list += M return else user << "Nothing to fix!" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 9602f89303b..50933941c0a 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -51,6 +51,7 @@ var/drowsy = 0 var/agony = 0 var/embed = 0 // whether or not the projectile can embed itself in the mob + var/forcedodge = 0 proc/delete() @@ -82,9 +83,8 @@ loc = A.loc return 0 //cannot shoot yourself - if(bumped) return 0 - var/forcedodge = 0 // force the projectile to pass - + if(bumped) + return 1 bumped = 1 if(firer && istype(A, /mob)) var/mob/M = A @@ -137,9 +137,8 @@ spawn(0) if(A) - if(!forcedodge) - forcedodge = A.bullet_act(src, def_zone) // searches for return value - if(forcedodge == -1) // the bullet passes through a dense object! + var/permutation = A.bullet_act(src, def_zone) // searches for return value, could be deleted after run so check A isn't null + if(permutation == -1 || forcedodge)// the bullet passes through a dense object! bumped = 0 // reset bumped variable! if(istype(A, /turf)) loc = A diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index b83ab6ee73f..639358f0246 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -42,6 +42,7 @@ icon_state = "xray" damage = 15 irradiate = 30 + forcedodge = 1 /obj/item/projectile/beam/pulse name = "pulse" diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm index 423bdb829ac..4e28afc4eba 100644 --- a/maps/cyberiad.dmm +++ b/maps/cyberiad.dmm @@ -2245,7 +2245,7 @@ "aRi" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aRj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/camera{c_tag = "EVA South"; dir = 1; network = list("SS13")},/turf/simulated/floor,/area/ai_monitored/storage/eva) "aRk" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aRl" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aRl" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aRm" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/flora/kirbyplants,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/hallway/primary/central/north) "aRn" = (/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Central Hallway North"; dir = 2; network = list("SS13")},/obj/machinery/alarm{pixel_y = 23},/obj/item/flag/nt,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central/north) "aRo" = (/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central/north) @@ -2587,7 +2587,7 @@ "aXM" = (/obj/machinery/vending/hydroseeds,/obj/machinery/camera{c_tag = "Hydroponics North"; network = list("SS13")},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "aXN" = (/obj/machinery/biogenerator,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "aXO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/requests_console{department = "Hydroponics"; departmentType = 2; pixel_x = 0; pixel_y = 30},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) -"aXP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/wood,/area/crew_quarters/captain) +"aXP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light_switch{pixel_y = 24},/turf/simulated/floor/wood,/area/crew_quarters/captain) "aXQ" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar) "aXR" = (/obj/structure/bookcase{name = "bookcase (Religious)"},/turf/simulated/floor/wood,/area/library) "aXS" = (/turf/simulated/floor/carpet,/area/library) @@ -2597,7 +2597,7 @@ "aXW" = (/obj/structure/bookcase{name = "Forbidden Knowledge"},/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library) "aXX" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/eftpos{eftpos_name = "Library EFTPOS scanner"},/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "Camera"; pictures_left = 30; pixel_x = 0; pixel_y = 0},/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library) "aXY" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/wood,/area/bridge/meeting_room) -"aXZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/wood,/area/bridge/meeting_room) +"aXZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light_switch{pixel_y = 24},/turf/simulated/floor/wood,/area/bridge/meeting_room) "aYa" = (/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) "aYb" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{dir = 4; icon_state = "chapel"},/area/chapel/main) "aYc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) @@ -6063,6 +6063,7 @@ "cmE" = (/obj/machinery/computer/operating,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cmF" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/engine/engineering) "cmG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cmH" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Captain's Quarters APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{pixel_y = 24},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "cmI" = (/obj/machinery/light_switch{pixel_x = -25},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/ntrep) "cmJ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/medical/cryo) "cmK" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology) @@ -12371,7 +12372,6 @@ "eEa" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area) "eEb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/storage/secure) "eEc" = (/obj/machinery/door/airlock{name = "Private Restroom"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom) -"eEd" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Captain's Quarters APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "eEe" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "eEf" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom) "eEg" = (/obj/machinery/door/airlock/command{name = "Captain's Quarters"; req_access = null; req_access_txt = "20"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) @@ -12678,7 +12678,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablmblmblmblmblmblmblmblmblmblmaaabpHaHNbpIbpJbnobnobpKbpLbpMaaibpNbpNbpNbpNbpOaaqaTQbdWaSqaaqbpQbpRbpSbpRbpTaaibpUbpVbpWbpYbpYaaibpZbqabqbbqbbqcbqdbqebkcbqfaaibqgaaJaaqaaqaaqaaibqhaaibqiacCbqjbqkbjbbqlbjbbqmbqnacfbqoaaibqpbkubqqbqrbnMbqsbkuaaibqtbqubqvaaibqwbqxbqybqzbqAbqBbqCbpdbpdbpdbpdbpdbpdbpdbqDbqEbqFbqGbqHbqIbqJaaqbqKbqLbqMbqNbqObqPbqLbpraaibpsabnbNtbqRbqSbqTbqUaaqbqVbqWbqVbqXbqYbqZbraaaiaaqbrbampaaibrcbrdbrebrfbrfbrfaaibrgbrhbriaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMPaMPaMPaMPaMPaMPaaaaMPaMPaMPaMPaMPaMPaaaaaaaaaaaaaaaaaaaaabjHbjHbjHbjHbjHbjHbjHbjHbjHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrjazMaaiaaiaaiaoJaoLazMaoJaoLaaiaoJaoLaaiaaiaaiaaibrkbnobocbocbodboebocaaibrlbrmbofbofbogaaqblvbdWbrnaaqbrobrpbrqbrrcHNaaibrtbrubrvbpYbpYaaibrwbrxcHPbrzbrAbrBbrCbrDbrEacfbrFbrGbrHbrIabIbrJbrKacfbrLacfacfacfacfbrMacfacfacfacfbrNacfbrOeEkeEieEjeEhbrTbrUacfbrVboRboRaaibrWbrXdFdbrZbsaaaibqCbpdbpdbpdbpdbpdbpdbpdbsbbscbsdbsebsfdBObshaaqbsibsjbskbqNbprbqPdFhdyNaaibslbsmbsnbsobsobspbsqbsrbssbssbssbstbsubsvbswbsxbsybszbsAbsxbsBbsCbsDbsDbsDcrZaaibsFbrhbsGaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMPaMPaMPaMPaMPaaaaMPaMPaMPaMPaMPaaaaaaaaaaaaaaaaaaaaaaaabjHbjHbjHbjHbjHbjHbjHbjHbjHaaaaaaaaaaaaaaaaaaaaaaaaaOTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHaaaaCZbobbnobnobnobpKbpLbnoaaibpNbpNbsIbltbltbsJaTQbdWaSqaaqbsKbsLbsMbsNbsOaaibsPbsQbsRbsScFjaaibsUbsVbsWbsXbsYbsZbtabtbbtcbtdbtebtebtfbtgabXbthbtiacCbtjaGCbtkbtlbtmbtnbtobtlbtpaGCbtqaaiabneEgaaiaaiaaiaaibtsaaibttboRbtuacCbtvbtwbtxbtybtzaaibtAbtBbtCbtDbtEbtFbtGbtHbqDbtIaaqbtJbsfbtKbtLaaqbtMbtNbqMbqNbprbqPbqLbpraaibpsabnbtObtPbtQbtRbtSaGCbtTbtUbtVbtVbtWbqVbtXaaibtYbtZbuaaaibubbucbudbrfbuebufaaibsFbrhbugaaiaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjHbjHbjHbjHbjHbjHbjHbjHbjHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHaaaaATbuhbuibocboccEJboebujaaiaaqbukbYMbumaaqaaqblvbdWbhzaaqbunbuobupbuqburaaibpYbrubusbpYbpYaaibutbuubuvbuwbuxaaqbuybuzbuAaaibuBaaqaaqaouaaqaaJbuCaaibuDbuEbuFbtlbuGbtnbuGbtlbuHbuEbtqaaieEdeEecbZeEceEfabIbuMabIbuNboRbuOaaiboTbuPbuQbuRbuSbuTbuUbuVbuWbuXbuYbuZbvabvbbvcbvdbnSbvebvfbvgbvhaaqbvibvjbvkbvlbvmbvnbvmbpraaibvobvpbvqbvrbvrbvsbvtbvubvvbvwbvxbvxbvybvzbvAaaibvBbtZbvCaaibvDbvEbvFbrfbrfbvGaaibrgbrhbvHaaiaaaaaaaaaaaaaabbvIbvJbvKbvJbvKbvJbvLaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjHbjHbjHbjHbjHbjHbjHbjHbjHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHaaaaATbuhbuibocboccEJboebujaaiaaqbukbYMbumaaqaaqblvbdWbhzaaqbunbuobupbuqburaaibpYbrubusbpYbpYaaibutbuubuvbuwbuxaaqbuybuzbuAaaibuBaaqaaqaouaaqaaJbuCaaibuDbuEbuFbtlbuGbtnbuGbtlbuHbuEbtqaaicmHeEecbZeEceEfabIbuMabIbuNboRbuOaaiboTbuPbuQbuRbuSbuTbuUbuVbuWbuXbuYbuZbvabvbbvcbvdbnSbvebvfbvgbvhaaqbvibvjbvkbvlbvmbvnbvmbpraaibvobvpbvqbvrbvrbvsbvtbvubvvbvwbvxbvxbvybvzbvAaaibvBbtZbvCaaibvDbvEbvFbrfbrfbvGaaibrgbrhbvHaaiaaaaaaaaaaaaaabbvIbvJbvKbvJbvKbvJbvLaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjHbjHbjHbjHbjHbjHbjHbjHbjHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHaEUaEVbvMbvNbnobnobpKbpLbpMaaibYRbltbXpbltbYLaaqaTQbdWaSqaaqaGGbvRbvSbvTaSGaaibvUbvVbvWbvXbvYaaibvZbwabwbbwcbvZaaqbwdbwebwfaaiaaiaaibFCbwhbwibwjbwkaaibwlbwmbwnbwobwpbwqbwpbwrbwsbwtbwuaaibGdbHubLvaaqbYeaaqbwyaaqbwzboRbwAaaiaGGbwBbvRbwCbwDaaqbwEbwFbwGbwHbwIbwIbwJbwKbwLbwMaaqbwNbwOaouaaqaaqaaqaaJbwPaouaaqaaiaaiaaibwQbwRabnbwSbtPbtQbwTbvrbwUcoAbwWbwWbwWbwXbwYbwZbxaaaibrbbxbaaibxcbxdbrfbxebxfbxgaaibsFbxhaaiaaiaaaaaaaaaaaaaabbxibxjbxkbxlbxlbxmbxiaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjHbjHbjHbjHbjHbjHbjHbjHbjHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbxnbxobxpbxqbocbocbodboebocaaibxrbltbltbltbXlaaqaTQbdWaSqbxubxvbxwbxxbxybxzaaiaaiaaiaaibxAaaiaaibxBbxCbxDbxEbKvaaqbxGbxHbxIbxXbxKbxWbxMbxNbxObxPbxQaaibuDbxRbxSbtlbwpbxTbwpbtlbxUaaibtqaaibrPbARbznaaqbxYaaqbxZaaqbyaboRbybaaibycbydbyebyfbygabIbyhbyiabIabIbyjbykabIabIbylbymaAnaAqbynbyobypbyqbpmbysbytbyubyvaaibywbyxbyybyzabnbyAbyBbyCbyDbyEaaqbyFbwWbwWbyGbyHbwYbyIaaibyJbyJbyKaaibyLbyMbpybyObrfbyPaaibsFbyQaaiaaaaaaaaaaaaaaaaabbyRbySbxkbxlbxkbyTbvKaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjHbjHbjHbjHbjHbjHbjHbjHbjHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHbsHaGGaGHbvMbobbnobnobpKbpLbnoaaibyUbjJbmmbjKbyVabIaSobjMbdXaaqbzebqabyXbyYcwRbzabzbbzcbzdbzdbyWbzfcuTbzhbyYbzibzjaaqbwdboRbzkbzlbzmbxVbzobzpbzqbzrbzsaaibuDaaiaaibztbzubzvbtlbzwbzxacfbzyaaiabnaaiaaiaaiaaiaaibzzaaibzAboRbybaaibzBbzCbzCbzDbzEaaqbzFbzGbzHbzIbzJbzKbzLbzHbzMbzNbzObzPbzQbzRbzSbzTbzUbzVbzWbzXbzYbzZbAabAbbAcbAdbAebAfbAfbAgbAhbAiaaqbAjbqVbqVbAkbAlbwYbAmaaqbAnbAobApaaqbxJbxLaSGeGXbjxaaiaaibAsaaiaaibAtbAubAubAubAvaaibxibxlbxkbxlbxlbAwbxiaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjHbjHbjHbjHbjHbjHbjHbjHbjHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa