From 6a6754952d1b34b3d8bb778cf17ae0409ed88d35 Mon Sep 17 00:00:00 2001 From: grizzly Date: Mon, 3 Feb 2025 21:01:58 -0500 Subject: [PATCH] copy dev to 0.5.1 and change version number in readme --- packages/preview/acrostiche/0.5.1/LICENSE | 22 ++ packages/preview/acrostiche/0.5.1/README.md | 167 +++++++++++ .../preview/acrostiche/0.5.1/acrostiche.typ | 263 ++++++++++++++++++ packages/preview/acrostiche/0.5.1/test.pdf | Bin 0 -> 20812 bytes packages/preview/acrostiche/0.5.1/test.typ | 97 +++++++ packages/preview/acrostiche/0.5.1/typst.toml | 11 + 6 files changed, 560 insertions(+) create mode 100644 packages/preview/acrostiche/0.5.1/LICENSE create mode 100644 packages/preview/acrostiche/0.5.1/README.md create mode 100644 packages/preview/acrostiche/0.5.1/acrostiche.typ create mode 100644 packages/preview/acrostiche/0.5.1/test.pdf create mode 100644 packages/preview/acrostiche/0.5.1/test.typ create mode 100644 packages/preview/acrostiche/0.5.1/typst.toml diff --git a/packages/preview/acrostiche/0.5.1/LICENSE b/packages/preview/acrostiche/0.5.1/LICENSE new file mode 100644 index 000000000..b291d1380 --- /dev/null +++ b/packages/preview/acrostiche/0.5.1/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2023 Arthur Grisel-Davy +Copyright (c) 2023 Aurel Weinhold + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/preview/acrostiche/0.5.1/README.md b/packages/preview/acrostiche/0.5.1/README.md new file mode 100644 index 000000000..d5fb582c3 --- /dev/null +++ b/packages/preview/acrostiche/0.5.1/README.md @@ -0,0 +1,167 @@ +# Acrostiche (0.5.1) + +Manages acronyms so you don't have to. + +## Quick Start + +``` +#import "@preview/acrostiche:0.5.1": * + +#init-acronyms(( + "WTP": ("Wonderful Typst Package","Wonderful Typst Packages"), +)) + +Acrostiche is a #acr("WTP")! This #acr("WTP") enables easy acronyms manipulation. + +Its main features are auto-expansion of the first occurence, global or selective expansion reset #reset-all-acronyms(), implicit or manual plural form support (there may be multiple #acrpl("WTP")), and customizable index printing. Have Fun! +``` + + +## Usage + +The main goal of Acrostiche is to keep track of which acronyms to define. + +### Define acronyms +All acronyms used with Acrostiche must be defined in a dictionary passed to the `init-acronyms` function. +There are two possible forms for the definition, depending on the required features. + +#### Simple Definitions +For a quick and easy definion, you can use the acronym to display as the key and an array of one or more strings as the singular and plural versions of the expanded meaning of the acronym. + +``` +#init-acronyms(( + "SDA": ("Simply Defined Acronym","Simply Defined Acronyms"), + "ASDA": ("Another Simply Defined Acronym","Another Simply Defined Acronyms"), +)) +``` + +If there is only a singular version of the definition, the array contains only one value. +If there are both singular and plural versions, define the definition as an array where the first item is the singular definition and the second item is the plural. + +#### Advanced Definitions +If you find yourself needing more flexibility when defining the acronyms, you can pass a dictionary for each acronym. +The expected keys are: `short` the singular short form to display, `short-pl` the plural short form, `long` singular long (expanded) form to display, and `long-pl` the plural long form. +The main benefit of this definition is to use a separate key for calling the acronym, useful when acronyms are long and tedious to write. + +``` +#init-acronyms(( + "la": ( +short: "LATATW", +long: "Long And Tedious Acronym To Write", +short-pl: "LATAsTW", +long-pl: "Long And Tedious Acronyms To Write"), +)) +``` + +Any other keys than these will be discarded. + + +### Call Acrostiche functions +Once the acronyms are defined, you can use them in the text with the `#acr(...)` function. +The argument is the acronym as a string (for example, "BIOS"). On the first call of the function, it prints the acronym with its definition (for example, "Basic Input/Output System (BIOS)"). +On the next calls, it prints only the acronym. + +To get the plural version of the acronym, you can use the `#acrpl(...)` function that adds an 's' after the acronym. +If a plural version of the definition is provided, it will be used if the first use of the acronym is plural. +Otherwise, the singular version is used, and a trailing 's' is added. + +To intentionally print the full version of the acronym (definition + acronym, as for the first instance), without affecting the state, you can use the `#acrfull(...)` function. +For the plural version, use the `#acrfullpl(...)` function. +Both functions have shortcuts with `#acrf(...)` and `#acrfpl(...)`. + +At any point in the document, you can reset acronyms with the functions `#reset-acronym(...)` (for a single acronym) or `reset-all-acronyms()` (to reset all acronyms). After a reset, the next use of the acronym is expanded. +Both functions have shortcuts with `#racr(...)` and `#raacr(...)`. + +You can also print an index of all acronyms used in the document with the `#print-index()` function. +The index is printed as a section for which you can choose the heading level, the numbering, and the outline parameters (with respectively the `level: int`, `numbering: none | string | function`, and `outlined: bool` parameters). +You can also choose their order with the `sorted: string` parameter that accepts either an empty string (print in the order they are defined), "up" (print in ascending alphabetical order), or "down" (print in descending alphabetical order). +By default, the index contains all the acronyms you defined. You can choose to only display acronyms that are actually used in the document by passing `used-only: true` to the function. Warning, the detection of used acronym uses the states at the end of the document. Thus, if you reset an acronym and do not use it again until the end, it will not appear in the index. + You can use the `title: string` parameter to change the name of the heading for the index section. +The default value is "Acronyms Index". Passing an empty string for `title` results in the index having no heading (i.e., no section for the index). +You can customize the string displayed after the acronym in the list with the `delimiter: ":"` parameter. +To adjust the spacing between the acronyms adjust the `row-gutter: auto | int | relative | fraction | array` parameter, the default is `2pt`. + +Finally, you can call the `#display-def(...)` function to display the definition of an acronym. Set the `plural` parameter to true to get the plural version. + +### Functions Summary: + +| **Function** | **Description** | +|-------------------------------|---------------------------------------------------------------------------------------------------------------------| +| **#init-acronyms(...)** | Initializes the acronyms by defining them in a dictionary where the keys are acronyms and the values are definitions. | +| **#acr(...)** | Prints the acronym with its definition on the first call, then just the acronym in subsequent calls. | +| **#acrpl(...)** | Prints the plural version of the acronym. Uses plural definition if available, otherwise adds an 's' to the acronym. | +| **#acrfull(...)** | Displays the full (long) version of the acronym without affecting the state or tracking its usage. | +| **#acrfullpl(...)** | Displays the full plural version of the acronym without affecting the state or tracking its usage. | +| **#reset-acronym(...)** | Resets a single acronym so the next usage will include its definition again. | +| **#reset-all-acronyms()** | Resets all acronyms so the next usage will include their definitions again. | +| **#print-index(...)** | Prints an index of all acronyms used, with customizable heading level, order, and display parameters. | +| **#display-def(...)** | Displays the definition of an acronym. Use `plural: true` to display the plural version of the definition. | +| **racr, raacr, acrf, acrfpl** | Shortcuts names for respectively `reset-acronym`, `reset-all-acronyms`, `acrfull`, and `acrfullpl`. | + +Shortcut names inspired by the `acronym` package for LaTeX by Tobias Oetiker: + +| **Function** | **Description** | +|-------------------------------|---------------------------------------------------------------------------------------------------------------------| +| **#ac(...)** | Same as `acr`, display an acronym.| +| **#acf(...)** | Same as `acrfull`, display the long version of an acronym.| +| **#acfp(...)** | Same as `acf` but plural.| +| **#acs(...)** | Display the short version of the acronym, does not update the acronym state.| +| **#acsp(...)** | Same as `acs` but plural.| +| **#acused(...)** | Mark an acronym as used without printing anything.| +| **#acresetall(...)** | Reset all acronyms.| + +## Advanced Definitions +This is a bit of a hacky feature coming from pure serendipity. +There is no enforcement of the type of the definitions. +Most users would naturally use strings as definitions, but any other content is acceptable. +For example, you set your definition to a content block with rainbow-fille text, or even an image. +The rainbow text is kinda cool because the gradient depend on the position in the page so depending on the position of first use the acronym will have a pseudo-random color. + +If you use anything else than string for the definition, do not forget the trailing comma to force the definition to be an array (an array of a single element is not an array in Typst at the time of writing this). +I cannot guarantee that arbitrary content will remain available in future versions but I will do my best to keep it as it is kinda cool. +If you find cool uses, please reach out to show me! + + +
+Yes it is posible to build nest/recursive acronyms definitions. +If you point to another acronym, it all works fine. +If you point to the same acronym, you obviously create a recursive situation, and it fails. +It will not converge, and the compiler will warn you and will panic. +Be nice to the compiler, don't throw recursive traps. +
+ + +Here is a minimal working example of funky acronyms: + +``` +#import "@preview/acrostiche:0.5.1": * +#init-acronyms(( + "RFA": ([#text(fill: gradient.linear(..color.map.rainbow))[Rainbow Filled Acronym]],), + "NA": ([Nested #acr("RFA") Acronym],) +)) +#acr("NA") +``` + +## Possible Errors: + + * If an acronym is not defined, an error will tell you which one is causing the error. Simply add it to the dictionary or check the spelling. + * `display-def` leverages the state `display` function and only works if the return value is actually printed in the document. For more information on states, see the Typst documentation on states. + * Acrostiche uses a state named `acronyms` to keep track of the definitions and usage. If you redefined this state or use it manually in your document, unexpacted behaviour might happen. + +# Contributing + +If you notice any bug or want to contribute a new feature, please open an issue or a merge request on the fork [Grisely/packages](https://github.com/Grisely/packages) +All contributions are welcome. +All merge requests should only modify the `dev` directory. +Once enough modifications are added to the `dev` version, a new version folder will be created and merged upstream. + +To test modifications locally, copy the dev folder to the local directory for typst packages as version 0.0.0: + +``` +rm -rf ~/.local/share/typst/packages/preview/acrostiche/0.0.0 && cp -R ../dev ~/.local/share/typst/packages/preview/acrostiche/0.0.0 +``` + + +# Acknowledgments + +Thank you to the contributors: **caemor**, **AurelWeinhold**, **daniel-eder**, **iostapyshyn**, **ChHecker** **Drodt**. diff --git a/packages/preview/acrostiche/0.5.1/acrostiche.typ b/packages/preview/acrostiche/0.5.1/acrostiche.typ new file mode 100644 index 000000000..caad73541 --- /dev/null +++ b/packages/preview/acrostiche/0.5.1/acrostiche.typ @@ -0,0 +1,263 @@ +// Acrostiche package for Typst +// Author: Grizzly + + +#let acros = state("acronyms",none) +#let init-acronyms(acronyms) = { + let states = (:) + for (acr, defs) in acronyms{ + // Add metadata to each entry. + // first boolean is "is it already defined?", used to know if expansion is needed. + // second boolean is "was it used before in the document?", used for the used-only filtering in the index. + let data = (defs, false, false) + states.insert(acr,data) + } + acros.update(states) +} + +#let display-short(acr, plural: false) = { + // Display the short version of the requested acronym. + // In most cases, the short version is the passed acronym itself. + // In the case of advanced dictionary definitions, the short version is defined with the 'short' and 'short-pl' keys. + context{ + let acronyms = acros.get() + if acr in acronyms{ + let defs = acronyms.at(acr).at(0) + if type(defs) == dictionary{ + if plural { + if "short-pl" in defs{ + defs.at("short-pl") + }else{ + [#acr\s] + } + }else{ + if "short" in defs{ + defs.at("short") + }else{acr} + } + }else{ + if plural{ + [#acr\s] + } + else{acr} + } + }else{ + panic("Could not display the short version of an acronym not defined: "+acr) + } + } +} + +#let display-def(acr, plural: false) = { + // Display the definition of an acronym by fetching it in the "acronyms" state's value (should be a dictionary). + // + // First, grab the dictionary of definitions of acronyms from the "acronyms" state + context{ + let acronyms = acros.get() + if acr in acronyms{ + let defs = acronyms.at(acr).at(0) + + + + // The Definition is a string============ + if type(defs) == str{ // If user defined only one version and forgot the trailing comma the type is string + if plural{defs+"s"} + else{defs} // All is good, we return the definition found as the singular version + } + + // The Definition is an array ============ + else if type(defs) == array{ + if defs.len() == 0{ // The user could have provided an empty array, unlikely but possible. + panic("No definitions found for acronym "+acr+". Make sure it is defined in the dictionary passed to #init-acronyms(dict)") + }else if defs.len() == 1{ // User provided only one version, we make the plural by adding an "s" at the end. + if plural{defs.at(0)+"s"} + else{defs.at(0)} + }else{ // User provided more than one version. We assume the first is singular and the second is plural. All other are useless. + if plural{defs.at(1)} + else{defs.at(0)} + } + + // The Definition is a dictionary ============ + }else if type(defs) == dictionary{ + if plural{ + if "long-pl" in defs{ + defs.at("long-pl") + }else{ + panic("The dictionary of definitions supplied for the key "+acr+" does not contain a plural definition with the key 'long-pl'.") + } + }else{ + if "long" in defs{ + defs.at("long") + }else{ + panic("The dictionary of definitions supplied for the key "+acr+" does not contain a cingular definition with the key 'long'.") + } + } + }else{ + panic("Definitions should be a string, an array, or a dictionary. Definition of "+acr+ " is of type: "+repr(type(defs))) + } + }else{ + panic(acr+" is not a key in the acronyms dictionary.") + } + } + +} + +#let mark-acr-used(acr) = { + // Mark an acronym as used. + + // Generate the key associated with this acronym + let state-key = "acronym-state-" + acr + acros.update(data => { + let ndata = data + // Change both booleans to mark it used until reset AND in the overall document. + ndata.at(acr).at(1) = true + ndata.at(acr).at(2) = true + ndata + } + ) +} + +#let acr(acr, plural:false) = { + // Display an acronym in the singular form by default. Expands it if used for the first time. + + // Generate the key associated with this acronym + let state-key = "acronym-state-" + acr + // Test if the state for this acronym already exists and if the acronym was already used + // to choose what to display. + context{ + let data = acros.get() + if acr in data{ + let short = display-short(acr, plural: plural) + if data.at(acr).at(1){ + short + }else{ + [#display-def(acr, plural: plural)~(#short)] + } + }else{ + panic("You requested the acronym "+acr+" that you did not define first.") + } + } + mark-acr-used(acr) +} + +#let acrpl(acronym) = {acr(acronym,plural:true)} // argument renamed acronym to differentiate with function acr + +#let acrfull(acr) = { + //Intentionally display an acronym in its full form. Do not update state. + [#display-def(acr, plural: false) (#display-short(acr))] +} + +#let acrfullpl(acr) = { + //Intentionally display an acronym in its full form in plural. Do not update state. + [#display-def(acr, plural: true) (#display-short(acr,plural:true))] +} + +// define shortcuts + + +#let reset-acronym(acr) = { + // Reset a specific acronym. It will be expanded on next use. + context{ + let data = acros.get() + if not acr in data{ + panic("Cannot reset "+acr+", not in the list.") + } + } + + acros.update(data => { + let ndata = data + ndata.at(acr).at(1) = false + ndata + } + ) +} + +#let reset-all-acronyms() = { + // Reset all acronyms. They will all be expanded on the next use. + context{ + let acronyms = acros.get() + for acr in acronyms.keys(){ + reset-acronym(acr) + } + } +} + + +// Define shortcuts +#let acrf(acr) = acrfull(acr) +#let acrfpl(acr) = acrfullpl(acr) +#let racr(acr) = reset-acronym(acr) +#let raacr() = reset-all-acronyms() + +// Define some functions as in the "acronym" package for LaTeX by Tobias Oetiker +// https://ctan.org/pkg/acronym + +#let acresetall = reset-all-acronyms +#let ac = acr +#let acp(acro) = acr(acro,plural:true) +#let acl(acro) = display-def(acro, plural:false) +#let aclp(acro) = display-def(acro, plural:true) +#let acf(acro) = acrf(acro) +#let acfp(acro) = acrfpl(acro) +#let acs(acro) = display-short(acro,plural:false) +#let acsp(acro) = display-short(acro,plural:true) +#let acused(acr) = mark-acr-used(acr) + + + +#let print-index(level: 1, numbering: none, outlined: false, sorted:"", + title:"Acronyms Index", delimiter:":", row-gutter: 2pt, used-only: false) = { + //Print an index of all the acronyms and their definitions. + // Args: + // level: level of the heading. Default to 1. + // outlined: make the index section outlined. Default to false + // sorted: define if and how to sort the acronyms: "up" for alphabetical order, "down" for reverse alphabetical order, "" for no sort (print in the order they are defined). Default to "". + // title: set the title of the heading. Default to "Acronyms Index". Passing an empty string will result in removing the heading. + // delimiter: String to place after the acronym in the list. Defaults to ":" + // used-only: if true, only include in the index the acronyms that are used in the document. Warning, if you reset acronyms and don't used them after, they may not appear. + + // assert on input values to avoid cryptic error messages + assert(sorted in ("","up","down"), message:"Sorted must be a string either \"\", \"up\" or \"down\"") + + if title != ""{ + heading(level: level, numbering: numbering, outlined: outlined)[#title] + } + + context{ + + + + let acronyms = acros.get() + let acr-list = acronyms.keys() + + if used-only{ + // Select only acronyms where state is true at the end of the document. + let acronyms = acros.final() + let used-acr-list = () + for acr in acr-list{ + if acros.final().at(acr).at(2) { + used-acr-list.push(acr) + } + } + acr-list = used-acr-list + } + + // FEATURE: allow ordering by occurences position in the document. Not sure if possible yet. + + // order list depending on the sorted argument + if sorted=="down"{ + acr-list = acr-list.sorted().rev() + }else if sorted=="up"{ + acr-list = acr-list.sorted() + } + + // print the acronyms + grid( + columns: (20%,80%), + row-gutter: row-gutter, + ..for acr in acr-list{ + ([*#display-short(acr, plural:false)#delimiter*], display-def(acr,plural:false)) + } + ) + } +} + diff --git a/packages/preview/acrostiche/0.5.1/test.pdf b/packages/preview/acrostiche/0.5.1/test.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c44cff59f06a90ce539008c64f8770f689b50c4c GIT binary patch literal 20812 zcmch<1zc3k7e6crB1o5j!~#-MODwyzgmg)_)B;NjOG$|!NGP4s9fE*>gdj*sh=7s; z(jnal2>-k2^BBM97w`LjKkwdw-FxntnKS2}sq>u~CN*gpP982O4%2<$gM%Xg0)rgQ zY;Z(Ga6lk#O;0B{h+D?d0g1ZPa5Y1o6HsI@iXv(10!KXsaVu!bNNTFGD1b!cDQ^LHKq8QyoN}l*w;aqJEf5Y?AnxDk(r_1ZxPyhM0}_>@3&;Qp zh@x(EE{3C)0|JNz2MMBRIAUTr04GXJ92C=kl~+n$8kOe%GqF(_0}(YmU662lc?U~J z(78?ksyf^X;evGb1hGm0LcrMoPJpWFYylJ*C>QHr<@)hJ!_~>j4sH+V0EAK+AUwd0 zk_S~{XM_{d(HR6gFBd?U);VY5)&UuS0U87h2JrwFlphS@1ulMw0EiE`_<3OWqKtv!RD3Cw!1w;pO;0O2s20=hp2$vx6 zfr5AeVNtU4gLrvR0fPDh#ODQahk$tbP(c95gZDf@1W|IL0z?4d6F>zBuOJA>0tiqb zU!br+fbauM02wF^pbft7K@cd%d4K>Vn^?QYp zQZ{u$-RUT!Z1%jS$RO;HaA)AX+nFNa(r}b9qtXP-2ySYRDHHY<~4{O|7Izq1xG9=>%aYRxzVH_7y+59#CLuy~=UjUizJH!-ADn4+Wgqpw_Z zNxiw>a4w5VPrfuV`ugsDMg3tLHo5f2>u&8(?)u_Lcd@yvwbjqovejq>hUQ$!TC1`H zy&la?Kqrp#@&~9oQd@a;X$mzHE0z*xyl#6Y(0lsX3m3WVYlcx~DSdXz*;L)0eqEhf zA1Y7k#)6w#wzGg+JCN39L3sRrq0uq<3TBjKyH*9WFLU$BN+v^8+4QFy^`u{Hmv_bp zugdwp{%CmtGvwhN#8WAWb(8n}_o7erLi0=f;xlLcj$J}3XA2KqoOn(qgB6py;Gnn% z0#O5=IiokCHKP`AD$(8%6-r#u?3AGLN;$Zoe_u_*UP90sPtrZ^mVQ}pj*Q4`l! zI1DO9-ylBSB`?~#28Ur|4^pOMs6c09n%LlKC9nuBDaA{J#HYLkD$}CogMCTmHk}UB zEd*q$sua(i!W?!CcYD8jMkKJ}J0^Y{7+4b!a3!gjVK<(grlarsw9kEw4MKow+S_@R8z^Ty;Kj0-TozuW6y+drw_%q~|K+d~6h=fJ9rj?CI8WL;bmd~|uX z-Q#wUtD5FLwBTFuUHW5r@(Fzn?*<@<7ilT0@>i1uCUge!6f<(K#NlfamhoowJ_^qc zXLpF`@t&q#-%INoi0|LJmoA^4l9saLeRfu|ad1kET59Xi~O(=c35R#w)fIiH?5 z$RgUpQ42w47A`kT%}3qo1(>OVwpsj1+edy+88dImp*Mx~ z^QvbZ+xhY04JV@y>q!Ey0Py&NGwSScqm3* zbVRmYOgm{hnSY=){(9c`2(9fRw561RyXV`x@%UQ0?K_Db$yP~cb~&bfe&&&FhF1wL zU9&uLed#tnRQ~zQF@<2I8Gi-g_13=nj8xo77Ry%xe`Mp;m0J7RJ}lEjRV?2oD?3`d zVJ~98%lbK&kLZ_PF%*0jm!-0NV6|lBkW1fCcJ%(l6eQWjq3uF*NqAIl=yF2^zt}_4 zFINk+a;T*44cbUmYrWf3zoTX(%9sO1mJiw#+%}l)kM&z?IZ0Hx_PPf4KDHZaFZjdKzP*jveg5*} z`YJI|R%zp_?vbU$4J1o*HeEq<6Fjl|2xkE^0JrEX4U=s5lNpuz7B^CtSW>n%>GF44 zhG7tB)ge{1!3;@Y=TibA{p!YBd?q((EXqacgmo#BUhC!RT!YI%4l3LADoJu*x@fcQ ze&Rn2%oOXA#UnU~?AV~{ny}PPEX@>Y7+AEzveUnOY+_n=6~p`9=>hwN2JfM@wdUY^ zMvhN1z@$RG_q!#rl(WZgw@^#>U?$FFUh3Kk|GG5)d`z!WKY*NY>?jU)sa6L zXGaS#nW(ufB1S#K@8(|5UcOHLRpo(kw_cI~Y4Ov6lE+`feaz|{@(erfsCgt`$RG2tU%X_n^vW^b_qBp^ z*dq3eH}oFl)%`mrv=x{5cZGa!edvEO5Px9${sIPGOV9Q~y!La18JdOBB{mif5@NR7 zOEV$%k=gcj0?H02Wncq4dY|LM~#=Jt_(0V3pg1IKhfqL2*@y zCG!{+d1IrRIx`E~QwucD7i-?2``+O>O+5xVyN-Xuf{_QbJs5JW5;hVi2{;`>tP>|X zx0|b}*14*@D%$ZtU=B^}o;^-Cae8Q-d-DXxS46e%)x|Ks+pLrFpo?|nMkQ#sN>7is za%4Rs=OYgjymVCvzb2s3t|m0yIjlH+Lvl$|r3;sLHl~u@Fn{1nRc~sUSPFlX%s}jh zhK^F0B7ZH^bVJkReSuO%QA1O9#~XMxuMg$IGhXdaA@7?vne1_+J{2K*7!x|}S*FBb zvqI}%sLMGLbvd4PMk9gd&FndXbGhQ%^SQQ8-yd~~salp-vpxVjbjQJ8>=XFhpO20zL4Bs*&<}U5GqHRtON5Xia zH)27a{OFf=@MIfBHzKAM7ZGHb(m1kGQI;p@2CoBi7T2Xns6z&w4Yfbr)(lSdZ7A$i zjx8#AsA8xWnHgs~I$A1W7J1SEU3zI}RXZwC>D(ifeMz?T!;6tvmR66>k5)HJgh+Ol z_~PU;yO^9c*=)3kbhL7m4Z^m$Cgt_i5-4*_KZj>yIuG68F+nCI_46N9h-hRnAdLX?q{cH z6^=~^dCwH0jkG&><1TD|>xSiD8>cCI9&}3c4Wr?qrM-`X`MqVPl!J=x=bK7UP$M{x za)9E6DE?*VmNSOUuRP^mq>{L`U+XV6+#wR^vXhW#D}7PZC9ZT7Zma-;lJ{qJFXbB- zPP&Oakz1vH+YtV^Vf1t#bUUw5bEXn6ezVX`(W>^TflmJtM>AE!vh83HdPCZjPft$I zD~Wv4ZEsU(QtT+X93?AmPWZ(Imm_}swlrZ^^@7jP5*48W|MUWqyva!a!ceKwg+h(p zkb7LI_a5Ly7}=EyYNwKTkzP$0V(~2BUr3%*(ECJm^>$L_OFM#US5@Ozk6@%s;h9o> z4IxDhzE%WpYbLA76#azc&){CvAhtp8?Q=Z-4NvaMqhheUKMZ#p0 zqoUY5vUZY_EXVKF#!s#3992vUp5>*L(Ry4+3jpT~zdjnGZuEJXV?#+^#VF1bM97p+ zI~IYHie(eC)mSo29Kqsp+}iNKXz6sR)&41iiXTH8kzOf8=V|_YbPtx-B&{C9o2W_g z#GL!)&j~c|c|CeERNd&ZRJgi7XYMh+WmIxk33r@3_2{C|%oeWCNTsg}lW}PYG!|CV zGDbT{nZlA6=Dj(-=yiQ_MI{nx6Z}Tu{@(a-1mEta?-ZGD*e>qz>^Io!!mN)5ag!V( zCkpEKaQt`ih3ARQNy%xldsGLjR&c;_p1QtVXL67EAPfJwH6`HTP zZ4MBq(6`NAYE4b53D%YmbzDWqJfNwhm!_BePY|Y6+cggG{Y{XbK_dQO5N-b zkFu;bQ|;ai#v8^-#|zVE6or1$G^LrR0n`?&Ry^qkLM-ADsg_G>#wAURpijqd%uosmL_BN9gllV8HVq1!LuE+Aw zCFt#RhdKGwK6%z6Cg#4Y3*{M^tpkUn}BXp zFkZ@QiYqH>3Dwf}ZSy&?vAGVJGt8Z{k$I9;#JMk>V=pn~w(^<9>^dt&+IfcEuR2gr zko#&(PbSJXn*UszH(J$&c7N@wZO5l~_Et{jLANb$USX@xquvpc?e3tKDV{8O>3pC| zO6GUd({29N;aGm8qz{N1t?>+J3!YFA5*O0!ePz_0jU$;K4BWdeE=!zb^k^;Yn!jGlP-BsHR{x-G{{zU! zmFO>*ljlgUg%+5lBnYZ3J_FrX28&ZPZgNk*&a0ZY+%S@TOs!(&lE~u?CTE#KFS;J9M}}#Gxt6+5Kk2T4rs!*y);Vpd(%Q#bEvn_DbCrdX zu-M}o(Xo+78Tl-BBHa`hywNEioYlryEu_EY%bB_gr+PMZGMd?C20J0_$+~kn#AZ!U zB-AyXS1%=SR7M-IHeT>d=*|rZ@yl6}!#1bLFZEvAYkc>F(;FQF?3ifrutpq*RIYRO zvJZJRO<*yJz2ILJ);&z3sYOe^P(SVw$EVE{#!IB_THI_i|K$@NXO%VQd}i|9s=Y@N zB@63A@}UBzwm09Fx(p6a`pQS)T`L`NJ8>&orBToFc9TE?jsxx*l1nV8e83kOsa?yDQH3sK()4Qt&fA zYp$1BxM;QO6|dkeEM}GIJ@n>T*FQFPQZ(c`FQ>^M2w1Y4qBq_wE7X*oFgFaqPVY6} zHB!uiq&Shu6Ml zq(8FXpQgB2Y|>+Ht_90|z7+@C(xz+!TeE2Kdb>?%Nafv0@L|lWX%>9#S3&{r&r*@- zhYzNO>HLHZqVGTyz!%&~I=#mNRXsc*NlG~DPK|wSXIRU#6!lJTEuel`P{Lk`Ma&hp z+*@WGA6@RmhPrXS@hD5)y(uPw-tXTve#$Abi)MFuU)FGOm}O+H9!VnPuCbv$VdNOY ziIyravq+&)C$&q}fNL>5+JP&egJ-g-?x7(Y)-Wt$s>NHI-qRJDgAtQ&Hqk%+YOeC) z%-fNRq3Cf&x2tFuf~>p>L!;`0@1oU)khYd&L|^13Wt{z>#U{*X%HsnYPqpb=P*~Ec zWEFvkWx^DMGYzh|1{IZvUVHmyOAG(0Gy4twF`4?_!(Ldo-BATc5Wc;+{*aWqcIw(# zjr*uC^z14$Qg&nS^?mQCt+Sx}@PnFkD=QUJJ5^oEllW6k>1Oni77uGmXBuPQr+({< zFWM}45#+n#YsBoX*va)DZa`hrsKi{KAU_Y@u~6n9IS{|N(*kh|=(K3WmzY*gdonQ8 z8P&F;zI{1~^r|rA?i9nYFw*TIKm7fXQ>u)4-&ocpUIH?fQg|asO2L8NeIs2UXKKIh z1BP;|D-{m{Pru5h+0oi9=&+1I&r65TqDQ$(-M&LrWx0Ko5lUA+RLKjg`$%6)He>o# zcxu$-jOEn9cf$JVS|Eb=#7v#K-V5i2u&d7(5&Fj;PB+JE#*L4BYjR-=kb|e>N?9lB zyj*U>vC;|qiFv#@>JA4%iz5ny^SYi%xdZK*D<*gElk%Ln#ZJG>&K6&I3FhDFNJ*HK zb`iYZ8hbB%^dTq6|1e`CidB>WBTJ%n`xTO zlE#aTP=3*5?mhSBg9VJk{WJE>cl{12ZoVhN@SB;D6KBx8>TWE~t7}pUw$CQ`yT#0&iv(YtK3NSGq$1Df%7Z~^moMR61 zNK-q6xrBq2-47401PY!&f?$IDsC2%g6-W>#FaNpYSIX2$4vw(0MgmT92#P@iKn=73 zr#X!4{5h%!fDafBc-c{|yx%Ykz!(3|Wj;^mKY%WJs@e(~djA5t0QiKfovHKxTigWz z1pXCx0lf8pN{wRsr#JPR)W5nOQ4fA1M*mrO6z~6U=nDXRpbCe2t^W+a@WTM;0d)a( zf`VW8pa3`kTzrB6JOEsLKj0S>+=7B%AOI$Tf?xRg0VoEzP*BJZ_yzTK4!=N9V9GiC z!Vdw!lymq61?zl=Um&PQ=kUup1auC+KmcgvJNyDcJvxV9Am6bU;6EyF6z~E-C@4VX z9BzT|17GKG%P-)}ciaWV`WqzW>AjvM1;?Ghgo2jZXTnfE3484@4dfnM<>tYw!n{6Mxa;&d&ZU(THIuzEjB)?ik z!d?F~l7MUe>S*<|cQKD>>>l^7bU}xoFbom)*OQ3C`dtu}aHhN4b=feYIu4<{&DRAf zig&zgs%W&lTuN_+a!f!|*v3hGYM$F$Ihqkuc@ZY}K6<66T+M%#hcfvai^tN_1%*a= z`j#7%G-8a7r+d0lk483q;*3HM0jy<+(2?+)Z{gkr9(|5+g-_I1Dr8+U`(Gg6tBY)m zzt{~uYx{uNrLs8lzCQ>#Kai_5H=rSMQS`w=2Idk`C0=X>ml1t6Hh&nA;!QraOUYQ# zJaU;1SKe?r(^&U5aNNXpi^?G7Vb+$DcovDJzH}>#ug!JoR;J3EsF^yl%c-3-tO4i? zS>UVKemE{sn;AoD_p#yvJl^A7=F>>b2o$f9!u7J;&`vwW8W4=} z;oTJdw35f8Y1Ucy?xYik%$GBrI~Zglb>^*$ZFH=Dj_WKnOC_!>B8E?$48M(X;7x4Y z(SSDIIC&T*d~(U--luPv^V__-|Iqya73#a&;;e!xM01;YZ1 z>}7SeMuIk{{!4w^s_u_NlOro9M}893)gR*T_$JITEv9(A|JLZz=w)QYtn7T()pgG^ zn1(j4%akQAf9;6^T$X!;j4XzhF8<4jL%>DXo=8vACyNb+VAZRJ%w9tG`YpYa2ox<3 zGsMN+{3hGla?b>9kb5Z#k6)k6Kt6q4${eO%e0^-}Vl-}OBuZhRBg_0y*8WMj!d#i) zsBKL23yo2p@|2|64RTIz`~C;Fu3T;4`5-P}vv62xxh|(18WuX$W0=|-qO732<9gS# zy=`#5O|rq<6%j|P^g&Jhq^njn7d!)jfe#2;TATex#EH+3g|Tac2d}r zWx6bKT+n)J-?`uiOmgj{tXJ2b%yjt#?S;Qv!+d#lf=fwXK>o`q^gumgSQG~lwR>@w zj)iU;_aJ=x*}*Gl+n2Z{CNDQ8bJ3Pf!x0zpQ%;kjvyU#5^{?K8d_Pz!9fy7u*|EI; z?DN*(eRfFivU`lOvmEWQXq1QHw+&ooUF?r0Oq%uLTTZ)tsT&zPByZ8aOmB>*vm(G4 z)bKZPH|O!!J;4H+R`*p6#Jiro!#K4MRob9)WRPmQ#Kq^>C3rkvqhK9dsEM2tyDiJF zuS>oS_N0&s3M|4+Qj*~r)HG8^Vf(|aYvwY$1Gxr|H- zg__2J%y%`~v+1rbOA7~QUk!a3(xI~)J}G)Pu1iv|N+BiaBh3)qfQ~6yos^}hzB$l&{bN$DuCM{!)Cmf5VqZ{n0DZ1xsa&=N&lGW*Uh=fZsM0*VOkfc`(Ume} z1(QO9=sE$mIhk!$4)HA|n>eMScFeuK8S>rMmLo@T9Gg#ap3gq}vSxWl4mt>16bfqX zYP01LQ^_qZtjtx*^hWjslQEoOEPMm#C-TM4RF`uNKL^EYSg;}T)_u$s% zuGF}SDGf~sNm0dR97f!?i+B$lS4~txR#NF-;&<3sHrA9~=FSL_lk`sw>JS}Dimt0a zwiQ}S)MVG(lDlWAAbA@nnZxcL0ag*6^%(ChY=;cC>un6U_eMp<)G9l{anfAGJ8cYN z?PS~1n8f!o6IqBzy9WCnE40dA3La)GaQCph=O>1-k4tX^^6#iTpcp%H%FW72B<-6o zq^b_jjbfG8;-Tp*Dy)cqU7WX{nKBk!qTuUFcjfRyGAUg*Sda{dgve8RvY8@!4Ps?+ zd~`kc;Zr@itGF3(`LOLPxW&E(fHlXD$GvL#qOwwRlC7C@`&5oD7`$jJ6yDf_YH3P zc9+lu@+|sdOf;{)@CoiAe^&fq^R)gMotwYa^n-V3otgc*O4dWY?z$%2mn|oSs?mG> zCkx>2h|N#>!Y5GsOWv|4|OtCexTuj1Bh6AbGyt)g=q8p()R?#O_!KPNk> zWN2YHdLbn%he;np*Y4>wv)t=o?{5JuO(*us%M8bIPxtuy#hb+*S75Ot9wh6BkYO5J zYL0!H&*=By(`Et9gUh6~Dma)oX)_515_U>2v zo5mg2U%Xs98e*S%ryAwfH_;ugvmAZguWgXq{D^T&y`d(sIO__g;45_gs51B2DJH7K zhAiKA159Z31G^7{sfxpMZ6rChOafEXmUZ(O>$DYB@sU^MT8YuU_*!TXeoXc)uLUaN z)8qsl?FV#)c%&YB@r<+widCX#X2?B)=adP`FHPv2JO=12aT;7v#;Ok)C&n zHpN_?9lh{PA(F}UlA_TyyVS27r(ZNMPKEA>erK-R;NvOxbf|k+M{)5(yBEnJQs$Hd zbfqOP5rfi{nQ=>@3WrDI5sSzCGGAW2m8=Vl?c%wpCq<>i{03~(s-1HqnzIj!V~2>H z35Q9Mo?V-@?EQuS!~kL+y3ANAC{0X6LZ<92Bkv}eLf*|icfI|EM#X?j%#|0{k(;7; zo?t`Kk7j~&QoeHYC0!Aba$%t^h09&@yn@pqr9iNj1wX`moYu|EKaKabHlob=O!I{Ms?z^S<@->y(wa<~^ zjBAjxptDr@>;AMd$o?D>LIbG~z!+R@KJqvJt<<*C?4x0`n^WNOwP>=2 zM8E0PuR@=uj^lk4!7{-gS8J??E$#&rJ$);<89AmE3|)IxJs33TVfaN}PcLMpOD=Rq zE-b@<|0c3u9>L>Jzj)nliTQ}-C=Y9(g81Hz`P(&`H<+BZe2qcSM6RJP*rK5+^)^dl zC-h^B{aKHPL?C`FY)e{hr4 zJ3y~rZ7jpF4hOxCmKHMxSGMcMJicjIQdn@pEA8bYA%;Lms&nzd6d;8in z>h|6u*&)W^#jV|I7kH<4t@qKxRotd>*myl#h*Mnj<@;V?(OOq%ViKiekh)BUM^bT{ zbM^|^k4~7aGvlZ0pryBm@LpW5=~EyJ)DGYJk{tMMDdbeaOL+2w(b*(~-1)4($Z=u) zQ%sro8@8c9GfIhvuMBA3*@=x$e0-EfV|ZmEfw}i#Ooe$I*{FwQoG#q_wrF<&Ykz`i z?>@Go$C90kh+in%v(W!SUwVHnX2b%HobK@`tSnsJt}%L8~4 zQ}W4|E(;}Ye-kaER-?r!T<8798rO`~iyMSbPZ!|Mn)c{YtC zmUF$^6*91#ljLmXB6M3_Mf%2(1Jm%bg_ynCcsGwJL~!d!m-H*l+P%4*2F5s2DAnYy zU3P}3s{D-JDJ6HYX5u|H83Q7D7J@M(2w*#q3iQ zn-zw&ptP}$Pp^OqNLQP>YQj8}2N4(=5)jB6WM1ig$eR6dzD|?{X&rU zQ&s589=K%-MQ8+_VGP#<^ScG6N_4Y_#pxSnGAp!F9i3__%HrTRNK|^sj$W1Zv)Eg# z>`-I4?(y^_H4-d=8+yGxDAM9>dOAtnTiS}Ms^BH+;SCy9Rh(fO^o9DXAK2`ajS_Zw zX>lt=srH7hP+WA9HQgH|99i>Le(Jw_J2*Q%b-eQSqazIwvPUOvvmQ3N874<$X*G-< zb^D~M`_<$D*!K2vp8{JTmASVV6yAqlD0E01w#;(CmGdI=W`chcDpAswSt>VgFv@kS ztYS{BFp~9GBR#xkz}^qGTsiybMzp3f`E~ffu6vuH^*V8;oW7*vqO1T`mhi<u9Z>8Z|$A>HrFeemTq@ zXEitSwl({a8Uydbow>}@3~2I;(=&=L=(;H<$eY`D z2pg!-U~-pH7!)$SKcSwo+)$WO?ssPMzS8s32!;{gtkZNY5;Kosuegakl!-blc~$)h zh6*!2AvQL)MVGZnSPp$Y{fU6IcPx66G)ETW<6?5Dgh!&w(Ynh^W2scn3k&^WA}XJP z$0=?_W#xVSRxd`?@IY-#mGhwd(xL)^Li<}wX8V#o>9vA)zMg3!Gjp~Vwup)^*Q(El zBWLsD)AVzd#ctq4F<;Hckdu?6N~fo(eNlAlSxip(OO9Ql%~p%3C%q$0FUaoe(9n}_ z_+Pp2cX8QyDk2{Y5e_R}%;x4AY<({ zSFRqFMUcg4v;lQm&oH8?qhj~%vh+IOSn1zR%VoCndZ$E{*U45Q z3T3s)Wm}2w-o>8nT1Zq&wH>*b*X$zZc_Xfjbg)P(&W2hEi%#49%NG?^S(j+}93r;6 zcD$|}^thYRA7>6f&Kxb}1?)HB^>~S-%KI-r=R&N`@l;gJKZ>n;eDTHo&w4j6h}T@; zxPN*mE=@La{EQ*KSL?5( zBA3AaJX}I3@G=7fV@v1Tazq+s8s=(7v)UBNSJBHW7cY<8_vaWJRA{5zgI#@tts+BM z>)5jyouOV4j)_f`5{sqhbj!&@%N(8jBV)q}T3D3uIKE6hpQ|3BXyD0HVvyTH0RzS1 zm0NvNA`5B{$4_39O3>vaq=_)>xkr|QNdm(`;7|%l(J+kV^|!g$so&P=T=!X?rsmo% z2F8$Sr5U{IJrW=DBt4lPAOqtte-1X`ddQ**b-MrN!`tV?tRGvYnId8`WpidJFE)Rk zhNpYS$rRjDNBtn7^;PT1NE>({ zIN?S-8RcgTc`-fFwlVY2@=YRXNt^MSTM@eHx>a}LR$kDSazBb8#(ei7Az<^FaYdGn zSSlKK0Ug?zZ0RDGe=`JGTM=%1d>|Bie7clSB4 z)cij~AE*WJ-=Pm4UdaC?=m9xLSH6QDf)K8AjN}*01Lalw4fFV?;;NZi!BLJ~HB)C4 z(gOI@e|Y7U;T8zfbI|5|PXv%Y0Nn_HVEjB>Fqk0hTy!Y_U;$zQSkL*s5mY+ra2H2c zXLGm<;GzGKl7xeUBWiES?_TELH9$r{%o-dP9NX7CL%cK8^a2g++VbWiGeZ69n~Fh;ca2 zCIe13al4ME!Xnb4XAV;y=s5XtFUf08BT`N`BOvMferGz~Cl&o|2@&s~61?tAkT>0` z`E;_aYwSa%Oh+dmk+tiZQrTaMtN_*qnUHd{osNZssRuamEPhdW=9 zmzF%nA-x-PIQa9A?r>v$j=vf&)q=2oEL7(za^hkv61e?{z>h5AwWF`k_(_yTrh8Yk zgAP6Eg#;WVPG<*>lGd=IZD(uuizxCcQPm8#0EsqhZp@I_#)#e8u*y1Rj0f!{wp;da z|Db8AI%Sq5GO|Z;vhHl`@$M46cRI|jo9i!nXxGUlG)#KTSH2&Ac}wNWjl*yi*BtR@ z$Qfe1_&jgc$$E8-<2)6E=TC7kE%M*i^xu=TC4DnLpL4BrXS)0J!~PNl&a1rpx{qAv z0%WkBe+{iq@xenzKL5nO`zmFTqnRnXxaJ){8Gpj1T5VRc_)x_h!}dNAQZVZ^SP;6z zbrlXn6`tcRen?ynANPE2D;Hh}U(SW_t}rChoR=EG<)B?xJ>E z?2E4Ur9E4cJ~d_TPQIApnsirof?B*ef~1|xH+G*r*fNQif7r~fCzno~)2O**hL@Mz zdiiB*d5V=dfB#0O-KA#{sTxnlh18kYc^-SSdseEaRVj$gYA`it1Vu8|=AUw%jDI-E z9^Z(QkOGB0x=^eSF29s3iZ4T8n}5M_#!05L&i_*;>0M9e8BhkV-3HO(GVR@UqD9)f zmQP@_FR)^Tm|?L+O<4?ma*@w+-&Uz#r9;HEEjSIoz}TV*Szs0H(HFX{MTEG78dD9$}?1;cWy1EgbrIdT5@A3-*}CjePMT>(`CL!cAB{FbgFi-aQ@M zmFp-Ik){8XXbjboM3z!XkMw)|mGy=taNhW1wGaAAy^Gl{*b@~bL!tElnEW`)rY z<@3D+#!a8TsVQHl(ok|3eL$~wnn<3e$+Qc<^8D>PuIN{(3Cl3e4X(7!a(}XQ%)7yO z<_=hcsx>gjbJ3iqFoX*F-`aFfhwck7L$g|^ zv|1HIu^+SsDMvSc7P&?*Y&}4EckS9+@Y62w=EM4Mt5xn3Q1eNBo=MCN$yq7s?sj5% zBji$B?qdd)VDq>gwK@Jt#*j6QdP%~H?mc!D+fVKlB92GSuTKRe)e^Zk7eg+!RWz48 zxEoxUaD8}x=zXyU_Ht*!IL4+2|H_Ki^fgwb)4+X!-u|9p$AiQr(?lmhs zVMj1XU~HLxY)tsv&NpsaPcgsm=IWF>}=bb`^Tf}HLg01dz=2}T$d@x{UTa0@z zQQ5M(1ot;vJ)|v;uXFT!5#v<&KB>W$9)A5kC1P{rc3iPotz16F(v$ZgwO`GYnblU! za6eKfea5rOb+8#CN@$(-+3zoUQX~CL(t+~hakELRR^kd>Vz?IiX)St8O)kD8j4O)V zbpbSH>V~eFf$%nr9(+M(;>MtUGuy_lJ!qCs^xOEipmeoH?jiG%+qB6Lr$Da|P9>9~ zlNyO3ZBjUrkFbxX!I8WnX)w||_O44#N-mjuNKfoY_1JdF>}&HmZp3HEKJ$!6c-Xp~ ztRsY~`?@=l=;(u^j&Y>2?<`el*riD*G%@uOcjBL-_sRqi^n>Rej?jNo9FHb_d zIcOwZzWJvJEC}8ddSqTAS}no}vd$Tbut=6e%%%x8Ao7(4MXk*>8>+ri-4ZU*B0Qjw z=-(ioa2k42@8MhyJ&DB3?ey702(b~2cd$La+S_o?u1lsxiiE)0Y@tulcE@R20&7zB z${eTv=yYZ|{HZX@@Ph(&A>BuiU<0QRow4SY$L7vb8Y^!1-yC$}MfiPN zE{eF2`DSW;rA;G31b5>mt^S;;O>BslLEk{JdiYUXzsnjZa%{GC+55Fz8r|V`G}LOo*p^4eZ`}= z@RZx?&H`V-^NI(;<~Mm(V3%(JtEXP1FX~7>QeELbG8rsV4jZhFh1WmZmvoH}c_OAM zTijqW`$E7cEifNPud2>YXD}Y`AZ@6D^!3Qe@#=~Q4)(LT0xe!H%wL zD+bhpds6sBm%K--UO!<_S5c{*8?7dm+(O8= z-w^5fx=t?^V|prZ_fh!BO}dY7gfkV!u6NEvu}3(Db8LXmCSu+4e0cpXylo)O*p=WL z`C|LDpkQNR$t4s6C#x)gM)wtOa)JCZgQmVf>|zFKXFI-h9wGkCZl;=x>>b^k>lXT>c#;7v5!Z>yYbr*<0vC$H0`r$yrLJQH=Ga8j<&^T(1Pux(EHpZa z5-079TTfi0M9x+i9?F?J@hxdJ$69^T{eZ3_Y4*t|#SU@<;odN%-Iv&T%{kV=i{3Vq z$=urgM%d+GeO1C%6Dn@zWS0=ZYRh(^P{@*(lpQ0cUM?p;556g{)6fZxEd6jo=x=ml6)PPz^$a77X@~;%XEPY$V;j ztI(YD)jNV9<1Rz)wDD|YlGfzzZjsJb)Rjc_ShZLhWPYz+*v?i~nYZz3?DQ0tge++k znQSjk9-Wb3XGD~__=P7OoYkXpWcLb0@rvY&A6zPwW0ueANCs=_l)r6bF0WMmbOAo~ zQiV}uhKbkPL>X)9{*@!97sJG(w(#e14cfw(TXGe{UB>KQC974&O}6qSuzQ2HT4|qb zOS)s=UXzZ+Ik{KShn{em&TH9@X|W5JCAgS;B{JO%B_1hyMMcoMj;+GX-65rsR zZi%HNR6Y5AAIU3OYIyM%oh_Rcf-iB32VR`;>w{C{d6yD84+Y-Bx*owZC#4F4g)3KS z($?!M>O}*kx>ZdWip1N}wKgWtItsK&{+{ylY z*|K_mK#R)=^^f#bjHEwWbD_#6&Tv)!Fg~tO7h+F^ZD;4=NBoL-x~$m9Z|wzUlKZ_e z;)UO^F1UG=|3eFRK5_b|Ce8&lpOJEO1twR#sGo`m3t%pEzW51P%mhr4exDZo+~^F< zcmCRm3alIYtNr|y`f~}}FVx@HQs}Ch*}%<#dENI-{6PL{rbu8@v;%6{(vSJsEf1uu z1`^mJjatX_gC^x@=jg2AWNHo&&zGj1&&q)5-rpPYWx&AJ_wU@O3ETPds_(aeFu%xi z9{s0cT%4`UKnC3MQc|c@X%@gXdmz&JWYR(aV&!b=`Rl_Ui{gGs?Prlu0{v*a`FPK_ zd#ixX*Ndo|I#|I`JNZ$(=YQwP|FNEYgq5v9d(g)-$nEh??nQ?B! znREj~Y@W-(k*$eW*?PyCMknhJ&G}p@=^SeR| z?HdeB<`#3u_B|jZes{z=&Ia?zVAh_Ofdxx?epf@aD;#DrDd z=eL#|%5XlGa<*yftKZMduDQhDd;gRgjFjpx^+lVVx${po;`gPBKVB8D!1>Bd70`KS z`}0-(Z?7mqLJ|Eo>BIN@apc-zhE%vjB{*5WHv=Q>#|k7giifY+=OmflbCmp|BYl=Z zUTuGME-!u!qdCr@wd5Kml;OSb7a56-S*OOf+6Wi4cWyQ833yF==urykNy7_|i4c;q z)V3q7__G7Ads3_<81-&%--IP58{_FO4N5)r)c(52rO)MK|Lrwt8JB#2~ zZbZZ}1IRJTEzDo_*{zV-aZB>M4-Tj3pQ;ewAq3{ott@AOcxHkdH>7CSuY;lJY&y0;*O#1JZ?q+E z^lQvzMrcEh!6UTttN+ma0H-?q)k2^u#t&}}unh4>eO7^c0PWA;E*VV(5?Er(Dq-&I z=-_D&az_BCDQLPof~4V=2nPfb;ppJPg*r(Cwd5B0S8K(stEUef<-i34Ru%$hRls<- zz^GM(;NKds^E`f5_kSbEUo8i>nls!DbtJ_PG5<*}Q;-I5!UrJkPvQQXYyx1wNd<-e zi)^TD|Ep|&yRyE^_NUI&>|C8q?Y^rFI4}Tp_=ux}ohQiRZ`J)5#XSbbl-IpEM_7;b!V!4m7eqHRtkQgyR?FI|O4R{-}vy7#9?^8u||{{gb;_ z)fH)naDbl=N@NhuK;`~f`IJn7+n;LtK4yXb+Lr?hkbkW}QouPXsDpG^0na%Q70kuM z%LP6c_WTLZib$hI6|B-iykKCZG!L*NKmaVj$IA(Zuzbz0=>^Kr4S<3NCX;du|U?Cx8?D8>h1Jf9AEf z|BYQ!&FVk%Be|Wde#UV6MH|0~0z3dj;R84U&D%Q({V+65M@KucUu{i<`_HE+c4cKD zX-9Kc)ZtI^(qd+J9rOim$*U+RNm|?%bdyxKb91n^5*0m<`#bB8$np*@NL0J|KSch8 zRm8$v$kNf--V`Zj3YKHvt`iTpw1 z5d_NfJ57KWIGyYd8W@I}V*bv@gW8Jo2TcHi($DXF0#IN)`8y3L8SGD)!NBog{~{k$ z5I8;UkGKMSzzJf1(D=Z>rkX!!5MESohx+`~DRA5x(8>KtLs`$CGzc&<{DUTdnn3?f zgF%3OIe*Zg{J;rnf6@S@{tFEX``5UF!1kg);=;iHY8x=#f7JnuAJ`K0XIub`{udgQ z|6j^02>Vq&q_Zioug>|$iG>=7dvKKX0<}Qh(GeI!{B7>%NBEtO8qRlm$xDL_SpQvv f%m(`RkIu)UK&$MGJg+N2e+lEqVPd+aD)WB;eyUl< literal 0 HcmV?d00001 diff --git a/packages/preview/acrostiche/0.5.1/test.typ b/packages/preview/acrostiche/0.5.1/test.typ new file mode 100644 index 000000000..b1ecf7cb3 --- /dev/null +++ b/packages/preview/acrostiche/0.5.1/test.typ @@ -0,0 +1,97 @@ +#import "@preview/acrostiche:0.0.0": * + +#init-acronyms(( + "STA": "String Type Acronym", + "PFT": ("Package For Typst","Packages For Typst"), + "AJT": ("Amicale des Joyeux Typistes"), + "ada": (short:[#text(fill:aqua)[ADA]], short-pl:"ADAs", long:"Advanced Definition Acronym", long-pl:"Advanced Definitions Acronyms"), + "TEA": ("The Extra Acronym",), + "TUA": ("The Unused Acronym",), +)) + +#let ref(str) = [#text(fill:green)[#str]] + +== Acronym with Two Definitions. + + +First use of #acr("PFT") and second use of #acr("PFT").\ +#ref("First use of Package For Typst (PFT) and second use of PFT.") + +Reset acronyms. #reset-acronym("PFT") + +First use of plural #acrpl("PFT") and second use of plural #acrpl("PFT").\ +#ref("First use of plural Packages For Typst (PFTs) and second use of plural PFTs.") + +Reset acronyms. #racr("PFT") + +Full definition of #acrfull("PFT") and full plural definition of #acrfullpl("PFT"). +Full definition of #acrf("PFT") and full plural definition of #acrfpl("PFT"). +#ref("Full definition of Package For Typst (PFT) and full plural definition of Packages For Typst (PFTs).") + +== Acronym with a Single Definition. + +First use of #acr("AJT") and second use of #acr("AJT").\ +#ref("First use of Amicale des Joyeux Typistes (AJT) and second use of AJT.") + +== Plural with string only definition +First use of #acrpl("STA") and second use of #acrpl("STA").\ +#ref("First use of String Type Acronyms (STAs) and second use of STAs.") + +== Acronym with Advanced Definitions + +First use of #acr("ada") and second use of #acr("ada").\ +#ref("First use of Advanced Definition Acronym (ADA) and second use of ADA.") + + + +Reset acronyms. #racr("AJT") + +Full definition of #acrfull("AJT").\ +Full definition of #acrf("AJT").\ +#ref("Full definition of Amicale des Joyeux Typistes (AJT)") + + +== Reset All Acronyms + +Use #acr("PFT") and #acr("AJT").\ +Reset.#reset-all-acronyms()\ +Use again #acr("PFT") and #acr("AJT"). + +#ref(" +Use Package For Typst (PFT) and Amicale des Joyeux Typistes (AJT). +Reset. +Use again Package For Typst (PFT) and Amicale des Joyeux Typistes (AJT). +") + +== Shortcuts and Functions Names from LaTeX +#reset-all-acronyms() + +First use of #ac("PFT") and second use of #ac("PFT").\ +#ref("First use of Package For Typst (PFT) and second use of PFT.") + +Full definition singular #acf("PFT") and plural #acfp("ada")\ +#ref("Full definition singular Package For Typst (PFT) and plural Advanced Definitions Acronyms (ADAs)") + +Display short singular #acs("ada") and short plural #acsp("ada")\ +#ref("Display short singular ADA and short plural ADAs") + +Display plural with shortcut: #acp("ada") and #acp("ada").\ +#ref("Display plural with shortcut: Advanced Definitions Acronyms (ADAs) and ADAs.") + +Display long shortcut: #acl("ada").\ +#ref("Display long shortcut: Advanced Definition Acronym.") + +Display long plural shortcut: #aclp("ada").\ +#ref("Display long plural shortcut: Advanced Definitions Acronyms.") + +== Print Index Variations + +#print-index() + +#print-index(title:"Sorted Empty",sorted:"") +#print-index(title:"Sorted up", sorted:"up") +#print-index(title:"Sorted down", sorted:"down") + +#print-index(title:"Used only up", sorted: "up", used-only:true) +#print-index(title:"Used only down", sorted: "down", used-only:true) + diff --git a/packages/preview/acrostiche/0.5.1/typst.toml b/packages/preview/acrostiche/0.5.1/typst.toml new file mode 100644 index 000000000..0f9d3f088 --- /dev/null +++ b/packages/preview/acrostiche/0.5.1/typst.toml @@ -0,0 +1,11 @@ +[package] +name = "acrostiche" +version = "0.5.1" +entrypoint = "acrostiche.typ" +repository = "https://github.com/Grisely/packages" +authors = ["Grizzly"] +license = "MIT" +keywords = ["acronyms"] +categories = ["utility","model"] +exclude = ["test.typ"] +description = "Manage acronyms and their definitions in Typst."