From 6a9736e05e79ae06b54ef36ae920a70afc6910ae Mon Sep 17 00:00:00 2001 From: MrCastmer <125900379+MrCastmer@users.noreply.github.com> Date: Fri, 1 Mar 2024 01:24:07 +0300 Subject: [PATCH 1/7] Update .gitattributes --- .gitattributes | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 313f1f7da817..cd943b5127f3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10,7 +10,6 @@ code/__DEFINES/rust_g.dm eol=lf ## Enforce text mode and LF line breaks *.bat text eol=lf *.cjs text eol=lf -*.css text eol=lf *.dm text eol=lf *.dme text eol=lf *.dmf text eol=lf From 9072537272ce83bfcb2ca414adb3fcf40aa538b1 Mon Sep 17 00:00:00 2001 From: MrCastmer <125900379+MrCastmer@users.noreply.github.com> Date: Fri, 1 Mar 2024 01:25:00 +0300 Subject: [PATCH 2/7] Revert "Update .gitattributes" This reverts commit 6a9736e05e79ae06b54ef36ae920a70afc6910ae. --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index cd943b5127f3..313f1f7da817 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10,6 +10,7 @@ code/__DEFINES/rust_g.dm eol=lf ## Enforce text mode and LF line breaks *.bat text eol=lf *.cjs text eol=lf +*.css text eol=lf *.dm text eol=lf *.dme text eol=lf *.dmf text eol=lf From 91b39635bc0c9df7f2ab05605a4bb9e70b765743 Mon Sep 17 00:00:00 2001 From: MrCastmer <125900379+MrCastmer@users.noreply.github.com> Date: Sat, 30 Mar 2024 03:24:07 +0300 Subject: [PATCH 3/7] Update changelog.css --- html/changelog.css | 82 +++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/html/changelog.css b/html/changelog.css index 2bfa3fa49558..da32a5a55752 100644 --- a/html/changelog.css +++ b/html/changelog.css @@ -1,41 +1,41 @@ -.top{font-family:Tahoma,sans-serif;font-size:12px;} -h2{font-family:Tahoma,sans-serif;} -a img {border:none;} -.bgimages16 li { - padding:2px 10px 2px 30px; - background-position:6px center; - background-repeat:no-repeat; - border:1px solid #ddd; - border-left:4px solid #999; - margin-bottom:2px; -} -.bugfix {background-image:url(bug-minus.png)} -.wip {background-image:url(hard-hat-exclamation.png)} -.tweak {background-image:url(wrench-screwdriver.png)} -.soundadd {background-image:url(music-plus.png)} -.sounddel {background-image:url(music-minus.png)} -.rscdel {background-image:url(cross-circle.png)} -.rscadd {background-image:url(tick-circle.png)} -.imageadd {background-image:url(image-plus.png)} -.imagedel {background-image:url(image-minus.png)} -.spellcheck {background-image:url(spell-check.png)} -.experiment {background-image:url(burn-exclamation.png)} -.refactor {background-image:url(burn-exclamation.png)} -.code_imp {background-image:url(coding.png)} -.config {background-image:url(chrome-wrench.png)} -.admin {background-image:url(ban.png)} -.server {background-image:url(hard-hat-exclamation.png)} -.balance {background-image:url(scales.png)} -.sansserif {font-family:Tahoma,sans-serif;font-size:12px;} -.commit {margin-bottom:20px;font-size:100%;font-weight:normal;} -.changes {list-style:none;margin:5px 0;padding:0 0 0 25px;font-size:0.8em;} -.date {margin:10px 0;color:blue;border-bottom:2px solid #00f;width:60%;padding:2px 0;font-size:1em;font-weight:bold;} -.author {padding-left:10px;margin:0;font-weight:bold;font-size:0.9em;} -.drop {cursor:pointer;border:1px solid #999;display:inline;font-size:0.9em;padding:1px 20px 1px 5px;line-height:16px;} -.hidden {display:none;} -.indrop {margin:2px 0 0 0;clear:both;background:#fff;border:1px solid #ddd;padding:5px 10px;} -.indrop p {margin:0;font-size:0.8em;line-height:16px;margin:1px 0;} -.indrop img {margin-right:5px;vertical-align:middle;} -.closed {background:url(chevron-expand.png) right center no-repeat;} -.open {background:url(chevron.png) right center no-repeat;} -.lic {font-size:9px;} +.top{font-family:Tahoma,sans-serif;font-size:12px;} +h2{font-family:Tahoma,sans-serif;} +a img {border:none;} +.bgimages16 li { + padding:2px 10px 2px 30px; + background-position:6px center; + background-repeat:no-repeat; + border:1px solid #ddd; + border-left:4px solid #999; + margin-bottom:2px; +} +.bugfix {background-image:url(bug-minus.png)} +.wip {background-image:url(hard-hat-exclamation.png)} +.tweak {background-image:url(wrench-screwdriver.png)} +.soundadd {background-image:url(music-plus.png)} +.sounddel {background-image:url(music-minus.png)} +.rscdel {background-image:url(cross-circle.png)} +.rscadd {background-image:url(tick-circle.png)} +.imageadd {background-image:url(image-plus.png)} +.imagedel {background-image:url(image-minus.png)} +.spellcheck {background-image:url(spell-check.png)} +.experiment {background-image:url(burn-exclamation.png)} +.refactor {background-image:url(burn-exclamation.png)} +.code_imp {background-image:url(coding.png)} +.config {background-image:url(chrome-wrench.png)} +.admin {background-image:url(ban.png)} +.server {background-image:url(hard-hat-exclamation.png)} +.balance {background-image:url(scales.png)} +.sansserif {font-family:Tahoma,sans-serif;font-size:12px;} +.commit {margin-bottom:20px;font-size:100%;font-weight:normal;} +.changes {list-style:none;margin:5px 0;padding:0 0 0 25px;font-size:0.8em;} +.date {margin:10px 0;color:blue;border-bottom:2px solid #00f;width:60%;padding:2px 0;font-size:1em;font-weight:bold;} +.author {padding-left:10px;margin:0;font-weight:bold;font-size:0.9em;} +.drop {cursor:pointer;border:1px solid #999;display:inline;font-size:0.9em;padding:1px 20px 1px 5px;line-height:16px;} +.hidden {display:none;} +.indrop {margin:2px 0 0 0;clear:both;background:#fff;border:1px solid #ddd;padding:5px 10px;} +.indrop p {margin:0;font-size:0.8em;line-height:16px;margin:1px 0;} +.indrop img {margin-right:5px;vertical-align:middle;} +.closed {background:url(chevron-expand.png) right center no-repeat;} +.open {background:url(chevron.png) right center no-repeat;} +.lic {font-size:9px;} From a21599f2262a531608108ab3857293e9f959d7fd Mon Sep 17 00:00:00 2001 From: MrCastmer <125900379+MrCastmer@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:26:50 +0300 Subject: [PATCH 4/7] Revert "Update changelog.css" This reverts commit 91b39635bc0c9df7f2ab05605a4bb9e70b765743. --- html/changelog.css | 82 +++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/html/changelog.css b/html/changelog.css index da32a5a55752..2bfa3fa49558 100644 --- a/html/changelog.css +++ b/html/changelog.css @@ -1,41 +1,41 @@ -.top{font-family:Tahoma,sans-serif;font-size:12px;} -h2{font-family:Tahoma,sans-serif;} -a img {border:none;} -.bgimages16 li { - padding:2px 10px 2px 30px; - background-position:6px center; - background-repeat:no-repeat; - border:1px solid #ddd; - border-left:4px solid #999; - margin-bottom:2px; -} -.bugfix {background-image:url(bug-minus.png)} -.wip {background-image:url(hard-hat-exclamation.png)} -.tweak {background-image:url(wrench-screwdriver.png)} -.soundadd {background-image:url(music-plus.png)} -.sounddel {background-image:url(music-minus.png)} -.rscdel {background-image:url(cross-circle.png)} -.rscadd {background-image:url(tick-circle.png)} -.imageadd {background-image:url(image-plus.png)} -.imagedel {background-image:url(image-minus.png)} -.spellcheck {background-image:url(spell-check.png)} -.experiment {background-image:url(burn-exclamation.png)} -.refactor {background-image:url(burn-exclamation.png)} -.code_imp {background-image:url(coding.png)} -.config {background-image:url(chrome-wrench.png)} -.admin {background-image:url(ban.png)} -.server {background-image:url(hard-hat-exclamation.png)} -.balance {background-image:url(scales.png)} -.sansserif {font-family:Tahoma,sans-serif;font-size:12px;} -.commit {margin-bottom:20px;font-size:100%;font-weight:normal;} -.changes {list-style:none;margin:5px 0;padding:0 0 0 25px;font-size:0.8em;} -.date {margin:10px 0;color:blue;border-bottom:2px solid #00f;width:60%;padding:2px 0;font-size:1em;font-weight:bold;} -.author {padding-left:10px;margin:0;font-weight:bold;font-size:0.9em;} -.drop {cursor:pointer;border:1px solid #999;display:inline;font-size:0.9em;padding:1px 20px 1px 5px;line-height:16px;} -.hidden {display:none;} -.indrop {margin:2px 0 0 0;clear:both;background:#fff;border:1px solid #ddd;padding:5px 10px;} -.indrop p {margin:0;font-size:0.8em;line-height:16px;margin:1px 0;} -.indrop img {margin-right:5px;vertical-align:middle;} -.closed {background:url(chevron-expand.png) right center no-repeat;} -.open {background:url(chevron.png) right center no-repeat;} -.lic {font-size:9px;} +.top{font-family:Tahoma,sans-serif;font-size:12px;} +h2{font-family:Tahoma,sans-serif;} +a img {border:none;} +.bgimages16 li { + padding:2px 10px 2px 30px; + background-position:6px center; + background-repeat:no-repeat; + border:1px solid #ddd; + border-left:4px solid #999; + margin-bottom:2px; +} +.bugfix {background-image:url(bug-minus.png)} +.wip {background-image:url(hard-hat-exclamation.png)} +.tweak {background-image:url(wrench-screwdriver.png)} +.soundadd {background-image:url(music-plus.png)} +.sounddel {background-image:url(music-minus.png)} +.rscdel {background-image:url(cross-circle.png)} +.rscadd {background-image:url(tick-circle.png)} +.imageadd {background-image:url(image-plus.png)} +.imagedel {background-image:url(image-minus.png)} +.spellcheck {background-image:url(spell-check.png)} +.experiment {background-image:url(burn-exclamation.png)} +.refactor {background-image:url(burn-exclamation.png)} +.code_imp {background-image:url(coding.png)} +.config {background-image:url(chrome-wrench.png)} +.admin {background-image:url(ban.png)} +.server {background-image:url(hard-hat-exclamation.png)} +.balance {background-image:url(scales.png)} +.sansserif {font-family:Tahoma,sans-serif;font-size:12px;} +.commit {margin-bottom:20px;font-size:100%;font-weight:normal;} +.changes {list-style:none;margin:5px 0;padding:0 0 0 25px;font-size:0.8em;} +.date {margin:10px 0;color:blue;border-bottom:2px solid #00f;width:60%;padding:2px 0;font-size:1em;font-weight:bold;} +.author {padding-left:10px;margin:0;font-weight:bold;font-size:0.9em;} +.drop {cursor:pointer;border:1px solid #999;display:inline;font-size:0.9em;padding:1px 20px 1px 5px;line-height:16px;} +.hidden {display:none;} +.indrop {margin:2px 0 0 0;clear:both;background:#fff;border:1px solid #ddd;padding:5px 10px;} +.indrop p {margin:0;font-size:0.8em;line-height:16px;margin:1px 0;} +.indrop img {margin-right:5px;vertical-align:middle;} +.closed {background:url(chevron-expand.png) right center no-repeat;} +.open {background:url(chevron.png) right center no-repeat;} +.lic {font-size:9px;} From c73312909e23c7d96125a213f37b6659a33e41a9 Mon Sep 17 00:00:00 2001 From: MrCastmer <125900379+MrCastmer@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:32:25 +0300 Subject: [PATCH 5/7] i`m done with this --- .gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 313f1f7da817..eb391f96b202 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10,7 +10,7 @@ code/__DEFINES/rust_g.dm eol=lf ## Enforce text mode and LF line breaks *.bat text eol=lf *.cjs text eol=lf -*.css text eol=lf +## *.css text eol=lf stop enforcing *.dm text eol=lf *.dme text eol=lf *.dmf text eol=lf From dd7881cce531d260fac490a905a8d0538eea2678 Mon Sep 17 00:00:00 2001 From: MrCastmer <125900379+MrCastmer@users.noreply.github.com> Date: Thu, 15 Aug 2024 12:59:14 +0300 Subject: [PATCH 6/7] init Messing with photocopier, trying to adapt other code --- code/modules/paperwork/photocopier.dm | 2 + .../code/modules/paperwork/photocopier.dm | 664 ++++++++++++++++++ .../tgui/interfaces/Photocopiernew.js | 222 ++++++ 3 files changed, 888 insertions(+) create mode 100644 tgui/packages/tgui/interfaces/Photocopiernew.js diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index f41efbc4633f..43b7a4c158c4 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -8,6 +8,7 @@ * Photocopier */ +/* Dripstation remove, see module /obj/machinery/photocopier name = "photocopier" desc = "Used to copy important documents and anatomy studies." @@ -384,3 +385,4 @@ p.pixel_y = rand(-8, 8) p.pixel_x = rand(-9, 9) return p +*/ diff --git a/modular_dripstation/code/modules/paperwork/photocopier.dm b/modular_dripstation/code/modules/paperwork/photocopier.dm index 4562f6d15372..ff25179ea4ef 100644 --- a/modular_dripstation/code/modules/paperwork/photocopier.dm +++ b/modular_dripstation/code/modules/paperwork/photocopier.dm @@ -1,2 +1,666 @@ +/// Name of the blanks file +#define BLANKS_FILE_NAME "config/blanks.json" + +/// For use with the `color_mode` var. Photos will be printed in greyscale while the var has this value. +#define PHOTO_GREYSCALE "Greyscale" +/// For use with the `color_mode` var. Photos will be printed in full color while the var has this value. +#define PHOTO_COLOR "Color" + +/// How much toner is used for making a copy of a paper. +#define PAPER_TONER_USE 0.125 +/// How much toner is used for making a copy of a photo. +#define PHOTO_TONER_USE 0.625 +/// How much toner is used for making a copy of a document. +#define DOCUMENT_TONER_USE (PAPER_TONER_USE * DOCUMENT_PAPER_USE) +/// How much toner is used for making a copy of an ass. +#define ASS_TONER_USE PHOTO_TONER_USE + +/// At which toner charge amount we start losing color. Toner cartridges are scams. +#define TONER_CHARGE_LOW_AMOUNT 2 + +// please use integers here +/// How much paper is used for making a copy of paper. What, are you seriously surprised by this? +#define PAPER_PAPER_USE 1 +/// How much paper is used for making a copy of a photo. +#define PHOTO_PAPER_USE 1 +/// How much paper is used for making a copy of a document. +#define DOCUMENT_PAPER_USE 20 +/// How much paper is used for making a copy of a photo. +#define ASS_PAPER_USE PHOTO_PAPER_USE + +/// Maximum capacity of a photocopier +#define MAX_PAPER_CAPACITY 60 +/// The maximum amount of copies you can make with one press of the copy button. +#define MAX_COPIES_AT_ONCE 10 + +/// Paper blanks (form templates, basically). Loaded from `config/blanks.json`. +/// If invalid or not found, set to null. +GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) + +/proc/init_paper_blanks() + if(!fexists(BLANKS_FILE_NAME)) + return null + var/list/blanks_json = json_decode(file2text(BLANKS_FILE_NAME)) + if(!length(blanks_json)) + return null + + var/list/parsed_blanks = list() + for(var/paper_blank in blanks_json) + parsed_blanks += list("[paper_blank["code"]]" = paper_blank) + + return parsed_blanks + /obj/machinery/photocopier + name = "photocopier" + desc = "Used to copy important documents and anatomy studies." icon = 'modular_dripstation/icons/obj/library.dmi' + icon_state = "photocopier" + density = TRUE + max_integrity = 300 + idle_power_usage = 50 + active_power_usage = 500 + integrity_failure = 0.33 + /// A reference to a mob on top of the photocopier trying to copy their ass. Null if there is no mob. + var/mob/living/ass + /// A reference to the toner cartridge that's inserted into the copier. Null if there is no cartridge. + var/obj/item/toner/toner_cartridge + /// How many copies will be printed with one click of the "copy" button. + var/num_copies = 1 + /// Used with photos. Determines if the copied photo will be in greyscale or color. + var/color_mode = PHOTO_COLOR + /// Indicates whether the printer is currently busy copying or not. + var/busy = FALSE + /// Variable needed to determine the selected category of forms on Photocopiernew.js + var/category + /// Variable that holds a reference to any object supported for photocopying inside the photocopier + var/obj/object_copy + /// Variable for the UI telling us how many copies are in the queue. + var/copies_left = 0 + /// The amount of paper this photocoper starts with. + var/starting_paper = 30 + /// A stack for all the empty paper we have newly inserted (LIFO) + var/list/paper_stack = list() + +/obj/machinery/photocopier/Initialize(mapload) + . = ..() + toner_cartridge = new(src) + +/obj/machinery/photocopier/Exited(atom/movable/gone, direction) + . = ..() + if(gone == object_copy) + object_copy = null + if(gone == toner_cartridge) + toner_cartridge = null + if(gone in paper_stack) + paper_stack -= gone + +/obj/machinery/photocopier/Destroy() + // object_copy can be a traitor objective, don't qdel + if(object_copy) + object_copy.forceMove(drop_location()) + + QDEL_NULL(toner_cartridge) + QDEL_LIST(paper_stack) + + ass = null //the mob isn't actually contained and just referenced, no need to delete it. + return ..() + +/obj/machinery/photocopier/examine(mob/user) + . = ..() + if(object_copy) + . += span_notice("There is something inside the scanner tray.") + . += span_notice("You can put any type of blank paper inside to print a form onto it or to copy something onto it.") + +/obj/machinery/photocopier/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Photocopiernew") + ui.open() + +/obj/machinery/photocopier/ui_static_data(mob/user) + var/list/static_data = list() + + var/list/blank_infos = list() + var/list/category_names = list() + if(GLOB.paper_blanks) + for(var/blank_id in GLOB.paper_blanks) + var/list/paper_blank = GLOB.paper_blanks[blank_id] + blank_infos += list(list( + name = paper_blank["name"], + category = paper_blank["category"], + code = blank_id, + )) + category_names |= paper_blank["category"] + + static_data["blanks"] = blank_infos + static_data["categories"] = category_names + + return static_data + +/obj/machinery/photocopier/ui_data(mob/user) + var/list/data = list() + data["has_item"] = !copier_empty() + data["num_copies"] = num_copies + + data["category"] = category + data["copies_left"] = copies_left + + if(istype(object_copy, /obj/item/photo)) + data["is_photo"] = TRUE + data["color_mode"] = color_mode + + if(isAI(user)) + data["isAI"] = TRUE + data["can_AI_print"] = toner_cartridge && (toner_cartridge.charges >= PHOTO_TONER_USE) && (get_paper_count() >= PHOTO_PAPER_USE) + else + data["isAI"] = FALSE + + if(toner_cartridge) + data["has_toner"] = TRUE + data["current_toner"] = toner_cartridge.charges + data["max_toner"] = toner_cartridge.max_charges + else + data["has_toner"] = FALSE + + data["paper_count"] = get_paper_count() + + return data + +/obj/machinery/photocopier/ui_act(action, list/params) + . = ..() + if(.) + return + + if(stat & (BROKEN|NOPOWER)) + return + + switch(action) + // Copying paper, photos, documents and asses. + if("make_copy") + if(check_busy(usr)) + return FALSE + // ASS COPY. By Miauw + if(ass) + if(ishuman(ass) && (ass.get_item_by_slot(ITEM_SLOT_ICLOTHING) || ass.get_item_by_slot(ITEM_SLOT_OCLOTHING))) + if(ass == usr) + to_chat(usr, span_notice("You feel kind of silly, copying your ass with your clothes on.")) + else + to_chat(usr, span_notice("You feel kind of silly, copying [ass]\'s ass with [ass.p_their()] clothes on.")) + return FALSE + do_copies(CALLBACK(src, PROC_REF(make_ass_copy), usr), usr, ASS_PAPER_USE, ASS_TONER_USE, num_copies) + return TRUE + else + // Basic paper + if(istype(object_copy, /obj/item/paper)) + do_copies(CALLBACK(src, PROC_REF(make_paper_copy), object_copy), usr, PAPER_PAPER_USE, PAPER_TONER_USE, num_copies) + return TRUE + // Copying photo. + if(istype(object_copy, /obj/item/photo)) + var/obj/item/photo/photo_copy = object_copy + do_copies(CALLBACK(src, PROC_REF(make_photo_copy), photo_copy.picture, color_mode), usr, PHOTO_PAPER_USE, PHOTO_TONER_USE, num_copies) + return TRUE + // Copying Documents. + if(istype(object_copy, /obj/item/documents)) + do_copies(CALLBACK(src, PROC_REF(make_document_copy), object_copy), usr, DOCUMENT_PAPER_USE, DOCUMENT_TONER_USE, num_copies) + return TRUE + + // Remove the paper/photo/document from the photocopier. + if("remove") + if(object_copy) + remove_photocopy(object_copy, usr) + object_copy = null + else if(check_ass()) + to_chat(ass, span_notice("You feel a slight pressure on your ass.")) + return TRUE + + // AI printing photos from their saved images. + if("ai_photo") + if(check_busy(usr)) + return FALSE + var/mob/living/silicon/ai/tempAI = usr + if(!length(tempAI.aicamera.stored)) + balloon_alert(usr, "The clipboard is empty!") + return FALSE + var/datum/picture/selection = tempAI.aicamera.selectpicture(usr) + do_copies(CALLBACK(src, PROC_REF(make_photo_copy), selection, PHOTO_COLOR), usr, PHOTO_PAPER_USE, PHOTO_TONER_USE, 1) + return TRUE + + // Switch between greyscale and color photos + if("color_mode") + if(params["mode"] in list(PHOTO_GREYSCALE, PHOTO_COLOR)) + color_mode = params["mode"] + return TRUE + + // Remove the toner cartridge from the copier. + if("remove_toner") + if(check_busy(usr)) + return FALSE + var/success = usr.put_in_hands(toner_cartridge) + if(!success) + toner_cartridge.forceMove(drop_location()) + + toner_cartridge = null + return TRUE + + // Set the number of copies to be printed with 1 click of the "copy" button. + if("set_copies") + num_copies = clamp(text2num(params["num_copies"]), 1, MAX_COPIES_AT_ONCE) + return TRUE + // Changes the forms displayed on Photocopiernew.js when you switch categories + if("choose_category") + category = params["category"] + return TRUE + // Called when you press print blank + if("print_blank") + if(check_busy(usr)) + return FALSE + if(!(params["code"] in GLOB.paper_blanks)) + return FALSE + var/list/blank = GLOB.paper_blanks[params["code"]] + do_copies(CALLBACK(src, PROC_REF(make_blank_print), blank), usr, PAPER_PAPER_USE, PAPER_TONER_USE, 1) + return TRUE + +/// Returns the color used for the printing operation. If the color is below TONER_LOW_PERCENTAGE, it returns a gray color. +/obj/machinery/photocopier/proc/get_toner_color() + return toner_cartridge.charges > TONER_CHARGE_LOW_AMOUNT ? COLOR_FULL_TONER_BLACK : COLOR_GRAY + + +/// Will invoke `do_copy_loop` asynchronously. Passes the supplied arguments on to it. +/obj/machinery/photocopier/proc/do_copies(datum/callback/copy_cb, mob/user, paper_use, toner_use, copies_amount) + busy = TRUE + use_power(ACTIVE_POWER_USE) + // fucking god proc + INVOKE_ASYNC(src, PROC_REF(do_copy_loop), copy_cb, user, paper_use, toner_use, copies_amount) + +/** + * Will invoke the passed in `copy_cb` callback in 4 second intervals, and charge the user 5 credits for each copy made. + * + * Arguments: + * * copy_cb - a callback for which proc to call. Should only be one of the `make_x_copy()` procs, such as `make_paper_copy()`. + * * user - the mob who clicked copy. + * * paper_use - the amount of paper used in this operation + * * toner_use - the amount of toner used in this operation + * * copies_amount - the amount of copies we should make + */ +/obj/machinery/photocopier/proc/do_copy_loop(datum/callback/copy_cb, mob/user, paper_use, toner_use, copies_amount) + var/error_message = null + if(!toner_cartridge) + copies_amount = 0 + error_message = span_warning("An error message flashes across \the [src]'s screen: \"No toner cartridge found. Aborting.\"") + else if(toner_cartridge.charges < toner_use * copies_amount) + copies_amount = FLOOR(toner_cartridge.charges / toner_use, 1) + error_message = span_warning("An error message flashes across \the [src]'s screen: \"Not enough toner to perform [copies_amount >= 1 ? "full " : ""]operation.\"") + if(get_paper_count() < paper_use * copies_amount) + copies_amount = FLOOR(get_paper_count() / paper_use, 1) + error_message = span_warning("An error message flashes across \the [src]'s screen: \"Not enough paper to perform [copies_amount >= 1 ? "full " : ""]operation.\"") + + copies_left = copies_amount + + if(copies_amount <= 0) + to_chat(user, error_message) + reset_busy() + return + + if(error_message) + to_chat(user, error_message) + + // if you managed to cancel the copy operation, tough luck. you aren't getting your money back. + for(var/i in 1 to copies_amount) + if(stat & (BROKEN|NOPOWER)) + break + + if(!toner_cartridge) + break + + // arguments to copy_cb have been set at callback instantiation + var/atom/movable/copied_obj = copy_cb.Invoke() + if(isnull(copied_obj)) // something went wrong, so other copies will go wrong too + break + + playsound(src, 'sound/effects/printer.ogg', 50, vary = FALSE) + sleep(4 SECONDS) + + // reveal our copied item + copied_obj.forceMove(drop_location()) + give_pixel_offset(copied_obj) + copies_left-- + + copies_left = 0 + reset_busy() + +/// Sets busy to `FALSE`. +/obj/machinery/photocopier/proc/reset_busy() + use_power(IDLE_POWER_USE) + busy = FALSE + +/// Determines if the printer is currently busy, informs the user if it is. +/obj/machinery/photocopier/proc/check_busy(mob/user) + if(busy) + balloon_alert(user, "Photocopier is busy!") + return TRUE + return FALSE + +/** + * Gives items a random x and y pixel offset, between -10 and 10 for each. + * + * This is done that when someone prints multiple papers, we dont have them all appear to be stacked in the same exact location. + * + * Arguments: + * * copied_item - The paper, document, or photo that was just spawned on top of the printer. + */ +/obj/machinery/photocopier/proc/give_pixel_offset(obj/item/copied_item) + copied_item.pixel_x = copied_item.base_pixel_x + rand(-10, 10) + copied_item.pixel_y = copied_item.base_pixel_y + rand(-10, 10) + +/// Gets the total amount of paper this printer has stored. +/obj/machinery/photocopier/proc/get_paper_count() + return length(paper_stack) + starting_paper + +/** + * Returns an empty paper, used for blanks and paper copies. + * Prioritizes `paper_stack`, creates new paper in case `paper_stack` is empty. + */ +/obj/machinery/photocopier/proc/get_empty_paper() + var/obj/item/paper/new_paper = pop(paper_stack) + if(new_paper == null && starting_paper > 0) + new_paper = new /obj/item/paper + starting_paper-- + return new_paper + +/** + * Removes an amount of paper from the printer's storage. + * This lets us pretend we actually consumed paper when we were actually printing something that wasn't paper. + */ +/obj/machinery/photocopier/proc/delete_paper(number) + if(number > get_paper_count()) + CRASH("Trying to delete more paper than is stored in the photocopier") + for(var/i in 1 to number) + var/to_delete = pop(paper_stack) + if(to_delete) + qdel(to_delete) + else + starting_paper-- + +/** + * Handles the copying of paper. Transfers all the text, stamps and so on from the old paper, to the copy. + * + * Checks first if `paper_copy` exists. Since this proc is called from a timer, it's possible that it was removed. + */ +/obj/machinery/photocopier/proc/make_paper_copy(obj/item/paper/paper_copy) + if(isnull(paper_copy)) + return null + + var/obj/item/paper/empty_paper = get_empty_paper() + toner_cartridge.charges -= PAPER_TONER_USE + + var/copy_colour = get_toner_color() + + var/obj/item/paper/copied_paper = paper_copy.copy(empty_paper, src, FALSE, copy_colour) + copied_paper.name = paper_copy.name + copied_paper.raw_stamp_data = paper_copy.copy_raw_stamps() + copied_paper.stamp_cache = paper_copy.stamp_cache?.Copy() + copied_paper.copy_overlays(paper_copy, TRUE) + return copied_paper + +/** + * Handles the copying of photos, which can be printed in either color or greyscale. + * + * Checks first if `picture` exists. Since this proc is called from a timer, it's possible that it was removed. + */ +/obj/machinery/photocopier/proc/make_photo_copy(datum/picture/photo, photo_color) + if(isnull(photo)) + return null + var/obj/item/photo/copied_pic = new(src, photo.Copy(photo_color == PHOTO_GREYSCALE ? TRUE : FALSE)) + delete_paper(PHOTO_PAPER_USE) + toner_cartridge.charges -= PHOTO_TONER_USE + return copied_pic + +/** + * Handles the copying of documents. + * + * Checks first if `document_copy` exists. Since this proc is called from a timer, it's possible that it was removed. + */ +/obj/machinery/photocopier/proc/make_document_copy(obj/item/documents/document_copy) + if(isnull(document_copy)) + return null + var/obj/item/documents/photocopy/copied_doc = new(src, document_copy) + delete_paper(DOCUMENT_PAPER_USE) + toner_cartridge.charges -= DOCUMENT_TONER_USE + return copied_doc + +/// Handles the copying of blanks. No mutating state, so this should not fail. +/obj/machinery/photocopier/proc/make_blank_print(list/blank) + var/copy_colour = get_toner_color() + var/obj/item/paper/printblank = get_empty_paper() + + var/printname = blank["name"] + var/list/printinfo + for(var/infoline in blank["info"]) + printinfo += infoline + + printblank.name = "paper - '[printname]'" + printblank.add_raw_text(printinfo, color = copy_colour) + printblank.update_appearance() + + toner_cartridge.charges -= PAPER_TONER_USE + return printblank + +/** + * Handles the copying of an ass photo. + * + * Calls `check_ass()` first to make sure that `ass` exists, among other conditions. Since this proc is called from a timer, it's possible that it was removed. + * Additionally checks that the mob has their clothes off. + */ +/obj/machinery/photocopier/proc/make_ass_copy(mob/user) + if(!check_ass()) + return null + var/icon/temp_img + if(ishuman(ass)) + var/mob/living/carbon/human/H = ass + var/datum/species/spec = H.dna.species + if(spec.ass_image) + temp_img = icon(spec.ass_image) + else + temp_img = icon(H.dna.features["body_model"] == FEMALE ? 'icons/ass/assfemale.png' : 'icons/ass/assmale.png') + else if(isalienadult(ass)) //Xenos have their own asses, thanks to Pybro. + temp_img = icon('icons/ass/assalien.png') + else if(issilicon(ass)) + temp_img = icon('icons/ass/assmachine.png') + else if(isdrone(ass)) //Drones are hot + temp_img = icon('icons/ass/assdrone.png') + + var/obj/item/photo/copied_ass = new /obj/item/photo(src) + var/datum/picture/toEmbed = new(name = "[ass]'s Ass", desc = "You see [ass]'s ass on the photo.", image = temp_img) + toEmbed.psize_x = 128 + toEmbed.psize_y = 128 + copied_ass.set_picture(toEmbed, TRUE, TRUE) + delete_paper(ASS_PAPER_USE) + toner_cartridge.charges -= ASS_TONER_USE + return copied_ass + +/** + * Called when someone hits the "remove item" button on the copier UI. + * + * If the user is a silicon, it drops the object at the location of the copier. If the user is not a silicon, it tries to put the object in their hands first. + * Sets `busy` to `FALSE` because if the inserted item is removed, the copier should halt copying. + * + * Arguments: + * * object - the item we're trying to remove. + * * user - the user removing the item. + */ +/obj/machinery/photocopier/proc/remove_photocopy(obj/item/object, mob/user) + if(issilicon(user)) + object.forceMove(drop_location()) + return + + object.forceMove(user.loc) + user.put_in_hands(object) + + to_chat(user, span_notice("You take [object] out of [src]. [busy ? "The [src] comes to a halt." : ""]")) + +/obj/machinery/photocopier/wrench_act(mob/living/user, obj/item/tool) + . = ..() + default_unfasten_wrench(user, tool) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/photocopier/attackby(obj/item/object, mob/user, params) + if(istype(object, /obj/item/paper) || istype(object, /obj/item/photo) || istype(object, /obj/item/documents)) + if(istype(object, /obj/item/paper)) + var/obj/item/paper/paper = object + if(paper.is_empty()) + insert_empty_paper(paper, user) + return + insert_copy_object(object, user) + + else if(istype(object, /obj/item/toner)) + if(toner_cartridge) + balloon_alert(user, "There is already a cartridge inside!") + return + object.forceMove(src) + toner_cartridge = object + balloon_alert(user, "Cartridge inserted.") + + else if(istype(object, /obj/item/areaeditor/blueprints)) + to_chat(user, span_warning("\The [object] is too large to put into the copier. You need to find something else to record the document.")) + +/// Proc that handles insertion of empty paper, useful for copying later. +/obj/machinery/photocopier/proc/insert_empty_paper(obj/item/paper/paper, mob/user) + if(get_paper_count() >= MAX_PAPER_CAPACITY) + balloon_alert(user, "Paper is at maximum capacity!") + return + if(!user.temporarilyRemoveItemFromInventory(paper)) + return + paper_stack += paper + paper.forceMove(src) + balloon_alert(user, "Paper inserted.") + +/obj/machinery/photocopier/proc/insert_copy_object(obj/item/object, mob/user) + if(!copier_empty()) + balloon_alert(user, "Photocopier is busy!") + return + if(!user.temporarilyRemoveItemFromInventory(object)) + return + object_copy = object + object.forceMove(src) + balloon_alert(user, "Document inserted.") + flick("photocopier1", src) + +/obj/machinery/photocopier/obj_break(damage_flag) + . = ..() + if(. && toner_cartridge.charges) + new /obj/effect/decal/cleanable/oil(get_turf(src)) + toner_cartridge.charges = 0 + +/obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user) + check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off. + if(!istype(target) || target.anchored || target.buckled || !Adjacent(target) || !user.canUseTopic(src) || target == ass || copier_blocked()) + return + add_fingerprint(user) + if(target == user) + user.visible_message(span_notice("[user] starts climbing onto the photocopier!"), span_notice("You start climbing onto the photocopier...")) + else + user.visible_message(span_warning("[user] starts putting [target] onto the photocopier!"), span_notice("You start putting [target] onto the photocopier...")) + + if(do_after(user, 20, target = src)) + if(!target || QDELETED(target) || QDELETED(src) || !Adjacent(target)) //check if the photocopier/target still exists. + return + + if(target == user) + user.visible_message(span_notice("[user] climbs onto the photocopier!"), span_notice("You climb onto the photocopier.")) + else + user.visible_message(span_warning("[user] puts [target] onto the photocopier!"), span_notice("You put [target] onto the photocopier.")) + + target.forceMove(drop_location()) + ass = target + + if(!isnull(object_copy)) + object_copy.forceMove(drop_location()) + visible_message(span_warning("[object_copy] is shoved out of the way by [ass]!")) + object_copy = null + +/** + * Checks the living mob `ass` exists and its location is the same as the photocopier. + * + * Returns FALSE if `ass` doesn't exist or is not at the copier's location. Returns TRUE otherwise. + */ +/obj/machinery/photocopier/proc/check_ass() //I'm not sure wether I made this proc because it's good form or because of the name. + if(!ass) + return FALSE + if(ass.loc != loc) + ass = null + return FALSE + return TRUE + +/** + * Checks if the copier is deleted, or has something dense at its location. Called in `MouseDrop_T()` + */ +/obj/machinery/photocopier/proc/copier_blocked() + if(QDELETED(src)) + return + if(loc.density) + return TRUE + for(var/atom/movable/AM in loc) + if(AM == src) + continue + if(AM.density) + return TRUE + return FALSE + +/** + * Checks if there is an item inserted into the copier or a mob sitting on top of it. + * + * Return `FALSE` is the copier has something inside of it. Returns `TRUE` if it doesn't. + */ +/obj/machinery/photocopier/proc/copier_empty() + if(object_copy || check_ass()) + return FALSE + else + return TRUE + +/// Subtype of photocopier that is free to use. +/obj/machinery/photocopier/gratis + desc = "Does the same important paperwork, but it's free to use! The best type of free." + +/* + * Toner cartridge + */ +/obj/item/toner + name = "toner cartridge" + desc = "A small, lightweight cartridge of Nanotrasen ValueBrand toner. Fits photocopiers and autopainters alike." + icon = 'icons/obj/device.dmi' + icon_state = "tonercartridge" + grind_results = list(/datum/reagent/iodine = 40, /datum/reagent/iron = 10) + var/charges = 5 + var/max_charges = 5 + +/obj/item/toner/examine(mob/user) + . = ..() + . += span_notice("The ink level gauge on the side reads [round(charges / max_charges * 100)]%") + +/obj/item/toner/large + name = "large toner cartridge" + desc = "A hefty cartridge of Nanotrasen ValueBrand toner. Fits photocopiers and autopainters alike." + grind_results = list(/datum/reagent/iodine = 90, /datum/reagent/iron = 10) + charges = 25 + max_charges = 25 + +/obj/item/toner/extreme + name = "extremely large toner cartridge" + desc = "Why would ANYONE need THIS MUCH TONER?" + charges = 200 + max_charges = 200 + +#undef BLANKS_FILE_NAME +#undef PAPER_PAPER_USE +#undef PHOTO_PAPER_USE +#undef DOCUMENT_PAPER_USE +#undef ASS_PAPER_USE +#undef MAX_PAPER_CAPACITY +#undef TONER_CHARGE_LOW_AMOUNT +#undef PHOTO_GREYSCALE +#undef PHOTO_COLOR +#undef PAPER_TONER_USE +#undef PHOTO_TONER_USE +#undef DOCUMENT_TONER_USE +#undef ASS_TONER_USE +#undef MAX_COPIES_AT_ONCE diff --git a/tgui/packages/tgui/interfaces/Photocopiernew.js b/tgui/packages/tgui/interfaces/Photocopiernew.js new file mode 100644 index 000000000000..5eb996a5aef5 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Photocopiernew.js @@ -0,0 +1,222 @@ +import { sortBy } from 'common/collections'; +import { useBackend } from '../backend'; +import { Box, Button, Dropdown, Flex, NumberInput, ProgressBar, Section } from '../components'; +import { Window } from '../layouts'; + +export const Photocopier = (props, context) => { + const { data } = useBackend(context); + const { + isAI, + has_toner, + has_item, + categories = [], + paper_count, + copies_left, + } = data; + + return ( + + + {has_toner ? ( + + ) : ( +
+ No inserted toner cartridge. +
+ )} +
+ Paper inside: {paper_count} + {!!copies_left && ( + Copy processing: {copies_left} + )} +
+ {categories.length !== 0 ? ( + + ) : ( +
+ + No forms found. Please contact your system administrator. + +
+ )} + {has_item ? ( + + ) : ( +
+ No inserted item. +
+ )} + {!!isAI && } +
+
+ ); +}; + +const Toner = (props, context) => { + const { act, data } = useBackend(context); + const { max_toner, current_toner } = data; + + const average_toner = max_toner * 0.66; + const bad_toner = max_toner * 0.33; + + return ( +
act('remove_toner')} icon="eject"> + Eject + + }> + +
+ ); +}; + +const Options = (props, context) => { + const { act, data } = useBackend(context); + const { color_mode, is_photo, num_copies } = data; + + return ( +
+ + + Make copies: + + + + act('set_copies', { + num_copies: value, + }) + } + /> + + + + + + {!!is_photo && ( + + + + + + + + + )} + +
+ ); +}; + +const Blanks = (props, context) => { + const { act, data } = useBackend(context); + const { blanks, categories, category } = data; + + const sortedBlanks = sortBy((blank) => blank.name)(blanks || []); + + const selectedCategory = category ?? categories[0]; + const visibleBlanks = sortedBlanks.filter( + (blank) => blank.category === selectedCategory + ); + + return ( +
+ + act('choose_category', { + category: value, + }) + } + /> + + {visibleBlanks.map((blank) => ( + + ))} + +
+ ); +}; + +const AIOptions = (props, context) => { + const { act, data } = useBackend(context); + const { can_AI_print } = data; + + return ( +
+ + + +
+ ); +}; From 8c949bb5ec96dd3f68c5cf0fa5098383213af46b Mon Sep 17 00:00:00 2001 From: MrCastmer <125900379+MrCastmer@users.noreply.github.com> Date: Thu, 15 Aug 2024 21:52:57 +0300 Subject: [PATCH 7/7] fax doesn`t work (yet) --- code/modules/paperwork/carbonpaper.dm | 2 + code/modules/paperwork/faxmachine.dm | 6 ++ .../code/modules/paperwork/photocopier.dm | 79 ++++++++++++------ .../sound/machines/printer.ogg | Bin 0 -> 42893 bytes 4 files changed, 61 insertions(+), 26 deletions(-) create mode 100644 modular_dripstation/sound/machines/printer.ogg diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm index 4ef391075ba4..18abb4ef08bb 100644 --- a/code/modules/paperwork/carbonpaper.dm +++ b/code/modules/paperwork/carbonpaper.dm @@ -59,5 +59,7 @@ else to_chat(usr, span_warning("There are no more carbon copies attached to this paper!")) +/* Dripstation edit /obj/item/paper/carbon/proc/clearcolor(text) // Breaks all font color spans in the HTML text. return replacetext(replacetext(text, "" + //Now for copying the new $written var + for(var/L in written) + if(istype(L,/datum/langtext)) + var/datum/langtext/oldL = L + var/datum/langtext/newL = new(clearcolor(oldL.text),oldL.lang) + copy.written += newL + else + copy.written += L + copy.name = name + copy.fields = fields + copy.update_appearance(UPDATE_ICON) + copy.stamps = stamps + if(stamped) + copy.stamped = stamped.Copy() + copy.copy_overlays(src, TRUE) + return copy + /** * Handles the copying of photos, which can be printed in either color or greyscale. * @@ -439,7 +474,10 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) printinfo += infoline printblank.name = "paper - '[printname]'" - printblank.add_raw_text(printinfo, color = copy_colour) + printblank.coloroverride = copy_colour + var/copyinfo = printinfo + copyinfo = printblank.clearcolor(copyinfo) + printblank.info += copyinfo + "" printblank.update_appearance() toner_cartridge.charges -= PAPER_TONER_USE @@ -454,21 +492,10 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) /obj/machinery/photocopier/proc/make_ass_copy(mob/user) if(!check_ass()) return null - var/icon/temp_img - if(ishuman(ass)) - var/mob/living/carbon/human/H = ass - var/datum/species/spec = H.dna.species - if(spec.ass_image) - temp_img = icon(spec.ass_image) - else - temp_img = icon(H.dna.features["body_model"] == FEMALE ? 'icons/ass/assfemale.png' : 'icons/ass/assmale.png') - else if(isalienadult(ass)) //Xenos have their own asses, thanks to Pybro. - temp_img = icon('icons/ass/assalien.png') - else if(issilicon(ass)) - temp_img = icon('icons/ass/assmachine.png') - else if(isdrone(ass)) //Drones are hot - temp_img = icon('icons/ass/assdrone.png') - + var/butt_icon_state = ass.get_butt_sprite() + if(isnull(butt_icon_state)) + return FALSE + var/icon/temp_img = icon('icons/mob/butts.dmi', butt_icon_state) var/obj/item/photo/copied_ass = new /obj/item/photo(src) var/datum/picture/toEmbed = new(name = "[ass]'s Ass", desc = "You see [ass]'s ass on the photo.", image = temp_img) toEmbed.psize_x = 128 @@ -545,7 +572,7 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) balloon_alert(user, "Document inserted.") flick("photocopier1", src) -/obj/machinery/photocopier/obj_break(damage_flag) +/obj/machinery/photocopier/atom_break(damage_flag) . = ..() if(. && toner_cartridge.charges) new /obj/effect/decal/cleanable/oil(get_turf(src)) diff --git a/modular_dripstation/sound/machines/printer.ogg b/modular_dripstation/sound/machines/printer.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6916a695bf573e6e8cbe43159fb0b9a70d42da24 GIT binary patch literal 42893 zcmagF1ymkOvo1WiJ0ZBcYj6$j?(Xgq2pT-N2AALj*Fdn~t^tA*oZ!LzAF}s3=ljoH z>)u)O_UgB*yISh0>gt*qB`Yg602283+MxX>1M?{K2Z9*F)5+D;#_gpDLcHSNDqawO zGhZQ;URwV5_0sZ%Vugspgx>r7|GS2u{$a!k(zR`zt(lcvtw`-{Of~{JcIe9pmGdsCju{c{e zIon&X{4Y){e=E4Lu<@{Qva_-vfPBP7)g=VM;ju%&{4)nSvA3EK06a)ylPB#9oQ&51 z0CWH_rldnnvXr4KO3tVCPD_@4$@Q^DrX@%A;hIIW_5W8w%4z-z0HA?DT7=kw9U0qk zUMpOhSl2vW8%3THQn-&Q>%0ivm(*sC#SO)Fj^lJx@F+Sk04N|4X|hmk)tAIHf-DRd zOu`9W2gypZToLI@^FAQ550VDUv+oxsDe~=?7R2)XrfrxMLt<)}mX&9l)ikSWhc)nZ z8|U54`Zq!NI}cKDEMl;D=ICPZFYF`eiql*{R{ukXja=OFn}|XBXx`;b;y6K zfZ%$80RZILWEB4&x1~<1#sB*ju^yxcM8LHia3LIUp_EXi9B^fX`@6z}04P%tRmMJ7 zPANCe0XG5gmU0&#N|qnHkVpG3A-sqk07Tdb`&|MUb_h{)d}&6vzMALB*M*v>1%&Ybxk zsh&yGQkItaSAzEAc$=Us>4ww$^3o?W+{R^)Gm8Gnd1Ge6RhCVIWq7+;sQq{*U_G1Z z47jodZLqD*WX4Wu3pSXGOwOcfY*GJ*-@mXZGt3(Q&ie~&5xJOY*MeXG=5Ecij>iyQ z%KkTeL_oQj{KW0g{y^#%3u}r^R!o*e>>h`jl*cwmS4bQaD=AwRtgMPhQ{?{P@61U7 zAO!s{ivKJ53*~=MT$uQgewem?lzoKpC8_8c=R2tBL4S+P2BMge3q)~D<4%rS6|b~i zQRAF0Ls7D-EM3t*8U+fK)I44k7Voc;gr&I-)0Kc)@t=Y_rJTSZn);7>;*3xQlM1}2 z*qPKg1U1w(v^*VjK6xxPhZ_9!Sey4-n~yPi9rnM0_1~HUfJzhcS0|HAquB;`M(D006q;k>&o{5fxRYSyirCRVEE}!T-C)fYez| zg&9t8VN(DA4*)1YA%~!Ubd48t6x4=i+o6QX=Y`Gh#SJMz=RoE~A$N}#r4js^$lHT_ zzOG99N?blThKf6u6s5aZUuK&J9yEKNvvJJBJ;<}E@4CRTBvmsi&`}j*nr&tkOv?-vCgaL|%r3+w420dU|CDStBl6@&;j0GJ}HBGQE>tB%v{ z#H$XoZ4;`>@|I+&jq}12g$%R7W(T9w6%ne9(+v=YjEZh&1y72CyCi8B1o#u9Rm;h4~cDF-|TOb&U}$jahY#B^(8fCMpFi1%(TB4J-+b zR~j>^3L1?L6Py+c>KZFJ8naCnOE~^osUB+_3OeB5IgsixpXz5c=U|ZbFDnJ?zpUP9 z%r|kVxNE3rSm>y0=y+P_Tx)2}`N@G)HHC#&8X8R+3zrTWseZrQH4L;Y7OpjPaQyY= zLw{ZQ{lb0WJU{CJQcdP8OqxB`Xl*iVY(JNlXV8|Hmz6g;lvh>iecmhoTs~Z9RbEvw zTvz?2%KiYPR+X05F_xDzeyOXtFK0YxDlKoV9ImU$tom}$bb{2wc+l!xURCv_?(l`$ zT6xg#a?r}^TTC}n{N;CRS!=7~L95GXlLKKv`R@+;k?xw|x|4%emIe+=Yot5{)AcN@}-U%nd7O+{pBLP^}f6gFm!V_C$l>v^lyfU-=%R!wZ zLr=wln2Ls@cc*p~a92*0rs8Z5m53E6d(NPcF6 z*9a4KOZ_hQe4AGu1=Yw1192cWAYQP6H7t@(#sC?}0|CI2?P9B;)Ay0OqpSWVEmUWN zC391h?ITQ9mbE2I{z2bQsvavdn3aSnYfYCttqPZ4q%3QfpFF2(S6lqU^oX<&N7jZZ zd0N-DtpA5@G=>>E`);B6xC}y3!wUgqwVPLnDkfW0h%G0}q&W%#xnNpUx~vdWO{T07 zWK~p%BPYw&gstbuHb)4yD8$s0q3g$1b71Pvpy($BSq;5({S$Kd3#;H*SsA*fL|J)oRI;+Qp{ly}Y;#$v_FUkoKvs#e_Dub{dh(4P=(FGkzWo4*}Ku;Ty z5cKElCzG`a!2$haM~sn8k=epX-PPIYF+${JY084Y6|M9Dp-|K}s%u->@KXf7GIWkz zjtYc=Wo2)gE&~7@f&)7IYe%SncsM`=w*c&y*9zTqly{Gi6SRzkA*l5IS;44c@UOsO zfP2*_FPNZQQEvIK!2}15a6F{UB5e|5UBhZxMp~FXFe3>IU zD(L9-q=6%bB?<|n+bawK#gqS5mY0?aL?RlXYd&-BeZSsftoxOvevhStgJ- z997Yrsx8GCCp}9$BRwnzW?Tar6 zLKN!73RCP+77UZybN=dvQnntH1p<))z~!gy0o~jnX_6(Uue*U_~e62oiz7#vKGZ z3W25r@@l#!+4P~Iw=mfekr4+%+@@`y0Q8VS$h?#_y48j)x)*%AXfIv!^h=>Tw*n*x-C`xhjkiyzMQ73b#EGP5$WQq$5fFgE0s=9d%{6yz5bmK2nKMkey; zKOb2BL(+Q?H7h%s1esN{S&i6E`KNZdaHl)d+)5o{9PY&wz(+Bv&qTT+h!)@NrQo$7PJWM&Zgwsr zq;zIBWRUNp*j4Kbe>J%is#V%wJN#j*vshq;*-cD6uV`SnCE*}da@T-a0eG^!=&;x# zU#~=$tTiZ@%_{*I9k^t231I;M?tDi{IIg|DhGl5U2n8QWDfzsxdJfjR9Nzt0Ozb&D zS+UaK&mK#)(tSCmYwERTaTAQSjbsfCY~7dn6AODbpo&eUO-mVN$|+tTU5w3$p7B^P zrZPsZFN^r~=qPb*^0XB6kwZpRNFXwSJa#~pNhDJQ+>A>X^(D_}?cidFpqha)S2^}SAjP1}jz?R=84BhOkHqb}Q^3N??W8EY05TszL% zz8eXv8#wB_M^(z6J7}P^{14_37?-(icwER*Fx#o$z8pPgDLLe$2i6NUl~y`3+urM)kfO>Mgk+2&1Vy-7yP~StpC9#1(N!{LPfSLy!m#|D7`=nM-K@eA*i5gzerE{h)_bLB zHnY!z?A*DI>%{+O?pv!;xfH`kezY1o)!bR!#h)LoW9ad7Bsz%T3%5nFQVXm0F_e>k z>f12ke2$2Q0*Ea`@?bjiZXgPJPnHPr(GQsbkwy(yOwfkN9?7{^#86V7%*?0eVr#vD z#z=sd;F4vJT#TO)J#Kp}cKdSAcpbby%q{+~sFVG500H|B#d#JQ1CQW@nHc4*H*J2M zt2jE55VStewkHqXyTJ{iJ^+3BMa@S+E!Q)!=ctUl3xxV(NodFD+{ussV6%*%#}<3BSu&+nHC(Jbh>4dp&>AswS@jZZ3?}QF%nB3uy7nkVVz1=si~-u)2IQ_^Eci zd$Oka!?l8ez$at2l}okzZi>N~eQ0yVsPqz1!!fbi^o8pq^d1aFr(4+OYN z=G=)HnHNm(5C9F1k3R#o58`~uTiRRBIgKI2f@@94KStJ)hb5A{?zzFD;?MSjYcss; zHTFjBq`=O6^-Z_{Cbb6h{j0{UuqFZ1WT8$8Bd#;{wC&AV$X>_x)W%)=C(ZN3WlP8U z{2E}XdZ8q%A^VgpAzYu;_1O}obc7u-%P{mXVP`DhDX6JGFd^cpP4uKV4pg)mG+$ot&nckQ{KTPZ>*!-Ls4Y^d zDnQhHK$N{if@o4c2O+X9mBGC_D!K$37ti{>l^;H*v>_Px?iqo$%#1yOzbQwH3L>fe z4?Q^K(|yrTXiEkicN~-xx#Rnu{U&aHLMitJVJckD+LG$)1=>f`KT;LGUJD@V8NPqL zO5h{|P3xar5cVfK#FOUseHjHcypI-tSM7I`kk7=7&r_`jDu+k+NECfsD3I6skeY2bKWf;Q?nutq|doG!e)|M=y*rhS&nYP+^J7|J7sYu`&g zXh5eCpd+y0erNHG;q%@ng}XYhEc2o`fSd6s1%jlLx(EHUyBcFCLM=OYWmvGC6(N49WPtaDw%4`P_y(5 zw&SLul6dX;t!RYt#m^oW$?}*kC~6IdX=%_P{M-y*xzap&jvud?(UZ#cv@+T3V@QWP zy0$|0^Uh-JHu86u=qc>}A*GirV!_VJrJoj*Mt z6?EvalNz@o!Bd=Sv=l<#NVHUxy*f*`cRnI-e6uI65N8NS+GNKwt8?G|TGOE_ty$l6 z)&W1RvU^sjZJ|Q5*T z$2DI26z;fSmy~w2^G)+9A9gA=@eS)1!(J z?0$XAnW5uNgv!HouipzZMeLH_A#L2G;;(d-oAby)s-_~oYWqPeNO*66`v`ML=cvc#A|NfJpwn|VimC)sm-rl9UOn%^Fy8}e#eLj_yKGph1;_XnL? z+@1?aTm~5qKnBEO=|m<|rla58_3rm((S(E|O9tzX zzy89u9?M{v7L0z?!1OJurg@KYD*QTshc1doZ`i$cr>6LTC3&U~EAJi((!zN0; z2J~B*u*wXBop*?euM1>`?vN#D#_0~zfjl9Kp}*7ILQ-PQ_V=31X}VC} z&$SS=5q~&NXz?GgKVs*de-bo(AUH^$=Rx^IjT!NaMme;1SJ7YDTtoGl!{N0bb(Pr`^(k^ z8kyDV+WxMl&g*pg zt{wDhI?C}fuB@DUxr}J#_09Vcwzp;k{Em1_dpY-=cv3R(z^kBCi8CXlAj=%RbmCjx zpK#92I8++Z3EXxL>#!_0FjCWyhF*k((k73&09Ek*Pu^k4a!FEshZJGZf(u^Ur$_Gg z2Yi{h9&p%C*IK1H*u1(OgF570QCF!|So?E*zSP0fCV8i&`gxAikJqwK zRpm9LbfF%rCsl*SHjN6iin%No8IIY6s}jbH`eMd6+3qhVbz@~;e9~}eO=_U z^2k|V@SBXBy7rctah9jD^+w`-usvbSkqxU}%kl|zKmbC`%cR0#munDo!BaiqQ2f_R zftDZMRMwn;52Q(#$0sz$TS*V(oZgX+RK+18Gcw`UY_j-vpidO^cF$_U-i}|% z1)s@;Mysdv*4R-K<4Aw)Y@bPxjq~*o3Z^{qtKpu?Qv|-8yLnD;;NLe2nm}sD6KQKZU*<<&SU&Gt&XziJm{+DKwuDt2}?B zuVl?ZOk2kK<|V0X7^|yFcJL~Wj3P(F|D6D|{)T_Rz{8{XC`v)wo&o+8G)1-}TUFKl zc77LjR~5>q`P(&VsGO3~UERHBqQQJA{M!i*XL$uU1C7L!Zt&D<_Pkpe6*A&~lQMeh zd(s%3Dzwm?ZFFf6$5(Z?Ryq=N6Qx6Ih7qc5_W4V+KW5GzmYLD13%kZd8@l0oI0II- z5i5%yi%)6w`O^NxA8XeH)Q~f}Gv2vB6N%zJRfG;jl(JN>q~hh)q!?y(fHcQ7s^3JI z>j>yEf(Ny`$l(+xE_F8T^W3)^sDRKlVb1=q2e^jBF4_gqgPw<8Y@lCL0Of)$qhk~K zxZ7w_%OOU^00QXS`XC{+!CfZ?rPS4%-;E42STvt zr(bfl-9zEg7(S&KBjcWwYdsOq`yar1_9go7EWXbga23Cz3TvH5SB*(~Qf^Imy;50D z8i+*Gt5np65f_6JLAndp8$>z87>ywiWw@@;9Wrp5gcm+y4S3J zOZi#U@SC3aWu|~J(UDRJ0O$1zX?@rY6ccr!%>5>6#&l?*2`e^P3vJD2|^tXkM~Z-_<*}?f_2=xv%oD# z>M?pqxtsHiKc->R)3c9Lt(aeS#>mf7-<6{R?yCFc>31n4L0dT}v-aTtFt|V*|D#)4 z+AblLt*$kvC|j7OPyWqgkM(?Z1)el>>I~-uVHZSBYL6)YE4dE$vmv~N{%c_>Ja_dU zx;kbNPPZijw6JdXmMQ1}B9D;#%n!5ED)-cbHx5NsEWNBWPN@)uw)+wr?>D8j6QeW& z90GCHvAdi&DQ)izP_Z76W#snFZTH%Zbk?sah)RlJfL_aXh%JMMFjLk?5~@L5#Gn$p z;7oZsZB>%bmsTt}YvrNUw+`+G_HPHcfHqT)XuPdooi0&R*3T+Lq+yEjMq&m%mYP)0 z#gTvRon>4)7nB#6CrIP0aexfou@CqgooK^3*eMGavr=o>Jgr%q#|MXd_{NyYS8a)~ zA`n3Q!LNm{wfuRvc7*bbW(=|uU%PQKBv)_+8ZF+M>#mr_2(3Eut4M<`lmNC;G<^CmFw2q zZh`Uo6rF{uGS{4 zQ1vfjNICZ&LbB)q-5T|+)SBT+JcJ=<_|(YPtLDGs~C53DXe}Ku9>suhY~oW5bZttoqNLtmGhQGo9OXmU7BrC@3B{mHf(0rX|(`F z)2iVXXE8ve6d_2(wPWr)uG!CNVh^wD=VehxGWcNhrX|+fr!D620K@U{*L|LIsuGdk z-a$a8K$dOgEDV=xMa2y^wWNwCuDfB_0qSCqkq05fg>4dN)y)M)`i~9PD7Ktd07k=J z9~WgJ;59+iXSN_rJGAhDLPN>-RTJ8PF-Fd#O`4BF-rh-jhn6%SQ8Dq8+1%)Y(JjBO z?wT0!!`@qK-eH%e*ahH_s9i%$t3xs|b97+Yp$kIxduFbt=CMMK+HMOmiz!u#?8jwf zVimJ+#YYs%*J_ucGN-`A^BT1$gORUX`I^1jxgGa6>8IPBCAgd@?MM+Gwj9_~GC}c?dabDbrU|H;sO_Nb0%;`?TYU5q>Avg;+zO?d!RBEcxT z7EOc+roS6Z%n82JyrH?@N!oj~YUj2yUT+Ep;Lx*AgqG!=M7>4Ney7PBu?wR0F`aI2 z+^dk;YK0-c9x2%>0A|_qGD!ZG(8wNUOlKF8)T|V^xN7F}`_ZHO#?=DFv-ads?62sE8d~d7p_Xpfr%4vZBZNEY zF$-PoXCh@-ih>_BrhjM#eoPjbC__b?9d4hSfNDo(e*8JaQux9De%Y}#P2e4CPd~##NWbfW-^8`~Te-gN1#biHjcN}Kt23TGzaeky#$dVn1ilRxzIb@po zG#t8S%Q#1#!9e;dk6anjQb??$GcH8;3!GNWinFK6Zs=z(q7dVwYXXaKNL0#nEe9j& zZN6v3kg3YX7M1Ly&j3J-*hddarNb@TP6z_VXI~mqG~wIJX;GK4@=9|yiQHhFwc00%tCGZ z3C6ZC%fEX8cLGBV4dtjEd$P}-2_FX^-PJUba8RFhgo$R38ert3sqAsreShonHv{`MIIql`ib+ZEW^&!Uvvbp0hNJ~=6pp_3v-R*?Gyg))rb z(?FpMiFWn9~pb5RG%T#cPXy^s?j6 zB$!SnH(PkTPwSiIC~%QC*dK@~QtP);$OKT4pA{Kiuzb?8(G<0Vu%UoAV< zAyYN33af+(Vc~gyQ;YnCnpoW-NUA*=p1Y`gxSX8FSZV-ju~$#{By|S+J3dvlz;|L= z-}|HY#AYT|m(#-abl9wd?31%&C`R8RV5qwlhppH8cEjnJkG&n@XQ*SXbXWNNAMnTqcoGaS&dKo$Eb)*CLbuE0c=%VE?_9-W zeAai0F^)jk>)*~+Ajk@M>vaF=J)x*QE0q}kennjP*TRvQa!RD1f|1ZOS4c_57E`wJm(UUR|g*FQ$*(?jAb;5IzYxao&M_(d^Ys-bE^V-Cjf2~QgVpcGU^u> z7KHRS-S{c&7WKk9+Zv@tGD$2x#$zWuqiH+RP9OJJM0{jr-Jz}0hb z>d@!HhOT#o&YRJ#uiygJU=q7$k{7wGT(>B$UEHNwf+f`Lvu=fJOaTovl@O-NfPsQQ zP1v%*y!+6H^%;Xdg(;DUNS@PNouD2?Jk{Bl<;aZ-E3Hv_Q zAv?7}XTfNk_9@Dq`q2Apl*yM4z$H+ft*8A)(VywildzgUvQ6ce_Rcn@_)r)u9u%Q* z-Lh1e7GRPA5Yo$0O!9Nb>#y5vzUKwtv<==HZ4RpYBXu)Vi_Ztc-TQAJZ#w*UvN~NL$iMba=G8v$uw+Gm}+bb+T7;v%2L=wT|Bzf?O^QA{u{dS;`!95x9*2 zsLsh$qWTnlJk63vE^qW``Q0e~(Uc)f%fUS5+}Y^1xOqhn$tRha(gX0#*s+IiGhgDSB} z*#*Go9V=u1@odvYpfxik72rSdkcGzLH~Ci1SfU#3KTF{n8;)dtHyZ^wXHTH0dMq{&Q~AT_`QhkqEX!0yEiOVN!W(>o=bdH8X0Dc> zxMBDHCGWwpslT}6mVCLl=MGP~wKg;9Zr6*}$tfl5i2{c{lRaKII*lE1lHc-`Uh%?k zUBmC5N3H3$?+els$=tH}T|}t^_MCxa|Ltb%+bWJ#a#aAwddvH@+Or^`sq63n?ahz& zYcKI@e0GGq1NusBaQoxEe(&HMVU*94v6N1} z{t+teTjR^9+zts+L=hCR3%aBf3!x}f83FB(NPi{~JqKlWA5!FFu1@lDF+u_0)R5q+ zN@{Pk4~HXv1Og@d-NeWH{ak$XJZ=u6UrI#ftQOyuVqk_c81rv}2y_8Xb}qOJLriIA zImJYZ3d9y7SO(M7^7)oNgi0=Yw!=sekX$t3UL%_ShPc|k~ z_GMZ*o(^7eNjI%n3wKPMd`QVmm0zBeWsbQO{8~jI1PtoZ-zid8l@cZ8#H#6fw110i zU}`}1ht+3)9JTIk@!e9b)$Pzq1>b{8n?IkatK9D~_}Ox)qqtC3gmM=6_*HEnL=oeM z(9kcd{6X{khGGmT$WG7U4okAHe6O~`6L7I}&I$c@i{Gf{dm#V~vVw#+jzY@jXNJTg z$N-LFtDuYrX?XJ=2Z6>!m*%mgJpJEjAjrIbI zS&3%6I^SB5+z3=*75-TA_p`WBN^#=TgTBC7U53egT299s%yRQa_^^JByV*!s`F!0Q z7Gy%bN}O$BzXvJ@s+FsOE0IpjA6hi#+PZN9YLl=;npN7$kO{{3g{VM?>E&?F)2c8t zWy_fT!xMfl>nqm10M`os*f*awnXlPHd+)P?lP|o-efV=ZA>0-Hv==#+mCY}!hh+g% zo^H7D?#QkTI8^BoltKJW;~mzFXC@!Y@=kBiP!Kg(qdyB8+p|tioZULPU~_onh0&0G zN30Pt9(5PVxPlTf34#RHp-DKoyYc;Fj#JO=MmCadyd>-E%MvdO^pT2uWa3(~FP@Px za3*)n#u~)G`J5d~$!2#JPnqmc zi@T)AXR=NN2>di$`|hKtTOvvAz0&M$=Q;0nsC@!I7~gjBrTpQ|qbBDOeBNYt(Tw-1 zH6}1)FDx8MCs*)wK^e%QZwx|vfO^BKPlMyfF*r$@JqjG98AGB14I5pV035Ic8oS9R zqetVdweFR0|4{7BlO}JuhqdEXvyC9^5zzuUmcUR1oe(`g#DK0lB~Qie(rT+H?So>e^r_~SQ9lhC~mjjZ_YIab27@~%vcP&3dG))`_i5Knt6@EMK} zrVHGbjN9(H*G^(44s!d$5?DFQ1$6k?W_@ivA2kA8Hm7G#@8en7f3d=DUg5^ab1UHz>Utw{{7@d9f-Vv zSq7${afV0_%v`O~U8#CFmfd3H_4C(#G^JU}lL5kyBBs!B)8pT*zUxO;Khkxd?Q(k< zVFMVzWBKJHhI<(p2^6|(2tvAr??z2lP`D<7Dh_mjFyjkDBkHn8b%t>!4uk`vuaA3- zmupbodRK8{%Xh3P@;Q%w#>bVvQu#U3+ph_$Dq(E!MyMf7x$^KYK0V9tCbIcNt7HQG z4|o$S!uAF%8VaX?^5ezvkgr}w9K5Ks82E5_f&uL*>r*Kw>1E-ro;hv;-t(J$Yy?fM zO<4rzV#LYnB)hE~o%mnV{+KPVH7yC_PwPAlMl=hVNc`wvbPyiRb1IAej@`x>rgW$V_V6nlV7Th(+EvXBX_;*YZdJGrs7fS` z5`Etil)SwCC$rcW54Z~w&fE{hWf|t^L^y26A1s}yjy4+K%MH`x?QkhoCK><_E2*9@ zVN*ca#J4XXFGLs94p`y0K$z zU)R|EqFd)UZ?QvJPd9|BeJuDq0j#33hd^B%UO%l-1eoFhNonwct9WA! zOymsc0U1SYvgajI@_Ms)_@jUi93Xy(8!?d;4GldY6L>2G4cyXF0i)mti~uUG*rQ>PeC zg&asy9Gui*#pk`V2;ZMI&vuA4SrNuOHIyEzK5^vP&3l21fr>n(o9T0bDGcq-^;1%6 zf8O-vzq7rfSqTw=L(OVb2t{u)IQ|rBTmPGK;;=t{a=+(yDl1g!A<^mk6cm7%H5Fjp z0R$m9aO=P$DSmJFQc*`82Un&Lw?ka-&3h>)@F8@p`bd1}wfjBDVpOkJb_?1slvu(eW8z(K0EU*?7 zxP-FoXk0KThJ`?`2eTh&p{F(OZHOIL~xV^8}E4lYVyM;3b8fF zdghExSWGsdbh{=axf?Ra<1SN?hz5jTS|*LQ73?h z58#pS#q1iRVnY}C1tdelJ|rH2uo<>XVo^AEwam`l+(9#Qe2z}#?f*9K6$w?n6RqoO zw&LI+kR-c4{(kj4*OyTL% zkkvIReZ^{H1^71d?GnmQ;T4DZxM5%)jTyjQLL)!}A< z`wWZ5$qFUT0u`|!*=3Rs^o~O)cOi$>z=NMZ!+krq>P*YN8oypRIlEg@45;-be0=j$ zDV08%P?mb}O6j{{o9P_~>q1Ley7nIuVnY&CJ|V~&{Z9FfT>C31_s&-`|VB38Ar`Ase;2lm7dX6-gE+wKCL#2U~ z>f+m%GS`j7rOfM`27%Su}4*{(He4U{b?_^0CHS(PV034s~AcUtiC{+<# z(m4O;`-&F~B}7Ee6O{CEz5DSFWFbO$QUxO> z#=OP3bJ2o=!nt_G{+t|8VTpmD{X3U4F)HPO29hzb=2nna!ZLl;I$StdV1*SupXWf4 zD$CGA*0xpqS)R0Iicy%$7@=56O%z|mV{-QRr)@8flMj{Zc@Y(G;ptsyVYr2sy9Ha{ zCIkVI7UDxfGp73nfjty@MN(bgz_35SRu?i$QxLY7`l&l{xv|(#5}?t)m|ePzNY)sx zOxu*3w=pyhM;4rct}wJ2LfvNYmqQ#v!P(q}z$Rl(`|b8IUlchuMb@{kT!aYU&U5lS z!2<}#80NVfF>0&eGP zCubsoLZc8w-fW;G?Os;9%XWjcJ}dinJ$nU@!|&_5gi8GW>j6l7TMbd$xg& zMfxE}u!2Qa@KlZ%y|4|xVy0#EPYNRaK5G1-Sm)Dva+9md!*=spS#e;^Pwc#Dy*EV4 zF%I|17UA`?2Y^*R4^o(?AZ7ggH?p@6!|3jCtSHrh-~tP{@7{m;zT2Yjcusjl-{7UR zt0?#>U2jbK7%iUyTO;X-;EidBH6KUPTIVxHSaMC7ks4%Ah(NH)FLiI^U_Zp|`OD$% zoWi1Dh&!iawChRVNCAK?i(I;x#HwDb;H$B?OqIMFz3ddapU1_jcOHxd-%-(m0985M zYaDjE`!Awze_4sMD{o#j$o%`FgNX9W8U3FK1h~5Z&jQYbw3XD9l=NV!=}w7AW@(;*&F&qNqIzTvT^p} zrn2(7;$J_peEcD{uQUvC?Z2N*6op{TiF7nptN&`D)5a*Fux2-36adUM%j}DM>x_cr zT!jzSCjgkP_gKshS>)#so{H&$KWiK1yDCq3<=>R`9^xTVzTRw5BSv8C+DPgmv@Y{d zKCFGk6!IGyiD%yzd}5mbxL0-tZD|&qe}N%fcfK_6qVk})oWPAX*bWjc!Tp8=Wv|(e z6QOxello!T=D`U{!rGATl8oT2#EsB^KQ|(`B=-EK`r9|T)87cbl3d2}Zkf*zl-!vb zYns?yQbW0fy4>T=IH)p66+MD;&Do8gG()PXd}URP>o>&&3~Rr8vM`f|y=ts^Z^9`< z{wD3)QsKC>pH9&S4>azn6@-LWIiR!KAlt4lTl>)@>bvpUYiY>Skm`P4hu`t?Mnf^5 z7xc=awx@`cm$jV74hYrY?sUdJ;QoGw#tjbLKQ8g|5r6c{`sf`$9ps!rL`{vCoCzwK zt9;X z+xGV^wSD#NKlC^LUei^{V%PI~xH#St2!|p3^?QUqbRW@IKl!;#Ue$S{K8gfy4@A3poAZ@X+0}1o$)Ezwyb>p zAX854grEBcyM=j zcekDIoZYkY1A4k|_q$TBs$QQ^5Rq8sL@X&Dw5j#Ka3)>m66;&6%UafaIiS%YANndc z2vhzn^C}(T8*beLianG_5*L4R}qfI1DnBLW~yF4r2*ad*MVgF0! zJi%ux$TtC2>WL-!%HHZ7dc-9XbT|BlNPSPt=}Dsovt8Ak0dqRC9r!IPoK6UXSN(b9 zTd`-+Kd2cG26@WnSIu^6KH}q#P!{Q-YhKbR;hCP2%dPLf@+__&qb?Yf^k$B$(F$#D zjY6bNef6v!4Gj^a@Z{j#Ugibw%>6lbkDorUc(`GFj&;{gq4l4icn6+rSAVI&Kd$G? zf2JZNtQLjjK0=Car1(!Hv}SNfJR!yqFP8}+zTA`wwg@D8%12$<>c{Om~pp(y5K{KBckZ3QUrbbDp_t77cHwCSpI0>Q{Y&I$^%!S zb?Lsu#(up#1T%@!v68l%du0#BC2yf=PYk?!T-P%RB*5~VGUc-R$uGrADS zO(25a8v01qO`sGZ4NC$8zWRvf1Oi9^`aVt&VLD_zn4jjEGx4*J>Ii3c{pl}WNxr-* zX_gbNjv+`(ZJXT~D)LG)z$7M{%PAUd)V&@>PF`EZ05(QUMNnl?@~TBk0qT~QfVUJf zo*AIKtc_pjqBgYS_}EAeQaQq#a&H_(wa`dDP?ZQFi77if4at}~Ke)}k9di5ty5lN+ z?o%*^5qM9t#10rFF4VvAX0bmt1kD0Yb#t3P=t2GLoHm7y>=H8S@!V%|M8vIR&WfOP8pa~mi5)t1%dRpacUHYgxhc(s1Wap4fC z7P~$Zr`WbuR`@e`3YOGDajT<$7c-1v$&St+N2;dzorx%)%S_sRC)u>-(*X){?Hfc zpR#TyNU_BB0e>(dWCj3!{h~c`(a#%-7D3@Wr)#)Y^?rMYAH(x~<^+wlvTvj=pf6{} zHZf$ocGA6Mw*XKkbrVP>;u)L6J;T-5+|f{C*F|6cEwIB6+G6d1@5AT7k*QznHiP;Twr~IfpOQtc33oX?+Hi{|vss;*Uf*raO_!4l2 zic2E`Lno1%eFnrDSvG)nIDRZ}Eabu5&>sdo9s6yeWs)NN6jeL!nf_UwsGK<1^_pcW zOW7TV1S{pC&3mB!3(aFhn)a<|$QW|(^4!SpUV~`U-(dNV9<8!w=x@32`K!6c#?FmP z$MLTS;7Qf^^}z$8q9)ZWR1osN6nr*&qRIOw0>G6PK%p6^yxWMFZ5baQHc-q#>NO8w z$;v55n#-n_`LT1f`kZ_IeCP~bH!HZ`KEE;4BJRy0`*n8tZ&CNnzG;vkocw?nnu=VN z_cs}D+hGIHTLxSP&v;h_N)D0Ygj#uWo9s) zy~e&M*~!+P8F#0Z5{wMq6bXU*;<-Sf0oTNg`CMr4?H$MtWQsh`7++WB$ z`}amA%vXi}!k3;5%RH}1*SuU!Jk5LUO!*x%Q`T|ebbN>LIKhAS#J$EP(ow4q7i>M& zpEr+slLWXLf@v^seccS;JDdTr6`x%Ml$C*~@~ygL#P>rS$+mBg6xMGF+AF?s$RQvO zXvN((%mQdI+q{R%8gZDL({TUtv7Dk&eLi{pmcuz(+;GNM=s?@T}~Gt-F}7+9<);yN9=9x!iq!c zyoUFgkL;8P>c{>}GeWf=_Zg1V4O)3ET<+(^dKMQTLX2BX9sf=?h*-wscYo6CnjDPSxJlTJ zLgpL>Stu#K4{zQ1+or#t+RTrdn6h$%+CH~r$<$-%^!G$V(IkrxrIlf_TCrx7hqmb7 z0VOL&n_dNZ&HbkJ$;`+oo;TCVMl*m;-6ICge)dNp5G_FH!*woW%x*d_v|e7VO8>QY`}5Ppj%2o<1iktaFPE*Hxkh<#4W$zMe@TUtTikDQoV zl?8sU&omMz(8&$pe`tbuxb+jXI_G3JN~}0^Td!e7+7K=|ZGzW6_B_wIl%DoEbTl9c zCyhzgPhLNqBm$oZcg2uSyPysJI?}Ay2|so9$5WZEKy??Q?E|IMh!7l?){yzs&@S(b zFYP@)+h;a{kuP?wSO1EX57HSqbVXFRTb>@cX8U0PjpM1BAe|Q1kC~jsw;67}Y>tW> znf5v1w3uJ6ybXG20BnNe=wPf&AkV#HU$AayldD{nTqs82%6Sm?)tD&u;>U*pax!Dn zx_f&2s_P)PlOYQU`@7(i?)}VJw|(JiB$H-{$%&Q5B<{B&7RWxk^_vS_EwBYrHS;Ev zh5kFsspx$)v(11)Pz^Y#gjGickmy0~;l6)-hQXhCVj)>E}sXk>Jc~((xJ$}$%CLon9Hu*^y2#|<`suPM=@<`gX z>YxTV0Q!%vD12*jr>NV^C7kR*8;qKc+etgclsx28yfsqIMm3Wfdlt2g{wc6fU^k2h zKZ0@oxhzZmS7N^>!u;(Sw7`I-94a7GMKMwF$qiw_)VYF~_#*~#DG;P$RvFpguyKSKBFc{~` zLte^J&lhvQV6{~#QjY{|oUFk49)Dhq)10x)c*+083vOD6H~5HAU=!s2@Al8DP+A%8 zhA@oJqw$lrAulK|Lkd6lnrUrg`I-=P5T@rJY0 z=P7E}H^cjlFD4QnsG-P|q=RrmNC>MnWx?PR5qDG>jcKamMZF_7PX{0Rsc31B=15HZuxQPI*cva-~a zR6tM)mOpfKj4X`f|NhRbZjI41aWGBKtTWKl($dnfGfrBGc*9k)K=>SbN_#3$coa2< z$#ycSyKXaSQq(`~@g%|vZM6`UBoy1eKiG;)!3}lj^k;wXhRQC^P_ruYRPt&-*X4}e zjf!?|tYG9;K~6*^7ZLN|$QtPa&?c6@j0Bq`kIBLfpft6!F_ohGKq<*|C^H@6LjErz zC6f=C0=4$1eVK#<&(S*-r2z{QlUpV2gT7e50O5ZgpQeqw2 z?(5!5M4oH}NeHmmb(&@sLLgg*rK_ZS&E)vln{MdSd99nBSjETV(I<<=&6NKbnK+Ji zHbP8;Qi4R3TI5DC*KcadT0wi8P8<%-Cy_Gxq|u5mCSnTidm3+a{mOK|6y_Plf=h~L zU$|Ikgp6SNCW+w0M8&Ik=!pBV;)8$h$#L=<8X2LesYM|INBH|~Jd;*hij$PTSe6ly zX{{X`9N3eIr2vl2el=Yley*Ghj&w?{*d(K$SGmVKGyCOcqaWy~)1xc+|6l4$Aw9vxnc|&D%}* z!z-=PEvg;Sizt~hn(~pIS|f)hI>i8t##$Af_d1r2pv347bxWNp$XdjFRZ0f01 zOiljjw0*u>^Otbe;2iL1j~2#V`f(3Z;zg|cQze2mG#Xyk`3(;TgRG|I*gMy!qC(?+ z>M_MekC*PazH`C7K8F#|;{CFscfutC0f;Lhdmr>r?VJuO>5D4N6~=>Pbw!n3(8xOb z?bh$Mq{$)-QVN~3=a=|NeWtpoVkkIyj|O{Ihs!sQKaHj%cR51qRK4Qxh)pCMq5%zt z(K1$u;&6hg5Vq&|`|d|c{UlGa>+e`GUo6>9N4p_imRlWzL1&{ zuGe3#3R=mXy;SauEbO< zW>vD8L9efvza50}9;V+Y6O3XCnySDAxfkBN?=s_c`V#jS$U~o!glSuhWIv}z3Id@L z(di%^QJ?71mv@#tSTUb~B{ykHPW?~o#e_F$&Oa<#pM+cHoi|O3gj68~ei+l=Ygx3A zvge%}OaPUa+fjL!4pVJNz3w&v`tlTQ%#-A8n(WL#=ciA);~nu1XJ__HLcZ{7Zr z>-kZ)q6N0nGOihaH~8xSjt?dAbrx1Mat6;*j%}}H;N|pu^Q15&* znfN(-9#qqpcl|SH1t^}dOI<&ci92aQ)Vyy5YsiBtd`cp*^vo_Z7!8kT~O$p3@YMz*rRuIENH$sU_ z52@`{_wtzp9EbHFiv=nG8vu`YLq@%Hogz)YEr7iTvvaqbbj8>^Vv74Jpb z>7xSuNNVr{5!mIRYw-}WmHaGPT%0D!Rb1;Na$WsrGE55EErrOcjLQBD;Y{}f2Ac3) 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 literal 0 HcmV?d00001