diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 1301895facd..0e64cefc7aa 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -11703,7 +11703,7 @@ }) "auD" = ( /obj/machinery/light_construct/small, -/obj/item/toolbox_tiles_sensor, +/obj/item/toolbox_tiles/sensor, /turf/simulated/floor/plating, /area/maintenance/fpmaint2{ name = "Port Maintenance" diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm index 73d86c17201..56df786fab5 100644 --- a/_maps/map_files/RandomZLevels/spacehotel.dmm +++ b/_maps/map_files/RandomZLevels/spacehotel.dmm @@ -3125,7 +3125,6 @@ }, /area/awaymission/spacehotel/kitchen) "gE" = ( -/mob/living/carbon/human/interactive/away/hotel/chef, /turf/unsimulated/floor{ icon_state = "cafeteria" }, @@ -3278,7 +3277,6 @@ }, /area/awaymission/spacehotel) "ha" = ( -/mob/living/carbon/human/interactive/away/hotel/bartender, /turf/unsimulated/floor{ icon_state = "whiteyellowfull" }, @@ -4135,9 +4133,6 @@ /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "jm" = ( -/obj/effect/spawner/snpc_squad{ - squad_type = /mob/living/carbon/human/interactive/away/hotel/guard - }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "jn" = ( @@ -4489,7 +4484,6 @@ /obj/structure/chair{ dir = 8 }, -/mob/living/carbon/human/interactive/away/hotel/concierge, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel/reception) "kk" = ( diff --git a/_maps/map_files/RandomZLevels/stationCollision.dmm b/_maps/map_files/RandomZLevels/stationCollision.dmm index a8e3a533033..cc1767248cf 100644 --- a/_maps/map_files/RandomZLevels/stationCollision.dmm +++ b/_maps/map_files/RandomZLevels/stationCollision.dmm @@ -4123,7 +4123,7 @@ /turf/simulated/floor/plasteel, /area/awaymission/arrivalblock) "kG" = ( -/obj/item/clothing/shoes/syndigaloshes, +/obj/item/clothing/shoes/chameleon/noslip, /obj/item/clothing/under/syndicate, /obj/effect/decal/remains/human{ desc = "This guy seemed to have died in terrible way! Half his remains are dust."; diff --git a/_maps/map_files/RandomZLevels/terrorspiders.dmm b/_maps/map_files/RandomZLevels/terrorspiders.dmm index 1a64a0d7f0a..ed0bb019b83 100644 --- a/_maps/map_files/RandomZLevels/terrorspiders.dmm +++ b/_maps/map_files/RandomZLevels/terrorspiders.dmm @@ -13398,7 +13398,7 @@ /area/awaymission/UO71/loot) "zt" = ( /obj/structure/chair/wood/normal, -/obj/item/clothing/shoes/syndigaloshes, +/obj/item/clothing/shoes/chameleon/noslip, /turf/simulated/floor/carpet, /area/awaymission/UO71/loot) "zu" = ( diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 606fabcc4b5..7d2cc96b6fe 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -9787,6 +9787,7 @@ pixel_y = 2 }, /obj/item/stamp/law, +/obj/item/pen/multi, /turf/simulated/floor/plasteel{ tag = "icon-cult"; icon_state = "cult"; @@ -50860,7 +50861,7 @@ icon_state = "diagonalWall3" }, /area/shuttle/administration) -"bPM" = ( +"bPN" = ( /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; @@ -50873,25 +50874,17 @@ id = "admin"; name = "administration shuttle"; roundstart_move = "admin_away"; + timid = 1; width = 18 }, /obj/docking_port/stationary{ dir = 2; - dwidth = 8; - height = 15; + dwidth = 9; + height = 18; id = "admin_home"; name = "port bay 1"; - width = 18 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) -"bPN" = ( -/obj/machinery/door/airlock/external{ - id_tag = "s_docking_airlock"; - name = "Shuttle Hatch"; - req_access_txt = "106" + timid = 1; + width = 19 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -52066,21 +52059,6 @@ icon_state = "wall3" }, /area/shuttle/administration) -"bRH" = ( -/obj/machinery/door_control{ - id = "adminshuttleblast"; - name = "blast door control"; - pixel_x = -30; - req_access_txt = "106" - }, -/obj/machinery/light{ - icon_state = "tube1"; - dir = 8 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "bRI" = ( /obj/structure/plasticflaps/mining, /obj/machinery/conveyor/east{ @@ -54158,28 +54136,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, /area/engine/gravitygenerator) -"bVk" = ( -/obj/machinery/door_control{ - id = "adminshuttleblast"; - name = "blast door control"; - pixel_x = -30; - req_access_txt = "106" - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) -"bVl" = ( -/obj/machinery/door/airlock/centcom{ - id_tag = "adminshuttle"; - name = "Workshop"; - opacity = 1; - req_access_txt = "105" - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "bVm" = ( /obj/machinery/light/spot{ tag = "icon-tube1 (WEST)"; @@ -55149,14 +55105,6 @@ icon_state = "floor4" }, /area/shuttle/administration) -"bWO" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion_l"; - tag = "icon-propulsion_l (EAST)" - }, -/turf/simulated/shuttle/plating, -/area/shuttle/administration) "bWP" = ( /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; @@ -56131,14 +56079,6 @@ icon_state = "floor4" }, /area/shuttle/administration) -"bYu" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion_r"; - tag = "icon-propulsion_r (EAST)" - }, -/turf/simulated/shuttle/plating, -/area/shuttle/administration) "bYv" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -57421,17 +57361,6 @@ "cam" = ( /turf/simulated/wall, /area/quartermaster/miningdock) -"can" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/spot{ - tag = "icon-tube1 (NORTH)"; - icon_state = "tube1"; - dir = 1 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "cao" = ( /obj/structure/filingcabinet, /turf/simulated/floor/plasteel, @@ -58235,23 +58164,6 @@ icon_state = "floor4" }, /area/shuttle/administration) -"cby" = ( -/obj/machinery/computer/shuttle/admin, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) -"cbz" = ( -/obj/machinery/door/airlock/centcom{ - id_tag = "adminshuttle"; - name = "Bridge"; - opacity = 1; - req_access_txt = "106" - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "cbA" = ( /obj/machinery/door/poddoor/shutters{ density = 0; @@ -59504,18 +59416,9 @@ icon_state = "floor3" }, /area/shuttle/administration) -"cdq" = ( -/obj/machinery/computer/card/centcom, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "cdr" = ( -/obj/structure/table/reinforced, -/obj/machinery/door_control{ - id = "adminshuttleshutters"; - name = "remote shutter control"; - req_access_txt = "106" +/obj/machinery/computer/camera_advanced/shuttle_docker/admin{ + name = "NTV Argos shuttle navigation computer" }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -60289,17 +60192,6 @@ tag = "icon-cafeteria (NORTHEAST)" }, /area/crew_quarters/hor) -"ceT" = ( -/obj/machinery/door/airlock/centcom{ - id_tag = "adminshuttle"; - name = "Medbay"; - opacity = 1; - req_access_txt = "103" - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "ceU" = ( /obj/structure/shuttle/engine/propulsion, /turf/simulated/shuttle/plating, @@ -96571,6 +96463,12 @@ }, /turf/simulated/floor/plating, /area/toxins/mixing) +"gQL" = ( +/obj/machinery/computer/card, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "hsy" = ( /obj/machinery/atmospherics/pipe/simple/insulated{ dir = 4 @@ -96625,6 +96523,35 @@ /area/toxins/launch{ name = "Toxins Launch Room" }) +"jnJ" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "Blast door control"; + pixel_x = -5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/machinery/door_control{ + id = "adminshuttleshutters"; + name = "Shutter control"; + pixel_x = 5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "kOE" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{ dir = 4 @@ -96638,22 +96565,90 @@ }, /turf/space, /area/space) +"oZV" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Medbay"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"pwN" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "pZO" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 10 }, /turf/space, /area/space) +"qgG" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock"; + name = "Shuttle Hatch"; + req_access_txt = "101" + }, +/obj/structure/fans/tiny, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "qUv" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging, /turf/space, /area/space) +"rEw" = ( +/obj/machinery/computer/shuttle/admin{ + name = "NTV Argos shuttle console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"rSv" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_l"; + tag = "icon-propulsion_l (EAST)" + }, +/turf/space, +/area/shuttle/administration) +"rYq" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Bridge"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "uxy" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 4 }, /turf/space, /area/space) +"uBM" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_r"; + tag = "icon-propulsion_r (EAST)" + }, +/turf/space, +/area/shuttle/administration) "uDK" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ tag = "icon-intact (NORTHEAST)"; @@ -96684,6 +96679,32 @@ }, /turf/space, /area/space) +"yeP" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ylx" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Workshop"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) (1,1,1) = {" aaa @@ -105048,15 +105069,15 @@ aaa aaa aaa aaa +bPL +rSv +uBM +cae aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bPL +rSv +uBM +cae aaa aaa aaa @@ -105304,18 +105325,18 @@ aaa aaa aaa aaa -aaa bPL -bWO -bYu +bPI +bWG +bWG +bPI +bPI +bPI +bWG +bWG +bPI cae aaa -bPL -bWO -bYu -cae -aaa -aaa aaa aaa aaa @@ -105560,16 +105581,17 @@ aaa aaa aaa aaa -aaa bPL bPI -bWG -bWG +bVe +bRA +bRA +caf bPI -bPI -bPI -bWG -bWG +cdl +ceR +ceR +cig bPI cae aaa @@ -105678,7 +105700,6 @@ aaa aaa aaa aaa -aaa "} (36,1,1) = {" aaa @@ -105812,22 +105833,23 @@ bCd bCd bCd bAR -aaa -aaa +bjQ aaa aaa aaa bPL -bPI -bVe +bRu +bRA +bVf bRA bRA -caf +cag bPI -cdl +cdm ceR ceR -cig +ceR +ckd bPI cae aaa @@ -105935,7 +105957,6 @@ aaa aaa aaa aaa -aaa "} (37,1,1) = {" aaa @@ -106069,25 +106090,25 @@ bCc bDG bEK bAR -bjQ +aLd aaa aaa aaa -bPL -bRu -bRA -bVf -bRA -bRA -cag bPI -cdm -ceR -ceR -ceR -ckd +bRv +bRA +bVg +cuH +bRA +cah +bPI +cdp +ceR +ceR +ceR +ceR +clC bPI -cae aaa aaa aaa @@ -106326,24 +106347,24 @@ aAi bCb bCl bAR -aLd +aSd aaa aaa aaa bPI -bRv +bRw bRA -bVg +bVh cuH bRA -cah +cai bPI -cdp +cdl ceR +cgw +cih ceR -ceR -ceR -clC +clD bPI aaa aaa @@ -106588,19 +106609,19 @@ aaa aaa aaa bPI -bRw -bRA -bVh +bRx +bTl +bVi cuH bRA -cai +bRA bPI -cdl +cdo ceR -cgw -cih -ceR -clD +cgx +cii +ckf +clE bPI aaa aaa @@ -106841,23 +106862,23 @@ bCb bEL bAR aSd -aaa -aaa -aaa +aSd +aSd +aSd bPI -bRx -bTl -bVi -cuH -bRA -bRA -bPI -cdo -ceR -cgx -cii -ckf -clE +bRG +bRG +bRG +bRG +bYt +bRG +bRG +bRG +oZV +bRG +bRG +bRG +bRG bPI aaa aaa @@ -107098,23 +107119,23 @@ bCb bEL bAR aSd -aSd -aSd -aSd -bPI -bRG -bRG -bRG -bRG -bYt -bRG -bRG -bRG -ceT -bRG -bRG -bRG -bRG +bGm +bLY +bKp +qgG +yeP +bTn +pwN +bRA +bRA +bRA +bTo +bRA +bRA +bRA +bRA +bRA +bRA bPI aaa aaa @@ -107355,23 +107376,23 @@ bCb bEL bAR aSd -bGm -bLY +bGl +bLX bKp bPN -bRH +bRA bTn -bVk -bRA -bRA -bRA -bTo bRA bRA bRA bRA bRA bRA +bRA +bRA +bRA +bRA +clF bPI aaa aaa @@ -107612,23 +107633,23 @@ bCb bEL bAR aSd -bGl -bLX bKp -bPM -bRA -bTn -bRA -bRA -bRA -bRA -bRA -bRA -bRA -bRA -bRA -bRA -clF +bKp +bOb +bPI +bRG +bRG +ylx +bRG +bRG +bRG +rYq +bRG +bRG +bRG +cik +bRG +bRG bPI aaa aaa @@ -107869,23 +107890,23 @@ bCb bAR bER aSd -bKp -bKp -bOb +aMd +bLZ +aSd bPI -bRG -bRG -bVl -bRG -bRG -bRG -cbz -bRG -bRG -bRG -cik -bRG -bRG +bRB +bTo +bRA +bWI +bPI +gQL +bRA +bRA +bPI +bRA +bRA +ckg +clG bPI aaa aaa @@ -108130,19 +108151,19 @@ aMd bLZ aSd bPI -bRB -bTo +bRC bRA -bWI +bRA +bWJ +bPI +jnJ +cbx +cbx bPI bRA bRA bRA -bPI -bRA -bRA -ckg -clG +clI bPI aaa aaa @@ -108387,19 +108408,19 @@ aMd bLZ aSd bPI -bRC +bRD bRA bRA -bWJ +bWK bPI -can -cbx +cak +rEw cdr bPI bRA bRA bRA -clI +bRA bPI aaa aaa @@ -108643,21 +108664,21 @@ aSd aMd bMa bjQ +bPR bPI -bRD -bRA -bRA -bWK -bPI -cak -cby -cdq -bPI -bRA -bRA +bTp bRA bRA bPI +car +cbA +cds +bPI +cgz +cio +ckj +bPI +bYv aaa aaa aaa @@ -108900,21 +108921,21 @@ bLs bmS bMb aLd -bPR +aaa +bPI +bWL +bRA +bWM +bPI +aaa +aaa +aaa bPI -bTp bRA bRA +ckh bPI -car -cbA -cds -bPI -cgz -cio -ckj -bPI -bYv +aaa aaa aaa aaa @@ -109158,19 +109179,19 @@ aSf bLZ aSd aaa +bPR bPI -bWL -bRA -bWM +bTl +bWN bPI aaa aaa aaa bPI -bRA -bRA -ckh +cgA +cil bPI +bYv aaa aaa aaa @@ -109415,22 +109436,22 @@ aSf bMc aSd aaa +aaa bPR -bPI -bTl -bWN -bPI -aaa -aaa -aaa -bPI -cgA -cil -bPI +bRG +bRG bYv aaa aaa aaa +bPR +bRG +bRG +bYv +aaa +aaa +aaa +aaa aaa aaa aaa @@ -109673,17 +109694,17 @@ bCf bCf aaa aaa -bPR -bRG -bRG -bYv aaa aaa aaa -bPR -bRG -bRG -bYv +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index ee6ca15f83d..dda71eb7e09 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -8030,11 +8030,12 @@ "tH" = ( /obj/docking_port/stationary{ dir = 2; - dwidth = 8; - height = 15; + dwidth = 9; + height = 18; id = "admin_away"; name = "centcom bay 1"; - width = 18 + timid = 1; + width = 19 }, /turf/space, /area/space) @@ -8543,7 +8544,7 @@ pixel_y = 3 }, /obj/item/clothing/mask/gas/cyborg, -/obj/item/clothing/mask/gas/voice, +/obj/item/clothing/mask/chameleon, /obj/item/clothing/mask/balaclava{ pixel_x = 3; pixel_y = -3 @@ -8729,7 +8730,7 @@ /area/admin) "uY" = ( /obj/structure/rack, -/obj/item/clothing/under/chameleon/all{ +/obj/item/clothing/mask/chameleon{ pixel_x = -3; pixel_y = 3 }, @@ -9036,7 +9037,7 @@ pixel_y = 3 }, /obj/item/clothing/shoes/centcom, -/obj/item/clothing/shoes/syndigaloshes{ +/obj/item/clothing/shoes/chameleon/noslip{ pixel_x = 3; pixel_y = -3 }, @@ -12275,7 +12276,7 @@ "Hv" = ( /obj/structure/rack, /obj/item/katana/energy, -/obj/item/clothing/mask/gas/voice/space_ninja, +/obj/item/clothing/mask/gas/space_ninja, /turf/unsimulated/floor{ icon_state = "engine" }, @@ -35340,9 +35341,9 @@ wK wK wK wK -aN -aN -aN +wK +wK +wK aN aN aN @@ -35581,21 +35582,24 @@ aN aN cp cj -yt -yt -yt -cr aN aN -cr -yt -cr aN aN -cr -yt -yt -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -35638,9 +35642,6 @@ aN aN aN aN -aN -aN -aN jZ kz kM @@ -35838,9 +35839,6 @@ aN aN cp cj -yt -yt -cr aN aN aN @@ -35850,9 +35848,15 @@ aN aN aN aN -cr -yt -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -35918,9 +35922,6 @@ aN aN aN aN -aN -aN -aN "} (91,1,1) = {" aN @@ -36095,8 +36096,6 @@ aN aN cp cj -yt -cr aN aN aN @@ -36108,8 +36107,13 @@ aN aN aN aN -cr -yt +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -36152,9 +36156,6 @@ aN aN aN aN -aN -aN -aN jU kw kE @@ -36352,7 +36353,6 @@ aN aN cp cj -cr aN aN aN @@ -36366,7 +36366,11 @@ aN aN aN aN -cr +aN +aN +aN +aN +aN wK aN aN @@ -36408,9 +36412,6 @@ aN aN aN aN -aN -aN -aN jQ jW kD @@ -36624,6 +36625,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -36665,9 +36669,6 @@ aN aN aN aN -aN -aN -aN jP kt kx @@ -36881,6 +36882,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -36922,9 +36926,6 @@ aN aN aN aN -aN -aN -aN jS kv kx @@ -37138,6 +37139,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37179,9 +37183,6 @@ aN aN aN aN -aN -aN -aN jR ku kx @@ -37395,6 +37396,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37436,9 +37440,6 @@ aN aN aN aN -aN -aN -aN jT ka kA @@ -37652,6 +37653,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37694,9 +37698,6 @@ aN aN aN aN -aN -aN -aN jZ kz kM @@ -37909,6 +37910,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37974,9 +37978,6 @@ aN aN aN aN -aN -aN -aN "} (99,1,1) = {" aN @@ -38166,6 +38167,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38231,9 +38235,6 @@ aN aN aN aN -aN -aN -aN "} (100,1,1) = {" aN @@ -38423,6 +38424,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38488,9 +38492,6 @@ aN aN aN aN -aN -aN -aN "} (101,1,1) = {" aN @@ -38680,6 +38681,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38713,9 +38717,6 @@ aN aN aN aN -aN -aN -aN mr mr mr @@ -38937,6 +38938,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38970,9 +38974,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39179,7 +39180,6 @@ qo qs tx wK -cr aN aN aN @@ -39193,7 +39193,11 @@ aN aN aN aN -cr +aN +aN +aN +aN +aN wK aN aN @@ -39227,9 +39231,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39436,21 +39437,24 @@ qo qs tA wK -yt aN aN aN aN aN -yt -yt -yt aN aN aN aN aN -yt +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -39484,9 +39488,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39693,21 +39694,24 @@ tq tv tz wK -yt -cr aN aN aN aN -yt -yt -yt aN aN aN aN -cr -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -39741,9 +39745,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39950,21 +39951,24 @@ wK wK wK wK -yt -yt -cr aN aN -cr -yt -yt -yt -cr aN aN -cr -yt -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -39998,9 +40002,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -40207,22 +40208,6 @@ aN aN aN wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK aN aN aN @@ -40241,6 +40226,22 @@ aN aN aN aN +wK +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN aN aN aN @@ -40463,26 +40464,26 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK aN aN aN diff --git a/_maps/map_files/shuttles/admin_admin.dmm b/_maps/map_files/shuttles/admin_admin.dmm new file mode 100644 index 00000000000..36badb71d1b --- /dev/null +++ b/_maps/map_files/shuttles/admin_admin.dmm @@ -0,0 +1,1094 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/space, +/area/space) +"ab" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + dir = 8; + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"ac" = ( +/turf/simulated/shuttle/wall{ + icon_state = "wall3" + }, +/area/shuttle/administration) +"ad" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock"; + name = "Shuttle Hatch"; + req_access_txt = "101" + }, +/obj/structure/fans/tiny, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ae" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock"; + name = "Shuttle Hatch"; + req_access_txt = "101" + }, +/obj/docking_port/mobile{ + dir = 2; + dwidth = 8; + height = 15; + id = "admin"; + name = "admin"; + roundstart_move = null; + timid = 1; + width = 18 + }, +/obj/structure/fans/tiny, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"af" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + dir = 1; + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"ag" = ( +/obj/machinery/vending/boozeomat, +/turf/simulated/shuttle/wall{ + icon_state = "wall3" + }, +/area/shuttle/administration) +"ah" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/beer, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ai" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/drinkingglasses, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aj" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/soda, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ak" = ( +/turf/simulated/shuttle/wall{ + dir = 4; + icon_state = "wall3" + }, +/area/shuttle/administration) +"al" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"am" = ( +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"an" = ( +/obj/machinery/cell_charger, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ao" = ( +/obj/item/storage/toolbox/mechanical, +/obj/item/multitool, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ap" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aq" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ar" = ( +/obj/machinery/door/poddoor/preopen{ + id_tag = "adminshuttleblast"; + name = "Blast Doors"; + req_access_txt = "101" + }, +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "General Access"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"as" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"at" = ( +/obj/item/stack/sheet/metal, +/obj/structure/table, +/obj/item/stack/sheet/glass{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"au" = ( +/obj/machinery/mecha_part_fabricator/upgraded, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"av" = ( +/obj/machinery/kitchen_machine/microwave/upgraded, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aw" = ( +/obj/machinery/door/window/northright{ + name = "bar" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ax" = ( +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ay" = ( +/obj/item/ashtray/glass, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"az" = ( +/obj/item/storage/fancy/cigarettes/dromedaryco, +/obj/item/lighter/zippo{ + pixel_x = 5 + }, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aA" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aB" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Workshop"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aC" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_l"; + tag = "icon-propulsion_l (EAST)" + }, +/turf/space, +/area/shuttle/administration) +"aD" = ( +/obj/structure/shuttle/engine/heater{ + tag = "icon-heater (WEST)"; + icon_state = "heater"; + dir = 8 + }, +/obj/structure/window/plasmareinforced{ + color = "#FF0000"; + dir = 4 + }, +/turf/simulated/shuttle/wall{ + icon_state = "wall3" + }, +/area/shuttle/administration) +"aE" = ( +/obj/structure/chair/stool/bar, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aF" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aG" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aH" = ( +/obj/machinery/recharge_station/upgraded, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aI" = ( +/obj/machinery/autolathe/upgraded{ + hacked = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aJ" = ( +/obj/structure/dispenser, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aK" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_r"; + tag = "icon-propulsion_r (EAST)" + }, +/turf/space, +/area/shuttle/administration) +"aL" = ( +/obj/machinery/door/airlock/public/glass, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aM" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + dir = 4; + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"aN" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"aO" = ( +/obj/machinery/vending/snack, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aP" = ( +/obj/machinery/vending/cola, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aQ" = ( +/obj/machinery/vending/coffee, +/obj/machinery/light/spot, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aR" = ( +/obj/machinery/vending/cigarette, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aS" = ( +/obj/machinery/computer/card, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aT" = ( +/obj/machinery/computer/communications, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aU" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "adminshuttleshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_end (WEST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/shuttle/administration) +"aV" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "Blast door control"; + pixel_x = -5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/machinery/door_control{ + id = "adminshuttleshutters"; + name = "Shutter control"; + pixel_x = 5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aW" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aX" = ( +/obj/machinery/computer/shuttle/admin{ + name = "NTV Argos shuttle console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aY" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "adminshuttleshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + dir = 4; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + tag = "icon-window5 (EAST)" + }, +/turf/simulated/floor/plating, +/area/shuttle/administration) +"aZ" = ( +/obj/machinery/dna_scannernew/upgraded, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ba" = ( +/obj/machinery/computer/cloning, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bb" = ( +/obj/machinery/clonepod/upgraded, +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bc" = ( +/obj/machinery/computer/scan_consolenew, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bd" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Bridge"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"be" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/admin{ + name = "NTV Argos shuttle navigation computer" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bf" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "adminshuttleshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_end (EAST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 4 + }, +/turf/simulated/floor/plating, +/area/shuttle/administration) +"bg" = ( +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bh" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Medbay"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bi" = ( +/obj/machinery/bodyscanner, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bj" = ( +/obj/machinery/body_scanconsole, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bk" = ( +/obj/structure/window/plasmareinforced{ + color = "#FF0000"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bl" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bm" = ( +/obj/machinery/sleeper/upgraded{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bn" = ( +/obj/machinery/chem_master, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bo" = ( +/obj/machinery/chem_dispenser, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bp" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Holding Cell"; + opacity = 1; + req_access_txt = "104" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bq" = ( +/obj/machinery/door/window/brigdoor/westleft{ + color = "#d70000"; + req_access_txt = "104" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"br" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bs" = ( +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bt" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bu" = ( +/obj/structure/table, +/obj/item/storage/box/handcuffs, +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bv" = ( +/obj/structure/window/plasmareinforced{ + color = "#FF0000"; + dir = 8 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bw" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bx" = ( +/obj/structure/table, +/obj/item/bonegel, +/obj/item/bonesetter, +/obj/item/hemostat, +/obj/item/cautery, +/obj/item/surgicaldrill, +/obj/item/circular_saw, +/obj/item/scalpel, +/obj/item/retractor, +/obj/item/FixOVein, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"by" = ( +/obj/machinery/optable, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bz" = ( +/obj/machinery/vending/medical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bA" = ( +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bB" = ( +/obj/structure/table, +/obj/item/storage/lockbox/mindshield, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bC" = ( +/obj/structure/table, +/obj/item/storage/box/chemimp{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/storage/box/trackimp, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) + +(1,1,1) = {" +aa +aa +aa +ab +aC +aK +aN +aa +ab +aC +aK +aN +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +ab +ac +aD +aD +ac +ac +ac +aD +aD +ac +aN +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +ab +ac +av +am +am +aO +ac +aZ +bg +bg +bm +ac +aN +aa +aa +aa +aa +"} +(4,1,1) = {" +ab +ag +am +aw +am +am +aP +ac +ba +bg +bg +bg +bs +ac +aN +aa +aa +aa +"} +(5,1,1) = {" +ac +ah +am +ax +aE +am +aQ +ac +bb +bg +bg +bg +bg +bx +ac +aa +aa +aa +"} +(6,1,1) = {" +ac +ai +am +ay +aE +am +aR +ac +aZ +bg +bi +bn +bg +by +ac +aa +aa +aa +"} +(7,1,1) = {" +ac +aj +aq +az +aE +am +am +ac +bc +bg +bj +bo +bt +bz +ac +aa +aa +aa +"} +(8,1,1) = {" +ac +ak +ak +ak +ak +aL +ak +ak +ak +bh +ak +ak +ak +ak +ac +aa +aa +aa +"} +(9,1,1) = {" +ad +al +ar +aA +am +am +am +as +am +am +am +am +am +am +ac +aa +aa +aa +"} +(10,1,1) = {" +ae +am +ar +am +am +am +am +am +am +am +am +am +am +bA +ac +aa +aa +aa +"} +(11,1,1) = {" +ac +ak +ak +aB +ak +ak +ak +bd +ak +ak +ak +bp +ak +ak +ac +aa +aa +aa +"} +(12,1,1) = {" +ac +an +as +am +aF +ac +aS +am +am +ac +am +am +bu +bB +ac +aa +aa +aa +"} +(13,1,1) = {" +ac +ao +am +am +aG +ac +aV +aW +aW +ac +am +am +am +bC +ac +aa +aa +aa +"} +(14,1,1) = {" +ac +ap +am +am +aH +ac +aT +aX +be +ac +am +am +am +am +ac +aa +aa +aa +"} +(15,1,1) = {" +af +ac +at +am +am +ac +aU +aY +bf +ac +bk +bq +bv +ac +aM +aa +aa +aa +"} +(16,1,1) = {" +aa +ac +au +am +aI +ac +aa +aa +aa +ac +am +am +bw +ac +aa +aa +aa +aa +"} +(17,1,1) = {" +aa +af +ac +aq +aJ +ac +aa +aa +aa +ac +bl +br +ac +aM +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +af +ak +ak +aM +aa +aa +aa +af +ak +ak +aM +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/map_files/shuttles/admin_hospital.dmm b/_maps/map_files/shuttles/admin_hospital.dmm new file mode 100644 index 00000000000..2c2d31a0bb4 --- /dev/null +++ b/_maps/map_files/shuttles/admin_hospital.dmm @@ -0,0 +1,1589 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/space, +/area/space) +"ab" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s6"; + dir = 2 + }, +/area/shuttle/administration) +"ac" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall12"; + dir = 2 + }, +/area/shuttle/administration) +"ad" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 2 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"ae" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_mid"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + dir = 2 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"af" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end (NORTH)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 1 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"ag" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall14"; + dir = 2 + }, +/area/shuttle/administration) +"ah" = ( +/obj/structure/sign/redcross{ + desc = "The Star of Life, a symbol of Medical Aid."; + icon_state = "lifestar"; + name = "NHV Asclepius" + }, +/turf/simulated/shuttle/wall{ + dir = 2; + icon_state = "swall8"; + tag = "icon-swall12" + }, +/area/shuttle/administration) +"ai" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "asclblast"; + name = "Blast Door"; + opacity = 0 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aj" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external, +/obj/docking_port/mobile{ + dir = 2; + dwidth = 9; + height = 18; + id = "admin"; + name = "hospital"; + roundstart_move = "cc_bay_1"; + timid = 1; + width = 19 + }, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "asclblast"; + name = "Blast Door"; + opacity = 0 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ak" = ( +/obj/structure/sign/redcross{ + desc = "The Star of Life, a symbol of Medical Aid."; + icon_state = "lifestar"; + name = "NHV Asclepius" + }, +/turf/simulated/shuttle/wall{ + tag = "icon-swall14"; + icon_state = "swall4"; + dir = 2 + }, +/area/shuttle/administration) +"al" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_mid"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + dir = 2 + }, +/turf/space, +/area/shuttle/administration) +"am" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_end (NORTH)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 1 + }, +/turf/space, +/area/shuttle/administration) +"an" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s10"; + dir = 2 + }, +/area/shuttle/administration) +"ao" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall3"; + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"ap" = ( +/obj/machinery/chem_master, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aq" = ( +/obj/machinery/chem_dispenser, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ar" = ( +/obj/machinery/chem_heater, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"as" = ( +/obj/structure/closet/secure_closet/reagents, +/obj/item/storage/bag/chemistry, +/obj/item/storage/bag/chemistry, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"at" = ( +/obj/structure/closet/secure_closet/chemical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"au" = ( +/obj/structure/sign/chemistry{ + pixel_y = 1 + }, +/turf/simulated/shuttle/wall{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"av" = ( +/obj/structure/chair{ + tag = "icon-chair (EAST)"; + icon_state = "chair"; + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aw" = ( +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ax" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/camera{ + dir = 8; + icon_state = "camera"; + name = "NHV Asclepius Lobby"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ay" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"az" = ( +/obj/machinery/clonepod{ + biomass = 300 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aA" = ( +/obj/machinery/computer/cloning, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aB" = ( +/obj/machinery/dna_scannernew, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aC" = ( +/obj/machinery/atmospherics/unary/cryo_cell, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aD" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall7"; + dir = 2 + }, +/area/shuttle/administration) +"aE" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"aF" = ( +/obj/structure/reagent_dispensers/fueltank/chem{ + pixel_x = -32 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aG" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aH" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/westleft{ + req_access_txt = "33" + }, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/window/reinforced, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aI" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aJ" = ( +/obj/structure/sign/nosmoking_2, +/turf/simulated/shuttle/wall{ + tag = "icon-swall1"; + icon_state = "swall1"; + dir = 2 + }, +/area/shuttle/administration) +"aK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aL" = ( +/obj/structure/shuttle/engine/heater{ + icon_state = "heater"; + dir = 4 + }, +/obj/structure/window/plasmareinforced{ + dir = 8 + }, +/turf/unsimulated/floor, +/area/shuttle/administration) +"aM" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 4; + icon_state = "propulsion" + }, +/turf/space, +/area/shuttle/administration) +"aN" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/spray/cleaner{ + desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; + name = "Chemistry Cleaner" + }, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aO" = ( +/obj/structure/closet/crate/can, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aP" = ( +/obj/structure/shuttle/window, +/obj/structure/grille, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aQ" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aR" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aS" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/syringes, +/obj/item/storage/box/beakers, +/obj/machinery/reagentgrinder, +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius Chemistry"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aT" = ( +/obj/machinery/door/airlock/shuttle/glass{ + name = "Chemistry"; + req_access_txt = "33" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aU" = ( +/obj/machinery/door/airlock/shuttle/glass, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aV" = ( +/obj/machinery/camera{ + dir = 8; + icon_state = "camera"; + name = "NHV Asclepius Cloning"; + network = list("NHV Asclepius") + }, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aW" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s9"; + dir = 2 + }, +/area/shuttle/administration) +"aX" = ( +/obj/machinery/iv_drip, +/obj/item/reagent_containers/iv_bag, +/obj/structure/reagent_dispensers/fueltank/chem{ + pixel_x = -32 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aY" = ( +/obj/structure/chair/office/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ba" = ( +/obj/machinery/chem_heater, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bb" = ( +/obj/machinery/status_display, +/turf/simulated/shuttle/wall{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"bc" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bd" = ( +/obj/machinery/vending/coffee, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"be" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/storage/box/gloves, +/obj/item/storage/box/masks, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bf" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bg" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid, +/obj/item/storage/firstaid, +/obj/item/storage/firstaid/adv, +/obj/item/storage/firstaid/adv, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bh" = ( +/obj/structure/table/reinforced, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bi" = ( +/obj/machinery/atmospherics/unary/cold_sink/freezer{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bj" = ( +/obj/machinery/smartfridge/medbay, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bk" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall13"; + icon_state = "swall13"; + dir = 2 + }, +/area/shuttle/administration) +"bl" = ( +/obj/structure/shuttle/window, +/obj/structure/grille, +/turf/simulated/shuttle/wall{ + dir = 2; + icon_state = "swall8"; + tag = "icon-swall12" + }, +/area/shuttle/administration) +"bm" = ( +/obj/structure/shuttle/window, +/obj/structure/grille, +/turf/simulated/shuttle/wall{ + tag = "icon-swall14"; + icon_state = "swall4"; + dir = 2 + }, +/area/shuttle/administration) +"bn" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall15"; + icon_state = "swall15"; + dir = 2 + }, +/area/shuttle/administration) +"bo" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end (WEST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 8 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 8; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"bp" = ( +/obj/machinery/computer/pandemic, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bq" = ( +/obj/machinery/camera{ + c_tag = "Tech Storage"; + dir = 2; + name = "NHV Asclepius Command Center"; + network = list("NHV Asclepius") + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/door_control{ + dir = 4; + id = "Asclshutters"; + name = "remote shutter control"; + pixel_x = -5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/machinery/keycard_auth{ + pixel_y = 24 + }, +/obj/machinery/door_control{ + dir = 2; + id = "asclblast"; + name = "blast door control"; + pixel_x = 5; + pixel_y = 35; + pixel_z = 0; + req_access = list(101); + req_access_txt = "0" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"br" = ( +/obj/machinery/recharger/wallcharger{ + pixel_y = 25 + }, +/obj/machinery/recharger/wallcharger{ + pixel_y = 35 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bs" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall1"; + icon_state = "swall1"; + dir = 2 + }, +/area/shuttle/administration) +"bt" = ( +/obj/structure/sink{ + icon_state = "sink"; + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bu" = ( +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/structure/closet/walllocker/emerglocker{ + pixel_y = 32 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bv" = ( +/obj/machinery/vending/medical, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bw" = ( +/obj/structure/table/tray, +/obj/item/stack/medical/bruise_pack/advanced, +/obj/item/scalpel, +/obj/item/hemostat, +/obj/item/retractor, +/obj/item/circular_saw, +/obj/item/bonegel, +/obj/item/bonesetter, +/obj/item/cautery, +/obj/item/FixOVein, +/obj/item/surgicaldrill, +/obj/item/storage/backpack/duffel/medical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bx" = ( +/obj/machinery/optable, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"by" = ( +/obj/machinery/computer/operating, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bz" = ( +/obj/structure/closet/secure_closet/medical3, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bA" = ( +/obj/structure/closet/secure_closet/medical2, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bB" = ( +/obj/structure/shuttle/window{ + dir = 4; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + tag = "icon-window5 (EAST)" + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 8; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"bC" = ( +/obj/machinery/computer/shuttle/admin{ + name = "NHV Asclepius shuttle console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bD" = ( +/obj/machinery/door/airlock/command{ + name = "Command Center"; + req_access = null; + req_access_txt = "19" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bE" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bF" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall1"; + dir = 2 + }, +/area/shuttle/administration) +"bG" = ( +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius OR 1"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bH" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/admin{ + name = "NHV Asclepius navigation computer" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bI" = ( +/obj/machinery/door/airlock/shuttle/glass{ + name = "Operating Room"; + req_access = null; + req_access_txt = "45" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bJ" = ( +/obj/structure/sink{ + dir = 4; + icon_state = "sink"; + pixel_x = 11; + pixel_y = 0 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bK" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end (EAST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 4 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 8; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"bL" = ( +/obj/machinery/computer/communications{ + name = "NHV Asclepius Communications Console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bM" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bN" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall2"; + icon_state = "swall2"; + dir = 2 + }, +/area/shuttle/administration) +"bO" = ( +/obj/machinery/sleeper, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bP" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bQ" = ( +/obj/structure/bed{ + name = "Triage: High Priority" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bR" = ( +/obj/machinery/bodyscanner, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bS" = ( +/obj/machinery/body_scanconsole, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bT" = ( +/obj/machinery/light, +/obj/structure/closet/crate/can, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bU" = ( +/obj/item/reagent_containers/spray/cleaner{ + desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; + name = "Surgery Cleaner" + }, +/obj/structure/table/glass, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bV" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bW" = ( +/obj/machinery/status_display, +/turf/simulated/shuttle/wall{ + icon_state = "swall12"; + dir = 2 + }, +/area/shuttle/administration) +"bX" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall13"; + dir = 2 + }, +/area/shuttle/administration) +"bY" = ( +/obj/structure/sign/examroom, +/turf/simulated/shuttle/wall{ + icon_state = "swall12"; + dir = 2 + }, +/area/shuttle/administration) +"bZ" = ( +/obj/machinery/defibrillator_mount/loaded, +/turf/simulated/shuttle/wall{ + dir = 2; + icon_state = "swall8"; + tag = "icon-swall12" + }, +/area/shuttle/administration) +"ca" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/camera{ + dir = 5; + icon_state = "camera"; + name = "NHV Asclepius Central"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cb" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/obj/structure/bed{ + name = "Triage: High Priority" + }, +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cc" = ( +/obj/structure/sign/nosmoking_2, +/turf/simulated/shuttle/wall{ + icon_state = "swall7"; + dir = 2 + }, +/area/shuttle/administration) +"cd" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall11"; + dir = 2 + }, +/area/shuttle/administration) +"ce" = ( +/obj/machinery/portable_atmospherics/canister/oxygen{ + name = "Canister: \[O2] (CRYO)" + }, +/obj/machinery/atmospherics/unary/portables_connector{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cf" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cg" = ( +/obj/machinery/portable_atmospherics/canister/oxygen{ + name = "Canister: \[O2] (CRYO)" + }, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius Cryo"; + network = list("NHV Asclepius") + }, +/obj/machinery/atmospherics/unary/portables_connector, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ch" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/spray/cleaner{ + desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; + name = "Surgery Cleaner" + }, +/obj/machinery/cell_charger, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ci" = ( +/obj/structure/bed{ + name = "Triage: High Priority" + }, +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cj" = ( +/obj/machinery/atmospherics/unary/cold_sink/freezer, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ck" = ( +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius OR 2"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cl" = ( +/obj/structure/closet/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/suit/radiation, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cm" = ( +/obj/structure/closet/l3closet, +/obj/item/clothing/head/bio_hood, +/obj/item/clothing/head/bio_hood, +/obj/item/clothing/head/bio_hood, +/obj/item/clothing/suit/bio_suit, +/obj/item/clothing/suit/bio_suit, +/obj/item/clothing/suit/bio_suit, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cn" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/item/clothing/head/beret/med, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"co" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cp" = ( +/obj/machinery/suit_storage_unit/cmo/secure/sec_storage, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cq" = ( +/obj/machinery/light, +/obj/machinery/suit_storage_unit/cmo/secure/sec_storage, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cr" = ( +/obj/structure/dispenser/oxygen, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cs" = ( +/obj/machinery/vending/medical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ct" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s5"; + dir = 2 + }, +/area/shuttle/administration) +"cu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5; + icon_state = "intact" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cv" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4; + level = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cx" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9; + icon_state = "intact" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) + +(1,1,1) = {" +ab +ao +aE +aE +aE +aE +aE +aD +bo +bB +bB +bK +aD +aE +aE +aE +aE +ct +"} +(2,1,1) = {" +ac +ap +aF +aN +aS +aX +ap +ac +bp +bC +bH +bL +ac +cg +cu +aw +cl +ac +"} +(3,1,1) = {" +ad +aq +aG +aw +aw +aY +aq +ac +bq +aR +aR +bM +ac +aC +cv +aw +cm +ad +"} +(4,1,1) = {" +ae +ar +aw +aw +aw +aw +ba +ac +br +aw +aw +aw +bW +cf +cw +aw +cn +ae +"} +(5,1,1) = {" +af +as +aw +aw +aw +aw +aw +ag +bs +bD +aP +bN +bX +aC +cv +aw +co +af +"} +(6,1,1) = {" +ac +at +aw +aO +aw +aw +aw +bj +bt +aw +aw +bO +bY +cj +cx +aw +cp +ac +"} +(7,1,1) = {" +ag +au +aH +aP +aT +aP +bb +bk +bu +aw +aw +bP +bZ +ch +aw +aw +cq +ac +"} +(8,1,1) = {" +ah +av +aw +aQ +aw +aQ +bc +bl +aw +aw +aw +aw +ca +aw +aw +aw +cr +ac +"} +(9,1,1) = {" +ai +aw +aw +aw +aw +aw +aw +aU +aw +aw +aw +aw +aw +aw +aw +aw +bR +ac +"} +(10,1,1) = {" +aj +aw +aw +aw +aw +aw +aw +aU +aw +aw +aw +aw +aw +aw +aw +aw +bS +ac +"} +(11,1,1) = {" +ak +ax +aI +aR +aw +aR +bd +bm +bv +bE +aw +bQ +cb +ci +bQ +aw +cs +ac +"} +(12,1,1) = {" +ag +ao +aJ +aP +aU +aP +bb +bn +aP +bF +bI +bN +cc +aP +bF +bI +bN +bX +"} +(13,1,1) = {" +ac +ay +aw +aw +aw +aw +be +ac +bw +bG +aw +bR +ac +bw +ck +aw +bR +ac +"} +(14,1,1) = {" +ad +az +aw +aw +aw +aw +bg +ac +bx +aw +aw +bS +ac +bx +aw +aw +bS +ad +"} +(15,1,1) = {" +al +aA +aw +aw +aw +aw +bh +ac +by +aw +aw +bT +ac +by +aw +aw +bT +ae +"} +(16,1,1) = {" +am +aB +aw +aw +aw +aZ +bi +ac +bz +aw +aw +bU +ac +bz +aw +aw +bU +af +"} +(17,1,1) = {" +ac +aC +aK +aK +aV +bf +ce +ac +bA +aw +bJ +bV +ac +bA +aw +bJ +bV +ac +"} +(18,1,1) = {" +an +aD +aL +aL +aD +aE +aE +bn +aL +aL +aD +aE +cd +aD +aL +aL +aD +aW +"} +(19,1,1) = {" +aa +an +aM +aM +aW +aa +aa +an +aM +aM +aW +aa +aa +an +aM +aM +aW +aa +"} diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index b138d19b513..8171efa7825 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -28,6 +28,46 @@ Thus, the two variables affect pump operation are set in New(): var/id = null var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/binary/pump/CtrlClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + toggle() + return ..() + +/obj/machinery/atmospherics/binary/pump/AICtrlClick() + toggle() + return ..() + +/obj/machinery/atmospherics/binary/pump/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + set_max() + return + +/obj/machinery/atmospherics/binary/pump/AIAltClick() + set_max() + return ..() + +/obj/machinery/atmospherics/binary/pump/proc/toggle() + if(powered()) + on = !on + update_icon() + +/obj/machinery/atmospherics/binary/pump/proc/set_max() + if(powered()) + target_pressure = MAX_OUTPUT_PRESSURE + update_icon() + /obj/machinery/atmospherics/binary/pump/Destroy() if(SSradio) SSradio.remove_object(src, frequency) @@ -203,7 +243,15 @@ Thus, the two variables affect pump operation are set in New(): update_icon() /obj/machinery/atmospherics/binary/pump/attackby(obj/item/W, mob/user, params) - if(!istype(W, /obj/item/wrench)) + if(istype(W, /obj/item/pen)) + var/t = copytext(stripped_input(user, "Enter the name for the pump.", "Rename", name), 1, MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + name = t + return + else if(!istype(W, /obj/item/wrench)) return ..() if(!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn it off first.") diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index 11874172340..6633c1ac10d 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -28,6 +28,46 @@ Thus, the two variables affect pump operation are set in New(): var/id = null var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/binary/volume_pump/CtrlClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + toggle() + return ..() + +/obj/machinery/atmospherics/binary/volume_pump/AICtrlClick() + toggle() + return ..() + +/obj/machinery/atmospherics/binary/volume_pump/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + set_max() + return + +/obj/machinery/atmospherics/binary/volume_pump/AIAltClick() + set_max() + return ..() + +/obj/machinery/atmospherics/binary/volume_pump/proc/toggle() + if(powered()) + on = !on + update_icon() + +/obj/machinery/atmospherics/binary/volume_pump/proc/set_max() + if(powered()) + transfer_rate = MAX_TRANSFER_RATE + update_icon() + /obj/machinery/atmospherics/binary/volume_pump/Destroy() if(SSradio) SSradio.remove_object(src, frequency) @@ -199,7 +239,15 @@ Thus, the two variables affect pump operation are set in New(): update_icon() /obj/machinery/atmospherics/binary/volume_pump/attackby(obj/item/W, mob/user, params) - if(!istype(W, /obj/item/wrench)) + if(istype(W, /obj/item/pen)) + var/t = copytext(stripped_input(user, "Enter the name for the volume pump.", "Rename", name), 1, MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + name = t + return + else if(!istype(W, /obj/item/wrench)) return ..() if(!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn it off first.") diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index c6720e45f6e..a778b01ea86 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -22,6 +22,45 @@ Filter types: var/frequency = 0 var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/trinary/filter/CtrlClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + toggle() + return ..() + +/obj/machinery/atmospherics/trinary/filter/AICtrlClick() + toggle() + return ..() + +/obj/machinery/atmospherics/trinary/filter/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + set_max() + return + +/obj/machinery/atmospherics/trinary/filter/AIAltClick() + set_max() + return ..() + +/obj/machinery/atmospherics/trinary/filter/proc/toggle() + if(powered()) + on = !on + update_icon() + +/obj/machinery/atmospherics/trinary/filter/proc/set_max() + if(powered()) + target_pressure = MAX_OUTPUT_PRESSURE + update_icon() /obj/machinery/atmospherics/trinary/filter/Destroy() if(SSradio) @@ -211,4 +250,16 @@ Filter types: . = TRUE update_icon() - SSnanoui.update_uis(src) \ No newline at end of file + SSnanoui.update_uis(src) + +/obj/machinery/atmospherics/trinary/filter/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/pen)) + var/t = copytext(stripped_input(user, "Enter the name for the filter.", "Rename", name), 1, MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + name = t + return + else + return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index 0c64804b6da..e7c91172e3b 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -12,10 +12,50 @@ //node 3 is the outlet, nodes 1 & 2 are intakes +/obj/machinery/atmospherics/trinary/mixer/CtrlClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + toggle() + return ..() + +/obj/machinery/atmospherics/trinary/mixer/AICtrlClick() + toggle() + return ..() + +/obj/machinery/atmospherics/trinary/mixer/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user) && !issilicon(usr)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + set_max() + return + +/obj/machinery/atmospherics/trinary/mixer/AIAltClick() + set_max() + return ..() + /obj/machinery/atmospherics/trinary/mixer/flipped icon_state = "mmap" flipped = 1 +/obj/machinery/atmospherics/trinary/mixer/proc/toggle() + if(powered()) + on = !on + update_icon() + +/obj/machinery/atmospherics/trinary/mixer/proc/set_max() + if(powered()) + target_pressure = MAX_OUTPUT_PRESSURE + update_icon() + /obj/machinery/atmospherics/trinary/mixer/update_icon(safety = 0) if(flipped) icon_state = "m" @@ -176,4 +216,16 @@ . = TRUE update_icon() - SSnanoui.update_uis(src) \ No newline at end of file + SSnanoui.update_uis(src) + +/obj/machinery/atmospherics/trinary/mixer/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/pen)) + var/t = copytext(stripped_input(user, "Enter the name for the mixer.", "Rename", name), 1, MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + name = t + return + else + return ..() \ No newline at end of file diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 0903ffe7b41..fbc28695ebf 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -52,12 +52,6 @@ #define GRAB_UPGRADING 4 #define GRAB_KILL 5 - -//Hostile Mob AI Status -#define AI_ON 1 -#define AI_IDLE 2 -#define AI_OFF 3 - //Attack types for checking shields/hit reactions #define MELEE_ATTACK 1 diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index c18787f0c0d..84a7043eb61 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -197,33 +197,34 @@ #define MFOAM_IRON 2 //Human Overlays Indexes///////// -#define BODY_LAYER 37 -#define MUTANTRACE_LAYER 36 -#define TAIL_UNDERLIMBS_LAYER 35 //Tail split-rendering. -#define LIMBS_LAYER 34 -#define INTORGAN_LAYER 33 -#define MARKINGS_LAYER 32 -#define UNDERWEAR_LAYER 31 -#define MUTATIONS_LAYER 30 -#define H_DAMAGE_LAYER 29 -#define UNIFORM_LAYER 28 -#define ID_LAYER 27 -#define SHOES_LAYER 26 -#define GLOVES_LAYER 25 -#define EARS_LAYER 24 -#define SUIT_LAYER 23 -#define BELT_LAYER 22 //Possible make this an overlay of somethign required to wear a belt? -#define SUIT_STORE_LAYER 21 -#define BACK_LAYER 20 -#define HEAD_ACCESSORY_LAYER 19 -#define FHAIR_LAYER 18 -#define GLASSES_LAYER 17 -#define HAIR_LAYER 16 //TODO: make part of head layer? -#define HEAD_ACC_OVER_LAYER 15 //Select-layer rendering. -#define FHAIR_OVER_LAYER 14 //Select-layer rendering. -#define GLASSES_OVER_LAYER 13 //Select-layer rendering. -#define TAIL_LAYER 12 //bs12 specific. this hack is probably gonna come back to haunt me -#define FACEMASK_LAYER 11 +#define BODY_LAYER 38 +#define MUTANTRACE_LAYER 37 +#define TAIL_UNDERLIMBS_LAYER 36 //Tail split-rendering. +#define LIMBS_LAYER 35 +#define INTORGAN_LAYER 34 +#define MARKINGS_LAYER 33 +#define UNDERWEAR_LAYER 32 +#define MUTATIONS_LAYER 31 +#define H_DAMAGE_LAYER 30 +#define UNIFORM_LAYER 29 +#define ID_LAYER 28 +#define SHOES_LAYER 27 +#define GLOVES_LAYER 26 +#define EARS_LAYER 25 +#define SUIT_LAYER 24 +#define BELT_LAYER 23 //Possible make this an overlay of somethign required to wear a belt? +#define SUIT_STORE_LAYER 22 +#define BACK_LAYER 21 +#define HEAD_ACCESSORY_LAYER 20 +#define FHAIR_LAYER 19 +#define GLASSES_LAYER 18 +#define HAIR_LAYER 17 //TODO: make part of head layer? +#define HEAD_ACC_OVER_LAYER 16 //Select-layer rendering. +#define FHAIR_OVER_LAYER 15 //Select-layer rendering. +#define GLASSES_OVER_LAYER 14 //Select-layer rendering. +#define TAIL_LAYER 13 //bs12 specific. this hack is probably gonna come back to haunt me +#define FACEMASK_LAYER 12 +#define OVER_MASK_LAYER 11 //Select-layer rendering. #define HEAD_LAYER 10 #define COLLAR_LAYER 9 #define HANDCUFF_LAYER 8 @@ -234,7 +235,7 @@ #define FIRE_LAYER 3 //If you're on fire #define MISC_LAYER 2 #define FROZEN_LAYER 1 -#define TOTAL_LAYERS 37 +#define TOTAL_LAYERS 38 ///Access Region Codes/// #define REGION_ALL 0 @@ -390,4 +391,11 @@ #define GHOST_ORBIT_TRIANGLE "triangle" #define GHOST_ORBIT_HEXAGON "hexagon" #define GHOST_ORBIT_SQUARE "square" -#define GHOST_ORBIT_PENTAGON "pentagon" \ No newline at end of file +#define GHOST_ORBIT_PENTAGON "pentagon" + +//suit sensors: sensor_mode defines + +#define SENSOR_OFF 0 +#define SENSOR_LIVING 1 +#define SENSOR_VITALS 2 +#define SENSOR_COORDS 3 \ No newline at end of file diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 0f05c08b2f7..284b0e4d745 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -94,6 +94,13 @@ #define APPEARANCE_ALL_BODY APPEARANCE_ALL_HAIR|APPEARANCE_HEAD_ACCESSORY|APPEARANCE_MARKINGS|APPEARANCE_BODY_ACCESSORY|APPEARANCE_ALT_HEAD #define APPEARANCE_ALL 32767 +//If you add a new status, be sure to add a list for it to the simple_animals global in _globalvars/lists/mobs.dm +//Hostile Mob AI Status +#define AI_ON 1 +#define AI_IDLE 2 +#define AI_OFF 3 +#define AI_Z_OFF 4 + // Intents #define INTENT_HELP "help" #define INTENT_DISARM "disarm" diff --git a/code/__DEFINES/snpc.dm b/code/__DEFINES/snpc.dm deleted file mode 100644 index 8d4768005cd..00000000000 --- a/code/__DEFINES/snpc.dm +++ /dev/null @@ -1,23 +0,0 @@ -#define SNPC_MAX_RANGE_FIND 32 -#define SNPC_MIN_RANGE_FIND 16 -#define SNPC_FUZZY_CHANCE_HIGH 85 -#define SNPC_FUZZY_CHANCE_LOW 50 -#define SNPC_CHANCE_TALK 15 - -#define SNPC_BRUTE 1 -#define SNPC_STEALTH 2 -#define SNPC_MARTYR 3 -#define SNPC_PSYCHO 4 - -#define SNPC_INTERACTING 2 -#define SNPC_TRAVEL 4 -#define SNPC_FIGHTING 8 -#define SNPC_SPECIAL 16 - -#define TRAIT_ROBUST 2 -#define TRAIT_UNROBUST 4 -#define TRAIT_SMART 8 -#define TRAIT_DUMB 16 -#define TRAIT_MEAN 32 -#define TRAIT_FRIENDLY 64 -#define TRAIT_THIEVING 128 \ No newline at end of file diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index f1e6f38a2d4..6b5807deaef 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -124,9 +124,13 @@ . += A //Like typesof() or subtypesof(), but returns a typecache instead of a list -/proc/typecacheof(path, ignore_root_path) +/proc/typecacheof(path, ignore_root_path, only_root_path = FALSE) if(ispath(path)) - var/list/types = ignore_root_path ? subtypesof(path) : typesof(path) + var/list/types = list() + if(only_root_path) + types = list(path) + else + types = ignore_root_path ? subtypesof(path) : typesof(path) var/list/L = list() for(var/T in types) L[T] = TRUE @@ -140,8 +144,11 @@ L[T] = TRUE else for(var/P in pathlist) - for(var/T in typesof(P)) - L[T] = TRUE + if(only_root_path) + L[P] = TRUE + else + for(var/T in typesof(P)) + L[T] = TRUE return L //Removes any null entries from the list diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index fd5fd510e40..c567ba7adb2 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -491,7 +491,7 @@ GLOBAL_LIST_INIT(do_after_once_tracker, list()) to_chat(user, "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];") to_chat(user, "Location = [location_description];") to_chat(user, "[special_role_description]") - to_chat(user, "(PM) ([ADMIN_PP(M,"PP")]) ([ADMIN_VV(M,"VV")]) ([ADMIN_SM(M,"SM")]) ([ADMIN_FLW(M,"FLW")]) (CA)") + to_chat(user, "(PM) ([ADMIN_PP(M,"PP")]) ([ADMIN_VV(M,"VV")]) ([ADMIN_SM(M,"SM")]) ([ADMIN_FLW(M,"FLW")]) (CA)") // Gets the first mob contained in an atom, and warns the user if there's not exactly one /proc/get_mob_in_atom_with_warning(atom/A, mob/user = usr) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 5b639cc80f8..b90f7502e65 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -113,9 +113,14 @@ /proc/typing_input(mob/user, message = "", title = "", default = "") if(user.client.checkTyping()) // Prevent double windows return null - user.client.typing = TRUE + var/client/C = user.client // Save it in a var in case the client disconnects from the mob + C.typing = TRUE var/msg = input(user, message, title, default) as text|null - user.client.typing = FALSE + if(!C) + return null + C.typing = FALSE + if(!user || C != user.client) // User got out of the mob for some reason or the mob is gone + return null return msg //Filters out undesirable characters from names diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index 1e35e150a25..6dc18d4fdff 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -3,7 +3,7 @@ var/datum/configuration/config = null var/host = null var/join_motd = null GLOBAL_VAR(join_tos) -var/game_version = "Custom ParaCode" +var/game_version = "ParaCode" var/changelog_hash = md5('html/changelog.html') //used to check if the CL changed var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 544) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 551b729028e..b6fcae25061 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -22,8 +22,7 @@ GLOBAL_LIST_INIT(living_mob_list, list()) //List of all alive mobs, including GLOBAL_LIST_INIT(dead_mob_list, list()) //List of all dead mobs, including clientless. Excludes /mob/new_player GLOBAL_LIST_INIT(respawnable_list, list()) //List of all mobs, dead or in mindless creatures that still be respawned. GLOBAL_LIST_INIT(non_respawnable_keys, list()) //List of ckeys that are excluded from respawning for remainder of round. -GLOBAL_LIST_INIT(simple_animal_list, list()) //List of all simple animals, including clientless -GLOBAL_LIST_INIT(snpc_list, list()) //List of all snpc's, including clientless +GLOBAL_LIST_INIT(simple_animals, list(list(), list(), list(), list())) //One for each AI_* status define, List of all simple animals, including clientless GLOBAL_LIST_INIT(bots_list, list()) //List of all bots(beepsky, medibots,etc) GLOBAL_LIST_INIT(med_hud_users, list()) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 906bacf0e54..e6f463d6f23 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -19,7 +19,6 @@ GLOBAL_LIST_INIT(navigation_computers, list()) GLOBAL_LIST_INIT(all_areas, list()) GLOBAL_LIST_INIT(machines, list()) -GLOBAL_LIST_INIT(processing_power_items, list()) //items that ask to be called every cycle GLOBAL_LIST_INIT(rcd_list, list()) //list of Rapid Construction Devices. GLOBAL_LIST_INIT(apcs, list()) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 0b8c8d58a95..77443fb4ab2 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -1,6 +1,9 @@ var/global/obj/effect/overlay/plmaster = null var/global/obj/effect/overlay/slmaster = null +GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule +GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) + // Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it. var/global/obj/item/radio/intercom/global_announcer = create_global_announcer() var/global/obj/item/radio/intercom/command/command_announcer = create_command_announcer() diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm index 2d635996b30..e997a672e1f 100644 --- a/code/_globalvars/station.dm +++ b/code/_globalvars/station.dm @@ -1,6 +1,3 @@ var/global/datum/datacore/data_core = null -var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second) -var/CHARGELEVEL = 0.001 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) - var/map_name = "Unknown" //The name of the map that is loaded. Assigned in world/New() \ No newline at end of file diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index c84a64722c5..22921f5228d 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -49,7 +49,7 @@ if(!can_see(A)) if(isturf(A)) //On unmodified clients clicking the static overlay clicks the turf underneath return // So there's no point messaging admins - message_admins("[key_name_admin(src)] might be running a modified client! (failed can_see on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))") + add_attack_logs(src, src, "[key_name_admin(src)] might be running a modified client! (failed can_see on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))", ATKLOG_ALL) var/message = "[key_name(src)] might be running a modified client! (failed can_see on AI click of [A]([COORD(pixel_turf)]))" log_admin(message) send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))") @@ -64,7 +64,7 @@ else if(pixel_turf.obscured) log_admin("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)])") - message_admins("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))") + add_attack_logs(src, src, "[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))", ATKLOG_ALL) send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))") return diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 24e58b502ad..286f8ce7095 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -122,6 +122,10 @@ throw_item(A) return + if(isLivingSSD(A)) + if(client && client.send_ssd_warning(A)) + return + var/obj/item/W = get_active_hand() if(W == A) diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 32a9d7cf46d..5780e86a298 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -17,6 +17,7 @@ //Hide/Show Action Buttons ... Button /obj/screen/movable/action_button/hide_toggle name = "Hide Buttons" + desc = "Shift-click any button to reset its position. Alt-click to reset all buttons to their default positions." icon = 'icons/mob/actions/actions.dmi' icon_state = "bg_default" var/hidden = 0 @@ -24,8 +25,18 @@ /obj/screen/movable/action_button/hide_toggle/Click(location,control,params) var/list/modifiers = params2list(params) if(modifiers["shift"]) - moved = 0 - return 1 + moved = FALSE + usr.update_action_buttons(TRUE) + return TRUE + if(modifiers["alt"]) + for(var/V in usr.actions) + var/datum/action/A = V + var/obj/screen/movable/action_button/B = A.button + B.moved = FALSE + moved = FALSE + usr.update_action_buttons(TRUE) + to_chat(usr, "Action button positions have been reset.") + return TRUE usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden hidden = usr.hud_used.action_buttons_hidden @@ -36,6 +47,15 @@ UpdateIcon() usr.update_action_buttons() +/obj/screen/movable/action_button/hide_toggle/AltClick(mob/user) + for(var/V in user.actions) + var/datum/action/A = V + var/obj/screen/movable/action_button/B = A.button + B.moved = FALSE + if(moved) + moved = FALSE + user.update_action_buttons(TRUE) + to_chat(user, "Action button positions have been reset.") /obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(mob/living/user) if(isalien(user)) diff --git a/code/controllers/Processes/npcai.dm b/code/controllers/Processes/npcai.dm deleted file mode 100644 index 127429efd34..00000000000 --- a/code/controllers/Processes/npcai.dm +++ /dev/null @@ -1,41 +0,0 @@ -var/global/datum/controller/process/npcai/npcai_master - -/datum/controller/process/npcai - var/current_cycle - -/datum/controller/process/npcai/setup() - name = "npc ai" - schedule_interval = 20 // every 2 seconds - start_delay = 16 - log_startup_progress("NPC ticker starting up.") - -/datum/controller/process/npcai/started() - ..() - if(!GLOB.simple_animal_list) - GLOB.simple_animal_list = list() - if(!GLOB.snpc_list) - GLOB.snpc_list = list() - -/datum/controller/process/npcai/statProcess() - ..() - stat(null, "[GLOB.simple_animal_list.len] simple animals") - stat(null, "[GLOB.snpc_list.len] SNPC's") - -/datum/controller/process/npcai/doWork() - for(last_object in GLOB.simple_animal_list) - var/mob/living/simple_animal/M = last_object - if(istype(M) && !QDELETED(M)) - if(!M.client && M.stat == CONSCIOUS) - try - M.process_ai() - catch(var/exception/e) - catchException(e, M) - SCHECK - else - catchBadType(M) - GLOB.simple_animal_list -= M - - current_cycle++ - - -DECLARE_GLOBAL_CONTROLLER(npcai, npcai_master) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 01cf57aad9e..12b5b0fd1a5 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -1,5 +1,7 @@ /datum/configuration var/server_name = null // server name (for world name / status) + var/server_tag_line = null // server tagline (for showing on hub entry) + var/server_extra_features = null // server-specific extra features (for hub entry) var/server_suffix = 0 // generate numeric suffix based on server port var/minimum_client_build = 1421 // Build 1421 due to the middle mouse button exploit @@ -53,7 +55,6 @@ var/humans_need_surnames = 0 var/allow_random_events = 0 // enables random events mid-round when set to 1 var/allow_ai = 1 // allow ai job - var/hostedby = null var/respawn = 0 var/guest_jobban = 1 var/usewhitelist = 0 @@ -69,6 +70,9 @@ var/assistantlimit = 0 //enables assistant limiting var/assistantratio = 2 //how many assistants to security members + var/auto_cryo_ssd_mins = 0 + var/ssd_warning = 0 + var/prob_free_golems = 75 //chance for free golems spawners to appear roundstart var/unrestricted_free_golems = FALSE //if true, free golems can appear on all roundtypes @@ -213,7 +217,7 @@ // Automatic localhost admin disable var/disable_localhost_admin = 0 - + //Start now warning var/start_now_confirmation = 0 @@ -293,6 +297,12 @@ if("shadowling_max_age") config.shadowling_max_age = text2num(value) + if("auto_cryo_ssd_mins") + config.auto_cryo_ssd_mins = text2num(value) + + if("ssd_warning") + config.ssd_warning = 1 + if("log_ooc") config.log_ooc = 1 @@ -358,10 +368,10 @@ if("no_dead_vote") config.vote_no_dead = 1 - + if("vote_autotransfer_initial") config.vote_autotransfer_initial = text2num(value) - + if("vote_autotransfer_interval") config.vote_autotransfer_interval = text2num(value) @@ -386,6 +396,12 @@ if("servername") config.server_name = value + if("server_tag_line") + config.server_tag_line = value + + if("server_extra_features") + config.server_extra_features = value + if("serversuffix") config.server_suffix = 1 @@ -395,9 +411,6 @@ if("nudge_script_path") config.nudge_script_path = value - if("hostedby") - config.hostedby = value - if("server") config.server = value @@ -645,7 +658,7 @@ if("disable_karma") config.disable_karma = 1 - + if("start_now_confirmation") config.start_now_confirmation = 1 diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm new file mode 100644 index 00000000000..2dad0abca0f --- /dev/null +++ b/code/controllers/subsystem/idlenpcpool.dm @@ -0,0 +1,41 @@ +SUBSYSTEM_DEF(idlenpcpool) + name = "Idling NPC Pool" + flags = SS_POST_FIRE_TIMING|SS_BACKGROUND + priority = FIRE_PRIORITY_IDLE_NPC + wait = 60 + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + var/list/currentrun = list() + var/static/list/idle_mobs_by_zlevel[][] + +/datum/controller/subsystem/idlenpcpool/stat_entry() + var/list/idlelist = GLOB.simple_animals[AI_IDLE] + var/list/zlist = GLOB.simple_animals[AI_Z_OFF] + ..("IdleNPCS:[idlelist.len]|Z:[zlist.len]") + +/datum/controller/subsystem/idlenpcpool/Initialize(start_timeofday) + idle_mobs_by_zlevel = new /list(world.maxz,0) + return ..() + +/datum/controller/subsystem/idlenpcpool/fire(resumed = FALSE) + if(!resumed) + var/list/idlelist = GLOB.simple_animals[AI_IDLE] + src.currentrun = idlelist.Copy() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + + while(currentrun.len) + var/mob/living/simple_animal/SA = currentrun[currentrun.len] + --currentrun.len + if(!SA) + GLOB.simple_animals[AI_IDLE] -= SA + continue + + if(!SA.ckey) + if(SA.stat != DEAD) + SA.handle_automated_movement() + if(SA.stat != DEAD) + SA.consider_wakeup() + if(MC_TICK_CHECK) + return \ No newline at end of file diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index ccd83640aa6..02f2681b22d 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -8,6 +8,8 @@ SUBSYSTEM_DEF(jobs) var/list/name_occupations = list() //Dict of all jobs, keys are titles var/list/type_occupations = list() //Dict of all jobs, keys are types var/list/prioritized_jobs = list() // List of jobs set to priority by HoP/Captain + var/list/id_change_records = list() // List of all job transfer records + var/list/id_change_counter = 1 //Players who need jobs var/list/unassigned = list() //Debug info @@ -601,3 +603,84 @@ SUBSYSTEM_DEF(jobs) spawn(0) to_chat(H, "Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]") + +/datum/controller/subsystem/jobs/proc/format_jobs_for_id_computer(obj/item/card/id/tgtcard) + var/list/jobs_to_formats = list() + if(tgtcard) + var/mob/M = tgtcard.getPlayer() + for(var/datum/job/job in occupations) + if(tgtcard.assignment && tgtcard.assignment == job.title) + jobs_to_formats[job.title] = "disabled" // the job they already have is pre-selected + else if(!job.would_accept_job_transfer_from_player(M)) + jobs_to_formats[job.title] = "linkDiscourage" // karma jobs they don't have available are discouraged + else if(job.total_positions && !job.current_positions && job.title != "Civilian") + jobs_to_formats[job.title] = "linkEncourage" // jobs with nobody doing them at all are encouraged + else if(job.total_positions >= 0 && job.current_positions >= job.total_positions) + jobs_to_formats[job.title] = "linkDiscourage" // jobs that are full (no free positions) are discouraged + return jobs_to_formats + + +/datum/controller/subsystem/jobs/proc/log_job_transfer(transferee, oldvalue, newvalue, whodidit) + id_change_records["[id_change_counter]"] = list("transferee" = transferee, "oldvalue" = oldvalue, "newvalue" = newvalue, "whodidit" = whodidit, "timestamp" = station_time_timestamp()) + id_change_counter++ + +/datum/controller/subsystem/jobs/proc/slot_job_transfer(oldtitle, newtitle) + var/datum/job/oldjobdatum = SSjobs.GetJob(oldtitle) + var/datum/job/newjobdatum = SSjobs.GetJob(newtitle) + if(istype(oldjobdatum) && oldjobdatum.current_positions > 0 && istype(newjobdatum)) + if(!(oldjobdatum.title in command_positions) && !(newjobdatum.title in command_positions)) + oldjobdatum.current_positions-- + newjobdatum.current_positions++ + + +/datum/controller/subsystem/jobs/proc/fetch_transfer_record_html(var/centcom) + var/record_html = "" + + var/table_headers = list("Crewman", "Old Rank", "New Rank", "Authorized By", "Time") + var/hidden_fields = list("deletedby") + if(centcom) + table_headers += "Deleted By" + record_html += "" + for(var/thisheader in table_headers) + record_html += "" + record_html += "" + + var/visible_record_count = 0 + for(var/thisid in id_change_records) + var/thisrecord = id_change_records[thisid] + + if(thisrecord["deletedby"] && !centcom) + continue + + record_html += "" + for(var/lkey in thisrecord) + if(lkey in hidden_fields) + if(centcom) + record_html += "" + else + continue + else + record_html += "" + record_html += "" + visible_record_count++ + + record_html += "
[thisheader]
[thisrecord[lkey]][thisrecord[lkey]]
" + + if(!visible_record_count) + return "No records on file yet." + return record_html + +/datum/controller/subsystem/jobs/proc/delete_log_records(sourceuser, delete_all) + . = 0 + if(!sourceuser) + return + var/list/new_id_change_records = list() + for(var/thisid in id_change_records) + var/thisrecord = id_change_records[thisid] + if(!thisrecord["deletedby"]) + if(delete_all || thisrecord["whodidit"] == sourceuser) + thisrecord["deletedby"] = sourceuser + .++ + new_id_change_records["[id_change_counter]"] = thisrecord + id_change_counter++ + id_change_records = new_id_change_records \ No newline at end of file diff --git a/code/controllers/subsystem/machinery.dm b/code/controllers/subsystem/machinery.dm index 7038ad4db4f..9a73c1dbabb 100644 --- a/code/controllers/subsystem/machinery.dm +++ b/code/controllers/subsystem/machinery.dm @@ -64,23 +64,6 @@ SUBSYSTEM_DEF(machines) if(MC_TICK_CHECK) return -/datum/controller/subsystem/machines/proc/process_premachines(resumed = 0) - /* Literally exists as snowflake for fucking powersinks goddamnit */ - if(!resumed) - src.currentrun = GLOB.processing_power_items.Copy() - //cache for sanid speed (lists are references anyways) - var/list/currentrun = src.currentrun - while(currentrun.len) - var/obj/item/I = currentrun[currentrun.len] - currentrun.len-- - if(!QDELETED(I)) - if(!I.pwr_drain()) - GLOB.processing_power_items.Remove(I) - else - GLOB.processing_power_items.Remove(I) - if(MC_TICK_CHECK) - return - /datum/controller/subsystem/machines/proc/process_machines(resumed = 0) var/seconds = wait * 0.1 if(!resumed) @@ -113,13 +96,6 @@ SUBSYSTEM_DEF(machines) if(state != SS_RUNNING) return resumed = 0 - currentpart = SSMACHINES_PREMACHINERY - - if(currentpart == SSMACHINES_PREMACHINERY || !resumed) - process_premachines(resumed) - if(state != SS_RUNNING) - return - resumed = 0 currentpart = SSMACHINES_MACHINERY if(currentpart == SSMACHINES_MACHINERY || !resumed) diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm index d19396af767..20061d7489b 100644 --- a/code/controllers/subsystem/mobs.dm +++ b/code/controllers/subsystem/mobs.dm @@ -1,14 +1,19 @@ SUBSYSTEM_DEF(mobs) name = "Mobs" priority = FIRE_PRIORITY_MOBS - flags = SS_KEEP_TIMING | SS_NO_INIT + flags = SS_KEEP_TIMING runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME var/list/currentrun = list() + var/static/list/clients_by_zlevel[][] /datum/controller/subsystem/mobs/stat_entry() ..("P:[GLOB.mob_list.len]") +/datum/controller/subsystem/mobs/Initialize(start_timeofday) + clients_by_zlevel = new /list(world.maxz,0) + return ..() + /datum/controller/subsystem/mobs/fire(resumed = 0) var/seconds = wait * 0.1 if(!resumed) diff --git a/code/controllers/subsystem/npcai.dm b/code/controllers/subsystem/npcai.dm deleted file mode 100644 index f8fa3a5aa0f..00000000000 --- a/code/controllers/subsystem/npcai.dm +++ /dev/null @@ -1,24 +0,0 @@ -SUBSYSTEM_DEF(npcai) - name = "NPC AI" // Simple AI controller, isolated from the SNPC one (NPCPool). - flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND - priority = FIRE_PRIORITY_NPC - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - var/list/simple_animal_list = list() - -/datum/controller/subsystem/npcai/stat_entry() - ..("SimAnimals:[simple_animal_list.len]") - -/datum/controller/subsystem/npcai/fire(resumed = FALSE) - if(!resumed) - src.simple_animal_list = simple_animal_list.Copy() - for(var/mob/living/simple_animal/M in simple_animal_list) - if(istype(M) && !QDELETED(M)) - if(!M.client && M.stat == CONSCIOUS) - M.process_ai() - if(MC_TICK_CHECK) - return - else - simple_animal_list -= M - -/datum/controller/subsystem/npcai/Recover() - simple_animal_list = SSnpcai.simple_animal_list \ No newline at end of file diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index b06d33f6f32..0de306b12eb 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -1,127 +1,33 @@ -#define PROCESSING_NPCS 0 -#define PROCESSING_DELEGATES 1 -#define PROCESSING_ASSISTANTS 2 - SUBSYSTEM_DEF(npcpool) - name = "NPC Pool" - flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND - priority = FIRE_PRIORITY_NPC - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + name = "NPC Pool" + flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND + priority = FIRE_PRIORITY_NPC + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - var/list/canBeUsed = list() - var/list/needsDelegate = list() - var/list/needsAssistant = list() - - var/list/processing = list() - var/list/currentrun = list() - var/stage + var/list/currentrun = list() /datum/controller/subsystem/npcpool/stat_entry() - ..("NPCS:[processing.len]|D:[needsDelegate.len]|A:[needsAssistant.len]|U:[canBeUsed.len]") - -/datum/controller/subsystem/npcpool/proc/stop_processing(mob/living/carbon/human/interactive/I) - processing -= I - currentrun -= I - needsDelegate -= I - canBeUsed -= I - needsAssistant -= I + var/list/activelist = GLOB.simple_animals[AI_ON] + ..("SimpleAnimals:[activelist.len]") /datum/controller/subsystem/npcpool/fire(resumed = FALSE) - //bot delegation and coordination systems - //General checklist/Tasks for delegating a task or coordinating it (for SNPCs) - // 1. Bot proximity to task target: if too far, delegate, if close, coordinate - // 2. Bot Health/status: check health with bots in local area, if their health is higher, delegate task to them, else coordinate - // 3. Process delegation: if a bot (or bots) has been delegated, assign them to the task. - // 4. Process coordination: if a bot(or bots) has been asked to coordinate, assign them to help. - // 5. Do all assignments: goes through the delegated/coordianted bots and assigns the right variables/tasks to them. - if (!resumed) - currentrun = processing.Copy() - stage = PROCESSING_NPCS - //cache for sanic speed (lists are references anyways) - var/list/cachecurrentrun = currentrun - var/list/cachecanBeUsed = canBeUsed + if(!resumed) + var/list/activelist = GLOB.simple_animals[AI_ON] + src.currentrun = activelist.Copy() - if(stage == PROCESSING_NPCS) - while(cachecurrentrun.len) - var/mob/living/carbon/human/interactive/thing = cachecurrentrun[cachecurrentrun.len] - --cachecurrentrun.len + var/list/currentrun = src.currentrun - thing.InteractiveProcess() + while(currentrun.len) + var/mob/living/simple_animal/SA = currentrun[currentrun.len] + --currentrun.len - var/checkInRange = view(SNPC_MAX_RANGE_FIND,thing) - if(thing.IsDeadOrIncap(FALSE) || !(locate(thing.TARGET) in checkInRange)) - needsDelegate += thing - else if(thing.doing & SNPC_FIGHTING) - needsAssistant += thing - else - cachecanBeUsed += thing - - if (MC_TICK_CHECK) - return - stage = PROCESSING_DELEGATES - cachecurrentrun = needsDelegate //localcache - currentrun = cachecurrentrun - - if(stage == PROCESSING_DELEGATES) - while(cachecurrentrun.len && cachecanBeUsed.len) - var/mob/living/carbon/human/interactive/check = cachecurrentrun[cachecurrentrun.len] - var/mob/living/carbon/human/interactive/candidate = cachecanBeUsed[cachecanBeUsed.len] - --cachecurrentrun.len - - var/helpProb = 0 - var/list/chfac = check.faction - var/list/canfac = candidate.faction - var/facCount = LAZYLEN(chfac) * LAZYLEN(canfac) - - for(var/C in chfac) - if(C in canfac) - helpProb = min(100,helpProb + 25) - if(helpProb >= 100) - break - - if(facCount == 1 && helpProb) - helpProb = 100 - - if(prob(helpProb) && candidate.takeDelegate(check)) - --cachecanBeUsed.len - candidate.change_eye_color(255, 0, 0) - candidate.update_icons() - - if(MC_TICK_CHECK) - return - stage = PROCESSING_ASSISTANTS - cachecurrentrun = needsAssistant //localcache - currentrun = cachecurrentrun - - //no need for the stage check - - while(cachecurrentrun.len && cachecanBeUsed.len) - var/mob/living/carbon/human/interactive/check = cachecurrentrun[cachecurrentrun.len] - var/mob/living/carbon/human/interactive/candidate = cachecanBeUsed[cachecanBeUsed.len] - --cachecurrentrun.len - - var/helpProb = 0 - var/list/chfac = check.faction - var/list/canfac = candidate.faction - var/facCount = LAZYLEN(chfac) * LAZYLEN(canfac) - - for(var/C in chfac) - if(C in canfac) - helpProb = min(100,helpProb + 25) - if(helpProb >= 100) - break - - if(facCount == 1 && helpProb) - helpProb = 100 - - if(prob(helpProb) && candidate.takeDelegate(check,FALSE)) - --cachecanBeUsed.len - candidate.change_eye_color(255, 255, 0) - candidate.update_icons() - - if(!cachecurrentrun.len || MC_TICK_CHECK) //don't change SS state if it isn't necessary - return - -/datum/controller/subsystem/npcpool/Recover() - processing = SSnpcpool.processing \ No newline at end of file + if(!SA.ckey && !SA.notransform) + if(SA.stat != DEAD) + SA.handle_automated_movement() + if(SA.stat != DEAD) + SA.handle_automated_action() + if(SA.stat != DEAD) + SA.handle_automated_speech() + if(MC_TICK_CHECK) + return \ No newline at end of file diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 83217fde0bd..40f671ae383 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -80,9 +80,9 @@ if("Mob") debug_variables(SSmobs) feedback_add_details("admin_verb","DMob") - if("NPC AI") - debug_variables(SSnpcai) - feedback_add_details("admin_verb","DNPCAI") + if("NPC Pool") + debug_variables(SSnpcpool) + feedback_add_details("admin_verb","DNPCPool") if("Shuttle") debug_variables(SSshuttle) feedback_add_details("admin_verb","DShuttle") diff --git a/code/datums/action.dm b/code/datums/action.dm index d316bd29b41..5972579834b 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -107,6 +107,7 @@ /datum/action/item_action check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS var/use_itemicon = TRUE + /datum/action/item_action/New(Target, custom_icon, custom_icon_state) ..() var/obj/item/I = target @@ -406,6 +407,19 @@ name = "Use [target.name]" button.name = name +/datum/action/item_action/voice_changer/toggle + name = "Toggle Voice Changer" + +/datum/action/item_action/voice_changer/voice + name = "Set Voice" + +/datum/action/item_action/voice_changer/voice/Trigger() + if(!IsAvailable()) + return FALSE + + var/obj/item/voice_changer/V = target + V.set_voice(usr) + // for clothing accessories like holsters /datum/action/item_action/accessory check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS diff --git a/code/datums/diseases/critical.dm b/code/datums/diseases/critical.dm index 82748802cce..55b10fbf971 100644 --- a/code/datums/diseases/critical.dm +++ b/code/datums/diseases/critical.dm @@ -19,7 +19,7 @@ spread_text = "The patient is in shock" max_stages = 3 spread_flags = SPECIAL - cure_text = "Saline Solution" + cure_text = "Saline-Glucose Solution" cures = list("salglu_solution") cure_chance = 10 viable_mobtypes = list(/mob/living/carbon/human) @@ -80,7 +80,7 @@ spread_text = "The patient is having a cardiac emergency" max_stages = 3 spread_flags = SPECIAL - cure_text = "Cardiac Stimulants" + cure_text = "Atropine or Epinephrine" cures = list("atropine", "epinephrine") cure_chance = 10 needs_all_cures = FALSE diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 6f589101f2f..65b3940cde2 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -29,6 +29,7 @@ var/memory var/assigned_role //assigned role is what job you're assigned to when you join the station. + var/playtime_role //if set, overrides your assigned_role for the purpose of playtime awards. Set by IDcomputer when your ID is changed. var/special_role //special roles are typically reserved for antags or roles like ERT. If you want to avoid a character being automatically announced by the AI, on arrival (becuase they're an off station character or something); ensure that special_role and assigned_role are equal. var/offstation_role = FALSE //set to true for ERT, deathsquad, abductors, etc, that can go from and to z2 at will and shouldn't be antag targets var/list/restricted_roles = list() diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 8c172f3592f..184f1155da2 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -25,6 +25,7 @@ var/list/implants = null var/list/cybernetic_implants = null + var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns /datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) //to be overriden for customization depending on client prefs,species etc @@ -151,4 +152,10 @@ H.r_store.add_fingerprint(H, 1) if(H.wear_pda) H.wear_pda.add_fingerprint(H, 1) - return 1 \ No newline at end of file + return 1 + +/datum/outfit/proc/get_chameleon_disguise_info() + var/list/types = list(uniform, suit, back, belt, gloves, shoes, head, mask, l_ear, r_ear, glasses, id, l_pocket, r_pocket, suit_store, r_hand, l_hand, pda) + types += chameleon_extras + listclearnulls(types) + return types diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 3ac473edfeb..09282ec77b1 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -123,7 +123,7 @@ /datum/outfit/admin/syndicate/spy name = "Syndicate Spy" uniform = /obj/item/clothing/under/suit_jacket/really_black - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip uplink_uses = 40 id_access = "Syndicate Agent" @@ -228,7 +228,7 @@ back = /obj/item/storage/backpack belt = /obj/item/storage/belt/utility/full/multitool gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/centcom id = /obj/item/card/id pda = /obj/item/pda @@ -990,7 +990,7 @@ suit = /obj/item/clothing/suit/hooded/chaplain_hoodie back = /obj/item/storage/backpack gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/syndicate id = /obj/item/card/id/syndicate l_hand = /obj/item/twohanded/dualsaber/red @@ -1021,7 +1021,7 @@ suit = /obj/item/clothing/suit/draculacoat back = /obj/item/storage/backpack gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/syndicate id = /obj/item/card/id backpack_contents = list( diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index d20255bc57c..53517d5dbc9 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -25,6 +25,11 @@ port_id = "ferry" name = "Base Shuttle Template (Ferry)" +/datum/map_template/shuttle/admin + port_id = "admin" + name = "Base Shuttle Template (Admin)" + + // Shuttles start here: @@ -117,3 +122,13 @@ definitely no zombifyin' reagents!" admin_notes = "Meat currently contains no zombifying reagents, people on \ meatspike must be spawned in." + +/datum/map_template/shuttle/admin/hospital + suffix = "hospital" + name = "NHV Asclepius" + description = "Nanostrasen Hospital ship, for medical assistance during disasters." + +/datum/map_template/shuttle/admin/admin + suffix = "admin" + name = "NTV Argos" + description = "Default Admin ship. An older ship used for special operations." diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index ec43330a8eb..8fdaf8c25df 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1073,6 +1073,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containertype = /obj/structure/closet/critter/cow containername = "cow crate" +/datum/supply_packs/organic/pig + name = "Pig Crate" + cost = 25 + containertype = /obj/structure/closet/critter/pig + containername = "pig crate" + /datum/supply_packs/organic/goat name = "Goat Crate" cost = 25 diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index a714e17d236..3a78dfc9b28 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1067,13 +1067,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_tools category = "Stealth and Camouflage Items" -/datum/uplink_item/stealthy_tools/chameleon_jumpsuit - name = "Chameleon Jumpsuit" - desc = "A jumpsuit used to imitate the uniforms of Nanotrasen crewmembers." - reference = "CJ" - item = /obj/item/clothing/under/chameleon - cost = 2 - /datum/uplink_item/stealthy_tools/chameleon_stamp name = "Chameleon Stamp" desc = "A stamp that can be activated to imitate an official Nanotrasen Stamp. The disguised stamp will work exactly like the real stamp and will allow you to forge false documents to gain access or equipment; \ @@ -1092,20 +1085,19 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 35 /datum/uplink_item/stealthy_tools/syndigaloshes - name = "No-Slip Syndicate Shoes" - desc = "These allow you to run on wet floors. They do not work on lubricated surfaces." + name = "No-Slip Chameleon Shoes" + desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \ + They do not work on heavily lubricated surfaces." reference = "NSSS" - item = /obj/item/clothing/shoes/syndigaloshes + item = /obj/item/clothing/shoes/chameleon/noslip cost = 2 excludefrom = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/syndigaloshes/nuke - name = "Tactical No-Slip Brown Shoes" - desc = "These allow you to run on wet floors. They do not work on lubricated surfaces, and the maker swears they're better than normal ones, somehow." - reference = "NNSSS" + reference = "TNSSS" cost = 4 //but they aren't - gamemodes = list(/datum/game_mode/nuclear) excludefrom = list() + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/chamsechud name = "Chameleon Security HUD" @@ -1146,12 +1138,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/card/id/syndicate cost = 2 -/datum/uplink_item/stealthy_tools/voice_changer - name = "Voice Changer" - desc = "A conspicuous gas mask that mimics the voice named on your identification card. When no identification is worn, the mask will render your voice unrecognisable." - reference = "VC" - item = /obj/item/clothing/mask/gas/voice - cost = 3 +/datum/uplink_item/stealthy_tools/chameleon + name = "Chameleon Kit" + desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \ + Due to budget cuts, the shoes don't provide protection against slipping. The set comes with a complementary chameleon stamp." + reference = "CHAM" + item = /obj/item/storage/box/syndie_kit/chameleon + cost = 2 /datum/uplink_item/stealthy_tools/chameleon_proj name = "Chameleon-Projector" @@ -1210,7 +1203,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_tools/clownkit name = "Honk Brand Infiltration Kit" - desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer clown mask, magnetic clown shoes, and standard clown outfit, tools, and backpack." + desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer mask, magnetic clown shoes, and standard clown outfit, tools, and backpack." reference = "HBIK" item = /obj/item/storage/backpack/clown/syndie cost = 6 @@ -1544,10 +1537,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 12 /datum/uplink_item/cyber_implants/reviver - name = "Reviver Implant" - desc = "This implant will attempt to revive you if you lose consciousness. Comes with an automated implanting tool." + name = "Hardened Reviver Implant" + desc = "This implant will attempt to revive you if you lose consciousness. It is invulnerable to EMPs. Comes with an automated implanting tool." reference = "CIR" - item = /obj/item/organ/internal/cyberimp/chest/reviver + item = /obj/item/organ/internal/cyberimp/chest/reviver/hardened cost = 8 // POINTLESS BADASSERY diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 067223c0285..5d508685e5b 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -63,6 +63,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station var/xenobiology_compatible = FALSE //Can the Xenobio management console transverse this area by default? var/nad_allowed = FALSE //is the station NAD allowed on this area? + var/fast_despawn = FALSE + /*Adding a wizard area teleport list because motherfucking lag -- Urist*/ /*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/ var/list/teleportlocs = list() @@ -333,7 +335,7 @@ var/list/ghostteleportlocs = list() icon_state = "shuttle" /area/shuttle/administration - name = "\improper Administration Shuttle" + name = "\improper Nanotrasen Vessel" icon_state = "shuttlered" /area/shuttle/administration/centcom @@ -855,10 +857,12 @@ var/list/ghostteleportlocs = list() /area/prison/solitary name = "\improper Solitary Confinement" icon_state = "brig" + fast_despawn = TRUE /area/prison/cell_block name = "\improper Prison Cell Block" icon_state = "brig" + fast_despawn = TRUE /area/prison/cell_block/A name = "\improper Prison Cell Block A" @@ -1676,6 +1680,7 @@ var/list/ghostteleportlocs = list() /area/security/permabrig name = "\improper Prison Wing" icon_state = "sec_prison_perma" + fast_despawn = TRUE /area/security/prison name = "\improper Prison Wing" diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 9383d0e78ad..3ef94ae9866 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -220,7 +220,12 @@ destination.Entered(src) for(var/atom/movable/AM in destination) AM.Crossed(src) - + var/turf/oldturf = get_turf(old_loc) + var/turf/destturf = get_turf(destination) + var/old_z = (oldturf ? oldturf.z : null) + var/dest_z = (destturf ? destturf.z : null) + if(old_z != dest_z) + onTransitZ(old_z, dest_z) if(isturf(destination) && opacity) var/turf/new_loc = destination new_loc.reconsider_lights() @@ -233,6 +238,11 @@ return 1 +/atom/movable/proc/onTransitZ(old_z,new_z) + for(var/item in src) // Notify contents of Z-transition. This can be overridden IF we know the items contents do not care. + var/atom/movable/AM = item + AM.onTransitZ(old_z,new_z) + /mob/living/forceMove(atom/destination) if(buckled) addtimer(CALLBACK(src, .proc/check_buckled), 1, TIMER_UNIQUE) diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index bd934eefb44..0482a8e19ae 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -135,4 +135,9 @@ else log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks a overmind.mind.") else - log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks an overmind.") \ No newline at end of file + log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks an overmind.") + +/obj/structure/blob/core/onTransitZ(old_z, new_z) + if(overmind && is_station_level(new_z)) + overmind.forceMove(get_turf(src)) + return ..() \ No newline at end of file diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index fde2c9bf8a3..fd6aa8c9f4a 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -23,13 +23,12 @@ /obj/structure/blob/factory/run_action() if(spores.len >= max_spores) - return 0 + return if(spore_delay > world.time) - return 0 + return + flick("blob_factory_glow", src) spore_delay = world.time + 100 // 10 seconds var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore(src.loc, src) BS.color = overmind.blob_reagent_datum.complementary_color BS.overmind = overmind overmind.blob_mobs.Add(BS) - return 0 - diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm index 7198d3ef081..14c240f681b 100644 --- a/code/game/gamemodes/blob/blobs/resource.dm +++ b/code/game/gamemodes/blob/blobs/resource.dm @@ -13,13 +13,9 @@ qdel(src) /obj/structure/blob/resource/run_action() - if(resource_delay > world.time) - return 0 - + return + flick("blob_resource_glow", src) resource_delay = world.time + 40 // 4 seconds - if(overmind) overmind.add_points(1) - return 0 - diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 748823829b5..61196c9862f 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -331,17 +331,13 @@ /mob/camera/blob/verb/rally_spores_power() set category = "Blob" - set name = "Rally Spores (5)" + set name = "Rally Spores" set desc = "Rally the spores to move to your location." var/turf/T = get_turf(src) rally_spores(T) /mob/camera/blob/proc/rally_spores(var/turf/T) - - if(!can_buy(5)) - return - to_chat(src, "You rally your spores.") var/list/surrounding_turfs = block(locate(T.x - 1, T.y - 1, T.z), locate(T.x + 1, T.y + 1, T.z)) @@ -373,12 +369,12 @@ if(!N) to_chat(src, "A node is required to birth your offspring...") return - + if(!can_buy(100)) return split_used = TRUE - + new /obj/structure/blob/core/ (get_turf(N), 200, null, blob_core.point_rate, "offspring") qdel(N) @@ -399,7 +395,8 @@ else to_chat(usr, "You broadcast with your minions, [speak_text]") for(var/mob/living/simple_animal/hostile/blob_minion in blob_mobs) - blob_minion.say(speak_text) + if(blob_minion.stat == CONSCIOUS) + blob_minion.say(speak_text) return /mob/camera/blob/verb/create_storage() @@ -478,4 +475,4 @@ to_chat(src, "Node Blobs are blobs which grow, like the core. Like the core it can activate resource and factory blobs.") to_chat(src, "In addition to the buttons on your HUD, there are a few click shortcuts to speed up expansion and defense.") to_chat(src, "Shortcuts: Click = Expand Blob | CTRL Click = Create Shield Blob | Middle Mouse Click = Rally Spores | Alt Click = Remove Blob") - to_chat(src, "Attempting to talk will send a message to all other overminds, allowing you to coordinate with them.") \ No newline at end of file + to_chat(src, "Attempting to talk will send a message to all other overminds, allowing you to coordinate with them.") diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 6ae995a1e77..972075ceece 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -508,6 +508,12 @@ var/round_start_time = 0 //Ask the event manager to print round end information SSevents.RoundEnd() + // Add AntagHUD to everyone, see who was really evil the whole time! + for(var/datum/atom_hud/antag/H in huds) + for(var/m in GLOB.player_list) + var/mob/M = m + H.add_hud_to(M) + return 1 /datum/controller/gameticker/proc/HasRoundStarted() diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index fbe1774525f..2b0162829e1 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -320,69 +320,6 @@ for(var/mob/living/carbon/human/H in oview(3,owner)) //Blood decals for simple animals would be neat. aka Carp with blood on it. H.add_mob_blood(owner) -/obj/item/organ/internal/heart/gland/bodysnatch - cooldown_low = 600 - cooldown_high = 600 - human_only = 1 - uses = 1 - -/obj/item/organ/internal/heart/gland/bodysnatch/activate() - to_chat(owner, "You feel something moving around inside you...") - //spawn cocoon with clone greytide snpc inside - if(ishuman(owner)) - var/obj/effect/cocoon/abductor/C = new (get_turf(owner)) - C.Copy(owner) - C.Start() - owner.adjustBruteLoss(40) - owner.add_splatter_floor() - -/obj/effect/cocoon/abductor - name = "slimy cocoon" - desc = "Something is moving inside." - icon = 'icons/effects/effects.dmi' - icon_state = "cocoon_large3" - color = rgb(10,120,10) - density = 1 - var/hatch_time = 0 - -/obj/effect/cocoon/abductor/proc/Copy(mob/living/carbon/human/H) - var/mob/living/carbon/human/interactive/greytide/clone = new(src) - var/datum/dna/owner_dna = H.dna - clone.rename_character(clone.name, owner_dna.real_name) - clone.set_species(owner_dna.species.type) - clone.dna = owner_dna.Clone() - clone.body_accessory = H.body_accessory - domutcheck(clone) - - for(var/obj/item/I in clone) - if(istype(I, /obj/item/implant)) - continue - if(istype(I, /obj/item/organ)) - continue - qdel(I) - - //There's no define for this / get all items ? - var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\ - slot_wear_mask,slot_head,slot_shoes,slot_gloves,slot_l_ear,slot_r_ear,\ - slot_glasses,slot_belt,slot_s_store,slot_l_store,slot_r_store,slot_wear_id,slot_wear_pda) - - for(var/slot in slots) - var/obj/item/I = H.get_item_by_slot(slot) - if(I) - clone.equip_to_slot_or_del(new I.type(clone), slot) - -/obj/effect/cocoon/abductor/proc/Start() - hatch_time = world.time + 600 - START_PROCESSING(SSobj, src) - -/obj/effect/cocoon/abductor/process() - if(world.time > hatch_time) - STOP_PROCESSING(SSobj, src) - for(var/mob/M in contents) - src.visible_message("[src] hatches!") - M.forceMove(get_turf(src)) - qdel(src) - /obj/item/organ/internal/heart/gland/plasma cooldown_low = 1200 diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index bde3f7ee8e9..54b01ff38ce 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -2,7 +2,9 @@ //"Ghosts" that are invisible and move like ghosts, cannot take damage while invsible //Don't hear deadchat and are NOT normal ghosts //Admin-spawn or random event + #define INVISIBILITY_REVENANT 50 +#define REVENANT_NAME_FILE "revenant_names.json" /mob/living/simple_animal/revenant name = "revenant" @@ -124,9 +126,17 @@ ghost_darkness_images |= ghostimage updateallghostimages() remove_from_all_data_huds() + random_revenant_name() addtimer(CALLBACK(src, .proc/firstSetupAttempt), 15 SECONDS) // Give admin 15 seconds to put in a ghost (Or wait 15 seconds before giving it objectives) +/mob/living/simple_animal/revenant/proc/random_revenant_name() + var/built_name = "" + built_name += pick(strings(REVENANT_NAME_FILE, "spirit_type")) + built_name += " of " + built_name += pick(strings(REVENANT_NAME_FILE, "adjective")) + built_name += pick(strings(REVENANT_NAME_FILE, "theme")) + name = built_name /mob/living/simple_animal/revenant/proc/firstSetupAttempt() if(mind) diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 9e06d662053..eebe4f2e9e4 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -256,6 +256,8 @@ if(H.mind && H.mind.initial_account) C.associated_account_number = H.mind.initial_account.account_number + C.owner_uid = H.UID() + C.owner_ckey = H.ckey /datum/outfit/job/proc/imprint_pda(mob/living/carbon/human/H) var/obj/item/pda/PDA = H.wear_pda @@ -265,3 +267,10 @@ PDA.ownjob = C.assignment PDA.ownrank = C.rank PDA.name = "PDA-[H.real_name] ([PDA.ownjob])" + +/datum/job/proc/would_accept_job_transfer_from_player(mob/player) + if(!guest_jobbans(title)) // actually checks if job is a whitelisted position + return TRUE + if(!istype(player)) + return FALSE + return is_job_whitelisted(player, title) diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm index 6f5be69280a..2a7927d09bf 100644 --- a/code/game/jobs/job_exp.dm +++ b/code/game/jobs/job_exp.dm @@ -257,13 +257,19 @@ var/global/list/role_playtime_requirements = list( play_records[rtype] = text2num(read_records[rtype]) else play_records[rtype] = 0 - if(mob.stat == CONSCIOUS && mob.mind.assigned_role) + var/myrole + if(mob.mind) + if(mob.mind.playtime_role) + myrole = mob.mind.playtime_role + else if(mob.mind.assigned_role) + myrole = mob.mind.assigned_role + if(mob.stat == CONSCIOUS && myrole) play_records[EXP_TYPE_LIVING] += minutes if(announce_changes) to_chat(mob,"You got: [minutes] Living EXP!") for(var/category in exp_jobsmap) if(exp_jobsmap[category]["titles"]) - if(mob.mind.assigned_role in exp_jobsmap[category]["titles"]) + if(myrole in exp_jobsmap[category]["titles"]) play_records[category] += minutes if(announce_changes) to_chat(mob,"You got: [minutes] [category] EXP!") diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 95e609ee524..e392b468557 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -371,7 +371,15 @@ update_flag SSnanoui.update_uis(src) // Update all NanoUIs attached to src - +/obj/machinery/portable_atmospherics/canister/replace_tank(mob/living/user, close_valve) + . = ..() + if(.) + if(close_valve) + valve_open = FALSE + update_icon() + investigate_log("Valve was closed by [key_name(user)].
", "atmos") + else if(valve_open && holding) + investigate_log("[key_name(user)] started a transfer into [holding].
", "atmos") /obj/machinery/portable_atmospherics/canister/attack_ai(var/mob/user as mob) src.add_hiddenprint(user) diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index dfecc3a4409..71e1310f96b 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -82,16 +82,49 @@ /obj/machinery/portable_atmospherics/portableConnectorReturnAir() return air_contents -/obj/machinery/portable_atmospherics/attackby(var/obj/item/W as obj, var/mob/user as mob, params) - if((istype(W, /obj/item/tank) && !( src.destroyed ))) - if(src.holding) - return - var/obj/item/tank/T = W - user.drop_item() - T.loc = src - src.holding = T - update_icon() +/obj/machinery/portable_atmospherics/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") return + if(!in_range(src, user)) + return + if(!ishuman(usr) && !issilicon(usr)) + return + if(holding) + to_chat(user, "You remove [holding] from [src].") + replace_tank(user, TRUE) + +/obj/machinery/portable_atmospherics/examine(mob/user) + ..() + if(holding) + to_chat(user, "\The [src] contains [holding]. Alt-click [src] to remove it.") + +/obj/machinery/portable_atmospherics/proc/replace_tank(mob/living/user, close_valve, obj/item/tank/new_tank) + if(holding) + holding.forceMove(drop_location()) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(holding) + if(new_tank) + holding = new_tank + else + holding = null + update_icon() + return TRUE + +/obj/machinery/portable_atmospherics/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/tank)) + if(!(stat & BROKEN)) + if(!user.drop_item()) + return + var/obj/item/tank/T = W + user.drop_item() + if(src.holding) + to_chat(user, "[holding ? "In one smooth motion you pop [holding] out of [src]'s connector and replace it with [T]" : "You insert [T] into [src]"].") + replace_tank(user, FALSE) + T.loc = src + src.holding = T + update_icon() + return else if(istype(W, /obj/item/wrench)) if(connected_port) diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index a7680e815ff..5bd441f6748 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -95,6 +95,16 @@ /obj/machinery/portable_atmospherics/pump/return_air() return air_contents +/obj/machinery/portable_atmospherics/pump/replace_tank(mob/living/user, close_valve) + . = ..() + if(.) + if(close_valve) + if(on) + on = FALSE + update_icon() + else if(on && holding && direction_out) + investigate_log("[key_name(user)] started a transfer into [holding].
", "atmos") + /obj/machinery/portable_atmospherics/pump/attack_ai(var/mob/user as mob) src.add_hiddenprint(user) return src.attack_hand(user) @@ -139,10 +149,14 @@ if(href_list["power"]) on = !on + if(on && direction_out) + investigate_log("[key_name(usr)] started a transfer into [holding].
", "atmos") update_icon() if(href_list["direction"]) direction_out = !direction_out + if(on && holding) + investigate_log("[key_name(usr)] started a transfer into [holding].
", "atmos") if(href_list["remove_tank"]) if(holding) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 2b294db78c9..c9e5e8ba676 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -56,6 +56,17 @@ /obj/item/circuitboard/machine board_type = "machine" +/obj/item/circuitboard/examine(mob/user) + ..() + if(LAZYLEN(req_components)) + var/list/nice_list = list() + for(var/B in req_components) + var/atom/A = B + if(!ispath(A)) + continue + nice_list += list("[req_components[A]] [initial(A.name)]") + to_chat(user,"Required components: [english_list(nice_list)].") + /obj/item/circuitboard/message_monitor name = "Circuit board (Message Monitor)" build_path = /obj/machinery/computer/message_monitor diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 5cb19358358..f4d21cbd125 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -66,14 +66,15 @@ var/time_last_changed_position = 0 /obj/machinery/computer/card/proc/get_target_rank() return modify && modify.assignment ? modify.assignment : "Unassigned" -/obj/machinery/computer/card/proc/format_jobs(list/jobs) +/obj/machinery/computer/card/proc/format_jobs(list/jobs, targetrank, list/jobformats) var/list/formatted = list() for(var/job in jobs) if(job_in_department(SSjobs.GetJob(job))) formatted.Add(list(list( "display_name" = replacetext(job, " ", " "), - "target_rank" = get_target_rank(), - "job" = job))) + "target_rank" = targetrank, + "job" = job, + "jlinkformat" = jobformats[job] ? jobformats[job] : null))) return formatted @@ -117,12 +118,14 @@ var/time_last_changed_position = 0 if(!usr.get_active_hand() && Adjacent(usr)) usr.put_in_hands(scan) scan = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else if(modify) to_chat(usr, "You remove \the [modify] from \the [src].") modify.forceMove(get_turf(src)) if(!usr.get_active_hand() && Adjacent(usr)) usr.put_in_hands(modify) modify = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else to_chat(usr, "There is nothing to remove from the console.") @@ -134,10 +137,12 @@ var/time_last_changed_position = 0 user.drop_item() id_card.loc = src scan = id_card + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else if(!modify) user.drop_item() id_card.loc = src modify = id_card + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) SSnanoui.update_uis(src) attack_hand(user) @@ -242,6 +247,7 @@ var/time_last_changed_position = 0 data["target_owner"] = modify && modify.registered_name ? modify.registered_name : "-----" data["target_rank"] = get_target_rank() data["scan_name"] = scan ? scan.name : "-----" + data["scan_owner"] = scan && scan.registered_name ? scan.registered_name : null data["authenticated"] = is_authenticated(user) data["has_modify"] = !!modify data["account_number"] = modify ? modify.associated_account_number : null @@ -249,15 +255,19 @@ var/time_last_changed_position = 0 data["all_centcom_access"] = null data["regions"] = null data["target_dept"] = target_dept + data["card_is_owned"] = modify && modify.owner_ckey - data["engineering_jobs"] = format_jobs(engineering_positions) - data["medical_jobs"] = format_jobs(medical_positions) - data["science_jobs"] = format_jobs(science_positions) - data["security_jobs"] = format_jobs(security_positions) - data["support_jobs"] = format_jobs(support_positions) - data["civilian_jobs"] = format_jobs(civilian_positions) - data["special_jobs"] = format_jobs(whitelisted_positions) - data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) + var/list/job_formats = SSjobs.format_jobs_for_id_computer(modify) + + data["top_jobs"] = format_jobs(list("Captain", "Custom"), data["target_rank"], job_formats) + data["engineering_jobs"] = format_jobs(engineering_positions, data["target_rank"], job_formats) + data["medical_jobs"] = format_jobs(medical_positions, data["target_rank"], job_formats) + data["science_jobs"] = format_jobs(science_positions, data["target_rank"], job_formats) + data["security_jobs"] = format_jobs(security_positions, data["target_rank"], job_formats) + data["support_jobs"] = format_jobs(support_positions, data["target_rank"], job_formats) + data["civilian_jobs"] = format_jobs(civilian_positions, data["target_rank"], job_formats) + data["special_jobs"] = format_jobs(whitelisted_positions, data["target_rank"], job_formats) + data["centcom_jobs"] = format_jobs(get_all_centcom_jobs(), data["target_rank"], job_formats) data["card_skins"] = format_card_skins(get_station_card_skins()) data["job_slots"] = format_job_slots() @@ -268,6 +278,9 @@ var/time_last_changed_position = 0 data["cooldown_mins"] = mins data["cooldown_secs"] = (seconds < 10) ? "0[seconds]" : seconds + if(mode == 3 && is_authenticated(user)) + data["id_change_html"] = SSjobs.fetch_transfer_record_html(is_centcom()) + if(modify) data["current_skin"] = modify.icon_state @@ -315,15 +328,18 @@ var/time_last_changed_position = 0 if(!usr.get_active_hand() && Adjacent(usr)) usr.put_in_hands(modify) modify = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else modify.forceMove(get_turf(src)) modify = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else if(Adjacent(usr)) var/obj/item/I = usr.get_active_hand() if(istype(I, /obj/item/card/id)) usr.drop_item() I.forceMove(src) modify = I + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) if("scan") if(scan) @@ -332,15 +348,18 @@ var/time_last_changed_position = 0 if(!usr.get_active_hand() && Adjacent(usr)) usr.put_in_hands(scan) scan = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else scan.forceMove(get_turf(src)) scan = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else if(Adjacent(usr)) var/obj/item/I = usr.get_active_hand() if(istype(I, /obj/item/card/id)) usr.drop_item() I.forceMove(src) scan = I + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) if("access") if(href_list["allowed"] && !target_dept) @@ -361,7 +380,7 @@ var/time_last_changed_position = 0 if("assign") if(is_authenticated(usr) && modify) var/t1 = href_list["assign_target"] - if(target_dept && modify.assignment == "Unassigned") + if(target_dept && modify.assignment == "Demoted") visible_message("[src]: Demoted individuals must see the HoP for a new job.") return 0 if(!job_in_department(SSjobs.GetJob(modify.rank), FALSE)) @@ -373,11 +392,12 @@ var/time_last_changed_position = 0 var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN)) //let custom jobs function as an impromptu alt title, mainly for sechuds if(temp_t && modify) + SSjobs.log_job_transfer(modify.registered_name, modify.getRankAndAssignment(), temp_t, scan.registered_name) modify.assignment = temp_t log_game("[key_name(usr)] has given \"[modify.registered_name]\" the custom job title \"[temp_t]\".") else var/list/access = list() - if(is_centcom()) + if(is_centcom() && islist(get_centcom_access(t1))) access = get_centcom_access(t1) else var/datum/job/jobdatum @@ -397,6 +417,16 @@ var/time_last_changed_position = 0 if(t1 == "Civilian") message_admins("[key_name_admin(usr)] has reassigned \"[modify.registered_name]\" from \"[jobnamedata]\" to \"[t1]\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, t1, scan.registered_name) + SSjobs.slot_job_transfer(modify.rank, t1) + + var/mob/living/carbon/human/H = modify.getPlayer() + if(istype(H)) + if(jobban_isbanned(H, t1)) + message_admins("[ADMIN_FULLMONTY(H)] has been assigned the job [t1], in possible violation of their job ban.") + if(H.mind) + H.mind.playtime_role = t1 + modify.access = access modify.rank = t1 modify.assignment = t1 @@ -426,6 +456,20 @@ var/time_last_changed_position = 0 if("mode") mode = text2num(href_list["mode_target"]) + if("wipe_my_logs") + if(is_authenticated(usr) && is_centcom()) + var/delcount = SSjobs.delete_log_records(scan.registered_name, FALSE) + if(delcount) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + SSnanoui.update_uis(src) + + if("wipe_all_logs") + if(is_authenticated(usr) && !target_dept) + var/delcount = SSjobs.delete_log_records(scan.registered_name, TRUE) + if(delcount) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + SSnanoui.update_uis(src) + if("print") if(!printing && !target_dept) printing = 1 @@ -464,14 +508,15 @@ var/time_last_changed_position = 0 var/jobnamedata = modify.getRankAndAssignment() log_game("[key_name(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".") message_admins("[key_name_admin(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Terminated", scan.registered_name) modify.assignment = "Terminated" modify.access = list() callHook("terminate_employee", list(modify)) if("demote") if(is_authenticated(usr)) - if(modify.assignment == "Unassigned") - visible_message("[src]: Unassigned crew cannot be demoted any further. If further action is warranted, ask the Captain about Termination.") + if(modify.assignment == "Demoted") + visible_message("[src]: Demoted crew cannot be demoted any further. If further action is warranted, ask the Captain about Termination.") return 0 if(!job_in_department(SSjobs.GetJob(modify.rank), FALSE)) visible_message("[src]: Heads may only demote members of their own department.") @@ -482,12 +527,13 @@ var/time_last_changed_position = 0 access = jobdatum.get_access() var/jobnamedata = modify.getRankAndAssignment() - log_game("[key_name(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Unassigned)\".") - message_admins("[key_name_admin(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Unassigned)\".") + log_game("[key_name(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Demoted)\".") + message_admins("[key_name_admin(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Demoted)\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Demoted", scan.registered_name) modify.access = access modify.rank = "Civilian" - modify.assignment = "Unassigned" + modify.assignment = "Demoted" modify.icon_state = "id" if("make_job_available") diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index a5198da6e56..b39c005855c 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -38,7 +38,7 @@ if(isturf(T)) attached = locate() in T if(attached) - return attached.get_powernet() + return attached.powernet /obj/machinery/computer/monitor/attack_ai(mob/user) attack_hand(user) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 21ff909796f..3838a52325f 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -87,10 +87,7 @@ if(operating || !density) return add_fingerprint(user) - if(!requiresID()) - user = null - - if(allowed(user)) + if(!requiresID() || allowed(user)) open_and_close() else do_animate("deny") @@ -217,7 +214,7 @@ return attack_hand(user) /obj/machinery/door/window/attack_hand(mob/user) - return attackby(user, user) + return bumpopen(user) /obj/machinery/door/window/emag_act(mob/user, obj/weapon) if(!operating && density && !emagged) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 1b3dfe19001..bb5847fc6fb 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -2,8 +2,8 @@ name = "Pipe Dispenser" icon = 'icons/obj/stationobjs.dmi' icon_state = "pipe_d" - density = 1 - anchored = 1 + density = TRUE + anchored = TRUE var/unwrenched = 0 var/wait = 0 @@ -75,29 +75,25 @@ /obj/machinery/pipedispenser/Topic(href, href_list) if(..() || unwrenched) - return 1 + return usr.set_machine(src) add_fingerprint(usr) + if(world.time < wait + 4) + return + wait = world.time if(href_list["make"]) - if(!wait) - var/p_type = text2num(href_list["make"]) - var/p_dir = text2num(href_list["dir"]) - var/obj/item/pipe/P = new (loc, pipe_type=p_type, dir=p_dir) - P.update() - P.add_fingerprint(usr) - wait = world.time + 10 + var/p_type = text2num(href_list["make"]) + var/p_dir = text2num(href_list["dir"]) + var/obj/item/pipe/P = new (loc, pipe_type=p_type, dir=p_dir) + P.update() + P.add_fingerprint(usr) if(href_list["makemeter"]) - if(wait < world.time) - new /obj/item/pipe_meter(loc) - wait = world.time + 15 + new /obj/item/pipe_meter(loc) if(href_list["makegsensor"]) - if(!wait) - new /obj/item/pipe_gsensor(loc) - wait = 1 - spawn(15) - wait = 0 + new /obj/item/pipe_gsensor(loc) + return TRUE /obj/machinery/pipedispenser/attackby(var/obj/item/W as obj, var/mob/user as mob, params) add_fingerprint(usr) @@ -140,8 +136,6 @@ name = "Disposal Pipe Dispenser" icon = 'icons/obj/stationobjs.dmi' icon_state = "pipe_d" - density = 1 - anchored = 1.0 //Allow you to drag-drop disposal pipes into it /obj/machinery/pipedispenser/disposal/MouseDrop_T(var/obj/structure/disposalconstruct/pipe, mob/usr) @@ -182,16 +176,10 @@ popup.open() /obj/machinery/pipedispenser/disposal/Topic(href, href_list) - if(..() || unwrenched) - return 1 - - usr.set_machine(src) - add_fingerprint(usr) - - if(wait < world.time) + if(!..()) + return + if(href_list["dmake"]) var/p_type = text2num(href_list["dmake"]) var/obj/structure/disposalconstruct/C = new(loc, p_type) if(p_type in list(PIPE_DISPOSALS_BIN, PIPE_DISPOSALS_OUTLET, PIPE_DISPOSALS_CHUTE)) C.density = TRUE - C.add_fingerprint(usr) - wait = world.time + 15 diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 304dc7dc639..6422e94dc74 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -188,11 +188,11 @@ /obj/machinery/power/singularity_beacon/process() if(!active) return PROCESS_KILL + + if(surplus() >= 1500) + add_load(1500) else - if(surplus() > 1500) - draw_power(1500) - else - Deactivate() + Deactivate() /obj/machinery/power/singularity_beacon/syndicate icontype = "beaconsynd" diff --git a/code/game/machinery/telecomms/ntsl2.dm b/code/game/machinery/telecomms/ntsl2.dm index f01f173ebb3..604fcdfbe7e 100644 --- a/code/game/machinery/telecomms/ntsl2.dm +++ b/code/game/machinery/telecomms/ntsl2.dm @@ -10,109 +10,109 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) */ /datum/nttc_configuration // ALL OF THE JOB CRAP - // Dict of all jobs and their colors + // Dict of all jobs and their department color classes var/all_jobs = list( // AI - "AI" = "#FF00FF", - "Android" = "#FF00FF", - "Cyborg" = "#FF00FF", - "Personal AI" = "#FF00FF", - "Robot" = "#FF00FF", + "AI" = "airadio", + "Android" = "airadio", + "Cyborg" = "airadio", + "Personal AI" = "airadio", + "Robot" = "airadio", // Civilian + Varients - "Assistant" = "#408010", - "Businessman" = "#408010", - "Civilian" = "#408010", - "Tourist" = "#408010", - "Trader" = "#408010", + "Assistant" = "radio", + "Businessman" = "radio", + "Civilian" = "radio", + "Tourist" = "radio", + "Trader" = "radio", // Command (Solo command, not department heads) - "Blueshield" = "#204090", - "Captain" = "#204090", - "Head of Personnel" = "#204090", - "Nanotrasen Representative" = "#204090", + "Blueshield" = "comradio", + "Captain" = "comradio", + "Head of Personnel" = "comradio", + "Nanotrasen Representative" = "comradio", // Engineeering - "Atmospheric Technician" = "#A66300", - "Chief Engineer" = "#A66300", - "Electrician" = "#A66300", - "Engine Technician" = "#A66300", - "Life Support Specialist" = "#A66300", - "Maintenance Technician" = "#A66300", - "Mechanic" = "#A66300", - "Station Engineer" = "#A66300", + "Atmospheric Technician" = "engradio", + "Chief Engineer" = "engradio", + "Electrician" = "engradio", + "Engine Technician" = "engradio", + "Life Support Specialist" = "engradio", + "Maintenance Technician" = "engradio", + "Mechanic" = "engradio", + "Station Engineer" = "engradio", // ERT - "Emergency Response Team Engineer" = "#5C5C7C", - "Emergency Response Team Leader" = "#5C5C7C", - "Emergency Response Team Medic" = "#5C5C7C", - "Emergency Response Team Member" = "#5C5C7C", - "Emergency Response Team Officer" = "#5C5C7C", + "Emergency Response Team Engineer" = "dsquadradio", // I know this says deathsquad but the class for responseteam is neon green. No. + "Emergency Response Team Leader" = "dsquadradio", + "Emergency Response Team Medic" = "dsquadradio", + "Emergency Response Team Member" = "dsquadradio", + "Emergency Response Team Officer" = "dsquadradio", // Medical - "Chemist" = "#009190", - "Chief Medical Officer" = "#009190", - "Coroner" = "#009190", - "Medical Doctor" = "#009190", - "Microbiologist" = "#009190", - "Nurse" = "#009190", - "Paramedic" = "#009190", - "Pharmacologist" = "#009190", - "Pharmacist" = "#009190", - "Psychiatrist" = "#009190", - "Psychologist" = "#009190", - "Surgeon" = "#009190", - "Therapist" = "#009190", - "Virologist" = "#009190", + "Chemist" = "medradio", + "Chief Medical Officer" = "medradio", + "Coroner" = "medradio", + "Medical Doctor" = "medradio", + "Microbiologist" = "medradio", + "Nurse" = "medradio", + "Paramedic" = "medradio", + "Pharmacologist" = "medradio", + "Pharmacist" = "medradio", + "Psychiatrist" = "medradio", + "Psychologist" = "medradio", + "Surgeon" = "medradio", + "Therapist" = "medradio", + "Virologist" = "medradio", // Science - "Anomalist" = "#993399", - "Biomechanical Engineer" = "#993399", - "Chemical Researcher" = "#993399", - "Geneticist" = "#993399", - "Mechatronic Engineer" = "#993399", - "Plasma Researcher" = "#993399", - "Research Director" = "#993399", - "Roboticist" = "#993399", - "Scientist" = "#993399", - "Xenoarcheologist" = "#993399", - "Xenobiologist" = "#993399", + "Anomalist" = "sciradio", + "Biomechanical Engineer" = "sciradio", + "Chemical Researcher" = "sciradio", + "Geneticist" = "sciradio", + "Mechatronic Engineer" = "sciradio", + "Plasma Researcher" = "sciradio", + "Research Director" = "sciradio", + "Roboticist" = "sciradio", + "Scientist" = "sciradio", + "Xenoarcheologist" = "sciradio", + "Xenobiologist" = "sciradio", // Security - "Brig Physician" = "#A30000", - "Detective" = "#A30000", - "Forensic Technician" = "#A30000", - "Head of Security" = "#A30000", - "Human Resources Agent" = "#A30000", - "Internal Affairs Agent" = "#A30000", - "Magistrate" = "#A30000", - "Security Officer" = "#A30000", - "Security Pod Pilot" = "#A30000", - "Warden" = "#A30000", + "Brig Physician" = "secradio", + "Detective" = "secradio", + "Forensic Technician" = "secradio", + "Head of Security" = "secradio", + "Human Resources Agent" = "secradio", + "Internal Affairs Agent" = "secradio", + "Magistrate" = "secradio", + "Security Officer" = "secradio", + "Security Pod Pilot" = "secradio", + "Warden" = "secradio", // Supply - "Quartermaster" = "#7F6539", - "Cargo Technician" = "#7F6539", - "Shaft Miner" = "#7F6539", - "Spelunker" = "#7F6539", + "Quartermaster" = "supradio", + "Cargo Technician" = "supradio", + "Shaft Miner" = "supradio", + "Spelunker" = "supradio", // Service - "Barber" = "#80A000", - "Bartender" = "#80A000", - "Beautician" = "#80A000", - "Botanical Researcher" = "#80A000", - "Botanist" = "#80A000", - "Butcher" = "#80A000", - "Chaplain" = "#80A000", - "Chef" = "#80A000", - "Clown" = "#80A000", - "Cook" = "#80A000", - "Culinary Artist" = "#80A000", - "Custodial Technician" = "#80A000", - "Hair Stylist" = "#80A000", - "Hydroponicist" = "#80A000", - "Janitor" = "#80A000", - "Journalist" = "#80A000", - "Librarian" = "#80A000", - "Mime" = "#80A000", + "Barber" = "srvradio", + "Bartender" = "srvradio", + "Beautician" = "srvradio", + "Botanical Researcher" = "srvradio", + "Botanist" = "srvradio", + "Butcher" = "srvradio", + "Chaplain" = "srvradio", + "Chef" = "srvradio", + "Clown" = "srvradio", + "Cook" = "srvradio", + "Culinary Artist" = "srvradio", + "Custodial Technician" = "srvradio", + "Hair Stylist" = "srvradio", + "Hydroponicist" = "srvradio", + "Janitor" = "srvradio", + "Journalist" = "srvradio", + "Librarian" = "srvradio", + "Mime" = "srvradio", ) // Just command members var/heads = list("Captain", "Head of Personnel", "Nanotrasen Representative", "Blueshield", "Chief Engineer", "Chief Medical Officer", "Research Director", "Head of Security") // Just ERT var/ert_jobs = list("Emergency Response Team Officer", "Emergency Response Team Engineer", "Emergency Response Team Medic", "Emergency Response Team Leader", "Emergency Response Team Member") // Defined so code compiles and incase someone has a non-standard job - var/job_color = "#000000" + var/job_class = "radio" // NOW FOR ACTUAL TOGGLES /* Simple Toggles */ var/toggle_activated = TRUE @@ -274,10 +274,10 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) // All job and coloring shit if(toggle_job_color || toggle_name_color) var/job = signal.data["job"] - job_color = all_jobs[job] + job_class = all_jobs[job] if(toggle_name_color) - var/new_name = "" + signal.data["name"] + "" + var/new_name = "" + signal.data["name"] + "" signal.data["name"] = new_name signal.data["realname"] = new_name // this is required because the broadcaster uses this directly if the speaker doesn't have a voice changer on @@ -289,13 +289,13 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) if(toggle_job_color) switch(job_indicator_type) if(JOB_STYLE_1) - new_name = signal.data["name"] + " ([job]) " + new_name = signal.data["name"] + " ([job]) " if(JOB_STYLE_2) - new_name = signal.data["name"] + " - [job] " + new_name = signal.data["name"] + " - [job] " if(JOB_STYLE_3) - new_name = "\[[job]\] " + signal.data["name"] + " " + new_name = "\[[job]\] " + signal.data["name"] + " " if(JOB_STYLE_4) - new_name = "([job]) " + signal.data["name"] + " " + new_name = "([job]) " + signal.data["name"] + " " else switch(job_indicator_type) if(JOB_STYLE_1) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index d0872fa8f93..dc4b9124d77 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -741,6 +741,8 @@ throw_item.throw_at(target, 16, 3, src) visible_message("[src] launches [throw_item.name] at [target.name]!") +/obj/machinery/vending/onTransitZ() + return /* * Vending machine types */ diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 057c52a2a4c..b7311519f7a 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -140,8 +140,8 @@ /obj/item/suppressor = 4, /obj/item/clothing/under/chameleon = 2, /obj/item/stamp/chameleon = 2, - /obj/item/clothing/shoes/syndigaloshes = 5, - /obj/item/clothing/mask/gas/voice = 2, + /obj/item/clothing/shoes/chameleon/noslip = 5, + /obj/item/clothing/mask/chameleon = 2, /obj/item/dnascrambler = 1, /obj/item/storage/backpack/satchel_flat = 2, /obj/item/storage/toolbox/syndicate = 2, diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm index 510e5b90380..03e49c56a50 100644 --- a/code/game/objects/effects/spawners/random_spawners.dm +++ b/code/game/objects/effects/spawners/random_spawners.dm @@ -214,7 +214,7 @@ /obj/item/storage/pill_bottle/zoom = 1, /obj/item/storage/pill_bottle/random_drug_bottle = 2, /obj/item/storage/backpack/duffel/syndie/surgery = 1, - /obj/item/clothing/shoes/syndigaloshes = 1, + /obj/item/clothing/shoes/chameleon/noslip = 1, /obj/item/storage/belt/military = 1, /obj/item/clothing/under/chameleon = 1, /obj/item/storage/backpack/satchel_flat = 1, diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 77b263fb8f2..23509a06f63 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -100,6 +100,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/trip_walksafe = TRUE var/trip_tiles = 0 + //Tooltip vars + var/in_inventory = FALSE //is this item equipped into an inventory slot or hand of a mob? + var/tip_timer = 0 + /obj/item/New() ..() for(var/path in actions_types) @@ -340,11 +344,13 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d A.Remove(user) if(flags & DROPDEL) qdel(src) + in_inventory = FALSE SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user) // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user) + in_inventory = TRUE return TRUE // called when this item is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. @@ -374,6 +380,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/datum/action/A = X if(item_action_slot_check(slot, user)) //some items only give their actions buttons when in a specific slot. A.Grant(user) + in_inventory = TRUE /obj/item/proc/item_action_slot_check(slot, mob/user) return 1 @@ -532,6 +539,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d if(callback) //call the original callback . = callback.Invoke() throw_speed = initial(throw_speed) //explosions change this. + in_inventory = FALSE /obj/item/proc/pwr_drain() return 0 // Process Kill @@ -578,4 +586,23 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d return TRUE /obj/item/attack_hulk(mob/living/carbon/human/user) - return FALSE \ No newline at end of file + return FALSE + +/obj/item/proc/openTip(location, control, params, user) + openToolTip(user, src, params, title = name, content = "[desc]", theme = "") + +/obj/item/MouseEntered(location, control, params) + if(in_inventory) + var/timedelay = 8 + var/user = usr + tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, user), timedelay, TIMER_STOPPABLE) + +/obj/item/MouseExited() + deltimer(tip_timer) //delete any in-progress timer if the mouse is moved off the item before it finishes + closeToolTip(usr) + +/obj/item/proc/update_slot_icon() + if(!ismob(loc)) + return + var/mob/owner = loc + owner.regenerate_icons() diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index 3125c24837a..a975a0b4d06 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -37,7 +37,7 @@ visible_message("[src] swells up!") // Animation - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/carp.dmi' flick("carp_swell", src) // Wait for animation to end sleep(6) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 316b937f749..e65c9a683a7 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -307,6 +307,9 @@ brightness_on = 7 icon_state = "torch" item_state = "torch" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + light_color = LIGHT_COLOR_ORANGE on_damage = 10 /obj/item/flashlight/slime diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 59a7a650383..941e90a31ef 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -35,7 +35,7 @@ return if(H.mind) span = H.mind.speech_span - if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice) || istype(H.get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown)) + if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice)) span = "sans" if(spamcheck) to_chat(user, "\The [src] needs to recharge!") diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 463223f4268..562800c2ce0 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -1,3 +1,7 @@ +#define DISCONNECTED 0 +#define CLAMPED_OFF 1 +#define OPERATING 2 + // Powersink - used to drain station power /obj/item/powersink @@ -13,28 +17,55 @@ throw_range = 2 materials = list(MAT_METAL=750) origin_tech = "powerstorage=5;syndicate=5" - var/drain_rate = 1600000 // amount of power to drain per tick - var/apc_drain_rate = 50 // Max. amount drained from single APC. In Watts. - var/dissipation_rate = 20000 // Passive dissipation of drained power. In Watts. - var/power_drained = 0 // Amount of power drained. - var/max_power = 1e10 // Detonation point. - var/mode = 0 // 0 = off, 1=clamped (off), 2=operating - var/drained_this_tick = 0 // This is unfortunately necessary to ensure we process powersinks BEFORE other machinery such as APCs. - var/admins_warned = 0 // stop spam, only warn the admins once that we are about to go boom + var/drain_rate = 2000000 // amount of power to drain per tick + var/power_drained = 0 // has drained this much power + var/max_power = 6e8 // maximum power that can be drained before exploding + var/mode = 0 // 0 = off, 1=clamped (off), 2=operating + var/admins_warned = FALSE // stop spam, only warn the admins once that we are about to boom - var/datum/powernet/PN // Our powernet var/obj/structure/cable/attached // the attached cable /obj/item/powersink/Destroy() STOP_PROCESSING(SSobj, src) - GLOB.processing_power_items.Remove(src) - PN = null attached = null return ..() -/obj/item/powersink/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/screwdriver)) - if(mode == 0) +/obj/item/powersink/update_icon() + icon_state = "powersink[mode == OPERATING]" + +/obj/item/powersink/proc/set_mode(value) + if(value == mode) + return + switch(value) + if(DISCONNECTED) + attached = null + if(mode == OPERATING) + STOP_PROCESSING(SSobj, src) + anchored = FALSE + density = FALSE + + if(CLAMPED_OFF) + if(!attached) + return + if(mode == OPERATING) + STOP_PROCESSING(SSobj, src) + anchored = TRUE + density = TRUE + + if(OPERATING) + if(!attached) + return + START_PROCESSING(SSobj, src) + anchored = TRUE + density = TRUE + + mode = value + update_icon() + set_light(0) + +/obj/item/powersink/attackby(obj/item/I, mob/user) + if(isscrewdriver(I)) + if(mode == DISCONNECTED) var/turf/T = loc if(isturf(T) && !T.intact) attached = locate() in T @@ -42,98 +73,81 @@ to_chat(user, "No exposed cable here to attach to.") return else - anchored = 1 - mode = 1 - src.visible_message("[user] attaches [src] to the cable!") + set_mode(CLAMPED_OFF) + visible_message("[user] attaches [src] to the cable!") message_admins("Power sink activated by [key_name_admin(user)] at ([x],[y],[z] - JMP)") log_game("Power sink activated by [key_name(user)] at ([x],[y],[z])") - return else to_chat(user, "Device must be placed over an exposed cable to attach to it.") - return else - if(mode == 2) - STOP_PROCESSING(SSobj, src) // Now the power sink actually stops draining the station's power if you unhook it. --NeoFite - GLOB.processing_power_items.Remove(src) - anchored = 0 - mode = 0 + set_mode(DISCONNECTED) src.visible_message("[user] detaches [src] from the cable!") - set_light(0) - icon_state = "powersink0" - - return else - ..() + return ..() /obj/item/powersink/attack_ai() return /obj/item/powersink/attack_hand(var/mob/user) switch(mode) - if(0) + if(DISCONNECTED) ..() - if(1) - src.visible_message("[user] activates [src]!") - mode = 2 - icon_state = "powersink1" - START_PROCESSING(SSobj, src) - GLOB.processing_power_items.Add(src) - if(2) //This switch option wasn't originally included. It exists now. --NeoFite - src.visible_message("[user] deactivates [src]!") - mode = 1 - set_light(0) - icon_state = "powersink0" - STOP_PROCESSING(SSobj, src) - GLOB.processing_power_items.Remove(src) - -/obj/item/powersink/pwr_drain() - if(!attached) - return 0 - - if(drained_this_tick) - return 1 - drained_this_tick = 1 - - var/drained = 0 - - if(!PN) - return 1 - - set_light(12) - PN.trigger_warning() - // found a powernet, so drain up to max power from it - drained = PN.draw_power(drain_rate) - // if tried to drain more than available on powernet - // now look for APCs and drain their cells - if(drained < drain_rate) - for(var/obj/machinery/power/terminal/T in PN.nodes) - // Enough power drained this tick, no need to torture more APCs - if(drained >= drain_rate) - break - if(istype(T.master, /obj/machinery/power/apc)) - var/obj/machinery/power/apc/A = T.master - if(A.operating && A.cell) - A.cell.charge = max(0, A.cell.charge - apc_drain_rate) - drained += apc_drain_rate - if(A.charging == 2) // If the cell was full - A.charging = 1 // It's no longer full - power_drained += drained - return 1 + if(CLAMPED_OFF) + user.visible_message( \ + "[user] activates \the [src]!", \ + "You activate \the [src].", + "You hear a click.") + message_admins("Power sink activated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_VERBOSEJMP(src)]") + log_game("Power sink activated by [key_name(user)] at [AREACOORD(src)]") + set_mode(OPERATING) + if(OPERATING) + user.visible_message( \ + "[user] deactivates \the [src]!", \ + "You deactivate \the [src].", + "You hear a click.") + set_mode(CLAMPED_OFF) /obj/item/powersink/process() - drained_this_tick = 0 - power_drained -= min(dissipation_rate, power_drained) + if(!attached) + set_mode(DISCONNECTED) + return + + var/datum/powernet/PN = attached.powernet + if(PN) + set_light(5) + + // found a powernet, so drain up to max power from it + + var/drained = min (drain_rate, attached.newavail()) + attached.add_delayedload(drained) + power_drained += drained + + // if tried to drain more than available on powernet + // now look for APCs and drain their cells + if(drained < drain_rate) + for(var/obj/machinery/power/terminal/T in PN.nodes) + if(istype(T.master, /obj/machinery/power/apc)) + var/obj/machinery/power/apc/A = T.master + if(A.operating && A.cell) + A.cell.charge = max(0, A.cell.charge - 50) + power_drained += 50 + if(A.charging == 2) // If the cell was full + A.charging = 1 // It's no longer full + if(drained >= drain_rate) + break + if(power_drained > max_power * 0.98) - if(!admins_warned) - admins_warned = 1 + if (!admins_warned) + admins_warned = TRUE message_admins("Power sink at ([x],[y],[z] - JMP) is 95% full. Explosion imminent.") playsound(src, 'sound/effects/screech.ogg', 100, 1, 1) + if(power_drained >= max_power) + STOP_PROCESSING(SSobj, src) explosion(src.loc, 4,8,16,32) qdel(src) - return - if(attached && attached.powernet) - PN = attached.powernet - else - PN = null + +#undef DISCONNECTED +#undef CLAMPED_OFF +#undef OPERATING \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 83a8c9304a1..00efc83668b 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -397,7 +397,6 @@ var/global/list/default_medbay_channels = list( var/mob/living/carbon/human/H = M displayname = H.voice if(H.voice != real_name) - jobname = "Unknown" voicemask = TRUE if(syndiekey && syndiekey.change_voice && connection.frequency == SYND_FREQ) diff --git a/code/game/objects/items/devices/voice.dm b/code/game/objects/items/devices/voice.dm new file mode 100644 index 00000000000..339271cdcca --- /dev/null +++ b/code/game/objects/items/devices/voice.dm @@ -0,0 +1,44 @@ +/obj/item/voice_changer + name = "voice changer" + desc = "A voice scrambling module." + icon = 'icons/obj/device.dmi' + icon_state = "voice_changer_off" + + actions_types = list(/datum/action/item_action/voice_changer/toggle, /datum/action/item_action/voice_changer/voice) + + var/obj/item/parent + + var/voice + var/active + +/obj/item/voice_changer/New() + . = ..() + + if(isitem(loc)) + parent = loc + parent.actions |= actions + +/obj/item/voice_changer/Destroy() + if(isitem(parent)) + parent.actions -= actions + + return ..() + +/obj/item/voice_changer/attack_self(mob/user) + active = !active + icon_state = "voice_changer_[active ? "on" : "off"]" + to_chat(user, "You toggle [src] [active ? "on" : "off"].") + + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/voice_changer/proc/set_voice(mob/user) + var/chosen_voice = input(user, "What voice would you like to mimic? Leave this empty to use the voice on your ID card.", "Set Voice Changer", voice) as text + if(!chosen_voice) + voice = null + to_chat(user, "You are now mimicking the voice on your ID card.") + return + + voice = sanitize(copytext(chosen_voice, 1, MAX_MESSAGE_LEN)) + to_chat(user, "You are now mimicking [voice].") \ No newline at end of file diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index abc328a8bf1..2c1222154b0 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -240,6 +240,7 @@ var/global/list/datum/stack_recipe/cloth_recipes = list ( \ var/global/list/datum/stack_recipe/cardboard_recipes = list ( new /datum/stack_recipe("box", /obj/item/storage/box), new /datum/stack_recipe("large box", /obj/item/storage/box/large, 4), + new /datum/stack_recipe("patch pack", /obj/item/storage/pill_bottle/patch_pack, 2), new /datum/stack_recipe("light tubes", /obj/item/storage/box/lights/tubes), new /datum/stack_recipe("light bulbs", /obj/item/storage/box/lights/bulbs), new /datum/stack_recipe("mouse traps", /obj/item/storage/box/mousetraps), diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 5cab26e062b..b0a1286d3b2 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -54,7 +54,7 @@ to_chat(user, "There are [amount] [singular_name]\s in the stack.") else to_chat(user, "There are [amount] [name]\s in the stack.") - to_chat(user,"Ctrl-Shift-click to take a custom amount.") + to_chat(user,"Alt-click to take a custom amount.") /obj/item/stack/proc/add(newamount) amount += newamount @@ -263,7 +263,7 @@ else ..() -/obj/item/stack/CtrlShiftClick(mob/living/user) +/obj/item/stack/AltClick(mob/living/user) if(!istype(user) || user.incapacitated()) to_chat(user, "You can't do that right now!") return @@ -276,7 +276,7 @@ //get amount from user var/min = 0 var/max = get_amount() - var/stackmaterial = round(input(user, "How many sheets do you wish to take out of this stack? (Maximum: [max])") as num) + var/stackmaterial = round(input(user, "How many sheets do you wish to take out of this stack? (Maximum: [max])") as null|num) if(stackmaterial == null || stackmaterial <= min || stackmaterial > get_amount()) return change_stack(user,stackmaterial) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 19864e0ba18..393ca1f3c0b 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1066,6 +1066,32 @@ obj/item/toy/cards/deck/syndicate/black name = "tuxedo cat plushie" icon_state = "tuxedocat" +//New generation TG plushies + +/obj/item/toy/plushie/lizardplushie + name = "lizard plushie" + desc = "An adorable stuffed toy that resembles a lizardperson." + icon_state = "plushie_lizard" + item_state = "plushie_lizard" + +/obj/item/toy/plushie/snakeplushie + name = "snake plushie" + desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing." + icon_state = "plushie_snake" + item_state = "plushie_snake" + +/obj/item/toy/plushie/nukeplushie + name = "operative plushie" + desc = "An stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious." + icon_state = "plushie_nuke" + item_state = "plushie_nuke" + +/obj/item/toy/plushie/slimeplushie + name = "slime plushie" + desc = "An adorable stuffed toy that resembles a slime. It is practically just a hacky sack." + icon_state = "plushie_slime" + item_state = "plushie_slime" + /* * Foam Armblade */ diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 150b21692f2..74318bfa16d 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -98,6 +98,8 @@ //alt titles are handled a bit weirdly in order to unobtrusively integrate into existing ID system var/assignment = null //can be alt title or the actual job var/rank = null //actual job + var/owner_uid + var/owner_ckey var/dorm = 0 // determines if this ID has claimed a dorm already var/sex @@ -195,6 +197,19 @@ jobnamedata += " (" + assignment + ")" return jobnamedata +/obj/item/card/id/proc/getPlayer() + if(owner_uid) + var/mob/living/carbon/human/H = locateUID(owner_uid) + if(istype(H) && H.ckey == owner_ckey) + return H + owner_uid = null + if(owner_ckey) + for(var/mob/M in GLOB.player_list) + if(M.ckey && M.ckey == owner_ckey) + owner_uid = M.UID() + return M + owner_ckey = null + /obj/item/card/id/proc/is_untrackable() return untrackable diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 666c14801d8..40fc1bf7d56 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -112,10 +112,9 @@ /obj/item/dice/attack_self(mob/user as mob) diceroll(user) -/obj/item/dice/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) - if(!..()) - return - diceroll(thrower) +/obj/item/dice/throw_impact(atom/target) + diceroll(thrownby) + . = ..() /obj/item/dice/proc/diceroll(mob/user) result = rand(1, sides) diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index d2f2ed2c54d..c7627688b5e 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -668,4 +668,27 @@ /obj/item/dnainjector/m2h/Initialize() block = MONKEYBLOCK + ..() + + +/obj/item/dnainjector/comic + name = "DNA-Injector (Comic)" + desc = "Honk!" + datatype = DNA2_BUF_SE + value = 0xFFF + forcedmutation = TRUE + +/obj/item/dnainjector/comic/Initialize() + block = COMICBLOCK + ..() + +/obj/item/dnainjector/anticomic + name = "DNA-Injector (Ant-Comic)" + desc = "Honk...?" + datatype = DNA2_BUF_SE + value = 0x001 + forcedmutation = TRUE + +/obj/item/dnainjector/anticomic/Initialize() + block = COMICBLOCK ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 297966525f0..66e0ba6b110 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -152,8 +152,14 @@ breakouttime = 35//easy to apply, easy to break out of gender = NEUTER origin_tech = "engineering=3;combat=1" + hitsound = 'sound/effects/snap.ogg' var/weaken = 0 +/obj/item/restraints/legcuffs/bola/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) + playsound(loc,'sound/weapons/bolathrow.ogg', 50, TRUE) + if(!..()) + return + /obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom) if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed, return//abort @@ -166,6 +172,7 @@ feedback_add_details("handcuffs","B") to_chat(C, "[src] ensnares you!") C.Weaken(weaken) + playsound(loc, hitsound, 50, TRUE) /obj/item/restraints/legcuffs/bola/tactical //traitor variant name = "reinforced bola" diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index e5ee3562228..56ae2864071 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -112,7 +112,7 @@ ..() new /obj/item/clothing/under/rank/clown(src) new /obj/item/clothing/shoes/magboots/clown(src) - new /obj/item/clothing/mask/gas/voice/clown(src) + new /obj/item/clothing/mask/chameleon(src) new /obj/item/radio/headset/headset_service(src) new /obj/item/pda/clown(src) new /obj/item/storage/box/survival(src) @@ -124,6 +124,7 @@ new /obj/item/reagent_containers/food/drinks/bottle/bottleofbanana(src) new /obj/item/instrument/bikehorn(src) new /obj/item/bikehorn(src) + new /obj/item/dnainjector/comic(src) /obj/item/storage/backpack/mime name = "Parcel Parceaux" diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index e406b097bee..9b1e89769cb 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -4,23 +4,22 @@ icon = 'icons/obj/clothing/belts.dmi' icon_state = "utilitybelt" item_state = "utility" + lefthand_file = 'icons/mob/inhands/equipment/belt_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/belt_righthand.dmi' slot_flags = SLOT_BELT attack_verb = list("whipped", "lashed", "disciplined") var/use_item_overlays = 0 // Do we have overlays for items held inside the belt? - /obj/item/storage/belt/update_icon() if(use_item_overlays) overlays.Cut() for(var/obj/item/I in contents) overlays += "[I.name]" - ..() /obj/item/storage/belt/proc/can_use() return is_equipped() - /obj/item/storage/belt/MouseDrop(obj/over_object as obj, src_location, over_location) var/mob/M = usr if(!istype(over_object, /obj/screen)) @@ -68,7 +67,7 @@ new /obj/item/weldingtool(src) new /obj/item/crowbar(src) new /obj/item/wirecutters(src) - new /obj/item/stack/cable_coil(src, 30, pick(COLOR_RED, COLOR_YELLOW, COLOR_ORANGE)) + new /obj/item/stack/cable_coil/random(src, 30) update_icon() /obj/item/storage/belt/utility/full/multitool/New() @@ -99,7 +98,7 @@ new /obj/item/crowbar/power(src) new /obj/item/weldingtool/experimental(src)//This can be changed if this is too much new /obj/item/multitool(src) - new /obj/item/stack/cable_coil(src, 30, pick(COLOR_RED, COLOR_YELLOW, COLOR_ORANGE)) + new /obj/item/stack/cable_coil/random(src, 30) new /obj/item/extinguisher/mini(src) new /obj/item/analyzer(src) update_icon() @@ -184,7 +183,6 @@ new /obj/item/reagent_containers/food/pill/salicylic(src) update_icon() - /obj/item/storage/belt/botany name = "botanist belt" desc = "Can hold various botanical supplies." @@ -207,7 +205,6 @@ /obj/item/wrench, ) - /obj/item/storage/belt/security name = "security belt" desc = "Can hold security gear like handcuffs and flashes." @@ -472,7 +469,6 @@ ..() update_icon() - /obj/item/storage/belt/holster name = "shoulder holster" desc = "A holster to conceal a carried handgun. WARNING: Badasses only." @@ -510,7 +506,6 @@ W.charges = W.max_charges update_icon() - /obj/item/storage/belt/fannypack name = "fannypack" desc = "A dorky fannypack for keeping small items in." @@ -599,7 +594,6 @@ // Bluespace Belt // ------------------------------------- - /obj/item/storage/belt/bluespace name = "Belt of Holding" desc = "The greatest in pants-supporting technology." @@ -632,8 +626,6 @@ var/bolacount = 0 var/cooldown = 0 - - /obj/item/storage/belt/bluespace/owlman/New() ..() new /obj/item/grenade/smokebomb(src) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 507d6fdb9f3..581ace78ef9 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -312,6 +312,7 @@ if(usr.s_active) usr.s_active.show_to(usr) W.mouse_opacity = MOUSE_OPACITY_OPAQUE //So you can click on the area around the item to equip it, instead of having to pixel hunt + W.in_inventory = TRUE update_icon() return 1 diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index ecf1acd701e..56db11ad058 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -5,7 +5,7 @@ if("bloodyspai") // 28TC new /obj/item/twohanded/garrote(src) new /obj/item/pinpointer/advpinpointer(src) - new /obj/item/clothing/mask/gas/voice(src) + new /obj/item/clothing/mask/chameleon(src) new /obj/item/clothing/under/chameleon(src) new /obj/item/card/id/syndicate(src) new /obj/item/flashlight/emp(src) @@ -19,7 +19,7 @@ new /obj/item/chameleon(src) new /obj/item/clothing/gloves/color/black/thief(src) new /obj/item/card/id/syndicate(src) - new /obj/item/clothing/shoes/syndigaloshes(src) + new /obj/item/clothing/shoes/chameleon/noslip(src) new /obj/item/storage/box/syndie_kit/safecracking(src) return @@ -83,14 +83,14 @@ new /obj/item/dnainjector/telemut/darkbundle(src) new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) new /obj/item/card/id/syndicate(src) - new /obj/item/clothing/shoes/syndigaloshes(src) - new /obj/item/clothing/mask/gas/voice(src) + new /obj/item/clothing/shoes/chameleon/noslip(src) + new /obj/item/clothing/mask/chameleon(src) return if("gadgets") // 30TC new /obj/item/clothing/gloves/color/yellow/power(src) new /obj/item/pen/sleepy(src) - new /obj/item/clothing/shoes/syndigaloshes(src) + new /obj/item/clothing/shoes/chameleon/noslip(src) new /obj/item/clothing/glasses/thermal/syndi(src) new /obj/item/flashlight/emp(src) new /obj/item/stamp/chameleon(src) @@ -340,4 +340,21 @@ To apply, hold the injector a short distance away from the outer thigh before ap new /obj/item/clothing/gloves/color/latex/nitrile(src) new /obj/item/clothing/mask/balaclava(src) new /obj/item/clothing/accessory/stethoscope(src) - new /obj/item/book/manual/engineering_hacking(src) \ No newline at end of file + new /obj/item/book/manual/engineering_hacking(src) + +/obj/item/storage/box/syndie_kit/chameleon + name = "chameleon kit" + +/obj/item/storage/box/syndie_kit/chameleon/New() + ..() + new /obj/item/clothing/under/chameleon(src) + new /obj/item/clothing/suit/chameleon(src) + new /obj/item/clothing/gloves/chameleon(src) + new /obj/item/clothing/shoes/chameleon(src) + new /obj/item/clothing/glasses/chameleon(src) + new /obj/item/clothing/head/chameleon(src) + new /obj/item/clothing/mask/chameleon(src) + new /obj/item/storage/backpack/chameleon(src) + new /obj/item/radio/headset/chameleon(src) + new /obj/item/stamp/chameleon(src) + new /obj/item/pda/chameleon(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/crittercrate.dm b/code/game/objects/structures/crates_lockers/crittercrate.dm index ffaff75288d..50d9b056e96 100644 --- a/code/game/objects/structures/crates_lockers/crittercrate.dm +++ b/code/game/objects/structures/crates_lockers/crittercrate.dm @@ -44,6 +44,10 @@ name = "cow crate" content_mob = /mob/living/simple_animal/cow +/obj/structure/closet/critter/pig + name = "pig crate" + content_mob = /mob/living/simple_animal/pig + /obj/structure/closet/critter/goat name = "goat crate" content_mob = /mob/living/simple_animal/hostile/retaliate/goat diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 568fb0ededc..303862ff66f 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -28,6 +28,22 @@ else has_extinguisher = new/obj/item/extinguisher +/obj/structure/extinguisher_cabinet/examine(mob/user) + ..() + to_chat(user, "Alt-click to [opened ? "close":"open"] it.") + +/obj/structure/extinguisher_cabinet/AltClick(mob/living/user) + if(!istype(user) || user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user)) + return + if(!iscarbon(usr)) + return + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) + opened = !opened + update_icon() + /obj/structure/extinguisher_cabinet/Destroy() QDEL_NULL(has_extinguisher) return ..() @@ -37,11 +53,16 @@ return if(istype(O, /obj/item/extinguisher)) if(!has_extinguisher && opened) + if(!user.drop_item()) + return user.drop_item(O) contents += O has_extinguisher = O + update_icon() to_chat(user, "You place [O] in [src].") + return TRUE else + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) opened = !opened else if(istype(O, /obj/item/weldingtool)) if(has_extinguisher) @@ -65,6 +86,7 @@ new material_drop(T) qdel(src) else + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) opened = !opened update_icon() @@ -81,21 +103,27 @@ to_chat(user, "You try to move your [temp.name], but cannot!") return if(has_extinguisher) + if(icon_state == "extinguisher_closed") + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) user.put_in_hands(has_extinguisher) to_chat(user, "You take [has_extinguisher] from [src].") has_extinguisher = null opened = 1 else + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) opened = !opened update_icon() /obj/structure/extinguisher_cabinet/attack_tk(mob/user) if(has_extinguisher) + if(icon_state == "extinguisher_closed") + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) has_extinguisher.loc = loc to_chat(user, "You telekinetically remove [has_extinguisher] from [src].") has_extinguisher = null opened = 1 else + playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) opened = !opened update_icon() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 154d4438530..1e3cb331cd1 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -273,8 +273,8 @@ var/obj/structure/cable/C = T.get_cable_node() if(C) playsound(loc, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5) - tesla_zap(src, 3, C.powernet.avail * 0.01) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot. - C.powernet.load += C.powernet.avail * 0.0375 // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock. + tesla_zap(src, 3, C.newavail() * 0.01) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot. + C.add_delayedload(C.newavail() * 0.0375) // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock. return ..() /obj/structure/grille/broken // Pre-broken grilles for map placement diff --git a/code/game/world.dm b/code/game/world.dm index 4681f46498a..86ca6d883bd 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -374,26 +374,28 @@ var/world_topic_spam_protect_time = world.timeofday // apply some settings from config.. /world/proc/update_status() + status = get_status_text() + +/proc/get_world_status_text() + return world.get_status_text() + +/world/proc/get_status_text() var/s = "" if(config && config.server_name) s += "[config.server_name] — " + s += "[station_name()] " + if(config && config.githuburl) + s+= "([game_version])" - s += "[station_name()]"; - s += " (" - s += "" //Change this to wherever you want the hub to link to. - s += "[game_version]" - s += "" - s += ")" - s += "
The Perfect Mix of RP & Action
" - - - + if(config && config.server_tag_line) + s += "
[config.server_tag_line]" + s += "
" var/list/features = list() if(ticker) - if(master_mode) + if(master_mode && master_mode != "secret") features += master_mode else features += "STARTING" @@ -401,39 +403,22 @@ var/world_topic_spam_protect_time = world.timeofday if(!enter_allowed) features += "closed" - features += abandon_allowed ? "respawn" : "no respawn" + if(config && config.server_extra_features) + features += config.server_extra_features if(config && config.allow_vote_mode) features += "vote" - if(config && config.allow_ai) - features += "AI allowed" + if(config && config.wikiurl) + features += "Wiki" - var/n = 0 - for(var/mob/M in GLOB.player_list) - if(M.client) - n++ - - if(n > 1) - features += "~[n] players" - else if(n > 0) - features += "~[n] player" - - /* - is there a reason for this? the byond site shows 'hosted by X' when there is a proper host already. - if(host) - features += "hosted by [host]" - */ - -// if(!host && config && config.hostedby) -// features += "hosted by [config.hostedby]" + if(abandon_allowed) + features += "respawn" if(features) - s += ": [jointext(features, ", ")]" + s += "[jointext(features, ", ")]" - /* does this help? I do not know */ - if(src.status != s) - src.status = s + return s #define FAILED_DB_CONNECTION_CUTOFF 5 var/failed_db_connections = 0 diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index c15600f7bb6..4fcf95dbfd2 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -78,7 +78,7 @@ var/global/nologevent = 0 body += "VV - " body += "[ADMIN_TP(M,"TP")] - " if(M.client) - body += "PM - " + body += "PM - " body += "[ADMIN_SM(M,"SM")] - " if(ishuman(M) && M.mind) body += "HM -" @@ -950,9 +950,6 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space for(var/obj/machinery/mech_bay_recharge_port/P in toArea) P.update_recharge_turf() - for(var/obj/machinery/power/apc/A in toArea) - A.init() - if(gamma_ship_location) gamma_ship_location = 0 else @@ -1096,7 +1093,7 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space dat += "" + id + "" dat += "" + ckey + "" dat += "Unlink" - + dat += "" usr << browse(dat, "window=duplicates;size=500x480") \ No newline at end of file diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 6b4072a800b..4a455cd8e5d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -72,7 +72,6 @@ var/list/admin_verbs_admin = list( /client/proc/change_human_appearance_admin, /* Allows an admin to change the basic appearance of human-based mobs */ /client/proc/change_human_appearance_self, /* Allows the human-based mob itself change its basic appearance */ /client/proc/debug_variables, - /client/proc/show_snpc_verbs, /client/proc/reset_all_tcs, /*resets all telecomms scripts*/ /client/proc/toggle_mentor_chat, /client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/ @@ -216,11 +215,6 @@ var/list/admin_verbs_proccall = list( /client/proc/callproc_datum, /client/proc/SDQL2_query ) -var/list/admin_verbs_snpc = list( - /client/proc/resetSNPC, - /client/proc/customiseSNPC, - /client/proc/hide_snpc_verbs -) var/list/admin_verbs_ticket = list( /client/proc/openAdminTicketUI, /client/proc/toggleticketlogs, @@ -291,8 +285,6 @@ var/list/admin_verbs_ticket = list( admin_verbs_proccall, admin_verbs_show_debug_verbs, /client/proc/readmin, - admin_verbs_snpc, - /client/proc/hide_snpc_verbs, admin_verbs_ticket ) @@ -1013,28 +1005,6 @@ var/list/admin_verbs_ticket = list( log_admin("[key_name(usr)] told everyone to man up and deal with it.") message_admins("[key_name_admin(usr)] told everyone to man up and deal with it.") -/client/proc/show_snpc_verbs() - set name = "Show SNPC Verbs" - set category = "Admin" - - if(!check_rights(R_ADMIN)) - return - - verbs += admin_verbs_snpc - verbs -= /client/proc/show_snpc_verbs - to_chat(src, "SNPC verbs have been toggled on.") - -/client/proc/hide_snpc_verbs() - set name = "Hide SNPC Verbs" - set category = "Admin" - - if(!check_rights(R_ADMIN)) - return - - verbs -= admin_verbs_snpc - verbs += /client/proc/show_snpc_verbs - to_chat(src, "SNPC verbs have been toggled off.") - /client/proc/toggle_advanced_interaction() set name = "Toggle Advanced Admin Interaction" set category = "Admin" diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index f50bae146c3..970defdd672 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -61,7 +61,7 @@ } - function expand(id,job,name,real_name,image,key,ip,antagonist,UID,eyeUID){ + function expand(id,job,name,real_name,image,key,ip,antagonist,mobUID,clientUID,eyeUID){ clearAll(); @@ -75,13 +75,13 @@ body += ""; - body += "PP - " + body += "PP - " body += "N - " - body += "VV - " - body += "TP - " - body += "PM - " - body += "SM - " - body += "FLW" + body += "VV - " + body += "TP - " + body += "PM - " + body += "SM - " + body += "FLW" if(eyeUID) body += "|EYE" body += "
" @@ -293,6 +293,7 @@ var/mob/living/silicon/ai/A = M if(A.client && A.eyeobj) // No point following clientless AI eyes M_eyeUID = "[A.eyeobj.UID()]" + var/clientUID = M.client ? M.client.UID() : null //output for each mob dat += {" @@ -300,7 +301,7 @@ [M_name] - [M_rname] - [M_key] ([M_job]) @@ -371,7 +372,7 @@ dat += {"[(M.client ? "[M.client]" : "No client")] X - PM + PM "} switch(is_special_character(M)) if(0) @@ -389,16 +390,13 @@ /datum/admins/proc/check_antagonists_line(mob/M, caption = "", close = 1) var/logout_status - if(istype(M, /mob/living/carbon/human/interactive)) - logout_status = " (snpc)" - else - logout_status = M.client ? "" : " (logged out)" + logout_status = M.client ? "" : " (logged out)" var/dname = M.real_name if(!dname) dname = M return {"[dname][caption][logout_status][M.stat == 2 ? " (DEAD)" : ""] - PM[close ? "" : ""]"} + PM[close ? "" : ""]"} /datum/admins/proc/check_antagonists() if(!check_rights(R_ADMIN)) return @@ -473,7 +471,7 @@ var/mob/M = blob.current if(M) dat += "[ADMIN_PP(M,"[M.real_name]")][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]" - dat += "PM" + dat += "PM" else dat += "Blob not found!" dat += "" diff --git a/code/modules/admin/verbs/infiltratorteam_syndicate.dm b/code/modules/admin/verbs/infiltratorteam_syndicate.dm index 551076be62a..4597a838733 100644 --- a/code/modules/admin/verbs/infiltratorteam_syndicate.dm +++ b/code/modules/admin/verbs/infiltratorteam_syndicate.dm @@ -170,7 +170,7 @@ var/global/sent_syndicate_infiltration_team = 0 equip_or_collect(new /obj/item/pda(src), slot_in_backpack) // Other gear - equip_to_slot_or_del(new /obj/item/clothing/shoes/syndigaloshes(src), slot_shoes) + equip_to_slot_or_del(new /obj/item/clothing/shoes/chameleon/noslip(src), slot_shoes) var/obj/item/card/id/syndicate/W = new(src) if (flag_mgmt) diff --git a/code/modules/arcade/arcade_prize.dm b/code/modules/arcade/arcade_prize.dm index 94c265848b7..a91e392e125 100644 --- a/code/modules/arcade/arcade_prize.dm +++ b/code/modules/arcade/arcade_prize.dm @@ -42,8 +42,8 @@ possible_contents = list(/obj/random/carp_plushie) /obj/item/toy/prizeball/plushie - name = "animal plushie capsule" - desc = "Contains one cuddly animal plushie!" + name = "plushie capsule" + desc = "Contains one cuddly plushie!" possible_contents = list(/obj/random/plushie) /obj/item/toy/prizeball/figure diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm index a68071f8f44..4d2e062677a 100644 --- a/code/modules/arcade/prize_datums.dm +++ b/code/modules/arcade/prize_datums.dm @@ -157,8 +157,8 @@ var/global/datum/prizes/global_prizes = new cost = 65 /datum/prize_item/plushie - name = "Random Animal Plushie" - desc = "A colorful animal-shaped plush toy." + name = "Random Plushie" + desc = "A colorful plush toy." typepath = /obj/item/toy/prizeball/plushie cost = 75 diff --git a/code/modules/awaymissions/mission_code/spacehotel.dm b/code/modules/awaymissions/mission_code/spacehotel.dm index 0328dea5b53..fc8b4f4d260 100644 --- a/code/modules/awaymissions/mission_code/spacehotel.dm +++ b/code/modules/awaymissions/mission_code/spacehotel.dm @@ -152,14 +152,6 @@ /obj/machinery/door/unpowered/hotel_door/autoclose() if(!density && !operating && autoclose) close() - -/obj/machinery/door/unpowered/hotel_door/emag_act(mob/user) - if(isliving(user) && density) - var/obj/effect/hotel_controller/H - if(H.controller) - H.controller.deploy_sec(user) - ..() - /obj/item/card/hotel_card name = "Key Card" icon_state = "guest" @@ -283,20 +275,4 @@ spawn(300) if(D.occupant == deadbeat) // they still haven't checked out... - deploy_sec(deadbeat) - checkout(roomid) - -/obj/effect/hotel_controller/proc/deploy_sec(mob/living/target) - if(!istype(target) || !istype(get_area(target), /area/awaymission/spacehotel)) - return - - var/list/secs[0] - for(var/mob/living/carbon/human/interactive/away/hotel/guard/M in get_area(src)) - if(!M.retal) - secs += M - var/mob/living/carbon/human/interactive/away/hotel/guard/S = safepick(secs) - if(!S) - return - - S.retal_target = target - S.retal = 1 + checkout(roomid) \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm b/code/modules/awaymissions/mission_code/spacehotel_npcs.dm deleted file mode 100644 index 2a524ab738c..00000000000 --- a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm +++ /dev/null @@ -1,132 +0,0 @@ -/mob/living/carbon/human/interactive/away/hotel - away_area = /area/awaymission/spacehotel - override_under = /obj/item/clothing/under/mafia - chattyness = SNPC_CHANCE_TALK / 4 - -/mob/living/carbon/human/interactive/away/hotel/Initialize(mapload) - . = ..(mapload, /datum/species/skrell) - -/mob/living/carbon/human/interactive/away/hotel/doSetup() - ..() - MYID.access = list(access_syndicate) - RPID.access = list(access_syndicate) - -/mob/living/carbon/human/interactive/away/hotel/guard - default_job = /datum/job/officer - -/mob/living/carbon/human/interactive/away/hotel/guard/doSetup() - ..("Guard") - - // anti-pinata cheese - var/obj/item/implant/dust/D = new /obj/item/implant/dust(src) - D.implant(src) - - for(var/obj/item/I in get_all_slots()) - I.flags |= NODROP - -/mob/living/carbon/human/interactive/away/hotel/guard/KnockOut() - // you'll never take me alive (this triggers the implant) - emote("deathgasp") - if(stat != DEAD) - // mission failed. we'll get em next time - ..() - -/mob/living/carbon/human/interactive/away/hotel/chef - default_job = /datum/job/chef - away_area = /area/awaymission/spacehotel/kitchen - override_under = /obj/item/clothing/under/mafia/vest - -/mob/living/carbon/human/interactive/away/hotel/bartender - default_job = /datum/job/bartender - override_under = /obj/item/clothing/under/mafia/vest - -/mob/living/carbon/human/interactive/away/hotel/concierge - override_under = /obj/item/clothing/under/mafia/white - away_area = /area/awaymission/spacehotel/reception - var/list/known_guests[0] - var/obj/effect/hotel_controller/hotel - var/obj/item/card/id/last_seen_id = null - -/mob/living/carbon/human/interactive/away/hotel/concierge/random() - ..() - equip_or_collect(new /obj/item/clipboard(src), slot_l_hand) - -/mob/living/carbon/human/interactive/away/hotel/concierge/doSetup() - ..("Concierge") - -/mob/living/carbon/human/interactive/away/hotel/concierge/setup_job() - favoured_types = list(/obj/item/paper, /obj/item/clipboard) - functions += list("stamping", "concierge") - restrictedJob = 1 - -/mob/living/carbon/human/interactive/away/hotel/concierge/proc/concierge() - if(!hotel) - hotel = hotel.controller - if(!hotel) - return - - var/verbs_use = pick_list(speak_file, "verbs_use") - var/verbs_touch = pick_list(speak_file, "verbs_touch") - var/verbs_move = pick_list(speak_file, "verbs_move") - var/nouns_generic = pick_list(speak_file, "nouns_generic") - var/adjective_insult = pick_list(speak_file, "adjective_insult") - var/adjective_objects = pick_list(speak_file, "adjective_objects") - var/adjective_generic = pick_list(speak_file, "adjective_generic") - var/curse_words = pick_list(speak_file, "curse_words") - - var/found = 0 - for(var/mob/living/carbon/human/H in nearby - known_guests) - pointed(H) - known_guests += H - found = 1 - if(found) - say("Welcome to [hotel], [nouns_generic]! Please check in by [ing_verb(verbs_move)] and [ing_verb(verbs_use)] your [adjective_objects] ID onto the table.") - return - - var/obj/item/card/id - var/id_seen = 0 - for(var/obj/item/card/id/I in get_area(src)) - id_seen = 1 - if(I != last_seen_id) - id = I - if(!id_seen) - last_seen_id = null - return - if(!id) - return - var/turf/idloc = get_turf(id) - if(!Adjacent(idloc)) - tryWalk(idloc) - else - // is the last jerk that touched it over here? - var/mob/id_owner - for(var/mob/living/carbon/human/H in nearby) - if(H.ckey == id.fingerprintslast) - id_owner = H - break - - if(!id_owner) - say("Whose card is this?") - pointed(id) - return - - last_seen_id = id - // Checking in or out? - if(id_owner in hotel.guests) - // Check out - say ("Hope you enjoyed your [adjective_objects] stay at our [adjective_generic] hotel!") - hotel.checkout(hotel.guests[id_owner]) - else - // pick a room - var/obj/machinery/door/unpowered/hotel_door/D = safepick(hotel.vacant_rooms) - if(!D) - say("Sorry, all the [adjective_objects] are occupied currently.") - else - // Check in - say("$100 per 10 minutes. The cost will be automatically [past_verb(verbs_touch)] while you're checked in.") - - var/obj/item/card/hotel_card/K = hotel.checkin(D.id, id_owner, id) - if(K) - K.forceMove(idloc) - else - say("Your [adjective_insult] [curse_words] card was rejected.") diff --git a/code/modules/awaymissions/snpc.dm b/code/modules/awaymissions/snpc.dm deleted file mode 100644 index 8d65aa44a92..00000000000 --- a/code/modules/awaymissions/snpc.dm +++ /dev/null @@ -1,85 +0,0 @@ -/mob/living/carbon/human/interactive/away - var/away_area = /area/awaymission // their overriden job area - var/override_under = null // optional type for uniform, else default for job - var/squad_member = 0 // was spawned by squad - var/home_z - -/mob/living/carbon/human/interactive/away/Initialize(mapload) - . = ..() - TRAITS |= TRAIT_ROBUST - faction += "away" - -/mob/living/carbon/human/interactive/away/random() - ..() - // a little hacky but it should prevent doubled uniforms - if(ispath(override_under, /obj/item/clothing/under)) - var/old_under = w_uniform - w_uniform = null - equip_to_slot(new override_under(src), slot_w_uniform) - qdel(old_under) - -/mob/living/carbon/human/interactive/away/doSetup() - ..() - var/datum/data/pda/app/messenger/M = MYPDA.find_program(/datum/data/pda/app/messenger) - M.toff = 1 - -/mob/living/carbon/human/interactive/away/job2area() - return away_area - -/mob/living/carbon/human/interactive/away/doProcess() - if(!home_z) - home_z = get_turf(z) - if(home_z != get_turf(z)) - gib() - ..() - -/obj/effect/spawner/snpc_squad - name = "squad spawner" - icon = 'icons/mob/screen_gen.dmi' - icon_state = "x" - density = 0 - opacity = 0 - invisibility = 101 - var/squad_type = /mob/living/carbon/human/interactive/away - var/squad_size = 3 - - var/global/list/squads[0] - var/list/squad - -/obj/effect/spawner/snpc_squad/New() - START_PROCESSING(SSobj, src) - - squad = squads[squad_type] - if(!squad) - squad = list() - squads[squad_type] = squad - squad += src - -/obj/effect/spawner/snpc_squad/Destroy() - squad = null - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/effect/spawner/snpc_squad/process() - // check squad memebers - var/living = 0 - for(var/mob/living/carbon/human/interactive/away/A in squad) - if(!A.stat) - living++ - else - // see if anyone's looking, if not, despawn - var/can_despawn = 1 - for(var/mob/living/M in viewers(A, world.view + 1)) - if(M.client) - living++ // dead guy that can be seen still takes up a slot - can_despawn = 0 - break - if(can_despawn) - squad -= A - qdel(A) - - // spawn new ones - if(living < squad_size && !length(viewers(src, world.view))) - var/mob/living/carbon/human/interactive/away/A = new squad_type(loc) - squad += A - A.squad_member = 1 diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 7d12142eb76..aa928ef35e6 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -50,7 +50,7 @@ var/received_irc_pm = -99999 var/irc_admin //IRC admin that spoke with them last. var/mute_irc = 0 - + var/ssd_warning_acknowledged = FALSE //////////////////////////////////// //things that require the database// diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index d8634e4ba98..afb0ce7a209 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -9,6 +9,7 @@ #define MIN_CLIENT_VERSION 0 //Just an ambiguously low version for now, I don't want to suddenly stop people playing. //I would just like the code ready should it ever need to be used. #define SUGGESTED_CLIENT_VERSION 511 // only integers (e.g: 510, 511) useful here. Does not properly handle minor versions (e.g: 510.58, 511.848) +#define SSD_WARNING_TIMER 30 // cycles, not seconds, so 30=60s /* When somebody clicks a link in game, this Topic is called first. @@ -73,9 +74,7 @@ //Admin PM if(href_list["priv_msg"]) var/client/C = locate(href_list["priv_msg"]) - if(ismob(C)) //Old stuff can feed-in mobs instead of clients - var/mob/M = C - C = M.client + if(!C) // Might be a stealthmin ID, so pass it in straight C = href_list["priv_msg"] else if(C.UID() != href_list["priv_msg"]) @@ -227,6 +226,9 @@ vote_on_poll(pollid, optionid, 1) src << browse(null, "window=playerpoll") handle_player_polling() + if(href_list["ssdwarning"]) + ssd_warning_acknowledged = TRUE + to_chat(src, "SSD warning acknowledged.") switch(href_list["action"]) if("openLink") @@ -775,3 +777,16 @@ winset(src, "rpane.changelog", "background-color=#40628a;text-color=#FFFFFF") else winset(src, "rpane.changelog", "background-color=none;text-color=#000000") + + +/client/proc/send_ssd_warning(mob/M) + if(!config.ssd_warning) + return FALSE + if(ssd_warning_acknowledged) + return FALSE + if(M && M.player_logged < SSD_WARNING_TIMER) + return FALSE + to_chat(src, "Interacting with SSD players is against server rules unless you've ahelped first for permission. If you have, confirm that and proceed.") + return TRUE + +#undef SSD_WARNING_TIMER \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 484151de797..67cb12689ce 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -159,6 +159,7 @@ var/list/color_view = null//overrides client.color while worn var/prescription = 0 var/prescription_upgradable = 0 + var/over_mask = FALSE //Whether or not the eyewear is rendered above the mask. Purely cosmetic. strip_delay = 20 // but seperated to allow items to protect but not impair vision, like space helmets put_on_delay = 25 burn_state = FIRE_PROOF @@ -173,6 +174,28 @@ SEE_PIXELS// if an object is located on an unlit area, but some of its pixels ar BLIND // can't see anything */ +/obj/item/clothing/glasses/verb/adjust_eyewear() //Adjust eyewear to be worn above or below the mask. + set name = "Adjust Eyewear" + set category = "Object" + set desc = "Adjust your eyewear to be worn over or under a mask." + set src in usr + + var/mob/living/carbon/human/user = usr + if(!istype(user)) + return + if(user.incapacitated()) //Dead spessmen adjust no glasses. Resting/buckled ones do, though + return + + var/action_fluff = "You adjust \the [src]" + if(user.glasses == src) + if(!user.canUnEquip(src)) + to_chat(usr, "[src] is stuck to you!") + return + if(attack_hand(user)) //Remove the glasses for this action. Prevents logic-defying instances where glasses phase through your mask as it ascends/descends to another plane of existence. + action_fluff = "You remove \the [src] and adjust it" + + over_mask = !over_mask + to_chat(user, "[action_fluff] to be worn [over_mask ? "over" : "under"] a mask.") //Gloves /obj/item/clothing/gloves @@ -574,8 +597,9 @@ BLIND // can't see anything "Drask" = 'icons/mob/species/drask/uniform.dmi', "Grey" = 'icons/mob/species/grey/uniform.dmi' ) - var/has_sensor = 1//For the crew computer 2 = unable to change mode - var/sensor_mode = 0 + var/has_sensor = TRUE//For the crew computer 2 = unable to change mode + var/sensor_mode = SENSOR_OFF + var/random_sensor = TRUE /* 1 = Report living/dead 2 = Report detailed damages @@ -587,7 +611,8 @@ BLIND // can't see anything var/basecolor /obj/item/clothing/under/rank/New() - sensor_mode = pick(0,1,2,3) + if(random_sensor) + sensor_mode = pick(SENSOR_OFF, SENSOR_LIVING, SENSOR_VITALS, SENSOR_COORDS) ..() /obj/item/clothing/under/Destroy() @@ -627,38 +652,6 @@ BLIND // can't see anything ..() -/obj/item/clothing/under/attack_hand(mob/user as mob) - //only forward to the attached accessory if the clothing is equipped (not in a storage) - if(accessories.len && src.loc == user) - for(var/obj/item/clothing/accessory/A in accessories) - A.attack_hand(user) - return - - if(ishuman(usr) && src.loc == user) //make it harder to accidentally undress yourself - return - - ..() - -/obj/item/clothing/under/MouseDrop(obj/over_object as obj) - if(ishuman(usr)) - //makes sure that the clothing is equipped so that we can't drag it into our hand from miles away. - if(!(src.loc == usr)) - return - if(!( usr.restrained() ) && !( usr.stat ) && ( over_object )) - if(!usr.canUnEquip(src)) - to_chat(usr, "[src] appears stuck on you!") - return - switch(over_object.name) - if("r_hand") - usr.unEquip(src) - usr.put_in_r_hand(src) - if("l_hand") - usr.unEquip(src) - usr.put_in_l_hand(src) - src.add_fingerprint(usr) - return - return - /obj/item/clothing/under/examine(mob/user) ..(user) switch(src.sensor_mode) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 0c4dba9ae49..1bd53217770 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -162,11 +162,6 @@ item_state = "sexymime" burn_state = FLAMMABLE -/obj/item/clothing/mask/gas/death_commando - name = "Death Commando Mask" - icon_state = "death_commando_mask" - item_state = "death_commando_mask" - /obj/item/clothing/mask/gas/cyborg name = "cyborg visor" desc = "Beep boop" diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm deleted file mode 100644 index b5b6298dcb2..00000000000 --- a/code/modules/clothing/masks/voice.dm +++ /dev/null @@ -1,38 +0,0 @@ -/obj/item/voice_changer - name = "voice changer" - desc = "A voice scrambling module. If you can see this, report it as a bug on the tracker." - var/voice //If set and item is present in mask/suit, this name will be used for the wearer's speech. - var/active - -/obj/item/clothing/mask/gas/voice - name = "gas mask" -// desc = "A face-covering mask that can be connected to an air supply. It seems to house some odd electronics." - var/obj/item/voice_changer/changer - burn_state = FIRE_PROOF - -/obj/item/clothing/mask/gas/voice/verb/Toggle_Voice_Changer() - set category = "Object" - set src in usr - - changer.active = !changer.active - to_chat(usr, "You [changer.active ? "enable" : "disable"] the voice-changing module in \the [src].") - -/obj/item/clothing/mask/gas/voice/verb/Set_Voice(name as text) - set category = "Object" - set src in usr - - var/voice = sanitize(copytext(name,1,MAX_MESSAGE_LEN)) - if(!voice || !length(voice)) return - changer.voice = voice - to_chat(usr, "You are now mimicking [changer.voice].") - -/obj/item/clothing/mask/gas/voice/New() - ..() - changer = new(src) - -/obj/item/clothing/mask/gas/voice/clown - name = "clown wig and mask" - desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask." - icon_state = "clown" - item_state = "clown_hat" - flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR \ No newline at end of file diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index f3a2efed260..d4411fbdbe6 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -1,21 +1,3 @@ -/obj/item/clothing/shoes/syndigaloshes - desc = "A pair of brown shoes. They seem to have extra grip." - name = "brown shoes" - icon_state = "brown" - item_state = "brown" - permeability_coefficient = 0.05 - flags = NOSLIP - origin_tech = "syndicate=2" - burn_state = FIRE_PROOF - var/list/clothing_choices = list() - silence_steps = 1 - -/obj/item/clothing/shoes/syndigaloshes/black - name = "black shoes" - icon_state = "black" - item_color = "black" - desc = "A pair of black shoes. They seem to have extra grip." - /obj/item/clothing/shoes/mime name = "mime shoes" icon_state = "mime" diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index aa62763a6d3..bfb326eae1d 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -269,14 +269,13 @@ /obj/item/rig_module/voice/New() ..() voice_holder = new(src) - voice_holder.active = 0 + voice_holder.active = FALSE /obj/item/rig_module/voice/installed() ..() holder.speech = src /obj/item/rig_module/voice/engage() - if(!..()) return 0 @@ -287,17 +286,17 @@ switch(choice) if("Enable") - active = 1 - voice_holder.active = 1 + active = TRUE + voice_holder.active = TRUE to_chat(usr, "You enable the speech synthesiser.") if("Disable") - active = 0 - voice_holder.active = 0 + active = FALSE + voice_holder.active = FALSE to_chat(usr, "You disable the speech synthesiser.") if("Set Name") var/raw_choice = sanitize(input(usr, "Please enter a new name.") as text|null, MAX_NAME_LEN) if(!raw_choice) - return 0 + return FALSE voice_holder.voice = raw_choice to_chat(usr, "You are now mimicking [voice_holder.voice].") return 1 diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 13ef3e074da..0903710ddc8 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -345,7 +345,7 @@ name = "winter coat" desc = "A heavy jacket made from 'synthetic' animal furs." icon_state = "wintercoat" - item_state = "labcoat" + item_state = "coatwinter" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT @@ -369,6 +369,7 @@ /obj/item/clothing/suit/hooded/wintercoat/captain name = "captain's winter coat" icon_state = "wintercoat_captain" + item_state = "coatcaptain" armor = list(melee = 25, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0) allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton/telescopic) hoodtype = /obj/item/clothing/head/winterhood/captain @@ -379,6 +380,7 @@ /obj/item/clothing/suit/hooded/wintercoat/security name = "security winter coat" icon_state = "wintercoat_sec" + item_state = "coatsecurity" armor = list(melee = 10, bullet = 10, laser = 10, energy = 5, bomb = 15, bio = 0, rad = 0) allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton/telescopic) hoodtype = /obj/item/clothing/head/winterhood/security @@ -389,6 +391,7 @@ /obj/item/clothing/suit/hooded/wintercoat/medical name = "medical winter coat" icon_state = "wintercoat_med" + item_state = "coatmedical" allowed = list(/obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0) hoodtype = /obj/item/clothing/head/winterhood/medical @@ -399,6 +402,7 @@ /obj/item/clothing/suit/hooded/wintercoat/science name = "science winter coat" icon_state = "wintercoat_sci" + item_state = "coatscience" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0) hoodtype = /obj/item/clothing/head/winterhood/science @@ -409,6 +413,7 @@ /obj/item/clothing/suit/hooded/wintercoat/engineering name = "engineering winter coat" icon_state = "wintercoat_engi" + item_state = "coatengineer" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20) allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/t_scanner, /obj/item/rcd) hoodtype = /obj/item/clothing/head/winterhood/engineering @@ -419,6 +424,7 @@ /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos name = "atmospherics winter coat" icon_state = "wintercoat_atmos" + item_state = "coatatmos" hoodtype = /obj/item/clothing/head/winterhood/engineering/atmos /obj/item/clothing/head/winterhood/engineering/atmos @@ -427,6 +433,7 @@ /obj/item/clothing/suit/hooded/wintercoat/hydro name = "hydroponics winter coat" icon_state = "wintercoat_hydro" + item_state = "coathydro" allowed = list(/obj/item/reagent_containers/spray, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/hatchet, /obj/item/storage/bag/plants) hoodtype = /obj/item/clothing/head/winterhood/hydro @@ -436,6 +443,7 @@ /obj/item/clothing/suit/hooded/wintercoat/cargo name = "cargo winter coat" icon_state = "wintercoat_cargo" + item_state = "coatcargo" hoodtype = /obj/item/clothing/head/winterhood/cargo /obj/item/clothing/head/winterhood/cargo @@ -444,6 +452,7 @@ /obj/item/clothing/suit/hooded/wintercoat/miner name = "mining winter coat" icon_state = "wintercoat_miner" + item_state = "coatminer" allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) hoodtype = /obj/item/clothing/head/winterhood/miner diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm index b320237996e..b08a1ce72c9 100644 --- a/code/modules/clothing/under/chameleon.dm +++ b/code/modules/clothing/under/chameleon.dm @@ -1,86 +1,478 @@ +#define EMP_RANDOMISE_TIME 300 + +/datum/action/chameleon_outfit + name = "Select Chameleon Outfit" + button_icon_state = "chameleon_outfit" + var/list/outfit_options //By default, this list is shared between all instances. It is not static because if it were, subtypes would not be able to have their own. If you ever want to edit it, copy it first. + +/datum/action/chameleon_outfit/New() + ..() + initialize_outfits() + +/datum/action/chameleon_outfit/proc/initialize_outfits() + var/static/list/standard_outfit_options + if(!standard_outfit_options) + standard_outfit_options = list() + for(var/path in subtypesof(/datum/outfit/job)) + var/datum/outfit/O = path + standard_outfit_options[initial(O.name)] = path + sortTim(standard_outfit_options, /proc/cmp_text_asc) + outfit_options = standard_outfit_options + +/datum/action/chameleon_outfit/Trigger() + return select_outfit(owner) + +/datum/action/chameleon_outfit/proc/select_outfit(mob/user) + if(!user || !IsAvailable()) + return FALSE + var/selected = input("Select outfit to change into", "Chameleon Outfit") as null|anything in outfit_options + if(!IsAvailable() || QDELETED(src) || QDELETED(user)) + return FALSE + var/outfit_type = outfit_options[selected] + if(!outfit_type) + return FALSE + var/datum/outfit/O = new outfit_type() + var/list/outfit_types = O.get_chameleon_disguise_info() + + for(var/V in user.chameleon_item_actions) + var/datum/action/item_action/chameleon/change/A = V + var/done = FALSE + for(var/T in outfit_types) + for(var/name in A.chameleon_list) + if(A.chameleon_list[name] == T) + A.update_look(user, T) + outfit_types -= T + done = TRUE + break + if(done) + break + //hardsuit helmets/suit hoods + if(ispath(O.suit, /obj/item/clothing/suit/hooded) && ishuman(user)) + var/mob/living/carbon/human/H = user + //make sure they are actually wearing the suit, not just holding it, and that they have a chameleon hat + if(istype(H.wear_suit, /obj/item/clothing/suit/chameleon) && istype(H.head, /obj/item/clothing/head/chameleon)) + var/helmet_type + var/obj/item/clothing/suit/hooded/hooded = O.suit + helmet_type = initial(hooded.hoodtype) + + if(helmet_type) + var/obj/item/clothing/head/chameleon/hat = H.head + hat.chameleon_action.update_look(user, helmet_type) + qdel(O) + return TRUE + + +/datum/action/item_action/chameleon/change + name = "Chameleon Change" + var/list/chameleon_blacklist = list() //This is a typecache + var/list/chameleon_list = list() + var/chameleon_type = null + var/chameleon_name = "Item" + + var/emp_timer + +/datum/action/item_action/chameleon/change/Grant(mob/M) + if(M && (owner != M)) + if(!M.chameleon_item_actions) + M.chameleon_item_actions = list(src) + var/datum/action/chameleon_outfit/O = new /datum/action/chameleon_outfit() + O.Grant(M) + else + M.chameleon_item_actions |= src + ..() + +/datum/action/item_action/chameleon/change/Remove(mob/M) + if(M && (M == owner)) + LAZYREMOVE(M.chameleon_item_actions, src) + if(!LAZYLEN(M.chameleon_item_actions)) + var/datum/action/chameleon_outfit/O = locate(/datum/action/chameleon_outfit) in M.actions + qdel(O) + ..() + +/datum/action/item_action/chameleon/change/proc/initialize_disguises() + if(button) + button.name = "Change [chameleon_name] Appearance" + + chameleon_blacklist |= typecacheof(target.type) + for(var/V in typesof(chameleon_type)) + if(ispath(V) && ispath(V, /obj/item)) + var/obj/item/I = V + if(chameleon_blacklist[V] || (initial(I.flags) & ABSTRACT) || !initial(I.icon_state)) + continue + var/chameleon_item_name = "[initial(I.name)] ([initial(I.icon_state)])" + chameleon_list[chameleon_item_name] = I + +/datum/action/item_action/chameleon/change/proc/select_look(mob/user) + var/obj/item/picked_item + var/picked_name + picked_name = input("Select [chameleon_name] to change into", "Chameleon [chameleon_name]", picked_name) as null|anything in chameleon_list + if(!picked_name) + return + picked_item = chameleon_list[picked_name] + if(!picked_item) + return + update_look(user, picked_item) + +/datum/action/item_action/chameleon/change/proc/random_look(mob/user) + var/picked_name = pick(chameleon_list) + // If a user is provided, then this item is in use, and we + // need to update our icons and stuff + + if(user) + update_look(user, chameleon_list[picked_name]) + + // Otherwise, it's likely a random initialisation, so we + // don't have to worry + + else + update_item(chameleon_list[picked_name]) + +/datum/action/item_action/chameleon/change/proc/update_look(mob/user, obj/item/picked_item) + if(isliving(user)) + var/mob/living/C = user + if(C.stat != CONSCIOUS) + return + + update_item(picked_item) + var/obj/item/thing = target + thing.update_slot_icon() + UpdateButtonIcon() + +/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item) + target.name = initial(picked_item.name) + target.desc = initial(picked_item.desc) + target.icon_state = initial(picked_item.icon_state) + if(isitem(target)) + var/obj/item/I = target + I.item_state = initial(picked_item.item_state) + I.item_color = initial(picked_item.item_color) + if(istype(I, /obj/item/clothing) && istype(initial(picked_item), /obj/item/clothing)) + var/obj/item/clothing/CL = I + var/obj/item/clothing/PCL = picked_item + CL.flags_cover = initial(PCL.flags_cover) + target.icon = initial(picked_item.icon) + +/datum/action/item_action/chameleon/change/Trigger() + if(!IsAvailable()) + return + + select_look(owner) + return 1 + +/datum/action/item_action/chameleon/change/proc/emp_randomise(var/amount = EMP_RANDOMISE_TIME) + START_PROCESSING(SSprocessing, src) + random_look(owner) + + var/new_value = world.time + amount + if(new_value > emp_timer) + emp_timer = new_value + +/datum/action/item_action/chameleon/change/process() + if(world.time > emp_timer) + STOP_PROCESSING(SSprocessing, src) + return + random_look(owner) + /obj/item/clothing/under/chameleon //starts off as black name = "black jumpsuit" icon_state = "black" item_state = "bl_suit" item_color = "black" - desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist." - origin_tech = "syndicate=2" - var/list/clothing_choices = list() - burn_state = FIRE_PROOF - armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0) + desc = "It's a plain jumpsuit. It has a small dial on the wrist." + sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle?? + random_sensor = FALSE + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - New() - ..() - var/blocked = list(/obj/item/clothing/under/color/random, /obj/item/clothing/under/rank/centcom) // Stops random coloured jumpsuit and undefined centcomm suit appearing in the list. - for(var/U in subtypesof(/obj/item/clothing/under/color) - blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V + var/datum/action/item_action/chameleon/change/chameleon_action - for(var/U in subtypesof(/obj/item/clothing/under/rank) - blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V - return +/obj/item/clothing/under/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/under + chameleon_action.chameleon_name = "Jumpsuit" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/under, /obj/item/clothing/under/color, /obj/item/clothing/under/rank), only_root_path = TRUE) + chameleon_action.initialize_disguises() +/obj/item/clothing/under/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() - attackby(obj/item/clothing/under/U as obj, mob/user as mob, params) - ..() - if(istype(U, /obj/item/clothing/under/chameleon)) - to_chat(user, "Nothing happens.") - return - if(istype(U, /obj/item/clothing/under)) - if(src.clothing_choices.Find(U)) - to_chat(user, "Pattern is already recognised by the suit.") - return - src.clothing_choices += U - to_chat(user, "Pattern absorbed by the suit.") +/obj/item/clothing/under/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) +/obj/item/clothing/suit/chameleon + name = "armor" + desc = "A slim armored vest that protects against most types of damage." + icon_state = "armor" + item_state = "armor" + blood_overlay_type = "armor" + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - emp_act(severity) - name = "psychedelic" - desc = "Groovy!" - icon_state = "psyche" - item_color = "psyche" - usr.update_inv_w_uniform() - spawn(200) - name = initial(name) - icon_state = initial(icon_state) - item_color = initial(item_color) - desc = initial(desc) - usr.update_inv_w_uniform() - ..() + var/datum/action/item_action/chameleon/change/chameleon_action +/obj/item/clothing/suit/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/suit + chameleon_action.chameleon_name = "Suit" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor), only_root_path = TRUE) + chameleon_action.initialize_disguises() - verb/change() - set name = "Change Color" - set category = "Object" - set src in usr +/obj/item/clothing/suit/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() - if(icon_state == "psyche") - to_chat(usr, "Your suit is malfunctioning") - return +/obj/item/clothing/suit/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) - var/obj/item/clothing/under/A - A = input("Select Colour to change it to", "BOOYEA", A) in clothing_choices - if(!A) - return +/obj/item/clothing/glasses/chameleon + name = "Optical Meson Scanner" + desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." + icon_state = "meson" + item_state = "meson" + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - desc = null - permeability_coefficient = 0.90 + var/datum/action/item_action/chameleon/change/chameleon_action - desc = A.desc - name = A.name - icon_state = A.icon_state - item_state = A.item_state - item_color = A.item_color - usr.update_inv_w_uniform() //so our overlays update. +/obj/item/clothing/glasses/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/glasses + chameleon_action.chameleon_name = "Glasses" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() +/obj/item/clothing/glasses/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() +/obj/item/clothing/glasses/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) -/obj/item/clothing/under/chameleon/all/New() - ..() - var/blocked = list(/obj/item/clothing/under/chameleon, /obj/item/clothing/under/chameleon/all) - //to prevent an infinite loop - for(var/U in typesof(/obj/item/clothing/under)-blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V +/obj/item/clothing/gloves/chameleon + desc = "These gloves will protect the wearer from electric shock." + name = "insulated gloves" + icon_state = "yellow" + item_state = "ygloves" + + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/gloves/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/gloves + chameleon_action.chameleon_name = "Gloves" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/gloves, /obj/item/clothing/gloves/color), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/clothing/gloves/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/gloves/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/head/chameleon + name = "grey cap" + desc = "It's a baseball hat in a tasteful grey colour." + icon_state = "greysoft" + item_color = "grey" + + resistance_flags = NONE + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/head/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/head + chameleon_action.chameleon_name = "Hat" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/head/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/head/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/mask/chameleon + name = "gas mask" + desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate + icon_state = "gas_alt" + item_state = "gas_alt" + resistance_flags = NONE + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + flags = AIRTIGHT | BLOCK_GAS_SMOKE_EFFECT + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + gas_transfer_coefficient = 0.01 + permeability_coefficient = 0.01 + flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH + + var/obj/item/voice_changer/voice_changer + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/mask/chameleon/Initialize() + . = ..() + + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/mask + chameleon_action.chameleon_name = "Mask" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + + voice_changer = new(src) + +/obj/item/clothing/mask/chameleon/Destroy() + QDEL_NULL(voice_changer) + return ..() + +/obj/item/clothing/mask/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/mask/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/shoes/chameleon + name = "black shoes" + icon_state = "black" + item_color = "black" + desc = "A pair of black shoes." + permeability_coefficient = 0.05 + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/shoes/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/shoes + chameleon_action.chameleon_name = "Shoes" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/shoes/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/shoes/chameleon/noslip + name = "black shoes" + icon_state = "black" + item_color = "black" + desc = "A pair of black shoes." + flags = NOSLIP + +/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/storage/backpack/chameleon + name = "backpack" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/storage/backpack/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/storage/backpack + chameleon_action.chameleon_name = "Backpack" + chameleon_action.initialize_disguises() + +/obj/item/storage/backpack/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/storage/backpack/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/storage/belt/chameleon + name = "toolbelt" + desc = "Holds tools." + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/storage/belt/chameleon/Initialize() + . = ..() + + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/storage/belt + chameleon_action.chameleon_name = "Belt" + chameleon_action.initialize_disguises() + +/obj/item/storage/belt/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/storage/belt/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/radio/headset/chameleon + name = "radio headset" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/radio/headset/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/radio/headset + chameleon_action.chameleon_name = "Headset" + chameleon_action.initialize_disguises() + +/obj/item/radio/headset/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/radio/headset/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/pda/chameleon + name = "PDA" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/pda/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/pda + chameleon_action.chameleon_name = "PDA" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/pda/heads), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/pda/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/pda/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/stamp/chameleon + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/stamp/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/stamp + chameleon_action.chameleon_name = "Stamp" + chameleon_action.initialize_disguises() + +/obj/item/stamp/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) \ No newline at end of file diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 6ad3bd70d55..1cce81c12c2 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -802,6 +802,7 @@ lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi' righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi' flags = NODROP + flags_size = ONESIZEFITSALL has_sensor = 0 // HUNKE /obj/item/clothing/under/victdress diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 5116abf32e6..bc99aa07b0e 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -117,8 +117,8 @@ /datum/crafting_recipe/floorbot name = "Floorbot" result = /mob/living/simple_animal/bot/floorbot - reqs = list(/obj/item/storage/toolbox/mechanical = 1, - /obj/item/stack/tile/plasteel = 1, + reqs = list(/obj/item/storage/toolbox = 1, + /obj/item/stack/tile/plasteel = 10, /obj/item/assembly/prox_sensor = 1, /obj/item/robot_parts/r_arm = 1) time = 40 diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index fc27234648d..d2b32f720cf 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -1773,4 +1773,16 @@ /obj/item/clothing/gloves/ring/fluff/benjaminfallout //Benjaminfallout: Pretzel Brassheart name = "Pretzel's Ring" desc = "A small platinum ring with a large light blue diamond. Engraved inside the band are the words: 'To my lovely Pristine Princess. Forever yours, Savinien.'" - icon_state = "benjaminfallout_ring" \ No newline at end of file + icon_state = "benjaminfallout_ring" + +/obj/item/clothing/under/fluff/voxbodysuit //Gangelwaefre: Kikeri + name = "Vox Bodysuit" + desc = "A shimmering bodysuit custom-fit to a vox. Has shorts sewn in." + lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi' + righthand_file = 'icons/mob/inhands/fluff_righthand.dmi' + icon = 'icons/mob/inhands/fluff_righthand.dmi' + icon_state = "voxbodysuit" + item_state = "voxbodysuit" + item_color = "voxbodysuit" + body_parts_covered = HEAD|UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + species_fit = list("Vox") \ No newline at end of file diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index 6f23bbc5fcd..2c2fdfbab84 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -6,6 +6,7 @@ event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg') /datum/event/blob/start() + processing = FALSE //so it won't fire again in next tick var/turf/T = pick(blobstart) if(!T) return kill() @@ -23,4 +24,5 @@ B.key = M.key to_chat(B, "You are now a mouse, infected with blob spores. Find somewhere isolated... before you burst and become the blob! Use ventcrawl (alt-click on vents) to move around.") var/image/alert_overlay = image('icons/mob/blob.dmi', "blank_blob") - notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, alert_overlay = alert_overlay) \ No newline at end of file + notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, alert_overlay = alert_overlay) + processing = TRUE // Let it naturally end, if it runs successfully \ No newline at end of file diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index e937ec25ef9..6be1d3bcf70 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -671,8 +671,8 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_ /obj/item/gun/energy/kinetic_accelerator/crossbow,\ /obj/item/storage/box/syndicate, /obj/item/storage/box/emps,\ /obj/item/cartridge/syndicate, /obj/item/clothing/under/chameleon,\ - /obj/item/clothing/shoes/syndigaloshes, /obj/item/card/id/syndicate,\ - /obj/item/clothing/mask/gas/voice, /obj/item/clothing/glasses/thermal,\ + /obj/item/clothing/shoes/chameleon/noslip, /obj/item/card/id/syndicate,\ + /obj/item/clothing/mask/chameleon, /obj/item/clothing/glasses/thermal,\ /obj/item/chameleon, /obj/item/card/emag,\ /obj/item/storage/toolbox/syndicate, /obj/item/aiModule,\ /obj/item/radio/headset/syndicate, /obj/item/grenade/plastic/c4,\ diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 67979b61dd7..cc6c6115097 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -15,8 +15,8 @@ var/productivity = 0 var/max_items = 40 var/datum/research/files - var/list/show_categories = list("Food", "Botany Chemicals", "Leather and Cloth") - var/list/timesFiveCategories = list("Food", "Botany Chemicals") + var/list/show_categories = list("Food", "Botany Chemicals", "Organic Materials", "Leather and Cloth") + var/list/timesFiveCategories = list("Food", "Botany Chemicals", "Organic Materials") /obj/machinery/biogenerator/New() ..() diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index cf8b897104c..17262ec4a7a 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -69,7 +69,7 @@ visible_message("[src] crackles and buzzes violently!") /mob/living/simple_animal/hostile/mining_drone/sentience_act() - AIStatus = AI_OFF + ..() check_friendly_fire = 0 /mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 0edb81c8321..43bc1b57226 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -83,6 +83,9 @@ obj/structure/ore_box/ex_act(severity, target) O.forceMove(loc) CHECK_TICK +/obj/structure/ore_box/onTransitZ() + return + /obj/structure/ore_box/verb/empty_box() set name = "Empty Ore Box" set category = "Object" diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 5f7d140b174..922f3181c27 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -19,4 +19,5 @@ for(var/datum/light_source/L in light_sources) L.source_atom.update_light() + return 1 diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index db59a79ec21..b7c301f7387 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -397,13 +397,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(usr, "Not when you're not dead!") return - usr.verbs -= /mob/dead/observer/proc/dead_tele - spawn(30) - usr.verbs += /mob/dead/observer/proc/dead_tele - var/area/A = input("Area to jump to", "BOOYEA") as null|anything in ghostteleportlocs var/area/thearea = ghostteleportlocs[A] - if(!thearea) return + + if(!thearea) + return var/list/L = list() for(var/turf/T in get_area_turfs(thearea.type)) @@ -411,6 +409,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!L || !L.len) to_chat(usr, "No area available.") + return usr.forceMove(pick(L)) following = null diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index aa714f0d527..f16d04e3e86 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -315,15 +315,7 @@ msg += "[p_they(TRUE)] [p_have()] a stupid expression on [p_their()] face.\n" if(get_int_organ(/obj/item/organ/internal/brain)) - if(istype(src, /mob/living/carbon/human/interactive)) - var/mob/living/carbon/human/interactive/auto = src - if(auto.showexaminetext) - msg += "[p_they(TRUE)] [p_are()] appears to be some sort of sick automaton, [p_their()] eyes are glazed over and [p_their()] mouth is slightly agape.\n" - if(auto.debugexamine) - var/dodebug = auto.doing2string(auto.doing) - var/interestdebug = auto.interest2string(auto.interest) - msg += "[p_they(TRUE)] [p_are()] appears to be [interestdebug] and [dodebug].\n" - else if(dna.species.show_ssd) + if(dna.species.show_ssd) if(!key) msg += "[p_they(TRUE)] [p_are()] totally catatonic. The stresses of life in deep-space must have been too much for [p_them()]. Any recovery is unlikely.\n" else if(!client) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index bd5817e8867..a5df3916210 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -414,8 +414,22 @@ if(has_breathable_mask && istype(belt, /obj/item/tank)) dat += " [internal ? "Disable Internals" : "Set Internals"]" dat += "" - dat += " ↳Pockets:[(l_store && !(l_store.flags&ABSTRACT)) ? "Left (Full)" : "Left (Empty)"]" - dat += " [(r_store && !(r_store.flags&ABSTRACT)) ? "Right (Full)" : "Right (Empty)"]" + // Pockets + dat += " ↳Pockets:" + if(l_store && internal && l_store == internal) + dat += "[l_store]" + else if(l_store && !(l_store.flags&ABSTRACT)) + dat += "Left (Full)" + else + dat += "Left (Empty)" + dat += " " + if(r_store && internal && r_store == internal) + dat += "[r_store]" + else if(r_store && !(r_store.flags&ABSTRACT)) + dat += "Right (Full)" + else + dat += "Right (Empty)" + dat += "" dat += " ↳ID:[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Empty"]" dat += " ↳PDA:[(wear_pda && !(wear_pda.flags&ABSTRACT)) ? wear_pda : "Empty"]" diff --git a/code/modules/mob/living/carbon/human/interactive/functions.dm b/code/modules/mob/living/carbon/human/interactive/functions.dm deleted file mode 100644 index 06df994df5f..00000000000 --- a/code/modules/mob/living/carbon/human/interactive/functions.dm +++ /dev/null @@ -1,874 +0,0 @@ -/mob/living/carbon/human/interactive/proc/chatter(obj) - var/verbs_use = pick_list(speak_file, "verbs_use") - var/verbs_touch = pick_list(speak_file, "verbs_touch") - var/verbs_move = pick_list(speak_file, "verbs_move") - var/nouns_insult = pick_list(speak_file, "nouns_insult") - var/nouns_generic = pick_list(speak_file, "nouns_generic") - var/nouns_objects = pick_list(speak_file, "nouns_objects") - var/nouns_body = pick_list(speak_file, "nouns_body") - var/adjective_insult = pick_list(speak_file, "adjective_insult") - var/adjective_objects = pick_list(speak_file, "adjective_objects") - var/adjective_generic = pick_list(speak_file, "adjective_generic") - var/curse_words = pick_list(speak_file, "curse_words") - - var/chatmsg = "" - - if(prob(10)) // 10% chance to broadcast it over the radio - chatmsg = ";" - - if(prob(chattyness) || knownStrings.len < 10) // say a generic phrase, otherwise draw from our strings. - if(doing & SNPC_INTERACTING) - if(prob(chattyness)) - chatmsg += pick("This [nouns_objects] is a little [adjective_objects].", - "Well [verbs_use] my [nouns_body], this [nouns_insult] is pretty [adjective_insult].", - "[capitalize(curse_words)], what am I meant to do with this [adjective_insult] [nouns_objects].") - else if(doing & SNPC_TRAVEL) - if(prob(chattyness)) - chatmsg += pick("Oh [curse_words], [verbs_move]!", - "Time to get my [adjective_generic] [adjective_insult] [nouns_body] elsewhere.", - "I wonder if there is anything to [verbs_use] and [verbs_touch] somewhere else..") - else if(doing & SNPC_FIGHTING) - if(prob(chattyness)) - chatmsg += pick("I'm going to [verbs_use] you, you [adjective_insult] [nouns_insult]!", - "Rend and [verbs_touch], Rend and [verbs_use]!", - "You [nouns_insult], I'm going to [verbs_use] you right in the [nouns_body]. JUST YOU WAIT!") - if(prob(chattyness/2)) - chatmsg = ";" - var/what = pick(1,2,3,4,5) - switch(what) - if(1) - chatmsg += "Well [curse_words], this is a [adjective_generic] situation." - if(2) - chatmsg += "Oh [curse_words], that [nouns_insult] was one hell of an [adjective_insult] [nouns_body]." - if(3) - chatmsg += "I want to [verbs_use] that [nouns_insult] when I find them." - if(4) - chatmsg += "[pick("Innocent","Guilty","Traitorous","Honk")] until proven [adjective_generic]!" - if(5) - var/toSay = "" - for(var/i = 0; i < 5; i++) - curse_words = pick_list(speak_file, "curse_words") - toSay += "[curse_words] " - chatmsg += "Hey [nouns_generic], why don't you go [copytext(toSay, 1, length(toSay))], you [nouns_insult]!" - else if(prob(chattyness)) - chatmsg += pick(knownStrings) - if(prob(25)) // cut out some phrases now and then to make sure we're fresh and new - knownStrings -= pick(chatmsg) - - if(chatmsg != ";" && chatmsg != "") - say(chatmsg) - -/mob/living/carbon/human/interactive/proc/traitor(obj) - - if(traitorType == SNPC_PSYCHO && nearby.len) - traitorTarget = pick(nearby) - - if(prob(traitorScale)) - if(!Adjacent(traitorTarget) && !(traitorType == SNPC_PSYCHO)) - tryWalk(get_turf(traitorTarget)) - else - switch(traitorType) - if(SNPC_BRUTE) - retal = 1 - retal_target = traitorTarget - if(SNPC_STEALTH) - if(istype(traitorTarget,/mob)) // it's inside something, lets kick their shit in - var/mob/M = traitorTarget - if(!M.stat) - retal = 1 - retal_target = traitorTarget - else - var/obj/item/I = traitorTarget - I.loc = get_turf(traitorTarget) // pull it outta them - else - take_to_slot(traitorTarget) - if(SNPC_MARTYR) - custom_emote(1, "[src]'s chest opens up, revealing a large mass of explosives and tangled wires!") - if(inactivity_period <= 0) - inactivity_period = 9999 // technically infinite - if(do_after(src, 60, target = traitorTarget)) - custom_emote(1, "A fire bursts from [src]'s eyes, igniting white hot and consuming [p_their()] body in a flaming explosion!") - explosion(src, 6, 6, 6) - else - inactivity_period = 0 - custom_emote(1, "[src]'s chest closes, hiding [p_their()] insides.") - if(SNPC_PSYCHO) - var/choice = pick(typesof(/obj/item/grenade/chem_grenade) - /obj/item/grenade/chem_grenade) - - new choice(src) - - retal = 1 - retal_target = traitorTarget - -/mob/living/carbon/human/interactive/proc/botany(obj) - if(shouldModulePass()) - return - - if(enforceHome()) - return - - var/list/allContents = getAllContents() - - var/obj/item/reagent_containers/glass/beaker/bluespace/internalBeaker = locate(/obj/item/reagent_containers/glass/beaker/bluespace) in allContents - var/obj/item/storage/bag/plants/internalBag = locate(/obj/item/storage/bag/plants) in allContents - - if(!internalBag) - internalBag = new/obj/item/storage/bag/plants(src) - if(!internalBeaker) - internalBeaker = new/obj/item/reagent_containers/glass/beaker/bluespace(src) - internalBeaker.name = "Grow-U-All Super Spray" - - if(internalBeaker && internalBag) - var/obj/machinery/hydroponics/HP - - //consider the appropriate target - var/list/considered = list() - - for(var/obj/machinery/hydroponics/tester in view(12,src)) - considered[tester] = 1 - - if(!tester.myseed) - considered[tester] += 50 - if(tester.weedlevel > 0) - considered[tester] += 5 - if(tester.pestlevel > 0) - considered[tester] += 5 - if(tester.nutrilevel < tester.maxnutri) - considered[tester] += 15 - if(tester.waterlevel < tester.maxwater) - considered[tester] += 15 - if(tester.harvest || tester.dead) - considered[tester] += 100 - considered[tester] = max(1, considered[tester] - get_dist(src,tester)) - - var/index = 0 - for(var/A in considered) - ++index - if(considered[A] > considered[HP] || !HP) - HP = considered[index] - - if(HP) - TARGET = HP - if(!Adjacent(HP)) - tryWalk(get_turf(HP)) - else - if(HP.harvest || HP.dead) - HP.attack_hand(src) - else if(!HP.myseed) - var/obj/item/seeds/SEED = new /obj/item/seeds/random(src) - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")] towards [TARGET], producing a [SEED]!") - HP.attackby(SEED, src) - else - var/change = 0 - if(HP.weedlevel > 0) - change = 1 - if(!internalBeaker.reagents.has_reagent("atrazine", 10)) - internalBeaker.reagents.add_reagent("atrazine", 10) - if(HP.pestlevel > 0) - change = 1 - if(!internalBeaker.reagents.has_reagent("diethylamine", 10)) - internalBeaker.reagents.add_reagent("diethylamine", 10) - if(HP.nutrilevel < HP.maxnutri) - change = 1 - if(!internalBeaker.reagents.has_reagent("eznutriment", 15)) - internalBeaker.reagents.add_reagent("eznutriment", 15) - if(!internalBeaker.reagents.has_reagent("diethylamine", 15)) - internalBeaker.reagents.add_reagent("diethylamine", 15) - if(HP.waterlevel < HP.maxwater) - change = 1 - if(!internalBeaker.reagents.has_reagent("holywater", 50)) - internalBeaker.reagents.add_reagent("holywater", 50) - if(change) - HP.attackby(internalBeaker,src) - - var/obj/item/reagent_containers/food/snacks/grown/GF = locate(/obj/item/reagent_containers/food/snacks/grown) in view(12,src) - if(GF) - if(!Adjacent(GF)) - tryWalk(get_turf(GF)) - else - GF.attackby(internalBag,src) - - if(internalBag.contents.len) - var/obj/machinery/smartfridge/SF = locate(/obj/machinery/smartfridge) in range(12, src) - if(!Adjacent(SF)) - tryWalk(get_turf(SF)) - else - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")], upending the [internalBag]'s contents all over the [SF]!") - //smartfridges call updateUsrDialog when you call attackby, so we're going to have to cheese-magic-space this - for(var/obj/toLoad in internalBag.contents) - if(contents.len >= SF.max_n_of_items) - break - if(SF.accept_check(toLoad)) - SF.load(toLoad, src) - else - qdel(toLoad) // destroy everything we dont need - -/mob/living/carbon/human/interactive/proc/bartend(obj) - if(shouldModulePass()) - return - - if(enforceHome()) - return - - var/list/rangeCheck = oview(6,src) - var/obj/structure/table/RT - - var/mob/living/carbon/human/serveTarget - - for(var/mob/living/carbon/human/H in rangeCheck) - if(!locate(/obj/item/reagent_containers/food/drinks) in orange(1, H)) - serveTarget = H - - - if(serveTarget) - RT = locate(/obj/structure/table) in orange(1, serveTarget) - - if(RT && serveTarget) - if(!Adjacent(RT)) - tryWalk(get_turf(RT)) - else - var/drinkChoice = pick(typesof(/obj/item/reagent_containers/food/drinks) - /obj/item/reagent_containers/food/drinks) - if(drinkChoice) - var/obj/item/reagent_containers/food/drinks/D = new drinkChoice(get_turf(src)) - RT.attackby(D,src) - say("[pick("Something to wet your whistle!","Down the hatch, a tasty beverage!","One drink, coming right up!","Tasty liquid for your oral intake!","Enjoy!")]") - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")], serving up a [D]!") - -/mob/living/carbon/human/interactive/proc/shitcurity(obj) - var/list/allContents = getAllContents() - - if(retal && TARGET) - if(Adjacent(TARGET)) - var/obj/item/restraints/R = locate() in allContents - if(R) - R.attack(TARGET, src) // go go bluespace restraint launcher! - else if(TARGET in oview(7, src)) - var/obj/item/gun/G = locate() in allContents - if(G) - G.afterattack(TARGET, src) - -/mob/living/carbon/human/interactive/proc/clowning(obj) - if(shouldModulePass()) - return - var/list/allContents = getAllContents() - var/list/rangeCheck = oview(12, src) - - var/mob/living/carbon/human/clownTarget - var/list/clownPriority = list() - - var/obj/item/reagent_containers/spray/S - if(!locate(/obj/item/reagent_containers/spray) in allContents) - new/obj/item/reagent_containers/spray(src) - else - S = locate(/obj/item/reagent_containers/spray) in allContents - - for(var/mob/living/carbon/human/C in rangeCheck) - var/pranksNearby = 100 - for(var/turf/simulated/T in orange(1, C)) - for(var/obj/item/A in T) - if(istype(A,/obj/item/soap) || istype(A,/obj/item/reagent_containers/food/snacks/grown/banana) || istype(A,/obj/item/grown/bananapeel)) - pranksNearby-- - if(T.wet) - pranksNearby -= 10 - clownPriority[C] = pranksNearby - - for(var/A in clownPriority) - if(!clownTarget) - clownTarget = A - else - if(clownPriority[A] > clownPriority[clownTarget]) - clownTarget = clownPriority[A] - - if(clownTarget) - if(!Adjacent(clownTarget)) - tryWalk(clownTarget) - else - var/hasPranked = 0 - for(var/A in allContents) - if(prob(smartness/2) && !hasPranked) - if(istype(A,/obj/item/soap)) - npcDrop(A) - hasPranked = 1 - if(istype(A,/obj/item/reagent_containers/food/snacks/grown/banana)) - var/obj/item/reagent_containers/food/snacks/B = A - B.attack(src, src) - if(istype(A,/obj/item/grown/bananapeel)) - npcDrop(A) - hasPranked = 1 - if(!hasPranked) - if(S.reagents.total_volume <= 5) - S.reagents.add_reagent("water", 25) - S.afterattack(get_turf(pick(orange(1, clownTarget))),src) - - -/mob/living/carbon/human/interactive/proc/healpeople(obj) - var/shouldTryHeal = 0 - var/obj/item/stack/medical/M - - var/list/allContents = getAllContents() - - for(var/A in allContents) - if(istype(A,/obj/item/stack/medical)) - shouldTryHeal = 1 - M = A - - var/obj/item/reagent_containers/hypospray/HPS - - if(!locate(/obj/item/reagent_containers/hypospray) in allContents) - new/obj/item/reagent_containers/hypospray(src) - else - HPS = locate(/obj/item/reagent_containers/hypospray) in allContents - if(!shouldTryHeal) - shouldTryHeal = 2 // we have no stackables to use, lets use our internal hypospray instead - - if(shouldTryHeal == 1) - for(var/mob/living/carbon/human/C in nearby) - if(istype(C,/mob/living/carbon/human)) //I haven't the foggiest clue why this is turning up non-carbons but sure here whatever - if(C.health <= 75) - if(get_dist(src,C) <= 2) - src.say("Wait, [C], let me heal you!") - M.attack(C,src) - sleep(25) - else - tryWalk(get_turf(C)) - else if(shouldTryHeal == 2) - if(HPS) - if(HPS.reagents.total_volume <= 0) - HPS.reagents.add_reagent("omnizine",30) - for(var/mob/living/carbon/human/C in nearby) - if(istype(C,/mob/living/carbon/human)) - if(C.health <= 75 && C.reagents.get_reagent_amount("omnizine") <= 0) // make sure they wont be overdosing - if(get_dist(src,C) <= 2) - src.say("Wait, [C], let me heal you!") - HPS.attack(C,src) - sleep(25) - else - tryWalk(get_turf(C)) - - -/mob/living/carbon/human/interactive/proc/dojanitor(obj) - if(shouldModulePass()) - return - var/list/allContents = getAllContents() - //now with bluespace magic! - var/obj/item/reagent_containers/spray/SP = locate() in allContents - if(!SP) - SP = new /obj/item/reagent_containers/spray(src) - var/obj/item/soap/SO = locate() in allContents - if(!SO) - SO = new /obj/item/soap(src) - - if(SP.reagents.total_volume <= 5) - SP.reagents.add_reagent("cleaner", 25) // bluespess water delivery for AI - - var/obj/effect/decal/cleanable/TC - TC = locate(/obj/effect/decal/cleanable) in view(6, src) - - if(TC) - if(!Adjacent(TC)) - tryWalk(TC) - else - var/turf/T = get_turf(TC) - if(T && !T.density) - SP.afterattack(TC, src, 1) - else - SO.afterattack(TC, src, 1) - qdel(TC) - -// START COOKING MODULE -/mob/living/carbon/human/interactive/proc/refundrecipe(list/ingredients) - for(var/obj/I in ingredients) - I.loc = contents - -// Ingredients may be in the rangeCheck or inside the chef's inventory. -// As they are checked off, they are moved to a seperate list as to not be counted twice -// If the recipe fails (eg somebody else took an ingredient before it was picked up) the ingredients are dumped back to inventory -// That way, the chef has a better chance of making a recipe next ptick, if he has more stuff on him -/mob/living/carbon/human/interactive/proc/makerecipe(datum/recipe/R, allContents, rangeCheck) - set background = 1 - - var/list/ingredients[0] - - for(var/P in R.items) - var/obj/item/I = locate(P) in allContents - if(I) - ingredients += I - I.forceMove(null) - continue - - I = locate(P) in rangeCheck - TARGET = I - if(I && !Adjacent(I)) - tryWalk(get_turf(I)) - sleep(get_dist(src, I)) - if(!I || !(I in rangeCheck)) - refundrecipe(ingredients) - return 0 - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")], picking up [I].") - ingredients += I - I.forceMove(null) - - // cheaply cook the ingredients into result - sleep(R.time) - for(var/obj/I in ingredients) - qdel(I) - ingredients.Cut() - var/result = new R.result(get_turf(src)) - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")] and, with a bang, \a [result] is cooked!") - return 1 - -/mob/living/carbon/human/interactive/proc/souschef(obj) - if(shouldModulePass() || enforceHome() || prob(SNPC_FUZZY_CHANCE_HIGH) || prob(SNPC_FUZZY_CHANCE_HIGH)) - return - - if(doing & SNPC_SPECIAL) - return - doing |= SNPC_SPECIAL - - var/static/list/customableTypes = list(/obj/item/reagent_containers/food/snacks/customizable,/obj/item/reagent_containers/food/snacks/breadslice,/obj/item/reagent_containers/food/snacks/bun,/obj/item/reagent_containers/food/snacks/sliceable/flatdough,/obj/item/reagent_containers/food/snacks/boiledspaghetti,/obj/item/trash/plate,/obj/item/trash/bowl) - - var/static/list/rawtypes = list(/obj/item/reagent_containers/food/snacks/grown, /obj/item/reagent_containers/food/snacks/rawcutlet, /obj/item/reagent_containers/food/snacks/rawsticks, /obj/item/reagent_containers/food/snacks/salmonmeat, /obj/item/reagent_containers/food/snacks/carpmeat, /obj/item/reagent_containers/food/snacks/catfishmeat, /obj/item/reagent_containers/food/snacks/spaghetti, /obj/item/reagent_containers/food/snacks/dough, /obj/item/reagent_containers/food/snacks/sliceable/flatdough, /obj/item/reagent_containers/food/snacks/doughslice, /obj/item/reagent_containers/food/snacks/meat, /obj/item/reagent_containers/food/snacks/boiledrice, /obj/item/reagent_containers/food/snacks/cheesewedge, /obj/item/reagent_containers/food/snacks/raw_bacon) - - try - var/list/allContents = getAllContents() - var/list/rangeCheck = view(6, src) - - //Bluespace in some inbuilt tools - var/obj/item/kitchen/rollingpin/RP = locate() in allContents - if(!RP) - RP = new /obj/item/kitchen/rollingpin(src) - - var/obj/item/kitchen/knife/KK = locate() in allContents - if(!KK) - KK = new /obj/item/kitchen/knife(src) - - var/global/list/available_recipes - if(!available_recipes) - available_recipes = list() - for(var/type in subtypesof(/datum/recipe)) - var/datum/recipe/recipe = new type - if(recipe.result) // Ignore recipe subtypes that lack a result - available_recipes += recipe - else - qdel(recipe) - - var/foundCookable = 0 - - //Make some basic custom food - var/foundCustom - for(var/customType in customableTypes) - var/A = locate(customType) in rangeCheck - var/obj/item/reagent_containers/food/snacks/customizable/I = A - if(A && (!istype(I) || I.ingredients.len <= 3)) - foundCustom = A // this will eventually wittle down to 0 - break - - var/obj/machinery/smartfridge/SF = locate(/obj/machinery/smartfridge) in rangeCheck - if(SF) - if(SF.contents.len > 0) - if(!Adjacent(SF)) - tryWalk(get_turf(SF)) - else - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")], grabbing various foodstuffs from [SF] and sticking them in its mouth!") - for(var/obj/item/A in SF.contents) - if(prob(smartness/2)) - var/count = SF.item_quants[A.name] - if(count) - SF.item_quants[A.name] = count - 1 - A.forceMove(src) - - if(foundCustom) - var/obj/item/reagent_containers/food/snacks/FC = foundCustom - for(var/obj/item/reagent_containers/food/snacks/toMake in allContents) - if(prob(smartness)) - if(FC.reagents) - if(toMake.reagents) - var/raw = 0 - for(var/type in rawtypes) - if(istype(toMake, type)) - raw = 1 - break - if(!raw) - npcDrop(toMake) - FC.attackby(toMake, src) - allContents -= toMake - break - else - qdel(FC) // this food is usless, toss it - - // Process tool-based ingredients - var/obj/item/reagent_containers/food/snacks/dough/D = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/sliceable/flatdough/FD = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/rawcutlet/RC = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/sliceable/cheesewheel/CW = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/grown/potato/PO = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/meat/ME = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/raw_bacon/RB = locate() in rangeCheck - - if(D) - TARGET = D - if(prob(50)) - tryWalk(get_turf(D)) - sleep(get_dist(src, D)) - D.attackby(RP, src) - foundCookable = 1 - else if(FD) - TARGET = FD - if(prob(50)) - tryWalk(get_turf(FD)) - sleep(get_dist(src, FD)) - FD.attackby(KK, src) - foundCookable = 1 - else if(RC) - TARGET = RC - if(prob(50)) - tryWalk(get_turf(RC)) - sleep(get_dist(src, RC)) - RC.attackby(KK, src) - foundCookable = 1 - else if(CW) - TARGET = CW - if(prob(50)) - tryWalk(get_turf(CW)) - sleep(get_dist(src, CW)) - CW.attackby(KK, src) - foundCookable = 1 - else if(PO) - TARGET = PO - if(prob(50)) - tryWalk(get_turf(PO)) - sleep(get_dist(src, PO)) - PO.attackby(KK, src) - foundCookable = 1 - else if(ME) - TARGET = ME - if(prob(50)) - tryWalk(get_turf(ME)) - sleep(get_dist(src, ME)) - ME.attackby(KK, src) - foundCookable = 1 - else if(RB) - TARGET = RB - if(prob(50)) - tryWalk(get_turf(RB)) - sleep(get_dist(src, RB)) - RB.attackby(KK, src) - foundCookable = 1 - - // refresh - allContents = getAllContents() - rangeCheck = view(6, src) - - // Find most complex recipe we can cook - var/ingredientZone = rangeCheck + allContents - var/highest_count = 0 - var/datum/recipe/winner = null - for(var/datum/recipe/R in available_recipes) - if(R.check_items(ingredientZone) >= 0) - var/count = (R.items ? R.items.len : 0) - if(count > highest_count) - highest_count = count - winner = R - - // make winner - if(winner) - if(makerecipe(winner, allContents, rangeCheck)) - foundCookable = 1 - - // refresh - allContents = getAllContents() - rangeCheck = view(6, src) - - // dont display our ingredients - var/list/finishedList = list() - for(var/obj/item/reagent_containers/food/snacks/toDisplay in allContents) - var/raw = 0 - for(var/type in rawtypes) - if(istype(toDisplay, type)) - raw = 1 - break - if(!raw) - finishedList += toDisplay - - for(var/obj/item/reagent_containers/food/snacks/toGrab in rangeCheck) - if(!(locate(/obj/structure/table/reinforced) in get_turf(toGrab))) //it's not being displayed - var/raw = 0 - for(var/type in rawtypes) - if(istype(toGrab, type)) - raw = 1 - break - if(!raw) - foundCookable = 1 - if(!Adjacent(toGrab)) - tryWalk(toGrab) - else - finishedList += toGrab - toGrab.forceMove(src) - - if(finishedList.len) - var/obj/structure/table/reinforced/RT - - for(var/obj/structure/table/reinforced/toCheck in rangeCheck) - var/counted = 0 - for(var/obj/item/reagent_containers/food/snacks/S in get_turf(toCheck)) - ++counted - if(counted < 12) // make sure theres not too much food here - RT = toCheck - break - - if(RT) - foundCookable = 1 - if(!Adjacent(RT)) - tryWalk(get_turf(RT)) - else - for(var/obj/item/reagent_containers/food/snacks/toPlop in finishedList) - RT.attackby(toPlop,src) - - if(!foundCookable) - var/chosenType = pick(rawtypes) - - var/obj/item/reagent_containers/food/snacks/newSnack = new chosenType(get_turf(src)) - TARGET = newSnack - newSnack.reagents.remove_any((newSnack.reagents.total_volume/2)-1) - newSnack.name = "synthetic [newSnack.name]" - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as [p_they()] vomit[p_s()] [newSnack] from [p_their()] mouth!") - catch(var/exception/e) - log_runtime(e, src, "Caught in SNPC cooking module") - doing &= ~SNPC_SPECIAL -// END COOKING MODULE - -/mob/living/carbon/human/interactive/proc/combat(obj) - set background = 1 - enforce_hands() - if(canmove) - if((graytide || (TRAITS & TRAIT_MEAN)) || retal) - interest += targetInterestShift - a_intent = INTENT_HARM - zone_sel.selecting = pick("chest","r_leg","l_leg","r_arm","l_arm","head") - doing |= SNPC_FIGHTING - if(retal) - TARGET = retal_target - else - var/mob/living/M = locate(/mob/living) in oview(7, src) - if(!M) - doing = doing & ~SNPC_FIGHTING - else if(M != src && !compareFaction(M.faction)) - TARGET = M - - //no infighting - if(retal) - if(retal_target) - if(compareFaction(retal_target.faction)) - retal = 0 - retal_target = null - TARGET = null - doing = 0 - - //ensure we're using the best object possible - - var/obj/item/best - var/foundFav = 0 - var/list/allContents = getAllContents() - for(var/test in allContents) - for(var/a in favoured_types) - if(ispath(test,a) && !(doing & SNPC_FIGHTING)) // if we're not in combat and we find our favourite things, use them (for people like janitor and doctors) - best = test - foundFav = 1 - return - if(!foundFav) - if(istype(test,/obj/item)) - var/obj/item/R = test - if(R.force > 2) // make sure we don't equip any non-weaponlike items, ie bags and stuff - if(!best) - best = R - else - if(best.force < R.force) - best = R - if(istype(R, /obj/item/gun)) - var/obj/item/gun/G = R - if(G.can_shoot()) - best = R - break // gun with ammo? screw the rest - if(best && best != main_hand) - take_to_slot(best,1) - - if(TARGET && (doing & SNPC_FIGHTING)) // this is a redundancy check - var/mob/living/M = TARGET - if(istype(M,/mob/living)) - if(M.health > 1 && (M in oview(src, 6))) - //THROWING OBJECTS - for(var/A in allContents) - if(istype(A,/obj/item/gun)) // guns are for shooting, not throwing. - continue - if(prob(robustness)) - if(istype(A,/obj/item)) - var/obj/item/W = A - if(W.throwforce > 19) // Only throw worthwile stuff, no more lobbing wrenches at wenches - npcDrop(W, 1) - throw_item(TARGET) - if(istype(A,/obj/item/grenade)) // Allahu ackbar! ALLAHU ACKBARR!! - var/obj/item/grenade/G = A - G.attack_self(src) - if(prob(smartness)) - npcDrop(G, 1) - sleep(15) - throw_item(TARGET) - - if(!main_hand && other_hand) - swap_hands() - if(main_hand) - if(main_hand.force != 0) - if(istype(main_hand,/obj/item/gun)) - var/obj/item/gun/G = main_hand - if(G.can_trigger_gun(src)) - var/shouldFire = 1 - if(istype(main_hand, /obj/item/gun/energy)) - var/obj/item/gun/energy/P = main_hand - var/stunning = 0 - for(var/A in P.ammo_type) - if(ispath(A,/obj/item/ammo_casing/energy/electrode)) - stunning = 1 - var/mob/stunCheck = TARGET - if(stunning && stunCheck.stunned) - shouldFire = 0 - if(shouldFire) - if(!G.can_shoot()) - G.shoot_with_empty_chamber(src) - npcDrop(G, 1) - else - G.process_fire(TARGET, src) - else - if(get_dist(src,TARGET) > 6) - if(!walk2derpless(TARGET)) - timeout++ - else - var/obj/item/W = main_hand - W.attack(TARGET, src) - else - npcDrop(G, 1) - else - if(targetRange(TARGET) > 2) - tryWalk(TARGET) - else - if(Adjacent(TARGET)) - a_intent = pick(INTENT_DISARM, INTENT_HARM) - M.attack_hand(src) - timeout++ - else if(timeout >= 10 || !(targetRange(M) > 14)) - doing = doing & ~SNPC_FIGHTING - timeout = 0 - TARGET = null - retal = 0 - retal_target = null - else - timeout++ - -/mob/living/carbon/human/interactive/proc/past_verb(word) - if(copytext(word, length(word)) == "e") - return "[word]d" - else - return "[word]ed" - -/mob/living/carbon/human/interactive/proc/ing_verb(word) - if(copytext(word, length(word)) == "e") - return "[copytext(word, 1, length(word))]ing" - else - return "[word]ing" - -/mob/living/carbon/human/interactive/proc/paperwork_sentence() - var/verbs_use = pick_list(speak_file, "verbs_use") - var/verbs_touch = pick_list(speak_file, "verbs_touch") - var/verbs_move = pick_list(speak_file, "verbs_move") - var/nouns_insult = pick_list(speak_file, "nouns_insult") - var/nouns_generic = pick_list(speak_file, "nouns_generic") - var/nouns_objects = pick_list(speak_file, "nouns_objects") - var/nouns_body = pick_list(speak_file, "nouns_body") - var/adjective_insult = pick_list(speak_file, "adjective_insult") - var/adjective_objects = pick_list(speak_file, "adjective_objects") - var/adjective_generic = pick_list(speak_file, "adjective_generic") - var/curse_words = pick_list(speak_file, "curse_words") - var/result = pick("fired", "promoted", "demoted", "terminated", "incinerated", "sent to CentCom", "borged") - - return pick( - "The [adjective_insult] [pick(command_positions)] [past_verb(verbs_touch)] the [adjective_objects] [nouns_objects] and was [result].", - "The [adjective_generic] [pick(engineering_positions)] [past_verb(verbs_touch)] the [adjective_insult] [nouns_objects]. [capitalize(curse_words)], the [nouns_insult] was [result].", - "The [adjective_insult] [pick(security_positions)] [past_verb(verbs_touch)] the [adjective_generic] [nouns_insult] [pick(support_positions)]'s [nouns_body] and had to be [result].", - "Medical had to [verbs_use] the [adjective_generic] [pick(command_positions)]'s [adjective_objects] [nouns_body] after the incident.", - "I demand that [nouns_generic] respond with a [adjective_generic] update ASAP.", - "Would like an update from [nouns_generic] regarding the [adjective_insult] [pick(command_positions)] being [result].", - "The [pick(medical_positions)] needs to [verbs_move] faster when the crew's [adjective_objects] [nouns_body]s are injured, or they will be [result].", - "[capitalize(curse_words)] [adjective_insult] [curse_words].", - "

") - -/mob/living/carbon/human/interactive/proc/pickStamp(allContents) - var/list/stamps[0] - for(var/obj/item/stamp/S in allContents) - stamps += S - if(stamps.len) - return pick(stamps) - - // just make one, maybe - if(prob(SNPC_FUZZY_CHANCE_LOW / 2)) - for(var/p in favoured_types) - if(ispath(p, /obj/item/stamp)) - return new p(src) - return null - -/mob/living/carbon/human/interactive/proc/paperwork(obj) - set background = 1 - - if(shouldModulePass() || !prob(SNPC_FUZZY_CHANCE_LOW / 4)) - return - - var/list/allContents = getAllContents() - - var/obj/item/paper/P = locate() in allContents - var/obj/item/stamp/S = pickStamp(allContents) - var/mob/living/carbon/human/H = locate() in nearby - - if(!P) - P = new /obj/item/paper(src) - - if(P && S && H) - if(!P.stamped || !P.stamped.len) - // generate form - P.name = pick("Inspection Report", "Re: Crew", "Complaint", "To: CentCom") - P.info = {"

[paperwork_sentence()]
"} - for(var/I in 1 to rand(10, 20)) - P.info += "[paperwork_sentence()] " - P.info += {"

[pick("Signed", "Sincerely", "Regards")], [real_name]"} - P.update_icon() - P.stamp(S) - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] and throws [P] on the ground!") - npcDrop(P) - P.throw_at(H, P.throw_range, P.throw_speed, src) - -/mob/living/carbon/human/interactive/proc/stamping(obj) - if(shouldModulePass()) - return - - var/list/allContents = getAllContents() - var/list/rangeCheck = view(7, src) - - var/obj/item/stamp/S = pickStamp(allContents) - if(!S) - return - - // stamp a paper we're holding, and drop it - var/obj/item/paper/P = locate() in allContents - if(P) - if(!P.stamped || !P.stamped.len) - P.stamp(S) - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as they stamp \the [P] with \a [S]!") - npcDrop(P, 1) - return - - // stamp a paper in the world - for(var/obj/item/paper/A in rangeCheck) - if(!A.stamped || !A.stamped.len) - if(!Adjacent(A)) - tryWalk(A) - else - A.stamp(S) - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as they stamp \the [A] with \a [S]!") - return diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm deleted file mode 100644 index 69dfa740b09..00000000000 --- a/code/modules/mob/living/carbon/human/interactive/interactive.dm +++ /dev/null @@ -1,960 +0,0 @@ -/* - NPC VAR EXPLANATIONS (for modules and other things) - - doing = their current action, SNPC_INTERACTING, SNPC_TRAVEL or SNPC_FIGHTING - interest = how interested the NPC is in the situation, if they are idle, this drops - timeout = this is internal - TARGET = their current target - LAST_TARGET = their last target - nearby = a list of nearby mobs - best_force = the highest force object, used for checking when to swap items - retal = this is internal - retal_target = this is internal - update_hands = this is a bool (1/0) to determine if the NPC should update what is in his hands - - MYID = their ID card - MYPDA = their PDA - main_hand = what is in their "main" hand (chosen from left > right) - TRAITS = the traits assigned to this npc - mymjob = the job assigned to the npc - - robustness = the chance for the npc to hit something - smartness = the inverse chance for an npc to do stupid things - attitude = the chance for an npc to do rude or mean things - slyness = the chance for an npc to do naughty things ie thieving - - functions = the list of procs that the npc will use for modules - - graytide = shitmin var to make them go psycho -*/ -/mob/living/carbon/human/interactive - name = "interactive station member" - var/doing = 0 - var/interest = 10 - var/maxInterest = 10 - var/timeout = 0 - var/inactivity_period = 0 - var/atom/TARGET = null - var/atom/LAST_TARGET = null - var/list/nearby = list() - var/best_force = 0 - var/retal = 0 - var/mob/retal_target = null - var/update_hands = 0 - var/list/blacklistItems = list() // items we should be ignoring - var/maxStepsTick = 6 // step as many times as we can per frame - //Job and mind data - var/obj/item/card/id/MYID - var/obj/item/card/id/RPID // the "real" idea they use - var/obj/item/pda/MYPDA - var/obj/item/main_hand - var/obj/item/other_hand - var/TRAITS = 0 - var/obj/item/card/id/Path_ID - var/default_job = /datum/job/civilian // the type for the default job - var/datum/job/myjob - var/list/myPath = list() - faction = list("synth") - //trait vars - var/robustness = 50 - var/smartness = 50 - var/attitude = 50 - var/slyness = 50 - var/graytide = 0 - var/list/favoured_types = list() // allow a mob to favour a type, and hold onto them - var/chattyness = SNPC_CHANCE_TALK - var/targetInterestShift = 5 // how much a good action should "reward" the npc - //modules - var/list/functions = list("nearbyscan","combat","shitcurity","chatter") - var/restrictedJob = 0 - var/forceProcess = 0 - var/speak_file = "npc_chatter.json" - var/debugexamine = FALSE //If we show debug info in our examine - var/showexaminetext = TRUE //If we show our telltale examine text - - var/voice_saved = FALSE - - var/list/knownStrings = list() - - //snpc traitor variables - - var/isTraitor = 0 - var/traitorTarget - var/traitorScale = 0 // our ability as a traitor - var/traitorType = 0 - - -/// SNPC voice handling - -/mob/living/carbon/human/interactive/proc/loadVoice() - var/savefile/S = new /savefile("data/npc_saves/snpc.sav") - S["knownStrings"] >> knownStrings - - if(isnull(knownStrings)) - knownStrings = list() - -/mob/living/carbon/human/interactive/proc/saveVoice() - if(voice_saved) - return - var/savefile/S = new /savefile("data/npc_saves/snpc.sav") - S["knownStrings"] << knownStrings - -//botPool funcs -/mob/living/carbon/human/interactive/proc/takeDelegate(mob/living/carbon/human/interactive/from,doReset=TRUE) - change_eye_color(255, 0, 0) - if(from == src) - return FALSE - TARGET = from.TARGET - LAST_TARGET = from.LAST_TARGET - retal = from.retal - retal_target = from.retal_target - doing = from.doing - // - timeout = 0 - inactivity_period = 0 - interest = maxInterest - // - update_icons() - if(doReset) - from.TARGET = null - from.LAST_TARGET = null - from.retal = 0 - from.retal_target = null - from.doing = 0 - return TRUE - -//end pool funcs - -/mob/living/carbon/human/interactive/proc/random() - //this is here because this has no client/prefs/brain whatever. - age = rand(AGE_MIN, AGE_MAX) - change_gender(pick("male", "female")) - rename_character(real_name, dna.species.get_random_name(gender)) - //job handling - myjob = new default_job() - job = myjob.title - mind.assigned_role = job - myjob.equip(src) - -/mob/living/carbon/human/interactive/proc/reset() - walk(src, 0) - timeout = 100 - retal = 0 - doing = 0 - inactivity_period = 0 - -/client/proc/resetSNPC(mob/living/carbon/human/interactive/T in SSnpcpool.processing) - set name = "Reset SNPC" - set desc = "Reset the SNPC" - set category = "Debug" - - if(!holder) - return - - if(istype(T)) - T.reset() - -/client/proc/customiseSNPC(mob/living/carbon/human/interactive/T in SSnpcpool.processing) - set name = "Customize SNPC" - set desc = "Customize the SNPC" - set category = "Debug" - - if(!holder) - return - - if(!istype(T)) - return - - var/list/jobs[0] - for(var/datum/job/j in SSjobs.occupations) - if(j.title != "AI" && j.title != "Cyborg") - jobs[j.title] = j - jobs = sortAssoc(jobs) - var/job_name = input("Choose Job") as null|anything in jobs - - if(job_name) - var/datum/job/cjob = jobs[job_name] - var/alt_title = input("Choose Alt Title") in (list(job_name) + cjob.alt_titles) - - T.myjob = cjob - T.job = cjob.title - T.mind.assigned_role = cjob.title - for(var/obj/item/I in T) - if(istype(I, /obj/item/implant)) - continue - if(istype(I, /obj/item/organ)) - continue - qdel(I) - T.myjob.equip(T) - T.doSetup(alt_title) - - var/shouldDoppel = input("Do you want the SNPC to disguise themself as a crewmember?") as anything in list("Yes", "No") - if(shouldDoppel == "Yes") - var/list/validchoices = list() - for(var/mob/living/carbon/human/M in GLOB.mob_list) - validchoices += M - - var/mob/living/carbon/human/chosen = input("Which crewmember?") as null|anything in validchoices - - if(chosen) - var/datum/dna/toDoppel = chosen.dna - - T.real_name = toDoppel.real_name - T.set_species(chosen.dna.species.type) - T.dna = toDoppel.Clone() - T.body_accessory = chosen.body_accessory - T.UpdateAppearance() - domutcheck(T) - - var/doTrait = input("Do you want the SNPC to be a traitor?") as anything in list("Yes", "No") - if(doTrait == "Yes") - var/list/tType = list("Brute" = SNPC_BRUTE, "Stealth" = SNPC_STEALTH, "Martyr" = SNPC_MARTYR, "Psycho" = SNPC_PSYCHO) - var/cType = input("Choose the traitor personality.") as null|anything in tType - if(cType) - var/value = tType[cType] - T.makeTraitor(value) - - var/doTele = input("Place the SNPC in their department?") as anything in list("Yes", "No") - if(doTele == "Yes") - T.loc = pick(get_area_turfs(T.job2area(T.myjob))) - - T.revive() - -/mob/living/carbon/human/interactive/proc/doSetup(alt_title = null) - Path_ID = new /obj/item/card/id(src) - - var/datum/job/captain/C = new/datum/job/captain - Path_ID.access = C.get_access() - - if(!alt_title) - alt_title = job - - MYID = new(src) - MYID.name = "[real_name]'s ID Card ([alt_title])" - MYID.assignment = "[alt_title]" - MYID.rank = job - MYID.sex = capitalize(gender) - MYID.age = age - MYID.registered_name = real_name - MYID.photo = get_id_photo(src) - MYID.access = Path_ID.access.Copy() // Automatons have strange powers... strange indeed - - RPID = new(src) - RPID.name = "[real_name]'s ID Card ([alt_title])" - RPID.assignment = "[alt_title]" - RPID.rank = job - RPID.sex = capitalize(gender) - RPID.age = age - RPID.registered_name = real_name - RPID.photo = get_id_photo(src) - RPID.access = myjob.get_access() - - if(wear_id) - qdel(wear_id) - if(!equip_to_slot_or_del(MYID, slot_wear_id)) - create_attack_log("Deleted ID due to slot contention") - if(wear_pda) - MYPDA = wear_pda - else - MYPDA = new(src) - equip_to_slot_or_del(MYPDA, slot_wear_pda) - MYPDA.owner = real_name - MYPDA.ownjob = alt_title - MYPDA.ownrank = job - MYPDA.name = "PDA-[real_name] ([alt_title])" - zone_sel.selecting = "chest" - //arms - if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4)) - var/obj/item/organ/external/R = bodyparts_by_name["r_arm"] - if(R) - R.robotize(make_tough = 1) - else - var/obj/item/organ/external/L = bodyparts_by_name["l_arm"] - if(L) - L.robotize(make_tough = 1) - //legs - if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4)) - var/obj/item/organ/external/R = bodyparts_by_name["r_leg"] - if(R) - R.robotize(make_tough = 1) - else - var/obj/item/organ/external/L = bodyparts_by_name["l_leg"] - if(L) - L.robotize(make_tough = 1) - UpdateDamageIcon() - regenerate_icons() - - hand = 0 - functions = list("nearbyscan", "combat", "shitcurity", "chatter") // stop customize adding multiple copies of a function - setup_job(job) - - if(TRAITS & TRAIT_ROBUST) - robustness = 75 - else if(TRAITS & TRAIT_UNROBUST) - robustness = 25 - - //modifiers are prob chances, lower = smarter - if(TRAITS & TRAIT_SMART) - smartness = 75 - else if(TRAITS & TRAIT_DUMB) - disabilities |= CLUMSY - smartness = 25 - - if(TRAITS & TRAIT_MEAN) - attitude = 75 - else if(TRAITS & TRAIT_FRIENDLY) - attitude = 1 - - if(TRAITS & TRAIT_THIEVING) - slyness = 75 - -/mob/living/carbon/human/interactive/proc/InteractiveProcess() - if(ticker.current_state == GAME_STATE_FINISHED) - saveVoice() - voice_saved = TRUE - doProcess() - -/mob/living/carbon/human/interactive/proc/setup_job(thejob) - switch(thejob) - if("Civilian") - favoured_types = list(/obj/item/clothing, /obj/item) - if("Captain", "Head of Personnel") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/captain,/obj/item/disk/nuclear) - if("Nanotrasen Representative") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/centcom, /obj/item/paper, /obj/item/melee/classic_baton/ntcane) - functions += "paperwork" - if("Magistrate", "Internal Affairs Agent") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/law, /obj/item/paper) - functions += "paperwork" - if("Quartermaster", "Cargo Technician") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/granted, /obj/item/stamp/denied, /obj/item/paper, /obj/item/clipboard) - functions += "stamping" - if("Chef") - favoured_types = list(/obj/item/reagent_containers/food, /obj/item/kitchen) - functions += "souschef" - restrictedJob = 1 - if("Bartender") - favoured_types = list(/obj/item/reagent_containers/food, /obj/item/kitchen) - functions += "bartend" - restrictedJob = 1 - if("Station Engineer", "Chief Engineer", "Life Support Specialist", "Mechanic") - favoured_types = list(/obj/item/stack, /obj/item, /obj/item/clothing) - if("Chief Medical Officer", "Medical Doctor", "Chemist", "Virologist", "Geneticist", "Psychiatrist", "Paramedic", "Brig Physician") - favoured_types = list(/obj/item/reagent_containers/glass/beaker, /obj/item/storage/firstaid, /obj/item/stack/medical, /obj/item/reagent_containers/syringe) - functions += "healpeople" - if("Research Director", "Scientist", "Roboticist") - favoured_types = list(/obj/item/reagent_containers/glass/beaker, /obj/item/stack, /obj/item/reagent_containers) - if("Head of Security", "Warden", "Security Officer", "Detective", "Security Pod Pilot", "Blueshield") - favoured_types = list(/obj/item/clothing, /obj/item, /obj/item/restraints) - if("Janitor") - favoured_types = list(/obj/item/mop, /obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/spray/cleaner, /obj/effect/decal/cleanable) - functions += "dojanitor" - if("Clown") - favoured_types = list(/obj/item/soap, /obj/item/reagent_containers/food/snacks/grown/banana, /obj/item/grown/bananapeel) - functions += "clowning" - if("Botanist") - favoured_types = list(/obj/machinery/hydroponics, /obj/item/reagent_containers, /obj/item) - functions += "botany" - restrictedJob = 1 - else - favoured_types = list(/obj/item/clothing) - -/mob/living/carbon/human/interactive/proc/makeTraitor(var/inPers) - isTraitor = 1 - traitorScale = (slyness + smartness) + rand(-10,10) - traitorType = inPers - - ticker.mode.traitors += mind - mind.special_role = SPECIAL_ROLE_TRAITOR - var/datum/mindslaves/slaved = new() - slaved.masters += mind - mind.som = slaved - ticker.mode.update_traitor_icons_added(mind) - - switch(traitorType) - if(SNPC_BRUTE) // SMASH KILL RAAARGH - var/datum/objective/assassinate/A = new - A.owner = mind - A.find_target() - mind.objectives += A - traitorTarget = A.target.current - if(SNPC_STEALTH) // Shhh we is sneekies - var/datum/objective/steal/S = new - S.owner = mind - S.find_target() - mind.objectives += S - traitorTarget = locate(S.steal_target.typepath) in world - if(SNPC_MARTYR) // MY LIFE FOR SPESZUL - var/targetType = pick(/obj/structure/particle_accelerator, /obj/machinery/gravity_generator/main, /obj/machinery/power/smes) - traitorTarget = locate(targetType) in world - var/datum/objective/O = new("Destroy \the [traitorTarget].") - O.owner = mind - mind.objectives += O - if(SNPC_PSYCHO) // YOU'RE LIKE A FLESH BICYLE AND I WANT TO DISMANTLE YOU - var/datum/objective/hijack/H = new - H.owner = mind - mind.objectives += H - traitorTarget = null - - functions += "traitor" - faction -= "neutral" - faction += "hostile" - -/mob/living/carbon/human/interactive/create_mob_hud() - if(!hud_used) - hud_used = new /datum/hud/human(src) - -/mob/living/carbon/human/interactive/Initialize() - ..() - return INITIALIZE_HINT_LATELOAD - -/mob/living/carbon/human/interactive/LateInitialize() - . = ..() - GLOB.snpc_list += src - - create_mob_hud() - - sync_mind() - random() - doSetup() - START_PROCESSING(SSnpcpool, src) - loadVoice() - GLOB.hear_radio_list += src - - // a little bit of variation to make individuals more unique - robustness += rand(-10, 10) - smartness += rand(-10, 10) - attitude += rand(-10, 10) - slyness += rand(-10, 10) - - doProcess() - -/mob/living/carbon/human/interactive/Destroy() - SSnpcpool.stop_processing(src) - return ..() - -/mob/living/carbon/human/interactive/proc/retalTarget(mob/living/target) - var/mob/living/M = target - if(istype(M)) - if(health > 0) - if(M.a_intent == INTENT_HELP && !incapacitated()) - chatter() - if(istype(target, /mob/living/carbon) && !retal && prob(SNPC_FUZZY_CHANCE_LOW)) - var/mob/living/carbon/C = target - if(!Adjacent(target)) - tryWalk(target) - else - C.help_shake_act(src) - if(M.a_intent == INTENT_HARM) - retal = 1 - retal_target = target - -//Retaliation clauses - -/mob/living/carbon/human/interactive/attacked_by(obj/item/I, mob/living/user, def_zone) - ..() - retalTarget(user) - -/mob/living/carbon/human/interactive/hitby(atom/movable/AM, skipcatch, hitpush, blocked) - ..() - var/mob/living/carbon/C = locate(/mob/living/carbon) in view(SNPC_MIN_RANGE_FIND, src) - if(C) - retalTarget(C) - -/mob/living/carbon/human/interactive/bullet_act(obj/item/projectile/P) - ..() - retalTarget(P.firer) - -/mob/living/carbon/human/interactive/attack_hand(mob/living/carbon/human/M) - ..() - retalTarget(M) - -/mob/living/carbon/human/interactive/show_inv(mob/user) - ..() - retalTarget(user) - -/mob/living/carbon/human/interactive/can_inject(mob/user, error_msg, target_zone, var/penetrate_thick = 0) - ..() - retalTarget(user) - -//THESE EXIST FOR DEBUGGING OF THE DOING/INTEREST SYSTEM EASILY -/mob/living/carbon/human/interactive/proc/doing2string(doin) - var/toReturn = "" - if(!doin) - toReturn = "not doing anything" - if(doin & SNPC_INTERACTING) - toReturn += "interacting with something, " - if(doin & SNPC_FIGHTING) - toReturn += "engaging in combat, " - if(doin & SNPC_TRAVEL) - toReturn += "and going somewhere" - return toReturn - -/mob/living/carbon/human/interactive/proc/interest2string(inter) - var/toReturn = "Flatlined" - if(inter >= 0 && inter <= 25) - toReturn = "Very Bored" - if(inter >= 26 && inter <= 50) - toReturn = "Bored" - if(inter >= 51 && inter <= 75) - toReturn = "Content" - if(inter >= 76) - toReturn = "Excited" - return toReturn -//END DEBUG - -/mob/living/carbon/human/interactive/proc/IsDeadOrIncap(checkDead = TRUE) - if(!canmove) - return 1 - if(health <= 0 && checkDead) - return 1 - if(restrained()) - return 1 - if(paralysis) - return 1 - if(stunned) - return 1 - if(stat) - return 1 - if(inactivity_period > 0) - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/enforce_hands() - if(main_hand) - if(main_hand.loc != src) - main_hand = null - if(other_hand) - if(other_hand.loc != src) - other_hand = null - if(hand) - if(!l_hand) - main_hand = null - if(r_hand) - swap_hands() - else - if(!r_hand) - main_hand = null - if(l_hand) - swap_hands() - -/mob/living/carbon/human/interactive/proc/swap_hands() - hand = !hand - var/obj/item/T = other_hand - main_hand = other_hand - other_hand = T - update_hands = 1 - -/mob/living/carbon/human/interactive/proc/take_to_slot(obj/item/G, var/hands=0) - var/list/slots = list("left pocket" = slot_l_store, "right pocket" = slot_r_store, "left hand" = slot_l_hand, "right hand" = slot_r_hand) - if(hands) - slots = list("left hand" = slot_l_hand, "right hand" = slot_r_hand) - G.loc = src - if(G.force && G.force > best_force) - best_force = G.force - equip_in_one_of_slots(G, slots) - update_hands = 1 - -/mob/living/carbon/human/interactive/proc/insert_into_backpack() - var/list/slots = list(slot_l_store, slot_r_store, slot_l_hand, slot_r_hand) - var/obj/item/I = get_item_by_slot(pick(slots)) - var/obj/item/storage/BP = get_item_by_slot(slot_back) - if(back && BP && I) - // hack to allow SNPCs to "sticky grab" items without losing their inventorying - var/oldnodrop = I.flags | NODROP - I.flags &= ~NODROP - if(BP.can_be_inserted(I)) - BP.handle_item_insertion(I) - I.flags |= oldnodrop - else - unEquip(I,TRUE) - update_hands = 1 - -/mob/living/carbon/human/interactive/proc/targetRange(towhere) - return get_dist(get_turf(towhere), get_turf(src)) - -/mob/living/carbon/human/interactive/death() - // Only execute the below if we successfully died - . = ..() - if(!.) - return FALSE - saveVoice() - -/mob/living/carbon/human/interactive/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol) - if(!istype(speaker, /mob/living/carbon/human/interactive)) - knownStrings |= html_decode(multilingual_to_message(message_pieces)) - ..() - -/mob/living/carbon/human/interactive/hear_radio(list/message_pieces, verb = "says", part_a, part_b, mob/speaker = null, hard_to_hear = 0, vname = "", atom/follow_target) - if(!istype(speaker, /mob/living/carbon/human/interactive)) - knownStrings |= html_decode(multilingual_to_message(message_pieces)) - ..() - -/mob/living/carbon/human/interactive/proc/doProcess() - set waitfor = FALSE - if(IsDeadOrIncap()) - reset() - return - //--------------------------- - //---- interest flow control - if(interest < 0 || inactivity_period < 0) - if(interest < 0) - interest = 0 - if(inactivity_period < 0) - inactivity_period = 0 - if(interest > maxInterest) - interest = maxInterest - //--------------------------- - //VIEW FUNCTIONS - - //doorscan is now integrated into life and runs before all other procs - var/mistake_chance = (100 - smartness) / 2 - spawn(0) - for(var/dir in alldirs) - var/turf/T = get_step(src, dir) - if(T) - for(var/obj/machinery/door/D in T.contents) - if(!istype(D,/obj/machinery/door/poddoor) && D.density) - spawn(0) - if(istype(D,/obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/AL = D - if(!AL.CanAStarPass(RPID)) // only crack open doors we can't get through - inactivity_period = 20 - AL.panel_open = 1 - AL.update_icon() - AL.shock(src, mistake_chance) - sleep(5) - if(QDELETED(AL)) - return - AL.unlock() - if(prob(mistake_chance)) - if(!AL.wires.IsIndexCut(AIRLOCK_WIRE_DOOR_BOLTS)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_DOOR_BOLTS) - else - if(AL.wires.IsIndexCut(AIRLOCK_WIRE_DOOR_BOLTS)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_DOOR_BOLTS, 1) - if(AL.locked) - AL.wires.UpdatePulsed(AIRLOCK_WIRE_DOOR_BOLTS) - if(!AL.wires.IsIndexCut(AIRLOCK_WIRE_MAIN_POWER1)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_MAIN_POWER1) - if(prob(mistake_chance) && !AL.wires.IsIndexCut(AIRLOCK_WIRE_SAFETY)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_SAFETY) - if(prob(mistake_chance) && !AL.wires.IsIndexCut(AIRLOCK_WIRE_ELECTRIFY)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_ELECTRIFY) - sleep(5) - if(QDELETED(AL)) - return - AL.panel_open = 0 - AL.update_icon() - D.open() - - if(update_hands) - if(l_hand || r_hand) - if(l_hand) - hand = 1 - main_hand = l_hand - if(r_hand) - other_hand = r_hand - else if(r_hand) - hand = 0 - main_hand = r_hand - if(l_hand) //this technically shouldnt occur, but its a redundancy - other_hand = l_hand - update_icons() - update_hands = 0 - - if(grabbed_by.len > 0) - for(var/obj/item/grab/G in grabbed_by) - if(Adjacent(G)) - a_intent = INTENT_DISARM - G.assailant.attack_hand(src) - inactivity_period = 10 - - if(buckled) - resist() - inactivity_period = 10 - - //proc functions - for(var/Proc in functions) - if(!IsDeadOrIncap()) - INVOKE_ASYNC(src, Proc) - - - //target interaction stays hardcoded - - if(TARGET && (TARGET in blacklistItems)) // don't use blacklisted items - TARGET = null - - if(TARGET && Adjacent(TARGET)) - doing |= SNPC_INTERACTING - //--------DOORS - if(istype(TARGET, /obj/machinery/door)) - var/obj/machinery/door/D = TARGET - if(D.check_access(MYID) && !istype(D,/obj/machinery/door/poddoor)) - inactivity_period = 10 - D.open() - var/turf/T = get_step(get_step(D.loc, dir), dir) //recursion yo - tryWalk(T) - //THIEVING SKILLS - insert_into_backpack() // dump random item into backpack to make space - //---------ITEMS - if(istype(TARGET, /obj/item)) - var/obj/item/I = TARGET - if(I.anchored) - TARGET = null - else if(istype(TARGET, /obj/item)) - var/obj/item/W = TARGET - if(W.force >= best_force || prob((SNPC_FUZZY_CHANCE_LOW + SNPC_FUZZY_CHANCE_HIGH) / 2) || favouredObjIn(list(W))) - if(!l_hand || !r_hand) - put_in_hands(W) - else - insert_into_backpack() - else - if(!l_hand || !r_hand) - put_in_hands(TARGET) - else - insert_into_backpack() - //---------FASHION - if(istype(TARGET, /obj/item/clothing)) - drop_item() - dressup(TARGET) - update_hands = 1 - if(MYPDA in loc) - equip_to_appropriate_slot(MYPDA) - if(MYID in loc) - equip_to_appropriate_slot(MYID) - //THIEVING SKILLS END - //-------------TOUCH ME - if(istype(TARGET, /obj/structure)) - var/obj/structure/STR = TARGET - if(main_hand) - var/obj/item/W = main_hand - STR.attackby(W, src) - else - STR.attack_hand(src) - interest += targetInterestShift - doing = doing & ~SNPC_INTERACTING - timeout = 0 - TARGET = null - else - if(TARGET) - tryWalk(TARGET) - timeout++ - - if(doing == 0) - interest-- - else - interest++ - - if(inactivity_period > 0) - inactivity_period-- - - if(interest <= 0 || timeout >= 10) // facilitate boredom functions - TARGET = null - doing = 0 - timeout = 0 - myPath = list() - - //this is boring, lets move - if(!doing && !IsDeadOrIncap() && !TARGET) - doing |= SNPC_TRAVEL - if(!isTraitor || !traitorTarget || get_dist(src, traitorTarget) >= SNPC_MAX_RANGE_FIND || get_dist(src, traitorTarget) <= 1) - var/choice = rand(1,50) - switch(choice) - if(1 to 30) - //chance to chase an item - TARGET = locate(/obj/item) in favouredObjIn(oview(SNPC_MIN_RANGE_FIND, src)) - if(31 to 40) - TARGET = safepick(get_area_turfs(job2area(myjob))) - if(41 to 45) - TARGET = pick(target_filter(favouredObjIn(urange(SNPC_MAX_RANGE_FIND, src, 1)))) - if(46 to 50) - TARGET = pick(target_filter(oview(SNPC_MIN_RANGE_FIND, src))) - else - TARGET = traitorTarget - tryWalk(TARGET) - LAST_TARGET = TARGET - -/mob/living/carbon/human/interactive/proc/dressup(obj/item/clothing/C) - set waitfor = FALSE - inactivity_period = 12 - sleep(5) - if(!QDELETED(C) && !QDELETED(src)) - take_to_slot(C,1) - if(!equip_to_appropriate_slot(C)) - var/obj/item/I = get_item_by_slot(C) - unEquip(I) - sleep(5) - if(!QDELETED(src) && !QDELETED(C)) - equip_to_appropriate_slot(C) - -/mob/living/carbon/human/interactive/proc/favouredObjIn(list/inList) - var/list/outList = list() - for(var/i in inList) - for(var/path in favoured_types) - if(istype(i, path)) - outList += i - if(!outList.len) - outList = inList - return outList - -/mob/living/carbon/human/interactive/proc/tryWalk(turf/inTarget) - if(restrictedJob) // we're a job that has to stay in our home - if(!(get_turf(inTarget) in get_area_turfs(job2area(myjob)))) - TARGET = null - return - - if(!IsDeadOrIncap()) - if(!walk2derpless(inTarget)) - timeout++ - else - timeout++ - -/mob/living/carbon/human/interactive/proc/getGoodPath(target, maxtries=512) - set background = 1 - var/turf/end = get_turf(target) - - var/turf/current = get_turf(src) - - var/list/path = list() - var/tries = 0 - while(current != end && tries < maxtries) - var/turf/shortest = current - for(var/turf/T in view(current,1)) - var/foundDense = 0 - for(var/atom/A in T) - if(A.density) - foundDense = 1 - if(T.density == 0 && !foundDense) - if(get_dist(T, target) < get_dist(shortest,target)) - shortest = T - else - tries++ - else - tries++ - current = shortest - path += shortest - return path - -/mob/living/carbon/human/interactive/proc/walk2derpless(target) - set background = 1 - if(!target) - return 0 - - if(myPath.len <= 0) - myPath = get_path_to(src, get_turf(target), /turf/proc/Distance, SNPC_MAX_RANGE_FIND + 1, 250,1, id=Path_ID, simulated_only = 0) - - if(myPath) - if(myPath.len > 0) - doing = doing & ~SNPC_TRAVEL - for(var/i = 0; i < maxStepsTick; ++i) - if(!IsDeadOrIncap()) - if(myPath.len >= 1) - walk_to(src,myPath[1],0,5) - myPath -= myPath[1] - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/job2area(target) - var/datum/job/T = target - switch(T.title) - if("Civilian", "Paramedic") - return /area/hallway/primary - if("Captain", "Head of Personnel", "Blueshield") - return /area/bridge - if("Bartender") - return /area/crew_quarters/bar - if("Chef") - return /area/crew_quarters/kitchen - if("Station Engineer", "Chief Engineer", "Mechanic") - return /area/engine - if("Life Support Specialist") - return /area/atmos - if("Chief Medical Officer", "Medical Doctor", "Chemist", "Virologist", "Psychiatrist") - return /area/medical - if("Geneticist") - return /area/medical/genetics - if("Research Director", "Scientist") - return /area/toxins - if("Roboticist") - return /area/assembly/robotics - if("Head of Security", "Warden", "Security Officer", "Detective", "Security Pod Pilot", "Brig Physician", "Magistrate", "Internal Affairs Agent") - return /area/security - if("Botanist") - return /area/hydroponics - else - return pick(/area/hallway, /area/crew_quarters) - -/mob/living/carbon/human/interactive/proc/target_filter(target) - var/list/filtered_targets = list(/area, /turf, /obj/machinery/door, /atom/movable/lighting_overlay, /obj/structure/cable, /obj/machinery/atmospherics, /obj/item/radio/intercom) - var/list/L = target - for(var/atom/A in target) // added a bunch of "junk" that clogs up the general find procs - if(is_type_in_list(A,filtered_targets)) - L -= A - return L - -/mob/living/carbon/human/interactive/proc/shouldModulePass() // returns 1 if the npc is in anything "primary" - if(doing & (SNPC_FIGHTING | SNPC_SPECIAL)) - return 1 - if(retal) - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/getAllContents() - var/list/allContents = list() - for(var/atom/A in contents) - allContents += A - if(A.contents.len) - for(var/atom/B in A) - allContents += B - return allContents - -/mob/living/carbon/human/interactive/proc/enforceHome() - var/list/validHome = get_area_turfs(job2area(myjob)) - - if(TARGET) - var/atom/tcheck = TARGET - if(tcheck) - if(!(get_turf(tcheck) in validHome)) - TARGET = null - return 1 - - if(!(get_turf(src) in validHome) && validHome.len) - tryWalk(pick(get_area_turfs(job2area(myjob)))) - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/npcDrop(obj/item/A, blacklist = 0) - if(blacklist) - blacklistItems += A - unEquip(A) - enforce_hands() - update_icons() - -/mob/living/carbon/human/interactive/proc/compareFaction(list/targetFactions) - var/hasSame = 0 - - for(var/A in targetFactions) - if(A in faction) - hasSame = 1 - - return hasSame - -/mob/living/carbon/human/interactive/proc/nearbyscan(obj) - nearby = list() - for(var/mob/living/M in view(4,src)) - if(M != src) - nearby += M - -/mob/living/carbon/human/interactive/rename_character(oldname, newname) - if(!..()) - return 0 - - if(oldname) - if(MYID) - MYID.registered_name = newname - MYID.name = "[newname]'s ID Card ([MYID.assignment])" - if(RPID) - RPID.registered_name = MYID.registered_name - RPID.name = MYID.name - return 1 diff --git a/code/modules/mob/living/carbon/human/interactive/prefabs.dm b/code/modules/mob/living/carbon/human/interactive/prefabs.dm deleted file mode 100644 index cee716b66ec..00000000000 --- a/code/modules/mob/living/carbon/human/interactive/prefabs.dm +++ /dev/null @@ -1,24 +0,0 @@ -/mob/living/carbon/human/interactive/angry/Initialize(mapload) - TRAITS |= TRAIT_ROBUST - TRAITS |= TRAIT_MEAN - faction += "bot_angry" - return ..() - -/mob/living/carbon/human/interactive/friendly/Initialize(mapload) - TRAITS |= TRAIT_FRIENDLY - TRAITS |= TRAIT_UNROBUST - faction += "bot_friendly" - faction += "neutral" - functions -= "combat" - return ..() - -/mob/living/carbon/human/interactive/greytide/Initialize(mapload) - TRAITS |= TRAIT_ROBUST - TRAITS |= TRAIT_MEAN - TRAITS |= TRAIT_THIEVING - TRAITS |= TRAIT_DUMB - maxInterest = 5 // really short attention span - targetInterestShift = 2 // likewise - faction += "bot_grey" - graytide = 1 - return ..() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 903c8ef80d3..d6c667b1b74 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -38,6 +38,7 @@ regenerate_icons() // Make sure the inventory updates handle_ghosted() + handle_ssd() /mob/living/carbon/human/proc/handle_ghosted() if(player_ghosted > 0 && stat == CONSCIOUS && job && !restrained()) @@ -48,6 +49,22 @@ if(player_ghosted % 150 == 0) force_cryo_human(src) +/mob/living/carbon/human/proc/handle_ssd() + if(player_logged > 0 && stat != DEAD && job) + player_logged++ + if(istype(loc, /obj/machinery/cryopod)) + return + if(config.auto_cryo_ssd_mins && (player_logged >= (config.auto_cryo_ssd_mins * 30)) && player_logged % 30 == 0) + var/turf/T = get_turf(src) + if(!is_station_level(T.z)) + return + var/area/A = get_area(src) + if(cryo_ssd(src)) + var/obj/effect/portal/P = new /obj/effect/portal(T, null, null, 40) + P.name = "NT SSD Teleportation Portal" + if(A.fast_despawn) + force_cryo_human(src) + /mob/living/carbon/human/calculate_affecting_pressure(var/pressure) ..() var/pressure_difference = abs( pressure - ONE_ATMOSPHERE ) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 1be6fc60a25..2f181d77077 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -62,27 +62,38 @@ return ..() /mob/living/carbon/human/proc/HasVoiceChanger() - if(istype(back,/obj/item/rig)) + if(istype(back, /obj/item/rig)) var/obj/item/rig/rig = back if(rig.speech && rig.speech.voice_holder && rig.speech.voice_holder.active && rig.speech.voice_holder.voice) return rig.speech.voice_holder.voice - for(var/obj/item/gear in list(wear_mask,wear_suit,head)) + for(var/obj/item/gear in list(wear_mask, wear_suit, head)) if(!gear) continue + var/obj/item/voice_changer/changer = locate() in gear - if(changer && changer.active && changer.voice) - return changer.voice - return 0 + if(changer && changer.active) + if(changer.voice) + return changer.voice + else if(wear_id) + var/obj/item/card/id/idcard = wear_id.GetID() + if(istype(idcard)) + return idcard.registered_name + + return FALSE /mob/living/carbon/human/GetVoice() var/has_changer = HasVoiceChanger() + if(has_changer) return has_changer + if(mind && mind.changeling && mind.changeling.mimicing) return mind.changeling.mimicing + if(GetSpecialVoice()) return GetSpecialVoice() + return real_name /mob/living/carbon/human/IsVocal() @@ -124,7 +135,6 @@ span = mind.speech_span if((COMIC in mutations) \ || (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs) \ - || istype(get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown) \ || GetComponent(/datum/component/jestosterone)) span = "sans" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e55eee62dbc..6e540c4cf5a 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -659,6 +659,7 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/update_inv_glasses(var/update_icons=1) remove_overlay(GLASSES_LAYER) remove_overlay(GLASSES_OVER_LAYER) + remove_overlay(OVER_MASK_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_glasses] @@ -681,7 +682,12 @@ var/global/list/damage_icon_parts = list() new_glasses = mutable_appearance('icons/mob/eyes.dmi', "[glasses.icon_state]", layer = -GLASSES_LAYER) var/datum/sprite_accessory/hair/hair_style = GLOB.hair_styles_full_list[head_organ.h_style] - if(hair_style && hair_style.glasses_over) //Select which layer to use based on the properties of the hair style. Hair styles with hair that don't overhang the arms of the glasses should have glasses_over set to a positive value. + var/obj/item/clothing/glasses/G = glasses + if(istype(G) && G.over_mask) //If the user's used the 'wear over mask' verb on the glasses. + new_glasses.layer = -OVER_MASK_LAYER + overlays_standing[OVER_MASK_LAYER] = new_glasses + apply_overlay(OVER_MASK_LAYER) + else if(hair_style && hair_style.glasses_over) //Select which layer to use based on the properties of the hair style. Hair styles with hair that don't overhang the arms of the glasses should have glasses_over set to a positive value. new_glasses.layer = -GLASSES_OVER_LAYER overlays_standing[GLASSES_OVER_LAYER] = new_glasses apply_overlay(GLASSES_OVER_LAYER) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index d28e728c82c..d66f3dbf815 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -8,6 +8,15 @@ return 0 var/datum/gas_mixture/environment = loc.return_air() + if(client || registered_z) // This is a temporary error tracker to make sure we've caught everything + var/turf/T = get_turf(src) + if(client && registered_z != T.z) + message_admins("[src] [ADMIN_FLW(src, "FLW")] has somehow ended up in Z-level [T.z] despite being registered in Z-level [registered_z]. If you could ask them how that happened and notify the coders, it would be appreciated.") + log_game("Z-TRACKING: [src] has somehow ended up in Z-level [T.z] despite being registered in Z-level [registered_z].") + update_z(T.z) + else if (!client && registered_z) + log_game("Z-TRACKING: [src] of type [src.type] has a Z-registration despite not having a client.") + update_z(null) if(stat != DEAD) //Chemicals in the body handle_chemicals_in_body() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 52fde3d0d9e..3000fd5b085 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -953,6 +953,27 @@ to_chat(src, "You can taste [english_list(final_taste_list)].") +/mob/living/proc/update_z(new_z) // 1+ to register, null to unregister + if(registered_z != new_z) + if(registered_z) + SSmobs.clients_by_zlevel[registered_z] -= src + if(client) + if(new_z) + SSmobs.clients_by_zlevel[new_z] += src + for (var/I in length(SSidlenpcpool.idle_mobs_by_zlevel[new_z]) to 1 step -1) //Backwards loop because we're removing (guarantees optimal rather than worst-case performance), it's fine to use .len here but doesn't compile on 511 + var/mob/living/simple_animal/SA = SSidlenpcpool.idle_mobs_by_zlevel[new_z][I] + if (SA) + SA.toggle_ai(AI_ON) // Guarantees responsiveness for when appearing right next to mobs + else + SSidlenpcpool.idle_mobs_by_zlevel[new_z] -= SA + registered_z = new_z + else + registered_z = null + +/mob/living/onTransitZ(old_z,new_z) + ..() + update_z(new_z) + /mob/living/proc/owns_soul() if(mind) return mind.soulOwner == mind diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index d1157b662fa..d8e27df91fe 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -5,6 +5,10 @@ update_stat("mob login") update_sight() + var/turf/T = get_turf(src) + if(isturf(T)) + update_z(T.z) + //If they're SSD, remove it so they can wake back up. player_logged = 0 //Vents diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm index 87384669a7c..e1c33f89a7e 100644 --- a/code/modules/mob/living/logout.dm +++ b/code/modules/mob/living/logout.dm @@ -1,4 +1,5 @@ /mob/living/Logout() + update_z(null) if(ranged_ability && client) ranged_ability.remove_mousepointer(client) ..() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index ccf319b0884..ae7fcf56a9d 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -634,7 +634,7 @@ var/list/ai_verbs_default = list( return if(href_list["trackbot"]) - var/mob/living/simple_animal/bot/target = locate(href_list["trackbot"]) in GLOB.simple_animal_list + var/mob/living/simple_animal/bot/target = locate(href_list["trackbot"]) in GLOB.simple_animals if(target) ai_actual_track(target) else @@ -642,7 +642,7 @@ var/list/ai_verbs_default = list( return if(href_list["callbot"]) //Command a bot to move to a selected location. - Bot = locate(href_list["callbot"]) in GLOB.simple_animal_list + Bot = locate(href_list["callbot"]) in GLOB.simple_animals if(!Bot || Bot.remote_disabled || control_disabled) return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off. waypoint_mode = 1 @@ -650,7 +650,7 @@ var/list/ai_verbs_default = list( return if(href_list["interface"]) //Remotely connect to a bot! - Bot = locate(href_list["interface"]) in GLOB.simple_animal_list + Bot = locate(href_list["interface"]) in GLOB.simple_animals if(!Bot || Bot.remote_disabled || control_disabled) return Bot.attack_ai(src) @@ -746,7 +746,7 @@ var/list/ai_verbs_default = list( d += "Query network status
" d += "" - for(var/mob/living/simple_animal/bot/Bot in GLOB.simple_animal_list) + for(var/mob/living/simple_animal/bot/Bot in GLOB.simple_animals) if(is_ai_allowed(Bot.z) && !Bot.remote_disabled) //Only non-emagged bots on the allowed Z-level are detected! bot_area = get_area(Bot) d += "" diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 2f662169551..63b206debba 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -42,3 +42,9 @@ animation.icon = 'icons/mob/mob.dmi' animation.master = src QDEL_IN(animation, 15) + +/mob/living/silicon/death(gibbed) + . = ..() + if(!gibbed) + if(death_sound) + playsound(get_turf(src), death_sound, 200, 1) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 989dcba3783..ff859853ea5 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -28,7 +28,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates if(candidate) if(!istype(candidate)) - message_admins("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate is not a pAI)") + message_admins("Warning: possible href exploit by [key_name_admin(usr)] (paiController/Topic, candidate is not a pAI)") log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate is not a pAI)") return @@ -55,7 +55,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates pai_candidates -= candidate usr << browse(null, "window=findPai") - + return if("signup" in href_list) var/mob/dead/observer/O = locate(href_list["signup"]) @@ -71,8 +71,8 @@ var/datum/paiController/paiController // Global handler for pAI candidates if(candidate) if(candidate.key && usr.key && candidate.key != usr.key) - message_admins("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)") - log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)") + message_admins("Warning: possible href exploit by [key_name_admin(usr)] (paiController/Topic, candidate and usr have different keys)") + log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr have different keys)") return if(href_list["new"]) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index d81b76e2e76..d584d5a50f5 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -22,8 +22,11 @@ /datum/robot_component/proc/install() go_online() + owner.updatehealth("component '[src]' installed") + /datum/robot_component/proc/uninstall() go_offline() + owner.updatehealth("component '[src]' removed") /datum/robot_component/proc/destroy() if(wrapped) @@ -102,12 +105,6 @@ external_type = /obj/item/robot_parts/robot_component/actuator max_damage = 50 -/datum/robot_component/actuator/go_online() - owner.update_stat() - -/datum/robot_component/actuator/go_offline() - owner.update_stat() - /datum/robot_component/cell name = "power cell" max_damage = 50 @@ -115,12 +112,6 @@ /datum/robot_component/cell/is_powered() return ..() && owner.cell -/datum/robot_component/cell/go_online() - owner.update_stat() - -/datum/robot_component/cell/go_offline() - owner.update_stat() - /datum/robot_component/cell/destroy() ..() owner.cell = null @@ -264,19 +255,25 @@ if(M.timeofdeath && M.stat == DEAD) to_chat(user, "Time of Disable: [station_time_timestamp("hh:mm:ss", M.timeofdeath)]") var/mob/living/silicon/robot/H = M - var/list/damaged = H.get_damaged_components(1,1,1) + var/list/damaged = H.get_damaged_components(TRUE, TRUE, TRUE) // Get all except the missing ones + var/list/missing = H.get_missing_components() to_chat(user, "Localized Damage:") - if(length(damaged)>0) - for(var/datum/robot_component/org in damaged) - user.show_message(text("\t []: [][] - [] - [] - []", \ - capitalize(org.name), \ - (org.installed == -1) ? "DESTROYED " :"",\ - (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \ - (org.brute_damage > 0) ? "[org.brute_damage]" :0, \ - (org.toggled) ? "Toggled ON" : "Toggled OFF",\ - (org.powered) ? "Power ON" : "Power OFF"),1) - else + if(!LAZYLEN(damaged) && !LAZYLEN(missing)) to_chat(user, "\t Components are OK.") + else + if(LAZYLEN(damaged)) + for(var/datum/robot_component/org in damaged) + user.show_message(text("\t []: [][] - [] - [] - []", \ + capitalize(org.name), \ + (org.installed == -1) ? "DESTROYED " :"",\ + (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \ + (org.brute_damage > 0) ? "[org.brute_damage]" :0, \ + (org.toggled) ? "Toggled ON" : "Toggled OFF",\ + (org.powered) ? "Power ON" : "Power OFF"),1) + if(LAZYLEN(missing)) + for(var/datum/robot_component/org in missing) + user.show_message("\t [capitalize(org.name)]: MISSING") + if(H.emagged && prob(5)) to_chat(user, "\t ERROR: INTERNAL SYSTEMS COMPROMISED") @@ -287,22 +284,22 @@ to_chat(user, "External prosthetics:") var/organ_found - if(H.internal_organs.len) + if(LAZYLEN(H.internal_organs)) for(var/obj/item/organ/external/E in H.bodyparts) if(!E.is_robotic()) continue - organ_found = 1 + organ_found = TRUE to_chat(user, "[E.name]: [E.brute_dam][E.burn_dam]") if(!organ_found) to_chat(user, "No prosthetics located.") to_chat(user, "
") to_chat(user, "Internal prosthetics:") organ_found = null - if(H.internal_organs.len) + if(LAZYLEN(H.internal_organs)) for(var/obj/item/organ/internal/O in H.internal_organs) if(!O.is_robotic()) continue - organ_found = 1 + organ_found = TRUE to_chat(user, "[capitalize(O.name)]: [O.damage]") if(!organ_found) to_chat(user, "No prosthetics located.") diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 80014c44f8b..e94f9e072b4 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -248,9 +248,9 @@ death() /mob/living/silicon/robot/drone/proc/full_law_reset() - clear_supplied_laws() - clear_inherent_laws() - clear_ion_laws() + clear_supplied_laws(TRUE) + clear_inherent_laws(TRUE) + clear_ion_laws(TRUE) laws = new /datum/ai_laws/drone //Reboot procs. diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index ae6a832f6ac..da793b2f3d3 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -157,6 +157,7 @@ var/list/robot_verbs_default = list( var/datum/robot_component/cell_component = components["power cell"] cell_component.wrapped = cell cell_component.installed = 1 + cell_component.install() diag_hud_set_borgcell() scanner = new(src) @@ -438,8 +439,10 @@ var/list/robot_verbs_default = list( var/dat = "[src.name] Self-Diagnosis Report\n" for(var/V in components) var/datum/robot_component/C = components[V] - dat += "[C.name]

Name

Status

Location

Control

[Bot.hacked ? "(!) [Bot.name]" : Bot.name] ([Bot.model])
Brute Damage:[C.brute_damage]
Electronics Damage:[C.electronics_damage]
Powered:[C.is_powered() ? "Yes" : "No"]
Toggled:[ C.toggled ? "Yes" : "No"]

" - + if(C.installed == 0) + dat += "[C.name]
MISSING
" + else + dat += "[C.name][C.installed == -1 ? "
DESTROYED" : ""]
Brute Damage:[C.brute_damage]
Electronics Damage:[C.electronics_damage]
Powered:[C.is_powered() ? "Yes" : "No"]
Toggled:[ C.toggled ? "Yes" : "No"]

" return dat /mob/living/silicon/robot/verb/self_diagnosis_verb() @@ -591,6 +594,9 @@ var/list/robot_verbs_default = list( if(!getBruteLoss()) to_chat(user, "Nothing to fix!") return + else if(!getBruteLoss(TRUE)) + to_chat(user, "The damaged components are beyond saving!") + return var/obj/item/weldingtool/WT = W user.changeNext_move(CLICK_CD_MELEE) if(WT.remove_fuel(0)) @@ -603,11 +609,14 @@ var/list/robot_verbs_default = list( return - else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone))) + else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src, /mob/living/silicon/robot/drone))) user.changeNext_move(CLICK_CD_MELEE) if(!getFireLoss()) to_chat(user, "Nothing to fix!") return + else if(!getFireLoss(TRUE)) + to_chat(user, "The damaged components are beyond saving!") + return var/obj/item/stack/cable_coil/coil = W adjustFireLoss(-30) updatehealth() @@ -654,10 +663,10 @@ var/list/robot_verbs_default = list( I.burn = C.electronics_damage I.loc = src.loc - - if(C.installed == 1) - C.uninstall() + var/was_installed = C.installed C.installed = 0 + if(was_installed == 1) + C.uninstall() else if(locked) @@ -1362,7 +1371,7 @@ var/list/robot_verbs_default = list( ..() var/brute = 1000 var/burn = 1000 - var/list/datum/robot_component/borked_parts = get_damaged_components(brute,burn,1) + var/list/datum/robot_component/borked_parts = get_damaged_components(TRUE, TRUE, TRUE, TRUE) for(var/datum/robot_component/borked_part in borked_parts) brute = borked_part.brute_damage burn = borked_part.electronics_damage diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index e2a93fa0167..81700464ac0 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -8,18 +8,20 @@ handle_hud_icons_health() diag_hud_set_health() -/mob/living/silicon/robot/getBruteLoss() +/mob/living/silicon/robot/getBruteLoss(repairable_only = FALSE) var/amount = 0 for(var/V in components) var/datum/robot_component/C = components[V] - if(C.installed != 0) amount += C.brute_damage + if(C.installed != 0 && (!repairable_only || C.installed != -1)) // Installed ones only and if repair only remove the borked ones + amount += C.brute_damage return amount -/mob/living/silicon/robot/getFireLoss() +/mob/living/silicon/robot/getFireLoss(repairable_only = FALSE) var/amount = 0 for(var/V in components) var/datum/robot_component/C = components[V] - if(C.installed != 0) amount += C.electronics_damage + if(C.installed != 0 && (!repairable_only || C.installed != -1)) // Installed ones only and if repair only remove the borked ones + amount += C.electronics_damage return amount /mob/living/silicon/robot/adjustBruteLoss(amount, updating_health = TRUE) @@ -36,11 +38,19 @@ heal_overall_damage(0, -amount, updating_health) return STATUS_UPDATE_HEALTH -/mob/living/silicon/robot/proc/get_damaged_components(var/brute, var/burn, var/get_all) +/mob/living/silicon/robot/proc/get_damaged_components(get_brute, get_burn, get_borked = FALSE, get_missing = FALSE) var/list/datum/robot_component/parts = list() for(var/V in components) var/datum/robot_component/C = components[V] - if(C.installed == 1 || get_all) if((brute && C.brute_damage) || (burn && C.electronics_damage)) + if((C.installed == 1 || (get_borked && C.installed == -1) || (get_missing && C.installed == 0)) && ((get_brute && C.brute_damage) || (get_burn && C.electronics_damage))) + parts += C + return parts + +/mob/living/silicon/robot/proc/get_missing_components() + var/list/datum/robot_component/parts = list() + for(var/V in components) + var/datum/robot_component/C = components[V] + if(C.installed == 0) parts += C return parts @@ -48,41 +58,43 @@ var/list/rval = new for(var/V in components) var/datum/robot_component/C = components[V] - if(C.installed == 1) rval += C + if(C.installed == 1) + rval += C return rval /mob/living/silicon/robot/proc/get_armour() - - if(!components.len) return 0 + if(!LAZYLEN(components)) + return 0 var/datum/robot_component/C = components["armour"] if(C && C.installed == 1) return C return 0 /mob/living/silicon/robot/heal_organ_damage(brute, burn, updating_health = TRUE) - var/list/datum/robot_component/parts = get_damaged_components(brute,burn) - if(!parts.len) return + var/list/datum/robot_component/parts = get_damaged_components(brute, burn) + if(!LAZYLEN(parts)) + return var/datum/robot_component/picked = pick(parts) - picked.heal_damage(brute,burn, updating_health) + picked.heal_damage(brute, burn, updating_health) /mob/living/silicon/robot/take_organ_damage(brute = 0, burn = 0, updating_health = TRUE, sharp = 0, edge = 0) var/list/components = get_damageable_components() - if(!components.len) + if(!LAZYLEN(components)) return //Combat shielding absorbs a percentage of damage directly into the cell. var/obj/item/borg/combat/shield/shield - if(module_state_1 && istype(module_state_1,/obj/item/borg/combat/shield)) + if(module_state_1 && istype(module_state_1, /obj/item/borg/combat/shield)) shield = module_state_1 - else if(module_state_2 && istype(module_state_2,/obj/item/borg/combat/shield)) + else if(module_state_2 && istype(module_state_2, /obj/item/borg/combat/shield)) shield = module_state_2 - else if(module_state_3 && istype(module_state_3,/obj/item/borg/combat/shield)) + else if(module_state_3 && istype(module_state_3, /obj/item/borg/combat/shield)) shield = module_state_3 if(shield) //Shields absorb a certain percentage of damage based on their power setting. - var/absorb_brute = brute*shield.shield_level - var/absorb_burn = burn*shield.shield_level - var/cost = (absorb_brute+absorb_burn)*100 + var/absorb_brute = brute * shield.shield_level + var/absorb_burn = burn * shield.shield_level + var/cost = (absorb_brute+absorb_burn) * 100 cell.charge -= cost if(cell.charge <= 0) @@ -102,9 +114,9 @@ C.take_damage(brute, burn, sharp, updating_health) /mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn, updating_health = TRUE) - var/list/datum/robot_component/parts = get_damaged_components(brute,burn) + var/list/datum/robot_component/parts = get_damaged_components(brute, burn) - while(parts.len && (brute>0 || burn>0) ) + while(LAZYLEN(parts) && (brute > 0 || burn > 0) ) var/datum/robot_component/picked = pick(parts) var/brute_was = picked.brute_damage @@ -112,8 +124,8 @@ picked.heal_damage(brute,burn, updating_health) - brute -= (brute_was-picked.brute_damage) - burn -= (burn_was-picked.electronics_damage) + brute -= (brute_was - picked.brute_damage) + burn -= (burn_was - picked.electronics_damage) parts -= picked @@ -126,17 +138,17 @@ //Combat shielding absorbs a percentage of damage directly into the cell. var/obj/item/borg/combat/shield/shield - if(module_state_1 && istype(module_state_1,/obj/item/borg/combat/shield)) + if(module_state_1 && istype(module_state_1, /obj/item/borg/combat/shield)) shield = module_state_1 - else if(module_state_2 && istype(module_state_2,/obj/item/borg/combat/shield)) + else if(module_state_2 && istype(module_state_2, /obj/item/borg/combat/shield)) shield = module_state_2 - else if(module_state_3 && istype(module_state_3,/obj/item/borg/combat/shield)) + else if(module_state_3 && istype(module_state_3, /obj/item/borg/combat/shield)) shield = module_state_3 if(shield) //Shields absorb a certain percentage of damage based on their power setting. - var/absorb_brute = brute*shield.shield_level - var/absorb_burn = burn*shield.shield_level - var/cost = (absorb_brute+absorb_burn)*100 + var/absorb_brute = brute * shield.shield_level + var/absorb_burn = burn * shield.shield_level + var/cost = (absorb_brute+absorb_burn) * 100 cell.charge -= cost if(cell.charge <= 0) @@ -152,7 +164,7 @@ A.take_damage(brute, burn, sharp) return - while(parts.len && (brute>0 || burn>0) ) + while(LAZYLEN(parts) && (brute > 0 || burn > 0) ) var/datum/robot_component/picked = pick(parts) var/brute_was = picked.brute_damage diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 161b81e3cd2..85cc2ad5786 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -46,7 +46,9 @@ user.put_in_active_hand(cell) to_chat(user, "You remove \the [cell].") cell = null - update_stat() + var/datum/robot_component/C = components["power cell"] + C.installed = 0 + C.uninstall() diag_hud_set_borgcell() if(!opened) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 5c19dcb0d7a..1c82e9e8779 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -19,6 +19,7 @@ var/speak_exclamation = "declares" var/speak_query = "queries" var/pose //Yes, now AIs can pose too. + var/death_sound = 'sound/voice/borg_deathsound.ogg' //var/sensor_mode = 0 //Determines the current HUD. diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 2737781bd08..77eb74e5696 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -210,23 +210,29 @@ var/robot_arm = /obj/item/robot_parts/l_arm throw_range = 5 w_class = WEIGHT_CLASS_NORMAL var/created_name = "Floorbot" + var/toolbox = /obj/item/storage/toolbox/mechanical + var/toolbox_color = "" //Blank for blue, r for red, y for yellow, etc. -/obj/item/toolbox_tiles_sensor +/obj/item/toolbox_tiles/sensor desc = "It's a toolbox with tiles sticking out the top and a sensor attached" name = "tiles, toolbox and sensor arrangement" - icon = 'icons/obj/aibots.dmi' icon_state = "toolbox_tiles_sensor" - force = 3 - throwforce = 10 - throw_speed = 2 - throw_range = 5 - w_class = WEIGHT_CLASS_NORMAL - var/created_name = "Floorbot" -/obj/item/storage/toolbox/mechanical/attackby(obj/item/stack/tile/plasteel/T, mob/user, params) +/obj/item/storage/toolbox/attackby(obj/item/stack/tile/plasteel/T, mob/user, params) + var/list/allowed_toolbox = list(/obj/item/storage/toolbox/emergency, //which toolboxes can be made into floorbots + /obj/item/storage/toolbox/electrical, + /obj/item/storage/toolbox/mechanical, + /obj/item/storage/toolbox/green, + /obj/item/storage/toolbox/syndicate, + /obj/item/storage/toolbox/fakesyndi) + if(!istype(T, /obj/item/stack/tile/plasteel)) ..() return + if(!is_type_in_list(src, allowed_toolbox)) + return + if(type == /obj/item/storage/toolbox/green/memetic) + return if(contents.len >= 1) to_chat(user, "They won't fit in, as there is already stuff inside.") return @@ -234,6 +240,23 @@ var/robot_arm = /obj/item/robot_parts/l_arm if(user.s_active) user.s_active.close(user) var/obj/item/toolbox_tiles/B = new /obj/item/toolbox_tiles + B.toolbox = type + switch(B.toolbox) + if(/obj/item/storage/toolbox/mechanical/old) + B.toolbox_color = "ob" + if(/obj/item/storage/toolbox/emergency) + B.toolbox_color = "r" + if(/obj/item/storage/toolbox/emergency/old) + B.toolbox_color = "or" + if(/obj/item/storage/toolbox/electrical) + B.toolbox_color = "y" + if(/obj/item/storage/toolbox/green) + B.toolbox_color = "g" + if(/obj/item/storage/toolbox/syndicate) + B.toolbox_color = "s" + if(/obj/item/storage/toolbox/fakesyndi) + B.toolbox_color = "s" + B.icon_state = "[B.toolbox_color]toolbox_tiles" user.put_in_hands(B) to_chat(user, "You add the tiles into the empty toolbox. They protrude from the top.") user.unEquip(src, 1) @@ -246,8 +269,10 @@ var/robot_arm = /obj/item/robot_parts/l_arm ..() if(isprox(W)) qdel(W) - var/obj/item/toolbox_tiles_sensor/B = new /obj/item/toolbox_tiles_sensor() + var/obj/item/toolbox_tiles/sensor/B = new /obj/item/toolbox_tiles/sensor() B.created_name = created_name + B.toolbox_color = src.toolbox_color + B.icon_state = "[B.toolbox_color]toolbox_tiles_sensor" user.put_in_hands(B) to_chat(user, "You add the sensor to the toolbox and tiles.") user.unEquip(src, 1) @@ -263,12 +288,11 @@ var/robot_arm = /obj/item/robot_parts/l_arm created_name = t log_game("[key_name(user)] has renamed a robot to [t]") -/obj/item/toolbox_tiles_sensor/attackby(obj/item/W, mob/user, params) +/obj/item/toolbox_tiles/sensor/attackby(obj/item/W, mob/user, params) ..() if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm)) qdel(W) - var/turf/T = get_turf(user.loc) - var/mob/living/simple_animal/bot/floorbot/A = new /mob/living/simple_animal/bot/floorbot(T) + var/mob/living/simple_animal/bot/floorbot/A = new(drop_location(), toolbox_color) A.name = created_name A.robot_arm = W.type to_chat(user, "You add the robot arm to the odd looking toolbox assembly. Boop beep!") @@ -287,10 +311,9 @@ var/robot_arm = /obj/item/robot_parts/l_arm //Medbot Assembly /obj/item/storage/firstaid/attackby(obj/item/I, mob/user, params) if(!istype(I, /obj/item/robot_parts/l_arm) && !istype(I, /obj/item/robot_parts/r_arm)) - return ..() + return ..() else robot_arm = I.type - //Making a medibot! if(contents.len) @@ -298,7 +321,7 @@ var/robot_arm = /obj/item/robot_parts/l_arm return var/obj/item/firstaid_arm_assembly/A = new /obj/item/firstaid_arm_assembly(loc, med_bot_skin) - + A.req_one_access = req_one_access A.syndicate_aligned = syndicate_aligned A.treatment_oxy = treatment_oxy @@ -492,7 +515,7 @@ var/robot_arm = /obj/item/robot_parts/l_arm //General Griefsky - else if((istype(I, /obj/item/wrench)) && (build_step == 3)) + else if((istype(I, /obj/item/wrench)) && (build_step == 3)) var/obj/item/griefsky_assembly/A = new /obj/item/griefsky_assembly user.put_in_hands(A) to_chat(user, "You adjust the arm slots for extra weapons!.") @@ -516,12 +539,12 @@ var/robot_arm = /obj/item/robot_parts/l_arm build_step++ to_chat(user, "You add an energy sword to [src]!.") qdel(I) - + else if((istype(I, /obj/item/melee/energy/sword)) && (build_step == 3)) if(!user.unEquip(I)) return to_chat(user, "You complete General Griefsky!.") - var/mob/living/simple_animal/bot/secbot/griefsky/S = new /mob/living/simple_animal/bot/secbot/griefsky + var/mob/living/simple_animal/bot/secbot/griefsky/S = new /mob/living/simple_animal/bot/secbot/griefsky S.forceMove(get_turf(src)) qdel(I) qdel(src) @@ -537,7 +560,7 @@ var/robot_arm = /obj/item/robot_parts/l_arm if(!user.unEquip(I)) return to_chat(user, "You complete Genewul Giftskee!.") - var/mob/living/simple_animal/bot/secbot/griefsky/toy/S = new /mob/living/simple_animal/bot/secbot/griefsky/toy + var/mob/living/simple_animal/bot/secbot/griefsky/toy/S = new /mob/living/simple_animal/bot/secbot/griefsky/toy S.forceMove(get_turf(src)) qdel(I) qdel(src) diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index c22d37eed19..21967bd202b 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/aibots.dmi' icon_state = "floorbot0" density = 0 - anchored = 0 + anchored = FALSE health = 25 maxHealth = 25 @@ -32,6 +32,7 @@ var/max_targets = 50 var/turf/target var/oldloc = null + var/toolbox_color = "" #define HULL_BREACH 1 #define BRIDGE_MODE 2 @@ -40,12 +41,16 @@ #define REPLACE_TILE 5 #define TILE_EMAG 6 -/mob/living/simple_animal/bot/floorbot/New() +/mob/living/simple_animal/bot/floorbot/New(mapload, new_toolbox_color) ..() + toolbox_color = new_toolbox_color update_icon() var/datum/job/engineer/J = new/datum/job/engineer access_card.access += J.get_access() prev_access = access_card.access + if(toolbox_color == "s") + health = 50 + maxHealth = 50 /mob/living/simple_animal/bot/floorbot/bot_reset() ..() @@ -53,7 +58,7 @@ oldloc = null ignore_list = list() nagged = 0 - anchored = 0 + anchored = FALSE update_icon() /mob/living/simple_animal/bot/floorbot/set_custom_texts() @@ -235,7 +240,7 @@ repair(target) else if(emagged == 2 && istype(target,/turf/simulated/floor)) var/turf/simulated/floor/F = target - anchored = 1 + anchored = TRUE mode = BOT_REPAIRING if(prob(90)) F.break_tile_to_plating() @@ -244,7 +249,7 @@ audible_message("[src] makes an excited booping sound.") spawn(50) amount ++ - anchored = 0 + anchored = FALSE mode = BOT_IDLE target = null path = list() @@ -272,11 +277,11 @@ if(HULL_BREACH) //The most common job, patching breaches in the station's hull. if(is_hull_breach(scan_target)) //Ensure that the targeted space turf is actually part of the station, and not random space. result = scan_target - anchored = 1 //Prevent the floorbot being blown off-course while trying to reach a hull breach. + anchored = TRUE //Prevent the floorbot being blown off-course while trying to reach a hull breach. if(BRIDGE_MODE) //Only space turfs in our chosen direction are considered. if(get_dir(src, scan_target) == targetdirection) result = scan_target - anchored = 1 + anchored = TRUE if(REPLACE_TILE) F = scan_target if(istype(F, /turf/simulated/floor/plating)) //The floor must not already have a tile. @@ -306,9 +311,10 @@ mode = BOT_IDLE target = null return - anchored = 1 - icon_state = "floorbot-c" + anchored = TRUE + icon_state = "[toolbox_color]floorbot-c" if(istype(target_turf, /turf/space/)) //If we are fixing an area not part of pure space, it is + icon_state = "[toolbox_color]floorbot-c" visible_message("[targetdirection ? "[src] begins installing a bridge plating." : "[src] begins to repair the hole."] ") mode = BOT_REPAIRING spawn(50) @@ -320,11 +326,12 @@ mode = BOT_IDLE amount -= 1 update_icon() - anchored = 0 + anchored = FALSE target = null else var/turf/simulated/floor/F = target_turf mode = BOT_REPAIRING + icon_state = "[toolbox_color]floorbot-c" visible_message("[src] begins repairing the floor.") spawn(50) if(mode == BOT_REPAIRING) @@ -334,7 +341,7 @@ mode = BOT_IDLE amount -= 1 update_icon() - anchored = 0 + anchored = FALSE target = null /mob/living/simple_animal/bot/floorbot/proc/eattile(obj/item/stack/tile/plasteel/T) @@ -380,9 +387,9 @@ /mob/living/simple_animal/bot/floorbot/update_icon() if(amount > 0) - icon_state = "floorbot[on]" + icon_state = "[toolbox_color]floorbot[on]" else - icon_state = "floorbot[on]e" + icon_state = "[toolbox_color]floorbot[on]e" /mob/living/simple_animal/bot/floorbot/explode() on = 0 diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 3ff26f7850c..970ac596482 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -451,7 +451,7 @@ response_harm = "kicks" gold_core_spawnable = CHEM_MOB_SPAWN_INVALID -/mob/living/simple_animal/pet/corgi/Ian/process_ai() +/mob/living/simple_animal/pet/corgi/Ian/Life() ..() //Feeding, chasing food, FOOOOODDDD @@ -578,7 +578,7 @@ return ..() -/mob/living/simple_animal/pet/corgi/Lisa/process_ai() +/mob/living/simple_animal/pet/corgi/Lisa/Life() ..() make_babies() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index ae19106e1af..869c663e312 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -54,9 +54,8 @@ else if(prob(5)) emote("snuffles") -/mob/living/simple_animal/mouse/process_ai() +/mob/living/simple_animal/mouse/Life() ..() - if(prob(0.5)) stat = UNCONSCIOUS icon_state = "mouse_[mouse_color]_sleep" diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm index e1e16ef42b2..36ce34094a0 100644 --- a/code/modules/mob/living/simple_animal/friendly/pug.dm +++ b/code/modules/mob/living/simple_animal/friendly/pug.dm @@ -19,7 +19,7 @@ see_in_dark = 5 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY -/mob/living/simple_animal/pet/pug/process_ai() +/mob/living/simple_animal/pet/pug/Life() ..() if(!resting && !buckled) diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 5139f187494..299677804e2 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -1,11 +1,8 @@ - - /mob/living/simple_animal/hostile/carp name = "space carp" desc = "A ferocious, fang-bearing creature that resembles a fish." + icon = 'icons/mob/carp.dmi' icon_state = "carp" - icon_living = "carp" - icon_dead = "carp_dead" icon_gib = "carp_gib" speak_chance = 0 turns_per_move = 5 @@ -16,7 +13,6 @@ speed = 0 maxHealth = 25 health = 25 - harm_intent_damage = 8 obj_damage = 50 melee_damage_lower = 15 @@ -30,12 +26,27 @@ minbodytemp = 0 maxbodytemp = 1500 - - faction = list("carp") flying = 1 gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE + var/carp_color = "carp" //holder for icon set + var/list/icon_sets = list("carp", "blue", "yellow", "grape", "rust", "teal", "purple") + +/mob/living/simple_animal/hostile/carp/Initialize(mapload) + . = ..() + carp_randomify() + update_icons() + +/mob/living/simple_animal/hostile/carp/proc/carp_randomify() + if(prob(1)) + carp_color = pick("white", "black") + else + carp_color = pick(icon_sets) + icon_state = "[carp_color]" + icon_living = "[carp_color]" + icon_dead = "[carp_color]_dead" + /mob/living/simple_animal/hostile/carp/Process_Spacemove(var/movement_dir = 0) return 1 //No drifting in space for space carp! //original comments do not steal @@ -50,7 +61,6 @@ var/mob/living/carbon/human/H = target H.adjustStaminaLoss(8) - /mob/living/simple_animal/hostile/carp/holocarp icon_state = "holocarp" icon_living = "holocarp" @@ -58,6 +68,8 @@ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID del_on_death = 1 +/mob/living/simple_animal/hostile/carp/holocarp/carp_randomify() + return /mob/living/simple_animal/hostile/carp/megacarp icon = 'icons/mob/alienqueen.dmi' @@ -73,4 +85,7 @@ mob_size = MOB_SIZE_LARGE obj_damage = 80 melee_damage_lower = 20 - melee_damage_upper = 20 \ No newline at end of file + melee_damage_upper = 20 + +/mob/living/simple_animal/hostile/carp/megacarp/carp_randomify() + return diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 50568fb37d0..852d7c406d1 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -30,8 +30,6 @@ var/stat_exclusive = 0 //Mobs with this set to 1 will exclusively attack things defined by stat_attack, stat_attack 2 means they will only attack corpses var/attack_same = 0 //Set us to 1 to allow us to attack our own faction, or 2, to only ever attack our own faction - var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever) - //typecache of things this mob will attack in DestroySurroundings() if it has environment_smash var/list/environment_target_typecache = list( /obj/machinery/door/window, @@ -66,12 +64,6 @@ walk(src, 0) return 0 -/mob/living/simple_animal/hostile/process_ai() - ..() - if(!AICanContinue()) - return 0 - return 1 - /mob/living/simple_animal/hostile/handle_automated_action() if(AIStatus == AI_OFF) return 0 @@ -83,7 +75,7 @@ DestroySurroundings() if(!MoveToTarget(possible_targets)) //if we lose our target if(AIShouldSleep(possible_targets)) // we try to acquire a new one - AIStatus = AI_IDLE // otherwise we go idle + toggle_ai(AI_IDLE) // otherwise we go idle return 1 /mob/living/simple_animal/hostile/attacked_by(obj/item/I, mob/living/user) @@ -264,8 +256,8 @@ if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight search_objects = 0 target = null - if(AIStatus == AI_IDLE) - AIStatus = AI_ON + if(AIStatus != AI_ON && AIStatus != AI_OFF) + toggle_ai(AI_ON) FindTarget() else if(target != null && prob(40))//No more pulling a mob forever and having a second player attack it, it can switch targets now if it finds a more suitable one FindTarget() @@ -401,9 +393,43 @@ if(AI_IDLE) if(FindTarget(possible_targets, 1)) . = 1 - AIStatus = AI_ON //Wake up for more than one Life() cycle. + toggle_ai(AI_ON) //Wake up for more than one Life() cycle. else . = 0 /mob/living/simple_animal/hostile/proc/AIShouldSleep(var/list/possible_targets) return !FindTarget(possible_targets, 1) + +/mob/living/simple_animal/hostile/consider_wakeup() + ..() + var/list/tlist + var/turf/T = get_turf(src) + + if(!T) + return + + if(!length(SSmobs.clients_by_zlevel[T.z])) // It's fine to use .len here but doesn't compile on 511 + toggle_ai(AI_Z_OFF) + return + + var/cheap_search = isturf(T) && !(T.z == 1) // The original check for SSmapping's station z level trait, unfortunately it isn't here. + if(cheap_search) + tlist = ListTargetsLazy(T.z) + else + tlist = ListTargets() + + if(AIStatus == AI_IDLE && FindTarget(tlist, 1)) + if(cheap_search) //Try again with full effort + FindTarget() + toggle_ai(AI_ON) + +/mob/living/simple_animal/hostile/proc/ListTargetsLazy(var/_Z)//Step 1, find out what we can see + var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/spacepod)) + . = list() + for(var/I in SSmobs.clients_by_zlevel[_Z]) + var/mob/M = I + if(get_dist(M, src) < vision_range) + if(isturf(M.loc)) + . += M + else if(M.loc.type in hostile_machines) + . += M.loc \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 81b384f56b7..60b0f7277c8 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -142,7 +142,7 @@ var/pre_attack = 0 loot = list(/obj/item/asteroid/goliath_hide{layer = 4.1}) -/mob/living/simple_animal/hostile/asteroid/goliath/process_ai() +/mob/living/simple_animal/hostile/asteroid/goliath/Life() ..() handle_preattack() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm index 7b10c0e828a..184cb9eacb1 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm @@ -2,9 +2,8 @@ /mob/living/simple_animal/hostile/retaliate/carp name = "sea carp" desc = "A large fish bearing similarities to a certain space-faring menace." + icon = 'icons/mob/carp.dmi' icon_state = "carp" - icon_living = "carp" - icon_dead = "carp_dead" icon_gib = "carp_gib" speak_chance = 0 turns_per_move = 5 @@ -15,20 +14,33 @@ speed = 0 maxHealth = 25 health = 25 - retreat_distance = 6 vision_range = 5 - harm_intent_damage = 8 melee_damage_lower = 15 melee_damage_upper = 15 attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' speak_emote = list("gnashes") - faction = list("carp") flying = 1 + var/carp_color = "carp" //holder for icon set + var/list/icon_sets = list("carp", "blue", "yellow", "grape", "rust", "teal", "purple") + +/mob/living/simple_animal/hostile/retaliate/carp/Initialize(mapload) + . = ..() + carp_randomify() + update_icons() + +/mob/living/simple_animal/hostile/retaliate/carp/proc/carp_randomify() + if(prob(1)) + carp_color = pick("white", "black") + else + carp_color = pick(icon_sets) + icon_state = "[carp_color]" + icon_living = "[carp_color]" + icon_dead = "[carp_color]_dead" /mob/living/simple_animal/hostile/retaliate/carp/koi name = "space koi" @@ -50,18 +62,17 @@ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE -/mob/living/simple_animal/hostile/retaliate/carp/koi/New() - ..() +/mob/living/simple_animal/hostile/retaliate/carp/koi/Initialize(mapload) + . = ..() var/koinum = rand(1, 4) icon_state = "koi[koinum]" icon_living = "koi[koinum]" icon_dead = "koi[koinum]-dead" - /mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(var/movement_dir) return TRUE /mob/living/simple_animal/hostile/retaliate/carp/koi/honk icon_state = "koi5" icon_living = "koi5" - icon_dead = "koi5-dead" \ No newline at end of file + icon_dead = "koi5-dead" diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index b4019cff988..867b0eb5073 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -80,10 +80,14 @@ var/deathmessage = "" var/death_sound = null //The sound played on death + var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever) + var/can_have_ai = TRUE //once we have become sentient, we can never go back + var/shouldwakeup = FALSE //convenience var for forcibly waking up an idling AI on next check. + /mob/living/simple_animal/Initialize() ..() - GLOB.simple_animal_list += src + GLOB.simple_animals[AIStatus] += src verbs -= /mob/verb/observe if(!can_hide) verbs -= /mob/living/simple_animal/verb/hide @@ -97,7 +101,18 @@ collar.forceMove(loc) collar = null master_commander = null - GLOB.simple_animal_list -= src + GLOB.simple_animals[AIStatus] -= src + if(SSnpcpool.state == SS_PAUSED && LAZYLEN(SSnpcpool.currentrun)) + SSnpcpool.currentrun -= src + + if(nest) + nest.spawned_mobs -= src + nest = null + + var/turf/T = get_turf(src) + if (T && AIStatus == AI_Z_OFF) + SSidlenpcpool.idle_mobs_by_zlevel[T.z] -= src + return ..() /mob/living/simple_animal/Login() @@ -111,12 +126,6 @@ health = Clamp(health, 0, maxHealth) med_hud_set_status() - -/mob/living/simple_animal/proc/process_ai() - handle_automated_movement() - handle_automated_action() - handle_automated_speech() - /mob/living/simple_animal/lay_down() ..() handle_resting_state_icons() @@ -562,6 +571,8 @@ /* End Inventory */ /mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion + toggle_ai(AI_OFF) + can_have_ai = FALSE return /mob/living/simple_animal/update_sight() @@ -581,4 +592,37 @@ return /mob/living/simple_animal/can_hear() - . = TRUE \ No newline at end of file + . = TRUE + +/mob/living/simple_animal/proc/consider_wakeup() + if(pulledby || shouldwakeup) + toggle_ai(AI_ON) + +/mob/living/simple_animal/adjustHealth(amount, updating_health = TRUE, forced = FALSE) + . = ..() + if(!ckey && !stat)//Not unconscious + if(AIStatus == AI_IDLE) + toggle_ai(AI_ON) + +/mob/living/simple_animal/proc/toggle_ai(togglestatus) + if(!can_have_ai && (togglestatus != AI_OFF)) + return + if(AIStatus != togglestatus) + if(togglestatus > 0 && togglestatus < 5) + if(togglestatus == AI_Z_OFF || AIStatus == AI_Z_OFF) + var/turf/T = get_turf(src) + if(AIStatus == AI_Z_OFF) + SSidlenpcpool.idle_mobs_by_zlevel[T.z] -= src + else + SSidlenpcpool.idle_mobs_by_zlevel[T.z] += src + GLOB.simple_animals[AIStatus] -= src + GLOB.simple_animals[togglestatus] += src + AIStatus = togglestatus + else + stack_trace("Something attempted to set simple animals AI to an invalid state: [togglestatus]") + +/mob/living/simple_animal/onTransitZ(old_z, new_z) + ..() + if(AIStatus == AI_Z_OFF) + SSidlenpcpool.idle_mobs_by_zlevel[old_z] -= src + toggle_ai(initial(AIStatus)) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm index 7a17dfb202b..686a20cee36 100644 --- a/code/modules/mob/living/simple_animal/spawner.dm +++ b/code/modules/mob/living/simple_animal/spawner.dm @@ -29,7 +29,7 @@ spawned_mobs = null return ..() -/mob/living/simple_animal/hostile/spawner/process_ai() +/mob/living/simple_animal/hostile/spawner/Life() ..() spawn_mob() diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index fc265722f4a..0a1346fd0ed 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -19,10 +19,10 @@ spawn() alert("You have logged in already with another key this round, please log out of this one NOW or risk being banned!") if(matches) if(M.client) - message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) + message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) log_adminwarn("Notice: [key_name(src)] has the same [matches] as [key_name(M)].") else - message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) + message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) log_adminwarn("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).") /mob/Login() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index c2281a1b9a9..d57b2437519 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -903,13 +903,18 @@ var/list/slot_equipment_priority = list( \ /mob/MouseDrop(mob/M as mob) ..() if(M != usr) return - if(isliving(M)) // Ewww + if(isliving(M)) var/mob/living/L = M if(L.mob_size <= MOB_SIZE_SMALL) return // Stops pAI drones and small mobs (borers, parrots, crabs) from stripping people. --DZD - if(!M.can_strip) return - if(usr == src) return - if(!Adjacent(usr)) return + if(!M.can_strip) + return + if(usr == src) + return + if(!Adjacent(usr)) + return + if(isLivingSSD(src) && M.client && M.client.send_ssd_warning(src)) + return show_inv(usr) /mob/proc/can_use_hands() @@ -978,6 +983,7 @@ var/list/slot_equipment_priority = list( \ stat("CPU:", "[world.cpu]") stat("Instances:", "[num2text(world.contents.len, 10)]") GLOB.stat_entry() + stat("Server Time:", time_stamp()) stat(null) if(Master) Master.stat_entry() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 3e9ff0b7ba6..9f539282749 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -196,9 +196,11 @@ var/list/permanent_huds = list() var/list/actions = list() + var/list/datum/action/chameleon_item_actions var/list/progressbars = null //for stacking do_after bars var/list/tkgrabbed_objects = list() // Assoc list of items to TK grabs var/forced_look = null // This can either be a numerical direction or a soft object reference (UID). It makes the mob always face towards the selected thing. + var/registered_z \ No newline at end of file diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index a46b9a94fc7..427bcfcb659 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -193,7 +193,7 @@ close_spawn_windows() var/obj/O = locate("landmark*Observer-Start") to_chat(src, "Now teleporting.") - observer.loc = O.loc + observer.forceMove(O.loc) observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly. client.prefs.update_preview_icon(1) observer.icon = client.prefs.preview_icon @@ -344,27 +344,27 @@ else if(IsSyndicateCommand(rank)) character.loc = pick(syndicateofficer) else - character.loc = pick(aroomwarp) + character.forceMove(pick(aroomwarp)) join_message = "has arrived" else if(spawning_at) S = spawntypes[spawning_at] if(S && istype(S)) if(S.check_job_spawning(rank)) - character.loc = pick(S.turfs) + character.forceMove(pick(S.turfs)) join_message = S.msg else to_chat(character, "Your chosen spawnpoint ([S.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.") - character.loc = pick(latejoin) + character.forceMove(pick(latejoin)) join_message = "has arrived on the station" else - character.loc = pick(latejoin) + character.forceMove(pick(latejoin)) join_message = "has arrived on the station" character.lastarea = get_area(loc) // Moving wheelchair if they have one if(character.buckled && istype(character.buckled, /obj/structure/chair/wheelchair)) - character.buckled.loc = character.loc + character.buckled.forceMove(character.loc) character.buckled.dir = character.dir character = SSjobs.EquipRank(character, rank, 1) //equips the human @@ -464,8 +464,7 @@ dat += " [a.title].
" - dat += "Choose from the following open positions:

" - + var/num_jobs_available = 0 var/list/activePlayers = list() var/list/categorizedJobs = list( "Command" = list(jobs = list(), titles = command_positions, color = "#aac1ee"), @@ -480,6 +479,7 @@ ) for(var/datum/job/job in SSjobs.occupations) if(job && IsJobAvailable(job.title) && !job.barred_by_disability(client)) + num_jobs_available++ activePlayers[job] = 0 var/categorized = 0 // Only players with the job assigned and AFK for less than 10 minutes count as active @@ -502,23 +502,27 @@ if(!categorized) categorizedJobs["Miscellaneous"]["jobs"] += job - dat += "
" - for(var/jobcat in categorizedJobs) - if(categorizedJobs[jobcat]["colBreak"]) - dat += "" - if(length(categorizedJobs[jobcat]["jobs"]) < 1) - continue - var/color = categorizedJobs[jobcat]["color"] - dat += "
" - dat += "[jobcat]" - for(var/datum/job/job in categorizedJobs[jobcat]["jobs"]) - if(job in SSjobs.prioritized_jobs) - dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" - else - dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" - dat += "

" + if(num_jobs_available) + dat += "Choose from the following open positions:

" + dat += "
" + for(var/jobcat in categorizedJobs) + if(categorizedJobs[jobcat]["colBreak"]) + dat += "" + if(length(categorizedJobs[jobcat]["jobs"]) < 1) + continue + var/color = categorizedJobs[jobcat]["color"] + dat += "
" + dat += "[jobcat]" + for(var/datum/job/job in categorizedJobs[jobcat]["jobs"]) + if(job in SSjobs.prioritized_jobs) + dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" + else + dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" + dat += "

" - dat += "
" + dat += "
" + else + dat += "

Unfortunately, there are no job slots free currently.
Wait a few minutes, then try again.
Or, try observing the round.
" // Removing the old window method but leaving it here for reference // src << browse(dat, "window=latechoices;size=300x640;can_close=1") // Added the new browser window method diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm index d43a5f6d00c..0a7955cfe52 100644 --- a/code/modules/modular_computers/computers/item/computer_power.dm +++ b/code/modules/modular_computers/computers/item/computer_power.dm @@ -13,10 +13,10 @@ if(battery_module && battery_module.battery && battery_module.battery.charge) var/obj/item/stock_parts/cell/cell = battery_module.battery - if(cell.use(amount * CELLRATE)) + if(cell.use(amount * GLOB.CELLRATE)) return TRUE else // Discharge the cell anyway. - cell.use(min(amount*CELLRATE, cell.charge)) + cell.use(min(amount*GLOB.CELLRATE, cell.charge)) return FALSE return FALSE diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm index 38a42222c63..81d5fb03823 100644 --- a/code/modules/modular_computers/file_system/programs/command/card.dm +++ b/code/modules/modular_computers/file_system/programs/command/card.dm @@ -137,18 +137,17 @@ return 1 return -1 -/datum/computer_file/program/card_mod/proc/format_jobs(list/jobs) +/datum/computer_file/program/card_mod/proc/format_jobs(list/jobs, targetrank, list/jobformats) var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD] if(!card_slot || !card_slot.stored_card) return null - var/obj/item/card/id/id_card = card_slot.stored_card var/list/formatted = list() for(var/job in jobs) formatted.Add(list(list( "display_name" = replacetext(job, " ", " "), - "target_rank" = id_card && id_card.assignment ? id_card.assignment : "Unassigned", - "job" = job))) - + "target_rank" = targetrank, + "job" = job, + "jlinkformat" = jobformats[job] ? jobformats[job] : null))) return formatted @@ -225,11 +224,12 @@ var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN)) //let custom jobs function as an impromptu alt title, mainly for sechuds if(temp_t && modify) + SSjobs.log_job_transfer(modify.registered_name, modify.getRankAndAssignment(), temp_t, scan.registered_name) modify.assignment = temp_t log_game("[key_name(usr)] has given \"[modify.registered_name]\" the custom job title \"[temp_t]\".") else var/list/access = list() - if(is_centcom) + if(is_centcom && islist(get_centcom_access(t1))) access = get_centcom_access(t1) else var/datum/job/jobdatum @@ -249,6 +249,16 @@ if(t1 == "Civilian") message_admins("[key_name_admin(usr)] has reassigned \"[modify.registered_name]\" from \"[jobnamedata]\" to \"[t1]\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, t1, scan.registered_name) + SSjobs.slot_job_transfer(modify.rank, t1) + + var/mob/living/carbon/human/H = modify.getPlayer() + if(istype(H)) + if(jobban_isbanned(H, t1)) + message_admins("[ADMIN_FULLMONTY(H)] has been assigned the job [t1], in possible violation of their job ban.") + if(H.mind) + H.mind.playtime_role = t1 + modify.access = access modify.assignment = t1 modify.rank = t1 @@ -271,6 +281,18 @@ if("PRG_mode") mode = text2num(href_list["mode_target"]) + if("PRG_wipe_my_logs") + if(is_authenticated(usr) && is_centcom) + var/delcount = SSjobs.delete_log_records(scan.registered_name, FALSE) + if(delcount) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + + if("PRG_wipe_all_logs") + if(is_authenticated(usr)) + var/delcount = SSjobs.delete_log_records(scan.registered_name, TRUE) + if(delcount) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + if("PRG_print") if(!printing && computer) printing = 1 @@ -312,6 +334,7 @@ var/jobnamedata = modify.getRankAndAssignment() log_game("[key_name(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".") message_admins("[key_name_admin(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".") + SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Terminated", scan.registered_name) modify.assignment = "Terminated" modify.access = list() callHook("terminate_employee", list(modify)) @@ -398,6 +421,7 @@ data["target_owner"] = modify && modify.registered_name ? modify.registered_name : "-----" data["target_rank"] = get_target_rank() data["scan_name"] = scan ? scan.name : "-----" + data["scan_owner"] = scan && scan.registered_name ? scan.registered_name : null data["authenticated"] = is_authenticated(user) data["has_modify"] = !!modify data["account_number"] = modify ? modify.associated_account_number : null @@ -405,14 +429,17 @@ data["all_centcom_access"] = null data["regions"] = null - data["engineering_jobs"] = format_jobs(engineering_positions) - data["medical_jobs"] = format_jobs(medical_positions) - data["science_jobs"] = format_jobs(science_positions) - data["security_jobs"] = format_jobs(security_positions) - data["support_jobs"] = format_jobs(support_positions) - data["civilian_jobs"] = format_jobs(civilian_positions) - data["special_jobs"] = format_jobs(whitelisted_positions) - data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) + var/list/job_formats = SSjobs.format_jobs_for_id_computer(modify) + + data["top_jobs"] = format_jobs(list("Captain", "Custom"), data["target_rank"], job_formats) + data["engineering_jobs"] = format_jobs(engineering_positions, data["target_rank"], job_formats) + data["medical_jobs"] = format_jobs(medical_positions, data["target_rank"], job_formats) + data["science_jobs"] = format_jobs(science_positions, data["target_rank"], job_formats) + data["security_jobs"] = format_jobs(security_positions, data["target_rank"], job_formats) + data["support_jobs"] = format_jobs(support_positions, data["target_rank"], job_formats) + data["civilian_jobs"] = format_jobs(civilian_positions, data["target_rank"], job_formats) + data["special_jobs"] = format_jobs(whitelisted_positions, data["target_rank"], job_formats) + data["centcom_jobs"] = format_jobs(get_all_centcom_jobs(), data["target_rank"], job_formats) data["card_skins"] = format_card_skins(get_station_card_skins()) data["job_slots"] = format_job_slots() @@ -423,6 +450,9 @@ data["cooldown_mins"] = mins data["cooldown_secs"] = (seconds < 10) ? "0[seconds]" : seconds + if(mode == 3 && is_authenticated(user)) + data["id_change_html"] = SSjobs.fetch_transfer_record_html(is_centcom) + if(modify) data["current_skin"] = modify.icon_state diff --git a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm index 2efe872a7f5..783ae9fa947 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/power_monitor.dm @@ -39,7 +39,7 @@ data["powermonitor"] = attached ? TRUE : FALSE if(attached) - var/datum/powernet/powernet = attached.get_powernet() + var/datum/powernet/powernet = attached.powernet data["poweravail"] = powernet.avail data["powerload"] = powernet.viewload data["powerdemand"] = powernet.load diff --git a/code/modules/modular_computers/hardware/recharger.dm b/code/modules/modular_computers/hardware/recharger.dm index 688d689cf67..418a9736528 100644 --- a/code/modules/modular_computers/hardware/recharger.dm +++ b/code/modules/modular_computers/hardware/recharger.dm @@ -20,7 +20,7 @@ return if(use_power(charge_rate, charging=1)) - holder.give_power(charge_rate * CELLRATE) + holder.give_power(charge_rate * GLOB.CELLRATE) /obj/item/computer_hardware/recharger/APC diff --git a/code/modules/ninja/suit/mask.dm b/code/modules/ninja/suit/mask.dm index 910ccbc953c..bfc87e0104c 100644 --- a/code/modules/ninja/suit/mask.dm +++ b/code/modules/ninja/suit/mask.dm @@ -6,7 +6,7 @@ Contents: */ -/obj/item/clothing/mask/gas/voice/space_ninja +/obj/item/clothing/mask/gas/space_ninja name = "ninja mask" desc = "A close-fitting mask that acts both as an air filter and a post-modern fashion statement." icon_state = "s-ninja(norm)" @@ -19,3 +19,13 @@ Contents: "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) + + var/obj/item/voice_changer/voice_changer + +/obj/item/clothing/mask/gas/space_ninja/Initialize(mapload) + . = ..() + voice_changer = new(src) + +/obj/item/clothing/mask/gas/space_ninja/Destroy() + QDEL_NULL(voice_changer) + return ..() \ No newline at end of file diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index f03a08d237a..dfd430a5754 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -24,7 +24,7 @@ Contents: var/obj/item/clothing/head/helmet/space/space_ninja/suitHood var/obj/item/clothing/gloves/space_ninja/suitGloves var/obj/item/clothing/shoes/space_ninja/suitShoes - var/obj/item/clothing/mask/gas/voice/space_ninja/suitMask + var/obj/item/clothing/mask/gas/space_ninja/suitMask var/mob/living/carbon/human/suitOccupant /obj/item/clothing/suit/space/space_ninja/proc/toggle_suit_lock(mob/living/carbon/human/user) @@ -41,7 +41,7 @@ Contents: if(!istype(user.shoes, /obj/item/clothing/shoes/space_ninja)) to_chat(user, "ERROR: Unable to locate foot gear.\nABORTING...") return 0 - if(!istype(user.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)) + if(!istype(user.wear_mask, /obj/item/clothing/mask/gas/space_ninja)) to_chat(user, "ERROR: Unable to locate mask.\nABORTING...") return 0 diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index e1ae7da26f5..dc16101eac7 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -131,13 +131,13 @@ obj/item/clipboard/proc/penPlacement(mob/user, obj/item/pen/P, placing) else penPlacement(usr, containedpen, FALSE) else if(href_list["remove"]) - var/obj/item/P = locate(href_list["remove"]) + var/obj/item/P = locate(href_list["remove"]) in src if(isPaperwork(P)) usr.put_in_hands(P) to_chat(usr, "You remove [P] from [src].") checkTopPaper() //So we don't accidentally make the top sheet not be on the clipboard else if(href_list["viewOrWrite"]) - var/obj/item/P = locate(href_list["viewOrWrite"]) + var/obj/item/P = locate(href_list["viewOrWrite"]) in src if(!isPaperwork(P)) return if(is_pen(I) && isPaperwork(P) != PHOTO) //Because you can't write on photos that aren't in your hand @@ -148,7 +148,7 @@ obj/item/clipboard/proc/penPlacement(mob/user, obj/item/pen/P, placing) var/obj/item/photo/Ph = P Ph.show(usr) else if(href_list["topPaper"]) - var/obj/item/P = locate(href_list["topPaper"]) + var/obj/item/P = locate(href_list["topPaper"]) in src if(P == toppaper) return to_chat(usr, "You flick the pages so that [P] is on top.") diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index af28e221eb8..de3f2ad52d6 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -325,9 +325,10 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s to_chat(user, "[pictures_left] photos left.") icon_state = icon_off on = 0 - if(user.mind && !(user.mind.assigned_role == "Chaplain")) - if(prob(24)) - handle_haunt(user) + if(istype(src,/obj/item/camera/spooky)) + if(user.mind && user.mind.assigned_role == "Chaplain" && see_ghosts) + if(prob(24)) + handle_haunt(user) spawn(64) icon_state = icon_on on = 1 diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 8e78f0ce230..8c24cc55c9d 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -92,27 +92,3 @@ icon_state = "stamp-syndicate" item_color = "syndicate" -// Syndicate stamp to forge documents. - -/obj/item/stamp/chameleon/attack_self(mob/user as mob) - - var/list/stamp_types = typesof(/obj/item/stamp) - src.type // Get all stamp types except our own - var/list/stamps = list() - - // Generate them into a list - for(var/stamp_type in stamp_types) - var/obj/item/stamp/S = new stamp_type - stamps[capitalize(S.name)] = S - - var/list/show_stamps = list("EXIT" = null) + sortList(stamps) // the list that will be shown to the user to pick from - - var/input_stamp = input(user, "Choose a stamp to disguise as.", "Choose a stamp.") in show_stamps - - if(user && src in user.contents) - - var/obj/item/stamp/chosen_stamp = stamps[capitalize(input_stamp)] - - if(chosen_stamp) - name = chosen_stamp.name - icon_state = chosen_stamp.icon_state - item_color = chosen_stamp.item_color diff --git a/code/modules/pda/cart_apps.dm b/code/modules/pda/cart_apps.dm index de2414da743..a66e72d17a3 100644 --- a/code/modules/pda/cart_apps.dm +++ b/code/modules/pda/cart_apps.dm @@ -392,7 +392,7 @@ BucketData[++BucketData.len] = list("x" = 0, "y" = 0, dir=null, status = null) var/CbotData[0] - for(var/mob/living/simple_animal/bot/cleanbot/B in GLOB.simple_animal_list) + for(var/mob/living/simple_animal/bot/cleanbot/B in GLOB.simple_animals) var/turf/bl = get_turf(B) if(bl) if(bl.z != cl.z) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index c7adce7f533..a3186b115a4 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -46,7 +46,6 @@ name = "area power controller" desc = "A control terminal for the area electrical systems." icon_state = "apc0" - anchored = 1 use_power = NO_POWER_USE req_access = list(access_engine_equip) siemens_strength = 1 @@ -55,7 +54,7 @@ var/areastring = null var/obj/item/stock_parts/cell/cell var/start_charge = 90 // initial cell charge % - var/cell_type = 2500 + var/cell_type = 2500 //Base cell has 2500 capacity. Enter the path of a different cell you want to use. cell determines charge rates, max capacity, ect. These can also be changed with other APC vars, but isn't recommended to minimize the risk of accidental usage of dirty editted APCs var/opened = 0 //0=closed, 1=opened, 2=cover removed var/shorted = 0 var/lighting = 3 @@ -137,40 +136,35 @@ /obj/machinery/power/apc/connect_to_network() //Override because the APC does not directly connect to the network; it goes through a terminal. //The terminal is what the power computer looks for anyway. - if(!terminal) - make_terminal() if(terminal) terminal.connect_to_network() -/obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0) +/obj/machinery/power/apc/New(turf/loc, ndir, building = 0) if(!armor) armor = list(melee = 20, bullet = 20, laser = 10, energy = 100, bomb = 30, bio = 100, rad = 100) ..() GLOB.apcs += src GLOB.apcs = sortAtom(GLOB.apcs) - wires = new(src) + wires = new(src) // offset 24 pixels in direction of dir // this allows the APC to be embedded in a wall, yet still inside an area if(building) - dir = ndir - src.tdir = dir // to fix Vars bug - dir = SOUTH + setDir(ndir) + tdir = dir // to fix Vars bug + setDir(SOUTH) pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -24) pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 24 : -24) : 0 - if(building==0) - init() - else + if(building) area = get_area(src) area.apc |= src opened = 1 operating = 0 name = "[area.name] APC" stat |= MAINT - src.update_icon() - spawn(5) - src.update() + update_icon() + addtimer(CALLBACK(src, .proc/update), 5) /obj/machinery/power/apc/Destroy() GLOB.apcs -= src @@ -193,14 +187,17 @@ // create a terminal object at the same position as original turf loc // wires will attach to this terminal = new/obj/machinery/power/terminal(src.loc) - terminal.dir = tdir + terminal.setDir(tdir) terminal.master = src -/obj/machinery/power/apc/proc/init() +/obj/machinery/power/apc/Initialize(mapload) + . = ..() + if(!mapload) + return has_electronics = 2 //installed and secured // is starting with a power cell installed, create it and set its charge level if(cell_type) - src.cell = new/obj/item/stock_parts/cell(src) + cell = new/obj/item/stock_parts/cell(src) cell.maxcharge = cell_type // cell_type is maximum charge (old default was 1000 or 2500 (values one and two respectively) cell.charge = start_charge * cell.maxcharge / 100 // (convert percentage to actual value) @@ -219,12 +216,12 @@ area = get_area_name(areastring) name = "\improper [area.name] APC" area.apc |= src + update_icon() make_terminal() - spawn(5) - src.update() + addtimer(CALLBACK(src, .proc/update), 5) /obj/machinery/power/apc/examine(mob/user) if(..(user, 1)) @@ -1084,14 +1081,9 @@ else return 0 -//Returns 1 if the APC should attempt to charge -/obj/machinery/power/apc/proc/attempt_charging() - return (chargemode && charging == 1 && operating) - -/obj/machinery/power/apc/draw_power(var/amount) +/obj/machinery/power/apc/add_load(amount) if(terminal && terminal.powernet) - return terminal.powernet.draw_power(amount) - return 0 + terminal.add_load(amount) /obj/machinery/power/apc/avail() if(terminal) @@ -1100,7 +1092,6 @@ return 0 /obj/machinery/power/apc/process() - if(stat & (BROKEN|MAINT)) return if(!area.requires_power) @@ -1136,18 +1127,21 @@ if(cell && !shorted) // draw power from cell as before to power the area - var/cellused = min(cell.charge, CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell + var/cellused = min(cell.charge, GLOB.CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell cell.use(cellused) if(excess > lastused_total) // if power excess recharge the cell // by the same amount just used - var/draw = draw_power(cellused/CELLRATE) // draw the power needed to charge this cell - cell.give(draw * CELLRATE) + cell.give(cellused) + add_load(cellused/GLOB.CELLRATE) // add the load used to recharge the cell + + else // no excess, and not enough per-apc - if( (cell.charge/CELLRATE + excess) >= lastused_total) // can we draw enough from cell+grid to cover last usage? - var/draw = draw_power(excess) - cell.charge = min(cell.maxcharge, cell.charge + CELLRATE * draw) //recharge with what we can + if((cell.charge/GLOB.CELLRATE + excess) >= lastused_total) // can we draw enough from cell+grid to cover last usage? + cell.charge = min(cell.maxcharge, cell.charge + GLOB.CELLRATE * excess) //recharge with what we can + add_load(excess) // so draw what we can from the grid charging = 0 + else // not enough power available to run the last tick! charging = 0 chargecount = 0 @@ -1200,14 +1194,12 @@ autoflag = 0 // now trickle-charge the cell - - if(src.attempt_charging()) + if(chargemode && charging == 1 && operating) if(excess > 0) // check to make sure we have enough to charge // Max charge is capped to % per second constant - var/ch = min(excess*CELLRATE, cell.maxcharge*CHARGELEVEL) - - ch = draw_power(ch/CELLRATE) // Removes the power we're taking from the grid - cell.give(ch*CELLRATE) // actually recharge the cell + var/ch = min(excess*GLOB.CELLRATE, cell.maxcharge*GLOB.CHARGELEVEL) + add_load(ch/GLOB.CELLRATE) // Removes the power we're taking from the grid + cell.give(ch) // actually recharge the cell else charging = 0 // stop charging @@ -1220,12 +1212,12 @@ if(chargemode) if(!charging) - if(excess > cell.maxcharge*CHARGELEVEL) + if(excess > cell.maxcharge*GLOB.CHARGELEVEL) chargecount++ else chargecount = 0 - if(chargecount >= 10) + if(chargecount == 10) chargecount = 0 charging = 1 @@ -1292,9 +1284,13 @@ lighting = 0 equipment = 0 environ = 0 + update_icon() + update() spawn(600) equipment = 3 environ = 3 + update_icon() + update() ..() /obj/machinery/power/apc/ex_act(severity) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index c71bc3e7c8c..5cf1d5efbe3 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -59,21 +59,18 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/white color = COLOR_WHITE -/obj/structure/cable/New() - ..() - +/obj/structure/cable/Initialize(mapload) + . = ..() // ensure d1 & d2 reflect the icon_state for entering and exiting cable var/dash = findtext(icon_state, "-") + d1 = text2num(copytext( icon_state, 1, dash )) + d2 = text2num(copytext( icon_state, dash+1 )) - d1 = text2num( copytext( icon_state, 1, dash ) ) - - d2 = text2num( copytext( icon_state, dash+1 ) ) - - var/turf/T = src.loc // hide if turf is not intact - - if(level==1) hide(T.intact) + var/turf/T = get_turf(src) // hide if turf is not intact + if(level == 1) + hide(T.intact) LAZYADD(GLOB.cable_list, src) //add it to the global cable list @@ -83,14 +80,23 @@ By design, d1 is the smallest direction and d2 is the highest LAZYREMOVE(GLOB.cable_list, src) //remove it from global cable list return ..() // then go ahead and delete the cable + +/obj/structure/cable/deconstruct(disassembled = TRUE) + var/turf/T = get_turf(src) + if(d1) // 0-X cables are 1 unit, X-X cables are 2 units long + new/obj/item/stack/cable_coil(T, 2, paramcolor = color) + else + new/obj/item/stack/cable_coil(T, 1, paramcolor = color) + qdel(src) + /////////////////////////////////// // General procedures /////////////////////////////////// //If underfloor, hide the cable -/obj/structure/cable/hide(var/i) +/obj/structure/cable/hide(i) - if(level == 1 && istype(loc, /turf)) + if(level == 1 && isturf(loc)) invisibility = i ? 101 : 0 updateicon() @@ -101,9 +107,49 @@ By design, d1 is the smallest direction and d2 is the highest icon_state = "[d1]-[d2]" -// returns the powernet this cable belongs to -/obj/structure/cable/proc/get_powernet() //TODO: remove this as it is obsolete - return powernet +//////////////////////////////////////////// +// Power related +/////////////////////////////////////////// + +// All power generation handled in add_avail() +// Machines should use add_load(), surplus(), avail() +// Non-machines should use add_delayedload(), delayed_surplus(), newavail() + +/obj/structure/cable/proc/add_avail(amount) + if(powernet) + powernet.newavail += amount + +/obj/structure/cable/proc/add_load(amount) + if(powernet) + powernet.load += amount + +/obj/structure/cable/proc/surplus() + if(powernet) + return Clamp(powernet.avail-powernet.load, 0, powernet.avail) + else + return 0 + +/obj/structure/cable/proc/avail() + if(powernet) + return powernet.avail + else + return 0 + +/obj/structure/cable/proc/add_delayedload(amount) + if(powernet) + powernet.delayedload += amount + +/obj/structure/cable/proc/delayed_surplus() + if(powernet) + return Clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail) + else + return 0 + +/obj/structure/cable/proc/newavail() + if(powernet) + return powernet.newavail + else + return 0 //Telekinesis has no effect on a cable /obj/structure/cable/attack_tk(mob/user) @@ -120,47 +166,19 @@ By design, d1 is the smallest direction and d2 is the highest if(T.intact) return - if(istype(W, /obj/item/wirecutters)) -///// Z-Level Stuff - /* if(src.d1 == 12 || src.d2 == 12) - to_chat(user, "You must cut this cable from above.") - return */ -///// Z-Level Stuff - /* if(breaker_box) - to_chat(user, "This cable is connected to nearby breaker box. Use breaker box to interact with it.") - return */ - + if(iswirecutter(W)) if(shock(user, 50)) return - - if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long - new/obj/item/stack/cable_coil(T, 2, paramcolor = color) - else - new/obj/item/stack/cable_coil(T, 1, paramcolor = color) - - for(var/mob/O in viewers(src, null)) - O.show_message("[user] cuts the cable.", 1) - -///// Z-Level Stuff - /*if(src.d1 == 11 || src.d2 == 11) - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.down) - var/turf/below = locate(src.x, src.y, controller.down_target) - for(var/obj/structure/cable/c in below) - if(c.d1 == 12 || c.d2 == 12) - c.qdel()*/ -///// Z-Level Stuff + user.visible_message("[user] cuts the cable.", "You cut the cable.") investigate_log("was cut by [key_name(usr, 1)] in [get_area(user)]([T.x], [T.y], [T.z] - [ADMIN_JMP(T)])","wires") - - qdel(src) // qdel + deconstruct() return else if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = W if(coil.get_amount() < 1) - to_chat(user, "Not enough cable") + to_chat(user, "Not enough cable!") return coil.cable_join(src, user) @@ -173,11 +191,9 @@ By design, d1 is the smallest direction and d2 is the highest else if(istype(W, /obj/item/multitool)) if(powernet && (powernet.avail > 0)) // is it powered? - to_chat(user, "[powernet.avail]W in power network.") - + to_chat(user, "Total power: [DisplayPower(powernet.avail)]\nLoad: [DisplayPower(powernet.load)]\nExcess power: [DisplayPower(surplus())]") else - to_chat(user, "The cable is not powered.") - + to_chat(user, "The cable is not powered.") shock(user, 5, 0.2) else if(istype(W, /obj/item/toy/crayon)) @@ -188,7 +204,7 @@ By design, d1 is the smallest direction and d2 is the highest if(W.flags & CONDUCT) shock(user, 50, 0.7) - src.add_fingerprint(user) + add_fingerprint(user) // shock the user with probability prb /obj/structure/cable/proc/shock(mob/user, prb, siemens_coeff = 1) @@ -200,21 +216,22 @@ By design, d1 is the smallest direction and d2 is the highest else return FALSE +/obj/structure/cable/singularity_pull(S, current_size) + ..() + if(current_size >= STAGE_FIVE) + deconstruct() + //explosion handling /obj/structure/cable/ex_act(severity) switch(severity) - if(1.0) + if(1) qdel(src) // qdel - if(2.0) + if(2) if(prob(50)) - new/obj/item/stack/cable_coil(get_turf(src), src.d1 ? 2 : 1, paramcolor = color) - qdel(src) // qdel - - if(3.0) + deconstruct() + if(3) if(prob(25)) - new/obj/item/stack/cable_coil(get_turf(src), src.d1 ? 2 : 1, paramcolor = color) - qdel(src) // qdel - return + deconstruct() obj/structure/cable/proc/cable_color(var/colorC) if(colorC) @@ -235,7 +252,7 @@ obj/structure/cable/proc/cable_color(var/colorC) //handles merging diagonally matching cables //for info : direction^3 is flipping horizontally, direction^12 is flipping vertically -/obj/structure/cable/proc/mergeDiagonalsNetworks(var/direction) +/obj/structure/cable/proc/mergeDiagonalsNetworks(direction) //search for and merge diagonally matching cables from the first direction component (north/south) var/turf/T = get_step(src, direction&3)//go north/south @@ -279,7 +296,7 @@ obj/structure/cable/proc/cable_color(var/colorC) C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet // merge with the powernets of power objects in the given direction -/obj/structure/cable/proc/mergeConnectedNetworks(var/direction) +/obj/structure/cable/proc/mergeConnectedNetworks(direction) var/fdir = (!direction)? 0 : turn(direction, 180) //flip the direction, to match with the source position on its turf @@ -317,25 +334,27 @@ obj/structure/cable/proc/cable_color(var/colorC) //first let's add turf cables to our powernet //then we'll connect machines on turf with a node cable is present for(var/AM in loc) - if(istype(AM,/obj/structure/cable)) + if(istype(AM, /obj/structure/cable)) var/obj/structure/cable/C = AM if(C.d1 == d1 || C.d2 == d1 || C.d1 == d2 || C.d2 == d2) //only connected if they have a common direction - if(C.powernet == powernet) continue + if(C.powernet == powernet) + continue if(C.powernet) merge_powernets(powernet, C.powernet) else powernet.add_cable(C) //the cable was powernetless, let's just add it to our powernet - else if(istype(AM,/obj/machinery/power/apc)) + else if(istype(AM, /obj/machinery/power/apc)) var/obj/machinery/power/apc/N = AM - if(!N.terminal) continue // APC are connected through their terminal + if(!N.terminal) + continue // APC are connected through their terminal if(N.terminal.powernet == powernet) continue to_connect += N.terminal //we'll connect the machines after all cables are merged - else if(istype(AM,/obj/machinery/power)) //other power machines + else if(istype(AM, /obj/machinery/power)) //other power machines var/obj/machinery/power/M = AM if(M.powernet == powernet) @@ -353,23 +372,10 @@ obj/structure/cable/proc/cable_color(var/colorC) ////////////////////////////////////////////// //if powernetless_only = 1, will only get connections without powernet -/obj/structure/cable/proc/get_connections(var/powernetless_only = 0) +/obj/structure/cable/proc/get_connections(powernetless_only = 0) . = list() // this will be a list of all connected power objects var/turf/T -///// Z-Level Stuff - /* if(d1 == 11 || d1 == 12) - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up && d1 == 12) - T = locate(src.x, src.y, controller.up_target) - if(T) - . += power_list(T, src, 11, 1) - if(controller.down && d1 == 11) - T = locate(src.x, src.y, controller.down_target) - if(T) - . += power_list(T, src, 12, 1) */ -///// Z-Level Stuff //get matching cables from the first direction if(d1) //if not a node cable T = get_step(src, d1) @@ -386,20 +392,6 @@ obj/structure/cable/proc/cable_color(var/colorC) . += power_list(loc, src, d1, powernetless_only) //get on turf matching cables -///// Z-Level Stuff - /*if(d2 == 11 || d2 == 12) - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up && d2 == 12) - T = locate(src.x, src.y, controller.up_target) - if(T) - . += power_list(T, src, 11, 1) - if(controller.down && d2 == 11) - T = locate(src.x, src.y, controller.down_target) - if(T) - . += power_list(T, src, 12, 1) -///// Z-Level Stuff - else */ //do the same on the second direction (which can't be 0) T = get_step(src, d2) if(T) @@ -420,7 +412,8 @@ obj/structure/cable/proc/cable_color(var/colorC) //needed as this can, unlike other placements, disconnect cables /obj/structure/cable/proc/denode() var/turf/T1 = loc - if(!T1) return + if(!T1) + return var/list/powerlist = power_list(T1,src,0,0) //find the other cables that ended in the centre of the turf, with or without a powernet if(powerlist.len>0) @@ -428,13 +421,19 @@ obj/structure/cable/proc/cable_color(var/colorC) propagate_network(powerlist[1],PN) //propagates the new powernet beginning at the source cable if(PN.is_empty()) //can happen with machines made nodeless when smoothing cables - qdel(PN) // qdel + qdel(PN) + +/obj/structure/cable/proc/auto_propogate_cut_cable(obj/O) + if(O && !QDELETED(O)) + var/datum/powernet/newPN = new()// creates a new powernet... + propagate_network(O, newPN)//... and propagates it to the other side of the cable // cut the cable's powernet at this cable and updates the powergrid -/obj/structure/cable/proc/cut_cable_from_powernet() +/obj/structure/cable/proc/cut_cable_from_powernet(remove=TRUE) var/turf/T1 = loc var/list/P_list - if(!T1) return + if(!T1) + return if(d1) T1 = get_step(T1, d1) P_list = power_list(T1, src, turn(d1,180),0,cable_only = 1) // what adjacently joins on to cut cable... @@ -452,11 +451,13 @@ obj/structure/cable/proc/cable_color(var/colorC) var/obj/O = P_list[1] // remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist - loc = null + if(remove) + loc = null powernet.remove_cable(src) //remove the cut cable from its powernet // queue it to rebuild SSmachines.deferred_powernet_rebuilds += O +// addtimer(CALLBACK(O, .proc/auto_propogate_cut_cable, O), 0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables // Disconnect machines connected to nodes if(d1 == 0) // if we cut a node (O-X) cable @@ -464,6 +465,7 @@ obj/structure/cable/proc/cable_color(var/colorC) if(!P.connect_to_network()) //can't find a node cable on a the turf to connect to P.disconnect_from_network() //remove from current network + /////////////////////////////////////////////// // The cable coil object, used for laying cable /////////////////////////////////////////////// @@ -472,9 +474,7 @@ obj/structure/cable/proc/cable_color(var/colorC) // Definitions //////////////////////////////// -var/global/list/datum/stack_recipe/cable_coil_recipes = list( - new /datum/stack_recipe/cable_restraints("cable restraints", /obj/item/restraints/handcuffs/cable, 15), -) +GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restraints", /obj/item/restraints/handcuffs/cable, 15))) /obj/item/stack/cable_coil name = "cable coil" @@ -514,7 +514,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( pixel_x = rand(-2,2) pixel_y = rand(-2,2) update_icon() - recipes = cable_coil_recipes + recipes = GLOB.cable_coil_recipes update_wclass() /////////////////////////////////// @@ -657,7 +657,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( to_chat(user, "You can't lay cable at a place that far away!") return - var/dirn = null + var/dirn if(!dirnew) //If we weren't given a direction, come up with one! (Called as null from catwalk.dm and floor.dm) if(user.loc == T) dirn = user.dir //If laying on the tile we're on, lay in the direction we're facing @@ -694,7 +694,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( if(C.shock(user, 50)) if(prob(50)) //fail new /obj/item/stack/cable_coil(get_turf(C), 1, paramcolor = C.color) - qdel(C) // qdel + C.deconstruct() return C @@ -711,7 +711,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( return if(get_dist(C, user) > 1) // make sure it's close enough - to_chat(user, "You can't lay cable at a place that far away.") + to_chat(user, "You can't lay cable at a place that far away!") return @@ -724,13 +724,41 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( // one end of the clicked cable is pointing towards us if(C.d1 == dirn || C.d2 == dirn) if(U.intact) // can't place a cable if the floor is complete - to_chat(user, "You can't lay cable there unless the floor tiles are removed.") + to_chat(user, "You can't lay cable there unless the floor tiles are removed!") return else // cable is pointing at us, we're standing on an open tile // so create a stub pointing at the clicked cable on our tile - place_turf(U, user, turn(dirn, 180)) + var/fdirn = turn(dirn, 180) // the opposite direction + + for(var/obj/structure/cable/LC in U) // check to make sure there's not a cable there already + if(LC.d1 == fdirn || LC.d2 == fdirn) + to_chat(user, "There's already a cable at that position!") + return + + var/obj/structure/cable/NC = get_new_cable (U) + + NC.d1 = 0 + NC.d2 = fdirn + NC.add_fingerprint(user) + NC.update_icon() + + //create a new powernet with the cable, if needed it will be merged later + var/datum/powernet/newPN = new() + newPN.add_cable(NC) + + NC.mergeConnectedNetworks(NC.d2) //merge the powernet with adjacents powernets + NC.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets + + if(NC.d2 & (NC.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions + NC.mergeDiagonalsNetworks(NC.d2) + + use(1) + + if(NC.shock(user, 50)) + if(prob(50)) //fail + NC.deconstruct() return // exisiting cable doesn't point at our position, so see if it's a stub @@ -749,7 +777,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( if(LC == C) // skip the cable we're interacting with continue if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction - to_chat(user, "There's already a cable at that position.") + to_chat(user, "There's already a cable at that position!") return @@ -776,8 +804,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( if(C.shock(user, 50)) if(prob(50)) //fail - new/obj/item/stack/cable_coil(get_turf(C), 2, paramcolor = C.color) - qdel(C) // qdel + C.deconstruct() return C.denode()// this call may have disconnected some cables that terminated on the centre of the turf, if so split the powernets. @@ -790,8 +817,8 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( /obj/item/stack/cable_coil/cut item_state = "coil2" -/obj/item/stack/cable_coil/cut/New(loc) - ..() +/obj/item/stack/cable_coil/cut/Initialize(mapload) + . = ..() src.amount = rand(1,2) pixel_x = rand(-2,2) pixel_y = rand(-2,2) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 33b632df413..388b523518b 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -85,8 +85,8 @@ var/const/GRAV_NEEDS_WRENCH = 3 // Generator which spawns with the station. // -/obj/machinery/gravity_generator/main/station/Initialize() - ..() +/obj/machinery/gravity_generator/main/station/Initialize(mapload) + . = ..() setup_parts() middle.overlays += "activated" update_list() diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 3e5d614896e..33741d1475b 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -9,7 +9,7 @@ /obj/machinery/power name = null icon = 'icons/obj/power.dmi' - anchored = 1.0 + anchored = TRUE on_blueprints = TRUE var/datum/powernet/powernet = null use_power = NO_POWER_USE @@ -25,18 +25,24 @@ ////////////////////////////// // common helper procs for all power machines -/obj/machinery/power/proc/add_avail(var/amount) +// All power generation handled in add_avail() +// Machines should use add_load(), surplus(), avail() +// Non-machines should use add_delayedload(), delayed_surplus(), newavail() + +/obj/machinery/power/proc/add_avail(amount) if(powernet) powernet.newavail += amount + return TRUE + else + return FALSE -/obj/machinery/power/proc/draw_power(var/amount) +/obj/machinery/power/proc/add_load(amount) if(powernet) - return powernet.draw_power(amount) - return 0 + powernet.load += amount /obj/machinery/power/proc/surplus() if(powernet) - return powernet.avail-powernet.load + return Clamp(powernet.avail-powernet.load, 0, powernet.avail) else return 0 @@ -46,9 +52,19 @@ else return 0 -/obj/machinery/power/proc/load() +/obj/machinery/power/proc/add_delayedload(amount) if(powernet) - return powernet.load + powernet.delayedload += amount + +/obj/machinery/power/proc/delayed_surplus() + if(powernet) + return Clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail) + else + return 0 + +/obj/machinery/power/proc/newavail() + if(powernet) + return powernet.newavail else return 0 @@ -58,21 +74,20 @@ // returns true if the area has power on given channel (or doesn't require power). // defaults to power_channel /obj/machinery/proc/powered(var/chan = -1) // defaults to power_channel - if(!loc) - return 0 + return FALSE if(!use_power) - return 1 + return TRUE var/area/A = get_area(src) // make sure it's in an area if(!A) - return 0 // if not, then not powered + return FALSE // if not, then not powered if(chan == -1) chan = power_channel return A.powered(chan) // return power status of the area // increment the power usage stats for an area -/obj/machinery/proc/use_power(var/amount, var/chan = -1) // defaults to power_channel +/obj/machinery/proc/use_power(amount, chan = -1) // defaults to power_channel var/area/A = get_area(src) // make sure it's in an area if(!A) return @@ -103,43 +118,36 @@ /obj/machinery/power/proc/connect_to_network() var/turf/T = src.loc if(!T || !istype(T)) - return 0 + return FALSE var/obj/structure/cable/C = T.get_cable_node() //check if we have a node cable on the machine turf, the first found is picked if(!C || !C.powernet) - return 0 + return FALSE C.powernet.add_machine(src) - return 1 + return TRUE // remove and disconnect the machine from its current powernet /obj/machinery/power/proc/disconnect_from_network() if(!powernet) - return 0 + return FALSE powernet.remove_machine(src) - return 1 + return TRUE // attach a wire to a power machine - leads from the turf you are standing on //almost never called, overwritten by all power machines but terminal and generator -/obj/machinery/power/attackby(obj/item/W, mob/user) - - if(istype(W, /obj/item/stack/cable_coil)) - - var/obj/item/stack/cable_coil/coil = W - +/obj/machinery/power/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/coil = I var/turf/T = user.loc - - if(T.intact || !istype(T, /turf/simulated/floor)) + if(T.intact || !isfloorturf(T)) return - if(get_dist(src, user) > 1) return - coil.place_turf(T, user) - return else - ..() - return + return ..() + /////////////////////////////////////////// // Powernet handling helpers @@ -159,7 +167,8 @@ cdir = get_dir(T,loc) for(var/obj/structure/cable/C in T) - if(C.powernet) continue + if(C.powernet) + continue if(C.d1 == cdir || C.d2 == cdir) . += C return . @@ -186,7 +195,8 @@ /obj/machinery/power/proc/get_indirect_connections() . = list() for(var/obj/structure/cable/C in loc) - if(C.powernet) continue + if(C.powernet) + continue if(C.d1 == 0) // the cable is a node cable . += C return . @@ -199,44 +209,32 @@ // returns a list of all power-related objects (nodes, cable, junctions) in turf, // excluding source, that match the direction d // if unmarked==1, only return those with no powernet -/proc/power_list(var/turf/T, var/source, var/d, var/unmarked=0, var/cable_only = 0) +/proc/power_list(turf/T, source, d, unmarked=0, cable_only = 0) . = list() - var/fdir = (!d)? 0 : turn(d, 180) // the opposite direction to d (or 0 if d==0) -///// Z-Level Stuff - var/Zdir - if(d==11) - Zdir = 11 - else if(d==12) - Zdir = 12 - else - Zdir = 999 -///// Z-Level Stuff - for(var/AM in T) - if(AM == source) continue //we don't want to return source - if(!cable_only && istype(AM,/obj/machinery/power)) + for(var/AM in T) + if(AM == source) + continue //we don't want to return source + + if(!cable_only && istype(AM, /obj/machinery/power)) var/obj/machinery/power/P = AM - if(P.powernet == 0) continue // exclude APCs which have powernet=0 + if(P.powernet == 0) + continue // exclude APCs which have powernet=0 if(!unmarked || !P.powernet) //if unmarked=1 we only return things with no powernet if(d == 0) . += P - else if(istype(AM,/obj/structure/cable)) + else if(istype(AM, /obj/structure/cable)) var/obj/structure/cable/C = AM if(!unmarked || !C.powernet) -///// Z-Level Stuff - if(C.d1 == fdir || C.d2 == fdir || C.d1 == Zdir || C.d2 == Zdir) -///// Z-Level Stuff - . += C - else if(C.d1 == d || C.d2 == d) + if(C.d1 == d || C.d2 == d) . += C return . //remove the old powernet and replace it with a new one throughout the network. -/proc/propagate_network(var/obj/O, var/datum/powernet/PN) - //log_world("propagating new network") +/proc/propagate_network(obj/O, datum/powernet/PN) var/list/worklist = list() var/list/found_machines = list() var/index = 1 @@ -248,13 +246,13 @@ P = worklist[index] //get the next power object found index++ - if( istype(P,/obj/structure/cable)) + if(istype(P, /obj/structure/cable)) var/obj/structure/cable/C = P if(C.powernet != PN) //add it to the powernet, if it isn't already there PN.add_cable(C) worklist |= C.get_connections() //get adjacents power objects, with or without a powernet - else if(P.anchored && istype(P,/obj/machinery/power)) + else if(P.anchored && istype(P, /obj/machinery/power)) var/obj/machinery/power/M = P found_machines |= M //we wait until the powernet is fully propagates to connect the machines @@ -268,7 +266,7 @@ //Merge two powernets, the bigger (in cable length term) absorbing the other -/proc/merge_powernets(var/datum/powernet/net1, var/datum/powernet/net2) +/proc/merge_powernets(datum/powernet/net1, datum/powernet/net2) if(!net1 || !net2) //if one of the powernet doesn't exist, return return @@ -285,8 +283,6 @@ for(var/obj/structure/cable/Cable in net2.cables) //merge cables net1.add_cable(Cable) - if(!net2) return net1 - for(var/obj/machinery/power/Node in net2.nodes) //merge power machines if(!Node.connect_to_network()) Node.disconnect_from_network() //if somehow we can't connect the machine to the new powernet, disconnect it from the old nonetheless @@ -299,14 +295,12 @@ //source is an object caused electrocuting (airlock, grille, etc) //No animations will be performed by this proc. /proc/electrocute_mob(mob/living/M, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE) - if(!istype(M)) - return FALSE - if(istype(M.loc,/obj/mecha)) + if(!M || ismecha(M.loc)) return FALSE //feckin mechs are dumb if(dist_check) if(!in_range(source, M)) return FALSE - if(istype(M,/mob/living/carbon/human)) + if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves @@ -326,7 +320,7 @@ if(istype(power_source, /datum/powernet)) PN = power_source - else if(istype(power_source,/obj/item/stock_parts/cell)) + else if(istype(power_source, /obj/item/stock_parts/cell)) cell = power_source else if(istype(power_source, /obj/machinery/power/apc)) var/obj/machinery/power/apc/apc = power_source @@ -357,10 +351,30 @@ var/drained_energy = drained_hp*20 if(source_area) - source_area.use_power(drained_energy/CELLRATE) - else if(istype(power_source,/datum/powernet)) - var/drained_power = drained_energy/CELLRATE //convert from "joules" to "watts" - drained_power = PN.draw_power(drained_power) - else if(istype(power_source, /obj/item/stock_parts/cell)) + source_area.use_power(drained_energy/GLOB.CELLRATE) + else if(istype(power_source, /datum/powernet)) + var/drained_power = drained_energy/GLOB.CELLRATE //convert from "joules" to "watts" + PN.delayedload += (min(drained_power, max(PN.newavail - PN.delayedload, 0))) + else if (istype(power_source, /obj/item/stock_parts/cell)) cell.use(drained_energy) return drained_energy + +//////////////////////////////////////////////// +// Misc. +/////////////////////////////////////////////// + + +// return a knot cable (O-X) if one is present in the turf +// null if there's none +/turf/proc/get_cable_node() + if(!can_have_cabling()) + return null + for(var/obj/structure/cable/C in src) + if(C.d1 == 0) + return C + return null + +/area/proc/get_apc() + for(var/obj/machinery/power/apc/APC in GLOB.apcs) + if(APC.area == src) + return APC \ No newline at end of file diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index 228b4232968..b64481b1104 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -1,19 +1,19 @@ +//////////////////////////////////////////// +// POWERNET DATUM +// each contiguous network of cables & nodes +///////////////////////////////////// /datum/powernet + var/number // unique id var/list/cables = list() // all cables & junctions var/list/nodes = list() // all connected machines var/load = 0 // the current load on the powernet, increased by each machine at processing var/newavail = 0 // what available power was gathered last tick, then becomes... var/avail = 0 //...the current available power in the powernet + var/viewavail = 0 // the available power as it appears on the power console (gradually updated) var/viewload = 0 // the load as it appears on the power console (gradually updated) - var/number = 0 // Unused //TODEL - - var/perapc = 0 // per-apc avilability - var/perapc_excess = 0 - var/netexcess = 0 // excess power on the powernet (typically avail-load) - - var/problem = 0 // If either of these is set to 1 there is some sort of issue at the powernet. - + var/netexcess = 0 // excess power on the powernet (typically avail-load)/////// + var/delayedload = 0 // load applied to powernet between power ticks. /datum/powernet/New() SSmachines.powernets += src @@ -31,31 +31,21 @@ SSmachines.powernets -= src return ..() -//Returns the amount of excess power (before refunding to SMESs) from last tick. -//This is for machines that might adjust their power consumption using this data. -/datum/powernet/proc/last_surplus() - return max(avail - load, 0) - -/datum/powernet/proc/draw_power(var/amount) - var/draw = between(0, amount, avail - load) - load += draw - return draw - /datum/powernet/proc/is_empty() return !cables.len && !nodes.len //remove a cable from the current powernet //if the powernet is then empty, delete it //Warning : this proc DON'T check if the cable exists -/datum/powernet/proc/remove_cable(var/obj/structure/cable/C) +/datum/powernet/proc/remove_cable(obj/structure/cable/C) cables -= C C.powernet = null if(is_empty())//the powernet is now empty... - qdel(src)///... delete it - qdel + qdel(src)///... delete it //add a cable to the current powernet //Warning : this proc DON'T check if the cable exists -/datum/powernet/proc/add_cable(var/obj/structure/cable/C) +/datum/powernet/proc/add_cable(obj/structure/cable/C) if(C.powernet)// if C already has a powernet... if(C.powernet == src) return @@ -67,16 +57,16 @@ //remove a power machine from the current powernet //if the powernet is then empty, delete it //Warning : this proc DON'T check if the machine exists -/datum/powernet/proc/remove_machine(var/obj/machinery/power/M) +/datum/powernet/proc/remove_machine(obj/machinery/power/M) nodes -=M M.powernet = null if(is_empty())//the powernet is now empty... - qdel(src)///... delete it - qdel + qdel(src)///... delete it //add a power machine to the current powernet //Warning : this proc DON'T check if the machine exists -/datum/powernet/proc/add_machine(var/obj/machinery/power/M) +/datum/powernet/proc/add_machine(obj/machinery/power/M) if(M.powernet)// if M already has a powernet... if(M.powernet == src) return @@ -85,45 +75,23 @@ M.powernet = src nodes[M] = M -// Triggers warning for certain amount of ticks -/datum/powernet/proc/trigger_warning(var/duration_ticks = 20) - problem = max(duration_ticks, problem) - //handles the power changes in the powernet //called every ticks by the powernet controller /datum/powernet/proc/reset() - var/numapc = 0 - - if(problem > 0) - problem = max(problem - 1, 0) - - if(nodes && nodes.len) // Added to fix a bad list bug -- TLE - for(var/obj/machinery/power/terminal/term in nodes) - if( istype( term.master, /obj/machinery/power/apc ) ) - numapc++ - + //see if there's a surplus of power remaining in the powernet and stores unused power in the SMES netexcess = avail - load - if(numapc) - //very simple load balancing. If there was a net excess this tick then it must have been that some APCs used less than perapc, since perapc*numapc = avail - //Therefore we can raise the amount of power rationed out to APCs on the assumption that those APCs that used less than perapc will continue to do so. - //If that assumption fails, then some APCs will miss out on power next tick, however it will be rebalanced for the tick after. - if(netexcess >= 0) - perapc_excess += min(netexcess/numapc, (avail - perapc) - perapc_excess) - else - perapc_excess = 0 - - perapc = avail/numapc + perapc_excess - if(netexcess > 100 && nodes && nodes.len) // if there was excess power last cycle for(var/obj/machinery/power/smes/S in nodes) // find the SMESes in the network S.restore() // and restore some of the power that was used - //updates the viewed load (as seen on power computers) - viewload = round(load) + // update power consoles + viewavail = round(0.8 * viewavail + 0.2 * avail) + viewload = round(0.8 * viewload + 0.2 * load) - //reset the powernet - load = 0 + // reset the powernet + load = delayedload + delayedload = 0 avail = newavail newavail = 0 @@ -131,27 +99,4 @@ if(avail >= 1000) return Clamp(20 + round(avail / 25000), 20, 195) + rand(-5, 5) else - return 0 - -//////////////////////////////////////////////// -// Misc. -/////////////////////////////////////////////// - - -// return a knot cable (O-X) if one is present in the turf -// null if there's none -/turf/proc/get_cable_node() - if(!istype(src, /turf/simulated/floor)) - return null - for(var/obj/structure/cable/C in src) - if(C.d1 == 0) - return C - return null - -/area/proc/get_apc() - // This was a simple locate() in src, but an unresolved BYOND bug causes trying to locate() in an - // area to take an inconceivably long time, especially for large areas. - // See: http://www.byond.com/forum/?post=1860571 - var/obj/machinery/power/apc/FINDME - for(FINDME in src) - return FINDME \ No newline at end of file + return 0 \ No newline at end of file diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index a85d9e880bd..3e910a613b0 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -15,8 +15,8 @@ var/global/list/rad_collectors = list() var/locked = 0 var/drainratio = 1 -/obj/machinery/power/rad_collector/New() - ..() +/obj/machinery/power/rad_collector/Initialize(mapload) + . = ..() rad_collectors += src /obj/machinery/power/rad_collector/Destroy() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 7e031755e22..9ba302ab19b 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -23,18 +23,25 @@ var/frequency = 0 var/id_tag = null + var/projectile_type = /obj/item/projectile/beam/emitter + var/projectile_sound = 'sound/weapons/emitter.ogg' var/datum/radio_frequency/radio_connection var/datum/effect_system/spark_spread/sparks -/obj/machinery/power/emitter/New() - ..() +/obj/machinery/power/emitter/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/emitter(null) component_parts += new /obj/item/stock_parts/micro_laser(null) component_parts += new /obj/item/stock_parts/manipulator(null) RefreshParts() + if(state == 2 && anchored) + connect_to_network() sparks = new + sparks.attach(src) sparks.set_up(5, 1, src) + if(frequency) + set_frequency(frequency) /obj/machinery/power/emitter/RefreshParts() var/max_firedelay = 120 @@ -79,13 +86,6 @@ return rotate() -/obj/machinery/power/emitter/Initialize() - ..() - if(state == 2 && anchored) - connect_to_network() - if(frequency) - set_frequency(frequency) - /obj/machinery/power/emitter/multitool_menu(var/mob/user,var/obj/item/multitool/P) return {"
    @@ -182,10 +182,9 @@ src.active = 0 update_icon() return - if(((src.last_shot + src.fire_delay) <= world.time) && (src.active == 1)) - - var/actual_load = draw_power(active_power_usage) - if(actual_load >= active_power_usage) //does the laser have enough power to shoot? + if(active == TRUE) + if(!active_power_usage || surplus() >= active_power_usage) + add_load(active_power_usage) if(!powered) powered = 1 update_icon() @@ -197,36 +196,57 @@ investigate_log("lost power and turned off","singulo") return - src.last_shot = world.time - if(src.shot_number < 3) - src.fire_delay = 2 - src.shot_number++ - else - src.fire_delay = rand(minimum_fire_delay,maximum_fire_delay) - src.shot_number = 0 + if(!check_delay()) + return FALSE + fire_beam() - var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter(src.loc) +/obj/machinery/power/emitter/proc/check_delay() + if((last_shot + fire_delay) <= world.time) + return TRUE + return FALSE - A.dir = src.dir - playsound(get_turf(src), 'sound/weapons/emitter.ogg', 25, 1) - if(prob(35)) - sparks.start() - - switch(dir) - if(NORTH) - A.yo = 20 - A.xo = 0 - if(EAST) - A.yo = 0 - A.xo = 20 - if(WEST) - A.yo = 0 - A.xo = -20 - else // Any other - A.yo = -20 - A.xo = 0 - A.fire() //TODO: Carn: check this out +/obj/machinery/power/emitter/proc/fire_beam() + var/obj/item/projectile/P = new projectile_type(get_turf(src)) + playsound(get_turf(src), projectile_sound, 50, TRUE) + if(prob(35)) + sparks.start() + switch(dir) + if(NORTH) + P.yo = 20 + P.xo = 0 + if(NORTHEAST) + P.yo = 20 + P.xo = 20 + if(EAST) + P.yo = 0 + P.xo = 20 + if(SOUTHEAST) + P.yo = -20 + P.xo = 20 + if(WEST) + P.yo = 0 + P.xo = -20 + if(SOUTHWEST) + P.yo = -20 + P.xo = -20 + if(NORTHWEST) + P.yo = 20 + P.xo = -20 + else // Any other + P.yo = -20 + P.xo = 0 + last_shot = world.time + if(shot_number < 3) + fire_delay = 20 + shot_number ++ + else + fire_delay = rand(minimum_fire_delay, maximum_fire_delay) + shot_number = 0 + P.setDir(dir) + P.starting = loc + P.fire() + return P /obj/machinery/power/emitter/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/multitool)) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 40947d79368..420a112c352 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -48,8 +48,8 @@ field_generator power level display overlays += "+p[power_level]" -/obj/machinery/field/generator/New() - ..() +/obj/machinery/field/generator/Initialize(mapload) + . = ..() fields = list() connected_gens = list() diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index 85ef45eef20..2b6695b9e85 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -2,11 +2,12 @@ name = "Accelerated Particles" desc = "Small things moving very fast." icon = 'icons/obj/machines/particle_accelerator.dmi' - icon_state = "particle"//Need a new icon for this - anchored = 1 - density = 1 + icon_state = "particle" + anchored = TRUE + density = FALSE var/movement_range = 10 var/energy = 10 + var/speed = 1 /obj/effect/accelerated_particle/weak movement_range = 8 @@ -21,50 +22,45 @@ energy = 50 -/obj/effect/accelerated_particle/New(loc, dir = 2) - src.loc = loc - src.dir = dir +/obj/effect/accelerated_particle/New(loc) + ..() - if(movement_range > 20) - movement_range = 20 - spawn(0) - move(1) - return + addtimer(CALLBACK(src, .proc/move), 1) /obj/effect/accelerated_particle/Bump(atom/A) if(A) - if(ismob(A)) + if(isliving(A)) toxmob(A) - if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/singularity/))) - A:energy += energy - return + else if(istype(A, /obj/machinery/the_singularitygen)) + var/obj/machinery/the_singularitygen/S = A + S.energy += energy + else if(istype(A, /obj/singularity)) + var/obj/singularity/S = A + S.energy += energy - -/obj/effect/accelerated_particle/Bumped(atom/A) - if(ismob(A)) - Bump(A) - return +/obj/effect/accelerated_particle/Crossed(atom/A) + if(isliving(A)) + toxmob(A) /obj/effect/accelerated_particle/ex_act(severity) qdel(src) + +/obj/effect/accelerated_particle/singularity_pull() return -/obj/effect/accelerated_particle/proc/toxmob(var/mob/living/M) - M.apply_effect((energy*6),IRRADIATE,0) - M.updatehealth() - return +/obj/effect/accelerated_particle/proc/toxmob(mob/living/M) + M.apply_effect((energy * 6), IRRADIATE, 0) - -/obj/effect/accelerated_particle/proc/move(var/lag) +/obj/effect/accelerated_particle/proc/move() if(!step(src,dir)) - src.loc = get_step(src,dir) + forceMove(get_step(src, dir)) movement_range-- - if(movement_range <= 0) + if(movement_range == 0) qdel(src) else - sleep(lag) - move(lag) + sleep(speed) + move() \ No newline at end of file diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index bf20ef45140..80de53fe22d 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -19,11 +19,11 @@ var/parts = null var/datum/wires/particle_acc/control_box/wires = null -/obj/machinery/particle_accelerator/control_box/New() +/obj/machinery/particle_accelerator/control_box/Initialize(mapload) + . = ..() wires = new(src) connected_parts = list() update_icon() - ..() /obj/machinery/particle_accelerator/control_box/Destroy() if(active) diff --git a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm index 97bf4fa4277..c2a1ccfa8da 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm @@ -29,21 +29,20 @@ return 0 -/obj/structure/particle_accelerator/particle_emitter/proc/emit_particle(var/strength = 0) +/obj/structure/particle_accelerator/particle_emitter/proc/emit_particle(strength = 0) if((last_shot + fire_delay) <= world.time) last_shot = world.time - var/obj/effect/accelerated_particle/A = null - var/turf/T = get_step(src, dir) + var/turf/T = get_turf(src) + var/obj/effect/accelerated_particle/P switch(strength) if(0) - A = new/obj/effect/accelerated_particle/weak(T, dir) + P = new/obj/effect/accelerated_particle/weak(T) if(1) - A = new/obj/effect/accelerated_particle(T, dir) + P = new/obj/effect/accelerated_particle(T) if(2) - A = new/obj/effect/accelerated_particle/strong(T, dir) + P = new/obj/effect/accelerated_particle/strong(T) if(3) - A = new/obj/effect/accelerated_particle/powerful(T, dir) - if(A) - A.dir = dir - return 1 - return 0 + P = new/obj/effect/accelerated_particle/powerful(T) + P.setDir(dir) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/modules/power/singularity/particle_accelerator/particle_power.dm b/code/modules/power/singularity/particle_accelerator/particle_power.dm index dafd19917da..75ae7eb3263 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_power.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_power.dm @@ -3,8 +3,4 @@ desc_holder = "This part uses electromagnetic waves to focus the Alpha particles." icon = 'icons/obj/machines/particle_accelerator.dmi' icon_state = "power_box" - reference = "power_box" - -/obj/structure/particle_accelerator/power_box/update_icon() - ..() - return + reference = "power_box" \ No newline at end of file diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index f95f5ce2864..6c9ecb55afc 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -11,20 +11,20 @@ name = "power storage unit" desc = "A high-capacity superconducting magnetic energy storage (SMES) unit." icon_state = "smes" - density = 1 - anchored = 1 + density = TRUE + use_power = NO_POWER_USE var/capacity = 5e6 // maximum charge var/charge = 0 // actual charge - var/input_attempt = 0 // 1 = attempting to charge, 0 = not attempting to charge - var/inputting = 0 // 1 = actually inputting, 0 = not inputting + var/input_attempt = TRUE // 1 = attempting to charge, 0 = not attempting to charge + var/inputting = TRUE // 1 = actually inputting, 0 = not inputting var/input_level = 50000 // amount of power the SMES attempts to charge by var/input_level_max = 200000 // cap on input_level var/input_available = 0 // amount of charge available from input last tick - var/output_attempt = 1 // 1 = attempting to output, 0 = not attempting to output - var/outputting = 1 // 1 = actually outputting, 0 = not outputting + var/output_attempt = TRUE // 1 = attempting to output, 0 = not attempting to output + var/outputting = TRUE // 1 = actually outputting, 0 = not outputting var/output_level = 50000 // amount of power the SMES attempts to output var/output_level_max = 200000 // cap on output_level var/output_used = 0 // amount of power actually outputted. may be less than output_level if the powernet returns excess power @@ -34,13 +34,11 @@ var/last_input_attempt = 0 var/last_charge = 0 - var/open_hatch = 0 var/name_tag = null - var/building_terminal = 0 //Suggestions about how to avoid clickspam building several terminals accepted! var/obj/machinery/power/terminal/terminal = null -/obj/machinery/power/smes/New() - ..() +/obj/machinery/power/smes/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/smes(null) component_parts += new /obj/item/stock_parts/cell/high(null) @@ -52,28 +50,22 @@ component_parts += new /obj/item/stack/cable_coil(null, 5) RefreshParts() - spawn(5) - if(!powernet) - connect_to_network() + dir_loop: + for(var/d in cardinal) + var/turf/T = get_step(src, d) + for(var/obj/machinery/power/terminal/term in T) + if(term && term.dir == turn(d, 180)) + terminal = term + break dir_loop - dir_loop: - for(var/d in cardinal) - var/turf/T = get_step(src, d) - for(var/obj/machinery/power/terminal/term in T) - if(term && term.dir == turn(d, 180)) - terminal = term - break dir_loop - if(!terminal) - stat |= BROKEN - return - terminal.master = src - if(!terminal.powernet) - terminal.connect_to_network() - update_icon() - return + if(!terminal) + stat |= BROKEN + return + terminal.master = src + update_icon() -/obj/machinery/power/smes/upgraded/New() - ..() +/obj/machinery/power/smes/upgraded/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/smes(null) component_parts += new /obj/item/stock_parts/cell/hyper(null) @@ -222,8 +214,8 @@ return round(5.5*charge/(capacity ? capacity : 5e6)) /obj/machinery/power/smes/process() - - if(stat & BROKEN) return + if(stat & BROKEN) + return //store machine state to see if we need to update the icon overlays var/last_disp = chargedisplay() @@ -231,33 +223,46 @@ var/last_onln = outputting //inputting - if(input_attempt) - var/target_load = min((capacity-charge)/SMESRATE, input_level) // charge at set rate, limited to spare capacity - var/actual_load = draw_power(target_load) // add the load to the terminal side network - charge += actual_load * SMESRATE // increase the charge + if(terminal && input_attempt) + input_available = terminal.surplus() - if(actual_load >= target_load) // Did we charge at full rate? - inputting = 2 - else if(actual_load) // If not, did we charge at least partially? - inputting = 1 - else // Or not at all? - inputting = 0 + if(inputting) + if(input_available > 0) // if there's power available, try to charge + + var/load = min(min((capacity-charge)/SMESRATE, input_level), input_available) // charge at set rate, limited to spare capacity + + charge += load * SMESRATE // increase the charge + + terminal.add_load(load) // add the load to the terminal side network + + else // if not enough capcity + inputting = FALSE // stop inputting + + else + if(input_attempt && input_available > 0) + inputting = TRUE + else + inputting = FALSE //outputting - if(outputting) - output_used = min( charge/SMESRATE, output_level) //limit output to that stored + if(output_attempt) + if(outputting) + output_used = min( charge/SMESRATE, output_level) //limit output to that stored - charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive) + if (add_avail(output_used)) // add output to powernet if it exists (smes side) + charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive) + else + outputting = FALSE - add_avail(output_used) // add output to powernet (smes side) - - if(output_used < 0.0001) // either from no charge or set to 0 - outputting = 0 - investigate_log("lost power and turned off","singulo") - else if(output_attempt && charge > output_level && output_level > 0) - outputting = 1 + if(output_used < 0.0001) // either from no charge or set to 0 + outputting = FALSE + investigate_log("lost power and turned off", "singulo") + else if(output_attempt && charge > output_level && output_level > 0) + outputting = TRUE + else + output_used = 0 else - output_used = 0 + outputting = FALSE // only update icon if state changed if(last_disp != chargedisplay() || last_chrg != inputting || last_onln != outputting) @@ -333,11 +338,6 @@ return 0 return 1 -/obj/machinery/power/smes/draw_power(var/amount) - if(terminal && terminal.powernet) - return terminal.powernet.draw_power(amount) - return 0 - /obj/machinery/power/smes/attack_ai(mob/user) add_hiddenprint(user) ui_interact(user) @@ -483,7 +483,8 @@ output_level = 250000 /obj/machinery/power/smes/magical/process() - charge = 5000000 + capacity = INFINITY + charge = INFINITY ..() #undef SMESRATE diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 7342c1f26c1..1384c8d21e6 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -6,8 +6,7 @@ desc = "A solar panel. Generates electricity when in contact with sunlight." icon = 'icons/obj/power.dmi' icon_state = "sp_base" - anchored = 1 - density = 1 + density = TRUE use_power = NO_POWER_USE idle_power_usage = 0 active_power_usage = 0 @@ -20,8 +19,8 @@ var/turn_angle = 0 var/obj/machinery/power/solar_control/control = null -/obj/machinery/power/solar/New(var/turf/loc, var/obj/item/solar_assembly/S) - ..(loc) +/obj/machinery/power/solar/Initialize(mapload, obj/item/solar_assembly/S) + . = ..() Make(S) connect_to_network() @@ -118,7 +117,7 @@ return sunfrac = cos(p_angle) ** 2 - //isn't the power recieved from the incoming light proportionnal to cos(p_angle) (Lambert's cosine law) rather than cos(p_angle)^2 ? + //isn't the power received from the incoming light proportionnal to cos(p_angle) (Lambert's cosine law) rather than cos(p_angle)^2 ? /obj/machinery/power/solar/process()//TODO: remove/add this from machines to save on processing as needed ~Carn PRIORITY if(stat & BROKEN) diff --git a/code/modules/power/switch.dm b/code/modules/power/switch.dm deleted file mode 100644 index 34e867005e1..00000000000 --- a/code/modules/power/switch.dm +++ /dev/null @@ -1,84 +0,0 @@ -//This is a power switch. When turned on it looks at the cables around the tile that it's on and notes which cables are trying to connect to it. -//After it knows this it creates the number of cables from the center to each of the cables attempting to conenct. These cables cannot be removed -//with wirecutters. When the switch is turned off it removes all the cables on the tile it's on. -//The switch uses a 5s delay to prevent powernet change spamming. -/* -/obj/structure/powerswitch - name = "power switch" - desc = "A switch that controls power." - icon = 'icons/obj/power.dmi' - icon_state = "switch-dbl-up" - var/icon_state_on = "switch-dbl-down" - var/icon_state_off = "switch-dbl-up" - density = 0 - anchored = 1 - var/on = 0 //up is off, down is on - var/busy = 0 //set to 1 when you start pulling - -/obj/structure/powerswitch/simple - icon_state = "switch-up" - icon_state_on = "switch-down" - icon_state_off = "switch-up" - - -/obj/structure/powerswitch/examine(mob/user) - ..(user) - if(on) - to_chat(user, "The switch is in the on position") - else - to_chat(user, "The switch is in the off position") - -/obj/structure/powerswitch/attack_ai(mob/user) - to_chat(user, "You're an AI. This is a manual switch. It's not going to work.") - return - -/obj/structure/powerswitch/attack_hand(mob/user) - - if(busy) - to_chat(user, "This switch is already being toggled.") - return - - ..() - - busy = 1 - for(var/mob/O in viewers(user)) - O.show_message(text("[user] starts pulling the [src]."), 1) - - if(do_after(user, 50, target = src)) - set_state(!on) - for(var/mob/O in viewers(user)) - O.show_message(text("[user] flips the [src] into the [on ? "on": "off"] position."), 1) - busy = 0 - -/obj/structure/powerswitch/proc/set_state(var/state) - on = state - if(on) - icon_state = icon_state_on - var/list/connection_dirs = list() - for(var/direction in list(1,2,4,8,5,6,9,10)) - for(var/obj/structure/cable/C in get_step(src,direction)) - if(C.d1 == turn(direction, 180) || C.d2 == turn(direction, 180)) - connection_dirs += direction - break - - for(var/direction in connection_dirs) - var/obj/structure/cable/C = new/obj/structure/cable(src.loc) - C.d1 = 0 - C.d2 = direction - C.icon_state = "[C.d1]-[C.d2]" - C.power_switch = src - - var/datum/powernet/PN = new() - PN.number = powernets.len + 1 - powernets += PN - C.netnum = PN.number - PN.cables += C - - C.mergeConnectedNetworks(C.d2) - C.mergeConnectedNetworksOnTurf() - - else - icon_state = icon_state_off - for(var/obj/structure/cable/C in src.loc) - qdel(C) -*/ \ No newline at end of file diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index 194e96f6dba..80c38e0a9fe 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -8,25 +8,24 @@ icon_state = "term" desc = "It's an underfloor wiring terminal for power equipment." level = 1 - layer = TURF_LAYER + layer = WIRE_TERMINAL_LAYER //a bit above wires var/obj/machinery/power/master = null - anchored = 1 - layer = 2.6 // a bit above wires -/obj/machinery/power/terminal/New() - ..() - var/turf/T = src.loc - if(level==1) hide(T.intact) - return - +/obj/machinery/power/terminal/Initialize(mapload) + . = ..() + var/turf/T = get_turf(src) + if(level == 1) + hide(T.intact) + /obj/machinery/power/terminal/Destroy() if(master) master.disconnect_terminal() + master = null return ..() -/obj/machinery/power/terminal/hide(var/i) +/obj/machinery/power/terminal/hide(i) if(i) invisibility = 101 icon_state = "term-f" diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index efafd8909ea..cc564c98d4c 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -12,8 +12,8 @@ var/last_zap = 0 var/datum/wires/tesla_coil/wires = null -/obj/machinery/power/tesla_coil/New() - ..() +/obj/machinery/power/tesla_coil/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/tesla_coil(null) component_parts += new /obj/item/stock_parts/capacitor(null) @@ -77,7 +77,7 @@ var/coeff = (20 - ((input_power_multiplier - 1) * 3)) coeff = max(coeff, 10) var/power = (powernet.avail/2) - draw_power(power) + add_load(power) playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5) tesla_zap(src, 10, power/(coeff/2)) @@ -89,8 +89,8 @@ anchored = 0 density = 1 -/obj/machinery/power/grounding_rod/New() - ..() +/obj/machinery/power/grounding_rod/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/grounding_rod(null) component_parts += new /obj/item/stock_parts/capacitor(null) diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index e4e3275ef26..0b7f417b52e 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -8,16 +8,15 @@ desc = "A solar directional tracker." icon = 'icons/obj/power.dmi' icon_state = "tracker" - anchored = 1 - density = 1 + density = TRUE use_power = NO_POWER_USE var/id = 0 var/sun_angle = 0 // sun angle as set by sun datum var/obj/machinery/power/solar_control/control = null -/obj/machinery/power/tracker/New(var/turf/loc, var/obj/item/solar_assembly/S) - ..(loc) +/obj/machinery/power/tracker/Initialize(mapload, obj/item/solar_assembly/S) + . = ..() Make(S) connect_to_network() @@ -26,7 +25,7 @@ return ..() //set the control of the tracker to a given computer if closer than SOLAR_MAX_DIST -/obj/machinery/power/tracker/proc/set_control(var/obj/machinery/power/solar_control/SC) +/obj/machinery/power/tracker/proc/set_control(obj/machinery/power/solar_control/SC) if(SC && (get_dist(src, SC) > SOLAR_MAX_DIST)) return 0 control = SC @@ -39,21 +38,21 @@ control.connected_tracker = null control = null -/obj/machinery/power/tracker/proc/Make(var/obj/item/solar_assembly/S) +/obj/machinery/power/tracker/proc/Make(obj/item/solar_assembly/S) if(!S) S = new /obj/item/solar_assembly(src) S.glass_type = /obj/item/stack/sheet/glass S.tracker = 1 - S.anchored = 1 - S.loc = src + S.anchored = TRUE + S.forceMove(src) update_icon() //updates the tracker icon and the facing angle for the control computer -/obj/machinery/power/tracker/proc/set_angle(var/angle) +/obj/machinery/power/tracker/proc/set_angle(angle) sun_angle = angle //set icon dir to show sun illumination - dir = turn(NORTH, -angle - 22.5) // 22.5 deg bias ensures, e.g. 67.5-112.5 is EAST + setDir(turn(NORTH, -angle - 22.5)) // 22.5 deg bias ensures, e.g. 67.5-112.5 is EAST if(powernet && (powernet == control.powernet)) //update if we're still in the same powernet control.cdir = angle diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm index c611585a8cc..1548738f3f5 100644 --- a/code/modules/power/treadmill.dm +++ b/code/modules/power/treadmill.dm @@ -7,7 +7,6 @@ name = "treadmill" desc = "A power-generating treadmill." layer = 2.2 - anchored = 1 use_power = NO_POWER_USE var/speed = 0 @@ -18,8 +17,8 @@ var/list/mobs_running[0] var/id = null // for linking to monitor -/obj/machinery/power/treadmill/Initialize() - ..() +/obj/machinery/power/treadmill/Initialize(mapload) + . = ..() if(anchored) connect_to_network() @@ -138,8 +137,8 @@ var/frame = 0 // on 0, show labels, on 1 show numbers var/redeem_immediately = 0 // redeem immediately for holding cell -/obj/machinery/treadmill_monitor/Initialize() - ..() +/obj/machinery/treadmill_monitor/Initialize(mapload) + . = ..() if(id) for(var/obj/machinery/power/treadmill/T in GLOB.machines) if(T.id == id) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 641682490d4..7b1764c354d 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -64,8 +64,8 @@ // the inlet stage of the gas turbine electricity generator -/obj/machinery/power/compressor/New() - ..() +/obj/machinery/power/compressor/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/power_compressor(null) component_parts += new /obj/item/stock_parts/manipulator(null) @@ -80,10 +80,6 @@ gas_contained = new inturf = get_step(src, dir) - - -/obj/machinery/power/compressor/Initialize() - ..() locate_machinery() if(!turbine) stat |= BROKEN @@ -185,8 +181,8 @@ #define TURBGENQ 100000 #define TURBGENG 0.5 -/obj/machinery/power/turbine/New() - ..() +/obj/machinery/power/turbine/Initialize(mapload) + . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/power_turbine(src) component_parts += new /obj/item/stock_parts/capacitor(src) @@ -200,10 +196,6 @@ // The outlet is pointed at the direction of the turbine component outturf = get_step(src, dir) - - -/obj/machinery/power/turbine/Initialize() - ..() locate_machinery() if(!compressor) stat |= BROKEN diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 258237f0ddd..57a57ef8e0a 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -184,6 +184,8 @@ if(href_list["ejectBeaker"]) if(beaker) beaker.forceMove(loc) + if(Adjacent(usr) && !issilicon(usr)) + usr.put_in_hands(beaker) beaker = null overlays.Cut() diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 848c1ca4ecd..5f5bd8de2d4 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -38,9 +38,11 @@ if(state_change) SSnanoui.update_uis(src) -/obj/machinery/chem_heater/proc/eject_beaker() +/obj/machinery/chem_heater/proc/eject_beaker(mob/user) if(beaker) beaker.forceMove(get_turf(src)) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(beaker) beaker = null icon_state = "mixer0b" on = FALSE @@ -118,7 +120,7 @@ . = 1 if(href_list["eject_beaker"]) - eject_beaker() + eject_beaker(usr) . = 0 //updated in eject_beaker() already /obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index ffd3ae57bd5..e10cd5c9203 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -229,6 +229,8 @@ else if(href_list["eject"]) if(beaker) beaker.forceMove(get_turf(src)) + if(Adjacent(usr) && !issilicon(usr)) + usr.put_in_hands(beaker) beaker = null reagents.clear_reagents() update_icon() diff --git a/code/modules/reagents/chemistry/reagents/blob.dm b/code/modules/reagents/chemistry/reagents/blob.dm index 1dcd414b702..bca2cbd9067 100644 --- a/code/modules/reagents/chemistry/reagents/blob.dm +++ b/code/modules/reagents/chemistry/reagents/blob.dm @@ -56,7 +56,8 @@ volume = ..() M.apply_damage(0.6*volume, TOX) M.hallucination += 0.6*volume - M.reagents.add_reagent("spore", 0.4*volume) + if(M.reagents) + M.reagents.add_reagent("spore", 0.4*volume) /datum/reagent/blob/lexorin_jelly //does tons of oxygen damage and a little brute name = "Lexorin Jelly" @@ -102,7 +103,8 @@ volume = ..() M.apply_damage(0.4*volume, BURN) M.adjustStaminaLoss(0.4*volume) - M.reagents.add_reagent("frostoil", 0.4*volume) + if(M.reagents) + M.reagents.add_reagent("frostoil", 0.4*volume) /datum/reagent/blob/b_sorium name = "Sorium" diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 069efe5807c..8ddb4e0fd7c 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -447,6 +447,14 @@ build_path = /obj/item/healthanalyzer category = list("initial", "Medical") +/datum/design/pillbottle + name = "Pill Bottle" + id = "pillbottle" + build_type = AUTOLATHE + materials = list(MAT_METAL = 80, MAT_GLASS = 20) + build_path = /obj/item/storage/pill_bottle + category = list("initial", "Medical") + /datum/design/beanbag_slug name = "Beanbag Slug" id = "beanbag_slug" diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm index bc264cb8f62..0c535fa61a1 100644 --- a/code/modules/research/designs/biogenerator_designs.dm +++ b/code/modules/research/designs/biogenerator_designs.dm @@ -113,7 +113,15 @@ build_type = BIOGENERATOR materials = list(MAT_BIOMASS = 50) build_path = /obj/item/stack/sheet/cloth - category = list("initial","Leather and Cloth") + category = list("initial", "Organic Materials") + +/datum/design/cardboard + name = "Sheet of cardboard" + id = "cardboard" + build_type = BIOGENERATOR + materials = list(MAT_BIOMASS = 25) + build_path = /obj/item/stack/sheet/cardboard + category = list("initial", "Organic Materials") /datum/design/wallet name = "Wallet" diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 44edebdca50..c130ea1d447 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -1,9 +1,12 @@ // Shuttle on-movement // -/atom/movable/proc/onShuttleMove(turf/T1, rotation) - if(rotation) - shuttleRotate(rotation) - forceMove(T1) - return 1 +/atom/movable/proc/onShuttleMove(turf/oldT, turf/T1, rotation) + var/turf/newT = get_turf(src) + if(newT.z != oldT.z) + onTransitZ(oldT.z, newT.z) + if(rotation) + shuttleRotate(rotation) + forceMove(T1) + return 1 /atom/movable/lighting_overlay/onShuttleMove() return 0 diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 06e0c2336f0..9a4f948307d 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -501,7 +501,7 @@ //move mobile to new location for(var/atom/movable/AM in T0) - AM.onShuttleMove(T1, rotation) + AM.onShuttleMove(T0, T1, rotation) if(rotation) T1.shuttleRotate(rotation) @@ -868,12 +868,27 @@ possible_destinations = "science_home;science_away" /obj/machinery/computer/shuttle/admin - name = "Administration Shuttle Console" - desc = "Used to call and send the administration shuttle." + name = "admin shuttle console" + req_access = list(access_cent_general) shuttleId = "admin" - possible_destinations = "admin_home;admin_away" + possible_destinations = "admin_home;admin_away;admin_custom" resistance_flags = INDESTRUCTIBLE +/obj/machinery/computer/camera_advanced/shuttle_docker/admin + name = "Admin shuttle navigation computer" + desc = "Used to designate a precise transit location for the admin shuttle." + icon_screen = "navigation" + icon_keyboard = "med_key" + shuttleId = "admin" + shuttlePortId = "admin_custom" + view_range = 14 + x_offset = 0 + y_offset = 0 + resistance_flags = INDESTRUCTIBLE + access_tcomms = TRUE + access_construction = TRUE + access_mining = TRUE + /obj/machinery/computer/shuttle/trade name = "Freighter Console" resistance_flags = INDESTRUCTIBLE diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 0a40901059f..0ec9e614110 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -42,7 +42,7 @@ ..() /obj/machinery/computer/shuttle/sst - name = "Syndicate Strike Time Shuttle Console" + name = "Syndicate Strike Team Shuttle Console" desc = "Used to call and send the SST shuttle." icon_keyboard = "syndie_key" icon_screen = "syndishuttle" diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 73d54003fc5..71a06d8e013 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -256,9 +256,17 @@ origin_tech = "materials=5;programming=4;biotech=4" slot = "heartdrive" var/revive_cost = 0 - var/reviving = 0 + var/reviving = FALSE var/cooldown = 0 +/obj/item/organ/internal/cyberimp/chest/reviver/hardened + name = "Hardened reviver implant" + emp_proof = TRUE + +/obj/item/organ/internal/cyberimp/chest/reviver/hardened/Initialize(mapload) + . = ..() + desc += " The implant has been hardened. It is invulnerable to EMPs." + /obj/item/organ/internal/cyberimp/chest/reviver/on_life() if(reviving) if(owner.stat == UNCONSCIOUS && (owner.sleeping == 0)) //!owner.sleeping didn't work for whatever dumb reason @@ -320,7 +328,7 @@ /obj/item/storage/box/cyber_implants/bundle name = "boxed cybernetic implants" var/list/boxed = list(/obj/item/organ/internal/cyberimp/eyes/xray,/obj/item/organ/internal/cyberimp/eyes/thermals, - /obj/item/organ/internal/cyberimp/brain/anti_stun, /obj/item/organ/internal/cyberimp/chest/reviver) + /obj/item/organ/internal/cyberimp/brain/anti_stun, /obj/item/organ/internal/cyberimp/chest/reviver/hardened) var/amount = 5 /obj/item/storage/box/cyber_implants/bundle/New() diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 2c42f421774..6dbc6f4febe 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -41,6 +41,8 @@ for(var/X in actions) var/datum/action/A = X A.Grant(M) + if(vital) + M.update_stat("Vital organ inserted") // Removes the given organ from its owner. // Returns the removed object, which is usually just itself diff --git a/config/example/config.txt b/config/example/config.txt index d93809c32cd..a0d733eacd1 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -1,6 +1,12 @@ ## Server name: This appears at the top of the screen in-game. In this case it will read "spacestation13: station_name" where station_name is the randomly generated name of the station for the round. Remove the # infront of SERVERNAME and replace 'spacestation13' with the name of your choice # SERVERNAME spacestation13 +## Server tagline: This appears on the hub entry. +#SERVER_TAG_LINE The Perfect Mix of RP & Action + +## Server extra features: This appears in the feature list on the hub entry. +#SERVER_EXTRA_FEATURES medium RP, varied species/jobs/modes + ## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system. ADMIN_LEGACY_SYSTEM @@ -250,6 +256,12 @@ ASSISTANT_LIMIT ## If you enabled assistant limiting set the ratio of assistants to security members default is 2 assistants to 1 officer ASSISTANT_RATIO 2 +# Mins before SSD crew are cryoed. +AUTO_CRYO_SSD_MINS 15 + +# If enabled, prevents people interacting with SSD players unless they acknowledge they have read the server rules. +SSD_WARNING + ## Remove the # to make rounds which end instantly (Rev, Wizard, Malf) to continue until the shuttle is called or the station is nuked. ## Malf and Rev will let the shuttle be called when the antags/protags are dead. #CONTINUOUS_ROUNDS @@ -402,4 +414,4 @@ DISABLE_HIGH_POP_MC_MODE_AMOUNT 60 #DISABLE_LOCALHOST_ADMIN ## Uncomment to give a confirmation before hitting start now -#START_NOW_CONFIRMATION \ No newline at end of file +#START_NOW_CONFIRMATION diff --git a/html/changelog.html b/html/changelog.html index 7c4262f54ce..6ce02bc19c8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,237 @@ -->
    +

    02 May 2019

    +

    AffectedArc07 updated:

    +
      +
    • ssMapping
    • +
    • Gateway and space ruins are now loaded with ssMapping
    • +
    • Master Controller
    • +
    • Darkmode chat department colors match NTTC theming now
    • +
    • SSvotes
    • +
    • SSradio
    • +
    • SSevents
    • +
    • SSholiday
    • +
    • We no longer check if its Christmas every tick. Dont ask.
    • +
    • SSalarms
    • +
    +

    Arkatos updated:

    +
      +
    • Shadowlings now have a slightly bigger colored text when speaking in the Shadowling Hivemind
    • +
    • Replaced title2.ogg music with a higher quality version
    • +
    • Shield Blobs automatically spawned around Blob Cores now give no refund upon removing. No freebies.
    • +
    • Added new Wizard Spell - Summon Ghosts! This nefarious spell will make all ghosts visible to the living. Be careful though, as while they cannot harm you in any way, they might prove a bit.. annoying. Costs 0 points in the Wizard's spellbook.
    • +
    • Ghosts now orbit around their followed targets
    • +
    • Added new Shadowling Ability - Null Charge! This new ability allows Shadowling to completely drain an APC of it's power after a moderate delay. Shadowling must not be interrupted, or the whole process will fail.
    • +
    • Added custom icon for the Null Charge ability
    • +
    • Shadowling Drain Life ability removed
    • +
    • Added Observer HUD buttons for Jump to Mob, Orbit, Re-enter corpse, and Teleport
    • +
    • Added custom icons for Observer HUD buttons
    • +
    • Added Floorbot color variants. Different toolboxes will result in a differently colored Floorbots. One even might be a little stronger than others..
    • +
    • Added sprites of Floorbot color variants
    • +
    • Fixed incorrect amount of required floortiles for the Floorbot in the crafting tab
    • +
    • Added cancel button to Wizard teleportation scrolls
    • +
    • Added an option to grant Martial Arts via administrative Var menu
    • +
    • Toggling hardhat light on/off now correctly updates wearer's sprite
    • +
    • Added deathsound for Silicons
    • +
    • Dice will now roll when thrown
    • +
    • Added sound when adding or removing IDs from ID modification computers
    • +
    • Added cancel button to transfer amount from stack menu
    • +
    • Alt-click is a new shortcut to take a custom amount from stack
    • +
    • Added shortcuts for handling pumps, volume pumps, filters, and mixers. Ctrl-click these devices to turn them on/off and Alt-click them to set their output to maximum.
    • +
    • Added ability to rename pumps, volume pumps, filters and mixers with a pen.
    • +
    • Added sound for throwing bolas
    • +
    • Added hitsound for all types of bolas
    • +
    • Added AntagHUD to everyone at the round end
    • +
    • Circuit Boards now show their required components on examine
    • +
    • Revenants now have randomly generated flavor names
    • +
    • You can shift-click any action button to reset it's position. Alt-click on Hide Buttons will reset all action buttons to their default positions.
    • +
    • Pill Bottles are now printable in the Autolathe. You can find them in the Medical section, and each costs 80 metal and 20 glass to print.
    • +
    • Puts beakers in your hand upon eject from chemistry machines
    • +
    • Cardboard can now be made in the Biogenerator
    • +
    • You can now hotswap tanks in a canister or gas pump by clicking it with a new tank!
    • +
    • You can now also close a canister's valve and remove the tank inside it by alt-clicking it.
    • +
    • Added examine toolptips. Hover over any equipped or hold item for a little while and it will display the item description as a tooltip.
    • +
    • Ghost teleport verb will no locker flicker when used
    • +
    • Alt-click now opens and closes fire extinguisher cabinet
    • +
    • Fire extinguisher cabinet now properly updates it's sprite correctly when putting fire extinquisher inside the cabinet
    • +
    • Fire extinguisher no longer sprays when put into fire extinguisher cabinet with a safety off
    • +
    • Added sound for opening and closing fire extinguisher cabinet
    • +
    • Added new torch sprites
    • +
    • Torch light color is now orange instead of red
    • +
    • Torch sprite now correctly shows all inhand sprites
    • +
    • Blob Rally Spores power is now free to use
    • +
    • Blob mobs can no longer speak while being dead via Blob Broadcast
    • +
    • Blob structures now properly show working animation
    • +
    • Added new sprites for variants of Blob resource, factory and storage structures
    • +
    • Added inhand sprites for winter coats
    • +
    • Carps now spawn with a random color! There might even be some really rare ones..
    • +
    • Added carp color variants sprites
    • +
    +

    Arkatos and Paradise community: updated:

    +
      +
    • Added Tip of the round to a pre-game lobby
    • +
    • Added Show Custom Tip admin verb
    • +
    • Added Give Random Tip OOC verb
    • +
    +

    Citinited updated:

    +
      +
    • You can no longer turn transit turfs into foamed metal flooring.
    • +
    • Foamed metal floors have a sprite now.
    • +
    • Pipe dispensers (the big ones) now work again.
    • +
    • Cooldown on pipe dispensers reduced to 0.4 seconds, down from 1.5 seconds
    • +
    +

    CornMyCob updated:

    +
      +
    • The plasma cutter now cuts through multiple rock tiles.
    • +
    +

    CthulhuOnIce updated:

    +
      +
    • you can smell dead bodies, even if someone else shouldn't
    • +
    +

    Fethas updated:

    +
      +
    • Cluwne suits should no longer fall off cluwnes from being fat.
    • +
    +

    Fox McCloud updated:

    +
      +
    • CQC has been updated; a few combos are more powerful
    • +
    • cost increased to 13 TC
    • +
    • CQC is now nuke ops only
    • +
    • gloves of the north star restriction on CQC removed
    • +
    • CQC disarms will now take the item from your opponent
    • +
    • CQC blocks melee weapons and a couple of stun weapons and not everything now
    • +
    • Reagents will now adjust to the body temperature over time as opposed to all at once
    • +
    • Strange Reagent will work 25% of the time with TOUCH based reactions
    • +
    • Strange reagent will revive whether there's a ghost or not (can use SR on clientless mobs now, like monkies)
    • +
    • SR puts the occupant back in their body automatically
    • +
    • Cloners that eject their messes will now eject the unattached organs
    • +
    • the message for brain death will now properly and only occur when they have truly died from brain damage
    • +
    • Fixes being able to attain brain damage over 120
    • +
    • Updates nations. Updates nations so hard right into the void
    • +
    • Plasma fires should burn a bit faster now
    • +
    • Bleeding will now stop at the temperature at which cryoxadone heals
    • +
    • Fixes a few potential exploits with forcing chem, dust, and explosive implants activating with the deathgasp emote, prior to death
    • +
    • Tesla can't zap cameras and other disposal structures anymore
    • +
    • Simple mobs can now be shocked
    • +
    • Electrocution damage scales a bit more linearly up to its maximum potential instead of being heavily random
    • +
    • Fixes being able to shock yourself with TK, at range, on electrical equipment
    • +
    • simple mobs can now be shocked by the tesla and other sources
    • +
    • Fixes goats not attacking people
    • +
    • Goats will eat glowshrooms
    • +
    • Goats will eat full grown diona
    • +
    • Remapped toxins to be more compatible with the modern age
    • +
    • updates plasma and N2O sprites
    • +
    • Fixes not being able to look at a turf if it had plasma/N2O on it
    • +
    • cold turfs no longer become icy
    • +
    • Cryostylane makes turfs icy
    • +
    • Icy turfs are slippery; wear magboots to counteract the effect. Watch your head!
    • +
    • Fixes grammar of slipping on turfs; no more "you slipped on floor" or "you slipped on wet floor"
    • +
    • removes ponies
    • +
    • object and fast processing are now proper subsystems
    • +
    • Fixes multi-spawn blobs
    • +
    • Powersinks drain rate increased, but they also explode a bit sooner
    • +
    • Multitools display total power, load, and free power
    • +
    • Fix emitter sparks sparking at the location of emitters where biult as opposed to emitter current location
    • +
    +

    Ionward updated:

    +
      +
    • Added new mantles! Check the ClothesMate, or in department head's lockers.
    • +
    +

    KasparoVy updated:

    +
      +
    • Adds striped normal-height socks.
    • +
    • Vox can now wear whatever undergarment they want.
    • +
    • Removes flesh from shredded Vox uniform sprites.
    • +
    • Armalis can no longer wear undergarments. They didn't fit, anyhow.
    • +
    • Underwear no can no longer lock up the character creator.
    • +
    +

    Kyep updated:

    +
      +
    • bans issued by admins via the Player Panel no longer incorrectly omit IP/etc information
    • +
    • admins issuing permanent bans are no longer presented with an "ip ban?" prompt, as all bans include IP/CID information now. This prompt was a legacy thing from back when the filesystem was used to store bans, and hasn't ever affected how DB-based bans were stored.
    • +
    • Added a config file option which allows SSD crew members to be moved to cryo after a defined amount of minutes.
    • +
    • Added a config file option which causes most people trying to attack/loot/interact with a SSD character to need to confirm they've read the rules before being able to do so.
    • +
    • Fixed an error message being inappropriately generated for admins when someone signs up as a pAI.
    • +
    • The ID computer now color-codes potential job transfer options, highlighting good choices for a job transfer in green, and bad ones in gray.
    • +
    • Taking a job transfer now gives you playtime based on your new job, instead of incorrectly still giving you playtime based on your old job.
    • +
    • Job transfers to karma jobs are now possible - if you have the job unlocked.
    • +
    • Attempting to bypass a job ban via a job transfer now generates a warning to all online admins.
    • +
    • Refactored and improved our entry on the server hub.
    • +
    • Fixed a runtime in job_exp.dm
    • +
    +

    Markolie updated:

    +
      +
    • Safes can now consist of more than two tumblers.
    • +
    • All safes now have three tumblers by default, instead of two.
    • +
    • The safe opening mechanism has changed slightly. This is described on the safe cracking UI.
    • +
    • The hardsuit equipment lockers on the Syndicate Nuclear Operative shuttle have been replaced with suit storage units. Suit storage units now have a separate slot for magboots.
    • +
    • Nuclear Operatives can now purchase reinforcements. These reinforcements cost 25 telecrystals each.
    • +
    • A number of new ammunition and weapon bundles have been added for Nuclear Operatives.
    • +
    • For every ten players on the server, the Nuclear Operatives now receive 2 extra telecrystals.
    • +
    • The Syndicate borg spawners have been separated into three separate spawners, one for each type of Syndicate cyborg. Their prices have been modified.
    • +
    • Saboteur borgs now spawn with thermals.
    • +
    • The Syndicate borg and exosuits have been moved to a new category, "Support and Mechanized Exosuits".
    • +
    • Existing bundles and telecrystal purchases have been moved to a new category, "Bundles and Telecrystals".
    • +
    • There are now more spawn points for nuclear operatives on their base. The number of operatives spawning has not been changed.
    • +
    • Spawning nuclear operatives through the traitor panel now causes their ID to be properly updated.
    • +
    • Shuttles no longer leave behind their propulsion.
    • +
    • AZERTY hotkey mode users can now switch between regular mode and hotkey mode properly using TAB again.
    • +
    • Jumpsuits are now removed by clicking instead of clicking and dragging.
    • +
    • Removed a useless message that would be sent to admins whenever a drone joins the round.
    • +
    • Fixed an issue where admins would receive a message whenever someone joined up as a pAI.
    • +
    +

    McDonald072 updated:

    +
      +
    • You can no longer examine or teleport things using clipboards
    • +
    +

    Quantum-M updated:

    +
      +
    • Two multicolor pens to the Internal Affairs Office
    • +
    +

    TDSSS updated:

    +
      +
    • nukies can buy plasma grenades again
    • +
    +

    Ty-Omaha updated:

    +
      +
    • Moves AI admin log to the all preference
    • +
    +

    dovydas12345 updated:

    +
      +
    • Fixes normal cameras spooking non-chaplains even when they don't capture any ghosts
    • +
    +

    farie82 updated:

    +
      +
    • Makes puke less lag inducing
    • +
    • Puke can now appear on all kinds of turfs except spess
    • +
    • Ticket messages now have their corresponding span classes. Making them easier to notice
    • +
    • PM's now shouldn't go to the wrong client anymore when the target left.
    • +
    • Cure text for Shock and Cardiac failure are more clear now
    • +
    • Ducttape gags can now be removed properly without spawning an invisible one in your hands
    • +
    • Windoors now give the airlock assembly electronics once deconstructed
    • +
    • Can't place runes in space anymore
    • +
    • Admins can now use all mhelp related things again
    • +
    • Fixed the toggle mentor ticket messages text
    • +
    • Vampiric glaring is logged now
    • +
    • Doctor delight and orange juice now heal again
    • +
    • Fixes admin PM's. Bwoinks are back on the menu!
    • +
    • Organs will now prompt a update_stat. Meaning that IRCs and the like now get revived when possible when you put their battery and brain in
    • +
    • The typing limiter option should now work for all edge cases. Such as dying while talking and such
    • +
    • Borgs health status now updates properly when removing and adding parts
    • +
    • You won't try to fix destroyed components in borgs anymore. Which resulted to lost materials and no healing
    • +
    • Borg analysers will now properly show missing components and won't show their damage if missing
    • +
    • Self diagnostics for borgs now also shows missing parts and destroyed ones
    • +
    +

    iantine updated:

    +
      +
    • Adds Lumi's vox suit fluff
    • +
    +

    uc_guy updated:

    +
      +
    • Players in the lobby no longer see cult speak.
    • +
    +

    08 April 2019

    TDSSS updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d145f082f7c..5ad4bdbcd9e 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -9790,3 +9790,256 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2019-04-08: TDSSS: - bugfix: Added missing vent in toxins mixing +2019-05-02: + AffectedArc07: + - rscadd: ssMapping + - tweak: Gateway and space ruins are now loaded with ssMapping + - rscdel: Master Controller + - tweak: Darkmode chat department colors match NTTC theming now + - rscadd: SSvotes + - rscadd: SSradio + - rscadd: SSevents + - rscadd: SSholiday + - tweak: We no longer check if its Christmas every tick. Dont ask. + - rscadd: SSalarms + Arkatos: + - tweak: Shadowlings now have a slightly bigger colored text when speaking in the + Shadowling Hivemind + - soundadd: Replaced title2.ogg music with a higher quality version + - tweak: Shield Blobs automatically spawned around Blob Cores now give no refund + upon removing. No freebies. + - rscadd: Added new Wizard Spell - Summon Ghosts! This nefarious spell will make + all ghosts visible to the living. Be careful though, as while they cannot harm + you in any way, they might prove a bit.. annoying. Costs 0 points in the Wizard's + spellbook. + - tweak: Ghosts now orbit around their followed targets + - rscadd: Added new Shadowling Ability - Null Charge! This new ability allows Shadowling + to completely drain an APC of it's power after a moderate delay. Shadowling + must not be interrupted, or the whole process will fail. + - imageadd: Added custom icon for the Null Charge ability + - rscdel: Shadowling Drain Life ability removed + - rscadd: Added Observer HUD buttons for Jump to Mob, Orbit, Re-enter corpse, and + Teleport + - imageadd: Added custom icons for Observer HUD buttons + - rscadd: Added Floorbot color variants. Different toolboxes will result in a differently + colored Floorbots. One even might be a little stronger than others.. + - imageadd: Added sprites of Floorbot color variants + - bugfix: Fixed incorrect amount of required floortiles for the Floorbot in the + crafting tab + - rscadd: Added cancel button to Wizard teleportation scrolls + - rscadd: Added an option to grant Martial Arts via administrative Var menu + - bugfix: Toggling hardhat light on/off now correctly updates wearer's sprite + - soundadd: Added deathsound for Silicons + - tweak: Dice will now roll when thrown + - soundadd: Added sound when adding or removing IDs from ID modification computers + - rscadd: Added cancel button to transfer amount from stack menu + - tweak: Alt-click is a new shortcut to take a custom amount from stack + - rscadd: Added shortcuts for handling pumps, volume pumps, filters, and mixers. + Ctrl-click these devices to turn them on/off and Alt-click them to set their + output to maximum. + - rscadd: Added ability to rename pumps, volume pumps, filters and mixers with a + pen. + - soundadd: Added sound for throwing bolas + - soundadd: Added hitsound for all types of bolas + - rscadd: Added AntagHUD to everyone at the round end + - rscadd: Circuit Boards now show their required components on examine + - rscadd: Revenants now have randomly generated flavor names + - tweak: You can shift-click any action button to reset it's position. Alt-click + on Hide Buttons will reset all action buttons to their default positions. + - rscadd: Pill Bottles are now printable in the Autolathe. You can find them in + the Medical section, and each costs 80 metal and 20 glass to print. + - tweak: Puts beakers in your hand upon eject from chemistry machines + - rscadd: Cardboard can now be made in the Biogenerator + - rscadd: You can now hotswap tanks in a canister or gas pump by clicking it with + a new tank! + - rscadd: You can now also close a canister's valve and remove the tank inside it + by alt-clicking it. + - rscadd: Added examine toolptips. Hover over any equipped or hold item for a little + while and it will display the item description as a tooltip. + - bugfix: Ghost teleport verb will no locker flicker when used + - rscadd: Alt-click now opens and closes fire extinguisher cabinet + - bugfix: Fire extinguisher cabinet now properly updates it's sprite correctly when + putting fire extinquisher inside the cabinet + - bugfix: Fire extinguisher no longer sprays when put into fire extinguisher cabinet + with a safety off + - soundadd: Added sound for opening and closing fire extinguisher cabinet + - imageadd: Added new torch sprites + - tweak: Torch light color is now orange instead of red + - bugfix: Torch sprite now correctly shows all inhand sprites + - tweak: Blob Rally Spores power is now free to use + - bugfix: Blob mobs can no longer speak while being dead via Blob Broadcast + - bugfix: Blob structures now properly show working animation + - imageadd: Added new sprites for variants of Blob resource, factory and storage + structures + - imageadd: Added inhand sprites for winter coats + - rscadd: Carps now spawn with a random color! There might even be some really rare + ones.. + - imageadd: Added carp color variants sprites + 'Arkatos and Paradise community:': + - rscadd: Added Tip of the round to a pre-game lobby + - rscadd: Added Show Custom Tip admin verb + - rscadd: Added Give Random Tip OOC verb + Citinited: + - bugfix: You can no longer turn transit turfs into foamed metal flooring. + - bugfix: Foamed metal floors have a sprite now. + - bugfix: Pipe dispensers (the big ones) now work again. + - tweak: Cooldown on pipe dispensers reduced to 0.4 seconds, down from 1.5 seconds + CornMyCob: + - tweak: The plasma cutter now cuts through multiple rock tiles. + CthulhuOnIce: + - bugfix: you can smell dead bodies, even if someone else shouldn't + Fethas: + - bugfix: Cluwne suits should no longer fall off cluwnes from being fat. + Fox McCloud: + - tweak: CQC has been updated; a few combos are more powerful + - tweak: cost increased to 13 TC + - tweak: CQC is now nuke ops only + - tweak: gloves of the north star restriction on CQC removed + - tweak: CQC disarms will now take the item from your opponent + - tweak: CQC blocks melee weapons and a couple of stun weapons and not everything + now + - tweak: Reagents will now adjust to the body temperature over time as opposed to + all at once + - tweak: Strange Reagent will work 25% of the time with TOUCH based reactions + - tweak: Strange reagent will revive whether there's a ghost or not (can use SR + on clientless mobs now, like monkies) + - tweak: SR puts the occupant back in their body automatically + - tweak: Cloners that eject their messes will now eject the unattached organs + - tweak: the message for brain death will now properly and only occur when they + have truly died from brain damage + - bugfix: Fixes being able to attain brain damage over 120 + - rscdel: Updates nations. Updates nations so hard right into the void + - tweak: Plasma fires should burn a bit faster now + - tweak: Bleeding will now stop at the temperature at which cryoxadone heals + - bugfix: Fixes a few potential exploits with forcing chem, dust, and explosive + implants activating with the deathgasp emote, prior to death + - tweak: Tesla can't zap cameras and other disposal structures anymore + - rscadd: Simple mobs can now be shocked + - tweak: Electrocution damage scales a bit more linearly up to its maximum potential + instead of being heavily random + - bugfix: Fixes being able to shock yourself with TK, at range, on electrical equipment + - rscadd: simple mobs can now be shocked by the tesla and other sources + - bugfix: Fixes goats not attacking people + - tweak: Goats will eat glowshrooms + - rscadd: Goats will eat full grown diona + - rscadd: Remapped toxins to be more compatible with the modern age + - tweak: updates plasma and N2O sprites + - bugfix: Fixes not being able to look at a turf if it had plasma/N2O on it + - rscdel: cold turfs no longer become icy + - rscadd: Cryostylane makes turfs icy + - rscadd: Icy turfs are slippery; wear magboots to counteract the effect. Watch + your head! + - bugfix: Fixes grammar of slipping on turfs; no more "you slipped on floor" or + "you slipped on wet floor" + - rscdel: removes ponies + - tweak: object and fast processing are now proper subsystems + - bugfix: Fixes multi-spawn blobs + - tweak: Powersinks drain rate increased, but they also explode a bit sooner + - rscadd: Multitools display total power, load, and free power + - bugfix: Fix emitter sparks sparking at the location of emitters where biult as + opposed to emitter current location + Ionward: + - rscadd: Added new mantles! Check the ClothesMate, or in department head's lockers. + KasparoVy: + - rscadd: Adds striped normal-height socks. + - rscadd: Vox can now wear whatever undergarment they want. + - tweak: Removes flesh from shredded Vox uniform sprites. + - rscdel: Armalis can no longer wear undergarments. They didn't fit, anyhow. + - bugfix: Underwear no can no longer lock up the character creator. + Kyep: + - bugfix: bans issued by admins via the Player Panel no longer incorrectly omit + IP/etc information + - tweak: admins issuing permanent bans are no longer presented with an "ip ban?" + prompt, as all bans include IP/CID information now. This prompt was a legacy + thing from back when the filesystem was used to store bans, and hasn't ever + affected how DB-based bans were stored. + - rscadd: Added a config file option which allows SSD crew members to be moved to + cryo after a defined amount of minutes. + - rscadd: Added a config file option which causes most people trying to attack/loot/interact + with a SSD character to need to confirm they've read the rules before being + able to do so. + - bugfix: Fixed an error message being inappropriately generated for admins when + someone signs up as a pAI. + - rscadd: The ID computer now color-codes potential job transfer options, highlighting + good choices for a job transfer in green, and bad ones in gray. + - bugfix: Taking a job transfer now gives you playtime based on your new job, instead + of incorrectly still giving you playtime based on your old job. + - tweak: Job transfers to karma jobs are now possible - if you have the job unlocked. + - rscadd: Attempting to bypass a job ban via a job transfer now generates a warning + to all online admins. + - tweak: Refactored and improved our entry on the server hub. + - bugfix: Fixed a runtime in job_exp.dm + Markolie: + - rscadd: Safes can now consist of more than two tumblers. + - tweak: All safes now have three tumblers by default, instead of two. + - tweak: The safe opening mechanism has changed slightly. This is described on the + safe cracking UI. + - rscadd: The hardsuit equipment lockers on the Syndicate Nuclear Operative shuttle + have been replaced with suit storage units. Suit storage units now have a separate + slot for magboots. + - rscadd: Nuclear Operatives can now purchase reinforcements. These reinforcements + cost 25 telecrystals each. + - rscadd: A number of new ammunition and weapon bundles have been added for Nuclear + Operatives. + - tweak: For every ten players on the server, the Nuclear Operatives now receive + 2 extra telecrystals. + - tweak: The Syndicate borg spawners have been separated into three separate spawners, + one for each type of Syndicate cyborg. Their prices have been modified. + - tweak: Saboteur borgs now spawn with thermals. + - tweak: The Syndicate borg and exosuits have been moved to a new category, "Support + and Mechanized Exosuits". + - tweak: Existing bundles and telecrystal purchases have been moved to a new category, + "Bundles and Telecrystals". + - tweak: There are now more spawn points for nuclear operatives on their base. The + number of operatives spawning has not been changed. + - bugfix: Spawning nuclear operatives through the traitor panel now causes their + ID to be properly updated. + - bugfix: Shuttles no longer leave behind their propulsion. + - bugfix: AZERTY hotkey mode users can now switch between regular mode and hotkey + mode properly using TAB again. + - tweak: Jumpsuits are now removed by clicking instead of clicking and dragging. + - bugfix: Removed a useless message that would be sent to admins whenever a drone + joins the round. + - bugfix: Fixed an issue where admins would receive a message whenever someone joined + up as a pAI. + McDonald072: + - bugfix: You can no longer examine or teleport things using clipboards + Quantum-M: + - rscadd: Two multicolor pens to the Internal Affairs Office + TDSSS: + - tweak: nukies can buy plasma grenades again + Ty-Omaha: + - tweak: Moves AI admin log to the all preference + dovydas12345: + - bugfix: Fixes normal cameras spooking non-chaplains even when they don't capture + any ghosts + farie82: + - tweak: Makes puke less lag inducing + - tweak: Puke can now appear on all kinds of turfs except spess + - bugfix: Ticket messages now have their corresponding span classes. Making them + easier to notice + - bugfix: PM's now shouldn't go to the wrong client anymore when the target left. + - tweak: Cure text for Shock and Cardiac failure are more clear now + - bugfix: Ducttape gags can now be removed properly without spawning an invisible + one in your hands + - bugfix: Windoors now give the airlock assembly electronics once deconstructed + - bugfix: Can't place runes in space anymore + - bugfix: Admins can now use all mhelp related things again + - spellcheck: Fixed the toggle mentor ticket messages text + - bugfix: Vampiric glaring is logged now + - bugfix: Doctor delight and orange juice now heal again + - bugfix: Fixes admin PM's. Bwoinks are back on the menu! + - bugfix: Organs will now prompt a update_stat. Meaning that IRCs and the like now + get revived when possible when you put their battery and brain in + - bugfix: The typing limiter option should now work for all edge cases. Such as + dying while talking and such + - bugfix: Borgs health status now updates properly when removing and adding parts + - bugfix: You won't try to fix destroyed components in borgs anymore. Which resulted + to lost materials and no healing + - bugfix: Borg analysers will now properly show missing components and won't show + their damage if missing + - tweak: Self diagnostics for borgs now also shows missing parts and destroyed ones + iantine: + - rscadd: Adds Lumi's vox suit fluff + uc_guy: + - bugfix: Players in the lobby no longer see cult speak. diff --git a/html/changelogs/AutoChangeLog-pr-10327.yml b/html/changelogs/AutoChangeLog-pr-10327.yml deleted file mode 100644 index 7b73cbcbd97..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10327.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "CQC has been updated; a few combos are more powerful" - - tweak: "cost increased to 13 TC" - - tweak: "CQC is now nuke ops only" - - tweak: "gloves of the north star restriction on CQC removed" - - tweak: "CQC disarms will now take the item from your opponent" - - tweak: "CQC blocks melee weapons and a couple of stun weapons and not everything now" diff --git a/html/changelogs/AutoChangeLog-pr-11102.yml b/html/changelogs/AutoChangeLog-pr-11102.yml deleted file mode 100644 index 7e54f5268ab..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11102.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscadd: "ssMapping" - - tweak: "Gateway and space ruins are now loaded with ssMapping" diff --git a/html/changelogs/AutoChangeLog-pr-11214.yml b/html/changelogs/AutoChangeLog-pr-11214.yml deleted file mode 100644 index fcad43b3086..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11214.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Shadowlings now have a slightly bigger colored text when speaking in the Shadowling Hivemind" diff --git a/html/changelogs/AutoChangeLog-pr-11217.yml b/html/changelogs/AutoChangeLog-pr-11217.yml deleted file mode 100644 index 9c6b9803c94..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11217.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Reagents will now adjust to the body temperature over time as opposed to all at once" diff --git a/html/changelogs/AutoChangeLog-pr-11224.yml b/html/changelogs/AutoChangeLog-pr-11224.yml deleted file mode 100644 index 0357a4aa727..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11224.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - soundadd: "Replaced title2.ogg music with a higher quality version" diff --git a/html/changelogs/AutoChangeLog-pr-11227.yml b/html/changelogs/AutoChangeLog-pr-11227.yml deleted file mode 100644 index cc4293ba715..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11227.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Strange Reagent will work 25% of the time with TOUCH based reactions" - - tweak: "Strange reagent will revive whether there's a ghost or not (can use SR on clientless mobs now, like monkies)" - - tweak: "SR puts the occupant back in their body automatically" - - tweak: "Cloners that eject their messes will now eject the unattached organs" diff --git a/html/changelogs/AutoChangeLog-pr-11230.yml b/html/changelogs/AutoChangeLog-pr-11230.yml deleted file mode 100644 index 36c1f051aca..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11230.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "the message for brain death will now properly and only occur when they have truly died from brain damage" - - bugfix: "Fixes being able to attain brain damage over 120" diff --git a/html/changelogs/AutoChangeLog-pr-11231.yml b/html/changelogs/AutoChangeLog-pr-11231.yml deleted file mode 100644 index 82560671a26..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11231.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Arkatos and Paradise community:" -delete-after: True -changes: - - rscadd: "Added Tip of the round to a pre-game lobby" - - rscadd: "Added Show Custom Tip admin verb" - - rscadd: "Added Give Random Tip OOC verb" diff --git a/html/changelogs/AutoChangeLog-pr-11243.yml b/html/changelogs/AutoChangeLog-pr-11243.yml deleted file mode 100644 index c0843a66d43..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11243.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CornMyCob" -delete-after: True -changes: - - tweak: "The plasma cutter now cuts through multiple rock tiles." diff --git a/html/changelogs/AutoChangeLog-pr-11253.yml b/html/changelogs/AutoChangeLog-pr-11253.yml deleted file mode 100644 index 0cfbb99257a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11253.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Citinited" -delete-after: True -changes: - - bugfix: "You can no longer turn transit turfs into foamed metal flooring." - - bugfix: "Foamed metal floors have a sprite now." diff --git a/html/changelogs/AutoChangeLog-pr-11255.yml b/html/changelogs/AutoChangeLog-pr-11255.yml deleted file mode 100644 index 7320fee3d2a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11255.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "Safes can now consist of more than two tumblers." - - tweak: "All safes now have three tumblers by default, instead of two." - - tweak: "The safe opening mechanism has changed slightly. This is described on the safe cracking UI." diff --git a/html/changelogs/AutoChangeLog-pr-11257.yml b/html/changelogs/AutoChangeLog-pr-11257.yml deleted file mode 100644 index a675de535f9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11257.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscdel: "Updates nations. Updates nations so hard right into the void" diff --git a/html/changelogs/AutoChangeLog-pr-11259.yml b/html/changelogs/AutoChangeLog-pr-11259.yml deleted file mode 100644 index 2b6bdf7e540..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11259.yml +++ /dev/null @@ -1,13 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "The hardsuit equipment lockers on the Syndicate Nuclear Operative shuttle have been replaced with suit storage units. Suit storage units now have a separate slot for magboots." - - rscadd: "Nuclear Operatives can now purchase reinforcements. These reinforcements cost 25 telecrystals each." - - rscadd: "A number of new ammunition and weapon bundles have been added for Nuclear Operatives." - - tweak: "For every ten players on the server, the Nuclear Operatives now receive 2 extra telecrystals." - - tweak: "The Syndicate borg spawners have been separated into three separate spawners, one for each type of Syndicate cyborg. Their prices have been modified." - - tweak: "Saboteur borgs now spawn with thermals." - - tweak: "The Syndicate borg and exosuits have been moved to a new category, \"Support and Mechanized Exosuits\"." - - tweak: "Existing bundles and telecrystal purchases have been moved to a new category, \"Bundles and Telecrystals\"." - - tweak: "There are now more spawn points for nuclear operatives on their base. The number of operatives spawning has not been changed." - - bugfix: "Spawning nuclear operatives through the traitor panel now causes their ID to be properly updated." diff --git a/html/changelogs/AutoChangeLog-pr-11270.yml b/html/changelogs/AutoChangeLog-pr-11270.yml deleted file mode 100644 index 6ecdf8039c0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11270.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TDSSS" -delete-after: True -changes: - - tweak: "nukies can buy plasma grenades again" diff --git a/html/changelogs/AutoChangeLog-pr-11277.yml b/html/changelogs/AutoChangeLog-pr-11277.yml deleted file mode 100644 index c966a9c74cb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11277.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Shield Blobs automatically spawned around Blob Cores now give no refund upon removing. No freebies." diff --git a/html/changelogs/AutoChangeLog-pr-11278.yml b/html/changelogs/AutoChangeLog-pr-11278.yml deleted file mode 100644 index 24f9c3ab4cc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11278.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added new Wizard Spell - Summon Ghosts! This nefarious spell will make all ghosts visible to the living. Be careful though, as while they cannot harm you in any way, they might prove a bit.. annoying. Costs 0 points in the Wizard's spellbook." diff --git a/html/changelogs/AutoChangeLog-pr-11279.yml b/html/changelogs/AutoChangeLog-pr-11279.yml deleted file mode 100644 index 11bdfb80538..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11279.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Ghosts now orbit around their followed targets" diff --git a/html/changelogs/AutoChangeLog-pr-11280.yml b/html/changelogs/AutoChangeLog-pr-11280.yml deleted file mode 100644 index 5228e09b3c9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11280.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ionward" -delete-after: True -changes: - - rscadd: "Added new mantles! Check the ClothesMate, or in department head's lockers." diff --git a/html/changelogs/AutoChangeLog-pr-11282.yml b/html/changelogs/AutoChangeLog-pr-11282.yml deleted file mode 100644 index 5b8e5704c06..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11282.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Plasma fires should burn a bit faster now" - - tweak: "Bleeding will now stop at the temperature at which cryoxadone heals" diff --git a/html/changelogs/AutoChangeLog-pr-11283.yml b/html/changelogs/AutoChangeLog-pr-11283.yml deleted file mode 100644 index 9056578d68b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11283.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes a few potential exploits with forcing chem, dust, and explosive implants activating with the deathgasp emote, prior to death" diff --git a/html/changelogs/AutoChangeLog-pr-11284.yml b/html/changelogs/AutoChangeLog-pr-11284.yml deleted file mode 100644 index 433a7fb3f68..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11284.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added new Shadowling Ability - Null Charge! This new ability allows Shadowling to completely drain an APC of it's power after a moderate delay. Shadowling must not be interrupted, or the whole process will fail." - - imageadd: "Added custom icon for the Null Charge ability" - - rscdel: "Shadowling Drain Life ability removed" diff --git a/html/changelogs/AutoChangeLog-pr-11285.yml b/html/changelogs/AutoChangeLog-pr-11285.yml deleted file mode 100644 index 3c725a05b90..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11285.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Tesla can't zap cameras and other disposal structures anymore" - - rscadd: "Simple mobs can now be shocked" - - tweak: "Electrocution damage scales a bit more linearly up to its maximum potential instead of being heavily random" - - bugfix: "Fixes being able to shock yourself with TK, at range, on electrical equipment" - - rscadd: "simple mobs can now be shocked by the tesla and other sources" diff --git a/html/changelogs/AutoChangeLog-pr-11287.yml b/html/changelogs/AutoChangeLog-pr-11287.yml deleted file mode 100644 index 111f8aac824..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11287.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes goats not attacking people" - - tweak: "Goats will eat glowshrooms" - - rscadd: "Goats will eat full grown diona" diff --git a/html/changelogs/AutoChangeLog-pr-11288.yml b/html/changelogs/AutoChangeLog-pr-11288.yml deleted file mode 100644 index 2a309dde374..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11288.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscadd: "Remapped toxins to be more compatible with the modern age" diff --git a/html/changelogs/AutoChangeLog-pr-11292.yml b/html/changelogs/AutoChangeLog-pr-11292.yml deleted file mode 100644 index 814c8530858..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11292.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - tweak: "Makes puke less lag inducing" - - tweak: "Puke can now appear on all kinds of turfs except spess" diff --git a/html/changelogs/AutoChangeLog-pr-11294.yml b/html/changelogs/AutoChangeLog-pr-11294.yml deleted file mode 100644 index 0088263303b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11294.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Ticket messages now have their corresponding span classes. Making them easier to notice" diff --git a/html/changelogs/AutoChangeLog-pr-11296.yml b/html/changelogs/AutoChangeLog-pr-11296.yml deleted file mode 100644 index 42a9ce1a063..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11296.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "PM's now shouldn't go to the wrong client anymore when the target left." diff --git a/html/changelogs/AutoChangeLog-pr-11297.yml b/html/changelogs/AutoChangeLog-pr-11297.yml deleted file mode 100644 index 9973022ecea..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11297.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "updates plasma and N2O sprites" - - bugfix: "Fixes not being able to look at a turf if it had plasma/N2O on it" - - rscdel: "cold turfs no longer become icy" - - rscadd: "Cryostylane makes turfs icy" - - rscadd: "Icy turfs are slippery; wear magboots to counteract the effect. Watch your head!" - - bugfix: "Fixes grammar of slipping on turfs; no more \"you slipped on floor\" or \"you slipped on wet floor\"" diff --git a/html/changelogs/AutoChangeLog-pr-11298.yml b/html/changelogs/AutoChangeLog-pr-11298.yml deleted file mode 100644 index 0523ab305e7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11298.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "bans issued by admins via the Player Panel no longer incorrectly omit IP/etc information" - - tweak: "admins issuing permanent bans are no longer presented with an \"ip ban?\" prompt, as all bans include IP/CID information now. This prompt was a legacy thing from back when the filesystem was used to store bans, and hasn't ever affected how DB-based bans were stored." diff --git a/html/changelogs/AutoChangeLog-pr-11300.yml b/html/changelogs/AutoChangeLog-pr-11300.yml deleted file mode 100644 index b949b7f91f5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11300.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added Observer HUD buttons for Jump to Mob, Orbit, Re-enter corpse, and Teleport" - - imageadd: "Added custom icons for Observer HUD buttons" diff --git a/html/changelogs/AutoChangeLog-pr-11301.yml b/html/changelogs/AutoChangeLog-pr-11301.yml deleted file mode 100644 index 2b1bc1f82cd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11301.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "KasparoVy" -delete-after: True -changes: - - rscadd: "Adds striped normal-height socks." - - rscadd: "Vox can now wear whatever undergarment they want." - - tweak: "Removes flesh from shredded Vox uniform sprites." - - rscdel: "Armalis can no longer wear undergarments. They didn't fit, anyhow." diff --git a/html/changelogs/AutoChangeLog-pr-11305.yml b/html/changelogs/AutoChangeLog-pr-11305.yml deleted file mode 100644 index 6ca9bfb33bd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11305.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscdel: "removes ponies" diff --git a/html/changelogs/AutoChangeLog-pr-11310.yml b/html/changelogs/AutoChangeLog-pr-11310.yml deleted file mode 100644 index 3ec3c388190..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11310.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "KasparoVy" -delete-after: True -changes: - - bugfix: "Underwear no can no longer lock up the character creator." diff --git a/html/changelogs/AutoChangeLog-pr-11313.yml b/html/changelogs/AutoChangeLog-pr-11313.yml deleted file mode 100644 index d86b5ff7d0a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11313.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Ducttape gags can now be removed properly without spawning an invisible one in your hands" diff --git a/html/changelogs/AutoChangeLog-pr-11314.yml b/html/changelogs/AutoChangeLog-pr-11314.yml deleted file mode 100644 index 0d38b022e23..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11314.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Windoors now give the airlock assembly electronics once deconstructed" diff --git a/html/changelogs/AutoChangeLog-pr-11317.yml b/html/changelogs/AutoChangeLog-pr-11317.yml deleted file mode 100644 index 96503bf1d88..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11317.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Can't place runes in space anymore" diff --git a/html/changelogs/AutoChangeLog-pr-11318.yml b/html/changelogs/AutoChangeLog-pr-11318.yml deleted file mode 100644 index a9e5c225096..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11318.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscdel: "Master Controller" diff --git a/html/changelogs/AutoChangeLog-pr-11320.yml b/html/changelogs/AutoChangeLog-pr-11320.yml deleted file mode 100644 index 6bafcda7d63..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11320.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Shuttles no longer leave behind their propulsion." diff --git a/html/changelogs/AutoChangeLog-pr-11328.yml b/html/changelogs/AutoChangeLog-pr-11328.yml deleted file mode 100644 index e91103f07cd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11328.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Admins can now use all mhelp related things again" - - spellcheck: "Fixed the toggle mentor ticket messages text" diff --git a/html/changelogs/AutoChangeLog-pr-11329.yml b/html/changelogs/AutoChangeLog-pr-11329.yml deleted file mode 100644 index e25e56b8828..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11329.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Vampiric glaring is logged now" diff --git a/html/changelogs/AutoChangeLog-pr-11331.yml b/html/changelogs/AutoChangeLog-pr-11331.yml deleted file mode 100644 index bd501e2f162..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11331.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added cancel button to Wizard teleportation scrolls" diff --git a/html/changelogs/AutoChangeLog-pr-11332.yml b/html/changelogs/AutoChangeLog-pr-11332.yml deleted file mode 100644 index f76e2e2b48b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11332.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added an option to grant Martial Arts via administrative Var menu" diff --git a/html/changelogs/AutoChangeLog-pr-11333.yml b/html/changelogs/AutoChangeLog-pr-11333.yml deleted file mode 100644 index 71935d55d86..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11333.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - bugfix: "Toggling hardhat light on/off now correctly updates wearer's sprite" diff --git a/html/changelogs/AutoChangeLog-pr-11336.yml b/html/changelogs/AutoChangeLog-pr-11336.yml deleted file mode 100644 index bf2626580e3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11336.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CthulhuOnIce" -delete-after: True -changes: - - bugfix: "you can smell dead bodies, even if someone else shouldn't" diff --git a/html/changelogs/AutoChangeLog-pr-11339.yml b/html/changelogs/AutoChangeLog-pr-11339.yml deleted file mode 100644 index a5b0f74908e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11339.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "AZERTY hotkey mode users can now switch between regular mode and hotkey mode properly using TAB again." diff --git a/html/changelogs/AutoChangeLog-pr-11350.yml b/html/changelogs/AutoChangeLog-pr-11350.yml deleted file mode 100644 index 54d750a6e7e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11350.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscadd: "SSvotes" - - rscadd: "SSradio" diff --git a/html/changelogs/AutoChangeLog-pr-11355.yml b/html/changelogs/AutoChangeLog-pr-11355.yml deleted file mode 100644 index 934e85808ba..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11355.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "Fixed an error message being inappropriately generated for admins when someone signs up as a pAI." diff --git a/html/changelogs/AutoChangeLog-pr-11360.yml b/html/changelogs/AutoChangeLog-pr-11360.yml deleted file mode 100644 index 3fb01b5b8f9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11360.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscadd: "SSevents" - - rscadd: "SSholiday" - - tweak: "We no longer check if its Christmas every tick. Dont ask." diff --git a/html/changelogs/AutoChangeLog-pr-11361.yml b/html/changelogs/AutoChangeLog-pr-11361.yml deleted file mode 100644 index 7207d6d5daf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11361.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscadd: "SSalarms" diff --git a/html/changelogs/AutoChangeLog-pr-11362.yml b/html/changelogs/AutoChangeLog-pr-11362.yml deleted file mode 100644 index 72282104dc1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11362.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "uc_guy" -delete-after: True -changes: - - bugfix: "Players in the lobby no longer see cult speak." diff --git a/html/changelogs/AutoChangeLog-pr-11364.yml b/html/changelogs/AutoChangeLog-pr-11364.yml deleted file mode 100644 index b331b4d009d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11364.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "object and fast processing are now proper subsystems" diff --git a/html/changelogs/AutoChangeLog-pr-11367.yml b/html/changelogs/AutoChangeLog-pr-11367.yml deleted file mode 100644 index 5d90a0b3f30..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11367.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Doctor delight and orange juice now heal again" diff --git a/html/changelogs/AutoChangeLog-pr-11384.yml b/html/changelogs/AutoChangeLog-pr-11384.yml new file mode 100644 index 00000000000..1dee1b49d8e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11384.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - rscadd: "Trying to latejoin a round with no open job slots now results in an informative error message, rather than broken-looking blank window." diff --git a/html/changelogs/AutoChangeLog-pr-11403.yml b/html/changelogs/AutoChangeLog-pr-11403.yml new file mode 100644 index 00000000000..2ffea4e8a9d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11403.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - tweak: "You can now identify when someone is using internals from a tank in their pocket, without having to remove the tank." diff --git a/html/changelogs/AutoChangeLog-pr-11415.yml b/html/changelogs/AutoChangeLog-pr-11415.yml new file mode 100644 index 00000000000..8a197f8f6f4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11415.yml @@ -0,0 +1,4 @@ +author: "Twinmold93" +delete-after: True +changes: + - rscadd: "Adds Server Time to the Status Tab for Admins." diff --git a/html/changelogs/AutoChangeLog-pr-11416.yml b/html/changelogs/AutoChangeLog-pr-11416.yml new file mode 100644 index 00000000000..c3c444d9879 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11416.yml @@ -0,0 +1,4 @@ +author: "KasparoVy" +delete-after: True +changes: + - rscadd: "Adds a verb to eyewear you can use to adjust them so they appear above or below masks. Discover interesting combinations and enjoy a cool look." diff --git a/html/changelogs/AutoChangeLog-pr-11418.yml b/html/changelogs/AutoChangeLog-pr-11418.yml new file mode 100644 index 00000000000..8e9f296ca97 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11418.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Patch Pack is now craftable with a cardboard, costs 2 cardboard sheets." diff --git a/html/changelogs/AutoChangeLog-pr-11425.yml b/html/changelogs/AutoChangeLog-pr-11425.yml new file mode 100644 index 00000000000..f3ed1d5bd9e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11425.yml @@ -0,0 +1,5 @@ +author: "Arkatos" +delete-after: True +changes: + - tweak: "Examine tooltip delay increased slightly" + - bugfix: "Examine tooltips now work properly on items in storage" diff --git a/html/changelogs/AutoChangeLog-pr-11426.yml b/html/changelogs/AutoChangeLog-pr-11426.yml new file mode 100644 index 00000000000..49414869223 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11426.yml @@ -0,0 +1,5 @@ +author: "Arkatos" +delete-after: True +changes: + - tweak: "Full toolbelts now spawn with randomly a colored cable coil" + - imageadd: "Added inhand sprites for belts" diff --git a/html/changelogs/AutoChangeLog-pr-11428.yml b/html/changelogs/AutoChangeLog-pr-11428.yml new file mode 100644 index 00000000000..fe0d3f99aac --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11428.yml @@ -0,0 +1,5 @@ +author: "Markolie" +delete-after: True +changes: + - rscadd: "Syndicate operatives may now purchase a chameleon bundles (2TC), which allows them to disguise not just their jumpsuit, but all of their equipment. They can change individual clothing as well as the outfit as a whole." + - tweak: "When using a voice changer, NTTC will no longer default to an \"Unknown\" job: it'll still use the assignment on your card to prevent meta-gaming. Always combine a voice changer and a Syndicate ID." diff --git a/html/changelogs/AutoChangeLog-pr-11429.yml b/html/changelogs/AutoChangeLog-pr-11429.yml new file mode 100644 index 00000000000..86509436332 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11429.yml @@ -0,0 +1,4 @@ +author: "Mitchs98" +delete-after: True +changes: + - rscadd: "You can now order a Pig Crate from Cargo for 25 points." diff --git a/html/changelogs/AutoChangeLog-pr-11431.yml b/html/changelogs/AutoChangeLog-pr-11431.yml new file mode 100644 index 00000000000..d9f93831773 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11431.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - imageadd: "Added 4 new plushies" diff --git a/html/changelogs/AutoChangeLog-pr-11434.yml b/html/changelogs/AutoChangeLog-pr-11434.yml new file mode 100644 index 00000000000..f07ba09cf41 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11434.yml @@ -0,0 +1,4 @@ +author: "TDSSS" +delete-after: True +changes: + - bugfix: "typo on sst shuttle console" diff --git a/html/changelogs/AutoChangeLog-pr-11442.yml b/html/changelogs/AutoChangeLog-pr-11442.yml new file mode 100644 index 00000000000..2cdaf2355fe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11442.yml @@ -0,0 +1,6 @@ +author: "EvadableMoxie" +delete-after: True +changes: + - rscadd: "Added the Nanotrasen Hospital Vessel Asclepius, able to be deployed by admins." + - tweak: "Admin shuttle now requires ERT clearance instead of admin clearance." + - tweak: "Admin shuttle now has a navigation computer and tiny fans at the airlock." diff --git a/html/changelogs/AutoChangeLog-pr-11443.yml b/html/changelogs/AutoChangeLog-pr-11443.yml new file mode 100644 index 00000000000..5c3a9a1b8e2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11443.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - bugfix: "punching a windoor no longer generates a runtime error." diff --git a/html/changelogs/AutoChangeLog-pr-11445.yml b/html/changelogs/AutoChangeLog-pr-11445.yml new file mode 100644 index 00000000000..30b9ae088e8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11445.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - bugfix: "cryogenic_liquid/envenomed_filaments blobs no longer generate runtimes when their blob special attack hits mobs that do not process reagents" diff --git a/html/changelogs/AutoChangeLog-pr-11450.yml b/html/changelogs/AutoChangeLog-pr-11450.yml new file mode 100644 index 00000000000..efa7b8c358e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11450.yml @@ -0,0 +1,12 @@ +author: "variableundefined" +delete-after: True +changes: + - tweak: "Simple animals actually use the new subsystem now" + - tweak: "What was NPCAI is now renamed to NPCPool - Its the functional equivalent of what it is in tg" + - tweak: "Simple animals actually run on subsystem instead of a process now." + - rscadd: "idleNPCpool has been added reducing performance impact of hostile simple animals" + - rscdel: "NPCAI Process (That run both SNPC and SimpleAnimals) that was somehow left out by me" + - rscdel: "SNPC & assocaited NPCAI Subsystem" + - rscdel: "Some of space hotel's functions." + - rscdel: "Bodysnatch gland." + - tweak: "process_ai has been deprecated" diff --git a/html/changelogs/AutoChangeLog-pr-11451.yml b/html/changelogs/AutoChangeLog-pr-11451.yml new file mode 100644 index 00000000000..347ccdf9b19 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11451.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "The steel_rain runtime fix has been re-applied." diff --git a/html/changelogs/__CHANGELOG_README.txt b/html/changelogs/__CHANGELOG_README.txt index 8f610ee9acf..2e919a6226d 100644 --- a/html/changelogs/__CHANGELOG_README.txt +++ b/html/changelogs/__CHANGELOG_README.txt @@ -15,5 +15,3 @@ TO MAKE A CHANGELOG .YML ENTRRY 5. When commiting make sure your .yml file is included in the commit (it will usually be unticked as an unversioned file) ####################################################### - -If you have trouble ask for help in #codertrain on the Paradise Station IRC. diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index b4d8a34a6e0..7bc556c628c 100644 Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index b09302e0234..1e321d40058 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/blob.dmi b/icons/mob/blob.dmi index 4797c79496e..809c68bd59b 100644 Binary files a/icons/mob/blob.dmi and b/icons/mob/blob.dmi differ diff --git a/icons/mob/carp.dmi b/icons/mob/carp.dmi new file mode 100644 index 00000000000..f5bb7f116b9 Binary files /dev/null and b/icons/mob/carp.dmi differ diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index 6f2cf056cec..06b2934ebde 100644 Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi index 169e9e6cbf3..3a558b90140 100644 Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/belt_lefthand.dmi b/icons/mob/inhands/equipment/belt_lefthand.dmi new file mode 100644 index 00000000000..366493eebde Binary files /dev/null and b/icons/mob/inhands/equipment/belt_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/belt_righthand.dmi b/icons/mob/inhands/equipment/belt_righthand.dmi new file mode 100644 index 00000000000..81b075f706e Binary files /dev/null and b/icons/mob/inhands/equipment/belt_righthand.dmi differ diff --git a/icons/mob/inhands/fluff_lefthand.dmi b/icons/mob/inhands/fluff_lefthand.dmi index 5f18b1623ab..c2604c8b57c 100644 Binary files a/icons/mob/inhands/fluff_lefthand.dmi and b/icons/mob/inhands/fluff_lefthand.dmi differ diff --git a/icons/mob/inhands/fluff_righthand.dmi b/icons/mob/inhands/fluff_righthand.dmi index 5b7005ab48f..b75a67a7d8e 100644 Binary files a/icons/mob/inhands/fluff_righthand.dmi and b/icons/mob/inhands/fluff_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 42fbccba2b0..35bd70efd28 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index fe096499427..0f2b8b0996d 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi index e22a631d6cd..b8169f9bd51 100644 Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ diff --git a/icons/obj/aibots.dmi b/icons/obj/aibots.dmi index 273fbf77133..9299c999342 100644 Binary files a/icons/obj/aibots.dmi and b/icons/obj/aibots.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index e1ca3d3380e..9315f8223af 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 02de48a6f41..469934ca932 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 8934666fddb..a7146793675 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 524418ba0e9..ccfa57790d9 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/nano/assets/nanoui.css b/nano/assets/nanoui.css index 598da509f43..158b96ef0ff 100644 --- a/nano/assets/nanoui.css +++ b/nano/assets/nanoui.css @@ -1,2 +1,2 @@ -@charset "utf-8";@font-face{font-family:'FontAwesome';src:url(fontawesome-webfont.eot?v=4.7.0);src:url(fontawesome-webfont.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(fontawesome-webfont.woff2?v=4.7.0) format('woff2'),url(fontawesome-webfont.woff?v=4.7.0) format('woff'),url(fontawesome-webfont.ttf?v=4.7.0) format('truetype'),url(fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul > li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:0.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:0.2em 0.25em 0.15em;border:solid 0.08em #eee;border-radius:0.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:0.3em}.fa.fa-pull-right{margin-left:0.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:0.3em}.fa.pull-right{margin-left:0.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.displayBar{position:relative;width:236px;height:16px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000}.displayBarText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:normal}.displayBarFill{width:0%;height:100%;background:#40628a;overflow:hidden;float:left}.displayBarFill.alignRight{float:right}.displayBarText.good{color:#fff}.displayBarText.notgood{color:#fff}.displayBarText.average{color:#fff}.displayBarText.bad{color:#fff}.displayBarText.highlight{color:#000}.displayBarFill.good{color:#fff;background:#4f7529}.displayBarFill.notgood{color:#fff;background:#ffb400}.displayBarFill.average{color:#fff;background:#cd6500}.displayBarFill.bad{color:#fff;background:#e00}.displayBarFill.highlight{color:#fff;background:#8ba5c4}.disabled,.link,.linkOff,.linkOn,.redButton,.selected,.yellowButton{float:left;min-width:15px;height:16px;text-align:center;color:#fff;text-decoration:none;background:#40628a;border:1px solid #161616;padding:0 4px 4px 4px;margin:0 2px 2px 0;cursor:default;white-space:nowrap}.hasIcon{padding:0 4px 4px 0}.linkActive.hover,.zoomLink.hover,a.hover{background:#507aac}@keyframes pendingAnimation{to{color:#fff;background:#507aac}}.linkPending,.linkPending.hover{animation-name:pendingAnimation;animation-duration:0.25s}a.white,a.white:active,a.white:link,a.white:visited{color:#40628a;text-decoration:none;background:#fff;border:1px solid #161616;padding:1px 4px 1px 4px;margin:0 2px 0 0;cursor:default}a.white.hover{color:#fff;background:#40628a}.linkOn,.selected,a.linkOn.hover,a.linkOn:active,a.linkOn:link,a.linkOn:visited,a.selected.hover,a.selected:active,a.selected:link,a.selected:visited{color:#fff;background:#2f943c}.disabled,.linkOff,a.disabled.hover,a.disabled:active,a.disabled:link,a.disabled:visited,a.linkOff.hover,a.linkOff:active,a.linkOff:link,a.linkOff:visited{color:#fff;background:#999;border-color:#666}.disabled.icon,.linkOff.icon,.linkOn.icon,.selected.icon,a.icon{position:relative;padding:1px 4px 2px 20px}.disabled.icon img,.linkOff.icon img,.linkOn.icon img,.selected.icon img,a.icon img{position:absolute;top:0;left:0;width:18px;height:18px}.linkDanger,a.linkDanger:active,a.linkDanger:link,a.linkDanger:visited{color:#fff;background-color:red;border-color:#a00}.linkDanger.hover{background-color:#f66}.inactive,a.inactive.hover,a.inactive:active,a.inactive:link,a.inactive:visited{color:#fff;background:#999;border-color:#666}.white{color:#fff;font-weight:bold}.good{color:#4f7529;font-weight:bold}.average{color:#cd6500;font-weight:bold}.bad{color:#e00;font-weight:bold}.idle{color:#272727;font-weight:bold}.redButton{background:#ea0000}.yellowButton{background:#cacc00}.highlight{color:#8ba5c4}.dark{color:#272727}.burn{color:orange}.brute{color:red}.toxin{color:green}.toxin_light{color:#3adf00}.oxyloss{color:#00f}.oxyloss_light{color:#6698ff}.Red{color:red}.Blue{color:#00f}.Green{color:#0f0}.Marigold{color:#fda505}.Fuschia{color:#ff0080}.Black{color:#000}.Pearl{color:#c6cacb}.cold1{color:#94b8ff}.cold2{color:#69f}.cold3{color:#293d66}.hot1{color:#f96}.hot2{color:#993d00}.hot3{color:#f60}div.display{padding:4px;margin:6px 0;background-color:#000;background-color:rgba(0, 0, 0, 0.33);box-shadow:inset 0 0 5px rgba(0, 0, 0, 0.5)}div.display header{display:block;position:relative;width:98.5%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}div.display header .buttonRight{position:absolute;bottom:6px;right:4px}div.display article{display:table;width:100%;border-collapse:collapse}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px;clear:both}.item{width:100%;margin:4px 0 0 0;clear:both;overflow:auto}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.block{padding:8px;margin:10px 4px 4px 4px;border:1px solid #40628a;background-color:#202020}.block h3{padding:0}.clearBoth{clear:both}.clearLeft{clear:left}.clearRight{clear:right}.line{width:100%;clear:both}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.floatRight{float:right}.floatLeft{float:left}.hidden{display:none}.statusDisplay{background:#000;background:rgba(0, 0, 0, 0.5);color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0;overflow:hidden}.statusDisplayRecords{background:#000;background:rgba(0, 0, 0, 0.5);color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0;overflow-x:hidden;overflow-y:auto}.statusLabel{width:138px;float:left;overflow:hidden;color:#98b0c3}.statusValue{float:left}.jobValues{float:left;width:30%}.fancy{display:none}i.fancy{display:none}.minimize{color:#e9c183;cursor:pointer!important;z-index:102;position:absolute;top:6px;right:46px}.minimize:hover{color:#b8c9d6}.close{color:#e9c183;cursor:pointer!important;z-index:102;position:absolute;top:4px;right:12px}.close:hover{color:#b8c9d6}#uiCornerTL{position:fixed;z-index:101;min-width:30px;min-height:30px;top:0;left:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGTGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTExLTIwVDIyOjM4OjI1LTA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOC0xMS0yMFQyMzowMzowMS0wODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOC0xMS0yMFQyMzowMzowMS0wODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpkOWRlMzc1Yi04ZWQwLWI3NDctOTQzZS0zN2UwZGU2NDkyODQiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo0ZmVhZjJmZC03YWVhLWUyNGQtYTNkZS05ZmI5ZGM0ZTA0YzIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjZTU4OTk5My1mZDU2LTEzNDktYWMyMC03NGZkZmY5NjNjYTgiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmNlNTg5OTkzLWZkNTYtMTM0OS1hYzIwLTc0ZmRmZjk2M2NhOCIgc3RFdnQ6d2hlbj0iMjAxOC0xMS0yMFQyMjozODoyNS0wODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvZ2lmIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZDlkZTM3NWItOGVkMC1iNzQ3LTk0M2UtMzdlMGRlNjQ5Mjg0IiBzdEV2dDp3aGVuPSIyMDE4LTExLTIwVDIzOjAzOjAxLTA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+QnRKRAAAAIhJREFUSIm1zLcRgEAMBMCDokQf9B/SBwQwmOeNzGkL2GnHhgSLrHPSC4Bfny+/vl9y/X6ZdfHS6v/LqasvoW690brzhur+66+Hr7PWvJ5a+Zpr/WurTa+htr7a2vGqat87rt3voI68vTr4Nuv4W68pb6VmvWVNfD81931q+nvVGS+ASUQyXgAHuOgYYwOkhIYAAAAASUVORK5CYII=) no-repeat}.resizeArea{position:absolute;z-index:99999}.resizeArea.top{top:0;left:10px;right:10px;height:5px;cursor:n-resize}.resizeArea.tr{top:0;right:0;height:10px;width:10px;cursor:ne-resize}.resizeArea.right{top:10px;right:0;bottom:10px;width:5px;cursor:e-resize}.resizeArea.br{bottom:0;right:0;height:10px;width:10px;cursor:se-resize}.resizeArea.bottom{bottom:0;left:10px;right:10px;height:5px;cursor:s-resize}.resizeArea.bl{bottom:0;left:0;height:10px;width:10px;cursor:sw-resize}.resizeArea.left{top:10px;left:0;bottom:10px;width:5px;cursor:w-resize}.resizeArea.tl{top:0;left:0;height:10px;width:10px;cursor:nw-resize}.uiLinkPendingIcon{display:none;float:left;width:16px;height:16px;margin:2px 2px 0 2px;background-image:url(uiLinkPendingIcon.gif)}.linkPending .fa{display:none}.linkPending .uiLinkPendingIcon{display:block}.mapIcon16{position:absolute;width:16px;height:16px;background-image:url(uiIcons16Green.png);background-position:-144px -96px;background-repeat:no-repeat;zoom:0.125;margin-left:-1px}.mapIcon16.dead{background-image:url(uiIcons16Red.png)}.mapIcon16.bad{background-image:url(uiIcons16Red.png)}.mapIcon16.average{background-image:url(uiIcons16Orange.png)}.mapIcon16.good{background-image:url(uiIcons16Green.png)}.mapIcon16.icon-airalarm{background-position:0 -144px}.mapIcon16.rank-captain{background-position:-224px -112px}.mapIcon16.rank-headofpersonnel{background-position:-112px -96px}.mapIcon16.rank-headofsecurity{background-position:-112px -128px}.mapIcon16.rank-chiefengineer{background-position:-176px -112px}.mapIcon16.rank-researchdirector{background-position:-128px -128px}.mapIcon16.rank-chiefmedicalofficer{background-position:-32px -128px}.mapIcon16.rank-stationengineer{background-position:-176px -112px}.mapIcon16.rank-atmospherictechnician{background-position:-176px -112px}.mapIcon16.rank-medicaldoctor{background-position:-32px -128px}.mapIcon16.rank-geneticist{background-position:-32px -128px}.mapIcon16.rank-psychiatrist{background-position:-32px -128px}.mapIcon16.rank-chemist{background-position:-32px -128px}.mapIcon16.rank-scientist{background-position:-128px -128px}.mapIcon16.rank-geneticist{background-position:-128px -128px}.mapIcon16.rank-roboticist{background-position:-128px -128px}.mapIcon16.rank-xenobiologist{background-position:-128px -128px}.mapIcon16.rank-warden{background-position:-112px -128px}.mapIcon16.rank-detective{background-position:-112px -128px}.mapIcon16.rank-securityofficer{background-position:-112px -128px}ul{padding:4px 0 0 10px;margin:0;list-style-type:none}li{padding:0 0 2px 0}table.fixed{table-layout:fixed}table.fixed td{overflow:hidden}table.pmon{border:2px solid #4169e1}table.pmon td,table.pmon th{border-bottom:1px dotted #000;padding:0 5px 0 5px}th.command{background:#33f;font-weight:bold;color:#fff}th.sec{background:#8e0000;font-weight:bold;color:#fff}th.med{background:#060;font-weight:bold;color:#fff}th.eng{background:#b27300;font-weight:bold;color:#fff}th.sci{background:#a65ba6;font-weight:bold;color:#fff}th.ser{background:#7100aa;font-weight:bold;color:#fff}th.sup{background:#666621;font-weight:bold;color:#fff}th.civ{background:#a32800;font-weight:bold;color:#fff}th.misc{background:#666;font-weight:bold;color:#fff}span.qm-job{color:#b77a41;font-weight:bold}.striped tr:nth-child(even){background-color:#404040}.striped:not(table) > :nth-child(even){background-color:#404040}#uiNoScript{position:fixed;top:50%;left:50%;margin:-60px 0 0 -150px;width:280px;height:120px;background:#fff;border:2px solid red;color:#000;font-size:10px;font-weight:bold;z-index:9999;padding:0 10px;text-align:center}.notice{position:relative;background:url(uiNoticeBackground.jpg) 50% 50%;color:#000;font-size:12px;font-style:italic;font-weight:bold;padding:3px 4px 3px 4px;margin:4px 0 4px 0}.noticePlaceholder{position:relative;font-size:12px;font-style:italic;font-weight:bold;padding:3px 4px 3px 4px;margin:4px 0 4px 0}.notice.icon{padding:2px 4px 0 20px}.notice img{position:absolute;top:0;left:0;width:16px;height:16px}div.notice{clear:both}.wholeScreen{position:absolute;color:#517087;font-size:16px;font-weight:bold;text-align:center}.pdalink{float:left;white-space:nowrap;cursor:default!important}.pdalink.disabled{background:none;border:none;color:#999;text-align:left}.pdanote{color:#cd6500;font-weight:bold}.item.mainmenu{padding-bottom:0.5em}div.clock{color:#fff;font-weight:bold;float:right;padding-right:2em}#pdaFooter{position:fixed;left:0;bottom:0;width:100%;background:#272727}.pdaFooterButton{width:33%;padding:0.5em 0;font-size:200%;border:none;background:none;color:#fff}.pdaFooterButton.hover{background:#507aac}.pdaFooterButton.disabled{background:none!important;color:#555!important}.pdaFooterButton .uiLinkPendingIcon{position:absolute;width:33%;background-repeat:no-repeat;background-position:center}.dnaBlock{float:left;width:90px;padding:0 0 5px 0}.dnaBlockNumber{font-family:Fixed,monospace;float:left;color:#fff;background:#363636;min-width:20px;height:20px;padding:0;text-align:center}.dnaSubBlock{font-family:Fixed,monospace;float:left;padding:0;min-width:16px;height:20px;text-align:center}.mask{position:fixed;left:0;top:0;width:100%;height:100%;background:url(uiMaskBackground.png)}.maskContent{width:100%;height:200px;margin:200px 0;text-align:center}body{color:#fff;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;margin:0;padding:0}hr{background-color:#40628a;height:1px;border:none}a img,img{border-style:none}h1,h2,h3,h4,h5,h6{margin:0;padding:12px 0 6px 0;color:#fff;clear:both}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}*[data-tooltip]{position:relative}*[data-tooltip]::after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";opacity:0;white-space:normal;text-align:left;content:attr(data-tooltip);transition:all 0.5s;border:1px solid #999;background-color:#363636}*[data-tooltip]:hover::after{visibility:visible;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";opacity:1}*[data-tooltip].tooltipTop::after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}*[data-tooltip].tooltipTop:hover::after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}*[data-tooltip].tooltipBottom::after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}*[data-tooltip].tooltipBottom:hover::after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}*[data-tooltip].tooltipLeft::after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}*[data-tooltip].tooltipLeft:hover::after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}*[data-tooltip].tooltipRight::after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}*[data-tooltip].tooltipRight:hover::after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}.mainBG{position:fixed;z-index:-1;top:30px;left:0;right:0;bottom:0;background:url(data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0D%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.0%22%20viewBox%3D%220%200%20425%20200%22%20opacity%3D%22.25%22%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20178.00399%2C0.03869%20-71.20393%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76134%2C6.02555%20l%200%2C187.87147%20a%206.7613422%2C6.0255495%200%200%200%206.76134%2C6.02554%20l%2053.1072%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-101.544018%2072.21628%2C104.699398%20a%206.7613422%2C6.0255495%200%200%200%205.76015%2C2.87016%20l%2073.55487%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-187.87147%20a%206.7613422%2C6.0255495%200%200%200%20-6.76135%2C-6.02555%20l%20-54.71644%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76133%2C6.02555%20l%200%2C102.61935%20L%20183.76413%2C2.90886%20a%206.7613422%2C6.0255495%200%200%200%20-5.76014%2C-2.87017%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22M%204.8446333%2C22.10875%20A%2013.412039%2C12.501842%200%200%201%2013.477588%2C0.03924%20l%2066.118315%2C0%20a%205.3648158%2C5.000737%200%200%201%205.364823%2C5.00073%20l%200%2C79.87931%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20420.15535%2C177.89119%20a%2013.412038%2C12.501842%200%200%201%20-8.63295%2C22.06951%20l%20-66.11832%2C0%20a%205.3648152%2C5.000737%200%200%201%20-5.36482%2C-5.00074%20l%200%2C-79.87931%20z%22%20%2F%3E%0D%0A%3C%2Fsvg%3E%0D%0A) no-repeat fixed center/70% 70%,linear-gradient(to bottom, #2a2a2a 0, #202020 100%) no-repeat fixed center/100% 100%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a', endColorstr='#ff202020', GradientType=0)}body,html{scrollbar-face-color:#666;scrollbar-arrow-color:#e9c183;scrollbar-track-color:#363636;scrollbar-shadow-color:#555}#uiWrapper{width:100%;height:100%;-ms-user-select:none;user-select:none}#uiTitleWrapper{position:fixed;min-height:30px;min-width:100%;background-color:#363636;left:0;top:0;right:0;overflow:hidden;z-index:100}#uiTitleWrapper > div{cursor:default}#uiTitleWrapper > i{cursor:default}#uiTitleText{position:absolute;top:6px;left:44px;width:66%;overflow:hidden;color:#e9c183;font-size:16px}#uiTitle.icon{padding:6px 8px 6px 42px;background-position:2px 50%;background-repeat:no-repeat}#uiTitleFluff{position:absolute;top:4px;right:12px;width:42px;height:24px;background:url(data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0D%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.0%22%20viewBox%3D%220%200%20425%20200%22%20opacity%3D%22.25%22%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20178.00399%2C0.03869%20-71.20393%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76134%2C6.02555%20l%200%2C187.87147%20a%206.7613422%2C6.0255495%200%200%200%206.76134%2C6.02554%20l%2053.1072%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-101.544018%2072.21628%2C104.699398%20a%206.7613422%2C6.0255495%200%200%200%205.76015%2C2.87016%20l%2073.55487%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-187.87147%20a%206.7613422%2C6.0255495%200%200%200%20-6.76135%2C-6.02555%20l%20-54.71644%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76133%2C6.02555%20l%200%2C102.61935%20L%20183.76413%2C2.90886%20a%206.7613422%2C6.0255495%200%200%200%20-5.76014%2C-2.87017%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22M%204.8446333%2C22.10875%20A%2013.412039%2C12.501842%200%200%201%2013.477588%2C0.03924%20l%2066.118315%2C0%20a%205.3648158%2C5.000737%200%200%201%205.364823%2C5.00073%20l%200%2C79.87931%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20420.15535%2C177.89119%20a%2013.412038%2C12.501842%200%200%201%20-8.63295%2C22.06951%20l%20-66.11832%2C0%20a%205.3648152%2C5.000737%200%200%201%20-5.36482%2C-5.00074%20l%200%2C-79.87931%20z%22%20%2F%3E%0D%0A%3C%2Fsvg%3E%0D%0A) 50% 50% no-repeat}.statusicon{position:absolute;top:4px;left:12px}#uiMapWrapper{clear:both;padding:8px;margin-top:30px}#uiMapHeader{position:relative;clear:both}#uiMapContainer{position:relative;width:100%;height:600px;overflow:hidden;border:1px solid #40628a;background:url(nanomapBackground.png)}#uiMap{position:absolute;top:50%;left:50%;margin:-512px 0 0 -512px;width:256px;height:256px;overflow:hidden;zoom:4}#uiMapImage{position:absolute;bottom:1px;left:1px;width:256px;height:256px}#uiMapContent{position:absolute;bottom:-13.5px;left:0;width:256px;height:256px}#uiMapFooter{position:relative;clear:both}#uiContent{clear:both;padding:8px;margin-top:30px}#uiMapTooltip{position:absolute;right:10px;top:10px;border:1px solid #40628a;background-color:#272727;padding:8px;display:none;z-index:9999}#uiLoadingNotice{position:relative;background:url(uiNoticeBackground.jpg) 50% 50%;color:#000;font-size:14px;font-style:italic;font-weight:bold;padding:3px 4px 3px 4px;margin:4px 0 4px 0}.underTitle{margin-top:30px} -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhdGgubGVzcyIsInNjcmVlbi1yZWFkZXIubGVzcyIsImNvcmUubGVzcyIsImxhcmdlci5sZXNzIiwiZml4ZWQtd2lkdGgubGVzcyIsImxpc3QubGVzcyIsImJvcmRlcmVkLXB1bGxlZC5sZXNzIiwiYW5pbWF0ZWQubGVzcyIsIm1peGlucy5sZXNzIiwibmFub3VpLmNzcyIsInJvdGF0ZWQtZmxpcHBlZC5sZXNzIiwic3RhY2tlZC5sZXNzIiwiaWNvbnMubGVzcyIsIl9iYXJzLmxlc3MiLCJfbGluay5sZXNzIiwiX2NvbG9yLmxlc3MiLCJfZGlzcGxheS5sZXNzIiwiX2Zvcm1hdHRpbmcubGVzcyIsIl9mYW5jeS5sZXNzIiwiX2ljb24ubGVzcyIsIl9saXN0cy5sZXNzIiwiX21pc2MubGVzcyIsIl9uYXRpdmUubGVzcyIsIl90b29sdGlwLmxlc3MiLCI8bm8gc291cmNlPiIsIm5hbm91aS5sZXNzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJpQkFHQSxXQUNFLFlBQUEsY0FDQSxJQUFBLHFDQUNBLElBQUEsNENBQUEsMkJBQUEsQ0FBQSx1Q0FBQSxlQUFBLENBQUEsc0NBQUEsY0FBQSxDQUFBLHFDQUFBLGtCQUFBLENBQUEsd0RBQUEsY0FNQSxZQUFBLE9BQ0EsV0FBQSxPQ2JELElDSUMsUUFBQSxhQUNBLEtBQUEsT0FBQSxPQUFBLE9BQUEsSUFBQSxDQUFBLEVBQUEsWUFDQSxVQUFBLFFBQ0EsZUFBQSxLQUNBLHVCQUFBLFlBQ0Esd0JBQUEsVURURCxPRUtDLFVBQUEsYUFDQSxZQUFBLE9BQ0EsZUFBQSxLRlBELE9FU3NCLFVBQUEsSUZUdEIsT0VVc0IsVUFBQSxJRlZ0QixPRVdzQixVQUFBLElGWHRCLE9FWXNCLFVBQUEsSUZadEIsT0dHQyxNQUFBLGFBQ0EsV0FBQSxPSEpELE9JSUMsYUFBQSxFQUNBLFlBQUEsYUFDQSxnQkFBQSxLSk5ELFlJT1EsU0FBQSxTSlBSLE9JVUMsU0FBQSxTQUNBLEtBQUEsY0FDQSxNQUFBLGFBQ0EsSUFBQSxhQUNBLFdBQUEsT0pkRCxhSWdCRyxLQUFBLGNKaEJILFdLSUMsUUFBQSxNQUFBLE9BQUEsT0FDQSxPQUFBLE1BQUEsT0FBQSxLQUNBLGNBQUEsTUxORCxjS1M2QixNQUFBLEtMVDdCLGVLVThCLE1BQUEsTUxWOUIsaUJLYWdDLGFBQUEsTUxiaEMsa0JLY2lDLFlBQUEsTUFJbEMsWUFBYyxNQUFBLE1BQ2QsV0FBYSxNQUFBLEtBR1gsY0FBYyxhQUFBLE1BQ2QsZUFBZSxZQUFBLE1MdkJoQixTTUtTLFVBQUEsUUFBQSxHQUFBLFNBQUEsT05MVCxVTVVTLFVBQUEsUUFBQSxHQUFBLFNBQUEsU0FjVixtQkFDRSxHQUVVLFVBQUEsVUFFVixLQUVVLFVBQUEsZ0JOL0JYLGNPY0MsV0FBQSwyREFFSSxjQUFBLGNBQ0ksVUFBQSxjUGpCVCxlT2NDLFdBQUEsMkRBRUksY0FBQSxlQUNJLFVBQUEsZVBqQlQsZU9jQyxXQUFBLDJEQUVJLGNBQUEsZUFDSSxVQUFBLGVQakJULG9CT3FCQyxXQUFBLHFFQUVJLGNBQUEsYUFDSSxVQUFBLGFQeEJULGtCT3FCQyxXQUFBLHFFQUVJLGNBQUEsYUFDSSxVQUFBLGFDNkdWLDBCQUNBLHdCQUhBLHFCQUNBLHFCUnBJQyxvQlNrQkMsT0FBQSxLVGxCRCxVVUlDLFNBQUEsU0FDQSxRQUFBLGFBQ0EsTUFBQSxJQUNBLE9BQUEsSUFDQSxZQUFBLElBQ0EsZUFBQSxPVlRELGFRa0pELGFFdElFLFNBQUEsU0FDQSxLQUFBLEVBQ0EsTUFBQSxLQUNBLFdBQUEsT1ZmRCxhVWlCNEIsWUFBQSxRVmpCNUIsYVVrQjRCLFVBQUEsSVZsQjVCLFlVbUIyQixNQUFBLEtWbkIzQixpQldHZ0MsUUFBQSxRWEhoQyxpQldJZ0MsUUFBQSxRWEpoQyxrQldLaUMsUUFBQSxRWExqQyxzQldNcUMsUUFBQSxRWE5yQyxpQldPZ0MsUUFBQSxRWFBoQyxnQldRK0IsUUFBQSxRWFIvQixrQldTaUMsUUFBQSxRWFRqQyxnQldVK0IsUUFBQSxRWFYvQixnQldXK0IsUUFBQSxRWFgvQixvQldZbUMsUUFBQSxRWFpuQyxjV2E2QixRQUFBLFFYYjdCLG1CV2NrQyxRQUFBLFFYZGxDLGlCV2VnQyxRQUFBLFFINExqQyxpQlIzTUMsa0JRNE1ELGlCRzFMaUMsUUFBQSxRWGxCaEMsdUJXbUJzQyxRQUFBLFFYbkJ0Qyx3QldvQnVDLFFBQUEsUVhwQnZDLHFCV3FCb0MsUUFBQSxRWHJCcEMsa0JXc0JpQyxRQUFBLFFIc01sQyxlUjVOQyxnQld3QjhCLFFBQUEsUVh4QjlCLG1CV3lCa0MsUUFBQSxRWHpCbEMsZ0JXMEIrQixRQUFBLFFYMUIvQixrQlcyQmlDLFFBQUEsUVgzQmpDLG1CVzRCa0MsUUFBQSxRWDVCbEMsZ0JXNkIrQixRQUFBLFFYN0IvQixvQlc4Qm1DLFFBQUEsUVg5Qm5DLCtCVytCOEMsUUFBQSxRWC9COUMsNkJXZ0M0QyxRQUFBLFFYaEM1QyxpQldpQ2dDLFFBQUEsUVhqQ2hDLHlCV2tDd0MsUUFBQSxRSDROekMsa0JSOVBDLHdCV29DaUMsUUFBQSxRWHBDakMsbUJXcUNrQyxRQUFBLFFYckNsQyxvQldzQ21DLFFBQUEsUVh0Q25DLGdCV3VDK0IsUUFBQSxRWHZDL0IsZ0JXd0MrQixRQUFBLFFYeEMvQixzQld5Q3FDLFFBQUEsUVh6Q3JDLHNCVzBDcUMsUUFBQSxRWDFDckMsdUJXMkNzQyxRQUFBLFFYM0N0QyxxQlc0Q29DLFFBQUEsUVg1Q3BDLGtCVzZDaUMsUUFBQSxRWDdDakMsbUJXOENrQyxRQUFBLFFYOUNsQyxlVytDOEIsUUFBQSxRWC9DOUIsZ0JXZ0QrQixRQUFBLFFYaEQvQixnQldpRCtCLFFBQUEsUVhqRC9CLG9CV2tEbUMsUUFBQSxRWGxEbkMsaUJXbURnQyxRQUFBLFFYbkRoQyxrQldvRGlDLFFBQUEsUVhwRGpDLGdCV3FEK0IsUUFBQSxRWHJEL0IsZ0JXc0QrQixRQUFBLFFYdEQvQixrQld1RGlDLFFBQUEsUVh2RGpDLHVCV3dEc0MsUUFBQSxRWHhEdEMsc0JXeURxQyxRQUFBLFFYekRyQyxzQlcwRHFDLFFBQUEsUVgxRHJDLHdCVzJEdUMsUUFBQSxRWDNEdkMsdUJXNERzQyxRQUFBLFFYNUR0Qyx5Qlc2RHdDLFFBQUEsUVg3RHhDLGdCVzhEK0IsUUFBQSxRWDlEL0Isa0JRZ1ZELG1CR2hSbUMsUUFBQSxRWGhFbEMsa0JXaUVpQyxRQUFBLFFYakVqQyx3QldrRXVDLFFBQUEsUUh3UnhDLGlCUjFWQyxpQlEyVkQscUJHdFJxQyxRQUFBLFFYckVwQyxrQldzRWlDLFFBQUEsUVh0RWpDLHNCV3VFcUMsUUFBQSxRWHZFckMsa0JXd0VpQyxRQUFBLFFYeEVqQyxnQld5RStCLFFBQUEsUVh6RS9CLGdCUTJXRCwyQkdoUzJDLFFBQUEsUVgzRTFDLDBCVzRFeUMsUUFBQSxRWDVFekMsMEJXNkV5QyxRQUFBLFFYN0V6QyxrQlc4RWlDLFFBQUEsUVg5RWpDLHlCVytFd0MsUUFBQSxRWC9FeEMseUJXZ0Z3QyxRQUFBLFFYaEZ4QyxvQldpRm1DLFFBQUEsUVhqRm5DLGdCV2tGK0IsUUFBQSxRWGxGL0IsaUJXbUZnQyxRQUFBLFFYbkZoQyxnQldvRitCLFFBQUEsUVhwRi9CLG1CV3FGa0MsUUFBQSxRWHJGbEMsd0JXc0Z1QyxRQUFBLFFYdEZ2Qyx3Qld1RnVDLFFBQUEsUVh2RnZDLGlCV3dGZ0MsUUFBQSxRWHhGaEMsd0JXeUZ1QyxRQUFBLFFYekZ2Qyx5QlcwRndDLFFBQUEsUVgxRnhDLHVCVzJGc0MsUUFBQSxRWDNGdEMsd0JXNEZ1QyxRQUFBLFFYNUZ2Qyx3Qlc2RnVDLFFBQUEsUVg3RnZDLHdCVzhGdUMsUUFBQSxRWDlGdkMsMkJXK0YwQyxRQUFBLFFYL0YxQyx1QldnR3NDLFFBQUEsUVhoR3RDLHNCV2lHcUMsUUFBQSxRWGpHckMsMEJXa0d5QyxRQUFBLFFYbEd6QywwQldtR3lDLFFBQUEsUVhuR3pDLGVXb0c4QixRQUFBLFFYcEc5QixzQldxR3FDLFFBQUEsUVhyR3JDLHVCV3NHc0MsUUFBQSxRWHRHdEMsb0JXdUdtQyxRQUFBLFFYdkduQyxzQld3R3FDLFFBQUEsUVh4R3JDLHdCUXNjRCxpQkc1VmlDLFFBQUEsUVgxR2hDLGtCVzJHaUMsUUFBQSxRWDNHakMsb0JXNEdtQyxRQUFBLFFYNUduQyxnQlc2RytCLFFBQUEsUVg3Ry9CLGlCVzhHZ0MsUUFBQSxRWDlHaEMsb0JXK0dtQyxRQUFBLFFYL0duQyw4QldnSDZDLFFBQUEsUVhoSDdDLGdCV2lIK0IsUUFBQSxRWGpIL0IsZ0JXa0grQixRQUFBLFFYbEgvQixnQldtSCtCLFFBQUEsUVhuSC9CLGVXb0g4QixRQUFBLFFYcEg5QixxQldxSG9DLFFBQUEsUUhzWHJDLGdDUjNlQyxtQld1SCtDLFFBQUEsUVh2SC9DLGlCV3dIZ0MsUUFBQSxRWHhIaEMsb0JXeUhtQyxRQUFBLFFYekhuQyxrQlcwSGlDLFFBQUEsUVgxSGpDLG1CVzJIa0MsUUFBQSxRWDNIbEMsa0JXNEhpQyxRQUFBLFFYNUhqQyxzQlc2SHFDLFFBQUEsUVg3SHJDLHdCVzhIdUMsUUFBQSxRWDlIdkMsbUJXK0hrQyxRQUFBLFFYL0hsQyx5QldnSXdDLFFBQUEsUVhoSXhDLGtCV2lJaUMsUUFBQSxRWGpJakMsdUJXa0lzQyxRQUFBLFFYbEl0QyxvQldtSW1DLFFBQUEsUVhuSW5DLG9CV29JbUMsUUFBQSxRWHBJbkMsdUJRc2hCRCxxQkdoWnFDLFFBQUEsUVh0SXBDLDBCV3VJeUMsUUFBQSxRWHZJekMsMkJXd0kwQyxRQUFBLFFYeEkxQyx3Qld5SXVDLFFBQUEsUVh6SXZDLGVXMEk4QixRQUFBLFFINFovQixnQlJ0aUJDLGlCVzRJK0IsUUFBQSxRWDVJL0Isb0JXNkltQyxRQUFBLFFYN0luQyx1Qlc4SXNDLFFBQUEsUVg5SXRDLHlCVytJd0MsUUFBQSxRWC9JeEMscUJXZ0pvQyxRQUFBLFFYaEpwQyxtQldpSmtDLFFBQUEsUVhqSmxDLG9CV2tKbUMsUUFBQSxRWGxKbkMsMkJXbUowQyxRQUFBLFFYbkoxQyxzQldvSnFDLFFBQUEsUVhwSnJDLHlCV3FKd0MsUUFBQSxRWHJKeEMsbUJXc0prQyxRQUFBLFFYdEpsQyxrQld1SmlDLFFBQUEsUVh2SmpDLHlCV3dKd0MsUUFBQSxRWHhKeEMsa0JXeUppQyxRQUFBLFFYekpqQyxtQlcwSmtDLFFBQUEsUVgxSmxDLGlCVzJKZ0MsUUFBQSxRWDNKaEMsb0JXNEptQyxRQUFBLFFYNUpuQyxzQlc2SnFDLFFBQUEsUVg3SnJDLHdCVzhKdUMsUUFBQSxRWDlKdkMsbUJXK0prQyxRQUFBLFFYL0psQyxzQlFtbUJELG9CR2xjb0MsUUFBQSxRWGpLbkMsa0JXa0tpQyxRQUFBLFFYbEtqQyxrQldtS2lDLFFBQUEsUVhuS2pDLHVCV29Lc0MsUUFBQSxRWHBLdEMsZ0JRZ25CRCxlRzFjK0IsUUFBQSxRWHRLOUIsaUJXdUtnQyxRQUFBLFFYdktoQyxvQld3S21DLFFBQUEsUVh4S25DLGdCV3lLK0IsUUFBQSxRWHpLL0IsdUJXMEtzQyxRQUFBLFFYMUt0Qyx3QlcyS3VDLFFBQUEsUVgzS3ZDLHVCVzRLc0MsUUFBQSxRWDVLdEMscUJXNktvQyxRQUFBLFFYN0twQyx1Qlc4S3NDLFFBQUEsUVg5S3RDLDZCVytLNEMsUUFBQSxRWC9LNUMsOEJXZ0w2QyxRQUFBLFFYaEw3QywyQldpTDBDLFFBQUEsUVhqTDFDLDZCV2tMNEMsUUFBQSxRWGxMNUMsaUJXbUxnQyxRQUFBLFFYbkxoQyxrQldvTGlDLFFBQUEsUVhwTGpDLGlCV3FMZ0MsUUFBQSxRWHJMaEMsa0JXc0xpQyxRQUFBLFFYdExqQyxxQld1TG9DLFFBQUEsUVh2THBDLHNCV3dMcUMsUUFBQSxRWHhMckMsaUJRMHFCRCxpQkdoZmlDLFFBQUEsUVgxTGhDLGlCUThxQkQsZ0JHbGZnQyxRQUFBLFFYNUwvQixpQlc2TGdDLFFBQUEsUVg3TGhDLGlCVzhMZ0MsUUFBQSxRWDlMaEMsZVF3ckJELG9CR3hmb0MsUUFBQSxRWGhNbkMsZ0JRNHJCRCxtQkcxZm1DLFFBQUEsUVhsTWxDLHFCV21Nb0MsUUFBQSxRSGdnQnJDLG9CUm5zQkMsZ0JXcU1tQyxRQUFBLFFYck1uQyxrQldzTWlDLFFBQUEsUUhxZ0JsQyxnQlIzc0JDLG1CUTBzQkQsbUJHamdCZ0MsUUFBQSxRWHpNL0IsbUJXME1rQyxRQUFBLFFYMU1sQyxtQlcyTWtDLFFBQUEsUVgzTWxDLHlCVzRNd0MsUUFBQSxRWDVNeEMscUJXNk1vQyxRQUFBLFFYN01wQyxpQlc4TWdDLFFBQUEsUVg5TWhDLGlCVytNZ0MsUUFBQSxRWC9NaEMsaUJXZ05nQyxRQUFBLFFYaE5oQyxxQldpTm9DLFFBQUEsUVhqTnBDLDRCV2tOMkMsUUFBQSxRWGxOM0MsOEJXbU42QyxRQUFBLFFYbk43Qyx1QldvTnNDLFFBQUEsUVhwTnRDLGlCV3FOZ0MsUUFBQSxRWHJOaEMsc0JXc05xQyxRQUFBLFFYdE5yQyxvQld1Tm1DLFFBQUEsUVh2Tm5DLHNCV3dOcUMsUUFBQSxRWHhOckMsdUJXeU5zQyxRQUFBLFFYek50QyxtQlcwTmtDLFFBQUEsUUh3aUJuQyxnQlJsd0JDLG9CVzROK0IsUUFBQSxRSDBpQmhDLHFCUnR3QkMscUJXOE5vQyxRQUFBLFFINGlCckMsb0JSMXdCQyxtQldnT21DLFFBQUEsUVhoT25DLG9CV2lPbUMsUUFBQSxRWGpPbkMsb0JXa09tQyxRQUFBLFFYbE9uQyx1QlFveEJELGdCR2hqQmdDLFFBQUEsUUhvakJoQyxpQlJ4eEJDLGlCV3NPZ0MsUUFBQSxRWHRPaEMscUJRNHhCRCxzQkdwakJzQyxRQUFBLFFYeE9yQyxxQld5T29DLFFBQUEsUVh6T3BDLHNCVzBPcUMsUUFBQSxRSDRqQnRDLGdCUnR5QkMsaUJXNE8rQixRQUFBLFFYNU8vQixtQlc2T2tDLFFBQUEsUVg3T2xDLG9CVzhPbUMsUUFBQSxRSGtrQnBDLHFCUmh6QkMsaUJXZ1BvQyxRQUFBLFFYaFBwQyx1QldpUHNDLFFBQUEsUVhqUHRDLG9CV2tQbUMsUUFBQSxRWGxQbkMsMEJXbVB5QyxRQUFBLFFYblB6Qyx3QldvUHVDLFFBQUEsUVhwUHZDLG1CV3FQa0MsUUFBQSxRWHJQbEMsdUJXc1BzQyxRQUFBLFFYdFB0QyxvQld1UG1DLFFBQUEsUVh2UG5DLGtCV3dQaUMsUUFBQSxRWHhQakMsa0JXeVBpQyxRQUFBLFFYelBqQyxtQlcwUGtDLFFBQUEsUVgxUGxDLHVCVzJQc0MsUUFBQSxRWDNQdEMsc0JXNFBxQyxRQUFBLFFYNVByQyxzQlc2UHFDLFFBQUEsUVg3UHJDLHFCVzhQb0MsUUFBQSxRWDlQcEMsa0JXK1BpQyxRQUFBLFFYL1BqQyx1QldnUXNDLFFBQUEsUVhoUXRDLGdCV2lRK0IsUUFBQSxRWGpRL0Isb0JXa1FtQyxRQUFBLFFYbFFuQyx1QldtUXNDLFFBQUEsUVhuUXRDLDZCV29RNEMsUUFBQSxRWHBRNUMsOEJXcVE2QyxRQUFBLFFYclE3QywyQldzUTBDLFFBQUEsUVh0UTFDLDZCV3VRNEMsUUFBQSxRWHZRNUMsc0JXd1FxQyxRQUFBLFFYeFFyQyx1Qld5UXNDLFFBQUEsUVh6UXRDLG9CVzBRbUMsUUFBQSxRWDFRbkMsc0JXMlFxQyxRQUFBLFFYM1FyQyxtQlc0UWtDLFFBQUEsUVg1UWxDLGtCVzZRaUMsUUFBQSxRWDdRakMsa0JXOFFpQyxRQUFBLFFYOVFqQyx3QlE4NEJELGtCRzluQmtDLFFBQUEsUVhoUmpDLG9CV2lSbUMsUUFBQSxRWGpSbkMsc0JXa1JxQyxRQUFBLFFYbFJyQyx1QldtUnNDLFFBQUEsUVhuUnRDLG1CV29Sa0MsUUFBQSxRWHBSbEMsa0JXcVJpQyxRQUFBLFFYclJqQyxzQlFpNkJELGlCRzFvQmlDLFFBQUEsUVh2UmhDLHNCV3dScUMsUUFBQSxRWHhSckMsb0JXeVJtQyxRQUFBLFFYelJuQyx5QlcwUndDLFFBQUEsUVgxUnhDLG1CVzJSa0MsUUFBQSxRWDNSbEMsbUJXNFJrQyxRQUFBLFFYNVJsQyxpQlc2UmdDLFFBQUEsUVg3UmhDLG1CVzhSa0MsUUFBQSxRWDlSbEMsc0JXK1JxQyxRQUFBLFFYL1JyQyxrQldnU2lDLFFBQUEsUVhoU2pDLDBCV2lTeUMsUUFBQSxRWGpTekMsb0JXa1NtQyxRQUFBLFFYbFNuQyxnQldtUytCLFFBQUEsUVhuUy9CLDBCUXk4QkQscUJHcHFCcUMsUUFBQSxRWHJTcEMsMkJRNjhCRCwwQkFDQSx1Qkd0cUJ1QyxRQUFBLFFYeFN0QywwQld5U3lDLFFBQUEsUVh6U3pDLGdCVzBTK0IsUUFBQSxRWDFTL0IscUJXMlNvQyxRQUFBLFFIZ3JCckMsd0JSMzlCQyxrQlc2U3VDLFFBQUEsUVg3U3ZDLG9CVzhTbUMsUUFBQSxRWDlTbkMsZ0JXK1MrQixRQUFBLFFYL1MvQix1QldnVHNDLFFBQUEsUVhoVHRDLHVCV2lUc0MsUUFBQSxRWGpUdEMscUJXa1RvQyxRQUFBLFFYbFRwQyxrQldtVGlDLFFBQUEsUVhuVGpDLHdCV29UdUMsUUFBQSxRWHBUdkMsc0JXcVRxQyxRQUFBLFFYclRyQyw0QldzVDJDLFFBQUEsUVh0VDNDLGtCV3VUaUMsUUFBQSxRWHZUakMsc0JXd1RxQyxRQUFBLFFYeFRyQyw2Qld5VDRDLFFBQUEsUVh6VDVDLGtCVzBUaUMsUUFBQSxRWDFUakMsa0JXMlRpQyxRQUFBLFFYM1RqQywrQlc0VDhDLFFBQUEsUVg1VDlDLGdDVzZUK0MsUUFBQSxRWDdUL0MsNkJXOFQ0QyxRQUFBLFFYOVQ1QywrQlcrVDhDLFFBQUEsUVgvVDlDLGlCV2dVZ0MsUUFBQSxRWGhVaEMsZ0JXaVUrQixRQUFBLFFYalUvQixrQldrVWlDLFFBQUEsUVhsVWpDLHNCV21VcUMsUUFBQSxRWG5VckMsb0JXb1VtQyxRQUFBLFFYcFVuQyxzQldxVXFDLFFBQUEsUVhyVXJDLHNCV3NVcUMsUUFBQSxRWHRVckMsc0JXdVVxQyxRQUFBLFFYdlVyQyx1Qld3VXNDLFFBQUEsUVh4VXRDLGtCV3lVaUMsUUFBQSxRWHpVakMsd0JXMFV1QyxRQUFBLFFYMVV2QywwQlcyVXlDLFFBQUEsUVgzVXpDLG9CVzRVbUMsUUFBQSxRWDVVbkMsc0JXNlVxQyxRQUFBLFFYN1VyQyx3Qlc4VXVDLFFBQUEsUVg5VXZDLHlCVytVd0MsUUFBQSxRWC9VeEMsZ0NXZ1YrQyxRQUFBLFFYaFYvQyx3QldpVnVDLFFBQUEsUVhqVnZDLG1CV2tWa0MsUUFBQSxRSDR2Qm5DLCtCUjlrQ0MsdUJXb1Y4QyxRQUFBLFFIOHZCL0MsNkJSbGxDQyxxQldzVjRDLFFBQUEsUUhnd0I3QyxnQ1J0bENDLHdCV3dWK0MsUUFBQSxRSGt3QmhELGVSMWxDQyxnQlcwVjhCLFFBQUEsUVgxVjlCLGVXMlY4QixRQUFBLFFYM1Y5QixrQlFpbUNELGVHcHdCK0IsUUFBQSxRSHd3Qi9CLGVScm1DQyxpQlcrVjhCLFFBQUEsUVgvVjlCLGVRMm1DRCxlQUZBLGVBQ0EsZUd2d0IrQixRQUFBLFFINHdCL0Isa0JBQ0EsZVJobkNDLGlCV3NXOEIsUUFBQSxRSDh3Qi9CLGVScG5DQyxlV3dXOEIsUUFBQSxRWHhXOUIsbUJRd25DRCxlRzl3QitCLFFBQUEsUVgxVzlCLGdCVzJXK0IsUUFBQSxRWDNXL0IscUJXNFdvQyxRQUFBLFFYNVdwQywwQlc2V3lDLFFBQUEsUVg3V3pDLDJCVzhXMEMsUUFBQSxRWDlXMUMsMkJXK1cwQyxRQUFBLFFYL1cxQyw0QldnWDJDLFFBQUEsUVhoWDNDLDRCV2lYMkMsUUFBQSxRWGpYM0MsNkJXa1g0QyxRQUFBLFFYbFg1QyxxQldtWG9DLFFBQUEsUVhuWHBDLHVCV29Yc0MsUUFBQSxRWHBYdEMsMEJXcVh5QyxRQUFBLFFYclh6QyxtQldzWGtDLFFBQUEsUVh0WGxDLGdCV3VYK0IsUUFBQSxRWHZYL0IsdUJXd1hzQyxRQUFBLFFYeFh0Qyx3Qld5WHVDLFFBQUEsUVh6WHZDLG1CVzBYa0MsUUFBQSxRWDFYbEMsMEJXMlh5QyxRQUFBLFFYM1h6QyxxQlc0WG9DLFFBQUEsUVg1WHBDLGtCVzZYaUMsUUFBQSxRWDdYakMsZVc4WDhCLFFBQUEsUVg5WDlCLHFCVytYb0MsUUFBQSxRWC9YcEMsNEJXZ1kyQyxRQUFBLFFYaFkzQyxrQldpWWlDLFFBQUEsUVhqWWpDLHlCV2tZd0MsUUFBQSxRWGxZeEMsMkJXbVkwQyxRQUFBLFFYblkxQyx5QldvWXdDLFFBQUEsUVhwWXhDLDJCV3FZMEMsUUFBQSxRWHJZMUMsNEJXc1kyQyxRQUFBLFFYdFkzQyxpQld1WWdDLFFBQUEsUVh2WWhDLG1CV3dZa0MsUUFBQSxRWHhZbEMsbUJXeVlrQyxRQUFBLFFYellsQyxpQlcwWWdDLFFBQUEsUVgxWWhDLG9CVzJZbUMsUUFBQSxRWDNZbkMsaUJXNFlnQyxRQUFBLFFYNVloQyxzQlc2WXFDLFFBQUEsUVg3WXJDLGtCVzhZaUMsUUFBQSxRWDlZakMsa0JXK1lpQyxRQUFBLFFYL1lqQyxnQldnWitCLFFBQUEsUVhoWi9CLGtCUTh1Q0Qsb0JHNTFCb0MsUUFBQSxRWGxabkMsaUJXbVpnQyxRQUFBLFFYblpoQyxrQldvWmlDLFFBQUEsUVhwWmpDLG1CV3Faa0MsUUFBQSxRWHJabEMsZVdzWjhCLFFBQUEsUVh0WjlCLGNXdVo2QixRQUFBLFFYdlo3QixpQld3WmdDLFFBQUEsUVh4WmhDLGtCV3laaUMsUUFBQSxRWHpaakMscUJXMFpvQyxRQUFBLFFYMVpwQywwQlcyWnlDLFFBQUEsUVgzWnpDLGdDVzRaK0MsUUFBQSxRWDVaL0MsK0JXNlo4QyxRQUFBLFFIczNCL0MsK0JSbnhDQyx1QlcrWjhDLFFBQUEsUVgvWjlDLHdCV2dhdUMsUUFBQSxRWGhhdkMsc0JXaWFxQyxRQUFBLFFYamFyQyx3QldrYXVDLFFBQUEsUUg4M0J4QyxlUmh5Q0Msd0JXb2E4QixRQUFBLFFYcGE5Qix5QldxYXdDLFFBQUEsUVhyYXhDLHlCV3Nhd0MsUUFBQSxRWHRheEMsaUJXdWFnQyxRQUFBLFFYdmFoQywyQld3YTBDLFFBQUEsUVh4YTFDLHFCV3lhb0MsUUFBQSxRWHphcEMsa0JXMGFpQyxRQUFBLFFINDRCbEMsZ0JSdHpDQyx1QlF1ekNELHNCRzE0QnNDLFFBQUEsUUg4NEJ0QywwQlIzekNDLHdCVytheUMsUUFBQSxRWC9hekMsaUJXZ2JnQyxRQUFBLFFYaGJoQyxrQldpYmlDLFFBQUEsUVhqYmpDLGtCV2tiaUMsUUFBQSxRWGxiakMseUJXbWJ3QyxRQUFBLFFYbmJ4Qyw4QldvYjZDLFFBQUEsUVhwYjdDLHVCV3Fic0MsUUFBQSxRWHJidEMscUJXc2JvQyxRQUFBLFFYdGJwQyxnQld1YitCLFFBQUEsUVh2Yi9CLHlCV3did0MsUUFBQSxRWHhieEMsMEJXeWJ5QyxRQUFBLFFYemJ6QyxrQlcwYmlDLFFBQUEsUVgxYmpDLGtCVzJiaUMsUUFBQSxRWDNiakMsb0JXNGJtQyxRQUFBLFFYNWJuQyxlVzZiOEIsUUFBQSxRWDdiOUIsb0JXOGJtQyxRQUFBLFFYOWJuQyxpQlcrYmdDLFFBQUEsUVgvYmhDLGVXZ2M4QixRQUFBLFFYaGM5QixpQldpY2dDLFFBQUEsUVhqY2hDLGdCV2tjK0IsUUFBQSxRWGxjL0IsaUJXbWNnQyxRQUFBLFFYbmNoQyxtQldvY2tDLFFBQUEsUVhwY2xDLDBCV3FjeUMsUUFBQSxRWHJjekMsaUJXc2NnQyxRQUFBLFFYdGNoQyx3Qld1Y3VDLFFBQUEsUVh2Y3ZDLG1CV3dja0MsUUFBQSxRWHhjbEMsc0JRMDRDRCxlR2g4QitCLFFBQUEsUVgxYzlCLGVRODRDRCxnQkdsOEJnQyxRQUFBLFFYNWMvQixnQlc2YytCLFFBQUEsUVg3Yy9CLG1CVzhja0MsUUFBQSxRWDljbEMsc0JXK2NxQyxRQUFBLFFYL2NyQyxzQldnZHFDLFFBQUEsUVhoZHJDLG9CV2lkbUMsUUFBQSxRWGpkbkMsc0JXa2RxQyxRQUFBLFFYbGRyQyx1QldtZHNDLFFBQUEsUVhuZHRDLHdCV29kdUMsUUFBQSxRWHBkdkMsNkJXcWQ0QyxRQUFBLFFIeTlCN0Msd0JSOTZDQyx3QlE2NkNELDBCR3I5QndDLFFBQUEsUUgwOUJ4QywwQlJsN0NDLHNCVzBkeUMsUUFBQSxRSDQ5QjFDLHdCUnQ3Q0Msd0JXNGR1QyxRQUFBLFFYNWR2Qyx3QlEwN0NELHdCRzU5QndDLFFBQUEsUVg5ZHZDLHVCVytkc0MsUUFBQSxRWC9kdEMsZ0JXZ2UrQixRQUFBLFFYaGUvQixtQldpZWtDLFFBQUEsUVhqZWxDLG9CV2tlbUMsUUFBQSxRWGxlbkMscUJRMDhDRCxxQkFHQSxxQkFGQSxzQkFDQSxtQkdyK0JxQyxRQUFBLFFYdmVwQywwQld3ZXlDLFFBQUEsUVh4ZXpDLGNRcTlDRCxpQkFEQSxzQkd6K0JpQyxRQUFBLFFIOCtCakMsa0JSejlDQyxjVzZlaUMsUUFBQSxRWDdlakMsc0JXOGVxQyxRQUFBLFFYOWVyQyxlVytlOEIsUUFBQSxRSHEvQi9CLHVCUnArQ0MsK0JRbStDRCxxQkdqL0J1QyxRQUFBLFFYbGZ0Qyx5QldtZndDLFFBQUEsUVhuZnhDLGNXb2Y2QixRQUFBLFFYcGY3QixrQlE4K0NELGtCR3gvQmtDLFFBQUEsUUg0L0JsQyx1QlJsL0NDLGdCV3dmc0MsUUFBQSxRSDgvQnZDLHlCUnQvQ0Msa0JXMGZ3QyxRQUFBLFFYMWZ4QyxtQlcyZmtDLFFBQUEsUVgzZmxDLHVCVzRmc0MsUUFBQSxRWDVmdEMsa0JXNmZpQyxRQUFBLFFYN2ZqQyxxQlc4Zm9DLFFBQUEsUVg5ZnBDLG1CVytma0MsUUFBQSxRWC9mbEMscUJXZ2dCb0MsUUFBQSxRWGhnQnBDLDRCV2lnQjJDLFFBQUEsUVhqZ0IzQyxnQldrZ0IrQixRQUFBLFFIZ2hDaEMsb0JSbGhEQyx5QldvZ0JtQyxRQUFBLFFYcGdCbkMsZVdxZ0I4QixRQUFBLFFYcmdCOUIsc0JXc2dCcUMsUUFBQSxRWHRnQnJDLGdCV3VnQitCLFFBQUEsUVh2Z0IvQixzQld3Z0JxQyxRQUFBLFFYeGdCckMsa0JXeWdCaUMsUUFBQSxRWHpnQmpDLGdCVzBnQitCLFFBQUEsUVgxZ0IvQix1QlcyZ0JzQyxRQUFBLFFYM2dCdEMsZ0JXNGdCK0IsUUFBQSxRWDVnQi9CLHNCVzZnQnFDLFFBQUEsUVg3Z0JyQyxrQlc4Z0JpQyxRQUFBLFFYOWdCakMseUJXK2dCd0MsUUFBQSxRWC9nQnhDLG1CV2doQmtDLFFBQUEsUVhoaEJsQyx5QldpaEJ3QyxRQUFBLFFYamhCeEMsdUJXa2hCc0MsUUFBQSxRWGxoQnRDLG1CV21oQmtDLFFBQUEsUVhuaEJsQyxxQldvaEJvQyxRQUFBLFFYcGhCcEMscUJXcWhCb0MsUUFBQSxRWHJoQnBDLHNCV3NoQnFDLFFBQUEsUVh0aEJyQyx3Qld1aEJ1QyxRQUFBLFFYdmhCdkMsaUJXd2hCZ0MsUUFBQSxRWHhoQmhDLHFCV3loQm9DLFFBQUEsUVh6aEJwQyxjVzBoQjZCLFFBQUEsUVgxaEI3QixzQlcyaEJxQyxRQUFBLFFYM2hCckMsdUJXNGhCc0MsUUFBQSxRWDVoQnRDLHlCVzZoQndDLFFBQUEsUVg3aEJ4QyxzQlc4aEJxQyxRQUFBLFFYOWhCckMscUJXK2hCb0MsUUFBQSxRWC9oQnBDLHNCV2dpQnFDLFFBQUEsUVhoaUJyQyxrQldpaUJpQyxRQUFBLFFYamlCakMseUJXa2lCd0MsUUFBQSxRWGxpQnhDLHNCV21pQnFDLFFBQUEsUVhuaUJyQyxxQldvaUJvQyxRQUFBLFFYcGlCcEMsbUJXcWlCa0MsUUFBQSxRWHJpQmxDLGVXc2lCOEIsUUFBQSxRWHRpQjlCLG1CV3VpQmtDLFFBQUEsUVh2aUJsQyxxQld3aUJvQyxRQUFBLFFYeGlCcEMsY1d5aUI2QixRQUFBLFFINmxDOUIsZVJ0b0RDLGtCUXFvREQsa0JHemxDK0IsUUFBQSxRWDVpQjlCLG9CVzZpQm1DLFFBQUEsUVg3aUJuQyxzQlc4aUJxQyxRQUFBLFFYOWlCckMsMEJXK2lCeUMsUUFBQSxRWC9pQnpDLG9CV2dqQm1DLFFBQUEsUVhoakJuQyxvQldpakJtQyxRQUFBLFFYampCbkMsbUJXa2pCa0MsUUFBQSxRWGxqQmxDLGtCV21qQmlDLFFBQUEsUVhuakJqQyx3QldvakJ1QyxRQUFBLFFYcGpCdkMsdUJXcWpCc0MsUUFBQSxRWHJqQnRDLG9CV3NqQm1DLFFBQUEsUVh0akJuQyxxQld1akJvQyxRQUFBLFFYdmpCcEMsMkJXd2pCMEMsUUFBQSxRWHhqQjFDLG1CV3lqQmtDLFFBQUEsUVh6akJsQyxnQlcwakIrQixRQUFBLFFYMWpCL0IsdUJXMmpCc0MsUUFBQSxRWDNqQnRDLHNCVzRqQnFDLFFBQUEsUVg1akJyQyx1Qlc2akJzQyxRQUFBLFFYN2pCdEMscUJXOGpCb0MsUUFBQSxRWDlqQnBDLGlCVytqQmdDLFFBQUEsUVgvakJoQyxnQldna0IrQixRQUFBLFFYaGtCL0IsbUJXaWtCa0MsUUFBQSxRWGprQmxDLG9CUXlzREQsdUJHdG9DdUMsUUFBQSxRWG5rQnRDLDJCV29rQjBDLFFBQUEsUVhwa0IxQyx3Qldxa0J1QyxRQUFBLFFYcmtCdkMsdUJXc2tCc0MsUUFBQSxRWHRrQnRDLHNCV3VrQnFDLFFBQUEsUVh2a0JyQyx1Qld3a0JzQyxRQUFBLFFYeGtCdEMseUJXeWtCd0MsUUFBQSxRWHprQnhDLHlCVzBrQndDLFFBQUEsUVgxa0J4QyxrQlcya0JpQyxRQUFBLFFYM2tCakMsc0JXNGtCcUMsUUFBQSxRWDVrQnJDLDZCVzZrQjRDLFFBQUEsUVg3a0I1Qyx1Qlc4a0JzQyxRQUFBLFFYOWtCdEMsb0JXK2tCbUMsUUFBQSxRWC9rQm5DLGtCV2dsQmlDLFFBQUEsUVhobEJqQyxxQldpbEJvQyxRQUFBLFFYamxCcEMsc0JXa2xCcUMsUUFBQSxRSHdxQ3RDLGVSMXZEQyxpQldvbEI4QixRQUFBLFFYcGxCOUIsbUJXcWxCa0MsUUFBQSxRWHJsQmxDLGlCV3NsQmdDLFFBQUEsUVh0bEJoQyxrQld1bEJpQyxRQUFBLFFYdmxCakMsa0JXd2xCaUMsUUFBQSxRSGtyQ2xDLHdCUjF3REMsY1cwbEJ1QyxRQUFBLFFYMWxCdkMseUJXMmxCd0MsUUFBQSxRWDNsQnhDLG9CVzRsQm1DLFFBQUEsUVg1bEJuQyx3Qlc2bEJ1QyxRQUFBLFFYN2xCdkMscUJRd3hERCx3QkFEQSxtQkd2ckN3QyxRQUFBLFFYaG1CdkMscUJRNHhERCxrQ0cxckNrRCxRQUFBLFFYbG1CakQscUJRZ3lERCx3Qkc1ckN3QyxRQUFBLFFYcG1CdkMscUJRb3lERCwyQkc5ckMyQyxRQUFBLFFYdG1CMUMscUJRd3lERCx5Qkdoc0N5QyxRQUFBLFFYeG1CeEMseUJXeW1Cd0MsUUFBQSxRWHptQnhDLG9CVzBtQm1DLFFBQUEsUVgxbUJuQyx3QlcybUJ1QyxRQUFBLFFYM21CdkMsMEJXNG1CeUMsUUFBQSxRWDVtQnpDLHVCVzZtQnNDLFFBQUEsUVg3bUJ0Qyx5Qlc4bUJ3QyxRQUFBLFFYOW1CeEMsa0JXK21CaUMsUUFBQSxRWC9tQmpDLDBCV2duQnlDLFFBQUEsUVhobkJ6QyxpQldpbkJnQyxRQUFBLFFYam5CaEMseUJXa25Cd0MsUUFBQSxRWGxuQnhDLHVCV21uQnNDLFFBQUEsUVhubkJ0Qyx1QlE2MERELDJCR3h0QzJDLFFBQUEsUVhybkIxQyx1QlFpMURELDBCRzF0QzBDLFFBQUEsUVh2bkJ6Qyx1QlFxMURELHlCRzV0Q3lDLFFBQUEsUVh6bkJ4QyxxQlcwbkJvQyxRQUFBLFFYMW5CcEMsdUJRNDFERCx1QkdodUN1QyxRQUFBLFFIb3VDdkMsd0JSaDJEQyx1Qlc4bkJ1QyxRQUFBLFFYOW5CdkMsMkJXK25CMEMsUUFBQSxRWC9uQjFDLHlCV2dvQndDLFFBQUEsUVhob0J4Qyx3Qldpb0J1QyxRQUFBLFFYam9CdkMsMEJXa29CeUMsUUFBQSxRWGxvQnpDLHdCV21vQnVDLFFBQUEsUVhub0J2QyxxQldvb0JvQyxRQUFBLFFYcG9CcEMsc0JXcW9CcUMsUUFBQSxRWHJvQnJDLDRCV3NvQjJDLFFBQUEsUVh0b0IzQyxjV3VvQjZCLFFBQUEsUVh2b0I3QixxQld3b0JvQyxRQUFBLFFYeG9CcEMsdUJXeW9Cc0MsUUFBQSxRWHpvQnRDLHlCVzBvQndDLFFBQUEsUVgxb0J4QyxnQ1cyb0IrQyxRQUFBLFFYM29CL0Msc0JXNG9CcUMsUUFBQSxRWDVvQnJDLHVCVzZvQnNDLFFBQUEsUVg3b0J0QyxrQlc4b0JpQyxRQUFBLFFYOW9CakMsa0JXK29CaUMsUUFBQSxRWC9vQmpDLG1CV2dwQmtDLFFBQUEsUVhocEJsQyxpQldpcEJnQyxRQUFBLFFYanBCaEMsNkJXa3BCNEMsUUFBQSxRSDh3QzdDLHNCUmg2REMsY1dvcEJxQyxRQUFBLFFYcHBCckMsa0JXcXBCaUMsUUFBQSxRWHJwQmpDLGlCV3NwQmdDLFFBQUEsUVh0cEJoQyxrQld1cEJpQyxRQUFBLFFYdnBCakMsMkJXd3BCMEMsUUFBQSxRWHhwQjFDLDRCV3lwQjJDLFFBQUEsUVh6cEIzQyw0QlcwcEIyQyxRQUFBLFFYMXBCM0MsNEJXMnBCMkMsUUFBQSxRWDNwQjNDLG9CVzRwQm1DLFFBQUEsUVg1cEJuQyxtQlc2cEJrQyxRQUFBLFFYN3BCbEMscUJXOHBCb0MsUUFBQSxRWDlwQnBDLGlCVytwQmdDLFFBQUEsUVgvcEJoQyxlV2dxQjhCLFFBQUEsUVhocUI5QixzQldpcUJxQyxRQUFBLFFYanFCckMsd0JXa3FCdUMsUUFBQSxRWGxxQnZDLGlCV21xQmdDLFFBQUEsUVhucUJoQyxpQldvcUJnQyxRQUFBLFFYcHFCaEMscUJXcXFCb0MsUUFBQSxRWHJxQnBDLHFCV3NxQm9DLFFBQUEsUVh0cUJwQyx3Qld1cUJ1QyxRQUFBLFFYdnFCdkMsZ0JXd3FCK0IsUUFBQSxRWHhxQi9CLDJCV3lxQjBDLFFBQUEsUVh6cUIxQyxvQlcwcUJtQyxRQUFBLFFYMXFCbkMsZ0JXMnFCK0IsUUFBQSxRWDNxQi9CLHdCVzRxQnVDLFFBQUEsUVg1cUJ2QyxlVzZxQjhCLFFBQUEsUVg3cUI5Qix3Qlc4cUJ1QyxRQUFBLFFYOXFCdkMsb0JXK3FCbUMsUUFBQSxRWC9xQm5DLGtCV2dyQmlDLFFBQUEsUVhockJqQyx3QldpckJ1QyxRQUFBLFFYanJCdkMsMEJXa3JCeUMsUUFBQSxRWGxyQnpDLHVCV21yQnNDLFFBQUEsUVhuckJ0Qyx5QldvckJ3QyxRQUFBLFFYcHJCeEMsd0JXcXJCdUMsUUFBQSxRWHJyQnZDLDJCV3NyQjBDLFFBQUEsUVh0ckIxQyxtQld1ckJrQyxRQUFBLFFYdnJCbEMscUJXd3JCb0MsUUFBQSxRWHhyQnBDLHVCV3lyQnNDLFFBQUEsUVh6ckJ0QyxtQlcwckJrQyxRQUFBLFFYMXJCbEMsa0JXMnJCaUMsUUFBQSxRWDNyQmpDLHNCVzRyQnFDLFFBQUEsUVg1ckJyQyxtQlc2ckJrQyxRQUFBLFFYN3JCbEMsa0JXOHJCaUMsUUFBQSxRWDlyQmpDLDRCVytyQjJDLFFBQUEsUVgvckIzQywwQldnc0J5QyxRQUFBLFFYaHNCekMsNkJXaXNCNEMsUUFBQSxRWGpzQjVDLGlCV2tzQmdDLFFBQUEsUVhsc0JoQyw2Qldtc0I0QyxRQUFBLFFYbnNCNUMsZ0NXb3NCK0MsUUFBQSxRWHBzQi9DLG1CV3FzQmtDLFFBQUEsUVhyc0JsQyx1Q1dzc0JzRCxRQUFBLFFIbzNDdkQsK0NSMWpFQyw0Qld3c0I4RCxRQUFBLFFIdTNDL0QsZ0JSL2pFQyxvQlE4akVELDJCR24zQ2dDLFFBQUEsUVgzc0IvQixpQlc0c0JnQyxRQUFBLFFYNXNCaEMsbUJXNnNCa0MsUUFBQSxRSDQzQ25DLHlCUnprRUMsbUJXK3NCd0MsUUFBQSxRWC9zQnhDLHNCV2d0QnFDLFFBQUEsUVhodEJyQyxrQldpdEJpQyxRQUFBLFFYanRCakMseUJXa3RCd0MsUUFBQSxRWGx0QnhDLG9CV210Qm1DLFFBQUEsUVhudEJuQywwQldvdEJ5QyxRQUFBLFFYcHRCekMsMkJXcXRCMEMsUUFBQSxRWHJ0QjFDLHNCV3N0QnFDLFFBQUEsUVh0dEJyQyx1Qld1dEJzQyxRQUFBLFFYdnRCdEMsaUJXd3RCZ0MsUUFBQSxRWHh0QmhDLHFCV3l0Qm9DLFFBQUEsUVh6dEJwQyw4QlEybUVELGdDR2g1Q2dELFFBQUEsUVgzdEIvQyxjUSttRUQsd0JHbDVDd0MsUUFBQSxRWDd0QnZDLHVCVzh0QnNDLFFBQUEsUVg5dEJ0Qyx5QlcrdEJ3QyxRQUFBLFFYL3RCeEMsMkJXZ3VCMEMsUUFBQSxRWGh1QjFDLGtCV2l1QmlDLFFBQUEsUVhqdUJqQyx3QldrdUJ1QyxRQUFBLFFYbHVCdkMsMEJXbXVCeUMsUUFBQSxRSGs2QzFDLHdCUnJvRUMsaUJXcXVCdUMsUUFBQSxRSG82Q3hDLDBCUnpvRUMsbUJXdXVCeUMsUUFBQSxRWHZ1QnpDLHVCV3d1QnNDLFFBQUEsUVh4dUJ0Qyx5Qld5dUJ3QyxRQUFBLFFYenVCeEMsa0JXMHVCaUMsUUFBQSxRWDF1QmpDLG9CVzJ1Qm1DLFFBQUEsUVgzdUJuQywyQlF5cEVELG1CRzU2Q21DLFFBQUEsUVg3dUJsQyw2QlE2cEVELHFCRzk2Q3FDLFFBQUEsUVgvdUJwQyxpQldndkJnQyxRQUFBLFFYaHZCaEMsMEJXaXZCeUMsUUFBQSxRWGp2QnpDLG9CV2t2Qm1DLFFBQUEsUVhsdkJuQyx5QlEycUVELDRCQURBLHVCR3I3QzRDLFFBQUEsUVhydkIzQyx5QlErcUVELHNDR3g3Q3NELFFBQUEsUVh2dkJyRCx5QlFtckVELDRCRzE3QzRDLFFBQUEsUVh6dkIzQyx5QlF1ckVELCtCRzU3QytDLFFBQUEsUVgzdkI5Qyx5QlEyckVELDZCRzk3QzZDLFFBQUEsUVg3dkI1QyxrQlc4dkJpQyxRQUFBLFFIcThDbEMsZ0JSbnNFQyxtQlFrc0VELGVHajhDZ0MsUUFBQSxRWGp3Qi9CLG1CV2t3QmtDLFFBQUEsUVhsd0JsQywyQldtd0IwQyxRQUFBLFFYbndCMUMsMkJXb3dCMEMsUUFBQSxRWHB3QjFDLDBCV3F3QnlDLFFBQUEsUVhyd0J6QywyQlFtdEVELHdCRzU4Q3dDLFFBQUEsUVh2d0J2Qyw2QlF1dEVELDBCRzk4QzBDLFFBQUEsUVh6d0J6QyxvQlcwd0JtQyxRQUFB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VUFBQSxLQUNBLGlCQUFBLFFBQ0EsS0FBQSxFQUNBLElBQUEsRUFDQSxNQUFBLEVBQ0EsU0FBQSxPQUNBLFFBQUEsSUFDQSxzQkFDSSxPQUFBLFFBRUosb0JBQ0ksT0FBQSxRQUlSLGFBQ0ksU0FBQSxTQUNBLElBQUEsSUFDQSxLQUFBLEtBQ0EsTUFBQSxJQUNBLFNBQUEsT0FDQSxNQUFBLFFBQ0EsVUFBQSxLQUdKLGNBQ0ksUUFBQSxJQUFBLElBQUEsSUFBQSxLQUNBLG9CQUFBLElBQUEsSUFDQSxrQkFBQSxVQUdKLGNBQ0ksU0FBQSxTQUNBLElBQUEsSUFDQSxNQUFBLEtBQ0EsTUFBQSxLQUNBLE9BQUEsS0FDQSxXQUFBLG8rQ0FBQSxJQUFBLElBQUEsVUFHSixZQUNJLFNBQUEsU0FDQSxJQUFBLElBQ0EsS0FBQSxLQUdKLGNBQ0ksTUFBQSxLQUNBLFFBQUEsSUFDQSxXQUFBLEtBR0osYUFDSSxTQUFBLFNBQ0EsTUFBQSxLQUdKLGdCQUNJLFNBQUEsU0FDQSxNQUFBLEtBQ0EsT0FBQSxNQUNBLFNBQUEsT0FDQSxPQUFBLElBQUEsTUFBQSxRQUNBLFdBQUEsMkJBR0osT0FDSSxTQUFBLFNBQ0EsSUFBQSxJQUNBLEtBQUEsSUFDQSxPQUFBLE9BQUEsRUFBQSxFQUFBLE9BQ0EsTUFBQSxNQUNBLE9BQUEsTUFDQSxTQUFBLE9BQ0EsS0FBQSxFQUdKLFlBQ0ksU0FBQSxTQUNBLE9BQUEsSUFDQSxLQUFBLElBQ0EsTUFBQSxNQUNBLE9BQUEsTUFHSixjQUNJLFNBQUEsU0FDQSxPQUFBLFFBQ0EsS0FBQSxFQUNBLE1BQUEsTUFDQSxPQUFBLE1BR0osYUFDSSxTQUFBLFNBQ0EsTUFBQSxLQUdKLFdBQ0ksTUFBQSxLQUNBLFFBQUEsSUFDQSxXQUFBLEtBR0osY0FDSSxTQUFBLFNBQ0EsTUFBQSxLQUNBLElBQUEsS0FDQSxPQUFBLElBQUEsTUFBQSxRQUNBLGlCQUFBLFFBQ0EsUUFBQSxJQUNBLFFBQUEsS0FDQSxRQUFBLEtBR0osaUJBQ0ksU0FBQSxTQUNBLFdBQUEsNEJBQUEsSUFBQSxJQUNBLE1BQUEsS0FDQSxVQUFBLEtBQ0EsV0FBQSxPQUNBLFlBQUEsS0FDQSxRQUFBLElBQUEsSUFBQSxJQUFBLElBQ0EsT0FBQSxJQUFBLEVBQUEsSUFBQSxFQUdKLFlBQ0ksV0FBQSIsImZpbGUiOiJuYW5vdWkuY3NzIiwic291cmNlc0NvbnRlbnQiOltudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCIuZGlzcGxheUJhciB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB3aWR0aDogMjM2cHg7XHJcbiAgICBoZWlnaHQ6IDE2cHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2O1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICBtYXJnaW46IDAgNXB4IDAgMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICBiYWNrZ3JvdW5kOiAjMDAwMDAwO1xyXG59XHJcblxyXG4uZGlzcGxheUJhclRleHQge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiAtMnB4O1xyXG4gICAgbGVmdDogNXB4O1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyRmlsbCB7XHJcbiAgICB3aWR0aDogMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBiYWNrZ3JvdW5kOiAjNDA2MjhhO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZGlzcGxheUJhckZpbGwuYWxpZ25SaWdodCB7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyVGV4dC5nb29kIHtcclxuXHRjb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyVGV4dC5ub3Rnb29kIHtcclxuXHRjb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyVGV4dC5hdmVyYWdlIHtcclxuXHRjb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyVGV4dC5iYWQge1xyXG5cdGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJUZXh0LmhpZ2hsaWdodCB7XHJcblx0Y29sb3I6IGJsYWNrO1xyXG59XHJcblxyXG4uZGlzcGxheUJhckZpbGwuZ29vZCB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6IEBnb29kLWNvbG9yO1xyXG59XHJcblxyXG4uZGlzcGxheUJhckZpbGwubm90Z29vZCB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6ICNmZmI0MDA7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyRmlsbC5hdmVyYWdlIHtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYmFja2dyb3VuZDogQGF2ZXJhZ2UtY29sb3I7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyRmlsbC5iYWQge1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBiYWNrZ3JvdW5kOiBAYmFkLWNvbG9yO1xyXG59XHJcblxyXG4uZGlzcGxheUJhckZpbGwuaGlnaGxpZ2h0IHtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYmFja2dyb3VuZDogQGhpZ2hsaWdodC1jb2xvcjtcclxufVxyXG4iLCIubGluaywgLmxpbmtPbiwgLmxpbmtPZmYsIC5zZWxlY3RlZCwgLmRpc2FibGVkLCAueWVsbG93QnV0dG9uLCAucmVkQnV0dG9uIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgbWluLXdpZHRoOiAxNXB4O1xyXG4gICAgaGVpZ2h0OiAxNnB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICBiYWNrZ3JvdW5kOiAjNDA2MjhhO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzE2MTYxNjtcclxuICAgIHBhZGRpbmc6IDBweCA0cHggNHB4IDRweDtcclxuICAgIG1hcmdpbjogMCAycHggMnB4IDA7XHJcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XHJcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG59XHJcblxyXG4uaGFzSWNvbiB7XHJcbiAgICBwYWRkaW5nOiAwcHggNHB4IDRweCAwcHg7XHJcbn1cclxuXHJcbmEuaG92ZXIsIC56b29tTGluay5ob3ZlciwgLmxpbmtBY3RpdmUuaG92ZXIge1xyXG4gICAgYmFja2dyb3VuZDogIzUwN2FhYztcclxufVxyXG5cclxuQGtleWZyYW1lcyBwZW5kaW5nQW5pbWF0aW9uIHtcclxuICAgIHRvIHtcclxuICAgICAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgICAgICBiYWNrZ3JvdW5kOiAjNTA3YWFjO1xyXG4gICAgfVxyXG59XHJcblxyXG4ubGlua1BlbmRpbmcsIC5saW5rUGVuZGluZy5ob3ZlciB7XHJcbiAgICBhbmltYXRpb24tbmFtZTogcGVuZGluZ0FuaW1hdGlvbjtcclxuICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC4yNXM7XHJcbn1cclxuXHJcbmEud2hpdGUsIGEud2hpdGU6bGluaywgYS53aGl0ZTp2aXNpdGVkLCBhLndoaXRlOmFjdGl2ZSB7XHJcbiAgICBjb2xvcjogIzQwNjI4YTtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTYxNjE2O1xyXG4gICAgcGFkZGluZzogMXB4IDRweCAxcHggNHB4O1xyXG4gICAgbWFyZ2luOiAwIDJweCAwIDA7XHJcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XHJcbn1cclxuXHJcbmEud2hpdGUuaG92ZXIge1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBiYWNrZ3JvdW5kOiAjNDA2MjhhO1xyXG59XHJcblxyXG4ubGlua09uLCBhLmxpbmtPbjpsaW5rLCBhLmxpbmtPbjp2aXNpdGVkLCBhLmxpbmtPbjphY3RpdmUsIGEubGlua09uLmhvdmVyLCAuc2VsZWN0ZWQsIGEuc2VsZWN0ZWQ6bGluaywgYS5zZWxlY3RlZDp2aXNpdGVkLCBhLnNlbGVjdGVkOmFjdGl2ZSwgYS5zZWxlY3RlZC5ob3ZlciB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6ICMyZjk0M2M7XHJcbn1cclxuXHJcbi5saW5rT2ZmLCBhLmxpbmtPZmY6bGluaywgYS5saW5rT2ZmOnZpc2l0ZWQsIGEubGlua09mZjphY3RpdmUsIGEubGlua09mZi5ob3ZlciwgLmRpc2FibGVkLCBhLmRpc2FibGVkOmxpbmssIGEuZGlzYWJsZWQ6dmlzaXRlZCwgYS5kaXNhYmxlZDphY3RpdmUsIGEuZGlzYWJsZWQuaG92ZXIge1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBiYWNrZ3JvdW5kOiAjOTk5OTk5O1xyXG4gICAgYm9yZGVyLWNvbG9yOiAjNjY2NjY2O1xyXG59XHJcblxyXG5hLmljb24sIC5saW5rT24uaWNvbiwgLmxpbmtPZmYuaWNvbiwgLnNlbGVjdGVkLmljb24sIC5kaXNhYmxlZC5pY29uIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHBhZGRpbmc6IDFweCA0cHggMnB4IDIwcHg7XHJcbn1cclxuXHJcbmEuaWNvbiBpbWcsIC5saW5rT24uaWNvbiBpbWcsIC5saW5rT2ZmLmljb24gaW1nLCAuc2VsZWN0ZWQuaWNvbiBpbWcsIC5kaXNhYmxlZC5pY29uIGltZyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDE4cHg7XHJcbiAgICBoZWlnaHQ6IDE4cHg7XHJcbn1cclxuXHJcbi5saW5rRGFuZ2VyLCBhLmxpbmtEYW5nZXI6bGluaywgYS5saW5rRGFuZ2VyOnZpc2l0ZWQsIGEubGlua0RhbmdlcjphY3RpdmUge1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmYwMDAwO1xyXG4gICAgYm9yZGVyLWNvbG9yOiAjYWEwMDAwO1xyXG59XHJcblxyXG4ubGlua0Rhbmdlci5ob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY2NjY2O1xyXG59XHJcblxyXG4uaW5hY3RpdmUsIGEuaW5hY3RpdmU6bGluaywgYS5pbmFjdGl2ZTp2aXNpdGVkLCBhLmluYWN0aXZlOmFjdGl2ZSwgYS5pbmFjdGl2ZS5ob3ZlciB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6ICM5OTk5OTk7XHJcbiAgICBib3JkZXItY29sb3I6ICM2NjY2NjY7XHJcbn0iLCJAaW1wb3J0IFwiX2NvbmZpZ1wiO1xyXG5cclxuLndoaXRlIHtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4uZ29vZCB7XHJcbiAgICBjb2xvcjogQGdvb2QtY29sb3I7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmF2ZXJhZ2Uge1xyXG4gICAgY29sb3I6IEBhdmVyYWdlLWNvbG9yO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi5iYWQge1xyXG4gICAgY29sb3I6IEBiYWQtY29sb3I7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmlkbGUge1xyXG4gICAgY29sb3I6IEBkYXJrLWNvbG9yO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi5yZWRCdXR0b24ge1xyXG4gICAgYmFja2dyb3VuZDogI2VhMDAwMDtcclxufVxyXG5cclxuLnllbGxvd0J1dHRvbiB7XHJcbiAgICBiYWNrZ3JvdW5kOiAjY2FjYzAwO1xyXG59XHJcblxyXG4uaGlnaGxpZ2h0IHtcclxuICAgIGNvbG9yOiBAaGlnaGxpZ2h0LWNvbG9yO1xyXG59XHJcblxyXG4uZGFyayB7XHJcbiAgICBjb2xvcjogQGRhcmstY29sb3I7XHJcbn1cclxuXHJcbi8qIERhbWFnZSBjb2xvcnMgZm9yIGNyZXcgbW9uaXRvcmluZyBjb21wdXRlciAqL1xyXG4uYnVybiB7XHJcbiAgICBjb2xvcjogb3JhbmdlO1xyXG59XHJcblxyXG4uYnJ1dGUge1xyXG4gICAgY29sb3I6IHJlZDtcclxufVxyXG5cclxuLnRveGluIHtcclxuICAgIGNvbG9yOiBncmVlbjtcclxufVxyXG5cclxuLnRveGluX2xpZ2h0IHtcclxuICAgIGNvbG9yOiAjM0FERjAwO1xyXG59XHJcblxyXG4ub3h5bG9zcyB7XHJcbiAgICBjb2xvcjogYmx1ZTtcclxufVxyXG5cclxuLm94eWxvc3NfbGlnaHQge1xyXG4gICAgY29sb3I6ICM2Njk4RkY7XHJcbn1cclxuXHJcbi8qIFdpcmUgY29sb3JzIGZvciBudWNsZWFyIGJvbWIgZGVmdXNpb24gKi9cclxuLlJlZCB7XHJcbiAgICBjb2xvcjogI0ZGMDAwMDtcclxufVxyXG5cclxuLkJsdWUge1xyXG4gICAgY29sb3I6ICMwMDAwRkY7XHJcbn1cclxuXHJcbi5HcmVlbiB7XHJcbiAgICBjb2xvcjogIzAwRkYwMDtcclxufVxyXG5cclxuLk1hcmlnb2xkIHtcclxuICAgIGNvbG9yOiAjRkRBNTA1O1xyXG59XHJcblxyXG4uRnVzY2hpYSB7XHJcbiAgICBjb2xvcjogI0ZGMDA4MDtcclxufVxyXG5cclxuLkJsYWNrIHtcclxuICAgIGNvbG9yOiAjMDAwMDAwO1xyXG59XHJcblxyXG4uUGVhcmwge1xyXG4gICAgY29sb3I6ICNDNkNBQ0I7XHJcbn1cclxuXHJcbi8qIFN0YXR1cyBiYXIgY29sb3JzIGZvciBzbGVlcGVyIHRlbXBlcmF0dXJlcyAqL1xyXG4uY29sZDEge1xyXG4gICAgY29sb3I6ICM5NEI4RkY7XHJcbn1cclxuXHJcbi5jb2xkMiB7XHJcbiAgICBjb2xvcjogIzY2OTlGRjtcclxufVxyXG5cclxuLmNvbGQzIHtcclxuICAgIGNvbG9yOiAjMjkzRDY2O1xyXG59XHJcblxyXG4uaG90MSB7XHJcbiAgICBjb2xvcjogI0ZGOTk2NjtcclxufVxyXG5cclxuLmhvdDIge1xyXG4gICAgY29sb3I6ICM5OTNEMDA7XHJcbn1cclxuXHJcbi5ob3QzIHtcclxuICAgIGNvbG9yOiAjRkY2NjAwO1xyXG59IiwiZGl2LmRpc3BsYXkge1xyXG5cdHBhZGRpbmc6IDRweDtcclxuXHRtYXJnaW46IDZweCAwO1xyXG5cclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzMpO1xyXG5cdGJveC1zaGFkb3c6IGluc2V0IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjUpO1xyXG59XHJcblxyXG5kaXYuZGlzcGxheSBoZWFkZXIge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcblx0d2lkdGg6IDk4LjUlO1xyXG4gICAgcGFkZGluZzogMCA0cHg7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA2cHg7XHJcbiAgICBjb2xvcjogI0ZGRkZGRjtcclxuICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjNDA2MjhhO1xyXG59XHJcblxyXG5kaXYuZGlzcGxheSBoZWFkZXIgLmJ1dHRvblJpZ2h0IHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGJvdHRvbTogNnB4O1xyXG4gICAgcmlnaHQ6IDRweDtcclxufVxyXG5cclxuZGl2LmRpc3BsYXkgYXJ0aWNsZSB7XHJcbiAgICBkaXNwbGF5OiB0YWJsZTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcclxufSIsIi5pdGVtR3JvdXAge1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2U5YzE4MztcclxuICAgIGJhY2tncm91bmQ6ICMyYzJjMmM7XHJcbiAgICBwYWRkaW5nOiA0cHg7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuXHJcbi5pdGVtIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWFyZ2luOiA0cHggMCAwIDA7XHJcbiAgICBjbGVhcjogYm90aDtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG59XHJcblxyXG4uaXRlbUNvbnRlbnROYXJyb3csIC5pdGVtQ29udGVudCB7XHJcbiAgICBmbG9hdDogbGVmdDtcclxufVxyXG5cclxuLml0ZW1Db250ZW50TmFycm93IHtcclxuICAgIHdpZHRoOiAzMCU7XHJcbn1cclxuXHJcbi5pdGVtQ29udGVudCB7XHJcbiAgICB3aWR0aDogNjklO1xyXG59XHJcblxyXG4uaXRlbUxhYmVsTmFycm93LCAuaXRlbUxhYmVsLCAuaXRlbUxhYmVsV2lkZSwgLml0ZW1MYWJlbFdpZGVyLCAuaXRlbUxhYmVsV2lkZXN0IHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgY29sb3I6ICNlOWMxODM7XHJcbn1cclxuXHJcbi5pdGVtTGFiZWxOYXJyb3cge1xyXG4gICAgd2lkdGg6IDIwJTtcclxufVxyXG5cclxuLml0ZW1MYWJlbCB7XHJcbiAgICB3aWR0aDogMzAlO1xyXG59XHJcblxyXG4uaXRlbUxhYmVsV2lkZSB7XHJcbiAgICB3aWR0aDogNDUlO1xyXG59XHJcblxyXG4uaXRlbUxhYmVsV2lkZXIge1xyXG4gICAgd2lkdGg6IDY5JTtcclxufVxyXG5cclxuLml0ZW1MYWJlbFdpZGVzdCB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLml0ZW1Db250ZW50V2lkZSB7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIHdpZHRoOiA3OSU7XHJcbn1cclxuXHJcbi5pdGVtQ29udGVudFNtYWxsIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgd2lkdGg6IDMzJTtcclxufVxyXG5cclxuLml0ZW1Db250ZW50TWVkaXVtIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgd2lkdGg6IDU1JTtcclxufVxyXG5cclxuLmJsb2NrIHtcclxuICAgIHBhZGRpbmc6IDhweDtcclxuICAgIG1hcmdpbjogMTBweCA0cHggNHB4IDRweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM0MDYyOGE7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwO1xyXG59XHJcblxyXG4uYmxvY2sgaDMge1xyXG4gICAgcGFkZGluZzogMDtcclxufVxyXG5cclxuLmNsZWFyQm90aCB7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuLmNsZWFyTGVmdCB7XHJcbiAgICBjbGVhcjogbGVmdDtcclxufVxyXG5cclxuLmNsZWFyUmlnaHQge1xyXG4gICAgY2xlYXI6IHJpZ2h0O1xyXG59XHJcblxyXG4ubGluZSB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGNsZWFyOiBib3RoO1xyXG59XHJcblxyXG4uZml4ZWRMZWZ0IHtcclxuICAgIHdpZHRoOiAxMTBweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZml4ZWRMZWZ0V2lkZSB7XHJcbiAgICB3aWR0aDogMTY1cHg7XHJcbiAgICBmbG9hdDogbGVmdDtcclxufVxyXG5cclxuLmZpeGVkTGVmdFdpZGVyIHtcclxuICAgIHdpZHRoOiAyMjBweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZml4ZWRMZWZ0V2lkZXN0IHtcclxuICAgIHdpZHRoOiAyNTBweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZmxvYXRSaWdodCB7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbn1cclxuXHJcbi5mbG9hdExlZnQge1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbn1cclxuXHJcbi5oaWRkZW4ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuXHJcbi5zdGF0dXNEaXNwbGF5IHtcclxuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzQwNjI4YTtcclxuICAgIHBhZGRpbmc6IDRweDtcclxuICAgIG1hcmdpbjogM3B4IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG59XHJcblxyXG4uc3RhdHVzRGlzcGxheVJlY29yZHMge1xyXG4gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUpO1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjNDA2MjhhO1xyXG4gICAgcGFkZGluZzogNHB4O1xyXG4gICAgbWFyZ2luOiAzcHggMDtcclxuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcclxuICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbn1cclxuXHJcbi5zdGF0dXNMYWJlbCB7XHJcbiAgICB3aWR0aDogMTM4cHg7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICBjb2xvcjogIzk4QjBDMztcclxufVxyXG5cclxuLnN0YXR1c1ZhbHVlIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uam9iVmFsdWVzIHtcclxuXHRmbG9hdDogbGVmdDtcclxuXHR3aWR0aDogMzAlO1xyXG59XHJcblxyXG4vLyBDSFJPTUVMRVNTIFNUVUZGXHJcblxyXG4uZmFuY3kge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuaS5mYW5jeSB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG4udGl0bGVidXR0b24oKSB7XHJcbiAgICBjb2xvcjogI0U5QzE4MztcclxuICAgIC8vIFNpbmNlIHdlJ3JlIG9uIHNvbWUgaGlsYXJpb3VzbHkgb3V0ZGF0ZWQgbGlicmFyaWVzLCB0aGUgYmVsb3cgaXMgYW4gaXNzdWVcclxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Gb3J0QXdlc29tZS9Gb250LUF3ZXNvbWUvaXNzdWVzLzEyNzRcclxuICAgIC8vIFVzaW5nIHRoZSAhaW1wb3J0YW50IGRpcmVjdGl2ZSBpcyBuZWNlc3NhcnkgdG8gb3ZlcnJpZGUgdGhlIEZBIHN0eWxlc1xyXG4gICAgY3Vyc29yOiBwb2ludGVyICFpbXBvcnRhbnQ7IFxyXG4gICAgei1pbmRleDogMTAyOyAvLyBUaGlzIGlzIGZvciB0aGUgY29ybmVycyAtIG1ha2VzIHN1cmUgdGhlIGJ1dHRvbnMgcmVuZGVyIG9uIHRvcFxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICAgIGNvbG9yOiBsaWdodGVuKCM5OGIwYzMsIDEwJSk7XHJcbiAgICB9XHJcbn1cclxuLm1pbmltaXplIHtcclxuICAgIC50aXRsZWJ1dHRvbjtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNnB4O1xyXG4gICAgcmlnaHQ6IDQ2cHg7XHJcbn1cclxuLmNsb3NlIHtcclxuICAgIC50aXRsZWJ1dHRvbjtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNHB4O1xyXG4gICAgcmlnaHQ6IDEycHg7XHJcbn0iLCIuY29ybmVyKCkge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgei1pbmRleDogMTAxO1xyXG4gICAgbWluLXdpZHRoOiAzMHB4O1xyXG4gICAgbWluLWhlaWdodDogMzBweDtcclxufVxyXG5cclxuI3VpQ29ybmVyVEwge1xyXG4gICAgLmNvcm5lcjtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBiYWNrZ3JvdW5kOiBkYXRhLXVyaSgndGwucG5nJykgbm8tcmVwZWF0O1xyXG59XHJcblxyXG4vKiBSZXNpemluZyAoU3RvbGVuIGZyb20gR29vbiBDQy1CWS1OQy1TQSkgKi9cclxuQHJlc2l6ZTogNXB4O1xyXG4ucmVzaXplQXJlYSB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiA5OTk5OTtcclxufVxyXG4ucmVzaXplQXJlYS50b3Age1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMTBweDtcclxuICAgIHJpZ2h0OiAxMHB4O1xyXG4gICAgaGVpZ2h0OiBAcmVzaXplO1xyXG4gICAgY3Vyc29yOiBuLXJlc2l6ZTtcclxufVxyXG4ucmVzaXplQXJlYS50ciB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICByaWdodDogMDtcclxuICAgIGhlaWdodDogMTBweDtcclxuICAgIHdpZHRoOiAxMHB4O1xyXG4gICAgY3Vyc29yOiBuZS1yZXNpemU7XHJcbn1cclxuLnJlc2l6ZUFyZWEucmlnaHQge1xyXG4gICAgdG9wOiAxMHB4O1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBib3R0b206IDEwcHg7XHJcbiAgICB3aWR0aDogQHJlc2l6ZTtcclxuICAgIGN1cnNvcjogZS1yZXNpemU7XHJcbn1cclxuLnJlc2l6ZUFyZWEuYnIge1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBoZWlnaHQ6IDEwcHg7XHJcbiAgICB3aWR0aDogMTBweDtcclxuICAgIGN1cnNvcjogc2UtcmVzaXplO1xyXG59XHJcbi5yZXNpemVBcmVhLmJvdHRvbSB7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICBsZWZ0OiAxMHB4O1xyXG4gICAgcmlnaHQ6IDEwcHg7XHJcbiAgICBoZWlnaHQ6IEByZXNpemU7XHJcbiAgICBjdXJzb3I6IHMtcmVzaXplO1xyXG59XHJcbi5yZXNpemVBcmVhLmJsIHtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBoZWlnaHQ6IDEwcHg7XHJcbiAgICB3aWR0aDogMTBweDtcclxuICAgIGN1cnNvcjogc3ctcmVzaXplO1xyXG59XHJcbi5yZXNpemVBcmVhLmxlZnQge1xyXG4gICAgdG9wOiAxMHB4O1xyXG4gICAgbGVmdDogMDtcclxuICAgIGJvdHRvbTogMTBweDtcclxuICAgIHdpZHRoOiBAcmVzaXplO1xyXG4gICAgY3Vyc29yOiB3LXJlc2l6ZTtcclxufVxyXG4ucmVzaXplQXJlYS50bCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgaGVpZ2h0OiAxMHB4O1xyXG4gICAgd2lkdGg6IDEwcHg7XHJcbiAgICBjdXJzb3I6IG53LXJlc2l6ZTtcclxufVxyXG4vKiBFbmQgUmVzaXppbmcgKi8iLCIvKiBJY29uc1xyXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbi8qIHN0YXRlcyBhbmQgaW1hZ2VzICovXHJcbi51aUxpbmtQZW5kaW5nSWNvbiB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICB3aWR0aDogMTZweDtcclxuICAgIGhlaWdodDogMTZweDtcclxuICAgIG1hcmdpbjogMnB4IDJweCAwIDJweDtcclxuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCh1aUxpbmtQZW5kaW5nSWNvbi5naWYpO1xyXG59XHJcblxyXG4ubGlua1BlbmRpbmcgLmZhIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi5saW5rUGVuZGluZyAudWlMaW5rUGVuZGluZ0ljb24ge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuXHJcbi5tYXBJY29uMTYge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgd2lkdGg6IDE2cHg7XHJcbiAgICBoZWlnaHQ6IDE2cHg7XHJcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2R3JlZW4ucG5nKTtcclxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtOTZweDtcclxuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XHJcbiAgICB6b29tOiAwLjEyNTtcclxuICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xyXG4gICAgLyptYXJnaW4tYm90dG9tOiAtMXB4OyovXHJcbn1cclxuLm1hcEljb24xNi5kZWFkICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCh1aUljb25zMTZSZWQucG5nKTsgICAgfVxyXG4ubWFwSWNvbjE2LmJhZCAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKHVpSWNvbnMxNlJlZC5wbmcpOyAgICB9XHJcbi5tYXBJY29uMTYuYXZlcmFnZSAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2T3JhbmdlLnBuZyk7IH1cclxuLm1hcEljb24xNi5nb29kICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCh1aUljb25zMTZHcmVlbi5wbmcpOyAgfVxyXG4vKiBBaXJBbGFybSAqL1xyXG4ubWFwSWNvbjE2Lmljb24tYWlyYWxhcm0gICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTQ0cHg7ICAgICAgICAgICAgICB9IFxyXG4vKiBDb21tYW5kIFBvc2l0aW9ucyAqL1xyXG4ubWFwSWNvbjE2LnJhbmstY2FwdGFpbiAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC0xMTJweDsgICAgICAgICB9IFxyXG4ubWFwSWNvbjE2LnJhbmstaGVhZG9mcGVyc29ubmVsICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC05NnB4OyAgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay1oZWFkb2ZzZWN1cml0eSAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTEyOHB4OyAgICAgICAgIH1cclxuLm1hcEljb24xNi5yYW5rLWNoaWVmZW5naW5lZXIgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTEycHg7ICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstcmVzZWFyY2hkaXJlY3RvciAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDsgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay1jaGllZm1lZGljYWxvZmZpY2VyICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7ICAgICAgICAgIH1cclxuLyogRW5naW5lZXJpbmcgUG9zaXRpb25zICovXHJcbi5tYXBJY29uMTYucmFuay1zdGF0aW9uZW5naW5lZXIgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTExMnB4OyAgICAgICAgIH0gXHJcbi5tYXBJY29uMTYucmFuay1hdG1vc3BoZXJpY3RlY2huaWNpYW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTExMnB4OyAgICAgICAgIH1cclxuLyogTWVkaWNhbCBQb3NpdGlvbnMgKi9cclxuLm1hcEljb24xNi5yYW5rLW1lZGljYWxkb2N0b3IgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4OyAgICAgICAgICAgfSBcclxuLm1hcEljb24xNi5yYW5rLWdlbmV0aWNpc3QgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4OyAgICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstcHN5Y2hpYXRyaXN0ICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7ICAgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay1jaGVtaXN0ICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7ICAgICAgICAgIH1cclxuLyogU2NpZW5jZSBQb3NpdGlvbnMgKi9cclxuLm1hcEljb24xNi5yYW5rLXNjaWVudGlzdCAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7ICAgICAgICAgfSBcclxuLm1hcEljb24xNi5yYW5rLWdlbmV0aWNpc3QgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7ICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstcm9ib3RpY2lzdCAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDsgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay14ZW5vYmlvbG9naXN0ICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTEyOHB4OyAgICAgICAgIH1cclxuLyogU2VjdXJpdHkgUG9zaXRpb25zICovXHJcbi5tYXBJY29uMTYucmFuay13YXJkZW4gICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTEyOHB4OyAgICAgICAgIH1cclxuLm1hcEljb24xNi5yYW5rLWRldGVjdGl2ZSAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTI4cHg7ICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstc2VjdXJpdHlvZmZpY2VyICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMjhweDsgICAgICAgICB9IiwidWwge1xyXG4gICAgcGFkZGluZzogNHB4IDAgMCAxMHB4O1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xyXG59XHJcblxyXG5saSB7XHJcbiAgICBwYWRkaW5nOiAwIDAgMnB4IDA7XHJcbn1cclxuXHJcbnRhYmxlLmZpeGVkIHtcclxuICAgIHRhYmxlLWxheW91dDpmaXhlZDtcclxufVxyXG5cclxudGFibGUuZml4ZWQgdGQge1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuLyogVGFibGUgc3R5bGluZyBmb3IgdGhlIHBvd2VyIG1vbml0b3IgKi9cclxudGFibGUucG1vbiB7XHJcbiAgICBib3JkZXI6IDJweCBzb2xpZCBSb3lhbEJsdWU7XHJcbn1cclxuXHJcbnRhYmxlLnBtb24gdGQsIHRhYmxlLnBtb24gdGgge1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCBibGFjaztcclxuICAgIHBhZGRpbmc6IDBweCA1cHggMHB4IDVweDtcclxufVxyXG5cclxuLyogVGFibGUgc3R5bGluZyBmb3IgdGhlIGNyZXcgbWFuaWZlc3QgKi9cclxuLm1hbmlmZXN0LWhlYWRlcihAY29sb3I6ICM2NjYpIHtcclxuXHRiYWNrZ3JvdW5kOiBAY29sb3I7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG59XHJcblxyXG50aC5jb21tYW5kIHtcclxuXHQubWFuaWZlc3QtaGVhZGVyKCMzMzMzRkYpO1xyXG59XHJcblxyXG50aC5zZWMge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXIoIzhlMDAwMCk7XHJcbn1cclxuXHJcbnRoLm1lZCB7XHJcblx0Lm1hbmlmZXN0LWhlYWRlcigjMDA2NjAwKTtcclxufVxyXG5cclxudGguZW5nIHtcclxuXHQubWFuaWZlc3QtaGVhZGVyKCNiMjczMDApO1xyXG59XHJcblxyXG50aC5zY2kge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXIoI2E2NWJhNik7XHJcbn1cclxuXHJcbnRoLnNlciB7XHJcblx0Lm1hbmlmZXN0LWhlYWRlcigjNzEwMEFBKTtcclxufVxyXG5cclxudGguc3VwIHtcclxuXHQubWFuaWZlc3QtaGVhZGVyKCM2NjY2MjEpO1xyXG59XHJcblxyXG50aC5jaXYge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXIoI2EzMjgwMCk7XHJcbn1cclxuXHJcbnRoLm1pc2Mge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXI7XHJcbn1cclxuXHJcbnNwYW4ucW0tam9iIHtcclxuXHRjb2xvcjogbWl4KEBoaWdobGlnaHQtY29sb3IsIEBhdmVyYWdlLWNvbG9yLCAzMyUpO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi8qIFN0cmlwZWQgbGluZXMgZm9yIHRhYmxlcyBhbmQgZGl2cyAqL1xyXG4uc3RyaXBlZCB7XHJcbiAgICAuc3RyaXBlZC1iYXNlKCkge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM0MDQwNDA7XHJcbiAgICB9XHJcbiAgICB0cjpudGgtY2hpbGQoZXZlbikge1xyXG4gICAgICAgIC5zdHJpcGVkLWJhc2U7XHJcbiAgICB9XHJcbiAgICAmOm5vdCh0YWJsZSkgPiA6bnRoLWNoaWxkKGV2ZW4pIHtcclxuICAgICAgICAuc3RyaXBlZC1iYXNlO1xyXG4gICAgfVxyXG59IiwiI3VpTm9TY3JpcHQge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICBtYXJnaW46IC02MHB4IDAgMCAtMTUwcHg7XHJcbiAgICB3aWR0aDogMjgwcHg7XHJcbiAgICBoZWlnaHQ6IDEyMHB4O1xyXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcclxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNmZjAwMDA7XHJcbiAgICBjb2xvcjogIzAwMDAwMDtcclxuICAgIGZvbnQtc2l6ZTogMTBweDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgei1pbmRleDogOTk5OTtcclxuICAgIHBhZGRpbmc6IDBweCAxMHB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgIC5ub3RpY2UgfCBDYXV0aW9uIFN0cmlwZXNcclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuLm5vdGljZSB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBiYWNrZ3JvdW5kOiB1cmwodWlOb3RpY2VCYWNrZ3JvdW5kLmpwZykgNTAlIDUwJTtcclxuICAgIGNvbG9yOiAjMDAwMDAwO1xyXG4gICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBwYWRkaW5nOiAzcHggNHB4IDNweCA0cHg7XHJcbiAgICBtYXJnaW46IDRweCAwIDRweCAwO1xyXG59XHJcblxyXG4ubm90aWNlUGxhY2Vob2xkZXIge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBwYWRkaW5nOiAzcHggNHB4IDNweCA0cHg7XHJcbiAgICBtYXJnaW46IDRweCAwIDRweCAwO1xyXG59XHJcblxyXG4ubm90aWNlLmljb24ge1xyXG4gICAgcGFkZGluZzogMnB4IDRweCAwIDIwcHg7XHJcbn1cclxuXHJcbi5ub3RpY2UgaW1nIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTZweDtcclxuICAgIGhlaWdodDogMTZweDtcclxufVxyXG5cclxuZGl2Lm5vdGljZSB7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG4vKioqKioqKioqKioqKioqKioqKipcXFxyXG5cXCoqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICBQREEsIEROQSBNb2RpZmllciBzdHlsZXNcclxuICAgIERvbid0IGZpdCBhbnl3aGVyZSBlbHNlLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuLyogUERBIHN0eWxpbmcgKi9cclxuLndob2xlU2NyZWVuIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGNvbG9yOiAjNTE3MDg3O1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5wZGFsaW5rIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xyXG5cclxuXHQmLmRpc2FibGVkIHtcclxuXHRcdGJhY2tncm91bmQ6IG5vbmU7XHJcblx0XHRib3JkZXI6IG5vbmU7XHJcblx0XHRjb2xvcjogIzk5OTtcclxuXHRcdHRleHQtYWxpZ246IGxlZnQ7XHJcblx0fVxyXG59XHJcblxyXG4ucGRhbm90ZSB7XHJcbiAgICBjb2xvcjogI2NkNjUwMDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4uaXRlbS5tYWlubWVudSB7XHJcblx0cGFkZGluZy1ib3R0b206IDAuNWVtO1xyXG59XHJcblxyXG5kaXYuY2xvY2sge1xyXG5cdGNvbG9yOiB3aGl0ZTtcclxuXHRmb250LXdlaWdodDogYm9sZDtcclxuXHRmbG9hdDogcmlnaHQ7XHJcblx0cGFkZGluZy1yaWdodDogMmVtO1xyXG59XHJcblxyXG4jcGRhRm9vdGVyIHtcclxuXHRwb3NpdGlvbjogZml4ZWQ7XHJcblx0bGVmdDogMDtcclxuXHRib3R0b206IDA7XHJcblx0d2lkdGg6IDEwMCU7XHJcblx0YmFja2dyb3VuZDogQGRhcmstY29sb3I7XHJcbn1cclxuXHJcbi5wZGFGb290ZXJCdXR0b24ge1xyXG5cdHdpZHRoOiAzMyU7XHJcblx0cGFkZGluZzogMC41ZW0gMDtcclxuXHRmb250LXNpemU6IDIwMCU7XHJcblx0Ym9yZGVyOiBub25lO1xyXG5cdGJhY2tncm91bmQ6IG5vbmU7XHJcblx0Y29sb3I6ICNmZmY7XHJcblxyXG5cdCYuaG92ZXIge1xyXG5cdFx0YmFja2dyb3VuZDogIzUwN2FhYztcclxuXHR9XHJcblxyXG5cdCYuZGlzYWJsZWQge1xyXG5cdFx0YmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50O1xyXG5cdFx0Y29sb3I6ICM1NTUgIWltcG9ydGFudDtcclxuXHR9XHJcblxyXG5cdC51aUxpbmtQZW5kaW5nSWNvbiB7XHJcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XHJcblx0XHR3aWR0aDogMzMlO1xyXG5cdFx0YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuXHRcdGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcclxuXHR9XHJcbn1cclxuXHJcbi8qIEROQSBNb2RpZmllciBzdHlsaW5nICovXHJcbi5kbmFCbG9jayB7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIHdpZHRoOiA5MHB4O1xyXG4gICAgcGFkZGluZzogMCAwIDVweCAwO1xyXG59XHJcblxyXG4uZG5hQmxvY2tOdW1iZXIge1xyXG4gICAgZm9udC1mYW1pbHk6IEZpeGVkLCBtb25vc3BhY2U7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYmFja2dyb3VuZDogIzM2MzYzNjtcclxuICAgIG1pbi13aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5kbmFTdWJCbG9jayB7XHJcbiAgICBmb250LWZhbWlseTogRml4ZWQsIG1vbm9zcGFjZTtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1pbi13aWR0aDogMTZweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuLm1hc2sge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHRvcDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgYmFja2dyb3VuZDogdXJsKHVpTWFza0JhY2tncm91bmQucG5nKTtcclxufVxyXG5cclxuLm1hc2tDb250ZW50IHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAyMDBweDtcclxuICAgIG1hcmdpbjogMjAwcHggMDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG4vKioqKioqKioqKioqKioqKioqKipcXFxyXG5cXCoqKioqKioqKioqKioqKioqKioqLyIsIkBpbXBvcnQgXCJfY29uZmlnXCI7XHJcblxyXG5ib2R5IHtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgZm9udC1mYW1pbHk6IEBmb250O1xyXG4gICAgZm9udC1zaXplOiBAZm9udHNpemU7XHJcbiAgICBsaW5lLWhlaWdodDogMTcwJTtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbmhyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM0MDYyOGE7XHJcbiAgICBoZWlnaHQ6IDFweDtcclxuICAgIGJvcmRlcjogbm9uZTtcclxufVxyXG5cclxuaW1nLCBhIGltZyB7XHJcbiAgICBib3JkZXItc3R5bGU6IG5vbmU7XHJcbn1cclxuXHJcbmgxLCBoMiwgaDMsIGg0LCBoNSwgaDYge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMTJweCAwIDZweCAwO1xyXG4gICAgY29sb3I6ICNGRkZGRkY7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuaDEge1xyXG4gICAgZm9udC1zaXplOiAxOHB4O1xyXG59XHJcblxyXG5oMiB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbn1cclxuXHJcbmgzIHtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxufVxyXG5cclxuaDQge1xyXG4gICAgZm9udC1zaXplOiAxMnB4O1xyXG59IiwiKltkYXRhLXRvb2x0aXBdIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcblxyXG4gICY6OmFmdGVyIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHdpZHRoOiAyNTBweDtcclxuICAgIHBhZGRpbmc6IDEwcHg7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcblxyXG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gICAgb3BhY2l0eTogMDtcclxuXHJcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xyXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS10b29sdGlwKTtcclxuXHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgLjVzO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzNjM2MzY7XHJcbiAgfVxyXG5cclxuICAmOmhvdmVyOjphZnRlciB7XHJcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xyXG4gICAgb3BhY2l0eTogMTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcFRvcDo6YWZ0ZXIge1xyXG4gICAgYm90dG9tOiAxMDAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoOHB4KTtcclxuICB9XHJcbiAgJi50b29sdGlwVG9wOmhvdmVyOjphZnRlciB7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtOHB4KTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcEJvdHRvbTo6YWZ0ZXIge1xyXG4gICAgdG9wOiAxMDAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLThweCk7XHJcbiAgfVxyXG4gICYudG9vbHRpcEJvdHRvbTpob3Zlcjo6YWZ0ZXIge1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoOHB4KTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcExlZnQ6OmFmdGVyIHtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgcmlnaHQ6IDEwMCU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoOHB4KSB0cmFuc2xhdGVZKC01MCUpO1xyXG4gIH1cclxuICAmLnRvb2x0aXBMZWZ0OmhvdmVyOjphZnRlciB7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLThweCkgdHJhbnNsYXRlWSgtNTAlKTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcFJpZ2h0OjphZnRlciB7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDEwMCU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLThweCkgdHJhbnNsYXRlWSgtNTAlKTtcclxuICB9XHJcbiAgJi50b29sdGlwUmlnaHQ6aG92ZXI6OmFmdGVyIHtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg4cHgpIHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgfVxyXG59IixudWxsLCJAY2hhcnNldCBcInV0Zi04XCI7XHJcblxyXG5AaW1wb3J0IFwiX2JhcnNcIjtcclxuQGltcG9ydCBcIl9saW5rXCI7XHJcbkBpbXBvcnQgXCJfY29sb3JcIjtcclxuQGltcG9ydCBcIl9jb25maWdcIjtcclxuQGltcG9ydCBcIl9kaXNwbGF5XCI7XHJcbkBpbXBvcnQgXCJfZm9ybWF0dGluZ1wiO1xyXG5AaW1wb3J0IFwiX2ZhbmN5XCI7XHJcbkBpbXBvcnQgXCJfaWNvblwiO1xyXG5AaW1wb3J0IFwiX2xpc3RzXCI7XHJcbkBpbXBvcnQgXCJfbWlzY1wiO1xyXG5AaW1wb3J0IFwiX25hdGl2ZVwiO1xyXG5AaW1wb3J0IFwiX3Rvb2x0aXBcIjtcclxuXHJcblxyXG4ubWFpbkJHIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHotaW5kZXg6IC0xO1xyXG4gICAgdG9wOiAzMHB4O1xyXG4gICAgbGVmdDogMHB4O1xyXG4gICAgcmlnaHQ6IDBweDtcclxuICAgIGJvdHRvbTogMHB4O1xyXG4gICAgYmFja2dyb3VuZDogZGF0YS11cmkoJ25hbm90cmFzZW4uc3ZnJykgbm8tcmVwZWF0IGZpeGVkIGNlbnRlci83MCUgNzAlLFxyXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sXHJcbiAgICAgICAgQGJhY2tncm91bmQtc3RhcnQgMCUsXHJcbiAgICAgICAgQGJhY2tncm91bmQtZW5kIDEwMCUpIG5vLXJlcGVhdCBmaXhlZCBjZW50ZXIvMTAwJSAxMDAlO1xyXG59XHJcblxyXG4vL25hbm8gc2Nyb2xsYmFyIHN0eWxpbmdcclxuaHRtbCxib2R5IHtcclxuICAgIHNjcm9sbGJhci1mYWNlLWNvbG9yOiM2NjY2NjY7XHJcbiAgICBzY3JvbGxiYXItYXJyb3ctY29sb3I6I0U5QzE4MztcclxuICAgIHNjcm9sbGJhci10cmFjay1jb2xvcjojMzYzNjM2O1xyXG4gICAgc2Nyb2xsYmFyLXNoYWRvdy1jb2xvcjojNTU1NTU1OyAgICBcclxufVxyXG5cclxuI3VpV3JhcHBlciB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcclxuICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG59XHJcblxyXG4jdWlUaXRsZVdyYXBwZXIge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgbWluLWhlaWdodDogMzBweDtcclxuICAgIG1pbi13aWR0aDogMTAwJTsgXHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzYzNjM2O1xyXG4gICAgbGVmdDogMHB4O1xyXG4gICAgdG9wOiAwcHg7XHJcbiAgICByaWdodDogMHB4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIHotaW5kZXg6IDEwMDtcclxuICAgICYgPiBkaXYge1xyXG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcclxuICAgIH1cclxuICAgICYgPiBpIHtcclxuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbiN1aVRpdGxlVGV4dCB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDZweDtcclxuICAgIGxlZnQ6IDQ0cHg7XHJcbiAgICB3aWR0aDogNjYlO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGNvbG9yOiAjRTlDMTgzO1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG59XHJcblxyXG4jdWlUaXRsZS5pY29uIHtcclxuICAgIHBhZGRpbmc6IDZweCA4cHggNnB4IDQycHg7XHJcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggNTAlO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxufVxyXG5cclxuI3VpVGl0bGVGbHVmZiB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDRweDtcclxuICAgIHJpZ2h0OiAxMnB4O1xyXG4gICAgd2lkdGg6IDQycHg7XHJcbiAgICBoZWlnaHQ6IDI0cHg7XHJcbiAgICBiYWNrZ3JvdW5kOiBkYXRhLXVyaSgnbmFub3RyYXNlbi5zdmcnKSA1MCUgNTAlIG5vLXJlcGVhdDtcclxufVxyXG5cclxuLnN0YXR1c2ljb24ge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA0cHg7XHJcbiAgICBsZWZ0OiAxMnB4O1xyXG59XHJcblxyXG4jdWlNYXBXcmFwcGVyIHtcclxuICAgIGNsZWFyOiBib3RoO1xyXG4gICAgcGFkZGluZzogOHB4O1xyXG4gICAgbWFyZ2luLXRvcDogMzBweDtcclxufVxyXG5cclxuI3VpTWFwSGVhZGVyIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGNsZWFyOiBib3RoO1xyXG59XHJcblxyXG4jdWlNYXBDb250YWluZXIge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDYwMHB4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM0MDYyOGE7XHJcbiAgICBiYWNrZ3JvdW5kOiB1cmwobmFub21hcEJhY2tncm91bmQucG5nKTtcclxufVxyXG5cclxuI3VpTWFwIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgbWFyZ2luOiAtNTEycHggMCAwIC01MTJweDtcclxuICAgIHdpZHRoOiAyNTZweDtcclxuICAgIGhlaWdodDogMjU2cHg7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgem9vbTogNDtcclxufVxyXG5cclxuI3VpTWFwSW1hZ2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgYm90dG9tOiAxcHg7XHJcbiAgICBsZWZ0OiAxcHg7XHJcbiAgICB3aWR0aDogMjU2cHg7XHJcbiAgICBoZWlnaHQ6IDI1NnB4O1xyXG59XHJcblxyXG4jdWlNYXBDb250ZW50IHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGJvdHRvbTogLTEzLjVweDtcclxuICAgIGxlZnQ6IDBweDtcclxuICAgIHdpZHRoOiAyNTZweDtcclxuICAgIGhlaWdodDogMjU2cHg7XHJcbn1cclxuXHJcbiN1aU1hcEZvb3RlciB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuI3VpQ29udGVudCB7XHJcbiAgICBjbGVhcjogYm90aDtcclxuICAgIHBhZGRpbmc6IDhweDtcclxuICAgIG1hcmdpbi10b3A6IDMwcHg7XHJcbn1cclxuXHJcbiN1aU1hcFRvb2x0aXAge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgcmlnaHQ6IDEwcHg7XHJcbiAgICB0b3A6IDEwcHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjNDA2MjhhO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzI3MjcyNztcclxuICAgIHBhZGRpbmc6IDhweDtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB6LWluZGV4OiA5OTk5O1xyXG59XHJcblxyXG4jdWlMb2FkaW5nTm90aWNlIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGJhY2tncm91bmQ6IHVybCh1aU5vdGljZUJhY2tncm91bmQuanBnKSA1MCUgNTAlO1xyXG4gICAgY29sb3I6ICMwMDAwMDA7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIHBhZGRpbmc6IDNweCA0cHggM3B4IDRweDtcclxuICAgIG1hcmdpbjogNHB4IDAgNHB4IDA7XHJcbn1cclxuXHJcbi51bmRlclRpdGxlIHtcclxuICAgIG1hcmdpbi10b3A6IDMwcHg7XHJcbn0iXX0= */ +@charset "utf-8";@font-face{font-family:'FontAwesome';src:url(fontawesome-webfont.eot?v=4.7.0);src:url(fontawesome-webfont.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(fontawesome-webfont.woff2?v=4.7.0) format('woff2'),url(fontawesome-webfont.woff?v=4.7.0) format('woff'),url(fontawesome-webfont.ttf?v=4.7.0) format('truetype'),url(fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul > li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:0.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:0.2em 0.25em 0.15em;border:solid 0.08em #eee;border-radius:0.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:0.3em}.fa.fa-pull-right{margin-left:0.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:0.3em}.fa.pull-right{margin-left:0.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.displayBar{position:relative;width:236px;height:16px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000}.displayBarText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:normal}.displayBarFill{width:0%;height:100%;background:#40628a;overflow:hidden;float:left}.displayBarFill.alignRight{float:right}.displayBarText.good{color:#fff}.displayBarText.notgood{color:#fff}.displayBarText.average{color:#fff}.displayBarText.bad{color:#fff}.displayBarText.highlight{color:#000}.displayBarFill.good{color:#fff;background:#4f7529}.displayBarFill.notgood{color:#fff;background:#ffb400}.displayBarFill.average{color:#fff;background:#cd6500}.displayBarFill.bad{color:#fff;background:#e00}.displayBarFill.highlight{color:#fff;background:#8ba5c4}.disabled,.link,.linkDiscourage,.linkEncourage,.linkOff,.linkOn,.redButton,.selected,.yellowButton{float:left;min-width:15px;height:16px;text-align:center;color:#fff;text-decoration:none;background:#40628a;border:1px solid #161616;padding:0 4px 4px 4px;margin:0 2px 2px 0;cursor:default;white-space:nowrap}.hasIcon{padding:0 4px 4px 0}.linkActive.hover,.zoomLink.hover,a.hover{background:#507aac}@keyframes pendingAnimation{to{color:#fff;background:#507aac}}.linkPending,.linkPending.hover{animation-name:pendingAnimation;animation-duration:0.25s}a.white,a.white:active,a.white:link,a.white:visited{color:#40628a;text-decoration:none;background:#fff;border:1px solid #161616;padding:1px 4px 1px 4px;margin:0 2px 0 0;cursor:default}a.white.hover{color:#fff;background:#40628a}.linkOn,.selected,a.linkOn.hover,a.linkOn:active,a.linkOn:link,a.linkOn:visited,a.selected.hover,a.selected:active,a.selected:link,a.selected:visited{color:#fff;background:#2f943c}.disabled,.linkOff,a.disabled.hover,a.disabled:active,a.disabled:link,a.disabled:visited,a.linkOff.hover,a.linkOff:active,a.linkOff:link,a.linkOff:visited{color:#fff;background:#999;border-color:#666}.disabled.icon,.linkOff.icon,.linkOn.icon,.selected.icon,a.icon{position:relative;padding:1px 4px 2px 20px}.disabled.icon img,.linkOff.icon img,.linkOn.icon img,.selected.icon img,a.icon img{position:absolute;top:0;left:0;width:18px;height:18px}.linkDanger,a.linkDanger:active,a.linkDanger:link,a.linkDanger:visited{color:#fff;background-color:red;border-color:#a00}.linkDanger.hover{background-color:#f66}.linkEncourage,a.linkEncourage:active,a.linkEncourage:link,a.linkEncourage:visited{color:#9f3;background-color:#40628a;border-color:#161616}.linkEncourage.hover{background-color:#507aac}.linkDiscourage,a.linkDiscourage:active,a.linkDiscourage:link,a.linkDiscourage:visited{color:#8c8c8c;background-color:#40628a;border-color:#161616}.linkDiscourage.hover{color:red;background-color:#507aac}.inactive,a.inactive.hover,a.inactive:active,a.inactive:link,a.inactive:visited{color:#fff;background:#999;border-color:#666}.white{color:#fff;font-weight:bold}.good{color:#4f7529;font-weight:bold}.average{color:#cd6500;font-weight:bold}.bad{color:#e00;font-weight:bold}.idle{color:#272727;font-weight:bold}.redButton{background:#ea0000}.yellowButton{background:#cacc00}.highlight{color:#8ba5c4}.dark{color:#272727}.burn{color:orange}.brute{color:red}.toxin{color:green}.toxin_light{color:#3adf00}.oxyloss{color:#00f}.oxyloss_light{color:#6698ff}.Red{color:red}.Blue{color:#00f}.Green{color:#0f0}.Marigold{color:#fda505}.Fuschia{color:#ff0080}.Black{color:#000}.Pearl{color:#c6cacb}.cold1{color:#94b8ff}.cold2{color:#69f}.cold3{color:#293d66}.hot1{color:#f96}.hot2{color:#993d00}.hot3{color:#f60}div.display{padding:4px;margin:6px 0;background-color:#000;background-color:rgba(0, 0, 0, 0.33);box-shadow:inset 0 0 5px rgba(0, 0, 0, 0.5)}div.display header{display:block;position:relative;width:98.5%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}div.display header .buttonRight{position:absolute;bottom:6px;right:4px}div.display article{display:table;width:100%;border-collapse:collapse}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px;clear:both}.item{width:100%;margin:4px 0 0 0;clear:both;overflow:auto}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.block{padding:8px;margin:10px 4px 4px 4px;border:1px solid #40628a;background-color:#202020}.block h3{padding:0}.clearBoth{clear:both}.clearLeft{clear:left}.clearRight{clear:right}.line{width:100%;clear:both}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.floatRight{float:right}.floatLeft{float:left}.hidden{display:none}.statusDisplay{background:#000;background:rgba(0, 0, 0, 0.5);color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0;overflow:hidden}.statusDisplayRecords{background:#000;background:rgba(0, 0, 0, 0.5);color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0;overflow-x:hidden;overflow-y:auto}.statusLabel{width:138px;float:left;overflow:hidden;color:#98b0c3}.statusValue{float:left}.jobValues{float:left;width:30%}.fancy{display:none}i.fancy{display:none}.minimize{color:#e9c183;cursor:pointer!important;z-index:102;position:absolute;top:6px;right:46px}.minimize:hover{color:#b8c9d6}.close{color:#e9c183;cursor:pointer!important;z-index:102;position:absolute;top:4px;right:12px}.close:hover{color:#b8c9d6}#uiCornerTL{position:fixed;z-index:101;min-width:30px;min-height:30px;top:0;left:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGTGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTExLTIwVDIyOjM4OjI1LTA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOC0xMS0yMFQyMzowMzowMS0wODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOC0xMS0yMFQyMzowMzowMS0wODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpkOWRlMzc1Yi04ZWQwLWI3NDctOTQzZS0zN2UwZGU2NDkyODQiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo0ZmVhZjJmZC03YWVhLWUyNGQtYTNkZS05ZmI5ZGM0ZTA0YzIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjZTU4OTk5My1mZDU2LTEzNDktYWMyMC03NGZkZmY5NjNjYTgiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmNlNTg5OTkzLWZkNTYtMTM0OS1hYzIwLTc0ZmRmZjk2M2NhOCIgc3RFdnQ6d2hlbj0iMjAxOC0xMS0yMFQyMjozODoyNS0wODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvZ2lmIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZDlkZTM3NWItOGVkMC1iNzQ3LTk0M2UtMzdlMGRlNjQ5Mjg0IiBzdEV2dDp3aGVuPSIyMDE4LTExLTIwVDIzOjAzOjAxLTA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+QnRKRAAAAIhJREFUSIm1zLcRgEAMBMCDokQf9B/SBwQwmOeNzGkL2GnHhgSLrHPSC4Bfny+/vl9y/X6ZdfHS6v/LqasvoW690brzhur+66+Hr7PWvJ5a+Zpr/WurTa+htr7a2vGqat87rt3voI68vTr4Nuv4W68pb6VmvWVNfD81931q+nvVGS+ASUQyXgAHuOgYYwOkhIYAAAAASUVORK5CYII=) no-repeat}.resizeArea{position:absolute;z-index:99999}.resizeArea.top{top:0;left:10px;right:10px;height:5px;cursor:n-resize}.resizeArea.tr{top:0;right:0;height:10px;width:10px;cursor:ne-resize}.resizeArea.right{top:10px;right:0;bottom:10px;width:5px;cursor:e-resize}.resizeArea.br{bottom:0;right:0;height:10px;width:10px;cursor:se-resize}.resizeArea.bottom{bottom:0;left:10px;right:10px;height:5px;cursor:s-resize}.resizeArea.bl{bottom:0;left:0;height:10px;width:10px;cursor:sw-resize}.resizeArea.left{top:10px;left:0;bottom:10px;width:5px;cursor:w-resize}.resizeArea.tl{top:0;left:0;height:10px;width:10px;cursor:nw-resize}.uiLinkPendingIcon{display:none;float:left;width:16px;height:16px;margin:2px 2px 0 2px;background-image:url(uiLinkPendingIcon.gif)}.linkPending .fa{display:none}.linkPending .uiLinkPendingIcon{display:block}.mapIcon16{position:absolute;width:16px;height:16px;background-image:url(uiIcons16Green.png);background-position:-144px -96px;background-repeat:no-repeat;zoom:0.125;margin-left:-1px}.mapIcon16.dead{background-image:url(uiIcons16Red.png)}.mapIcon16.bad{background-image:url(uiIcons16Red.png)}.mapIcon16.average{background-image:url(uiIcons16Orange.png)}.mapIcon16.good{background-image:url(uiIcons16Green.png)}.mapIcon16.icon-airalarm{background-position:0 -144px}.mapIcon16.rank-captain{background-position:-224px -112px}.mapIcon16.rank-headofpersonnel{background-position:-112px -96px}.mapIcon16.rank-headofsecurity{background-position:-112px -128px}.mapIcon16.rank-chiefengineer{background-position:-176px -112px}.mapIcon16.rank-researchdirector{background-position:-128px -128px}.mapIcon16.rank-chiefmedicalofficer{background-position:-32px -128px}.mapIcon16.rank-stationengineer{background-position:-176px -112px}.mapIcon16.rank-atmospherictechnician{background-position:-176px -112px}.mapIcon16.rank-medicaldoctor{background-position:-32px -128px}.mapIcon16.rank-geneticist{background-position:-32px -128px}.mapIcon16.rank-psychiatrist{background-position:-32px -128px}.mapIcon16.rank-chemist{background-position:-32px -128px}.mapIcon16.rank-scientist{background-position:-128px -128px}.mapIcon16.rank-geneticist{background-position:-128px -128px}.mapIcon16.rank-roboticist{background-position:-128px -128px}.mapIcon16.rank-xenobiologist{background-position:-128px -128px}.mapIcon16.rank-warden{background-position:-112px -128px}.mapIcon16.rank-detective{background-position:-112px -128px}.mapIcon16.rank-securityofficer{background-position:-112px -128px}ul{padding:4px 0 0 10px;margin:0;list-style-type:none}li{padding:0 0 2px 0}table.fixed{table-layout:fixed}table.fixed td{overflow:hidden}table.pmon{border:2px solid #4169e1}table.pmon td,table.pmon th{border-bottom:1px dotted #000;padding:0 5px 0 5px}th.command{background:#33f;font-weight:bold;color:#fff}th.sec{background:#8e0000;font-weight:bold;color:#fff}th.med{background:#060;font-weight:bold;color:#fff}th.eng{background:#b27300;font-weight:bold;color:#fff}th.sci{background:#a65ba6;font-weight:bold;color:#fff}th.ser{background:#7100aa;font-weight:bold;color:#fff}th.sup{background:#666621;font-weight:bold;color:#fff}th.civ{background:#a32800;font-weight:bold;color:#fff}th.misc{background:#666;font-weight:bold;color:#fff}span.qm-job{color:#b77a41;font-weight:bold}.striped tr:nth-child(even){background-color:#404040}.striped:not(table) > :nth-child(even){background-color:#404040}#uiNoScript{position:fixed;top:50%;left:50%;margin:-60px 0 0 -150px;width:280px;height:120px;background:#fff;border:2px solid red;color:#000;font-size:10px;font-weight:bold;z-index:9999;padding:0 10px;text-align:center}.notice{position:relative;background:url(uiNoticeBackground.jpg) 50% 50%;color:#000;font-size:12px;font-style:italic;font-weight:bold;padding:3px 4px 3px 4px;margin:4px 0 4px 0}.noticePlaceholder{position:relative;font-size:12px;font-style:italic;font-weight:bold;padding:3px 4px 3px 4px;margin:4px 0 4px 0}.notice.icon{padding:2px 4px 0 20px}.notice img{position:absolute;top:0;left:0;width:16px;height:16px}div.notice{clear:both}.wholeScreen{position:absolute;color:#517087;font-size:16px;font-weight:bold;text-align:center}.pdalink{float:left;white-space:nowrap;cursor:default!important}.pdalink.disabled{background:none;border:none;color:#999;text-align:left}.pdanote{color:#cd6500;font-weight:bold}.item.mainmenu{padding-bottom:0.5em}div.clock{color:#fff;font-weight:bold;float:right;padding-right:2em}#pdaFooter{position:fixed;left:0;bottom:0;width:100%;background:#272727}.pdaFooterButton{width:33%;padding:0.5em 0;font-size:200%;border:none;background:none;color:#fff}.pdaFooterButton.hover{background:#507aac}.pdaFooterButton.disabled{background:none!important;color:#555!important}.pdaFooterButton .uiLinkPendingIcon{position:absolute;width:33%;background-repeat:no-repeat;background-position:center}.dnaBlock{float:left;width:90px;padding:0 0 5px 0}.dnaBlockNumber{font-family:Fixed,monospace;float:left;color:#fff;background:#363636;min-width:20px;height:20px;padding:0;text-align:center}.dnaSubBlock{font-family:Fixed,monospace;float:left;padding:0;min-width:16px;height:20px;text-align:center}.mask{position:fixed;left:0;top:0;width:100%;height:100%;background:url(uiMaskBackground.png)}.maskContent{width:100%;height:200px;margin:200px 0;text-align:center}body{color:#fff;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;margin:0;padding:0}hr{background-color:#40628a;height:1px;border:none}a img,img{border-style:none}h1,h2,h3,h4,h5,h6{margin:0;padding:12px 0 6px 0;color:#fff;clear:both}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}*[data-tooltip]{position:relative}*[data-tooltip]::after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";opacity:0;white-space:normal;text-align:left;content:attr(data-tooltip);transition:all 0.5s;border:1px solid #999;background-color:#363636}*[data-tooltip]:hover::after{visibility:visible;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";opacity:1}*[data-tooltip].tooltipTop::after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}*[data-tooltip].tooltipTop:hover::after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}*[data-tooltip].tooltipBottom::after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}*[data-tooltip].tooltipBottom:hover::after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}*[data-tooltip].tooltipLeft::after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}*[data-tooltip].tooltipLeft:hover::after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}*[data-tooltip].tooltipRight::after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}*[data-tooltip].tooltipRight:hover::after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}.mainBG{position:fixed;z-index:-1;top:30px;left:0;right:0;bottom:0;background:url(data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0D%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.0%22%20viewBox%3D%220%200%20425%20200%22%20opacity%3D%22.25%22%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20178.00399%2C0.03869%20-71.20393%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76134%2C6.02555%20l%200%2C187.87147%20a%206.7613422%2C6.0255495%200%200%200%206.76134%2C6.02554%20l%2053.1072%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-101.544018%2072.21628%2C104.699398%20a%206.7613422%2C6.0255495%200%200%200%205.76015%2C2.87016%20l%2073.55487%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-187.87147%20a%206.7613422%2C6.0255495%200%200%200%20-6.76135%2C-6.02555%20l%20-54.71644%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76133%2C6.02555%20l%200%2C102.61935%20L%20183.76413%2C2.90886%20a%206.7613422%2C6.0255495%200%200%200%20-5.76014%2C-2.87017%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22M%204.8446333%2C22.10875%20A%2013.412039%2C12.501842%200%200%201%2013.477588%2C0.03924%20l%2066.118315%2C0%20a%205.3648158%2C5.000737%200%200%201%205.364823%2C5.00073%20l%200%2C79.87931%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20420.15535%2C177.89119%20a%2013.412038%2C12.501842%200%200%201%20-8.63295%2C22.06951%20l%20-66.11832%2C0%20a%205.3648152%2C5.000737%200%200%201%20-5.36482%2C-5.00074%20l%200%2C-79.87931%20z%22%20%2F%3E%0D%0A%3C%2Fsvg%3E%0D%0A) no-repeat fixed center/70% 70%,linear-gradient(to bottom, #2a2a2a 0, #202020 100%) no-repeat fixed center/100% 100%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a', endColorstr='#ff202020', GradientType=0)}body,html{scrollbar-face-color:#666;scrollbar-arrow-color:#e9c183;scrollbar-track-color:#363636;scrollbar-shadow-color:#555}#uiWrapper{width:100%;height:100%;-ms-user-select:none;user-select:none}#uiTitleWrapper{position:fixed;min-height:30px;min-width:100%;background-color:#363636;left:0;top:0;right:0;overflow:hidden;z-index:100}#uiTitleWrapper > div{cursor:default}#uiTitleWrapper > i{cursor:default}#uiTitleText{position:absolute;top:6px;left:44px;width:66%;overflow:hidden;color:#e9c183;font-size:16px}#uiTitle.icon{padding:6px 8px 6px 42px;background-position:2px 50%;background-repeat:no-repeat}#uiTitleFluff{position:absolute;top:4px;right:12px;width:42px;height:24px;background:url(data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0D%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.0%22%20viewBox%3D%220%200%20425%20200%22%20opacity%3D%22.25%22%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20178.00399%2C0.03869%20-71.20393%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76134%2C6.02555%20l%200%2C187.87147%20a%206.7613422%2C6.0255495%200%200%200%206.76134%2C6.02554%20l%2053.1072%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-101.544018%2072.21628%2C104.699398%20a%206.7613422%2C6.0255495%200%200%200%205.76015%2C2.87016%20l%2073.55487%2C0%20a%206.7613422%2C6.0255495%200%200%200%206.76135%2C-6.02554%20l%200%2C-187.87147%20a%206.7613422%2C6.0255495%200%200%200%20-6.76135%2C-6.02555%20l%20-54.71644%2C0%20a%206.7613422%2C6.0255495%200%200%200%20-6.76133%2C6.02555%20l%200%2C102.61935%20L%20183.76413%2C2.90886%20a%206.7613422%2C6.0255495%200%200%200%20-5.76014%2C-2.87017%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22M%204.8446333%2C22.10875%20A%2013.412039%2C12.501842%200%200%201%2013.477588%2C0.03924%20l%2066.118315%2C0%20a%205.3648158%2C5.000737%200%200%201%205.364823%2C5.00073%20l%200%2C79.87931%20z%22%20%2F%3E%0D%0A%20%20%3Cpath%20d%3D%22m%20420.15535%2C177.89119%20a%2013.412038%2C12.501842%200%200%201%20-8.63295%2C22.06951%20l%20-66.11832%2C0%20a%205.3648152%2C5.000737%200%200%201%20-5.36482%2C-5.00074%20l%200%2C-79.87931%20z%22%20%2F%3E%0D%0A%3C%2Fsvg%3E%0D%0A) 50% 50% no-repeat}.statusicon{position:absolute;top:4px;left:12px}#uiMapWrapper{clear:both;padding:8px;margin-top:30px}#uiMapHeader{position:relative;clear:both}#uiMapContainer{position:relative;width:100%;height:600px;overflow:hidden;border:1px solid #40628a;background:url(nanomapBackground.png)}#uiMap{position:absolute;top:50%;left:50%;margin:-512px 0 0 -512px;width:256px;height:256px;overflow:hidden;zoom:4}#uiMapImage{position:absolute;bottom:1px;left:1px;width:256px;height:256px}#uiMapContent{position:absolute;bottom:-13.5px;left:0;width:256px;height:256px}#uiMapFooter{position:relative;clear:both}#uiContent{clear:both;padding:8px;margin-top:30px}#uiMapTooltip{position:absolute;right:10px;top:10px;border:1px solid #40628a;background-color:#272727;padding:8px;display:none;z-index:9999}#uiLoadingNotice{position:relative;background:url(uiNoticeBackground.jpg) 50% 50%;color:#000;font-size:14px;font-style:italic;font-weight:bold;padding:3px 4px 3px 4px;margin:4px 0 4px 0}.underTitle{margin-top:30px} +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhdGgubGVzcyIsImljb25zLmxlc3MiLCJjb3JlLmxlc3MiLCJsYXJnZXIubGVzcyIsImZpeGVkLXdpZHRoLmxlc3MiLCJsaXN0Lmxlc3MiLCJib3JkZXJlZC1wdWxsZWQubGVzcyIsImFuaW1hdGVkLmxlc3MiLCJtaXhpbnMubGVzcyIsIm5hbm91aS5jc3MiLCJyb3RhdGVkLWZsaXBwZWQubGVzcyIsInN0YWNrZWQubGVzcyIsInNjcmVlbi1yZWFkZXIubGVzcyIsIl9iYXJzLmxlc3MiLCJfbGluay5sZXNzIiwiX2NvbG9yLmxlc3MiLCJfZGlzcGxheS5sZXNzIiwiX2Zvcm1hdHRpbmcubGVzcyIsIl9mYW5jeS5sZXNzIiwiX2ljb24ubGVzcyIsIl9saXN0cy5sZXNzIiwiX21pc2MubGVzcyIsIl9uYXRpdmUubGVzcyIsIl90b29sdGlwLmxlc3MiLCI8bm8gc291cmNlPiIsIm5hbm91aS5sZXNzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJpQkFHQSxXQUNFLFlBQUEsY0FDQSxJQUFBLHFDQUNBLElBQUEsNENBQUEsMkJBQUEsQ0FBQSx1Q0FBQSxlQUFBLENBQUEsc0NBQUEsY0FBQSxDQUFBLHFDQUFBLGtCQUFBLENBQUEsd0RBQUEsY0FNQSxZQUFBLE9BQ0EsV0FBQSxPQ2JELElDSUMsUUFBQSxhQUNBLEtBQUEsT0FBQSxPQUFBLE9BQUEsSUFBQSxDQUFBLEVBQUEsWUFDQSxVQUFBLFFBQ0EsZUFBQSxLQUNBLHVCQUFBLFlBQ0Esd0JBQUEsVURURCxPRUtDLFVBQUEsYUFDQSxZQUFBLE9BQ0EsZUFBQSxLRlBELE9FU3NCLFVBQUEsSUZUdEIsT0VVc0IsVUFBQSxJRlZ0QixPRVdzQixVQUFBLElGWHRCLE9FWXNCLFVBQUEsSUZadEIsT0dHQyxNQUFBLGFBQ0EsV0FBQSxPSEpELE9JSUMsYUFBQSxFQUNBLFlBQUEsYUFDQSxnQkFBQSxLSk5ELFlJT1EsU0FBQSxTSlBSLE9JVUMsU0FBQSxTQUNBLEtBQUEsY0FDQSxNQUFBLGFBQ0EsSUFBQSxhQUNBLFdB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LE1BQUEsS0FDQSxRQUFBLElBQ0EsV0FBQSxLQUdKLGNBQ0ksU0FBQSxTQUNBLE1BQUEsS0FDQSxJQUFBLEtBQ0EsT0FBQSxJQUFBLE1BQUEsUUFDQSxpQkFBQSxRQUNBLFFBQUEsSUFDQSxRQUFBLEtBQ0EsUUFBQSxLQUdKLGlCQUNJLFNBQUEsU0FDQSxXQUFBLDRCQUFBLElBQUEsSUFDQSxNQUFBLEtBQ0EsVUFBQSxLQUNBLFdBQUEsT0FDQSxZQUFBLEtBQ0EsUUFBQSxJQUFBLElBQUEsSUFBQSxJQUNBLE9BQUEsSUFBQSxFQUFBLElBQUEsRUFHSixZQUNJLFdBQUEiLCJmaWxlIjoibmFub3VpLmNzcyIsInNvdXJjZXNDb250ZW50IjpbbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIi8qIVxuICogIEZvbnQgQXdlc29tZSA0LjcuMCBieSBAZGF2ZWdhbmR5IC0gaHR0cDovL2ZvbnRhd2Vzb21lLmlvIC0gQGZvbnRhd2Vzb21lXG4gKiAgTGljZW5zZSAtIGh0dHA6Ly9mb250YXdlc29tZS5pby9saWNlbnNlIChGb250OiBTSUwgT0ZMIDEuMSwgQ1NTOiBNSVQgTGljZW5zZSlcbiAqL1xuLyogRk9OVCBQQVRIXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiAnRm9udEF3ZXNvbWUnO1xuICBzcmM6IHVybCgnZm9udGF3ZXNvbWUtd2ViZm9udC5lb3Q/dj00LjcuMCcpO1xuICBzcmM6IHVybCgnZm9udGF3ZXNvbWUtd2ViZm9udC5lb3Q/I2llZml4JnY9NC43LjAnKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksIHVybCgnZm9udGF3ZXNvbWUtd2ViZm9udC53b2ZmMj92PTQuNy4wJykgZm9ybWF0KCd3b2ZmMicpLCB1cmwoJ2ZvbnRhd2Vzb21lLXdlYmZvbnQud29mZj92PTQuNy4wJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnZm9udGF3ZXNvbWUtd2ViZm9udC50dGY/dj00LjcuMCcpIGZvcm1hdCgndHJ1ZXR5cGUnKSwgdXJsKCdmb250YXdlc29tZS13ZWJmb250LnN2Zz92PTQuNy4wI2ZvbnRhd2Vzb21lcmVndWxhcicpIGZvcm1hdCgnc3ZnJyk7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbn1cbi5mYSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgZm9udDogbm9ybWFsIG5vcm1hbCBub3JtYWwgMTRweC8xIEZvbnRBd2Vzb21lO1xuICBmb250LXNpemU6IGluaGVyaXQ7XG4gIHRleHQtcmVuZGVyaW5nOiBhdXRvO1xuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcbn1cbi8qIG1ha2VzIHRoZSBmb250IDMzJSBsYXJnZXIgcmVsYXRpdmUgdG8gdGhlIGljb24gY29udGFpbmVyICovXG4uZmEtbGcge1xuICBmb250LXNpemU6IDEuMzMzMzMzMzNlbTtcbiAgbGluZS1oZWlnaHQ6IDAuNzVlbTtcbiAgdmVydGljYWwtYWxpZ246IC0xNSU7XG59XG4uZmEtMngge1xuICBmb250LXNpemU6IDJlbTtcbn1cbi5mYS0zeCB7XG4gIGZvbnQtc2l6ZTogM2VtO1xufVxuLmZhLTR4IHtcbiAgZm9udC1zaXplOiA0ZW07XG59XG4uZmEtNXgge1xuICBmb250LXNpemU6IDVlbTtcbn1cbi5mYS1mdyB7XG4gIHdpZHRoOiAxLjI4NTcxNDI5ZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5mYS11bCB7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgbWFyZ2luLWxlZnQ6IDIuMTQyODU3MTRlbTtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xufVxuLmZhLXVsID4gbGkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4uZmEtbGkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IC0yLjE0Mjg1NzE0ZW07XG4gIHdpZHRoOiAyLjE0Mjg1NzE0ZW07XG4gIHRvcDogMC4xNDI4NTcxNGVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG4uZmEtbGkuZmEtbGcge1xuICBsZWZ0OiAtMS44NTcxNDI4NmVtO1xufVxuLmZhLWJvcmRlciB7XG4gIHBhZGRpbmc6IDAuMmVtIDAuMjVlbSAwLjE1ZW07XG4gIGJvcmRlcjogc29saWQgMC4wOGVtICNlZWU7XG4gIGJvcmRlci1yYWRpdXM6IDAuMWVtO1xufVxuLmZhLXB1bGwtbGVmdCB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuLmZhLXB1bGwtcmlnaHQge1xuICBmbG9hdDogcmlnaHQ7XG59XG4uZmEuZmEtcHVsbC1sZWZ0IHtcbiAgbWFyZ2luLXJpZ2h0OiAwLjNlbTtcbn1cbi5mYS5mYS1wdWxsLXJpZ2h0IHtcbiAgbWFyZ2luLWxlZnQ6IDAuM2VtO1xufVxuLyogRGVwcmVjYXRlZCBhcyBvZiA0LjQuMCAqL1xuLnB1bGwtcmlnaHQge1xuICBmbG9hdDogcmlnaHQ7XG59XG4ucHVsbC1sZWZ0IHtcbiAgZmxvYXQ6IGxlZnQ7XG59XG4uZmEucHVsbC1sZWZ0IHtcbiAgbWFyZ2luLXJpZ2h0OiAwLjNlbTtcbn1cbi5mYS5wdWxsLXJpZ2h0IHtcbiAgbWFyZ2luLWxlZnQ6IDAuM2VtO1xufVxuLmZhLXNwaW4ge1xuICBhbmltYXRpb246IGZhLXNwaW4gMnMgaW5maW5pdGUgbGluZWFyO1xufVxuLmZhLXB1bHNlIHtcbiAgYW5pbWF0aW9uOiBmYS1zcGluIDFzIGluZmluaXRlIHN0ZXBzKDgpO1xufVxuQGtleWZyYW1lcyBmYS1zcGluIHtcbiAgMCUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICB9XG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDM1OWRlZyk7XG4gIH1cbn1cbi5mYS1yb3RhdGUtOTAge1xuICAtbXMtZmlsdGVyOiBcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPTEpXCI7XG4gIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XG4gIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbn1cbi5mYS1yb3RhdGUtMTgwIHtcbiAgLW1zLWZpbHRlcjogXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0yKVwiO1xuICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbn1cbi5mYS1yb3RhdGUtMjcwIHtcbiAgLW1zLWZpbHRlcjogXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0zKVwiO1xuICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTtcbn1cbi5mYS1mbGlwLWhvcml6b250YWwge1xuICAtbXMtZmlsdGVyOiBcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPTAsIG1pcnJvcj0xKVwiO1xuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgtMSwgMSk7XG4gIHRyYW5zZm9ybTogc2NhbGUoLTEsIDEpO1xufVxuLmZhLWZsaXAtdmVydGljYWwge1xuICAtbXMtZmlsdGVyOiBcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPTIsIG1pcnJvcj0xKVwiO1xuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgxLCAtMSk7XG4gIHRyYW5zZm9ybTogc2NhbGUoMSwgLTEpO1xufVxuOnJvb3QgLmZhLXJvdGF0ZS05MCxcbjpyb290IC5mYS1yb3RhdGUtMTgwLFxuOnJvb3QgLmZhLXJvdGF0ZS0yNzAsXG46cm9vdCAuZmEtZmxpcC1ob3Jpem9udGFsLFxuOnJvb3QgLmZhLWZsaXAtdmVydGljYWwge1xuICBmaWx0ZXI6IG5vbmU7XG59XG4uZmEtc3RhY2sge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDJlbTtcbiAgaGVpZ2h0OiAyZW07XG4gIGxpbmUtaGVpZ2h0OiAyZW07XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG4uZmEtc3RhY2stMXgsXG4uZmEtc3RhY2stMngge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG4uZmEtc3RhY2stMXgge1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbn1cbi5mYS1zdGFjay0yeCB7XG4gIGZvbnQtc2l6ZTogMmVtO1xufVxuLmZhLWludmVyc2Uge1xuICBjb2xvcjogI2ZmZjtcbn1cbi8qIEZvbnQgQXdlc29tZSB1c2VzIHRoZSBVbmljb2RlIFByaXZhdGUgVXNlIEFyZWEgKFBVQSkgdG8gZW5zdXJlIHNjcmVlblxuICAgcmVhZGVycyBkbyBub3QgcmVhZCBvZmYgcmFuZG9tIGNoYXJhY3RlcnMgdGhhdCByZXByZXNlbnQgaWNvbnMgKi9cbi5mYS1nbGFzczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAwMFwiO1xufVxuLmZhLW11c2ljOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDAxXCI7XG59XG4uZmEtc2VhcmNoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDAyXCI7XG59XG4uZmEtZW52ZWxvcGUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAwM1wiO1xufVxuLmZhLWhlYXJ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDA0XCI7XG59XG4uZmEtc3RhcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAwNVwiO1xufVxuLmZhLXN0YXItbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAwNlwiO1xufVxuLmZhLXVzZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMDdcIjtcbn1cbi5mYS1maWxtOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDA4XCI7XG59XG4uZmEtdGgtbGFyZ2U6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMDlcIjtcbn1cbi5mYS10aDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAwYVwiO1xufVxuLmZhLXRoLWxpc3Q6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMGJcIjtcbn1cbi5mYS1jaGVjazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAwY1wiO1xufVxuLmZhLXJlbW92ZTpiZWZvcmUsXG4uZmEtY2xvc2U6YmVmb3JlLFxuLmZhLXRpbWVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDBkXCI7XG59XG4uZmEtc2VhcmNoLXBsdXM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMGVcIjtcbn1cbi5mYS1zZWFyY2gtbWludXM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMTBcIjtcbn1cbi5mYS1wb3dlci1vZmY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMTFcIjtcbn1cbi5mYS1zaWduYWw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMTJcIjtcbn1cbi5mYS1nZWFyOmJlZm9yZSxcbi5mYS1jb2c6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMTNcIjtcbn1cbi5mYS10cmFzaC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDE0XCI7XG59XG4uZmEtaG9tZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAxNVwiO1xufVxuLmZhLWZpbGUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAxNlwiO1xufVxuLmZhLWNsb2NrLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMTdcIjtcbn1cbi5mYS1yb2FkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDE4XCI7XG59XG4uZmEtZG93bmxvYWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMTlcIjtcbn1cbi5mYS1hcnJvdy1jaXJjbGUtby1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDFhXCI7XG59XG4uZmEtYXJyb3ctY2lyY2xlLW8tdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMWJcIjtcbn1cbi5mYS1pbmJveDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAxY1wiO1xufVxuLmZhLXBsYXktY2lyY2xlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMWRcIjtcbn1cbi5mYS1yb3RhdGUtcmlnaHQ6YmVmb3JlLFxuLmZhLXJlcGVhdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAxZVwiO1xufVxuLmZhLXJlZnJlc2g6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMjFcIjtcbn1cbi5mYS1saXN0LWFsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAyMlwiO1xufVxuLmZhLWxvY2s6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMjNcIjtcbn1cbi5mYS1mbGFnOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDI0XCI7XG59XG4uZmEtaGVhZHBob25lczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAyNVwiO1xufVxuLmZhLXZvbHVtZS1vZmY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMjZcIjtcbn1cbi5mYS12b2x1bWUtZG93bjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAyN1wiO1xufVxuLmZhLXZvbHVtZS11cDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAyOFwiO1xufVxuLmZhLXFyY29kZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAyOVwiO1xufVxuLmZhLWJhcmNvZGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMmFcIjtcbn1cbi5mYS10YWc6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMmJcIjtcbn1cbi5mYS10YWdzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDJjXCI7XG59XG4uZmEtYm9vazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAyZFwiO1xufVxuLmZhLWJvb2ttYXJrOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDJlXCI7XG59XG4uZmEtcHJpbnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMmZcIjtcbn1cbi5mYS1jYW1lcmE6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMzBcIjtcbn1cbi5mYS1mb250OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDMxXCI7XG59XG4uZmEtYm9sZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAzMlwiO1xufVxuLmZhLWl0YWxpYzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAzM1wiO1xufVxuLmZhLXRleHQtaGVpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDM0XCI7XG59XG4uZmEtdGV4dC13aWR0aDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAzNVwiO1xufVxuLmZhLWFsaWduLWxlZnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMzZcIjtcbn1cbi5mYS1hbGlnbi1jZW50ZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMzdcIjtcbn1cbi5mYS1hbGlnbi1yaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjAzOFwiO1xufVxuLmZhLWFsaWduLWp1c3RpZnk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwMzlcIjtcbn1cbi5mYS1saXN0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDNhXCI7XG59XG4uZmEtZGVkZW50OmJlZm9yZSxcbi5mYS1vdXRkZW50OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDNiXCI7XG59XG4uZmEtaW5kZW50OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDNjXCI7XG59XG4uZmEtdmlkZW8tY2FtZXJhOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDNkXCI7XG59XG4uZmEtcGhvdG86YmVmb3JlLFxuLmZhLWltYWdlOmJlZm9yZSxcbi5mYS1waWN0dXJlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwM2VcIjtcbn1cbi5mYS1wZW5jaWw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNDBcIjtcbn1cbi5mYS1tYXAtbWFya2VyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDQxXCI7XG59XG4uZmEtYWRqdXN0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDQyXCI7XG59XG4uZmEtdGludDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA0M1wiO1xufVxuLmZhLWVkaXQ6YmVmb3JlLFxuLmZhLXBlbmNpbC1zcXVhcmUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA0NFwiO1xufVxuLmZhLXNoYXJlLXNxdWFyZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDQ1XCI7XG59XG4uZmEtY2hlY2stc3F1YXJlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNDZcIjtcbn1cbi5mYS1hcnJvd3M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNDdcIjtcbn1cbi5mYS1zdGVwLWJhY2t3YXJkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDQ4XCI7XG59XG4uZmEtZmFzdC1iYWNrd2FyZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA0OVwiO1xufVxuLmZhLWJhY2t3YXJkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDRhXCI7XG59XG4uZmEtcGxheTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA0YlwiO1xufVxuLmZhLXBhdXNlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDRjXCI7XG59XG4uZmEtc3RvcDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA0ZFwiO1xufVxuLmZhLWZvcndhcmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNGVcIjtcbn1cbi5mYS1mYXN0LWZvcndhcmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNTBcIjtcbn1cbi5mYS1zdGVwLWZvcndhcmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNTFcIjtcbn1cbi5mYS1lamVjdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1MlwiO1xufVxuLmZhLWNoZXZyb24tbGVmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1M1wiO1xufVxuLmZhLWNoZXZyb24tcmlnaHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNTRcIjtcbn1cbi5mYS1wbHVzLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1NVwiO1xufVxuLmZhLW1pbnVzLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1NlwiO1xufVxuLmZhLXRpbWVzLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1N1wiO1xufVxuLmZhLWNoZWNrLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1OFwiO1xufVxuLmZhLXF1ZXN0aW9uLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1OVwiO1xufVxuLmZhLWluZm8tY2lyY2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDVhXCI7XG59XG4uZmEtY3Jvc3NoYWlyczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA1YlwiO1xufVxuLmZhLXRpbWVzLWNpcmNsZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDVjXCI7XG59XG4uZmEtY2hlY2stY2lyY2xlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNWRcIjtcbn1cbi5mYS1iYW46YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNWVcIjtcbn1cbi5mYS1hcnJvdy1sZWZ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDYwXCI7XG59XG4uZmEtYXJyb3ctcmlnaHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNjFcIjtcbn1cbi5mYS1hcnJvdy11cDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA2MlwiO1xufVxuLmZhLWFycm93LWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNjNcIjtcbn1cbi5mYS1tYWlsLWZvcndhcmQ6YmVmb3JlLFxuLmZhLXNoYXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDY0XCI7XG59XG4uZmEtZXhwYW5kOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDY1XCI7XG59XG4uZmEtY29tcHJlc3M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNjZcIjtcbn1cbi5mYS1wbHVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDY3XCI7XG59XG4uZmEtbWludXM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNjhcIjtcbn1cbi5mYS1hc3RlcmlzazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA2OVwiO1xufVxuLmZhLWV4Y2xhbWF0aW9uLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA2YVwiO1xufVxuLmZhLWdpZnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNmJcIjtcbn1cbi5mYS1sZWFmOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDZjXCI7XG59XG4uZmEtZmlyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA2ZFwiO1xufVxuLmZhLWV5ZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA2ZVwiO1xufVxuLmZhLWV5ZS1zbGFzaDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA3MFwiO1xufVxuLmZhLXdhcm5pbmc6YmVmb3JlLFxuLmZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDcxXCI7XG59XG4uZmEtcGxhbmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNzJcIjtcbn1cbi5mYS1jYWxlbmRhcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA3M1wiO1xufVxuLmZhLXJhbmRvbTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA3NFwiO1xufVxuLmZhLWNvbW1lbnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNzVcIjtcbn1cbi5mYS1tYWduZXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwNzZcIjtcbn1cbi5mYS1jaGV2cm9uLXVwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDc3XCI7XG59XG4uZmEtY2hldnJvbi1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDc4XCI7XG59XG4uZmEtcmV0d2VldDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA3OVwiO1xufVxuLmZhLXNob3BwaW5nLWNhcnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwN2FcIjtcbn1cbi5mYS1mb2xkZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwN2JcIjtcbn1cbi5mYS1mb2xkZXItb3BlbjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA3Y1wiO1xufVxuLmZhLWFycm93cy12OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDdkXCI7XG59XG4uZmEtYXJyb3dzLWg6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwN2VcIjtcbn1cbi5mYS1iYXItY2hhcnQtbzpiZWZvcmUsXG4uZmEtYmFyLWNoYXJ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDgwXCI7XG59XG4uZmEtdHdpdHRlci1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwODFcIjtcbn1cbi5mYS1mYWNlYm9vay1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwODJcIjtcbn1cbi5mYS1jYW1lcmEtcmV0cm86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwODNcIjtcbn1cbi5mYS1rZXk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwODRcIjtcbn1cbi5mYS1nZWFyczpiZWZvcmUsXG4uZmEtY29nczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA4NVwiO1xufVxuLmZhLWNvbW1lbnRzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDg2XCI7XG59XG4uZmEtdGh1bWJzLW8tdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwODdcIjtcbn1cbi5mYS10aHVtYnMtby1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDg4XCI7XG59XG4uZmEtc3Rhci1oYWxmOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDg5XCI7XG59XG4uZmEtaGVhcnQtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA4YVwiO1xufVxuLmZhLXNpZ24tb3V0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDhiXCI7XG59XG4uZmEtbGlua2VkaW4tc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDhjXCI7XG59XG4uZmEtdGh1bWItdGFjazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA4ZFwiO1xufVxuLmZhLWV4dGVybmFsLWxpbms6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwOGVcIjtcbn1cbi5mYS1zaWduLWluOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDkwXCI7XG59XG4uZmEtdHJvcGh5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDkxXCI7XG59XG4uZmEtZ2l0aHViLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5MlwiO1xufVxuLmZhLXVwbG9hZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5M1wiO1xufVxuLmZhLWxlbW9uLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwOTRcIjtcbn1cbi5mYS1waG9uZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5NVwiO1xufVxuLmZhLXNxdWFyZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDk2XCI7XG59XG4uZmEtYm9va21hcmstbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5N1wiO1xufVxuLmZhLXBob25lLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5OFwiO1xufVxuLmZhLXR3aXR0ZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwOTlcIjtcbn1cbi5mYS1mYWNlYm9vay1mOmJlZm9yZSxcbi5mYS1mYWNlYm9vazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5YVwiO1xufVxuLmZhLWdpdGh1YjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5YlwiO1xufVxuLmZhLXVubG9jazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjA5Y1wiO1xufVxuLmZhLWNyZWRpdC1jYXJkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDlkXCI7XG59XG4uZmEtZmVlZDpiZWZvcmUsXG4uZmEtcnNzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMDllXCI7XG59XG4uZmEtaGRkLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwYTBcIjtcbn1cbi5mYS1idWxsaG9ybjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhMVwiO1xufVxuLmZhLWJlbGw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZjNcIjtcbn1cbi5mYS1jZXJ0aWZpY2F0ZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhM1wiO1xufVxuLmZhLWhhbmQtby1yaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhNFwiO1xufVxuLmZhLWhhbmQtby1sZWZ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGE1XCI7XG59XG4uZmEtaGFuZC1vLXVwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGE2XCI7XG59XG4uZmEtaGFuZC1vLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwYTdcIjtcbn1cbi5mYS1hcnJvdy1jaXJjbGUtbGVmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhOFwiO1xufVxuLmZhLWFycm93LWNpcmNsZS1yaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhOVwiO1xufVxuLmZhLWFycm93LWNpcmNsZS11cDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhYVwiO1xufVxuLmZhLWFycm93LWNpcmNsZS1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGFiXCI7XG59XG4uZmEtZ2xvYmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwYWNcIjtcbn1cbi5mYS13cmVuY2g6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwYWRcIjtcbn1cbi5mYS10YXNrczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhZVwiO1xufVxuLmZhLWZpbHRlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBiMFwiO1xufVxuLmZhLWJyaWVmY2FzZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBiMVwiO1xufVxuLmZhLWFycm93cy1hbHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwYjJcIjtcbn1cbi5mYS1ncm91cDpiZWZvcmUsXG4uZmEtdXNlcnM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwYzBcIjtcbn1cbi5mYS1jaGFpbjpiZWZvcmUsXG4uZmEtbGluazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBjMVwiO1xufVxuLmZhLWNsb3VkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGMyXCI7XG59XG4uZmEtZmxhc2s6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwYzNcIjtcbn1cbi5mYS1jdXQ6YmVmb3JlLFxuLmZhLXNjaXNzb3JzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGM0XCI7XG59XG4uZmEtY29weTpiZWZvcmUsXG4uZmEtZmlsZXMtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBjNVwiO1xufVxuLmZhLXBhcGVyY2xpcDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBjNlwiO1xufVxuLmZhLXNhdmU6YmVmb3JlLFxuLmZhLWZsb3BweS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGM3XCI7XG59XG4uZmEtc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGM4XCI7XG59XG4uZmEtbmF2aWNvbjpiZWZvcmUsXG4uZmEtcmVvcmRlcjpiZWZvcmUsXG4uZmEtYmFyczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBjOVwiO1xufVxuLmZhLWxpc3QtdWw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwY2FcIjtcbn1cbi5mYS1saXN0LW9sOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGNiXCI7XG59XG4uZmEtc3RyaWtldGhyb3VnaDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBjY1wiO1xufVxuLmZhLXVuZGVybGluZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBjZFwiO1xufVxuLmZhLXRhYmxlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGNlXCI7XG59XG4uZmEtbWFnaWM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZDBcIjtcbn1cbi5mYS10cnVjazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBkMVwiO1xufVxuLmZhLXBpbnRlcmVzdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBkMlwiO1xufVxuLmZhLXBpbnRlcmVzdC1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZDNcIjtcbn1cbi5mYS1nb29nbGUtcGx1cy1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZDRcIjtcbn1cbi5mYS1nb29nbGUtcGx1czpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBkNVwiO1xufVxuLmZhLW1vbmV5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGQ2XCI7XG59XG4uZmEtY2FyZXQtZG93bjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBkN1wiO1xufVxuLmZhLWNhcmV0LXVwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGQ4XCI7XG59XG4uZmEtY2FyZXQtbGVmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBkOVwiO1xufVxuLmZhLWNhcmV0LXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGRhXCI7XG59XG4uZmEtY29sdW1uczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBkYlwiO1xufVxuLmZhLXVuc29ydGVkOmJlZm9yZSxcbi5mYS1zb3J0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGRjXCI7XG59XG4uZmEtc29ydC1kb3duOmJlZm9yZSxcbi5mYS1zb3J0LWRlc2M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZGRcIjtcbn1cbi5mYS1zb3J0LXVwOmJlZm9yZSxcbi5mYS1zb3J0LWFzYzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBkZVwiO1xufVxuLmZhLWVudmVsb3BlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGUwXCI7XG59XG4uZmEtbGlua2VkaW46YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZTFcIjtcbn1cbi5mYS1yb3RhdGUtbGVmdDpiZWZvcmUsXG4uZmEtdW5kbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBlMlwiO1xufVxuLmZhLWxlZ2FsOmJlZm9yZSxcbi5mYS1nYXZlbDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBlM1wiO1xufVxuLmZhLWRhc2hib2FyZDpiZWZvcmUsXG4uZmEtdGFjaG9tZXRlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBlNFwiO1xufVxuLmZhLWNvbW1lbnQtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBlNVwiO1xufVxuLmZhLWNvbW1lbnRzLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZTZcIjtcbn1cbi5mYS1mbGFzaDpiZWZvcmUsXG4uZmEtYm9sdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBlN1wiO1xufVxuLmZhLXNpdGVtYXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZThcIjtcbn1cbi5mYS11bWJyZWxsYTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBlOVwiO1xufVxuLmZhLXBhc3RlOmJlZm9yZSxcbi5mYS1jbGlwYm9hcmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZWFcIjtcbn1cbi5mYS1saWdodGJ1bGItbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBlYlwiO1xufVxuLmZhLWV4Y2hhbmdlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGVjXCI7XG59XG4uZmEtY2xvdWQtZG93bmxvYWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZWRcIjtcbn1cbi5mYS1jbG91ZC11cGxvYWQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZWVcIjtcbn1cbi5mYS11c2VyLW1kOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGYwXCI7XG59XG4uZmEtc3RldGhvc2NvcGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZjFcIjtcbn1cbi5mYS1zdWl0Y2FzZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBmMlwiO1xufVxuLmZhLWJlbGwtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBhMlwiO1xufVxuLmZhLWNvZmZlZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBmNFwiO1xufVxuLmZhLWN1dGxlcnk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZjVcIjtcbn1cbi5mYS1maWxlLXRleHQtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBmNlwiO1xufVxuLmZhLWJ1aWxkaW5nLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZjdcIjtcbn1cbi5mYS1ob3NwaXRhbC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGY4XCI7XG59XG4uZmEtYW1idWxhbmNlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGY5XCI7XG59XG4uZmEtbWVka2l0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGZhXCI7XG59XG4uZmEtZmlnaHRlci1qZXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZmJcIjtcbn1cbi5mYS1iZWVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMGZjXCI7XG59XG4uZmEtaC1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYwZmRcIjtcbn1cbi5mYS1wbHVzLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjBmZVwiO1xufVxuLmZhLWFuZ2xlLWRvdWJsZS1sZWZ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTAwXCI7XG59XG4uZmEtYW5nbGUtZG91YmxlLXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTAxXCI7XG59XG4uZmEtYW5nbGUtZG91YmxlLXVwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTAyXCI7XG59XG4uZmEtYW5nbGUtZG91YmxlLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMDNcIjtcbn1cbi5mYS1hbmdsZS1sZWZ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTA0XCI7XG59XG4uZmEtYW5nbGUtcmlnaHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMDVcIjtcbn1cbi5mYS1hbmdsZS11cDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEwNlwiO1xufVxuLmZhLWFuZ2xlLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMDdcIjtcbn1cbi5mYS1kZXNrdG9wOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTA4XCI7XG59XG4uZmEtbGFwdG9wOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTA5XCI7XG59XG4uZmEtdGFibGV0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTBhXCI7XG59XG4uZmEtbW9iaWxlLXBob25lOmJlZm9yZSxcbi5mYS1tb2JpbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMGJcIjtcbn1cbi5mYS1jaXJjbGUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEwY1wiO1xufVxuLmZhLXF1b3RlLWxlZnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMGRcIjtcbn1cbi5mYS1xdW90ZS1yaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEwZVwiO1xufVxuLmZhLXNwaW5uZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMTBcIjtcbn1cbi5mYS1jaXJjbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMTFcIjtcbn1cbi5mYS1tYWlsLXJlcGx5OmJlZm9yZSxcbi5mYS1yZXBseTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjExMlwiO1xufVxuLmZhLWdpdGh1Yi1hbHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMTNcIjtcbn1cbi5mYS1mb2xkZXItbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjExNFwiO1xufVxuLmZhLWZvbGRlci1vcGVuLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMTVcIjtcbn1cbi5mYS1zbWlsZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTE4XCI7XG59XG4uZmEtZnJvd24tbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjExOVwiO1xufVxuLmZhLW1laC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTFhXCI7XG59XG4uZmEtZ2FtZXBhZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjExYlwiO1xufVxuLmZhLWtleWJvYXJkLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMWNcIjtcbn1cbi5mYS1mbGFnLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMWRcIjtcbn1cbi5mYS1mbGFnLWNoZWNrZXJlZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjExZVwiO1xufVxuLmZhLXRlcm1pbmFsOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTIwXCI7XG59XG4uZmEtY29kZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyMVwiO1xufVxuLmZhLW1haWwtcmVwbHktYWxsOmJlZm9yZSxcbi5mYS1yZXBseS1hbGw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMjJcIjtcbn1cbi5mYS1zdGFyLWhhbGYtZW1wdHk6YmVmb3JlLFxuLmZhLXN0YXItaGFsZi1mdWxsOmJlZm9yZSxcbi5mYS1zdGFyLWhhbGYtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyM1wiO1xufVxuLmZhLWxvY2F0aW9uLWFycm93OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTI0XCI7XG59XG4uZmEtY3JvcDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyNVwiO1xufVxuLmZhLWNvZGUtZm9yazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyNlwiO1xufVxuLmZhLXVubGluazpiZWZvcmUsXG4uZmEtY2hhaW4tYnJva2VuOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTI3XCI7XG59XG4uZmEtcXVlc3Rpb246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMjhcIjtcbn1cbi5mYS1pbmZvOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTI5XCI7XG59XG4uZmEtZXhjbGFtYXRpb246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMmFcIjtcbn1cbi5mYS1zdXBlcnNjcmlwdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyYlwiO1xufVxuLmZhLXN1YnNjcmlwdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyY1wiO1xufVxuLmZhLWVyYXNlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyZFwiO1xufVxuLmZhLXB1enpsZS1waWVjZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEyZVwiO1xufVxuLmZhLW1pY3JvcGhvbmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMzBcIjtcbn1cbi5mYS1taWNyb3Bob25lLXNsYXNoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTMxXCI7XG59XG4uZmEtc2hpZWxkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTMyXCI7XG59XG4uZmEtY2FsZW5kYXItbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEzM1wiO1xufVxuLmZhLWZpcmUtZXh0aW5ndWlzaGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTM0XCI7XG59XG4uZmEtcm9ja2V0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTM1XCI7XG59XG4uZmEtbWF4Y2RuOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTM2XCI7XG59XG4uZmEtY2hldnJvbi1jaXJjbGUtbGVmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEzN1wiO1xufVxuLmZhLWNoZXZyb24tY2lyY2xlLXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTM4XCI7XG59XG4uZmEtY2hldnJvbi1jaXJjbGUtdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxMzlcIjtcbn1cbi5mYS1jaGV2cm9uLWNpcmNsZS1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTNhXCI7XG59XG4uZmEtaHRtbDU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxM2JcIjtcbn1cbi5mYS1jc3MzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTNjXCI7XG59XG4uZmEtYW5jaG9yOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTNkXCI7XG59XG4uZmEtdW5sb2NrLWFsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjEzZVwiO1xufVxuLmZhLWJ1bGxzZXllOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTQwXCI7XG59XG4uZmEtZWxsaXBzaXMtaDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE0MVwiO1xufVxuLmZhLWVsbGlwc2lzLXY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNDJcIjtcbn1cbi5mYS1yc3Mtc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTQzXCI7XG59XG4uZmEtcGxheS1jaXJjbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNDRcIjtcbn1cbi5mYS10aWNrZXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNDVcIjtcbn1cbi5mYS1taW51cy1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNDZcIjtcbn1cbi5mYS1taW51cy1zcXVhcmUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE0N1wiO1xufVxuLmZhLWxldmVsLXVwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTQ4XCI7XG59XG4uZmEtbGV2ZWwtZG93bjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE0OVwiO1xufVxuLmZhLWNoZWNrLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE0YVwiO1xufVxuLmZhLXBlbmNpbC1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNGJcIjtcbn1cbi5mYS1leHRlcm5hbC1saW5rLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE0Y1wiO1xufVxuLmZhLXNoYXJlLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE0ZFwiO1xufVxuLmZhLWNvbXBhc3M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNGVcIjtcbn1cbi5mYS10b2dnbGUtZG93bjpiZWZvcmUsXG4uZmEtY2FyZXQtc3F1YXJlLW8tZG93bjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE1MFwiO1xufVxuLmZhLXRvZ2dsZS11cDpiZWZvcmUsXG4uZmEtY2FyZXQtc3F1YXJlLW8tdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNTFcIjtcbn1cbi5mYS10b2dnbGUtcmlnaHQ6YmVmb3JlLFxuLmZhLWNhcmV0LXNxdWFyZS1vLXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTUyXCI7XG59XG4uZmEtZXVybzpiZWZvcmUsXG4uZmEtZXVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTUzXCI7XG59XG4uZmEtZ2JwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTU0XCI7XG59XG4uZmEtZG9sbGFyOmJlZm9yZSxcbi5mYS11c2Q6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNTVcIjtcbn1cbi5mYS1ydXBlZTpiZWZvcmUsXG4uZmEtaW5yOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTU2XCI7XG59XG4uZmEtY255OmJlZm9yZSxcbi5mYS1ybWI6YmVmb3JlLFxuLmZhLXllbjpiZWZvcmUsXG4uZmEtanB5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTU3XCI7XG59XG4uZmEtcnVibGU6YmVmb3JlLFxuLmZhLXJvdWJsZTpiZWZvcmUsXG4uZmEtcnViOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTU4XCI7XG59XG4uZmEtd29uOmJlZm9yZSxcbi5mYS1rcnc6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNTlcIjtcbn1cbi5mYS1iaXRjb2luOmJlZm9yZSxcbi5mYS1idGM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNWFcIjtcbn1cbi5mYS1maWxlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTViXCI7XG59XG4uZmEtZmlsZS10ZXh0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTVjXCI7XG59XG4uZmEtc29ydC1hbHBoYS1hc2M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNWRcIjtcbn1cbi5mYS1zb3J0LWFscGhhLWRlc2M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNWVcIjtcbn1cbi5mYS1zb3J0LWFtb3VudC1hc2M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNjBcIjtcbn1cbi5mYS1zb3J0LWFtb3VudC1kZXNjOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTYxXCI7XG59XG4uZmEtc29ydC1udW1lcmljLWFzYzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE2MlwiO1xufVxuLmZhLXNvcnQtbnVtZXJpYy1kZXNjOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTYzXCI7XG59XG4uZmEtdGh1bWJzLXVwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTY0XCI7XG59XG4uZmEtdGh1bWJzLWRvd246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNjVcIjtcbn1cbi5mYS15b3V0dWJlLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE2NlwiO1xufVxuLmZhLXlvdXR1YmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNjdcIjtcbn1cbi5mYS14aW5nOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTY4XCI7XG59XG4uZmEteGluZy1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNjlcIjtcbn1cbi5mYS15b3V0dWJlLXBsYXk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNmFcIjtcbn1cbi5mYS1kcm9wYm94OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTZiXCI7XG59XG4uZmEtc3RhY2stb3ZlcmZsb3c6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNmNcIjtcbn1cbi5mYS1pbnN0YWdyYW06YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNmRcIjtcbn1cbi5mYS1mbGlja3I6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNmVcIjtcbn1cbi5mYS1hZG46YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNzBcIjtcbn1cbi5mYS1iaXRidWNrZXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNzFcIjtcbn1cbi5mYS1iaXRidWNrZXQtc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTcyXCI7XG59XG4uZmEtdHVtYmxyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTczXCI7XG59XG4uZmEtdHVtYmxyLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE3NFwiO1xufVxuLmZhLWxvbmctYXJyb3ctZG93bjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE3NVwiO1xufVxuLmZhLWxvbmctYXJyb3ctdXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNzZcIjtcbn1cbi5mYS1sb25nLWFycm93LWxlZnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNzdcIjtcbn1cbi5mYS1sb25nLWFycm93LXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTc4XCI7XG59XG4uZmEtYXBwbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxNzlcIjtcbn1cbi5mYS13aW5kb3dzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTdhXCI7XG59XG4uZmEtYW5kcm9pZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE3YlwiO1xufVxuLmZhLWxpbnV4OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTdjXCI7XG59XG4uZmEtZHJpYmJibGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxN2RcIjtcbn1cbi5mYS1za3lwZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE3ZVwiO1xufVxuLmZhLWZvdXJzcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxODBcIjtcbn1cbi5mYS10cmVsbG86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxODFcIjtcbn1cbi5mYS1mZW1hbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxODJcIjtcbn1cbi5mYS1tYWxlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTgzXCI7XG59XG4uZmEtZ2l0dGlwOmJlZm9yZSxcbi5mYS1ncmF0aXBheTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE4NFwiO1xufVxuLmZhLXN1bi1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTg1XCI7XG59XG4uZmEtbW9vbi1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTg2XCI7XG59XG4uZmEtYXJjaGl2ZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE4N1wiO1xufVxuLmZhLWJ1ZzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE4OFwiO1xufVxuLmZhLXZrOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTg5XCI7XG59XG4uZmEtd2VpYm86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxOGFcIjtcbn1cbi5mYS1yZW5yZW46YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxOGJcIjtcbn1cbi5mYS1wYWdlbGluZXM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxOGNcIjtcbn1cbi5mYS1zdGFjay1leGNoYW5nZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE4ZFwiO1xufVxuLmZhLWFycm93LWNpcmNsZS1vLXJpZ2h0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMThlXCI7XG59XG4uZmEtYXJyb3ctY2lyY2xlLW8tbGVmdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5MFwiO1xufVxuLmZhLXRvZ2dsZS1sZWZ0OmJlZm9yZSxcbi5mYS1jYXJldC1zcXVhcmUtby1sZWZ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTkxXCI7XG59XG4uZmEtZG90LWNpcmNsZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTkyXCI7XG59XG4uZmEtd2hlZWxjaGFpcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5M1wiO1xufVxuLmZhLXZpbWVvLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5NFwiO1xufVxuLmZhLXR1cmtpc2gtbGlyYTpiZWZvcmUsXG4uZmEtdHJ5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTk1XCI7XG59XG4uZmEtcGx1cy1zcXVhcmUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5NlwiO1xufVxuLmZhLXNwYWNlLXNodXR0bGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxOTdcIjtcbn1cbi5mYS1zbGFjazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5OFwiO1xufVxuLmZhLWVudmVsb3BlLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5OVwiO1xufVxuLmZhLXdvcmRwcmVzczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5YVwiO1xufVxuLmZhLW9wZW5pZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5YlwiO1xufVxuLmZhLWluc3RpdHV0aW9uOmJlZm9yZSxcbi5mYS1iYW5rOmJlZm9yZSxcbi5mYS11bml2ZXJzaXR5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTljXCI7XG59XG4uZmEtbW9ydGFyLWJvYXJkOmJlZm9yZSxcbi5mYS1ncmFkdWF0aW9uLWNhcDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjE5ZFwiO1xufVxuLmZhLXlhaG9vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMTllXCI7XG59XG4uZmEtZ29vZ2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWEwXCI7XG59XG4uZmEtcmVkZGl0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWExXCI7XG59XG4uZmEtcmVkZGl0LXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFhMlwiO1xufVxuLmZhLXN0dW1ibGV1cG9uLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFhM1wiO1xufVxuLmZhLXN0dW1ibGV1cG9uOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWE0XCI7XG59XG4uZmEtZGVsaWNpb3VzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWE1XCI7XG59XG4uZmEtZGlnZzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFhNlwiO1xufVxuLmZhLXBpZWQtcGlwZXItcHA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYTdcIjtcbn1cbi5mYS1waWVkLXBpcGVyLWFsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFhOFwiO1xufVxuLmZhLWRydXBhbDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFhOVwiO1xufVxuLmZhLWpvb21sYTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFhYVwiO1xufVxuLmZhLWxhbmd1YWdlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWFiXCI7XG59XG4uZmEtZmF4OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWFjXCI7XG59XG4uZmEtYnVpbGRpbmc6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYWRcIjtcbn1cbi5mYS1jaGlsZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFhZVwiO1xufVxuLmZhLXBhdzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFiMFwiO1xufVxuLmZhLXNwb29uOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWIxXCI7XG59XG4uZmEtY3ViZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFiMlwiO1xufVxuLmZhLWN1YmVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWIzXCI7XG59XG4uZmEtYmVoYW5jZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFiNFwiO1xufVxuLmZhLWJlaGFuY2Utc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWI1XCI7XG59XG4uZmEtc3RlYW06YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYjZcIjtcbn1cbi5mYS1zdGVhbS1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYjdcIjtcbn1cbi5mYS1yZWN5Y2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWI4XCI7XG59XG4uZmEtYXV0b21vYmlsZTpiZWZvcmUsXG4uZmEtY2FyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWI5XCI7XG59XG4uZmEtY2FiOmJlZm9yZSxcbi5mYS10YXhpOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWJhXCI7XG59XG4uZmEtdHJlZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFiYlwiO1xufVxuLmZhLXNwb3RpZnk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYmNcIjtcbn1cbi5mYS1kZXZpYW50YXJ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWJkXCI7XG59XG4uZmEtc291bmRjbG91ZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFiZVwiO1xufVxuLmZhLWRhdGFiYXNlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWMwXCI7XG59XG4uZmEtZmlsZS1wZGYtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFjMVwiO1xufVxuLmZhLWZpbGUtd29yZC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWMyXCI7XG59XG4uZmEtZmlsZS1leGNlbC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWMzXCI7XG59XG4uZmEtZmlsZS1wb3dlcnBvaW50LW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYzRcIjtcbn1cbi5mYS1maWxlLXBob3RvLW86YmVmb3JlLFxuLmZhLWZpbGUtcGljdHVyZS1vOmJlZm9yZSxcbi5mYS1maWxlLWltYWdlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYzVcIjtcbn1cbi5mYS1maWxlLXppcC1vOmJlZm9yZSxcbi5mYS1maWxlLWFyY2hpdmUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFjNlwiO1xufVxuLmZhLWZpbGUtc291bmQtbzpiZWZvcmUsXG4uZmEtZmlsZS1hdWRpby1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWM3XCI7XG59XG4uZmEtZmlsZS1tb3ZpZS1vOmJlZm9yZSxcbi5mYS1maWxlLXZpZGVvLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxYzhcIjtcbn1cbi5mYS1maWxlLWNvZGUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFjOVwiO1xufVxuLmZhLXZpbmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxY2FcIjtcbn1cbi5mYS1jb2RlcGVuOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWNiXCI7XG59XG4uZmEtanNmaWRkbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxY2NcIjtcbn1cbi5mYS1saWZlLWJvdXk6YmVmb3JlLFxuLmZhLWxpZmUtYnVveTpiZWZvcmUsXG4uZmEtbGlmZS1zYXZlcjpiZWZvcmUsXG4uZmEtc3VwcG9ydDpiZWZvcmUsXG4uZmEtbGlmZS1yaW5nOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWNkXCI7XG59XG4uZmEtY2lyY2xlLW8tbm90Y2g6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxY2VcIjtcbn1cbi5mYS1yYTpiZWZvcmUsXG4uZmEtcmVzaXN0YW5jZTpiZWZvcmUsXG4uZmEtcmViZWw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZDBcIjtcbn1cbi5mYS1nZTpiZWZvcmUsXG4uZmEtZW1waXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWQxXCI7XG59XG4uZmEtZ2l0LXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFkMlwiO1xufVxuLmZhLWdpdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFkM1wiO1xufVxuLmZhLXktY29tYmluYXRvci1zcXVhcmU6YmVmb3JlLFxuLmZhLXljLXNxdWFyZTpiZWZvcmUsXG4uZmEtaGFja2VyLW5ld3M6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZDRcIjtcbn1cbi5mYS10ZW5jZW50LXdlaWJvOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWQ1XCI7XG59XG4uZmEtcXE6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZDZcIjtcbn1cbi5mYS13ZWNoYXQ6YmVmb3JlLFxuLmZhLXdlaXhpbjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFkN1wiO1xufVxuLmZhLXNlbmQ6YmVmb3JlLFxuLmZhLXBhcGVyLXBsYW5lOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWQ4XCI7XG59XG4uZmEtc2VuZC1vOmJlZm9yZSxcbi5mYS1wYXBlci1wbGFuZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWQ5XCI7XG59XG4uZmEtaGlzdG9yeTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFkYVwiO1xufVxuLmZhLWNpcmNsZS10aGluOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWRiXCI7XG59XG4uZmEtaGVhZGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWRjXCI7XG59XG4uZmEtcGFyYWdyYXBoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWRkXCI7XG59XG4uZmEtc2xpZGVyczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFkZVwiO1xufVxuLmZhLXNoYXJlLWFsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFlMFwiO1xufVxuLmZhLXNoYXJlLWFsdC1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZTFcIjtcbn1cbi5mYS1ib21iOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWUyXCI7XG59XG4uZmEtc29jY2VyLWJhbGwtbzpiZWZvcmUsXG4uZmEtZnV0Ym9sLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZTNcIjtcbn1cbi5mYS10dHk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZTRcIjtcbn1cbi5mYS1iaW5vY3VsYXJzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWU1XCI7XG59XG4uZmEtcGx1ZzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFlNlwiO1xufVxuLmZhLXNsaWRlc2hhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZTdcIjtcbn1cbi5mYS10d2l0Y2g6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZThcIjtcbn1cbi5mYS15ZWxwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWU5XCI7XG59XG4uZmEtbmV3c3BhcGVyLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZWFcIjtcbn1cbi5mYS13aWZpOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWViXCI7XG59XG4uZmEtY2FsY3VsYXRvcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFlY1wiO1xufVxuLmZhLXBheXBhbDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFlZFwiO1xufVxuLmZhLWdvb2dsZS13YWxsZXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZWVcIjtcbn1cbi5mYS1jYy12aXNhOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWYwXCI7XG59XG4uZmEtY2MtbWFzdGVyY2FyZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmMVwiO1xufVxuLmZhLWNjLWRpc2NvdmVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWYyXCI7XG59XG4uZmEtY2MtYW1leDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmM1wiO1xufVxuLmZhLWNjLXBheXBhbDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmNFwiO1xufVxuLmZhLWNjLXN0cmlwZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmNVwiO1xufVxuLmZhLWJlbGwtc2xhc2g6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZjZcIjtcbn1cbi5mYS1iZWxsLXNsYXNoLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZjdcIjtcbn1cbi5mYS10cmFzaDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmOFwiO1xufVxuLmZhLWNvcHlyaWdodDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmOVwiO1xufVxuLmZhLWF0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWZhXCI7XG59XG4uZmEtZXllZHJvcHBlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmYlwiO1xufVxuLmZhLXBhaW50LWJydXNoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMWZjXCI7XG59XG4uZmEtYmlydGhkYXktY2FrZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjFmZFwiO1xufVxuLmZhLWFyZWEtY2hhcnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYxZmVcIjtcbn1cbi5mYS1waWUtY2hhcnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMDBcIjtcbn1cbi5mYS1saW5lLWNoYXJ0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjAxXCI7XG59XG4uZmEtbGFzdGZtOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjAyXCI7XG59XG4uZmEtbGFzdGZtLXNxdWFyZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIwM1wiO1xufVxuLmZhLXRvZ2dsZS1vZmY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMDRcIjtcbn1cbi5mYS10b2dnbGUtb246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMDVcIjtcbn1cbi5mYS1iaWN5Y2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjA2XCI7XG59XG4uZmEtYnVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjA3XCI7XG59XG4uZmEtaW94aG9zdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIwOFwiO1xufVxuLmZhLWFuZ2VsbGlzdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIwOVwiO1xufVxuLmZhLWNjOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjBhXCI7XG59XG4uZmEtc2hla2VsOmJlZm9yZSxcbi5mYS1zaGVxZWw6YmVmb3JlLFxuLmZhLWlsczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIwYlwiO1xufVxuLmZhLW1lYW5wYXRoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjBjXCI7XG59XG4uZmEtYnV5c2VsbGFkczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIwZFwiO1xufVxuLmZhLWNvbm5lY3RkZXZlbG9wOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjBlXCI7XG59XG4uZmEtZGFzaGN1YmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMTBcIjtcbn1cbi5mYS1mb3J1bWJlZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIxMVwiO1xufVxuLmZhLWxlYW5wdWI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMTJcIjtcbn1cbi5mYS1zZWxsc3k6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMTNcIjtcbn1cbi5mYS1zaGlydHNpbmJ1bGs6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMTRcIjtcbn1cbi5mYS1zaW1wbHlidWlsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIxNVwiO1xufVxuLmZhLXNreWF0bGFzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjE2XCI7XG59XG4uZmEtY2FydC1wbHVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjE3XCI7XG59XG4uZmEtY2FydC1hcnJvdy1kb3duOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjE4XCI7XG59XG4uZmEtZGlhbW9uZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIxOVwiO1xufVxuLmZhLXNoaXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMWFcIjtcbn1cbi5mYS11c2VyLXNlY3JldDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIxYlwiO1xufVxuLmZhLW1vdG9yY3ljbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMWNcIjtcbn1cbi5mYS1zdHJlZXQtdmlldzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIxZFwiO1xufVxuLmZhLWhlYXJ0YmVhdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIxZVwiO1xufVxuLmZhLXZlbnVzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjIxXCI7XG59XG4uZmEtbWFyczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIyMlwiO1xufVxuLmZhLW1lcmN1cnk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMjNcIjtcbn1cbi5mYS1pbnRlcnNleDpiZWZvcmUsXG4uZmEtdHJhbnNnZW5kZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMjRcIjtcbn1cbi5mYS10cmFuc2dlbmRlci1hbHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMjVcIjtcbn1cbi5mYS12ZW51cy1kb3VibGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMjZcIjtcbn1cbi5mYS1tYXJzLWRvdWJsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIyN1wiO1xufVxuLmZhLXZlbnVzLW1hcnM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMjhcIjtcbn1cbi5mYS1tYXJzLXN0cm9rZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIyOVwiO1xufVxuLmZhLW1hcnMtc3Ryb2tlLXY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMmFcIjtcbn1cbi5mYS1tYXJzLXN0cm9rZS1oOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjJiXCI7XG59XG4uZmEtbmV1dGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjJjXCI7XG59XG4uZmEtZ2VuZGVybGVzczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIyZFwiO1xufVxuLmZhLWZhY2Vib29rLW9mZmljaWFsOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjMwXCI7XG59XG4uZmEtcGludGVyZXN0LXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMzFcIjtcbn1cbi5mYS13aGF0c2FwcDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIzMlwiO1xufVxuLmZhLXNlcnZlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIzM1wiO1xufVxuLmZhLXVzZXItcGx1czpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIzNFwiO1xufVxuLmZhLXVzZXItdGltZXM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyMzVcIjtcbn1cbi5mYS1ob3RlbDpiZWZvcmUsXG4uZmEtYmVkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjM2XCI7XG59XG4uZmEtdmlhY29pbjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIzN1wiO1xufVxuLmZhLXRyYWluOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjM4XCI7XG59XG4uZmEtc3Vid2F5OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjM5XCI7XG59XG4uZmEtbWVkaXVtOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjNhXCI7XG59XG4uZmEteWM6YmVmb3JlLFxuLmZhLXktY29tYmluYXRvcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIzYlwiO1xufVxuLmZhLW9wdGluLW1vbnN0ZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyM2NcIjtcbn1cbi5mYS1vcGVuY2FydDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIzZFwiO1xufVxuLmZhLWV4cGVkaXRlZHNzbDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjIzZVwiO1xufVxuLmZhLWJhdHRlcnktNDpiZWZvcmUsXG4uZmEtYmF0dGVyeTpiZWZvcmUsXG4uZmEtYmF0dGVyeS1mdWxsOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjQwXCI7XG59XG4uZmEtYmF0dGVyeS0zOmJlZm9yZSxcbi5mYS1iYXR0ZXJ5LXRocmVlLXF1YXJ0ZXJzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjQxXCI7XG59XG4uZmEtYmF0dGVyeS0yOmJlZm9yZSxcbi5mYS1iYXR0ZXJ5LWhhbGY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNDJcIjtcbn1cbi5mYS1iYXR0ZXJ5LTE6YmVmb3JlLFxuLmZhLWJhdHRlcnktcXVhcnRlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI0M1wiO1xufVxuLmZhLWJhdHRlcnktMDpiZWZvcmUsXG4uZmEtYmF0dGVyeS1lbXB0eTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI0NFwiO1xufVxuLmZhLW1vdXNlLXBvaW50ZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNDVcIjtcbn1cbi5mYS1pLWN1cnNvcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI0NlwiO1xufVxuLmZhLW9iamVjdC1ncm91cDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI0N1wiO1xufVxuLmZhLW9iamVjdC11bmdyb3VwOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjQ4XCI7XG59XG4uZmEtc3RpY2t5LW5vdGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNDlcIjtcbn1cbi5mYS1zdGlja3ktbm90ZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjRhXCI7XG59XG4uZmEtY2MtamNiOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjRiXCI7XG59XG4uZmEtY2MtZGluZXJzLWNsdWI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNGNcIjtcbn1cbi5mYS1jbG9uZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI0ZFwiO1xufVxuLmZhLWJhbGFuY2Utc2NhbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNGVcIjtcbn1cbi5mYS1ob3VyZ2xhc3MtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI1MFwiO1xufVxuLmZhLWhvdXJnbGFzcy0xOmJlZm9yZSxcbi5mYS1ob3VyZ2xhc3Mtc3RhcnQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNTFcIjtcbn1cbi5mYS1ob3VyZ2xhc3MtMjpiZWZvcmUsXG4uZmEtaG91cmdsYXNzLWhhbGY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNTJcIjtcbn1cbi5mYS1ob3VyZ2xhc3MtMzpiZWZvcmUsXG4uZmEtaG91cmdsYXNzLWVuZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI1M1wiO1xufVxuLmZhLWhvdXJnbGFzczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI1NFwiO1xufVxuLmZhLWhhbmQtZ3JhYi1vOmJlZm9yZSxcbi5mYS1oYW5kLXJvY2stbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI1NVwiO1xufVxuLmZhLWhhbmQtc3RvcC1vOmJlZm9yZSxcbi5mYS1oYW5kLXBhcGVyLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNTZcIjtcbn1cbi5mYS1oYW5kLXNjaXNzb3JzLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNTdcIjtcbn1cbi5mYS1oYW5kLWxpemFyZC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjU4XCI7XG59XG4uZmEtaGFuZC1zcG9jay1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjU5XCI7XG59XG4uZmEtaGFuZC1wb2ludGVyLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNWFcIjtcbn1cbi5mYS1oYW5kLXBlYWNlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNWJcIjtcbn1cbi5mYS10cmFkZW1hcms6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNWNcIjtcbn1cbi5mYS1yZWdpc3RlcmVkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjVkXCI7XG59XG4uZmEtY3JlYXRpdmUtY29tbW9uczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI1ZVwiO1xufVxuLmZhLWdnOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjYwXCI7XG59XG4uZmEtZ2ctY2lyY2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjYxXCI7XG59XG4uZmEtdHJpcGFkdmlzb3I6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNjJcIjtcbn1cbi5mYS1vZG5va2xhc3NuaWtpOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjYzXCI7XG59XG4uZmEtb2Rub2tsYXNzbmlraS1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNjRcIjtcbn1cbi5mYS1nZXQtcG9ja2V0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjY1XCI7XG59XG4uZmEtd2lraXBlZGlhLXc6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNjZcIjtcbn1cbi5mYS1zYWZhcmk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNjdcIjtcbn1cbi5mYS1jaHJvbWU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNjhcIjtcbn1cbi5mYS1maXJlZm94OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjY5XCI7XG59XG4uZmEtb3BlcmE6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNmFcIjtcbn1cbi5mYS1pbnRlcm5ldC1leHBsb3JlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI2YlwiO1xufVxuLmZhLXR2OmJlZm9yZSxcbi5mYS10ZWxldmlzaW9uOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjZjXCI7XG59XG4uZmEtY29udGFvOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjZkXCI7XG59XG4uZmEtNTAwcHg6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNmVcIjtcbn1cbi5mYS1hbWF6b246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNzBcIjtcbn1cbi5mYS1jYWxlbmRhci1wbHVzLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNzFcIjtcbn1cbi5mYS1jYWxlbmRhci1taW51cy1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjcyXCI7XG59XG4uZmEtY2FsZW5kYXItdGltZXMtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI3M1wiO1xufVxuLmZhLWNhbGVuZGFyLWNoZWNrLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNzRcIjtcbn1cbi5mYS1pbmR1c3RyeTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI3NVwiO1xufVxuLmZhLW1hcC1waW46YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNzZcIjtcbn1cbi5mYS1tYXAtc2lnbnM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyNzdcIjtcbn1cbi5mYS1tYXAtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI3OFwiO1xufVxuLmZhLW1hcDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI3OVwiO1xufVxuLmZhLWNvbW1lbnRpbmc6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyN2FcIjtcbn1cbi5mYS1jb21tZW50aW5nLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyN2JcIjtcbn1cbi5mYS1ob3V6ejpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI3Y1wiO1xufVxuLmZhLXZpbWVvOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjdkXCI7XG59XG4uZmEtYmxhY2stdGllOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjdlXCI7XG59XG4uZmEtZm9udGljb25zOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjgwXCI7XG59XG4uZmEtcmVkZGl0LWFsaWVuOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjgxXCI7XG59XG4uZmEtZWRnZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI4MlwiO1xufVxuLmZhLWNyZWRpdC1jYXJkLWFsdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI4M1wiO1xufVxuLmZhLWNvZGllcGllOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjg0XCI7XG59XG4uZmEtbW9keDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI4NVwiO1xufVxuLmZhLWZvcnQtYXdlc29tZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI4NlwiO1xufVxuLmZhLXVzYjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI4N1wiO1xufVxuLmZhLXByb2R1Y3QtaHVudDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI4OFwiO1xufVxuLmZhLW1peGNsb3VkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjg5XCI7XG59XG4uZmEtc2NyaWJkOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjhhXCI7XG59XG4uZmEtcGF1c2UtY2lyY2xlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjhiXCI7XG59XG4uZmEtcGF1c2UtY2lyY2xlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOGNcIjtcbn1cbi5mYS1zdG9wLWNpcmNsZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI4ZFwiO1xufVxuLmZhLXN0b3AtY2lyY2xlLW86YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOGVcIjtcbn1cbi5mYS1zaG9wcGluZy1iYWc6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOTBcIjtcbn1cbi5mYS1zaG9wcGluZy1iYXNrZXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOTFcIjtcbn1cbi5mYS1oYXNodGFnOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjkyXCI7XG59XG4uZmEtYmx1ZXRvb3RoOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjkzXCI7XG59XG4uZmEtYmx1ZXRvb3RoLWI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOTRcIjtcbn1cbi5mYS1wZXJjZW50OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjk1XCI7XG59XG4uZmEtZ2l0bGFiOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjk2XCI7XG59XG4uZmEtd3BiZWdpbm5lcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI5N1wiO1xufVxuLmZhLXdwZm9ybXM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOThcIjtcbn1cbi5mYS1lbnZpcmE6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOTlcIjtcbn1cbi5mYS11bml2ZXJzYWwtYWNjZXNzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjlhXCI7XG59XG4uZmEtd2hlZWxjaGFpci1hbHQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOWJcIjtcbn1cbi5mYS1xdWVzdGlvbi1jaXJjbGUtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjI5Y1wiO1xufVxuLmZhLWJsaW5kOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMjlkXCI7XG59XG4uZmEtYXVkaW8tZGVzY3JpcHRpb246YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyOWVcIjtcbn1cbi5mYS12b2x1bWUtY29udHJvbC1waG9uZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJhMFwiO1xufVxuLmZhLWJyYWlsbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYTFcIjtcbn1cbi5mYS1hc3Npc3RpdmUtbGlzdGVuaW5nLXN5c3RlbXM6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYTJcIjtcbn1cbi5mYS1hc2wtaW50ZXJwcmV0aW5nOmJlZm9yZSxcbi5mYS1hbWVyaWNhbi1zaWduLWxhbmd1YWdlLWludGVycHJldGluZzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJhM1wiO1xufVxuLmZhLWRlYWZuZXNzOmJlZm9yZSxcbi5mYS1oYXJkLW9mLWhlYXJpbmc6YmVmb3JlLFxuLmZhLWRlYWY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYTRcIjtcbn1cbi5mYS1nbGlkZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJhNVwiO1xufVxuLmZhLWdsaWRlLWc6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYTZcIjtcbn1cbi5mYS1zaWduaW5nOmJlZm9yZSxcbi5mYS1zaWduLWxhbmd1YWdlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmE3XCI7XG59XG4uZmEtbG93LXZpc2lvbjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJhOFwiO1xufVxuLmZhLXZpYWRlbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJhOVwiO1xufVxuLmZhLXZpYWRlby1zcXVhcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYWFcIjtcbn1cbi5mYS1zbmFwY2hhdDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJhYlwiO1xufVxuLmZhLXNuYXBjaGF0LWdob3N0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmFjXCI7XG59XG4uZmEtc25hcGNoYXQtc3F1YXJlOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmFkXCI7XG59XG4uZmEtcGllZC1waXBlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJhZVwiO1xufVxuLmZhLWZpcnN0LW9yZGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmIwXCI7XG59XG4uZmEteW9hc3Q6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYjFcIjtcbn1cbi5mYS10aGVtZWlzbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYjJcIjtcbn1cbi5mYS1nb29nbGUtcGx1cy1jaXJjbGU6YmVmb3JlLFxuLmZhLWdvb2dsZS1wbHVzLW9mZmljaWFsOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmIzXCI7XG59XG4uZmEtZmE6YmVmb3JlLFxuLmZhLWZvbnQtYXdlc29tZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJiNFwiO1xufVxuLmZhLWhhbmRzaGFrZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmI1XCI7XG59XG4uZmEtZW52ZWxvcGUtb3BlbjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJiNlwiO1xufVxuLmZhLWVudmVsb3BlLW9wZW4tbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJiN1wiO1xufVxuLmZhLWxpbm9kZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJiOFwiO1xufVxuLmZhLWFkZHJlc3MtYm9vazpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJiOVwiO1xufVxuLmZhLWFkZHJlc3MtYm9vay1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmJhXCI7XG59XG4uZmEtdmNhcmQ6YmVmb3JlLFxuLmZhLWFkZHJlc3MtY2FyZDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJiYlwiO1xufVxuLmZhLXZjYXJkLW86YmVmb3JlLFxuLmZhLWFkZHJlc3MtY2FyZC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmJjXCI7XG59XG4uZmEtdXNlci1jaXJjbGU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYmRcIjtcbn1cbi5mYS11c2VyLWNpcmNsZS1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmJlXCI7XG59XG4uZmEtdXNlci1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmMwXCI7XG59XG4uZmEtaWQtYmFkZ2U6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYzFcIjtcbn1cbi5mYS1kcml2ZXJzLWxpY2Vuc2U6YmVmb3JlLFxuLmZhLWlkLWNhcmQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYzJcIjtcbn1cbi5mYS1kcml2ZXJzLWxpY2Vuc2UtbzpiZWZvcmUsXG4uZmEtaWQtY2FyZC1vOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmMzXCI7XG59XG4uZmEtcXVvcmE6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYzRcIjtcbn1cbi5mYS1mcmVlLWNvZGUtY2FtcDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJjNVwiO1xufVxuLmZhLXRlbGVncmFtOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmM2XCI7XG59XG4uZmEtdGhlcm1vbWV0ZXItNDpiZWZvcmUsXG4uZmEtdGhlcm1vbWV0ZXI6YmVmb3JlLFxuLmZhLXRoZXJtb21ldGVyLWZ1bGw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYzdcIjtcbn1cbi5mYS10aGVybW9tZXRlci0zOmJlZm9yZSxcbi5mYS10aGVybW9tZXRlci10aHJlZS1xdWFydGVyczpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJjOFwiO1xufVxuLmZhLXRoZXJtb21ldGVyLTI6YmVmb3JlLFxuLmZhLXRoZXJtb21ldGVyLWhhbGY6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyYzlcIjtcbn1cbi5mYS10aGVybW9tZXRlci0xOmJlZm9yZSxcbi5mYS10aGVybW9tZXRlci1xdWFydGVyOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmNhXCI7XG59XG4uZmEtdGhlcm1vbWV0ZXItMDpiZWZvcmUsXG4uZmEtdGhlcm1vbWV0ZXItZW1wdHk6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyY2JcIjtcbn1cbi5mYS1zaG93ZXI6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyY2NcIjtcbn1cbi5mYS1iYXRodHViOmJlZm9yZSxcbi5mYS1zMTU6YmVmb3JlLFxuLmZhLWJhdGg6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyY2RcIjtcbn1cbi5mYS1wb2RjYXN0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmNlXCI7XG59XG4uZmEtd2luZG93LW1heGltaXplOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmQwXCI7XG59XG4uZmEtd2luZG93LW1pbmltaXplOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmQxXCI7XG59XG4uZmEtd2luZG93LXJlc3RvcmU6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyZDJcIjtcbn1cbi5mYS10aW1lcy1yZWN0YW5nbGU6YmVmb3JlLFxuLmZhLXdpbmRvdy1jbG9zZTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJkM1wiO1xufVxuLmZhLXRpbWVzLXJlY3RhbmdsZS1vOmJlZm9yZSxcbi5mYS13aW5kb3ctY2xvc2UtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJkNFwiO1xufVxuLmZhLWJhbmRjYW1wOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmQ1XCI7XG59XG4uZmEtZ3JhdjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJkNlwiO1xufVxuLmZhLWV0c3k6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyZDdcIjtcbn1cbi5mYS1pbWRiOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmQ4XCI7XG59XG4uZmEtcmF2ZWxyeTpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJkOVwiO1xufVxuLmZhLWVlcmNhc3Q6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyZGFcIjtcbn1cbi5mYS1taWNyb2NoaXA6YmVmb3JlIHtcbiAgY29udGVudDogXCJcXGYyZGJcIjtcbn1cbi5mYS1zbm93Zmxha2UtbzpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJkY1wiO1xufVxuLmZhLXN1cGVycG93ZXJzOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXFxmMmRkXCI7XG59XG4uZmEtd3BleHBsb3JlcjpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJkZVwiO1xufVxuLmZhLW1lZXR1cDpiZWZvcmUge1xuICBjb250ZW50OiBcIlxcZjJlMFwiO1xufVxuLnNyLW9ubHkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxcHg7XG4gIGhlaWdodDogMXB4O1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IC0xcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXA6IHJlY3QoMCwgMCwgMCwgMCk7XG4gIGJvcmRlcjogMDtcbn1cbi5zci1vbmx5LWZvY3VzYWJsZTphY3RpdmUsXG4uc3Itb25seS1mb2N1c2FibGU6Zm9jdXMge1xuICBwb3NpdGlvbjogc3RhdGljO1xuICB3aWR0aDogYXV0bztcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXJnaW46IDA7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICBjbGlwOiBhdXRvO1xufVxuXG5AY2hhcnNldCBcInV0Zi04XCI7XG4uZGlzcGxheUJhciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDIzNnB4O1xuICBoZWlnaHQ6IDE2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7XG4gIGZsb2F0OiBsZWZ0O1xuICBtYXJnaW46IDAgNXB4IDAgMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZDogIzAwMDAwMDtcbn1cbi5kaXNwbGF5QmFyVGV4dCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtMnB4O1xuICBsZWZ0OiA1cHg7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xufVxuLmRpc3BsYXlCYXJGaWxsIHtcbiAgd2lkdGg6IDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQ6ICM0MDYyOGE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGZsb2F0OiBsZWZ0O1xufVxuLmRpc3BsYXlCYXJGaWxsLmFsaWduUmlnaHQge1xuICBmbG9hdDogcmlnaHQ7XG59XG4uZGlzcGxheUJhclRleHQuZ29vZCB7XG4gIGNvbG9yOiB3aGl0ZTtcbn1cbi5kaXNwbGF5QmFyVGV4dC5ub3Rnb29kIHtcbiAgY29sb3I6IHdoaXRlO1xufVxuLmRpc3BsYXlCYXJUZXh0LmF2ZXJhZ2Uge1xuICBjb2xvcjogd2hpdGU7XG59XG4uZGlzcGxheUJhclRleHQuYmFkIHtcbiAgY29sb3I6IHdoaXRlO1xufVxuLmRpc3BsYXlCYXJUZXh0LmhpZ2hsaWdodCB7XG4gIGNvbG9yOiBibGFjaztcbn1cbi5kaXNwbGF5QmFyRmlsbC5nb29kIHtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIGJhY2tncm91bmQ6ICM0Zjc1Mjk7XG59XG4uZGlzcGxheUJhckZpbGwubm90Z29vZCB7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBiYWNrZ3JvdW5kOiAjZmZiNDAwO1xufVxuLmRpc3BsYXlCYXJGaWxsLmF2ZXJhZ2Uge1xuICBjb2xvcjogI2ZmZmZmZjtcbiAgYmFja2dyb3VuZDogI2NkNjUwMDtcbn1cbi5kaXNwbGF5QmFyRmlsbC5iYWQge1xuICBjb2xvcjogI2ZmZmZmZjtcbiAgYmFja2dyb3VuZDogI2VlMDAwMDtcbn1cbi5kaXNwbGF5QmFyRmlsbC5oaWdobGlnaHQge1xuICBjb2xvcjogI2ZmZmZmZjtcbiAgYmFja2dyb3VuZDogIzhCQTVDNDtcbn1cbi5saW5rLFxuLmxpbmtPbixcbi5saW5rT2ZmLFxuLnNlbGVjdGVkLFxuLmRpc2FibGVkLFxuLnllbGxvd0J1dHRvbixcbi5yZWRCdXR0b24sXG4ubGlua0VuY291cmFnZSxcbi5saW5rRGlzY291cmFnZSB7XG4gIGZsb2F0OiBsZWZ0O1xuICBtaW4td2lkdGg6IDE1cHg7XG4gIGhlaWdodDogMTZweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogI2ZmZmZmZjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBiYWNrZ3JvdW5kOiAjNDA2MjhhO1xuICBib3JkZXI6IDFweCBzb2xpZCAjMTYxNjE2O1xuICBwYWRkaW5nOiAwcHggNHB4IDRweCA0cHg7XG4gIG1hcmdpbjogMCAycHggMnB4IDA7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi5oYXNJY29uIHtcbiAgcGFkZGluZzogMHB4IDRweCA0cHggMHB4O1xufVxuYS5ob3Zlcixcbi56b29tTGluay5ob3Zlcixcbi5saW5rQWN0aXZlLmhvdmVyIHtcbiAgYmFja2dyb3VuZDogIzUwN2FhYztcbn1cbkBrZXlmcmFtZXMgcGVuZGluZ0FuaW1hdGlvbiB7XG4gIHRvIHtcbiAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICBiYWNrZ3JvdW5kOiAjNTA3YWFjO1xuICB9XG59XG4ubGlua1BlbmRpbmcsXG4ubGlua1BlbmRpbmcuaG92ZXIge1xuICBhbmltYXRpb24tbmFtZTogcGVuZGluZ0FuaW1hdGlvbjtcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjI1cztcbn1cbmEud2hpdGUsXG5hLndoaXRlOmxpbmssXG5hLndoaXRlOnZpc2l0ZWQsXG5hLndoaXRlOmFjdGl2ZSB7XG4gIGNvbG9yOiAjNDA2MjhhO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICMxNjE2MTY7XG4gIHBhZGRpbmc6IDFweCA0cHggMXB4IDRweDtcbiAgbWFyZ2luOiAwIDJweCAwIDA7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cbmEud2hpdGUuaG92ZXIge1xuICBjb2xvcjogI2ZmZmZmZjtcbiAgYmFja2dyb3VuZDogIzQwNjI4YTtcbn1cbi5saW5rT24sXG5hLmxpbmtPbjpsaW5rLFxuYS5saW5rT246dmlzaXRlZCxcbmEubGlua09uOmFjdGl2ZSxcbmEubGlua09uLmhvdmVyLFxuLnNlbGVjdGVkLFxuYS5zZWxlY3RlZDpsaW5rLFxuYS5zZWxlY3RlZDp2aXNpdGVkLFxuYS5zZWxlY3RlZDphY3RpdmUsXG5hLnNlbGVjdGVkLmhvdmVyIHtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIGJhY2tncm91bmQ6ICMyZjk0M2M7XG59XG4ubGlua09mZixcbmEubGlua09mZjpsaW5rLFxuYS5saW5rT2ZmOnZpc2l0ZWQsXG5hLmxpbmtPZmY6YWN0aXZlLFxuYS5saW5rT2ZmLmhvdmVyLFxuLmRpc2FibGVkLFxuYS5kaXNhYmxlZDpsaW5rLFxuYS5kaXNhYmxlZDp2aXNpdGVkLFxuYS5kaXNhYmxlZDphY3RpdmUsXG5hLmRpc2FibGVkLmhvdmVyIHtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIGJhY2tncm91bmQ6ICM5OTk5OTk7XG4gIGJvcmRlci1jb2xvcjogIzY2NjY2Njtcbn1cbmEuaWNvbixcbi5saW5rT24uaWNvbixcbi5saW5rT2ZmLmljb24sXG4uc2VsZWN0ZWQuaWNvbixcbi5kaXNhYmxlZC5pY29uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nOiAxcHggNHB4IDJweCAyMHB4O1xufVxuYS5pY29uIGltZyxcbi5saW5rT24uaWNvbiBpbWcsXG4ubGlua09mZi5pY29uIGltZyxcbi5zZWxlY3RlZC5pY29uIGltZyxcbi5kaXNhYmxlZC5pY29uIGltZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMThweDtcbiAgaGVpZ2h0OiAxOHB4O1xufVxuLmxpbmtEYW5nZXIsXG5hLmxpbmtEYW5nZXI6bGluayxcbmEubGlua0Rhbmdlcjp2aXNpdGVkLFxuYS5saW5rRGFuZ2VyOmFjdGl2ZSB7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmYwMDAwO1xuICBib3JkZXItY29sb3I6ICNhYTAwMDA7XG59XG4ubGlua0Rhbmdlci5ob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZjY2NjY7XG59XG4ubGlua0VuY291cmFnZSxcbmEubGlua0VuY291cmFnZTpsaW5rLFxuYS5saW5rRW5jb3VyYWdlOnZpc2l0ZWQsXG5hLmxpbmtFbmNvdXJhZ2U6YWN0aXZlIHtcbiAgY29sb3I6ICM5OWZmMzM7XG4gIGJhY2tncm91bmQtY29sb3I6ICM0MDYyOGE7XG4gIGJvcmRlci1jb2xvcjogIzE2MTYxNjtcbn1cbi5saW5rRW5jb3VyYWdlLmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzUwN2FhYztcbn1cbi5saW5rRGlzY291cmFnZSxcbmEubGlua0Rpc2NvdXJhZ2U6bGluayxcbmEubGlua0Rpc2NvdXJhZ2U6dmlzaXRlZCxcbmEubGlua0Rpc2NvdXJhZ2U6YWN0aXZlIHtcbiAgY29sb3I6ICM4YzhjOGM7XG4gIGJhY2tncm91bmQtY29sb3I6ICM0MDYyOGE7XG4gIGJvcmRlci1jb2xvcjogIzE2MTYxNjtcbn1cbi5saW5rRGlzY291cmFnZS5ob3ZlciB7XG4gIGNvbG9yOiAjZmYwMDAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTA3YWFjO1xufVxuLmluYWN0aXZlLFxuYS5pbmFjdGl2ZTpsaW5rLFxuYS5pbmFjdGl2ZTp2aXNpdGVkLFxuYS5pbmFjdGl2ZTphY3RpdmUsXG5hLmluYWN0aXZlLmhvdmVyIHtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIGJhY2tncm91bmQ6ICM5OTk5OTk7XG4gIGJvcmRlci1jb2xvcjogIzY2NjY2Njtcbn1cbi53aGl0ZSB7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4uZ29vZCB7XG4gIGNvbG9yOiAjNGY3NTI5O1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5hdmVyYWdlIHtcbiAgY29sb3I6ICNjZDY1MDA7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLmJhZCB7XG4gIGNvbG9yOiAjZWUwMDAwO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5pZGxlIHtcbiAgY29sb3I6ICMyNzI3Mjc7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLnJlZEJ1dHRvbiB7XG4gIGJhY2tncm91bmQ6ICNlYTAwMDA7XG59XG4ueWVsbG93QnV0dG9uIHtcbiAgYmFja2dyb3VuZDogI2NhY2MwMDtcbn1cbi5oaWdobGlnaHQge1xuICBjb2xvcjogIzhCQTVDNDtcbn1cbi5kYXJrIHtcbiAgY29sb3I6ICMyNzI3Mjc7XG59XG4vKiBEYW1hZ2UgY29sb3JzIGZvciBjcmV3IG1vbml0b3JpbmcgY29tcHV0ZXIgKi9cbi5idXJuIHtcbiAgY29sb3I6IG9yYW5nZTtcbn1cbi5icnV0ZSB7XG4gIGNvbG9yOiByZWQ7XG59XG4udG94aW4ge1xuICBjb2xvcjogZ3JlZW47XG59XG4udG94aW5fbGlnaHQge1xuICBjb2xvcjogIzNBREYwMDtcbn1cbi5veHlsb3NzIHtcbiAgY29sb3I6IGJsdWU7XG59XG4ub3h5bG9zc19saWdodCB7XG4gIGNvbG9yOiAjNjY5OEZGO1xufVxuLyogV2lyZSBjb2xvcnMgZm9yIG51Y2xlYXIgYm9tYiBkZWZ1c2lvbiAqL1xuLlJlZCB7XG4gIGNvbG9yOiAjRkYwMDAwO1xufVxuLkJsdWUge1xuICBjb2xvcjogIzAwMDBGRjtcbn1cbi5HcmVlbiB7XG4gIGNvbG9yOiAjMDBGRjAwO1xufVxuLk1hcmlnb2xkIHtcbiAgY29sb3I6ICNGREE1MDU7XG59XG4uRnVzY2hpYSB7XG4gIGNvbG9yOiAjRkYwMDgwO1xufVxuLkJsYWNrIHtcbiAgY29sb3I6ICMwMDAwMDA7XG59XG4uUGVhcmwge1xuICBjb2xvcjogI0M2Q0FDQjtcbn1cbi8qIFN0YXR1cyBiYXIgY29sb3JzIGZvciBzbGVlcGVyIHRlbXBlcmF0dXJlcyAqL1xuLmNvbGQxIHtcbiAgY29sb3I6ICM5NEI4RkY7XG59XG4uY29sZDIge1xuICBjb2xvcjogIzY2OTlGRjtcbn1cbi5jb2xkMyB7XG4gIGNvbG9yOiAjMjkzRDY2O1xufVxuLmhvdDEge1xuICBjb2xvcjogI0ZGOTk2Njtcbn1cbi5ob3QyIHtcbiAgY29sb3I6ICM5OTNEMDA7XG59XG4uaG90MyB7XG4gIGNvbG9yOiAjRkY2NjAwO1xufVxuZGl2LmRpc3BsYXkge1xuICBwYWRkaW5nOiA0cHg7XG4gIG1hcmdpbjogNnB4IDA7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zMyk7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjUpO1xufVxuZGl2LmRpc3BsYXkgaGVhZGVyIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDk4LjUlO1xuICBwYWRkaW5nOiAwIDRweDtcbiAgbWFyZ2luLWJvdHRvbTogNnB4O1xuICBjb2xvcjogI0ZGRkZGRjtcbiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICM0MDYyOGE7XG59XG5kaXYuZGlzcGxheSBoZWFkZXIgLmJ1dHRvblJpZ2h0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDZweDtcbiAgcmlnaHQ6IDRweDtcbn1cbmRpdi5kaXNwbGF5IGFydGljbGUge1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG59XG4uaXRlbUdyb3VwIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2U5YzE4MztcbiAgYmFja2dyb3VuZDogIzJjMmMyYztcbiAgcGFkZGluZzogNHB4O1xuICBjbGVhcjogYm90aDtcbn1cbi5pdGVtIHtcbiAgd2lkdGg6IDEwMCU7XG4gIG1hcmdpbjogNHB4IDAgMCAwO1xuICBjbGVhcjogYm90aDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uaXRlbUNvbnRlbnROYXJyb3csXG4uaXRlbUNvbnRlbnQge1xuICBmbG9hdDogbGVmdDtcbn1cbi5pdGVtQ29udGVudE5hcnJvdyB7XG4gIHdpZHRoOiAzMCU7XG59XG4uaXRlbUNvbnRlbnQge1xuICB3aWR0aDogNjklO1xufVxuLml0ZW1MYWJlbE5hcnJvdyxcbi5pdGVtTGFiZWwsXG4uaXRlbUxhYmVsV2lkZSxcbi5pdGVtTGFiZWxXaWRlcixcbi5pdGVtTGFiZWxXaWRlc3Qge1xuICBmbG9hdDogbGVmdDtcbiAgY29sb3I6ICNlOWMxODM7XG59XG4uaXRlbUxhYmVsTmFycm93IHtcbiAgd2lkdGg6IDIwJTtcbn1cbi5pdGVtTGFiZWwge1xuICB3aWR0aDogMzAlO1xufVxuLml0ZW1MYWJlbFdpZGUge1xuICB3aWR0aDogNDUlO1xufVxuLml0ZW1MYWJlbFdpZGVyIHtcbiAgd2lkdGg6IDY5JTtcbn1cbi5pdGVtTGFiZWxXaWRlc3Qge1xuICB3aWR0aDogMTAwJTtcbn1cbi5pdGVtQ29udGVudFdpZGUge1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDc5JTtcbn1cbi5pdGVtQ29udGVudFNtYWxsIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHdpZHRoOiAzMyU7XG59XG4uaXRlbUNvbnRlbnRNZWRpdW0ge1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDU1JTtcbn1cbi5ibG9jayB7XG4gIHBhZGRpbmc6IDhweDtcbiAgbWFyZ2luOiAxMHB4IDRweCA0cHggNHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjNDA2MjhhO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwO1xufVxuLmJsb2NrIGgzIHtcbiAgcGFkZGluZzogMDtcbn1cbi5jbGVhckJvdGgge1xuICBjbGVhcjogYm90aDtcbn1cbi5jbGVhckxlZnQge1xuICBjbGVhcjogbGVmdDtcbn1cbi5jbGVhclJpZ2h0IHtcbiAgY2xlYXI6IHJpZ2h0O1xufVxuLmxpbmUge1xuICB3aWR0aDogMTAwJTtcbiAgY2xlYXI6IGJvdGg7XG59XG4uZml4ZWRMZWZ0IHtcbiAgd2lkdGg6IDExMHB4O1xuICBmbG9hdDogbGVmdDtcbn1cbi5maXhlZExlZnRXaWRlIHtcbiAgd2lkdGg6IDE2NXB4O1xuICBmbG9hdDogbGVmdDtcbn1cbi5maXhlZExlZnRXaWRlciB7XG4gIHdpZHRoOiAyMjBweDtcbiAgZmxvYXQ6IGxlZnQ7XG59XG4uZml4ZWRMZWZ0V2lkZXN0IHtcbiAgd2lkdGg6IDI1MHB4O1xuICBmbG9hdDogbGVmdDtcbn1cbi5mbG9hdFJpZ2h0IHtcbiAgZmxvYXQ6IHJpZ2h0O1xufVxuLmZsb2F0TGVmdCB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuLmhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4uc3RhdHVzRGlzcGxheSB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICM0MDYyOGE7XG4gIHBhZGRpbmc6IDRweDtcbiAgbWFyZ2luOiAzcHggMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zdGF0dXNEaXNwbGF5UmVjb3JkcyB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkICM0MDYyOGE7XG4gIHBhZGRpbmc6IDRweDtcbiAgbWFyZ2luOiAzcHggMDtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICBvdmVyZmxvdy15OiBhdXRvO1xufVxuLnN0YXR1c0xhYmVsIHtcbiAgd2lkdGg6IDEzOHB4O1xuICBmbG9hdDogbGVmdDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY29sb3I6ICM5OEIwQzM7XG59XG4uc3RhdHVzVmFsdWUge1xuICBmbG9hdDogbGVmdDtcbn1cbi5qb2JWYWx1ZXMge1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDMwJTtcbn1cbi5mYW5jeSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5pLmZhbmN5IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5taW5pbWl6ZSB7XG4gIGNvbG9yOiAjRTlDMTgzO1xuICBjdXJzb3I6IHBvaW50ZXIgIWltcG9ydGFudDtcbiAgei1pbmRleDogMTAyO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNnB4O1xuICByaWdodDogNDZweDtcbn1cbi5taW5pbWl6ZTpob3ZlciB7XG4gIGNvbG9yOiAjYjhjOWQ2O1xufVxuLmNsb3NlIHtcbiAgY29sb3I6ICNFOUMxODM7XG4gIGN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50O1xuICB6LWluZGV4OiAxMDI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA0cHg7XG4gIHJpZ2h0OiAxMnB4O1xufVxuLmNsb3NlOmhvdmVyIHtcbiAgY29sb3I6ICNiOGM5ZDY7XG59XG4jdWlDb3JuZXJUTCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogMTAxO1xuICBtaW4td2lkdGg6IDMwcHg7XG4gIG1pbi1oZWlnaHQ6IDMwcHg7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgYmFja2dyb3VuZDogdXJsKFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCNEFBQUFlQ0FJQUFBQzBVam4xQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUdUR2xVV0hSWVRVdzZZMjl0TG1Ga2IySmxMbmh0Y0FBQUFBQUFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TkRJZ056a3VNVFl3T1RJMExDQXlNREUzTHpBM0x6RXpMVEF4T2pBMk9qTTVJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbVJqUFNKb2RIUndPaTh2Y0hWeWJDNXZjbWN2WkdNdlpXeGxiV1Z1ZEhNdk1TNHhMeUlnZUcxc2JuTTZjR2h2ZEc5emFHOXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNCb2IzUnZjMmh2Y0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JGZG5ROUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlVWMlpXNTBJeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE9DQW9WMmx1Wkc5M2N5a2lJSGh0Y0RwRGNtVmhkR1ZFWVhSbFBTSXlNREU0TFRFeExUSXdWREl5T2pNNE9qSTFMVEE0T2pBd0lpQjRiWEE2VFc5a2FXWjVSR0YwWlQwaU1qQXhPQzB4TVMweU1GUXlNem93TXpvd01TMHdPRG93TUNJZ2VHMXdPazFsZEdGa1lYUmhSR0YwWlQwaU1qQXhPQzB4TVMweU1GUXlNem93TXpvd01TMHdPRG93TUNJZ1pHTTZabTl5YldGMFBTSnBiV0ZuWlM5d2JtY2lJSEJvYjNSdmMyaHZjRHBEYjJ4dmNrMXZaR1U5SWpNaUlIQm9iM1J2YzJodmNEcEpRME5RY205bWFXeGxQU0p6VWtkQ0lFbEZRell4T1RZMkxUSXVNU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBrT1dSbE16YzFZaTA0WldRd0xXSTNORGN0T1RRelpTMHpOMlV3WkdVMk5Ea3lPRFFpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW1Ga2IySmxPbVJ2WTJsa09uQm9iM1J2YzJodmNEbzBabVZoWmpKbVpDMDNZV1ZoTFdVeU5HUXRZVE5rWlMwNVptSTVaR00wWlRBMFl6SWlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcGpaVFU0T1RrNU15MW1aRFUyTFRFek5Ea3RZV015TUMwM05HWmtabVk1TmpOallUZ2lQaUE4ZUcxd1RVMDZTR2x6ZEc5eWVUNGdQSEprWmpwVFpYRStJRHh5WkdZNmJHa2djM1JGZG5RNllXTjBhVzl1UFNKamNtVmhkR1ZrSWlCemRFVjJkRHBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21ObE5UZzVPVGt6TFdaa05UWXRNVE0wT1MxaFl6SXdMVGMwWm1SbVpqazJNMk5oT0NJZ2MzUkZkblE2ZDJobGJqMGlNakF4T0MweE1TMHlNRlF5TWpvek9Eb3lOUzB3T0Rvd01DSWdjM1JGZG5RNmMyOW1kSGRoY21WQloyVnVkRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UZ2dLRmRwYm1SdmQzTXBJaTgrSUR4eVpHWTZiR2tnYzNSRmRuUTZZV04wYVc5dVBTSmpiMjUyWlhKMFpXUWlJSE4wUlhaME9uQmhjbUZ0WlhSbGNuTTlJbVp5YjIwZ2FXMWhaMlV2WjJsbUlIUnZJR2x0WVdkbEwzQnVaeUl2UGlBOGNtUm1PbXhwSUhOMFJYWjBPbUZqZEdsdmJqMGljMkYyWldRaUlITjBSWFowT21sdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlpEbGtaVE0zTldJdE9HVmtNQzFpTnpRM0xUazBNMlV0TXpkbE1HUmxOalE1TWpnMElpQnpkRVYyZERwM2FHVnVQU0l5TURFNExURXhMVEl3VkRJek9qQXpPakF4TFRBNE9qQXdJaUJ6ZEVWMmREcHpiMlowZDJGeVpVRm5aVzUwUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhPQ0FvVjJsdVpHOTNjeWtpSUhOMFJYWjBPbU5vWVc1blpXUTlJaThpTHo0Z1BDOXlaR1k2VTJWeFBpQThMM2h0Y0UxTk9raHBjM1J2Y25rK0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K1FuUktSQUFBQUloSlJFRlVTSW0xekxjUmdFQU1CTUNEb2tRZjlCL1NCd1F3bU9lTnpHa0wyR25IaGdTTHJIUFNDNEJmbnkrL3ZsOXkvWDZaZGZIUzZ2L0xxYXN2b1c2OTBicnpodXIrNjYrSHI3UFd2SjVhK1pwci9XdXJUYStodHI3YTJ2R3FhdDg3cnQzdm9JNjh2VHI0TnV2NFc2OHBiNlZtdldWTmZEODE5MzFxK252VkdTK0FTVVF5WGdBSHVPZ1lZd09raElZQUFBQUFTVVZPUks1Q1lJST1cIikgbm8tcmVwZWF0O1xufVxuLyogUmVzaXppbmcgKFN0b2xlbiBmcm9tIEdvb24gQ0MtQlktTkMtU0EpICovXG4ucmVzaXplQXJlYSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogOTk5OTk7XG59XG4ucmVzaXplQXJlYS50b3Age1xuICB0b3A6IDA7XG4gIGxlZnQ6IDEwcHg7XG4gIHJpZ2h0OiAxMHB4O1xuICBoZWlnaHQ6IDVweDtcbiAgY3Vyc29yOiBuLXJlc2l6ZTtcbn1cbi5yZXNpemVBcmVhLnRyIHtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgaGVpZ2h0OiAxMHB4O1xuICB3aWR0aDogMTBweDtcbiAgY3Vyc29yOiBuZS1yZXNpemU7XG59XG4ucmVzaXplQXJlYS5yaWdodCB7XG4gIHRvcDogMTBweDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMTBweDtcbiAgd2lkdGg6IDVweDtcbiAgY3Vyc29yOiBlLXJlc2l6ZTtcbn1cbi5yZXNpemVBcmVhLmJyIHtcbiAgYm90dG9tOiAwO1xuICByaWdodDogMDtcbiAgaGVpZ2h0OiAxMHB4O1xuICB3aWR0aDogMTBweDtcbiAgY3Vyc29yOiBzZS1yZXNpemU7XG59XG4ucmVzaXplQXJlYS5ib3R0b20ge1xuICBib3R0b206IDA7XG4gIGxlZnQ6IDEwcHg7XG4gIHJpZ2h0OiAxMHB4O1xuICBoZWlnaHQ6IDVweDtcbiAgY3Vyc29yOiBzLXJlc2l6ZTtcbn1cbi5yZXNpemVBcmVhLmJsIHtcbiAgYm90dG9tOiAwO1xuICBsZWZ0OiAwO1xuICBoZWlnaHQ6IDEwcHg7XG4gIHdpZHRoOiAxMHB4O1xuICBjdXJzb3I6IHN3LXJlc2l6ZTtcbn1cbi5yZXNpemVBcmVhLmxlZnQge1xuICB0b3A6IDEwcHg7XG4gIGxlZnQ6IDA7XG4gIGJvdHRvbTogMTBweDtcbiAgd2lkdGg6IDVweDtcbiAgY3Vyc29yOiB3LXJlc2l6ZTtcbn1cbi5yZXNpemVBcmVhLnRsIHtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBoZWlnaHQ6IDEwcHg7XG4gIHdpZHRoOiAxMHB4O1xuICBjdXJzb3I6IG53LXJlc2l6ZTtcbn1cbi8qIEVuZCBSZXNpemluZyAqL1xuLyogSWNvbnNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuLyogc3RhdGVzIGFuZCBpbWFnZXMgKi9cbi51aUxpbmtQZW5kaW5nSWNvbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGZsb2F0OiBsZWZ0O1xuICB3aWR0aDogMTZweDtcbiAgaGVpZ2h0OiAxNnB4O1xuICBtYXJnaW46IDJweCAycHggMCAycHg7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCh1aUxpbmtQZW5kaW5nSWNvbi5naWYpO1xufVxuLmxpbmtQZW5kaW5nIC5mYSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ubGlua1BlbmRpbmcgLnVpTGlua1BlbmRpbmdJY29uIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG4ubWFwSWNvbjE2IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTZweDtcbiAgaGVpZ2h0OiAxNnB4O1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2R3JlZW4ucG5nKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC05NnB4O1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICB6b29tOiAwLjEyNTtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gIC8qbWFyZ2luLWJvdHRvbTogLTFweDsqL1xufVxuLm1hcEljb24xNi5kZWFkIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKHVpSWNvbnMxNlJlZC5wbmcpO1xufVxuLm1hcEljb24xNi5iYWQge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2UmVkLnBuZyk7XG59XG4ubWFwSWNvbjE2LmF2ZXJhZ2Uge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2T3JhbmdlLnBuZyk7XG59XG4ubWFwSWNvbjE2Lmdvb2Qge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2R3JlZW4ucG5nKTtcbn1cbi8qIEFpckFsYXJtICovXG4ubWFwSWNvbjE2Lmljb24tYWlyYWxhcm0ge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNDRweDtcbn1cbi8qIENvbW1hbmQgUG9zaXRpb25zICovXG4ubWFwSWNvbjE2LnJhbmstY2FwdGFpbiB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMTEycHg7XG59XG4ubWFwSWNvbjE2LnJhbmstaGVhZG9mcGVyc29ubmVsIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC05NnB4O1xufVxuLm1hcEljb24xNi5yYW5rLWhlYWRvZnNlY3VyaXR5IHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMjhweDtcbn1cbi5tYXBJY29uMTYucmFuay1jaGllZmVuZ2luZWVyIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMTJweDtcbn1cbi5tYXBJY29uMTYucmFuay1yZXNlYXJjaGRpcmVjdG9yIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDtcbn1cbi5tYXBJY29uMTYucmFuay1jaGllZm1lZGljYWxvZmZpY2VyIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4O1xufVxuLyogRW5naW5lZXJpbmcgUG9zaXRpb25zICovXG4ubWFwSWNvbjE2LnJhbmstc3RhdGlvbmVuZ2luZWVyIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMTJweDtcbn1cbi5tYXBJY29uMTYucmFuay1hdG1vc3BoZXJpY3RlY2huaWNpYW4ge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTExMnB4O1xufVxuLyogTWVkaWNhbCBQb3NpdGlvbnMgKi9cbi5tYXBJY29uMTYucmFuay1tZWRpY2FsZG9jdG9yIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4O1xufVxuLm1hcEljb24xNi5yYW5rLWdlbmV0aWNpc3Qge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7XG59XG4ubWFwSWNvbjE2LnJhbmstcHN5Y2hpYXRyaXN0IHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4O1xufVxuLm1hcEljb24xNi5yYW5rLWNoZW1pc3Qge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7XG59XG4vKiBTY2llbmNlIFBvc2l0aW9ucyAqL1xuLm1hcEljb24xNi5yYW5rLXNjaWVudGlzdCB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7XG59XG4ubWFwSWNvbjE2LnJhbmstZ2VuZXRpY2lzdCB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7XG59XG4ubWFwSWNvbjE2LnJhbmstcm9ib3RpY2lzdCB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7XG59XG4ubWFwSWNvbjE2LnJhbmsteGVub2Jpb2xvZ2lzdCB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7XG59XG4vKiBTZWN1cml0eSBQb3NpdGlvbnMgKi9cbi5tYXBJY29uMTYucmFuay13YXJkZW4ge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTEyOHB4O1xufVxuLm1hcEljb24xNi5yYW5rLWRldGVjdGl2ZSB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTI4cHg7XG59XG4ubWFwSWNvbjE2LnJhbmstc2VjdXJpdHlvZmZpY2VyIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMjhweDtcbn1cbnVsIHtcbiAgcGFkZGluZzogNHB4IDAgMCAxMHB4O1xuICBtYXJnaW46IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbn1cbmxpIHtcbiAgcGFkZGluZzogMCAwIDJweCAwO1xufVxudGFibGUuZml4ZWQge1xuICB0YWJsZS1sYXlvdXQ6IGZpeGVkO1xufVxudGFibGUuZml4ZWQgdGQge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLyogVGFibGUgc3R5bGluZyBmb3IgdGhlIHBvd2VyIG1vbml0b3IgKi9cbnRhYmxlLnBtb24ge1xuICBib3JkZXI6IDJweCBzb2xpZCBSb3lhbEJsdWU7XG59XG50YWJsZS5wbW9uIHRkLFxudGFibGUucG1vbiB0aCB7XG4gIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQgYmxhY2s7XG4gIHBhZGRpbmc6IDBweCA1cHggMHB4IDVweDtcbn1cbi8qIFRhYmxlIHN0eWxpbmcgZm9yIHRoZSBjcmV3IG1hbmlmZXN0ICovXG50aC5jb21tYW5kIHtcbiAgYmFja2dyb3VuZDogIzMzMzNGRjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGguc2VjIHtcbiAgYmFja2dyb3VuZDogIzhlMDAwMDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGgubWVkIHtcbiAgYmFja2dyb3VuZDogIzAwNjYwMDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGguZW5nIHtcbiAgYmFja2dyb3VuZDogI2IyNzMwMDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGguc2NpIHtcbiAgYmFja2dyb3VuZDogI2E2NWJhNjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGguc2VyIHtcbiAgYmFja2dyb3VuZDogIzcxMDBBQTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGguc3VwIHtcbiAgYmFja2dyb3VuZDogIzY2NjYyMTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGguY2l2IHtcbiAgYmFja2dyb3VuZDogI2EzMjgwMDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxudGgubWlzYyB7XG4gIGJhY2tncm91bmQ6ICM2NjY7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogI2ZmZmZmZjtcbn1cbnNwYW4ucW0tam9iIHtcbiAgY29sb3I6ICNiNzdhNDE7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLyogU3RyaXBlZCBsaW5lcyBmb3IgdGFibGVzIGFuZCBkaXZzICovXG4uc3RyaXBlZCB0cjpudGgtY2hpbGQoZXZlbikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDA0MDQwO1xufVxuLnN0cmlwZWQ6bm90KHRhYmxlKSA+IDpudGgtY2hpbGQoZXZlbikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDA0MDQwO1xufVxuI3VpTm9TY3JpcHQge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIG1hcmdpbjogLTYwcHggMCAwIC0xNTBweDtcbiAgd2lkdGg6IDI4MHB4O1xuICBoZWlnaHQ6IDEyMHB4O1xuICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICBib3JkZXI6IDJweCBzb2xpZCAjZmYwMDAwO1xuICBjb2xvcjogIzAwMDAwMDtcbiAgZm9udC1zaXplOiAxMHB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgei1pbmRleDogOTk5OTtcbiAgcGFkZGluZzogMHB4IDEwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIC5ub3RpY2UgfCBDYXV0aW9uIFN0cmlwZXNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4ubm90aWNlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBiYWNrZ3JvdW5kOiB1cmwodWlOb3RpY2VCYWNrZ3JvdW5kLmpwZykgNTAlIDUwJTtcbiAgY29sb3I6ICMwMDAwMDA7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgcGFkZGluZzogM3B4IDRweCAzcHggNHB4O1xuICBtYXJnaW46IDRweCAwIDRweCAwO1xufVxuLm5vdGljZVBsYWNlaG9sZGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHBhZGRpbmc6IDNweCA0cHggM3B4IDRweDtcbiAgbWFyZ2luOiA0cHggMCA0cHggMDtcbn1cbi5ub3RpY2UuaWNvbiB7XG4gIHBhZGRpbmc6IDJweCA0cHggMCAyMHB4O1xufVxuLm5vdGljZSBpbWcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDE2cHg7XG4gIGhlaWdodDogMTZweDtcbn1cbmRpdi5ub3RpY2Uge1xuICBjbGVhcjogYm90aDtcbn1cbi8qKioqKioqKioqKioqKioqKioqKlxcXG5cXCoqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBQREEsIEROQSBNb2RpZmllciBzdHlsZXNcbiAgICBEb24ndCBmaXQgYW55d2hlcmUgZWxzZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBQREEgc3R5bGluZyAqL1xuLndob2xlU2NyZWVuIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBjb2xvcjogIzUxNzA4NztcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLnBkYWxpbmsge1xuICBmbG9hdDogbGVmdDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XG59XG4ucGRhbGluay5kaXNhYmxlZCB7XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIGJvcmRlcjogbm9uZTtcbiAgY29sb3I6ICM5OTk7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG4ucGRhbm90ZSB7XG4gIGNvbG9yOiAjY2Q2NTAwO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5pdGVtLm1haW5tZW51IHtcbiAgcGFkZGluZy1ib3R0b206IDAuNWVtO1xufVxuZGl2LmNsb2NrIHtcbiAgY29sb3I6IHdoaXRlO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgZmxvYXQ6IHJpZ2h0O1xuICBwYWRkaW5nLXJpZ2h0OiAyZW07XG59XG4jcGRhRm9vdGVyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBsZWZ0OiAwO1xuICBib3R0b206IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBiYWNrZ3JvdW5kOiAjMjcyNzI3O1xufVxuLnBkYUZvb3RlckJ1dHRvbiB7XG4gIHdpZHRoOiAzMyU7XG4gIHBhZGRpbmc6IDAuNWVtIDA7XG4gIGZvbnQtc2l6ZTogMjAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBjb2xvcjogI2ZmZjtcbn1cbi5wZGFGb290ZXJCdXR0b24uaG92ZXIge1xuICBiYWNrZ3JvdW5kOiAjNTA3YWFjO1xufVxuLnBkYUZvb3RlckJ1dHRvbi5kaXNhYmxlZCB7XG4gIGJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDtcbiAgY29sb3I6ICM1NTUgIWltcG9ydGFudDtcbn1cbi5wZGFGb290ZXJCdXR0b24gLnVpTGlua1BlbmRpbmdJY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMzMlO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG59XG4vKiBETkEgTW9kaWZpZXIgc3R5bGluZyAqL1xuLmRuYUJsb2NrIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHdpZHRoOiA5MHB4O1xuICBwYWRkaW5nOiAwIDAgNXB4IDA7XG59XG4uZG5hQmxvY2tOdW1iZXIge1xuICBmb250LWZhbWlseTogRml4ZWQsIG1vbm9zcGFjZTtcbiAgZmxvYXQ6IGxlZnQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBiYWNrZ3JvdW5kOiAjMzYzNjM2O1xuICBtaW4td2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgcGFkZGluZzogMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLmRuYVN1YkJsb2NrIHtcbiAgZm9udC1mYW1pbHk6IEZpeGVkLCBtb25vc3BhY2U7XG4gIGZsb2F0OiBsZWZ0O1xuICBwYWRkaW5nOiAwO1xuICBtaW4td2lkdGg6IDE2cHg7XG4gIGhlaWdodDogMjBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLm1hc2sge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGxlZnQ6IDA7XG4gIHRvcDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZDogdXJsKHVpTWFza0JhY2tncm91bmQucG5nKTtcbn1cbi5tYXNrQ29udGVudCB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDIwMHB4O1xuICBtYXJnaW46IDIwMHB4IDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi8qKioqKioqKioqKioqKioqKioqKlxcXG5cXCoqKioqKioqKioqKioqKioqKioqL1xuYm9keSB7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBmb250LWZhbWlseTogVmVyZGFuYSwgR2VuZXZhLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxNzAlO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG59XG5ociB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM0MDYyOGE7XG4gIGhlaWdodDogMXB4O1xuICBib3JkZXI6IG5vbmU7XG59XG5pbWcsXG5hIGltZyB7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbn1cbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNiB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMTJweCAwIDZweCAwO1xuICBjb2xvcjogI0ZGRkZGRjtcbiAgY2xlYXI6IGJvdGg7XG59XG5oMSB7XG4gIGZvbnQtc2l6ZTogMThweDtcbn1cbmgyIHtcbiAgZm9udC1zaXplOiAxNnB4O1xufVxuaDMge1xuICBmb250LXNpemU6IDE0cHg7XG59XG5oNCB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbn1cbipbZGF0YS10b29sdGlwXSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbipbZGF0YS10b29sdGlwXTo6YWZ0ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB6LWluZGV4OiAyO1xuICB3aWR0aDogMjUwcHg7XG4gIHBhZGRpbmc6IDEwcHg7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3BhY2l0eTogMDtcbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgY29udGVudDogYXR0cihkYXRhLXRvb2x0aXApO1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cztcbiAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzM2MzYzNjtcbn1cbipbZGF0YS10b29sdGlwXTpob3Zlcjo6YWZ0ZXIge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICBvcGFjaXR5OiAxO1xufVxuKltkYXRhLXRvb2x0aXBdLnRvb2x0aXBUb3A6OmFmdGVyIHtcbiAgYm90dG9tOiAxMDAlO1xuICBsZWZ0OiA1MCU7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSg4cHgpO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoOHB4KTtcbn1cbipbZGF0YS10b29sdGlwXS50b29sdGlwVG9wOmhvdmVyOjphZnRlciB7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtOHB4KTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC04cHgpO1xufVxuKltkYXRhLXRvb2x0aXBdLnRvb2x0aXBCb3R0b206OmFmdGVyIHtcbiAgdG9wOiAxMDAlO1xuICBsZWZ0OiA1MCU7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtOHB4KTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC04cHgpO1xufVxuKltkYXRhLXRvb2x0aXBdLnRvb2x0aXBCb3R0b206aG92ZXI6OmFmdGVyIHtcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKDhweCk7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSg4cHgpO1xufVxuKltkYXRhLXRvb2x0aXBdLnRvb2x0aXBMZWZ0OjphZnRlciB7XG4gIHRvcDogNTAlO1xuICByaWdodDogMTAwJTtcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlWCg4cHgpIHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoOHB4KSB0cmFuc2xhdGVZKC01MCUpO1xufVxuKltkYXRhLXRvb2x0aXBdLnRvb2x0aXBMZWZ0OmhvdmVyOjphZnRlciB7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLThweCkgdHJhbnNsYXRlWSgtNTAlKTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtOHB4KSB0cmFuc2xhdGVZKC01MCUpO1xufVxuKltkYXRhLXRvb2x0aXBdLnRvb2x0aXBSaWdodDo6YWZ0ZXIge1xuICB0b3A6IDUwJTtcbiAgbGVmdDogMTAwJTtcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtOHB4KSB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC04cHgpIHRyYW5zbGF0ZVkoLTUwJSk7XG59XG4qW2RhdGEtdG9vbHRpcF0udG9vbHRpcFJpZ2h0OmhvdmVyOjphZnRlciB7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoOHB4KSB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDhweCkgdHJhbnNsYXRlWSgtNTAlKTtcbn1cbi5tYWluQkcge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IC0xO1xuICB0b3A6IDMwcHg7XG4gIGxlZnQ6IDBweDtcbiAgcmlnaHQ6IDBweDtcbiAgYm90dG9tOiAwcHg7XG4gIGJhY2tncm91bmQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0MlM0Z4bWwlMjB2ZXJzaW9uJTNEJTIyMS4wJTIyJTIwZW5jb2RpbmclM0QlMjJVVEYtOCUyMiUyMHN0YW5kYWxvbmUlM0QlMjJubyUyMiUzRiUzRSUwRCUwQSUzQ3N2ZyUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTIwdmVyc2lvbiUzRCUyMjEuMCUyMiUyMHZpZXdCb3glM0QlMjIwJTIwMCUyMDQyNSUyMDIwMCUyMiUyMG9wYWNpdHklM0QlMjIuMjUlMjIlM0UlMEQlMEElMjAlMjAlM0NwYXRoJTIwZCUzRCUyMm0lMjAxNzguMDAzOTklMkMwLjAzODY5JTIwLTcxLjIwMzkzJTJDMCUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjAtNi43NjEzNCUyQzYuMDI1NTUlMjBsJTIwMCUyQzE4Ny44NzE0NyUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjA2Ljc2MTM0JTJDNi4wMjU1NCUyMGwlMjA1My4xMDcyJTJDMCUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjA2Ljc2MTM1JTJDLTYuMDI1NTQlMjBsJTIwMCUyQy0xMDEuNTQ0MDE4JTIwNzIuMjE2MjglMkMxMDQuNjk5Mzk4JTIwYSUyMDYuNzYxMzQyMiUyQzYuMDI1NTQ5NSUyMDAlMjAwJTIwMCUyMDUuNzYwMTUlMkMyLjg3MDE2JTIwbCUyMDczLjU1NDg3JTJDMCUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjA2Ljc2MTM1JTJDLTYuMDI1NTQlMjBsJTIwMCUyQy0xODcuODcxNDclMjBhJTIwNi43NjEzNDIyJTJDNi4wMjU1NDk1JTIwMCUyMDAlMjAwJTIwLTYuNzYxMzUlMkMtNi4wMjU1NSUyMGwlMjAtNTQuNzE2NDQlMkMwJTIwYSUyMDYuNzYxMzQyMiUyQzYuMDI1NTQ5NSUyMDAlMjAwJTIwMCUyMC02Ljc2MTMzJTJDNi4wMjU1NSUyMGwlMjAwJTJDMTAyLjYxOTM1JTIwTCUyMDE4My43NjQxMyUyQzIuOTA4ODYlMjBhJTIwNi43NjEzNDIyJTJDNi4wMjU1NDk1JTIwMCUyMDAlMjAwJTIwLTUuNzYwMTQlMkMtMi44NzAxNyUyMHolMjIlMjAlMkYlM0UlMEQlMEElMjAlMjAlM0NwYXRoJTIwZCUzRCUyMk0lMjA0Ljg0NDYzMzMlMkMyMi4xMDg3NSUyMEElMjAxMy40MTIwMzklMkMxMi41MDE4NDIlMjAwJTIwMCUyMDElMjAxMy40Nzc1ODglMkMwLjAzOTI0JTIwbCUyMDY2LjExODMxNSUyQzAlMjBhJTIwNS4zNjQ4MTU4JTJDNS4wMDA3MzclMjAwJTIwMCUyMDElMjA1LjM2NDgyMyUyQzUuMDAwNzMlMjBsJTIwMCUyQzc5Ljg3OTMxJTIweiUyMiUyMCUyRiUzRSUwRCUwQSUyMCUyMCUzQ3BhdGglMjBkJTNEJTIybSUyMDQyMC4xNTUzNSUyQzE3Ny44OTExOSUyMGElMjAxMy40MTIwMzglMkMxMi41MDE4NDIlMjAwJTIwMCUyMDElMjAtOC42MzI5NSUyQzIyLjA2OTUxJTIwbCUyMC02Ni4xMTgzMiUyQzAlMjBhJTIwNS4zNjQ4MTUyJTJDNS4wMDA3MzclMjAwJTIwMCUyMDElMjAtNS4zNjQ4MiUyQy01LjAwMDc0JTIwbCUyMDAlMkMtNzkuODc5MzElMjB6JTIyJTIwJTJGJTNFJTBEJTBBJTNDJTJGc3ZnJTNFJTBEJTBBXCIpIG5vLXJlcGVhdCBmaXhlZCBjZW50ZXIgLyA3MCUgNzAlLCBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjMmEyYTJhIDAlLCAjMjAyMDIwIDEwMCUpIG5vLXJlcGVhdCBmaXhlZCBjZW50ZXIgLyAxMDAlIDEwMCU7XG59XG5odG1sLFxuYm9keSB7XG4gIHNjcm9sbGJhci1mYWNlLWNvbG9yOiAjNjY2NjY2O1xuICBzY3JvbGxiYXItYXJyb3ctY29sb3I6ICNFOUMxODM7XG4gIHNjcm9sbGJhci10cmFjay1jb2xvcjogIzM2MzYzNjtcbiAgc2Nyb2xsYmFyLXNoYWRvdy1jb2xvcjogIzU1NTU1NTtcbn1cbiN1aVdyYXBwZXIge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIHVzZXItc2VsZWN0OiBub25lO1xufVxuI3VpVGl0bGVXcmFwcGVyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBtaW4taGVpZ2h0OiAzMHB4O1xuICBtaW4td2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzNjM2MzY7XG4gIGxlZnQ6IDBweDtcbiAgdG9wOiAwcHg7XG4gIHJpZ2h0OiAwcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHotaW5kZXg6IDEwMDtcbn1cbiN1aVRpdGxlV3JhcHBlciA+IGRpdiB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cbiN1aVRpdGxlV3JhcHBlciA+IGkge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG4jdWlUaXRsZVRleHQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNnB4O1xuICBsZWZ0OiA0NHB4O1xuICB3aWR0aDogNjYlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBjb2xvcjogI0U5QzE4MztcbiAgZm9udC1zaXplOiAxNnB4O1xufVxuI3VpVGl0bGUuaWNvbiB7XG4gIHBhZGRpbmc6IDZweCA4cHggNnB4IDQycHg7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IDJweCA1MCU7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG59XG4jdWlUaXRsZUZsdWZmIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDRweDtcbiAgcmlnaHQ6IDEycHg7XG4gIHdpZHRoOiA0MnB4O1xuICBoZWlnaHQ6IDI0cHg7XG4gIGJhY2tncm91bmQ6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0MlM0Z4bWwlMjB2ZXJzaW9uJTNEJTIyMS4wJTIyJTIwZW5jb2RpbmclM0QlMjJVVEYtOCUyMiUyMHN0YW5kYWxvbmUlM0QlMjJubyUyMiUzRiUzRSUwRCUwQSUzQ3N2ZyUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTIwdmVyc2lvbiUzRCUyMjEuMCUyMiUyMHZpZXdCb3glM0QlMjIwJTIwMCUyMDQyNSUyMDIwMCUyMiUyMG9wYWNpdHklM0QlMjIuMjUlMjIlM0UlMEQlMEElMjAlMjAlM0NwYXRoJTIwZCUzRCUyMm0lMjAxNzguMDAzOTklMkMwLjAzODY5JTIwLTcxLjIwMzkzJTJDMCUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjAtNi43NjEzNCUyQzYuMDI1NTUlMjBsJTIwMCUyQzE4Ny44NzE0NyUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjA2Ljc2MTM0JTJDNi4wMjU1NCUyMGwlMjA1My4xMDcyJTJDMCUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjA2Ljc2MTM1JTJDLTYuMDI1NTQlMjBsJTIwMCUyQy0xMDEuNTQ0MDE4JTIwNzIuMjE2MjglMkMxMDQuNjk5Mzk4JTIwYSUyMDYuNzYxMzQyMiUyQzYuMDI1NTQ5NSUyMDAlMjAwJTIwMCUyMDUuNzYwMTUlMkMyLjg3MDE2JTIwbCUyMDczLjU1NDg3JTJDMCUyMGElMjA2Ljc2MTM0MjIlMkM2LjAyNTU0OTUlMjAwJTIwMCUyMDAlMjA2Ljc2MTM1JTJDLTYuMDI1NTQlMjBsJTIwMCUyQy0xODcuODcxNDclMjBhJTIwNi43NjEzNDIyJTJDNi4wMjU1NDk1JTIwMCUyMDAlMjAwJTIwLTYuNzYxMzUlMkMtNi4wMjU1NSUyMGwlMjAtNTQuNzE2NDQlMkMwJTIwYSUyMDYuNzYxMzQyMiUyQzYuMDI1NTQ5NSUyMDAlMjAwJTIwMCUyMC02Ljc2MTMzJTJDNi4wMjU1NSUyMGwlMjAwJTJDMTAyLjYxOTM1JTIwTCUyMDE4My43NjQxMyUyQzIuOTA4ODYlMjBhJTIwNi43NjEzNDIyJTJDNi4wMjU1NDk1JTIwMCUyMDAlMjAwJTIwLTUuNzYwMTQlMkMtMi44NzAxNyUyMHolMjIlMjAlMkYlM0UlMEQlMEElMjAlMjAlM0NwYXRoJTIwZCUzRCUyMk0lMjA0Ljg0NDYzMzMlMkMyMi4xMDg3NSUyMEElMjAxMy40MTIwMzklMkMxMi41MDE4NDIlMjAwJTIwMCUyMDElMjAxMy40Nzc1ODglMkMwLjAzOTI0JTIwbCUyMDY2LjExODMxNSUyQzAlMjBhJTIwNS4zNjQ4MTU4JTJDNS4wMDA3MzclMjAwJTIwMCUyMDElMjA1LjM2NDgyMyUyQzUuMDAwNzMlMjBsJTIwMCUyQzc5Ljg3OTMxJTIweiUyMiUyMCUyRiUzRSUwRCUwQSUyMCUyMCUzQ3BhdGglMjBkJTNEJTIybSUyMDQyMC4xNTUzNSUyQzE3Ny44OTExOSUyMGElMjAxMy40MTIwMzglMkMxMi41MDE4NDIlMjAwJTIwMCUyMDElMjAtOC42MzI5NSUyQzIyLjA2OTUxJTIwbCUyMC02Ni4xMTgzMiUyQzAlMjBhJTIwNS4zNjQ4MTUyJTJDNS4wMDA3MzclMjAwJTIwMCUyMDElMjAtNS4zNjQ4MiUyQy01LjAwMDc0JTIwbCUyMDAlMkMtNzkuODc5MzElMjB6JTIyJTIwJTJGJTNFJTBEJTBBJTNDJTJGc3ZnJTNFJTBEJTBBXCIpIDUwJSA1MCUgbm8tcmVwZWF0O1xufVxuLnN0YXR1c2ljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNHB4O1xuICBsZWZ0OiAxMnB4O1xufVxuI3VpTWFwV3JhcHBlciB7XG4gIGNsZWFyOiBib3RoO1xuICBwYWRkaW5nOiA4cHg7XG4gIG1hcmdpbi10b3A6IDMwcHg7XG59XG4jdWlNYXBIZWFkZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGNsZWFyOiBib3RoO1xufVxuI3VpTWFwQ29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiA2MDBweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYm9yZGVyOiAxcHggc29saWQgIzQwNjI4YTtcbiAgYmFja2dyb3VuZDogdXJsKG5hbm9tYXBCYWNrZ3JvdW5kLnBuZyk7XG59XG4jdWlNYXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIG1hcmdpbjogLTUxMnB4IDAgMCAtNTEycHg7XG4gIHdpZHRoOiAyNTZweDtcbiAgaGVpZ2h0OiAyNTZweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgem9vbTogNDtcbn1cbiN1aU1hcEltYWdlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDFweDtcbiAgbGVmdDogMXB4O1xuICB3aWR0aDogMjU2cHg7XG4gIGhlaWdodDogMjU2cHg7XG59XG4jdWlNYXBDb250ZW50IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IC0xMy41cHg7XG4gIGxlZnQ6IDBweDtcbiAgd2lkdGg6IDI1NnB4O1xuICBoZWlnaHQ6IDI1NnB4O1xufVxuI3VpTWFwRm9vdGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBjbGVhcjogYm90aDtcbn1cbiN1aUNvbnRlbnQge1xuICBjbGVhcjogYm90aDtcbiAgcGFkZGluZzogOHB4O1xuICBtYXJnaW4tdG9wOiAzMHB4O1xufVxuI3VpTWFwVG9vbHRpcCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDEwcHg7XG4gIHRvcDogMTBweDtcbiAgYm9yZGVyOiAxcHggc29saWQgIzQwNjI4YTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzI3MjcyNztcbiAgcGFkZGluZzogOHB4O1xuICBkaXNwbGF5OiBub25lO1xuICB6LWluZGV4OiA5OTk5O1xufVxuI3VpTG9hZGluZ05vdGljZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYmFja2dyb3VuZDogdXJsKHVpTm90aWNlQmFja2dyb3VuZC5qcGcpIDUwJSA1MCU7XG4gIGNvbG9yOiAjMDAwMDAwO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHBhZGRpbmc6IDNweCA0cHggM3B4IDRweDtcbiAgbWFyZ2luOiA0cHggMCA0cHggMDtcbn1cbi51bmRlclRpdGxlIHtcbiAgbWFyZ2luLXRvcDogMzBweDtcbn1cbiIsbnVsbCxudWxsLG51bGwsIi5kaXNwbGF5QmFyIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHdpZHRoOiAyMzZweDtcclxuICAgIGhlaWdodDogMTZweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIG1hcmdpbjogMCA1cHggMCAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGJhY2tncm91bmQ6ICMwMDAwMDA7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyVGV4dCB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IC0ycHg7XHJcbiAgICBsZWZ0OiA1cHg7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJGaWxsIHtcclxuICAgIHdpZHRoOiAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGJhY2tncm91bmQ6ICM0MDYyOGE7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyRmlsbC5hbGlnblJpZ2h0IHtcclxuICAgIGZsb2F0OiByaWdodDtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJUZXh0Lmdvb2Qge1xyXG5cdGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJUZXh0Lm5vdGdvb2Qge1xyXG5cdGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJUZXh0LmF2ZXJhZ2Uge1xyXG5cdGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJUZXh0LmJhZCB7XHJcblx0Y29sb3I6IHdoaXRlO1xyXG59XHJcblxyXG4uZGlzcGxheUJhclRleHQuaGlnaGxpZ2h0IHtcclxuXHRjb2xvcjogYmxhY2s7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyRmlsbC5nb29kIHtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYmFja2dyb3VuZDogQGdvb2QtY29sb3I7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyRmlsbC5ub3Rnb29kIHtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYmFja2dyb3VuZDogI2ZmYjQwMDtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJGaWxsLmF2ZXJhZ2Uge1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBiYWNrZ3JvdW5kOiBAYXZlcmFnZS1jb2xvcjtcclxufVxyXG5cclxuLmRpc3BsYXlCYXJGaWxsLmJhZCB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6IEBiYWQtY29sb3I7XHJcbn1cclxuXHJcbi5kaXNwbGF5QmFyRmlsbC5oaWdobGlnaHQge1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBiYWNrZ3JvdW5kOiBAaGlnaGxpZ2h0LWNvbG9yO1xyXG59XHJcbiIsIi5saW5rLCAubGlua09uLCAubGlua09mZiwgLnNlbGVjdGVkLCAuZGlzYWJsZWQsIC55ZWxsb3dCdXR0b24sIC5yZWRCdXR0b24sIC5saW5rRW5jb3VyYWdlLCAubGlua0Rpc2NvdXJhZ2Uge1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICBtaW4td2lkdGg6IDE1cHg7XHJcbiAgICBoZWlnaHQ6IDE2cHg7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgIGJhY2tncm91bmQ6ICM0MDYyOGE7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTYxNjE2O1xyXG4gICAgcGFkZGluZzogMHB4IDRweCA0cHggNHB4O1xyXG4gICAgbWFyZ2luOiAwIDJweCAycHggMDtcclxuICAgIGN1cnNvcjogZGVmYXVsdDtcclxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbn1cclxuXHJcbi5oYXNJY29uIHtcclxuICAgIHBhZGRpbmc6IDBweCA0cHggNHB4IDBweDtcclxufVxyXG5cclxuYS5ob3ZlciwgLnpvb21MaW5rLmhvdmVyLCAubGlua0FjdGl2ZS5ob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kOiAjNTA3YWFjO1xyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIHBlbmRpbmdBbmltYXRpb24ge1xyXG4gICAgdG8ge1xyXG4gICAgICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgICAgIGJhY2tncm91bmQ6ICM1MDdhYWM7XHJcbiAgICB9XHJcbn1cclxuXHJcbi5saW5rUGVuZGluZywgLmxpbmtQZW5kaW5nLmhvdmVyIHtcclxuICAgIGFuaW1hdGlvbi1uYW1lOiBwZW5kaW5nQW5pbWF0aW9uO1xyXG4gICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjI1cztcclxufVxyXG5cclxuYS53aGl0ZSwgYS53aGl0ZTpsaW5rLCBhLndoaXRlOnZpc2l0ZWQsIGEud2hpdGU6YWN0aXZlIHtcclxuICAgIGNvbG9yOiAjNDA2MjhhO1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICMxNjE2MTY7XHJcbiAgICBwYWRkaW5nOiAxcHggNHB4IDFweCA0cHg7XHJcbiAgICBtYXJnaW46IDAgMnB4IDAgMDtcclxuICAgIGN1cnNvcjogZGVmYXVsdDtcclxufVxyXG5cclxuYS53aGl0ZS5ob3ZlciB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6ICM0MDYyOGE7XHJcbn1cclxuXHJcbi5saW5rT24sIGEubGlua09uOmxpbmssIGEubGlua09uOnZpc2l0ZWQsIGEubGlua09uOmFjdGl2ZSwgYS5saW5rT24uaG92ZXIsIC5zZWxlY3RlZCwgYS5zZWxlY3RlZDpsaW5rLCBhLnNlbGVjdGVkOnZpc2l0ZWQsIGEuc2VsZWN0ZWQ6YWN0aXZlLCBhLnNlbGVjdGVkLmhvdmVyIHtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYmFja2dyb3VuZDogIzJmOTQzYztcclxufVxyXG5cclxuLmxpbmtPZmYsIGEubGlua09mZjpsaW5rLCBhLmxpbmtPZmY6dmlzaXRlZCwgYS5saW5rT2ZmOmFjdGl2ZSwgYS5saW5rT2ZmLmhvdmVyLCAuZGlzYWJsZWQsIGEuZGlzYWJsZWQ6bGluaywgYS5kaXNhYmxlZDp2aXNpdGVkLCBhLmRpc2FibGVkOmFjdGl2ZSwgYS5kaXNhYmxlZC5ob3ZlciB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6ICM5OTk5OTk7XHJcbiAgICBib3JkZXItY29sb3I6ICM2NjY2NjY7XHJcbn1cclxuXHJcbmEuaWNvbiwgLmxpbmtPbi5pY29uLCAubGlua09mZi5pY29uLCAuc2VsZWN0ZWQuaWNvbiwgLmRpc2FibGVkLmljb24ge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgcGFkZGluZzogMXB4IDRweCAycHggMjBweDtcclxufVxyXG5cclxuYS5pY29uIGltZywgLmxpbmtPbi5pY29uIGltZywgLmxpbmtPZmYuaWNvbiBpbWcsIC5zZWxlY3RlZC5pY29uIGltZywgLmRpc2FibGVkLmljb24gaW1nIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMThweDtcclxuICAgIGhlaWdodDogMThweDtcclxufVxyXG5cclxuLmxpbmtEYW5nZXIsIGEubGlua0RhbmdlcjpsaW5rLCBhLmxpbmtEYW5nZXI6dmlzaXRlZCwgYS5saW5rRGFuZ2VyOmFjdGl2ZSB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZjAwMDA7XHJcbiAgICBib3JkZXItY29sb3I6ICNhYTAwMDA7XHJcbn1cclxuXHJcbi5saW5rRGFuZ2VyLmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZjY2NjY7XHJcbn1cclxuXHJcbi5saW5rRW5jb3VyYWdlLCBhLmxpbmtFbmNvdXJhZ2U6bGluaywgYS5saW5rRW5jb3VyYWdlOnZpc2l0ZWQsIGEubGlua0VuY291cmFnZTphY3RpdmUge1xyXG4gICAgY29sb3I6ICM5OWZmMzM7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDA2MjhhO1xyXG4gICAgYm9yZGVyLWNvbG9yOiAjMTYxNjE2O1xyXG59XHJcblxyXG4ubGlua0VuY291cmFnZS5ob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTA3YWFjO1xyXG59XHJcblxyXG4ubGlua0Rpc2NvdXJhZ2UsIGEubGlua0Rpc2NvdXJhZ2U6bGluaywgYS5saW5rRGlzY291cmFnZTp2aXNpdGVkLCBhLmxpbmtEaXNjb3VyYWdlOmFjdGl2ZSB7XHJcbiAgICBjb2xvcjogIzhjOGM4YztcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM0MDYyOGE7XHJcbiAgICBib3JkZXItY29sb3I6ICMxNjE2MTY7XHJcbn1cclxuXHJcbi5saW5rRGlzY291cmFnZS5ob3ZlciB7XHJcblx0Y29sb3I6ICNmZjAwMDA7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTA3YWFjO1xyXG59XHJcblxyXG4uaW5hY3RpdmUsIGEuaW5hY3RpdmU6bGluaywgYS5pbmFjdGl2ZTp2aXNpdGVkLCBhLmluYWN0aXZlOmFjdGl2ZSwgYS5pbmFjdGl2ZS5ob3ZlciB7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIGJhY2tncm91bmQ6ICM5OTk5OTk7XHJcbiAgICBib3JkZXItY29sb3I6ICM2NjY2NjY7XHJcbn0iLCJAaW1wb3J0IFwiX2NvbmZpZ1wiO1xyXG5cclxuLndoaXRlIHtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4uZ29vZCB7XHJcbiAgICBjb2xvcjogQGdvb2QtY29sb3I7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmF2ZXJhZ2Uge1xyXG4gICAgY29sb3I6IEBhdmVyYWdlLWNvbG9yO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi5iYWQge1xyXG4gICAgY29sb3I6IEBiYWQtY29sb3I7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmlkbGUge1xyXG4gICAgY29sb3I6IEBkYXJrLWNvbG9yO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi5yZWRCdXR0b24ge1xyXG4gICAgYmFja2dyb3VuZDogI2VhMDAwMDtcclxufVxyXG5cclxuLnllbGxvd0J1dHRvbiB7XHJcbiAgICBiYWNrZ3JvdW5kOiAjY2FjYzAwO1xyXG59XHJcblxyXG4uaGlnaGxpZ2h0IHtcclxuICAgIGNvbG9yOiBAaGlnaGxpZ2h0LWNvbG9yO1xyXG59XHJcblxyXG4uZGFyayB7XHJcbiAgICBjb2xvcjogQGRhcmstY29sb3I7XHJcbn1cclxuXHJcbi8qIERhbWFnZSBjb2xvcnMgZm9yIGNyZXcgbW9uaXRvcmluZyBjb21wdXRlciAqL1xyXG4uYnVybiB7XHJcbiAgICBjb2xvcjogb3JhbmdlO1xyXG59XHJcblxyXG4uYnJ1dGUge1xyXG4gICAgY29sb3I6IHJlZDtcclxufVxyXG5cclxuLnRveGluIHtcclxuICAgIGNvbG9yOiBncmVlbjtcclxufVxyXG5cclxuLnRveGluX2xpZ2h0IHtcclxuICAgIGNvbG9yOiAjM0FERjAwO1xyXG59XHJcblxyXG4ub3h5bG9zcyB7XHJcbiAgICBjb2xvcjogYmx1ZTtcclxufVxyXG5cclxuLm94eWxvc3NfbGlnaHQge1xyXG4gICAgY29sb3I6ICM2Njk4RkY7XHJcbn1cclxuXHJcbi8qIFdpcmUgY29sb3JzIGZvciBudWNsZWFyIGJvbWIgZGVmdXNpb24gKi9cclxuLlJlZCB7XHJcbiAgICBjb2xvcjogI0ZGMDAwMDtcclxufVxyXG5cclxuLkJsdWUge1xyXG4gICAgY29sb3I6ICMwMDAwRkY7XHJcbn1cclxuXHJcbi5HcmVlbiB7XHJcbiAgICBjb2xvcjogIzAwRkYwMDtcclxufVxyXG5cclxuLk1hcmlnb2xkIHtcclxuICAgIGNvbG9yOiAjRkRBNTA1O1xyXG59XHJcblxyXG4uRnVzY2hpYSB7XHJcbiAgICBjb2xvcjogI0ZGMDA4MDtcclxufVxyXG5cclxuLkJsYWNrIHtcclxuICAgIGNvbG9yOiAjMDAwMDAwO1xyXG59XHJcblxyXG4uUGVhcmwge1xyXG4gICAgY29sb3I6ICNDNkNBQ0I7XHJcbn1cclxuXHJcbi8qIFN0YXR1cyBiYXIgY29sb3JzIGZvciBzbGVlcGVyIHRlbXBlcmF0dXJlcyAqL1xyXG4uY29sZDEge1xyXG4gICAgY29sb3I6ICM5NEI4RkY7XHJcbn1cclxuXHJcbi5jb2xkMiB7XHJcbiAgICBjb2xvcjogIzY2OTlGRjtcclxufVxyXG5cclxuLmNvbGQzIHtcclxuICAgIGNvbG9yOiAjMjkzRDY2O1xyXG59XHJcblxyXG4uaG90MSB7XHJcbiAgICBjb2xvcjogI0ZGOTk2NjtcclxufVxyXG5cclxuLmhvdDIge1xyXG4gICAgY29sb3I6ICM5OTNEMDA7XHJcbn1cclxuXHJcbi5ob3QzIHtcclxuICAgIGNvbG9yOiAjRkY2NjAwO1xyXG59IiwiZGl2LmRpc3BsYXkge1xyXG5cdHBhZGRpbmc6IDRweDtcclxuXHRtYXJnaW46IDZweCAwO1xyXG5cclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzMpO1xyXG5cdGJveC1zaGFkb3c6IGluc2V0IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjUpO1xyXG59XHJcblxyXG5kaXYuZGlzcGxheSBoZWFkZXIge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcblx0d2lkdGg6IDk4LjUlO1xyXG4gICAgcGFkZGluZzogMCA0cHg7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA2cHg7XHJcbiAgICBjb2xvcjogI0ZGRkZGRjtcclxuICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjNDA2MjhhO1xyXG59XHJcblxyXG5kaXYuZGlzcGxheSBoZWFkZXIgLmJ1dHRvblJpZ2h0IHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGJvdHRvbTogNnB4O1xyXG4gICAgcmlnaHQ6IDRweDtcclxufVxyXG5cclxuZGl2LmRpc3BsYXkgYXJ0aWNsZSB7XHJcbiAgICBkaXNwbGF5OiB0YWJsZTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcclxufSIsIi5pdGVtR3JvdXAge1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2U5YzE4MztcclxuICAgIGJhY2tncm91bmQ6ICMyYzJjMmM7XHJcbiAgICBwYWRkaW5nOiA0cHg7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuXHJcbi5pdGVtIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWFyZ2luOiA0cHggMCAwIDA7XHJcbiAgICBjbGVhcjogYm90aDtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG59XHJcblxyXG4uaXRlbUNvbnRlbnROYXJyb3csIC5pdGVtQ29udGVudCB7XHJcbiAgICBmbG9hdDogbGVmdDtcclxufVxyXG5cclxuLml0ZW1Db250ZW50TmFycm93IHtcclxuICAgIHdpZHRoOiAzMCU7XHJcbn1cclxuXHJcbi5pdGVtQ29udGVudCB7XHJcbiAgICB3aWR0aDogNjklO1xyXG59XHJcblxyXG4uaXRlbUxhYmVsTmFycm93LCAuaXRlbUxhYmVsLCAuaXRlbUxhYmVsV2lkZSwgLml0ZW1MYWJlbFdpZGVyLCAuaXRlbUxhYmVsV2lkZXN0IHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgY29sb3I6ICNlOWMxODM7XHJcbn1cclxuXHJcbi5pdGVtTGFiZWxOYXJyb3cge1xyXG4gICAgd2lkdGg6IDIwJTtcclxufVxyXG5cclxuLml0ZW1MYWJlbCB7XHJcbiAgICB3aWR0aDogMzAlO1xyXG59XHJcblxyXG4uaXRlbUxhYmVsV2lkZSB7XHJcbiAgICB3aWR0aDogNDUlO1xyXG59XHJcblxyXG4uaXRlbUxhYmVsV2lkZXIge1xyXG4gICAgd2lkdGg6IDY5JTtcclxufVxyXG5cclxuLml0ZW1MYWJlbFdpZGVzdCB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLml0ZW1Db250ZW50V2lkZSB7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIHdpZHRoOiA3OSU7XHJcbn1cclxuXHJcbi5pdGVtQ29udGVudFNtYWxsIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgd2lkdGg6IDMzJTtcclxufVxyXG5cclxuLml0ZW1Db250ZW50TWVkaXVtIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgd2lkdGg6IDU1JTtcclxufVxyXG5cclxuLmJsb2NrIHtcclxuICAgIHBhZGRpbmc6IDhweDtcclxuICAgIG1hcmdpbjogMTBweCA0cHggNHB4IDRweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM0MDYyOGE7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwO1xyXG59XHJcblxyXG4uYmxvY2sgaDMge1xyXG4gICAgcGFkZGluZzogMDtcclxufVxyXG5cclxuLmNsZWFyQm90aCB7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuLmNsZWFyTGVmdCB7XHJcbiAgICBjbGVhcjogbGVmdDtcclxufVxyXG5cclxuLmNsZWFyUmlnaHQge1xyXG4gICAgY2xlYXI6IHJpZ2h0O1xyXG59XHJcblxyXG4ubGluZSB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGNsZWFyOiBib3RoO1xyXG59XHJcblxyXG4uZml4ZWRMZWZ0IHtcclxuICAgIHdpZHRoOiAxMTBweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZml4ZWRMZWZ0V2lkZSB7XHJcbiAgICB3aWR0aDogMTY1cHg7XHJcbiAgICBmbG9hdDogbGVmdDtcclxufVxyXG5cclxuLmZpeGVkTGVmdFdpZGVyIHtcclxuICAgIHdpZHRoOiAyMjBweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZml4ZWRMZWZ0V2lkZXN0IHtcclxuICAgIHdpZHRoOiAyNTBweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZmxvYXRSaWdodCB7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbn1cclxuXHJcbi5mbG9hdExlZnQge1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbn1cclxuXHJcbi5oaWRkZW4ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuXHJcbi5zdGF0dXNEaXNwbGF5IHtcclxuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzQwNjI4YTtcclxuICAgIHBhZGRpbmc6IDRweDtcclxuICAgIG1hcmdpbjogM3B4IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG59XHJcblxyXG4uc3RhdHVzRGlzcGxheVJlY29yZHMge1xyXG4gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUpO1xyXG4gICAgY29sb3I6ICNmZmZmZmY7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjNDA2MjhhO1xyXG4gICAgcGFkZGluZzogNHB4O1xyXG4gICAgbWFyZ2luOiAzcHggMDtcclxuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcclxuICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbn1cclxuXHJcbi5zdGF0dXNMYWJlbCB7XHJcbiAgICB3aWR0aDogMTM4cHg7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICBjb2xvcjogIzk4QjBDMztcclxufVxyXG5cclxuLnN0YXR1c1ZhbHVlIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uam9iVmFsdWVzIHtcclxuXHRmbG9hdDogbGVmdDtcclxuXHR3aWR0aDogMzAlO1xyXG59XHJcblxyXG4vLyBDSFJPTUVMRVNTIFNUVUZGXHJcblxyXG4uZmFuY3kge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuaS5mYW5jeSB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG4udGl0bGVidXR0b24oKSB7XHJcbiAgICBjb2xvcjogI0U5QzE4MztcclxuICAgIC8vIFNpbmNlIHdlJ3JlIG9uIHNvbWUgaGlsYXJpb3VzbHkgb3V0ZGF0ZWQgbGlicmFyaWVzLCB0aGUgYmVsb3cgaXMgYW4gaXNzdWVcclxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Gb3J0QXdlc29tZS9Gb250LUF3ZXNvbWUvaXNzdWVzLzEyNzRcclxuICAgIC8vIFVzaW5nIHRoZSAhaW1wb3J0YW50IGRpcmVjdGl2ZSBpcyBuZWNlc3NhcnkgdG8gb3ZlcnJpZGUgdGhlIEZBIHN0eWxlc1xyXG4gICAgY3Vyc29yOiBwb2ludGVyICFpbXBvcnRhbnQ7IFxyXG4gICAgei1pbmRleDogMTAyOyAvLyBUaGlzIGlzIGZvciB0aGUgY29ybmVycyAtIG1ha2VzIHN1cmUgdGhlIGJ1dHRvbnMgcmVuZGVyIG9uIHRvcFxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICAgIGNvbG9yOiBsaWdodGVuKCM5OGIwYzMsIDEwJSk7XHJcbiAgICB9XHJcbn1cclxuLm1pbmltaXplIHtcclxuICAgIC50aXRsZWJ1dHRvbjtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNnB4O1xyXG4gICAgcmlnaHQ6IDQ2cHg7XHJcbn1cclxuLmNsb3NlIHtcclxuICAgIC50aXRsZWJ1dHRvbjtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNHB4O1xyXG4gICAgcmlnaHQ6IDEycHg7XHJcbn0iLCIuY29ybmVyKCkge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgei1pbmRleDogMTAxO1xyXG4gICAgbWluLXdpZHRoOiAzMHB4O1xyXG4gICAgbWluLWhlaWdodDogMzBweDtcclxufVxyXG5cclxuI3VpQ29ybmVyVEwge1xyXG4gICAgLmNvcm5lcjtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBiYWNrZ3JvdW5kOiBkYXRhLXVyaSgndGwucG5nJykgbm8tcmVwZWF0O1xyXG59XHJcblxyXG4vKiBSZXNpemluZyAoU3RvbGVuIGZyb20gR29vbiBDQy1CWS1OQy1TQSkgKi9cclxuQHJlc2l6ZTogNXB4O1xyXG4ucmVzaXplQXJlYSB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiA5OTk5OTtcclxufVxyXG4ucmVzaXplQXJlYS50b3Age1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMTBweDtcclxuICAgIHJpZ2h0OiAxMHB4O1xyXG4gICAgaGVpZ2h0OiBAcmVzaXplO1xyXG4gICAgY3Vyc29yOiBuLXJlc2l6ZTtcclxufVxyXG4ucmVzaXplQXJlYS50ciB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICByaWdodDogMDtcclxuICAgIGhlaWdodDogMTBweDtcclxuICAgIHdpZHRoOiAxMHB4O1xyXG4gICAgY3Vyc29yOiBuZS1yZXNpemU7XHJcbn1cclxuLnJlc2l6ZUFyZWEucmlnaHQge1xyXG4gICAgdG9wOiAxMHB4O1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBib3R0b206IDEwcHg7XHJcbiAgICB3aWR0aDogQHJlc2l6ZTtcclxuICAgIGN1cnNvcjogZS1yZXNpemU7XHJcbn1cclxuLnJlc2l6ZUFyZWEuYnIge1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBoZWlnaHQ6IDEwcHg7XHJcbiAgICB3aWR0aDogMTBweDtcclxuICAgIGN1cnNvcjogc2UtcmVzaXplO1xyXG59XHJcbi5yZXNpemVBcmVhLmJvdHRvbSB7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICBsZWZ0OiAxMHB4O1xyXG4gICAgcmlnaHQ6IDEwcHg7XHJcbiAgICBoZWlnaHQ6IEByZXNpemU7XHJcbiAgICBjdXJzb3I6IHMtcmVzaXplO1xyXG59XHJcbi5yZXNpemVBcmVhLmJsIHtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBoZWlnaHQ6IDEwcHg7XHJcbiAgICB3aWR0aDogMTBweDtcclxuICAgIGN1cnNvcjogc3ctcmVzaXplO1xyXG59XHJcbi5yZXNpemVBcmVhLmxlZnQge1xyXG4gICAgdG9wOiAxMHB4O1xyXG4gICAgbGVmdDogMDtcclxuICAgIGJvdHRvbTogMTBweDtcclxuICAgIHdpZHRoOiBAcmVzaXplO1xyXG4gICAgY3Vyc29yOiB3LXJlc2l6ZTtcclxufVxyXG4ucmVzaXplQXJlYS50bCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgaGVpZ2h0OiAxMHB4O1xyXG4gICAgd2lkdGg6IDEwcHg7XHJcbiAgICBjdXJzb3I6IG53LXJlc2l6ZTtcclxufVxyXG4vKiBFbmQgUmVzaXppbmcgKi8iLCIvKiBJY29uc1xyXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbi8qIHN0YXRlcyBhbmQgaW1hZ2VzICovXHJcbi51aUxpbmtQZW5kaW5nSWNvbiB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICB3aWR0aDogMTZweDtcclxuICAgIGhlaWdodDogMTZweDtcclxuICAgIG1hcmdpbjogMnB4IDJweCAwIDJweDtcclxuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCh1aUxpbmtQZW5kaW5nSWNvbi5naWYpO1xyXG59XHJcblxyXG4ubGlua1BlbmRpbmcgLmZhIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi5saW5rUGVuZGluZyAudWlMaW5rUGVuZGluZ0ljb24ge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuXHJcbi5tYXBJY29uMTYge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgd2lkdGg6IDE2cHg7XHJcbiAgICBoZWlnaHQ6IDE2cHg7XHJcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2R3JlZW4ucG5nKTtcclxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtOTZweDtcclxuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XHJcbiAgICB6b29tOiAwLjEyNTtcclxuICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xyXG4gICAgLyptYXJnaW4tYm90dG9tOiAtMXB4OyovXHJcbn1cclxuLm1hcEljb24xNi5kZWFkICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCh1aUljb25zMTZSZWQucG5nKTsgICAgfVxyXG4ubWFwSWNvbjE2LmJhZCAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKHVpSWNvbnMxNlJlZC5wbmcpOyAgICB9XHJcbi5tYXBJY29uMTYuYXZlcmFnZSAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwodWlJY29uczE2T3JhbmdlLnBuZyk7IH1cclxuLm1hcEljb24xNi5nb29kICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCh1aUljb25zMTZHcmVlbi5wbmcpOyAgfVxyXG4vKiBBaXJBbGFybSAqL1xyXG4ubWFwSWNvbjE2Lmljb24tYWlyYWxhcm0gICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTQ0cHg7ICAgICAgICAgICAgICB9IFxyXG4vKiBDb21tYW5kIFBvc2l0aW9ucyAqL1xyXG4ubWFwSWNvbjE2LnJhbmstY2FwdGFpbiAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC0xMTJweDsgICAgICAgICB9IFxyXG4ubWFwSWNvbjE2LnJhbmstaGVhZG9mcGVyc29ubmVsICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC05NnB4OyAgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay1oZWFkb2ZzZWN1cml0eSAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTEyOHB4OyAgICAgICAgIH1cclxuLm1hcEljb24xNi5yYW5rLWNoaWVmZW5naW5lZXIgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTEycHg7ICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstcmVzZWFyY2hkaXJlY3RvciAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDsgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay1jaGllZm1lZGljYWxvZmZpY2VyICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7ICAgICAgICAgIH1cclxuLyogRW5naW5lZXJpbmcgUG9zaXRpb25zICovXHJcbi5tYXBJY29uMTYucmFuay1zdGF0aW9uZW5naW5lZXIgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTExMnB4OyAgICAgICAgIH0gXHJcbi5tYXBJY29uMTYucmFuay1hdG1vc3BoZXJpY3RlY2huaWNpYW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTExMnB4OyAgICAgICAgIH1cclxuLyogTWVkaWNhbCBQb3NpdGlvbnMgKi9cclxuLm1hcEljb24xNi5yYW5rLW1lZGljYWxkb2N0b3IgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4OyAgICAgICAgICAgfSBcclxuLm1hcEljb24xNi5yYW5rLWdlbmV0aWNpc3QgICAgICAgICAgICB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTEyOHB4OyAgICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstcHN5Y2hpYXRyaXN0ICAgICAgICAgIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7ICAgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay1jaGVtaXN0ICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7ICAgICAgICAgIH1cclxuLyogU2NpZW5jZSBQb3NpdGlvbnMgKi9cclxuLm1hcEljb24xNi5yYW5rLXNjaWVudGlzdCAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7ICAgICAgICAgfSBcclxuLm1hcEljb24xNi5yYW5rLWdlbmV0aWNpc3QgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTI4cHg7ICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstcm9ib3RpY2lzdCAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDsgICAgICAgICB9XHJcbi5tYXBJY29uMTYucmFuay14ZW5vYmlvbG9naXN0ICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTEyOHB4OyAgICAgICAgIH1cclxuLyogU2VjdXJpdHkgUG9zaXRpb25zICovXHJcbi5tYXBJY29uMTYucmFuay13YXJkZW4gICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTEyOHB4OyAgICAgICAgIH1cclxuLm1hcEljb24xNi5yYW5rLWRldGVjdGl2ZSAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTI4cHg7ICAgICAgICAgfVxyXG4ubWFwSWNvbjE2LnJhbmstc2VjdXJpdHlvZmZpY2VyICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMjhweDsgICAgICAgICB9IiwidWwge1xyXG4gICAgcGFkZGluZzogNHB4IDAgMCAxMHB4O1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xyXG59XHJcblxyXG5saSB7XHJcbiAgICBwYWRkaW5nOiAwIDAgMnB4IDA7XHJcbn1cclxuXHJcbnRhYmxlLmZpeGVkIHtcclxuICAgIHRhYmxlLWxheW91dDpmaXhlZDtcclxufVxyXG5cclxudGFibGUuZml4ZWQgdGQge1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuLyogVGFibGUgc3R5bGluZyBmb3IgdGhlIHBvd2VyIG1vbml0b3IgKi9cclxudGFibGUucG1vbiB7XHJcbiAgICBib3JkZXI6IDJweCBzb2xpZCBSb3lhbEJsdWU7XHJcbn1cclxuXHJcbnRhYmxlLnBtb24gdGQsIHRhYmxlLnBtb24gdGgge1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCBibGFjaztcclxuICAgIHBhZGRpbmc6IDBweCA1cHggMHB4IDVweDtcclxufVxyXG5cclxuLyogVGFibGUgc3R5bGluZyBmb3IgdGhlIGNyZXcgbWFuaWZlc3QgKi9cclxuLm1hbmlmZXN0LWhlYWRlcihAY29sb3I6ICM2NjYpIHtcclxuXHRiYWNrZ3JvdW5kOiBAY29sb3I7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG59XHJcblxyXG50aC5jb21tYW5kIHtcclxuXHQubWFuaWZlc3QtaGVhZGVyKCMzMzMzRkYpO1xyXG59XHJcblxyXG50aC5zZWMge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXIoIzhlMDAwMCk7XHJcbn1cclxuXHJcbnRoLm1lZCB7XHJcblx0Lm1hbmlmZXN0LWhlYWRlcigjMDA2NjAwKTtcclxufVxyXG5cclxudGguZW5nIHtcclxuXHQubWFuaWZlc3QtaGVhZGVyKCNiMjczMDApO1xyXG59XHJcblxyXG50aC5zY2kge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXIoI2E2NWJhNik7XHJcbn1cclxuXHJcbnRoLnNlciB7XHJcblx0Lm1hbmlmZXN0LWhlYWRlcigjNzEwMEFBKTtcclxufVxyXG5cclxudGguc3VwIHtcclxuXHQubWFuaWZlc3QtaGVhZGVyKCM2NjY2MjEpO1xyXG59XHJcblxyXG50aC5jaXYge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXIoI2EzMjgwMCk7XHJcbn1cclxuXHJcbnRoLm1pc2Mge1xyXG5cdC5tYW5pZmVzdC1oZWFkZXI7XHJcbn1cclxuXHJcbnNwYW4ucW0tam9iIHtcclxuXHRjb2xvcjogbWl4KEBoaWdobGlnaHQtY29sb3IsIEBhdmVyYWdlLWNvbG9yLCAzMyUpO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi8qIFN0cmlwZWQgbGluZXMgZm9yIHRhYmxlcyBhbmQgZGl2cyAqL1xyXG4uc3RyaXBlZCB7XHJcbiAgICAuc3RyaXBlZC1iYXNlKCkge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM0MDQwNDA7XHJcbiAgICB9XHJcbiAgICB0cjpudGgtY2hpbGQoZXZlbikge1xyXG4gICAgICAgIC5zdHJpcGVkLWJhc2U7XHJcbiAgICB9XHJcbiAgICAmOm5vdCh0YWJsZSkgPiA6bnRoLWNoaWxkKGV2ZW4pIHtcclxuICAgICAgICAuc3RyaXBlZC1iYXNlO1xyXG4gICAgfVxyXG59IiwiI3VpTm9TY3JpcHQge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICBtYXJnaW46IC02MHB4IDAgMCAtMTUwcHg7XHJcbiAgICB3aWR0aDogMjgwcHg7XHJcbiAgICBoZWlnaHQ6IDEyMHB4O1xyXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcclxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNmZjAwMDA7XHJcbiAgICBjb2xvcjogIzAwMDAwMDtcclxuICAgIGZvbnQtc2l6ZTogMTBweDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgei1pbmRleDogOTk5OTtcclxuICAgIHBhZGRpbmc6IDBweCAxMHB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgIC5ub3RpY2UgfCBDYXV0aW9uIFN0cmlwZXNcclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuLm5vdGljZSB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBiYWNrZ3JvdW5kOiB1cmwodWlOb3RpY2VCYWNrZ3JvdW5kLmpwZykgNTAlIDUwJTtcclxuICAgIGNvbG9yOiAjMDAwMDAwO1xyXG4gICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBwYWRkaW5nOiAzcHggNHB4IDNweCA0cHg7XHJcbiAgICBtYXJnaW46IDRweCAwIDRweCAwO1xyXG59XHJcblxyXG4ubm90aWNlUGxhY2Vob2xkZXIge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBwYWRkaW5nOiAzcHggNHB4IDNweCA0cHg7XHJcbiAgICBtYXJnaW46IDRweCAwIDRweCAwO1xyXG59XHJcblxyXG4ubm90aWNlLmljb24ge1xyXG4gICAgcGFkZGluZzogMnB4IDRweCAwIDIwcHg7XHJcbn1cclxuXHJcbi5ub3RpY2UgaW1nIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTZweDtcclxuICAgIGhlaWdodDogMTZweDtcclxufVxyXG5cclxuZGl2Lm5vdGljZSB7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG4vKioqKioqKioqKioqKioqKioqKipcXFxyXG5cXCoqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICBQREEsIEROQSBNb2RpZmllciBzdHlsZXNcclxuICAgIERvbid0IGZpdCBhbnl3aGVyZSBlbHNlLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuLyogUERBIHN0eWxpbmcgKi9cclxuLndob2xlU2NyZWVuIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGNvbG9yOiAjNTE3MDg3O1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5wZGFsaW5rIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xyXG5cclxuXHQmLmRpc2FibGVkIHtcclxuXHRcdGJhY2tncm91bmQ6IG5vbmU7XHJcblx0XHRib3JkZXI6IG5vbmU7XHJcblx0XHRjb2xvcjogIzk5OTtcclxuXHRcdHRleHQtYWxpZ246IGxlZnQ7XHJcblx0fVxyXG59XHJcblxyXG4ucGRhbm90ZSB7XHJcbiAgICBjb2xvcjogI2NkNjUwMDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4uaXRlbS5tYWlubWVudSB7XHJcblx0cGFkZGluZy1ib3R0b206IDAuNWVtO1xyXG59XHJcblxyXG5kaXYuY2xvY2sge1xyXG5cdGNvbG9yOiB3aGl0ZTtcclxuXHRmb250LXdlaWdodDogYm9sZDtcclxuXHRmbG9hdDogcmlnaHQ7XHJcblx0cGFkZGluZy1yaWdodDogMmVtO1xyXG59XHJcblxyXG4jcGRhRm9vdGVyIHtcclxuXHRwb3NpdGlvbjogZml4ZWQ7XHJcblx0bGVmdDogMDtcclxuXHRib3R0b206IDA7XHJcblx0d2lkdGg6IDEwMCU7XHJcblx0YmFja2dyb3VuZDogQGRhcmstY29sb3I7XHJcbn1cclxuXHJcbi5wZGFGb290ZXJCdXR0b24ge1xyXG5cdHdpZHRoOiAzMyU7XHJcblx0cGFkZGluZzogMC41ZW0gMDtcclxuXHRmb250LXNpemU6IDIwMCU7XHJcblx0Ym9yZGVyOiBub25lO1xyXG5cdGJhY2tncm91bmQ6IG5vbmU7XHJcblx0Y29sb3I6ICNmZmY7XHJcblxyXG5cdCYuaG92ZXIge1xyXG5cdFx0YmFja2dyb3VuZDogIzUwN2FhYztcclxuXHR9XHJcblxyXG5cdCYuZGlzYWJsZWQge1xyXG5cdFx0YmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50O1xyXG5cdFx0Y29sb3I6ICM1NTUgIWltcG9ydGFudDtcclxuXHR9XHJcblxyXG5cdC51aUxpbmtQZW5kaW5nSWNvbiB7XHJcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XHJcblx0XHR3aWR0aDogMzMlO1xyXG5cdFx0YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuXHRcdGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcclxuXHR9XHJcbn1cclxuXHJcbi8qIEROQSBNb2RpZmllciBzdHlsaW5nICovXHJcbi5kbmFCbG9jayB7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIHdpZHRoOiA5MHB4O1xyXG4gICAgcGFkZGluZzogMCAwIDVweCAwO1xyXG59XHJcblxyXG4uZG5hQmxvY2tOdW1iZXIge1xyXG4gICAgZm9udC1mYW1pbHk6IEZpeGVkLCBtb25vc3BhY2U7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgYmFja2dyb3VuZDogIzM2MzYzNjtcclxuICAgIG1pbi13aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5kbmFTdWJCbG9jayB7XHJcbiAgICBmb250LWZhbWlseTogRml4ZWQsIG1vbm9zcGFjZTtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1pbi13aWR0aDogMTZweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuLm1hc2sge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHRvcDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgYmFja2dyb3VuZDogdXJsKHVpTWFza0JhY2tncm91bmQucG5nKTtcclxufVxyXG5cclxuLm1hc2tDb250ZW50IHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAyMDBweDtcclxuICAgIG1hcmdpbjogMjAwcHggMDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG4vKioqKioqKioqKioqKioqKioqKipcXFxyXG5cXCoqKioqKioqKioqKioqKioqKioqLyIsIkBpbXBvcnQgXCJfY29uZmlnXCI7XHJcblxyXG5ib2R5IHtcclxuICAgIGNvbG9yOiAjZmZmZmZmO1xyXG4gICAgZm9udC1mYW1pbHk6IEBmb250O1xyXG4gICAgZm9udC1zaXplOiBAZm9udHNpemU7XHJcbiAgICBsaW5lLWhlaWdodDogMTcwJTtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbmhyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM0MDYyOGE7XHJcbiAgICBoZWlnaHQ6IDFweDtcclxuICAgIGJvcmRlcjogbm9uZTtcclxufVxyXG5cclxuaW1nLCBhIGltZyB7XHJcbiAgICBib3JkZXItc3R5bGU6IG5vbmU7XHJcbn1cclxuXHJcbmgxLCBoMiwgaDMsIGg0LCBoNSwgaDYge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMTJweCAwIDZweCAwO1xyXG4gICAgY29sb3I6ICNGRkZGRkY7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuaDEge1xyXG4gICAgZm9udC1zaXplOiAxOHB4O1xyXG59XHJcblxyXG5oMiB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbn1cclxuXHJcbmgzIHtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxufVxyXG5cclxuaDQge1xyXG4gICAgZm9udC1zaXplOiAxMnB4O1xyXG59IiwiKltkYXRhLXRvb2x0aXBdIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcblxyXG4gICY6OmFmdGVyIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHdpZHRoOiAyNTBweDtcclxuICAgIHBhZGRpbmc6IDEwcHg7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcblxyXG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gICAgb3BhY2l0eTogMDtcclxuXHJcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xyXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS10b29sdGlwKTtcclxuXHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgLjVzO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzNjM2MzY7XHJcbiAgfVxyXG5cclxuICAmOmhvdmVyOjphZnRlciB7XHJcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xyXG4gICAgb3BhY2l0eTogMTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcFRvcDo6YWZ0ZXIge1xyXG4gICAgYm90dG9tOiAxMDAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoOHB4KTtcclxuICB9XHJcbiAgJi50b29sdGlwVG9wOmhvdmVyOjphZnRlciB7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtOHB4KTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcEJvdHRvbTo6YWZ0ZXIge1xyXG4gICAgdG9wOiAxMDAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLThweCk7XHJcbiAgfVxyXG4gICYudG9vbHRpcEJvdHRvbTpob3Zlcjo6YWZ0ZXIge1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoOHB4KTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcExlZnQ6OmFmdGVyIHtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgcmlnaHQ6IDEwMCU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoOHB4KSB0cmFuc2xhdGVZKC01MCUpO1xyXG4gIH1cclxuICAmLnRvb2x0aXBMZWZ0OmhvdmVyOjphZnRlciB7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLThweCkgdHJhbnNsYXRlWSgtNTAlKTtcclxuICB9XHJcblxyXG4gICYudG9vbHRpcFJpZ2h0OjphZnRlciB7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDEwMCU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLThweCkgdHJhbnNsYXRlWSgtNTAlKTtcclxuICB9XHJcbiAgJi50b29sdGlwUmlnaHQ6aG92ZXI6OmFmdGVyIHtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg4cHgpIHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgfVxyXG59IixudWxsLCJAY2hhcnNldCBcInV0Zi04XCI7XHJcblxyXG5AaW1wb3J0IFwiX2JhcnNcIjtcclxuQGltcG9ydCBcIl9saW5rXCI7XHJcbkBpbXBvcnQgXCJfY29sb3JcIjtcclxuQGltcG9ydCBcIl9jb25maWdcIjtcclxuQGltcG9ydCBcIl9kaXNwbGF5XCI7XHJcbkBpbXBvcnQgXCJfZm9ybWF0dGluZ1wiO1xyXG5AaW1wb3J0IFwiX2ZhbmN5XCI7XHJcbkBpbXBvcnQgXCJfaWNvblwiO1xyXG5AaW1wb3J0IFwiX2xpc3RzXCI7XHJcbkBpbXBvcnQgXCJfbWlzY1wiO1xyXG5AaW1wb3J0IFwiX25hdGl2ZVwiO1xyXG5AaW1wb3J0IFwiX3Rvb2x0aXBcIjtcclxuXHJcblxyXG4ubWFpbkJHIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHotaW5kZXg6IC0xO1xyXG4gICAgdG9wOiAzMHB4O1xyXG4gICAgbGVmdDogMHB4O1xyXG4gICAgcmlnaHQ6IDBweDtcclxuICAgIGJvdHRvbTogMHB4O1xyXG4gICAgYmFja2dyb3VuZDogZGF0YS11cmkoJ25hbm90cmFzZW4uc3ZnJykgbm8tcmVwZWF0IGZpeGVkIGNlbnRlci83MCUgNzAlLFxyXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sXHJcbiAgICAgICAgQGJhY2tncm91bmQtc3RhcnQgMCUsXHJcbiAgICAgICAgQGJhY2tncm91bmQtZW5kIDEwMCUpIG5vLXJlcGVhdCBmaXhlZCBjZW50ZXIvMTAwJSAxMDAlO1xyXG59XHJcblxyXG4vL25hbm8gc2Nyb2xsYmFyIHN0eWxpbmdcclxuaHRtbCxib2R5IHtcclxuICAgIHNjcm9sbGJhci1mYWNlLWNvbG9yOiM2NjY2NjY7XHJcbiAgICBzY3JvbGxiYXItYXJyb3ctY29sb3I6I0U5QzE4MztcclxuICAgIHNjcm9sbGJhci10cmFjay1jb2xvcjojMzYzNjM2O1xyXG4gICAgc2Nyb2xsYmFyLXNoYWRvdy1jb2xvcjojNTU1NTU1OyAgICBcclxufVxyXG5cclxuI3VpV3JhcHBlciB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcclxuICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG59XHJcblxyXG4jdWlUaXRsZVdyYXBwZXIge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgbWluLWhlaWdodDogMzBweDtcclxuICAgIG1pbi13aWR0aDogMTAwJTsgXHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzYzNjM2O1xyXG4gICAgbGVmdDogMHB4O1xyXG4gICAgdG9wOiAwcHg7XHJcbiAgICByaWdodDogMHB4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIHotaW5kZXg6IDEwMDtcclxuICAgICYgPiBkaXYge1xyXG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcclxuICAgIH1cclxuICAgICYgPiBpIHtcclxuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbiN1aVRpdGxlVGV4dCB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDZweDtcclxuICAgIGxlZnQ6IDQ0cHg7XHJcbiAgICB3aWR0aDogNjYlO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGNvbG9yOiAjRTlDMTgzO1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG59XHJcblxyXG4jdWlUaXRsZS5pY29uIHtcclxuICAgIHBhZGRpbmc6IDZweCA4cHggNnB4IDQycHg7XHJcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggNTAlO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxufVxyXG5cclxuI3VpVGl0bGVGbHVmZiB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDRweDtcclxuICAgIHJpZ2h0OiAxMnB4O1xyXG4gICAgd2lkdGg6IDQycHg7XHJcbiAgICBoZWlnaHQ6IDI0cHg7XHJcbiAgICBiYWNrZ3JvdW5kOiBkYXRhLXVyaSgnbmFub3RyYXNlbi5zdmcnKSA1MCUgNTAlIG5vLXJlcGVhdDtcclxufVxyXG5cclxuLnN0YXR1c2ljb24ge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA0cHg7XHJcbiAgICBsZWZ0OiAxMnB4O1xyXG59XHJcblxyXG4jdWlNYXBXcmFwcGVyIHtcclxuICAgIGNsZWFyOiBib3RoO1xyXG4gICAgcGFkZGluZzogOHB4O1xyXG4gICAgbWFyZ2luLXRvcDogMzBweDtcclxufVxyXG5cclxuI3VpTWFwSGVhZGVyIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGNsZWFyOiBib3RoO1xyXG59XHJcblxyXG4jdWlNYXBDb250YWluZXIge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDYwMHB4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM0MDYyOGE7XHJcbiAgICBiYWNrZ3JvdW5kOiB1cmwobmFub21hcEJhY2tncm91bmQucG5nKTtcclxufVxyXG5cclxuI3VpTWFwIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgbWFyZ2luOiAtNTEycHggMCAwIC01MTJweDtcclxuICAgIHdpZHRoOiAyNTZweDtcclxuICAgIGhlaWdodDogMjU2cHg7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgem9vbTogNDtcclxufVxyXG5cclxuI3VpTWFwSW1hZ2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgYm90dG9tOiAxcHg7XHJcbiAgICBsZWZ0OiAxcHg7XHJcbiAgICB3aWR0aDogMjU2cHg7XHJcbiAgICBoZWlnaHQ6IDI1NnB4O1xyXG59XHJcblxyXG4jdWlNYXBDb250ZW50IHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGJvdHRvbTogLTEzLjVweDtcclxuICAgIGxlZnQ6IDBweDtcclxuICAgIHdpZHRoOiAyNTZweDtcclxuICAgIGhlaWdodDogMjU2cHg7XHJcbn1cclxuXHJcbiN1aU1hcEZvb3RlciB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBjbGVhcjogYm90aDtcclxufVxyXG5cclxuI3VpQ29udGVudCB7XHJcbiAgICBjbGVhcjogYm90aDtcclxuICAgIHBhZGRpbmc6IDhweDtcclxuICAgIG1hcmdpbi10b3A6IDMwcHg7XHJcbn1cclxuXHJcbiN1aU1hcFRvb2x0aXAge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgcmlnaHQ6IDEwcHg7XHJcbiAgICB0b3A6IDEwcHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjNDA2MjhhO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzI3MjcyNztcclxuICAgIHBhZGRpbmc6IDhweDtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB6LWluZGV4OiA5OTk5O1xyXG59XHJcblxyXG4jdWlMb2FkaW5nTm90aWNlIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGJhY2tncm91bmQ6IHVybCh1aU5vdGljZUJhY2tncm91bmQuanBnKSA1MCUgNTAlO1xyXG4gICAgY29sb3I6ICMwMDAwMDA7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIHBhZGRpbmc6IDNweCA0cHggM3B4IDRweDtcclxuICAgIG1hcmdpbjogNHB4IDAgNHB4IDA7XHJcbn1cclxuXHJcbi51bmRlclRpdGxlIHtcclxuICAgIG1hcmdpbi10b3A6IDMwcHg7XHJcbn0iXX0= */ diff --git a/nano/styles/_link.less b/nano/styles/_link.less index 24a8c33c7b6..5a3d7fa267e 100644 --- a/nano/styles/_link.less +++ b/nano/styles/_link.less @@ -1,4 +1,4 @@ -.link, .linkOn, .linkOff, .selected, .disabled, .yellowButton, .redButton { +.link, .linkOn, .linkOff, .selected, .disabled, .yellowButton, .redButton, .linkEncourage, .linkDiscourage { float: left; min-width: 15px; height: 16px; @@ -82,6 +82,27 @@ a.icon img, .linkOn.icon img, .linkOff.icon img, .selected.icon img, .disabled.i background-color: #ff6666; } +.linkEncourage, a.linkEncourage:link, a.linkEncourage:visited, a.linkEncourage:active { + color: #99ff33; + background-color: #40628a; + border-color: #161616; +} + +.linkEncourage.hover { + background-color: #507aac; +} + +.linkDiscourage, a.linkDiscourage:link, a.linkDiscourage:visited, a.linkDiscourage:active { + color: #8c8c8c; + background-color: #40628a; + border-color: #161616; +} + +.linkDiscourage.hover { + color: #ff0000; + background-color: #507aac; +} + .inactive, a.inactive:link, a.inactive:visited, a.inactive:active, a.inactive.hover { color: #ffffff; background: #999999; diff --git a/nano/templates/card_prog.tmpl b/nano/templates/card_prog.tmpl index 478c8f6b400..8ce688e1997 100644 --- a/nano/templates/card_prog.tmpl +++ b/nano/templates/card_prog.tmpl @@ -11,6 +11,7 @@ {{:helper.link('Job Management', 'gear', {'action' : 'PRG_mode', 'mode_target' : 1}, data.mode == 1 ? 'disabled' : null)}} {{:helper.link('Crew Manifest', 'folder-open', {'action' : 'PRG_mode', 'mode_target' : 2}, data.mode == 2 ? 'disabled' : null)}} {{:helper.link('Print', 'print', {'action' : 'PRG_print'}, data.printer && (data.mode == 2 || data.has_modify && !data.mode) ? null : 'disabled')}} + {{:helper.link('Records', 'file', {'action' : 'PRG_mode', 'mode_target' : 3}, (data.mode == 3) ? 'disabled' : null)}} {{if data.mode == 1}}
      @@ -52,6 +53,31 @@
      {{:data.manifest}}
      + {{else data.mode == 3}} +
      +

      Records

      +
      +
      +
      + Authorized Identity: +
      +
      + {{:helper.link(data.scan_name, 'eject', {'action' : 'scan'})}} +
      +
      +
      + {{if data.authenticated}} + {{:data.id_change_html}} + {{if data.centcom_access}} + {{:helper.link('Delete Records By: ' + data.scan_owner, null, {'action' : 'PRG_wipe_my_logs'}, null, 'linkDanger')}} + {{/if}} + {{if !data.target_dept}} + {{:helper.link('Delete ALL Records', null, {'action' : 'PRG_wipe_all_logs'}, null, 'linkDanger')}} + {{/if}} + {{else}} + Please insert an authorized ID into the terminal to proceed.
      + {{/if}} +
      {{else}}

      Access Modification

      @@ -149,7 +175,11 @@ Terminations:
      - {{:helper.link('Terminate ' + data.target_owner, 'gear', {'action' : 'PRG_terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}} + {{if data.target_rank == "Terminated"}} + {{:data.target_owner}} has already been terminated! + {{else}} + {{:helper.link('Terminate ' + data.target_owner, 'gear', {'action' : 'PRG_terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}} + {{/if}}
      @@ -168,15 +198,16 @@ Special - {{:helper.link("Captain", '', {'action' : 'PRG_assign', 'assign_target' : 'Captain'}, data.target_rank == 'Captain' ? 'disabled' : null)}} - {{:helper.link("Custom", '', {'action' : 'PRG_assign', 'assign_target' : 'Custom'})}} + {{for data.top_jobs}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} + {{/for}} Engineering {{for data.engineering_jobs}} - {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -184,7 +215,7 @@ Medical {{for data.medical_jobs}} - {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -192,7 +223,7 @@ Security {{for data.security_jobs}} - {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -200,7 +231,7 @@ Science {{for data.science_jobs}} - {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -208,7 +239,7 @@ Support {{for data.support_jobs}} - {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -216,7 +247,7 @@ Civilian {{for data.civilian_jobs}} - {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -225,7 +256,7 @@ CentComm {{for data.centcom_jobs}} - {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} diff --git a/nano/templates/identification_computer.tmpl b/nano/templates/identification_computer.tmpl index ad2779f7864..606af520168 100644 --- a/nano/templates/identification_computer.tmpl +++ b/nano/templates/identification_computer.tmpl @@ -11,7 +11,8 @@ {{if !data.target_dept}}{{:helper.link('Job Management', 'gear', {'choice' : 'mode', 'mode_target' : 1}, data.mode == 1 ? 'disabled' : null)}}{{/if}} {{:helper.link('Crew Manifest', 'folder-open', {'choice' : 'mode', 'mode_target' : 2}, data.mode == 2 ? 'disabled' : null)}} {{if !data.target_dept}}{{:helper.link('Print', 'print', {'choice' : 'print'}, (data.mode == 2 || data.has_modify && !data.mode) ? null : 'disabled')}}{{/if}} - + {{:helper.link('Records', 'file', {'choice' : 'mode', 'mode_target' : 3}, (data.mode == 3) ? 'disabled' : null)}} + {{if data.mode == 1 && !data.target_dept}}

      Job Management

      @@ -52,6 +53,31 @@
      {{:data.manifest}}
      + {{else data.mode == 3}} +
      +

      Records

      +
      +
      +
      + Authorized Identity: +
      +
      + {{:helper.link(data.scan_name, 'eject', {'choice' : 'scan'})}} +
      +
      +
      + {{if data.authenticated}} + {{:data.id_change_html}} + {{if data.centcom_access}} + {{:helper.link('Delete Records By: ' + data.scan_owner, null, {'choice' : 'wipe_my_logs'}, null, 'linkDanger')}} + {{/if}} + {{if !data.target_dept}} + {{:helper.link('Delete ALL Records', null, {'choice' : 'wipe_all_logs'}, null, 'linkDanger')}} + {{/if}} + {{else}} + Please insert an authorized ID into the terminal to proceed.
      + {{/if}} +
      {{else}}

      Access Modification

      @@ -145,21 +171,31 @@
      {{/if}} -
      + {{if data.target_rank != "Terminated"}} +
      Demotions:
      - {{:helper.link('Demote ' + data.target_owner, 'gear', {'choice' : 'demote'}, (data.target_rank == "Civilian" || data.target_rank == "Unassigned" || data.target_rank == "Terminated") ? 'disabled' : null, (data.target_rank == "Civilian" || data.target_rank == "Unassigned" || data.target_rank == "Terminated") ? 'disabled' : 'linkDanger')}} + {{if data.target_rank == "Demoted"}} + {{:data.target_owner}} has already been demoted! + {{else}} + {{:helper.link('Demote ' + data.target_owner, 'gear', {'choice' : 'demote'}, (data.target_rank == "Civilian" || data.target_rank == "Unassigned") ? 'disabled' : null, (data.target_rank == "Civilian" || data.target_rank == "Unassigned") ? 'disabled' : 'linkDanger')}} + {{/if}}
      + {{/if}} {{if !data.target_dept}}
      Terminations:
      - {{:helper.link('Terminate ' + data.target_owner, 'gear', {'choice' : 'terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}} + {{if data.target_rank == "Terminated"}} + {{:data.target_owner}} has already been terminated! + {{else}} + {{:helper.link('Terminate ' + data.target_owner, 'gear', {'choice' : 'terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}} + {{/if}}
      @@ -187,8 +223,9 @@ Special - {{:helper.link("Captain", '', {'choice' : 'assign', 'assign_target' : 'Captain'}, data.target_rank == 'Captain' ? 'disabled' : null)}} - {{:helper.link("Custom", '', {'choice' : 'assign', 'assign_target' : 'Custom'})}} + {{for data.top_jobs}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} + {{/for}} {{/if}} @@ -197,7 +234,7 @@ Engineering {{for data.engineering_jobs}} - {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -207,7 +244,7 @@ Medical {{for data.medical_jobs}} - {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -217,7 +254,7 @@ Security {{for data.security_jobs}} - {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -227,9 +264,9 @@ Science {{for data.science_jobs}} - {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} - + {{/if}} {{if !data.target_dept}} @@ -237,7 +274,7 @@ Support {{for data.support_jobs}} - {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -246,7 +283,7 @@ Civilian {{for data.civilian_jobs}} - {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} @@ -255,7 +292,7 @@ CentComm {{for data.centcom_jobs}} - {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}} + {{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, value.jlinkformat == 'disabled' ? 'disabled' : null, value.jlinkformat ? value.jlinkformat : null)}} {{/for}} diff --git a/paradise.dme b/paradise.dme index 64b874db891..14b51e85e62 100644 --- a/paradise.dme +++ b/paradise.dme @@ -58,7 +58,6 @@ #include "code\__DEFINES\rolebans.dm" #include "code\__DEFINES\shuttle.dm" #include "code\__DEFINES\sight.dm" -#include "code\__DEFINES\snpc.dm" #include "code\__DEFINES\sound.dm" #include "code\__DEFINES\stat.dm" #include "code\__DEFINES\station_goals.dm" @@ -200,7 +199,6 @@ #include "code\controllers\subsystem.dm" #include "code\controllers\verbs.dm" #include "code\controllers\Processes\lighting.dm" -#include "code\controllers\Processes\npcai.dm" #include "code\controllers\Processes\ticker.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" @@ -214,6 +212,7 @@ #include "code\controllers\subsystem\holiday.dm" #include "code\controllers\subsystem\icon_smooth.dm" #include "code\controllers\subsystem\input.dm" +#include "code\controllers\subsystem\idlenpcpool.dm" #include "code\controllers\subsystem\jobs.dm" #include "code\controllers\subsystem\machinery.dm" #include "code\controllers\subsystem\mapping.dm" @@ -221,7 +220,6 @@ #include "code\controllers\subsystem\nano_mob_hunter.dm" #include "code\controllers\subsystem\nanoui.dm" #include "code\controllers\subsystem\nightshift.dm" -#include "code\controllers\subsystem\npcai.dm" #include "code\controllers\subsystem\npcpool.dm" #include "code\controllers\subsystem\overlays.dm" #include "code\controllers\subsystem\radio.dm" @@ -855,6 +853,7 @@ #include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\transfer_valve.dm" #include "code\game\objects\items\devices\uplinks.dm" +#include "code\game\objects\items\devices\voice.dm" #include "code\game\objects\items\devices\whistle.dm" #include "code\game\objects\items\devices\radio\beacon.dm" #include "code\game\objects\items\devices\radio\electropack.dm" @@ -1239,7 +1238,6 @@ #include "code\modules\awaymissions\loot.dm" #include "code\modules\awaymissions\map_rng.dm" #include "code\modules\awaymissions\pamphlet.dm" -#include "code\modules\awaymissions\snpc.dm" #include "code\modules\awaymissions\trigger.dm" #include "code\modules\awaymissions\zlevel.dm" #include "code\modules\awaymissions\zvis.dm" @@ -1255,7 +1253,6 @@ #include "code\modules\awaymissions\mission_code\evil_santa.dm" #include "code\modules\awaymissions\mission_code\spacebattle.dm" #include "code\modules\awaymissions\mission_code\spacehotel.dm" -#include "code\modules\awaymissions\mission_code\spacehotel_npcs.dm" #include "code\modules\awaymissions\mission_code\stationCollision.dm" #include "code\modules\awaymissions\mission_code\UO71-terrorspiders.dm" #include "code\modules\awaymissions\mission_code\wildwest.dm" @@ -1321,7 +1318,6 @@ #include "code\modules\clothing\masks\breath.dm" #include "code\modules\clothing\masks\gasmask.dm" #include "code\modules\clothing\masks\miscellaneous.dm" -#include "code\modules\clothing\masks\voice.dm" #include "code\modules\clothing\patreon\glasses.dm" #include "code\modules\clothing\patreon\hats.dm" #include "code\modules\clothing\shoes\colour.dm" @@ -1758,9 +1754,6 @@ #include "code\modules\mob\living\carbon\human\status_procs.dm" #include "code\modules\mob\living\carbon\human\update_icons.dm" #include "code\modules\mob\living\carbon\human\update_stat.dm" -#include "code\modules\mob\living\carbon\human\interactive\functions.dm" -#include "code\modules\mob\living\carbon\human\interactive\interactive.dm" -#include "code\modules\mob\living\carbon\human\interactive\prefabs.dm" #include "code\modules\mob\living\carbon\human\species\_species.dm" #include "code\modules\mob\living\carbon\human\species\abductor.dm" #include "code\modules\mob\living\carbon\human\species\diona.dm" @@ -2122,7 +2115,6 @@ #include "code\modules\power\powernet.dm" #include "code\modules\power\smes.dm" #include "code\modules\power\solar.dm" -#include "code\modules\power\switch.dm" #include "code\modules\power\terminal.dm" #include "code\modules\power\tracker.dm" #include "code\modules\power\treadmill.dm" diff --git a/sound/voice/borg_deathsound.ogg b/sound/voice/borg_deathsound.ogg new file mode 100644 index 00000000000..06e847165ff Binary files /dev/null and b/sound/voice/borg_deathsound.ogg differ diff --git a/sound/weapons/bolathrow.ogg b/sound/weapons/bolathrow.ogg new file mode 100644 index 00000000000..9a7b78fb67f Binary files /dev/null and b/sound/weapons/bolathrow.ogg differ diff --git a/strings/npc_chatter.json b/strings/npc_chatter.json deleted file mode 100644 index 833cb68605e..00000000000 --- a/strings/npc_chatter.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "nouns_insult": [ - "gaylord", - "shitcurity", - "noob", - "comdom", - "greyshirt", - "tator", - "lingbin", - "bitch", - "whorelord", - "cluwne", - "monkey", - "cheesemonger", - "milkdrinker" - ], - "adjective_objects": [ - "big", - "small", - "tiny", - "round", - "square", - "oblong", - "colorful", - "dull", - "shiny", - "sparkling", - "blinking", - "awful" - ], - "verbs_use": [ - "touch", - "hold", - "poke", - "punch", - "smash", - "assault", - "wrench", - "tickle", - "modify", - "whack", - "beat", - "tackle", - "destroy" - ], - "nouns_objects": [ - "thing", - "tool", - "whatever", - "potential murder weapon", - "object", - "toy", - "device", - "whatever" - ], - "nouns_generic": [ - "you", - "you there", - "guy", - "person", - "dude", - "jerk", - "officer" - ], - "curse_words": [ - "damn", - "shit", - "arse", - "ass", - "wank", - "jerk", - "bitch" - ], - "adjective_generic": [ - "nice", - "pretty", - "ugly", - "bad", - "okay", - "stupid" - ], - "verbs_move": [ - "run", - "jog", - "leg it", - "slide", - "cheese it", - "walk", - "stroll", - "fly", - "scoot", - "yakkety", - "speed", - "fuck off", - "escape" - ], - "verbs_touch": [ - "pat", - "mess with", - "absorb", - "sneeze on", - "inject", - "rip", - "slap", - "grab", - "choke" - ], - "adjective_insult": [ - "ugly", - "repulsive", - "dumb", - "asian", - "mongoloid", - "childish", - "captain-like", - "monkey-like", - "whoreish", - "dimwit", - "jerk-face", - "vomit-inducer" - ], - "nouns_body": [ - "ass", - "head", - "face", - "arms", - "fingers", - "toes", - "chest", - "eyes", - "nails", - "groin", - "stomach", - "intestines", - "head" - ] -} diff --git a/strings/revenant_names.json b/strings/revenant_names.json new file mode 100644 index 00000000000..8c1229296f4 --- /dev/null +++ b/strings/revenant_names.json @@ -0,0 +1,55 @@ +{ + "spirit_type": [ + "Essence", + "Ghost", + "Phantom", + "Poltergeist", + "Revenant", + "Soul", + "Spectre", + "Spirit" + ], + + "adjective": [ + "", + "Abysmal ", + "Abyssal ", + "Brutal ", + "Dark ", + "Endless ", + "Eternal ", + "Fiery ", + "Hateful ", + "Hideous ", + "Hilarious ", + "Indifferent ", + "Malevolent ", + "Peaceful ", + "Searing ", + "Silent ", + "Spiteful ", + "Vicious ", + "Violent " + ], + + "theme": [ + "Agony", + "Anger", + "Death", + "Despair", + "Desperation", + "Destruction", + "Disease", + "Grief", + "Hate", + "Hellfire", + "Laughter", + "Misery", + "Ruin", + "Salt", + "Screams", + "Sorrow", + "Suffering", + "Vengeance" + ] +} diff --git a/tools/ss13_genchangelog.py b/tools/ss13_genchangelog.py index ed76aa9c6c6..18634d34832 100644 --- a/tools/ss13_genchangelog.py +++ b/tools/ss13_genchangelog.py @@ -1,8 +1,15 @@ ''' +ss13_genchangelog.py - Generate changelog from YAML. + Usage: $ python ss13_genchangelog.py [--dry-run] html/changelog.html html/changelogs/ -ss13_genchangelog.py - Generate changelog from YAML. + Example (first use): + - Install python 2.7 + - run cmd.exe + - pip install pyyaml + - cd paradise github directory + - python tools/ss13_genchangelog.py html/changelog.html html/changelogs/ Copyright 2013 Rob "N3X15" Nelson