From b41d14ce6265b6389c0b986c7379c9035550ab73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Mon, 23 Mar 2026 21:48:20 +0100 Subject: [PATCH 1/6] refactor: consolidate hotfix options and add main.lua entry point Group temporary hot-fixes (code-annotations and skylighting) under a nested `hotfix` configuration key, replacing the flat `skylighting-fix` option. Add a `hotfix.quarto-version` threshold that auto-disables both fixes when Quarto reaches the specified version. Introduce `main.lua` as the filter entry point that loads submodules, wires dependencies, and assembles the filter list. Move hotfix modules (`code-annotations.lua`, `skylighting-typst-fix.lua`) into `_modules/hotfix/` for easy future removal. Add code-annotations hot-fix for Typst output with annotation markers, circled numbers, and bidirectional linking. Split Typst function definitions so annotation helpers are only injected when at least one hot-fix is active. Fix skylighting-typst-fix wrapper prefix bug: use configurable wrapper name instead of hardcoded `code-window-circled-number`, preventing Typst compilation errors when `wrapper` is customised. Additional fixes: HTML-escape auto-filename in code block headers, remove duplicate `@return` annotations, and improve `code-window-enabled` attribute description. --- _extensions/code-window/_extension.yml | 4 +- .../_modules/hotfix/code-annotations.lua | 200 +++++++ .../hotfix}/skylighting-typst-fix.lua | 103 +++- _extensions/code-window/_schema.yml | 30 +- _extensions/code-window/code-window.lua | 514 ++++++++++++++---- _extensions/code-window/main.lua | 74 +++ 6 files changed, 799 insertions(+), 126 deletions(-) create mode 100644 _extensions/code-window/_modules/hotfix/code-annotations.lua rename _extensions/code-window/{ => _modules/hotfix}/skylighting-typst-fix.lua (56%) create mode 100644 _extensions/code-window/main.lua diff --git a/_extensions/code-window/_extension.yml b/_extensions/code-window/_extension.yml index 06d9591..f31399a 100644 --- a/_extensions/code-window/_extension.yml +++ b/_extensions/code-window/_extension.yml @@ -1,8 +1,8 @@ title: Code Window author: Mickaël Canouil version: 0.2.0 -quarto-required: ">=1.9.23" +quarto-required: ">=1.9.36" contributes: filters: - at: pre-quarto - path: code-window.lua + path: main.lua diff --git a/_extensions/code-window/_modules/hotfix/code-annotations.lua b/_extensions/code-window/_modules/hotfix/code-annotations.lua new file mode 100644 index 0000000..3eafe71 --- /dev/null +++ b/_extensions/code-window/_modules/hotfix/code-annotations.lua @@ -0,0 +1,200 @@ +--- @module code-annotations +--- @license MIT +--- @copyright 2026 Mickaël Canouil +--- @author Mickaël Canouil +--- @brief Code annotation detection, stripping, and Typst rendering helpers. +--- Scans CodeBlock elements for inline annotation markers (e.g. # <1>, // <2>) +--- and provides utilities for converting annotations to Typst output. + +-- ============================================================================ +-- LANGUAGE COMMENT CHARACTERS +-- ============================================================================ + +--- Map of language identifiers to their single-line comment prefix. +--- @type table +local LANG_COMMENT_CHARS = { + r = '#', + python = '#', + lua = '--', + javascript = '//', + typescript = '//', + go = '//', + rust = '//', + bash = '#', + sh = '#', + zsh = '#', + fish = '#', + c = '//', + cpp = '//', + cxx = '//', + cc = '//', + cs = '//', + java = '//', + scala = '//', + kotlin = '//', + swift = '//', + objc = '//', + php = '//', + ruby = '#', + perl = '#', + julia = '#', + haskell = '--', + elm = '--', + clojure = ';', + scheme = ';', + lisp = ';', + racket = ';', + erlang = '%%', + elixir = '#', + fortran = '!', + matlab = '%%', + ada = '--', + sql = '--', + plsql = '--', + tsql = '--', + mysql = '--', + sqlite = '--', + postgresql = '--', + vb = "'", + vbnet = "'", + fsharp = '//', + stata = '//', + yaml = '#', + toml = '#', + make = '#', + cmake = '#', + dockerfile = '#', + powershell = '#', + nix = '#', + zig = '//', + dart = '//', + groovy = '//', + d = '//', + nim = '#', + crystal = '#', + v = '//', + odin = '//', + mojo = '#', +} + +-- ============================================================================ +-- ANNOTATION RESOLUTION +-- ============================================================================ + +--- Escape a string for use in a Lua pattern. +--- @param s string +--- @return string +local function escape_pattern(s) + return s:gsub('([%(%)%.%%%+%-%*%?%[%]%^%$])', '%%%1') +end + +--- Resolve annotations in a CodeBlock element. +--- Scans each line for a trailing annotation marker (e.g. # <1>) using the +--- language's comment prefix. Strips the marker from the code text and returns +--- the cleaned text along with an annotations table. +--- @param block pandoc.CodeBlock +--- @return string cleaned_text The code with annotation markers removed +--- @return table|nil annotations Maps line numbers (int) to annotation numbers (int), or nil if none found +local function resolve_annotations(block) + if not block.classes or #block.classes == 0 then + return block.text, nil + end + + local lang = block.classes[1]:lower() + local comment = LANG_COMMENT_CHARS[lang] + if not comment then + return block.text, nil + end + + local escaped_comment = escape_pattern(comment) + local pattern = '^(.-)%s*' .. escaped_comment .. '%s*<%s*(%d+)%s*>%s*$' + + local annotations = {} + local lines = {} + local found = false + + local line_num = 0 + for line in (block.text .. '\n'):gmatch('([^\n]*)\n') do + line_num = line_num + 1 + local content, annot_num = line:match(pattern) + if annot_num then + found = true + annotations[line_num] = tonumber(annot_num) + table.insert(lines, content) + else + table.insert(lines, line) + end + end + + if not found then + return block.text, nil + end + + return table.concat(lines, '\n'), annotations +end + +-- ============================================================================ +-- TYPST CONVERSION HELPERS +-- ============================================================================ + +--- Convert an annotations table to a Typst dictionary literal. +--- Keys are stringified line numbers, values are annotation numbers. +--- Example output: (1: 2, 3: 1) +--- @param annotations table Line number to annotation number mapping +--- @return string Typst dictionary literal +local function annotations_to_typst_dict(annotations) + local pairs_list = {} + local keys = {} + for k in pairs(annotations) do + table.insert(keys, k) + end + table.sort(keys) + for _, line_num in ipairs(keys) do + table.insert(pairs_list, + string.format('"%d": %d', line_num, annotations[line_num])) + end + return '(' .. table.concat(pairs_list, ', ') .. ')' +end + +--- Check whether a block is an OrderedList that looks like an annotation list. +--- Annotation lists are OrderedLists immediately following a code block, +--- where each item corresponds to an annotation number. +--- @param block pandoc.Block +--- @return boolean +local function is_annotation_ordered_list(block) + return block and block.t == 'OrderedList' +end + +--- Convert an OrderedList to Typst annotation item RawBlocks. +--- Each list item becomes a #code-window-annotation-item(block-id, n)[...] call. +--- @param ol pandoc.OrderedList The ordered list to convert +--- @param wrapper_prefix string Prefix for the Typst function name +--- @param block_id integer Unique block identifier for bidirectional linking +--- @return pandoc.List List of RawBlock elements +local function ordered_list_to_typst_blocks(ol, wrapper_prefix, block_id) + local blocks = {} + local start = ol.listAttributes and ol.listAttributes.start or 1 + for i, item in ipairs(ol.content) do + local annot_num = start + i - 1 + local content_blocks = pandoc.Blocks(item) + local rendered = pandoc.write(pandoc.Pandoc(content_blocks), 'typst') + rendered = rendered:gsub('%s+$', '') + table.insert(blocks, pandoc.RawBlock('typst', string.format( + '#%s-annotation-item(%d, %d)[%s]', + wrapper_prefix, block_id, annot_num, rendered + ))) + end + return blocks +end + +-- ============================================================================ +-- MODULE EXPORTS +-- ============================================================================ + +return { + LANG_COMMENT_CHARS = LANG_COMMENT_CHARS, + resolve_annotations = resolve_annotations, + annotations_to_typst_dict = annotations_to_typst_dict, + is_annotation_ordered_list = is_annotation_ordered_list, + ordered_list_to_typst_blocks = ordered_list_to_typst_blocks, +} diff --git a/_extensions/code-window/skylighting-typst-fix.lua b/_extensions/code-window/_modules/hotfix/skylighting-typst-fix.lua similarity index 56% rename from _extensions/code-window/skylighting-typst-fix.lua rename to _extensions/code-window/_modules/hotfix/skylighting-typst-fix.lua index c683ee3..5dec9f5 100644 --- a/_extensions/code-window/skylighting-typst-fix.lua +++ b/_extensions/code-window/_modules/hotfix/skylighting-typst-fix.lua @@ -9,6 +9,15 @@ --- the Skylighting function with better block styling and adds inline code --- background support for Typst output. +local _wrapper_prefix = 'code-window' + +--- Set the wrapper prefix for Typst function name generation. +--- Called by main.lua before each handler invocation. +--- @param prefix string The wrapper prefix (e.g. 'code-window' or 'my-window') +local function set_wrapper(prefix) + _wrapper_prefix = prefix +end + --- Build a Skylighting override with improved block styling. --- Pandoc 3.8+ generates correct bgcolor but the block call lacks width, --- inset, radius, and stroke properties. The fill parameter is also ignored. @@ -21,6 +30,7 @@ local function build_skylighting_override() local bg = hm['background-color'] if not bg or type(bg) ~= 'string' then return nil end + local circled = _wrapper_prefix .. '-circled-number' return string.format([==[ // skylighting-typst-fix override #let Skylighting( @@ -30,31 +40,66 @@ local function build_skylighting_override() sourcelines, ) = { let bgcolor = if fill != none { fill } else { rgb("%s") } - let blocks = [] - let lnum = start - 1 let has-gutter = start + sourcelines.len() > 999 - for ln in sourcelines { - if number { + context { + let annot-data = _cw-annotations.get() + let blocks = [] + let lnum = start - 1 + let seen-annotes = (:) + + for ln in sourcelines { lnum = lnum + 1 - blocks = blocks + box( - width: if has-gutter { 30pt } else { 24pt }, - text([ #lnum ]), - ) + if number { + blocks = blocks + box( + width: if has-gutter { 30pt } else { 24pt }, + text([ #lnum ]), + ) + } + + if annot-data != none { + let annot-num = annot-data.annotations.at(str(lnum), default: none) + if annot-num != none { + let lbl-prefix = "cw-" + str(annot-data.block-id) + "-" + if str(annot-num) not in seen-annotes { + seen-annotes.insert(str(annot-num), true) + blocks = blocks + box(width: 100%%)[ + #ln + #h(1fr) + #link(label(lbl-prefix + "item-" + str(annot-num)))[ + #%s(annot-num, bg-colour: annot-data.bg-colour) + ] + #label(lbl-prefix + "line-" + str(annot-num)) + ] + } else { + blocks = blocks + box(width: 100%%)[ + #ln + #h(1fr) + #link(label(lbl-prefix + "item-" + str(annot-num)))[ + #%s(annot-num, bg-colour: annot-data.bg-colour) + ] + ] + } + } else { + blocks = blocks + ln + } + } else { + blocks = blocks + ln + } + blocks = blocks + EndLine() } - blocks = blocks + ln + EndLine() - } - block( - fill: bgcolor, - width: 100%%, - inset: 8pt, - radius: 2pt, - stroke: none, - blocks, - ) + block( + fill: bgcolor, + width: 100%%, + inset: 8pt, + radius: 2pt, + stroke: 0.5pt + luma(200), + blocks, + ) + } } -]==], bg) +]==], bg, circled, circled) end --- Process inline Code for Typst format. @@ -91,6 +136,7 @@ local function process_typst_inline(el) end --- Inject Skylighting override at the start of the document. +--- Always injected when code-window is enabled to support annotation markers. function Pandoc(doc) if not quarto.doc.is_format('typst') then return doc @@ -109,7 +155,17 @@ function Pandoc(doc) return doc end - table.insert(doc.blocks, 1, pandoc.RawBlock('typst', override)) + -- Insert after the code-window function definitions so Skylighting can + -- reference _cw-annotations and the wrapper-prefixed circled-number function. + local insert_pos = 1 + for idx, blk in ipairs(doc.blocks) do + if blk.t == 'RawBlock' and blk.format == 'typst' + and blk.text:find('_cw%-annotations') then + insert_pos = idx + 1 + break + end + end + table.insert(doc.blocks, insert_pos, pandoc.RawBlock('typst', override)) return doc end @@ -122,6 +178,9 @@ function Code(el) end return { - { Pandoc = Pandoc }, - { Code = Code }, + set_wrapper = set_wrapper, + filters = { + { Pandoc = Pandoc }, + { Code = Code }, + }, } diff --git a/_extensions/code-window/_schema.yml b/_extensions/code-window/_schema.yml index 4bd6ae9..27a0c37 100644 --- a/_extensions/code-window/_schema.yml +++ b/_extensions/code-window/_schema.yml @@ -18,7 +18,29 @@ options: type: string default: "code-window" description: "Typst wrapper function name for code-window rendering." - skylighting-fix: - type: boolean - default: true - description: "Enable or disable the Skylighting hot-fix for Typst output (overrides block styling and adds inline code background)." + hotfix: + type: object + description: "Temporary hot-fixes for Typst output. These will be removed when Quarto natively supports the corresponding features (see quarto-dev/quarto-cli#14170)." + properties: + quarto-version: + type: string + description: "Quarto version at or above which all hot-fixes are automatically disabled. Leave unset to use individual toggles." + code-annotations: + type: boolean + default: true + description: "Enable the code-annotations hot-fix for Typst output." + skylighting: + type: boolean + default: true + description: "Enable the Skylighting hot-fix for Typst output (overrides block styling and adds inline code background)." + +attributes: + CodeBlock: + code-window-enabled: + type: boolean + default: true + description: "Whether to apply window chrome to this specific code block. Set to false to disable. Annotations still render when disabled." + code-window-style: + type: string + enum: ["default", "macos", "windows"] + description: "Override the global window decoration style for this specific code block." diff --git a/_extensions/code-window/code-window.lua b/_extensions/code-window/code-window.lua index 84a58eb..e7ca9fe 100644 --- a/_extensions/code-window/code-window.lua +++ b/_extensions/code-window/code-window.lua @@ -2,7 +2,6 @@ --- @license MIT --- @copyright 2026 Mickaël Canouil --- @author Mickaël Canouil ---- @version 0.1.0 --- @brief Code block window decorations with multiple styles --- @description Adds window chrome (macOS traffic lights, Windows title bar --- buttons, or plain filename) to code blocks in HTML, Reveal.js, and Typst @@ -14,6 +13,7 @@ local EXTENSION_NAME = 'code-window' local utils = require(quarto.utils.resolve_path('_modules/utils.lua'):gsub('%.lua$', '')) +local code_annotations = nil -- ============================================================================ -- DEFAULTS AND STATE @@ -24,7 +24,8 @@ local utils = require(quarto.utils.resolve_path('_modules/utils.lua'):gsub('%.lu --- @field auto_filename boolean Whether to auto-generate filename from language --- @field style string Window decoration style ('macos', 'windows', 'default') --- @field typst_wrapper string Typst wrapper function name ---- @field skylighting_fix boolean Whether to apply the Skylighting hot-fix for Typst +--- @field hotfix_code_annotations boolean Whether to apply the code-annotations hot-fix for Typst +--- @field hotfix_skylighting boolean Whether to apply the Skylighting hot-fix for Typst local VALID_STYLES = { ['default'] = true, ['macos'] = true, ['windows'] = true } @@ -33,11 +34,17 @@ local DEFAULTS = { ['auto-filename'] = 'true', ['style'] = 'macos', ['wrapper'] = 'code-window', - ['skylighting-fix'] = 'true', +} + +local HOTFIX_DEFAULTS = { + ['code-annotations'] = true, + ['skylighting'] = true, } local CURRENT_FORMAT = nil local CONFIG = nil +local TYPST_BG_COLOUR = nil +local ANNOTATION_BLOCK_COUNTER = 0 -- ============================================================================ -- LANGUAGE DETECTION @@ -94,10 +101,92 @@ end -- TYPST FUNCTION DEFINITION -- ============================================================================ ---- Typst function definition for code-window rendering. ---- Injected once at the start of the document body. -local TYPST_FUNCTION_DEF = [==[ -#let code-window(content, filename: none, is-auto: false, style: "macos") = { +--- Typst annotation helper functions (state, colour, circled numbers, annotation items). +--- Only injected when at least one hot-fix is active. +local TYPST_ANNOTATION_DEF = [==[ +// code-window: annotation state passed to Skylighting via Typst state +#let _cw-annotations = state("cw-annotations", none) + +// Derive a contrasting annotation colour from a background fill. +// Light backgrounds get dark circles; dark backgrounds get light circles. +// Uses ITU-R BT.709 luminance coefficients, matching quarto-cli PR #14170. +#let code-window-annote-colour(bg) = { + if type(bg) == color { + let comps = bg.components(alpha: false) + let lum = if comps.len() == 1 { + comps.at(0) / 100% + } else { + 0.2126 * comps.at(0) / 100% + 0.7152 * comps.at(1) / 100% + 0.0722 * comps.at(2) / 100% + } + if lum < 0.5 { luma(200) } else { luma(60) } + } else { + luma(60) + } +} + +#let code-window-circled-number(n, bg-colour: none) = { + let c = if bg-colour != none { code-window-annote-colour(bg-colour) } else { luma(120) } + box(baseline: 20%, circle( + radius: 4.5pt, + stroke: 0.5pt + c, + )[#set text(size: 5.5pt, fill: c); #align(center + horizon, str(n))]) +} + +#let code-window-annotation-item(block-id, n, content) = { + let lbl-prefix = "cw-" + str(block-id) + "-" + [#block(above: 0.4em, below: 0.4em)[ + #link(label(lbl-prefix + "line-" + str(n)))[ + #code-window-circled-number(n) + ] + #h(0.4em) + #content + ] #label(lbl-prefix + "item-" + str(n))] +} + +#let code-window-annotated-content(content, annotations: (:), bg-colour: none, block-id: 0) = { + if annotations.len() > 0 { + _cw-annotations.update((annotations: annotations, bg-colour: bg-colour, block-id: block-id)) + content + _cw-annotations.update(none) + } else { + content + } +} +]==] + +--- Typst code-window body content template. +--- Uses annotation wrapper when hot-fixes are active, plain content otherwise. +local TYPST_CONTENT_WITH_ANNOTATIONS = [==[ + code-window-annotated-content( + content, + annotations: annotations, + bg-colour: bg-colour, + block-id: block-id, + ) +]==] + +local TYPST_CONTENT_PLAIN = [==[ + content +]==] + +--- Build the complete Typst code-window function definition. +--- @param has_hotfixes boolean Whether at least one hot-fix is active +--- @return string Typst function definition(s) +local function build_typst_function_def(has_hotfixes) + local content_block = has_hotfixes + and TYPST_CONTENT_WITH_ANNOTATIONS + or TYPST_CONTENT_PLAIN + + local fn_def = string.format([==[ +#let code-window( + content, + filename: none, + is-auto: false, + style: "macos", + annotations: (:), + bg-colour: none, + block-id: 0, +) = { let border-colour = luma(200) let surface-fill = luma(237) let muted-colour = luma(120) @@ -130,13 +219,13 @@ local TYPST_FUNCTION_DEF = [==[ dir: ltr, spacing: 0.8em, // Minimise (horizontal line) - box(width: 0.6em, height: 0.6em, align(horizon, line(length: 100%))), + box(width: 0.6em, height: 0.6em, align(horizon, line(length: 100%%))), // Maximise (square) box(width: 0.6em, height: 0.6em, stroke: 1pt + muted-colour), // Close (x) box(width: 0.6em, height: 0.6em, { - place(line(start: (0%, 0%), end: (100%, 100%))) - place(line(start: (100%, 0%), end: (0%, 100%))) + place(line(start: (0%%, 0%%), end: (100%%, 100%%))) + place(line(start: (100%%, 0%%), end: (0%%, 100%%))) }), ) }, @@ -166,13 +255,13 @@ local TYPST_FUNCTION_DEF = [==[ } block( - width: 100%, + width: 100%%, stroke: 1pt + border-colour, radius: 8pt, clip: true, { block( - width: 100%, + width: 100%%, fill: surface-fill, inset: (x: 1em, y: 0.6em), below: 0pt, @@ -186,7 +275,7 @@ local TYPST_FUNCTION_DEF = [==[ // show raw overrides the document-level raw block styling (fill, radius). { set block( - width: 100%, + width: 100%%, inset: 8pt, radius: 0pt, stroke: none, @@ -195,59 +284,83 @@ local TYPST_FUNCTION_DEF = [==[ ) show raw.where(block: true): set block( fill: none, - width: 100%, + width: 100%%, radius: 0pt, stroke: none, above: 0pt, below: 0pt, ) - content - } +%s } }, ) } -]==] +]==], content_block) + + if has_hotfixes then + return TYPST_ANNOTATION_DEF .. fn_def + end + return fn_def +end -- ============================================================================ -- TYPST PROCESSING -- ============================================================================ ---- Process CodeBlock for Typst format. ---- Returns a block sandwich: opening RawBlock, the original CodeBlock, ---- and a closing RawBlock. Pandoc's own Typst writer handles Skylighting ---- with the document's theme automatically. ---- @param block pandoc.CodeBlock Code block element ---- @return pandoc.List|pandoc.CodeBlock Block list or original block -local function process_typst(block) - local block_style = read_block_style(block) - local explicit_filename = block.attributes['filename'] - local filename = explicit_filename - local is_auto = false +--- Get the next unique block ID for annotation linking. +--- @return integer +local function next_block_id() + ANNOTATION_BLOCK_COUNTER = ANNOTATION_BLOCK_COUNTER + 1 + return ANNOTATION_BLOCK_COUNTER +end - if not filename or filename == '' then - if CONFIG.auto_filename and block.classes and #block.classes > 0 then - filename = block.classes[1] - is_auto = true - end +--- Build the Typst bg-colour parameter string. +--- @return string Empty string or ', bg-colour: rgb("...")' +local function typst_bg_colour_param() + if not TYPST_BG_COLOUR then + return '' end + return string.format(', bg-colour: rgb("%s")', TYPST_BG_COLOUR) +end - if not filename then - return block +--- Build a code-window opening RawBlock for Typst. +--- @param filename string +--- @param is_auto boolean +--- @param style string +--- @param annotations table|nil +--- @param block_id integer +--- @return pandoc.RawBlock +local function typst_code_window_open(filename, is_auto, style, annotations, block_id) + local annot_param = '' + if annotations and next(annotations) then + annot_param = string.format(', annotations: %s, block-id: %d', + code_annotations.annotations_to_typst_dict(annotations), block_id) end - local effective_style = block_style or CONFIG.style + return pandoc.RawBlock('typst', string.format( + '#%s(filename: "%s", is-auto: %s, style: "%s"%s%s)[', + CONFIG.typst_wrapper, + filename:gsub('"', '\\"'), + is_auto and 'true' or 'false', + style, + annot_param, + typst_bg_colour_param() + )) +end - return { - pandoc.RawBlock('typst', string.format( - '#%s(filename: "%s", is-auto: %s, style: "%s")[', - CONFIG.typst_wrapper, - filename:gsub('"', '\\"'), - is_auto and 'true' or 'false', - effective_style - )), - block, - pandoc.RawBlock('typst', ']'), - } +--- Build a standalone annotation wrapper for non-windowed blocks. +--- @param annotations table +--- @param block_id integer +--- @return pandoc.RawBlock opening, pandoc.RawBlock closing +local function typst_annotation_wrapper(annotations, block_id) + local open = pandoc.RawBlock('typst', string.format( + '#%s-annotated-content(annotations: %s, block-id: %d%s)[', + CONFIG.typst_wrapper, + code_annotations.annotations_to_typst_dict(annotations), + block_id, + typst_bg_colour_param() + )) + local close = pandoc.RawBlock('typst', ']') + return open, close end -- ============================================================================ @@ -261,6 +374,15 @@ end --- @param block pandoc.CodeBlock Code block element --- @return pandoc.Div|pandoc.CodeBlock Wrapped block or original local function process_html(block) + -- Per-block opt-out: code-window-enabled="false" skips window chrome. + local block_enabled = block.attributes['code-window-enabled'] + if block_enabled then + block.attributes['code-window-enabled'] = nil + end + if block_enabled == 'false' then + return block + end + local block_style = read_block_style(block) local explicit_filename = block.attributes['filename'] @@ -295,7 +417,7 @@ local function process_html(block) 'html', string.format( '
%s
', - filename + utils.escape_html(filename) ) ) @@ -331,7 +453,7 @@ function Meta(meta) CURRENT_FORMAT = utils.get_quarto_format() local opts = utils.get_options({ extension = EXTENSION_NAME, - keys = { 'enabled', 'auto-filename', 'style', 'wrapper', 'skylighting-fix' }, + keys = { 'enabled', 'auto-filename', 'style', 'wrapper' }, meta = meta, defaults = DEFAULTS, }) @@ -341,14 +463,68 @@ function Meta(meta) string.format('Unknown style "%s", falling back to "macos".', opts['style'])) end + -- Read code-annotations metadata (Quarto standard option). + local annot_meta = meta['code-annotations'] + local annot_value = annot_meta and pandoc.utils.stringify(annot_meta) or '' + local annotations_enabled = annot_value ~= 'none' and annot_value ~= 'false' + + -- Read hotfix sub-table from extensions.code-window.hotfix. + local ext_config = utils.get_extension_config(meta, EXTENSION_NAME) + local hotfix_meta = ext_config and ext_config['hotfix'] or nil + + -- Deprecation check for old flat skylighting-fix key. + if ext_config and ext_config['skylighting-fix'] ~= nil then + utils.log_warning(EXTENSION_NAME, + '"skylighting-fix" is deprecated. Use "hotfix: { skylighting: true/false }" instead.') + end + + -- Parse hotfix options with version-based auto-disable. + local hotfix = {} + local hotfix_version_override = false + if hotfix_meta then + local version_str = hotfix_meta['quarto-version'] + if version_str then + version_str = pandoc.utils.stringify(version_str) + if version_str ~= '' then + local ok, threshold = pcall(pandoc.types.Version, version_str) + if ok and quarto.version >= threshold then + hotfix_version_override = true + end + end + end + end + + for key, default in pairs(HOTFIX_DEFAULTS) do + if hotfix_version_override then + hotfix[key] = false + elseif hotfix_meta and hotfix_meta[key] ~= nil then + hotfix[key] = pandoc.utils.stringify(hotfix_meta[key]) == 'true' + else + hotfix[key] = default + end + end + CONFIG = { enabled = opts['enabled'] == 'true', auto_filename = opts['auto-filename'] == 'true', style = VALID_STYLES[opts['style']] and opts['style'] or 'macos', typst_wrapper = opts['wrapper'], - skylighting_fix = opts['skylighting-fix'] == 'true', + hotfix_code_annotations = hotfix['code-annotations'], + hotfix_skylighting = hotfix['skylighting'], + code_annotations = annotations_enabled, } + -- Cache syntax highlighting background colour for Typst contrast-aware annotations. + if CURRENT_FORMAT == 'typst' then + local hm = PANDOC_WRITER_OPTIONS and PANDOC_WRITER_OPTIONS.highlight_method + if hm then + local bg = hm['background-color'] + if bg and type(bg) == 'string' then + TYPST_BG_COLOUR = bg + end + end + end + if CURRENT_FORMAT == 'html' and CONFIG.enabled then utils.ensure_html_dependency({ name = EXTENSION_NAME, @@ -365,18 +541,13 @@ function Meta(meta) return meta end ---- Process CodeBlock elements. ---- Typst: wraps blocks with RawBlock sandwich. ---- HTML/Reveal.js: wraps blocks with auto-filename Divs. +--- Process CodeBlock elements for HTML/Reveal.js only. +--- Typst processing is handled by the Blocks filter. function CodeBlock(block) if not CURRENT_FORMAT or not CONFIG or not CONFIG.enabled then return block end - if CURRENT_FORMAT == 'typst' then - return process_typst(block) - end - if CURRENT_FORMAT == 'html' then return process_html(block) end @@ -384,12 +555,179 @@ function CodeBlock(block) return block end ---- Inject Typst function definition at the start of the document. +-- ============================================================================ +-- TYPST BLOCKS FILTER +-- ============================================================================ + +--- Determine whether a CodeBlock should get code-window chrome. +--- @param block pandoc.CodeBlock +--- @return string|nil filename +--- @return boolean is_auto +--- @return string|nil block_style +--- @return boolean window_opted_out True when code-window-enabled="false" was set +local function resolve_window_params(block) + -- Per-block opt-out: code-window-enabled="false" skips window chrome. + local block_enabled = block.attributes['code-window-enabled'] + if block_enabled then + block.attributes['code-window-enabled'] = nil + end + if block_enabled == 'false' then + return nil, false, nil, true + end + + local block_style = read_block_style(block) + local explicit_filename = block.attributes['filename'] + local filename = explicit_filename + local is_auto = false + + if not filename or filename == '' then + if CONFIG.auto_filename and block.classes and #block.classes > 0 then + filename = block.classes[1] + is_auto = true + end + end + + return filename, is_auto, block_style, false +end + +--- Process a single CodeBlock for Typst, returning replacement blocks. +--- Handles both code-window wrapping and standalone annotation rendering. +--- @param block pandoc.CodeBlock +--- @param next_block pandoc.Block|nil The block following this CodeBlock +--- @return pandoc.List replacement_blocks Blocks to splice in +--- @return boolean consumed_next Whether the next block was consumed +--- @return integer|nil annotation_block_id Block ID if annotations were found (for parent propagation) +local function process_typst_block(block, next_block) + local filename, is_auto, block_style, window_opted_out = resolve_window_params(block) + local has_window = filename and filename ~= '' + local effective_style = block_style or CONFIG.style + + -- Resolve annotations if enabled and the code-annotations hot-fix is active. + local annotations = nil + local should_handle_annotations = CONFIG.code_annotations and CONFIG.hotfix_code_annotations + + if should_handle_annotations then + local cleaned_text + cleaned_text, annotations = code_annotations.resolve_annotations(block) + if annotations then + block.text = cleaned_text + end + end + + -- Strip filename attribute to prevent Quarto's DecoratedCodeBlock (PR #14170). + if has_window and block.attributes['filename'] then + block.attributes['filename'] = nil + end + + local has_annotations = annotations and next(annotations) + local consumed_next = false + local result = {} + local block_id = has_annotations and next_block_id() or 0 + + if has_window and has_annotations then + table.insert(result, typst_code_window_open( + filename, is_auto, effective_style, annotations, block_id)) + table.insert(result, block) + table.insert(result, pandoc.RawBlock('typst', ']')) + elseif has_window then + table.insert(result, typst_code_window_open( + filename, is_auto, effective_style, nil, 0)) + table.insert(result, block) + table.insert(result, pandoc.RawBlock('typst', ']')) + elseif has_annotations then + local open, close = typst_annotation_wrapper(annotations, block_id) + table.insert(result, open) + table.insert(result, block) + table.insert(result, close) + else + table.insert(result, block) + end + + -- Consume the following OrderedList if it is an annotation list. + if has_annotations + and next_block + and code_annotations.is_annotation_ordered_list(next_block) then + local wrapper_prefix = CONFIG.typst_wrapper + local annot_blocks = code_annotations.ordered_list_to_typst_blocks( + next_block, wrapper_prefix, block_id) + for _, ab in ipairs(annot_blocks) do + table.insert(result, ab) + end + consumed_next = true + end + + local returned_block_id = has_annotations and (not consumed_next) and block_id or nil + return result, consumed_next, returned_block_id +end + +--- Process a flat list of blocks for Typst, handling CodeBlocks and their +--- following OrderedLists. Called recursively on Div contents. +--- @param blocks pandoc.Blocks|pandoc.List +--- @return pandoc.Blocks processed_blocks +--- @return integer|nil pending_annotation_block_id Block ID if the last block had annotations (for parent consumption) +local function process_typst_blocks(blocks) + local new_blocks = {} + local pending_annot_block_id = nil + local i = 1 + while i <= #blocks do + local blk = blocks[i] + + if blk.t == 'CodeBlock' then + local next_blk = blocks[i + 1] + local replacement, consumed_next, annot_id = process_typst_block(blk, next_blk) + for _, rb in ipairs(replacement) do + table.insert(new_blocks, rb) + end + if consumed_next then + pending_annot_block_id = nil + i = i + 2 + else + pending_annot_block_id = annot_id + i = i + 1 + end + elseif blk.t == 'Div' then + local processed, inner_pending = process_typst_blocks(blk.content) + blk.content = processed + table.insert(new_blocks, blk) + -- If the Div's last processed block had pending annotations, + -- check if the next sibling is an OrderedList to consume. + if inner_pending then + local next_blk = blocks[i + 1] + if next_blk and code_annotations.is_annotation_ordered_list(next_blk) then + local annot_blocks = code_annotations.ordered_list_to_typst_blocks( + next_blk, CONFIG.typst_wrapper, inner_pending) + for _, ab in ipairs(annot_blocks) do + table.insert(new_blocks, ab) + end + pending_annot_block_id = nil + i = i + 2 + else + pending_annot_block_id = inner_pending + i = i + 1 + end + else + pending_annot_block_id = nil + i = i + 1 + end + else + pending_annot_block_id = nil + table.insert(new_blocks, blk) + i = i + 1 + end + end + return pandoc.Blocks(new_blocks), pending_annot_block_id +end + +--- Inject Typst function definition and process code blocks for Typst format. +--- Runs as a Pandoc filter to have full control over the document tree. function Pandoc(doc) if CURRENT_FORMAT ~= 'typst' or not CONFIG or not CONFIG.enabled then return doc end + -- Process code blocks and annotations throughout the document tree. + doc.blocks = process_typst_blocks(doc.blocks) + -- Guard: check if the function definition is already present. local fn_pattern = '#let ' .. CONFIG.typst_wrapper for _, blk in ipairs(doc.blocks) do @@ -399,55 +737,35 @@ function Pandoc(doc) end end - local fn_def = TYPST_FUNCTION_DEF + local has_hotfixes = CONFIG.hotfix_code_annotations or CONFIG.hotfix_skylighting + local fn_def = build_typst_function_def(has_hotfixes) if CONFIG.typst_wrapper ~= 'code-window' then - fn_def = fn_def:gsub('#let code%-window', '#let ' .. CONFIG.typst_wrapper) + fn_def = fn_def:gsub('code%-window%-annote%-colour', CONFIG.typst_wrapper .. '-annote-colour') + fn_def = fn_def:gsub('code%-window%-circled%-number', CONFIG.typst_wrapper .. '-circled-number') + fn_def = fn_def:gsub('code%-window%-annotation%-item', CONFIG.typst_wrapper .. '-annotation-item') + fn_def = fn_def:gsub('code%-window%-annotated%-content', CONFIG.typst_wrapper .. '-annotated-content') + fn_def = fn_def:gsub('#let code%-window%(', '#let ' .. CONFIG.typst_wrapper .. '(') end table.insert(doc.blocks, 1, pandoc.RawBlock('typst', fn_def)) return doc end ---- Load optional skylighting hot-fix subfilters from sibling file. ---- Kept as a single integration seam for easy future removal. ---- @return table List of subfilter tables to append -local function load_skylighting_hotfix_filters() - local ok, result = pcall(require, - quarto.utils.resolve_path('skylighting-typst-fix.lua'):gsub('%.lua$', '')) - if not ok then - utils.log_warning(EXTENSION_NAME, - 'Failed to load optional skylighting hot-fix: ' .. tostring(result)) - return {} - end - if type(result) ~= 'table' then - utils.log_warning(EXTENSION_NAME, - 'Skylighting hot-fix did not return a filter list.') - return {} - end - return result -end - -- ============================================================================ --- FILTER EXPORTS +-- MODULE EXPORTS -- ============================================================================ -local filters = { - { Meta = Meta }, - { Pandoc = Pandoc }, - { CodeBlock = CodeBlock }, -} - -for _, subfilter in ipairs(load_skylighting_hotfix_filters()) do - local wrapped = {} - for element_type, handler in pairs(subfilter) do - wrapped[element_type] = function(...) - if not CONFIG or not CONFIG.skylighting_fix then - return nil - end - return handler(...) - end - end - table.insert(filters, wrapped) +--- Inject the code-annotations module dependency. +--- Called by main.lua before any filter handlers run. +--- @param mod table The code-annotations module +local function set_code_annotations(mod) + code_annotations = mod end -return filters +return { + set_code_annotations = set_code_annotations, + Meta = Meta, + Pandoc = Pandoc, + CodeBlock = CodeBlock, + CONFIG = function() return CONFIG end, +} diff --git a/_extensions/code-window/main.lua b/_extensions/code-window/main.lua new file mode 100644 index 0000000..184418c --- /dev/null +++ b/_extensions/code-window/main.lua @@ -0,0 +1,74 @@ +--- @module main +--- @license MIT +--- @copyright 2026 Mickaël Canouil +--- @author Mickaël Canouil +--- @brief Entry point for the code-window extension. +--- Loads all submodules, wires dependencies, and assembles the filter list. + +local EXTENSION_NAME = 'code-window' +local utils = require(quarto.utils.resolve_path('_modules/utils.lua'):gsub('%.lua$', '')) + +-- ============================================================================ +-- LOAD SUBMODULES +-- ============================================================================ + +local code_annotations = require( + quarto.utils.resolve_path('_modules/hotfix/code-annotations.lua'):gsub('%.lua$', '')) + +local code_window = require( + quarto.utils.resolve_path('code-window.lua'):gsub('%.lua$', '')) + +code_window.set_code_annotations(code_annotations) + +-- ============================================================================ +-- SKYLIGHTING HOT-FIX +-- ============================================================================ + +--- Load optional skylighting hot-fix module from sibling file. +--- @return table Module table with .filters and .set_wrapper, or empty table +local function load_skylighting_hotfix_module() + local ok, result = pcall(require, + quarto.utils.resolve_path('_modules/hotfix/skylighting-typst-fix.lua'):gsub('%.lua$', '')) + if not ok then + utils.log_warning(EXTENSION_NAME, + 'Failed to load optional skylighting hot-fix: ' .. tostring(result)) + return {} + end + if type(result) ~= 'table' then + utils.log_warning(EXTENSION_NAME, + 'Skylighting hot-fix did not return a module table.') + return {} + end + return result +end + +-- ============================================================================ +-- FILTER ASSEMBLY +-- ============================================================================ + +local filters = { + { Meta = code_window.Meta }, + { Pandoc = code_window.Pandoc }, + { CodeBlock = code_window.CodeBlock }, +} + +local skylighting_mod = load_skylighting_hotfix_module() + +for _, subfilter in ipairs(skylighting_mod.filters or {}) do + local wrapped = {} + for element_type, handler in pairs(subfilter) do + wrapped[element_type] = function(...) + local cfg = code_window.CONFIG() + if not cfg or not cfg.hotfix_skylighting then + return nil + end + if skylighting_mod.set_wrapper then + skylighting_mod.set_wrapper(cfg.typst_wrapper) + end + return handler(...) + end + end + table.insert(filters, wrapped) +end + +return filters From 8e2b6c6848aad9a515ddffa5b6e121282611e523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Mon, 23 Mar 2026 22:02:18 +0100 Subject: [PATCH 2/6] docs: update README and example with hotfix config and PR #14170 notice Update configuration examples to use nested `hotfix` key. Add hotfix options table and a dedicated "Temporary Hot-fixes (Typst)" section explaining that code-annotations and skylighting fixes will be removed once quarto-dev/quarto-cli#14170 lands. Add callout note in example.qmd about the temporary nature of Typst code-annotations support. --- README.md | 55 +++++++++++++++++++++++++++++---------- example.qmd | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 70e9de4..4f08470 100644 --- a/README.md +++ b/README.md @@ -58,18 +58,30 @@ extensions: auto-filename: true style: "macos" wrapper: "code-window" - skylighting-fix: true + hotfix: + quarto-version: ~ + code-annotations: true + skylighting: true ``` ### Options -| Option | Type | Default | Description | -| ----------------- | ------- | --------------- | ----------------------------------------------------------------------------------- | -| `enabled` | boolean | `true` | Enable or disable the code-window filter. | -| `auto-filename` | boolean | `true` | Automatically generate filename labels from the code block language. | -| `style` | string | `"macos"` | Window decoration style: `"macos"`, `"windows"`, or `"default"`. | -| `wrapper` | string | `"code-window"` | Typst wrapper function name for code-window rendering. | -| `skylighting-fix` | boolean | `true` | Enable or disable the Skylighting hot-fix for Typst output (block and inline code). | +| Option | Type | Default | Description | +| --------------- | ------- | --------------- | -------------------------------------------------------------------- | +| `enabled` | boolean | `true` | Enable or disable the code-window filter. | +| `auto-filename` | boolean | `true` | Automatically generate filename labels from the code block language. | +| `style` | string | `"macos"` | Window decoration style: `"macos"`, `"windows"`, or `"default"`. | +| `wrapper` | string | `"code-window"` | Typst wrapper function name for code-window rendering. | + +### Hotfix Options + +These options are **temporary** and will be removed in a future version (see [Temporary hot-fixes](#temporary-hot-fixes-typst)). + +| Option | Type | Default | Description | +| ------------------------- | ------- | ------- | ------------------------------------------------------------------------------------------ | +| `hotfix.quarto-version` | string | _unset_ | Quarto version at or above which all hot-fixes are automatically disabled. | +| `hotfix.code-annotations` | boolean | `true` | Enable the code-annotations hot-fix for Typst output. | +| `hotfix.skylighting` | boolean | `true` | Enable the Skylighting hot-fix for Typst output (overrides block styling and inline code). | ### Styles @@ -87,17 +99,32 @@ print("Windows style for this block only") ``` ```` -### Typst Skylighting Hot-fix (Integrated) +### Temporary Hot-fixes (Typst) + +The extension includes two temporary hot-fixes for Typst output that compensate for missing Quarto/Pandoc features. +Both will be removed once [quarto-dev/quarto-cli#14170](https://github.com/quarto-dev/quarto-cli/pull/14170) is released. +After that, the extension will focus solely on **auto-filename** and **code-window-style** features. + +- **`hotfix.code-annotations`**: processes code annotation markers for Typst, since Quarto does not yet support `code-annotations` in Typst output. + The `filename` attribute for code blocks will also become natively supported. +- **`hotfix.skylighting`**: overrides Pandoc's Skylighting output for Typst to fix block and inline code styling. -`code-window` loads its Typst skylighting hot-fix internally from `_extensions/code-window/skylighting-typst-fix.lua`, so no second filter entry is required. -Set `skylighting-fix: false` to disable the hot-fix without removing the file. +Set `hotfix.quarto-version` to automatically disable both hot-fixes once you update Quarto to the version that includes native support: -This keeps the hot-fix separated from `code-window.lua` for easy future removal while preserving combined behaviour. +```yaml +extensions: + code-window: + hotfix: + quarto-version: "1.10.0" +``` Future removal playbook: -1. Remove the skylighting loader call in `_extensions/code-window/code-window.lua`. -2. Delete `_extensions/code-window/skylighting-typst-fix.lua`. +1. Delete `hotfix` parsing from `code-window.lua` (`HOTFIX_DEFAULTS`, hotfix section in `Meta`). +2. Remove the `hotfix` section from `_schema.yml`. +3. Remove the skylighting guard and loader in `main.lua`. +4. Remove annotation processing from `code-window.lua`. +5. Delete `_modules/hotfix/` directory entirely. ## Example diff --git a/example.qmd b/example.qmd index 7a50c6c..401a056 100644 --- a/example.qmd +++ b/example.qmd @@ -9,6 +9,7 @@ filters: - at: pre-quarto path: code-window syntax-highlighting: github-dark +code-annotations: below format: html: output-file: index @@ -116,6 +117,75 @@ Plain filename on the left, no window decorations. print("Default style window") ``` +## Code Annotations + +::: {.callout-note} +Typst code-annotations support and `filename` attribute handling are temporary hot-fixes. +They will be removed once Quarto natively supports these features (see [quarto-dev/quarto-cli#14170](https://github.com/quarto-dev/quarto-cli/pull/14170)). +The extension will then focus on **auto-filename** and **code-window-style** features. +::: + +Code annotations work standalone and together with code-window styling. + +### Annotations with Explicit Filename + +```{.python filename="annotated.py"} +import pandas as pd # <1> + +df = pd.read_csv("data.csv") # <2> +summary = df.describe() # <3> +``` + +1. Import the pandas library. +2. Load data from a CSV file. +3. Generate summary statistics. + +### Annotations with Auto-Filename + +```python +def greet(name: str) -> str: # <1> + return f"Hello, {name}!" # <2> + +result = greet("World") # <3> +``` + +1. Define a function with type hints. +2. Use an f-string for interpolation. +3. Call the function and store the result. + +### Annotations Spanning Multiple Lines + +A single annotation number can appear on several consecutive lines. +Only the first occurrence receives a back-label to avoid duplicates. + +```{.python filename="pipeline.py"} +def process(data): # <1> + cleaned = clean(data) # <1> + validated = validate(cleaned) # <1> + result = transform(validated) # <2> + return result # <3> +``` + +1. Multi-step input preparation (cleaning and validation). +2. Apply the main transformation. +3. Return the final result. + +### Annotations without Window Chrome + +Set `code-window-enabled="false"` on a block to disable window chrome while keeping annotations. + +```{.r code-window-enabled="false"} +library(ggplot2) # <1> +ggplot(mtcars) + # <2> + aes(x = mpg, y = hp) + # <3> + geom_point() # <4> +``` + +1. Load the ggplot2 package. +2. Initialise a plot with the mtcars dataset. +3. Map aesthetics. +4. Add a point geometry layer. + ### Configuration Set the global style in the document front matter: @@ -124,6 +194,10 @@ Set the global style in the document front matter: extensions: code-window: style: "macos" + hotfix: + quarto-version: ~ + code-annotations: true + skylighting: true ``` Override per block with the `code-window-style` attribute: From ef5757b92a604fda70da72235e8558bc25fa00ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Mon, 23 Mar 2026 22:02:27 +0100 Subject: [PATCH 3/6] chore: update rendered example outputs --- example-typst.pdf | Bin 91521 -> 138006 bytes example.typ | 734 ++++++++++++++++++++++++++-------------------- 2 files changed, 421 insertions(+), 313 deletions(-) diff --git a/example-typst.pdf b/example-typst.pdf index 28c3169ca09bad8f9331888ce6a2986005836ed7..49fb99ff1caa4580956b0a7b2d2fb692c224a6fc 100644 GIT binary patch literal 138006 zcmeEvcOaGD|9CrTXwb%0k*wTJiOe#h>{WF-MIL!xpFokPpns_( zdF(G4{kxi1QIVJ7W`{J$OJdQoo{zVSqZ`(^hNGvKH-U`2k94481MY}u^USVky&FUx zWrDiW#*+bnLwZ5q*JW$~pmyIGI(oY>2;%A+JX{=Y9lZ$}jxG#08&}2xq-`|@=!!zc z`sxKS^7a57P`f)=>B;bA0uQ@W_VIR?UdC`^c-nX~>{xb+!P~1-q{RU`rS<8wKaMM1 zY#iMPs_u3Sf{Kf~t#fY_G3xf}4QXnC-spXL>p>WzsOIQpv(^P5hvLeLtQdT~`a~KW zpid^>QM&dZjLC>xH$<3>$addi;weo=cnZNYaRk!mM=T*y7vPjoOQ}sQ4;_Gp&w!O3i$;OFSQj)1EiFiQ0%0891Lztf(< zi4ufKfxp4TfBCqsl zyM-&UJJ6^*;A5{B)Lnb-fCzyXv#*>H&K0uR1>PC}<$|As$ zgy||^Wl6FqUkFqJQ63%j1RD5+5}iQr`6LHEp`8-sdp?0Ch|q}uV$<`HL?F^pu^|9D z6KU`xg+QdD3K9GT7yK4<)%_9lMa94b)b9BRdZS|S0nmFsg5D_bThJRB0~-*9NQU2n z-bnCU&>IPU3wnbD06+G81ihjB)h7TCsQV)s^o9unfed=<{s?-L#i&XKy~$$mk|_k} zLy@TjIruXTkQhiekSIDq4g-ZO*Yio9Acs+yBHQzcNRY!Q3{dO-L?*~#txzaEpQwPJ zNXrQOF^OQx0HQ9n8U6%HA8!j41Z139P%t$Hgd8>tv7vN}gDl1v3KR;8Y&Vz~37Owx zs59>&=soX2L4zVimdDy9L%||<6ATI!SsrVj4CRR|58s!=WQN>BLJS_V93(v?6j=_w z56MNAgYVNJJLr%FP%_DM*bW_on@orA)4Q1l-=}r66T(4*?Le_6(_lN8Wh0PjusuxK zfqU22SPzRCW2qU8^ z84QZ<0R>et8Ok477WN|x@rCk8hH^;m9&%95$g&V#Sqxs1JVrN?Jk|~g${z{J9|_7G z3CbM_${h*H9SO=E2@Yctls}RjhBpby9SM`W)yx?Z(my)HNKo`hP~=EZ)JSxUN+t+;@LZg{11a$4E|s z3Yi48F$sz$35q5OiY5t)CW!(`14WYrMUwPekNMP!vhs zIvk2338-T9cPNUaZp98ok<{}S;tfTU1Vxeg7xweV_t+3%J_qTFJ=crHNc$LzyR8V6 zZW5GgQnxz+rJ4k_EeUGdZlgFzez-R7G4 z7elq%WHbL_sP&lYZtD%Do(QF$2(>K{N;?s1St8W3M5twnP}GS~%M$6>s3Str@9_hm z=o6vn6QQ;x!XZF}Lx2c}0FegUfkUCkiGZR`ghPS|wJQ;dI1!38)6>92v&YAP+PBBM z=yo`uHtzN>n13;mB0|w8LeXdb#fA(Kiae2m@vYlAA;KX*ghPM`hd{T-LWJ6w2!{X> z4uNhrh6qKU2t}U=wQ#p@LxiGEg#H~7YU6H)r`yHp`P=OgLT%jb>=2>+cDp&uzt|8Z zLb)bFc_wx{&^`B%PEdY3_#k~eDBK7FNg>v2f2a^uyiFNfJ6C)VhyDl>S?H+p(sNMh5`(|2`H{mTA`kX9t70ZP-3CL zLN9`Xv9a5CfF>APWO&zY_fehPt(u`Ffi}0>jv$Zp;sP=@5H9o%PhxW@br*&!GM6y` zQzmy?A6F0zM5i_cOiq!{VAAua?}~Lq>F2YOq1=%Fv+oIgus?iIOm4_fVg~Pvc2g9R z^bemD6G1Y!d{Zc9WGGoo9~Hv!&%P?8(;q%7rX|V!eOEGk{y+Pukgk9Dst}+5?6bl# z0IfRHcZKr8whs&G@Xx+1bfEs(r-cKx$G3&;_4RQHBxvWdzS7q<6@!rUMJ%?r~IMKLa|d@V!4AR@nZ44l9HY%IDx6SBUQ)4lL~d53dsP zgKe)8s$nR9gZDBa90Pir7#;rZZDRajdYPD^WO|nvUYzqTVS60&GGTkrCKCtkbz*Y% zcdrwAiO^aTq1^uIWkNXq>Rn>|8raK({2I{PgzXLJb;9-r^gdyGP_Bu8c%P6?Fcv_B zA=p2?P1w#K-X%7k2KF)`z5lzni8X}dbP}Miz}my?>st2pDOoy`*bDufNsJn-eM*d? z?6{U#E37?CtQB?~O{^7m{7p=j*>O9e6~%z)j!$94>W)sqhyc`gP_1GwbVmcQ{;-Kr zpIAQn)qs8|lElJ%P|RCEJ}VO}x+D8~NRrzhWIMq3ND$t|#+HG&t%QYW-WGhTsECH= zf#2G1!9s0ghtKLx4$w2im7|Pg<6@uI3i!M z-zui0ksgp%QO(=8IkuD@%#ki!Nx;HkNPGXNaw#-Ck|FNPKO)x`Ew=O*lGp_}G0g}P z${-V9D3C(MgLIH835%>lK2RulEpuDF^dTHN(Hf8g95lfcJR^uky|@Yuo*6=eB3y+A z&kUjQL2g1r#xp~x_sCUf@XQbz*5W2Kea8@6T8x8Zh>T~3(BLvRX+g%*@My%FtI*(S zaWo9iRcP=uKRQ?ADl}vqJA{TlxCu?4F@y$SxY;`y&kmtscCJE$XNSZ?2~8h4L6;qIvv(q%6-3ilT!jYD z3ZhBk0ij_XFonw+u?4+-Db7}ev!_)oQw;-k*z%vg&9ODPX9i3$i2g&sl!#|6QMB17 zSsqQ#c}VihnY;+ao$1>S)0EhqI4#2OOB|Ewhf(ODv%bwroE4%iu!HUHV)CE{5} zbSdJ1(12nv=l;n5qxUV}Q)Pq|LFuVzAtk#=h?|*VMDO+1I)RiUnv?|(C@O+-nL)mb zNDI<9Or`efpjRy&x;SY-3UH7gct!|aE;=AE9ApP=kR(NOGZ;JQgM1ZT^f4ee*h(C6 zkQ;ca9$lZwO>U3}Nm6t<3C0b|AYVmub^~%_kY?mR>ndEu$yS(xgJWZ`>IPlQf^ma5 zNN%93QwHP)Th{OYDo%qgis$BFK#B^wm&>rS6|xKfW+XS#zE?0 z1}E}N_Xv-vY)vjWNJUWRg9i>oAC6};8>yHfZcOa zg@Y2@!KrW-^CDJq#&sPo%M6*Yf`{u$To%u!U~BjXWHd+h0-jL;T8zt%R6n_AOKo#h z?(wHfP=tDU>&#FBj`<;?H5=UIt2~}HB%&pITm=W$8lv^n1A@aUAPUN$yQ{F}aSa?= zsy$#A%z*`KyumaKSLQbHJX>jkdh&i#aEa+YW1JZz#EWvZfu`Lb;1c!qx0Tp0_ zBWtg?6A01_?p+pvCsr(B%bIYIC33hb39Sd@Dodz?BP&*@h(@9apg4MPEJ17228v=4 z(amKBqybYc|L4$bU;hH#u4%yTIXNl@=~nmb{Lm};!$PuAvJ8j^2gxXhtN*!PTPTO? zRHFsDT%``KPyN5GHpDi~8IT&Bl=(rr)YvXO1FH^hPfh5!E;TwT2P7*8haer-rRI96 zA|2P(p%u&Aq)uNw&t9=22W1{CW*L;Z#A^QslzFtmkeg(r<3`2M0!6NZgF6dCOD?$z z4z3kM>q@x^PCuDvDqwIoStVdc);~~QyQ-I=6b;?4L9D#Ud3t8DpTg15n0p-w*e$#yI=Ja zAGWdqJq;7F9o>KiLt=zPY-hoKEwZJAnIQ)V7SiNDu1uuiT5R@8LjQtcKh)TYrmzay zf~pf5t|4cyICH>&Dni!39R~myM#G&nvR9JH{W(xkR?>yDHeOBp`2vNU?&yK7#smqM-Gl9%y29&OW4Zia*`#u z>W#gMR8F#FkSm?AJqb~tmjL8vP%OdDC>YRR{@>QYVtY;x=pS>E1%sS+V4E=yOh&fM z8wcY#y>{hd5#i-}4J{RS+QIcA+Ftu|v7!#Q*LzZMEd$rfYJ2UC#fmy?RU>dvl>0i0 zTrZ^U*F9TKJqHyMm{|-?ud}ywit9DEz4qi{B~;uF%kd- z#ezCqufwI_PG-1Xm`lMmW?Zk#?X|lXD`s(9U6XN*8Cq03phNe6W2 znuAl{?5zM~uX>n+WbCyy7%L&;w)!UHPTbh5UFIZpa05{6RX1}I99(O{UU@So!NCoU zu~%!%NpNtj347JXoCF8gnxMx<45+X;2u`m(x>yW!_Nsq-BEHNpCKA$y+qe_4qcQsW z)#!Hv;@Q(M5j!RZiEN`Sqa|PcS{!V!90Ln!@*iWaBwWjfV*jrg_Ct*=_jJIBHhReK zp9ky$g7(@DjD--eS1roHFdYdufrFk?H6UR*Xw$)hw87bQW}2L9@PgUw70PmwCAfwJJ>rdoNw6EGmk51z%3kEm&pkQab4NOLEd;7SX z1z_iQ4oFrGaus*80PI*%u7ZO%`5>X1j+@~0k$LPK^Z~o)pd}dOZUGeRJi~!x9y>gC zKs-1pWO$P%>`Ys(f`d0{!j9VIDmZwy4m$yuo8aKBV#7|1<0dqC(-6}Cwg#7krk%M- zjK1oKy~ zz?+wm&_&V%a;hiF!Xyn66M*Mild$T7e&dQQ&zjkA&uVQXd;?E<@7LlW!#5BtV95VD ze1kJ}z>psV<@zAl4>Jx%Z`3zbIekJ_W}ShkKpGoUQswBDmJShmhq!mgKz>I*q;Af&s$ zo*gGBXr!j^exThC_1Yf}W6ppm_flhhfMTw1Vc9lYx`Ts(60p#kd6pSVh}hCS%ZX5Q zy2E=5(YrwhF!C_Asg2nUwN6SCT4s*E!OK{lIo~&#TbKL^VcG+5*%rfPo z#;~{Xaq%V?c>BBb*k|U!Uo3lLOC|PFxBqoO_SFaI2GiWs2h7z4EUCe5?Z{kRz!Ds` z{5K9Vhm7klaJ^=ajH|ratJ!1D1bQSFnFyejYWf5cT6w46S18%5#$z^&0@Cf!^=pbP zo%NTdNZ4`P{aR#8?ey|tFia7Z_^)cPCqBqZM%gQBW2pvvW)3XdWlJ%!RD&jtZg%c| zUj5V{u5ID^0f_yW%5A;FTzkQi_T1Jx%=HYcz+tbfj)Q8DxhR1pINbKqn2Qovg2R@V z##AwV)F65=A5ep6iCRB3$X?kRvthKY3Ee=+9VPO3S-9_pN;ISkfTdvk$ zFzh>m*{k4Ur3RS?ov{Rwy$K?zzsn0Ih^{uadIp#hB#7H#uHl02St1G7v{Kp9N35^` zo8XYpnjd`vNUekL4+%Zf4~Q796&duwe<*}K!iH-}23>;Gr)}n`Rjk;Hu3v1Q56;p|w8X4tIbIx*!NWCa{|=%u|V2BEyz4 z=%v;BwvEqnwgxs!wx~IJ*{pS8*b!JRSL;c?vBZcim!%g*J*xO0J+r{NE9S+b#@ll$gD;8dd`rH$2Q-8^v z1)S^kF1WK{_D-VXpn&6AY_3=jOMQgm_6 zB3dTF)q#y`me9f(u7ZPS7RYEV4p+g!vkGLc*FVVP83nQ|TfssOin3g<;MgBpnEbyz ziHr=+1>>%Xl*6-0WLa)&UFMM1@iy4 zuz}28VFM@i3Z6|Ovv(vIGe*$kO@ZhN8C^54PavZQdG(EjVBZaBU3wbE0O^jdkkQ(J z{w=cQh%%!q5Ul?YU16Rt!fMpBS26Gx4ExL&$?Prn=b%vZ>z?cS3)d51?+h&tQbP{c z6F|!;29#tDg2OydxCV^9Gm`#-VPEafUabVH6+d7pBpItHAb{0{%)>rd@tVC72DfA>D)4g8^hDa8?2=3Uop%)o`NM#+*UUI7{~2EVek6lKc@ril~*u1%pA`D zm@VpEkjw%cwv-D8!Rf~wZo70;+}Q|wrxJ0H8dTib2qSeM;A(sJiaj_84)b6PRz`rmGm1C}PG3EPmc?*$I?#LHfqugL!It;A;;L0)IB=cAg zR-=IHN7?k==Yj=wxa~#u-sge^INbIsna6stWENX0l!Laf_dXXasKb^9+`p)vMK zX*dZEZn}oO5*$u~gBu#-dWBB!4J`hY9j;gG^xnXN1vuQ+%6%<3*K2fo@1Mbf8r;^x zWZd}~_Ya!Eou9E+wZp-I-A`7yu61#zhwK#wagZ9lH>mhiblEEm;v_h@Hi_%SMZGtu zU_l*jM^JljP{9HmZfo7%n?A4rhui6z-Wxoy0EgRJxUZg(mKN>_n)Zn|Q?LV%2xRP(oqh_9Eq&V4 zFuCWL7-Xwt3U>BRpBAz21`I>?T0+os_|Ly?heyOqdSTcP2+v;<8kU|0F#x(*NjE=2*f}^oBqeV2(Iw5SDvEoie#Kt0*p{v{fG1ut~Ow=IEB>^#vMdxxypc& z&Z=2Fhl;}TJd2e!4h$WewG0=8Mh1k1YUp2Y0$=_Zj^?jAqeC%(plKZ~O zYVP#6S1Em8Wi`Mw+}*rU^nBKO`+G153k|{l%Oc;X*myCJUkMA%%`~+P^dxm0*D^f4 z9o>Aq3>cn{_R=cuE_TwIb__RfM{j@W<;XkgZno}rj&2Twg?+zQV|dvz-0W=Jypa~Y zfMLVVyFgX4p}UcrBY2NNpummodu`i+J=mY|e?YCOsfK(vIN%Y8!HWj|Ufv8>O*eb@ zo^$c^84iwK-k$yhab-LAwdlUm;8{ISJAgRAPP`jCWD6yzz&Dt zB70f*5#1_O+X*Ou7lUXMFs7V0hK@>$V1?3Z~+X+ z*ahZoU@azcA>RQ~fj+>>L9ikdTr>m&^r8Z|0f^v|15Ofn09;f$@ap?WU|(&o!*Fx( zUI*xgGTG6^o8bwV?E;qlsWA{KM&1Ro!?1DX-Egp@3;A#K5dN%@S9rk)fIomwh)DBd zLcvP9nUd2jOS<3y65O$fKImfO;03r#l%>mczo??(z5$UmX%fJlNCXt3lQ5;I>1_iJ zI8k^m12ArkfwaiUV84U0 z#P9|*L``OQ_sCL6MA{J7uFs|!*l1@W-%VJe9NIfFmO-B@Y&?*bOjaNYLbexiMMYK` zNTb73nk)mFW_Y>#c-k_g(Kkdz)!c1;kP)fNVAwJ2x_|XrMDXx*xAg*Gf|0N3=IG5U zDyr#b>*8a_=zfOPBPu{4xG^6<`XH$KczL_Kg7*y_y#fo)8(rTBKiIFnaAAZN1?g z`kk#Spi4jPMaG`8^YMUBqROeiE+c?_Q2|8(O-xhRX>Lmr|xL<~e^z<7Ds*n(xVZVn7y1zGT)B0)g|{HKVFmwvy4;fZ3u z*4}oVjVJmz5j-v{OCc+wcO>+V23|&*B4c+H?2dxnQL#HJdPkDQ?r7*8m5$xfu_xuR zJ2~u59lMi9@96MJW$Zm7_L~a!8|*<9dk_AmhW$puo>a%~AY>Zo9R+)jh!8*)j9>Ig zB8DFw!;gsJN5`NhLi|**Cn0|DNen*<4f_qlkEVv*Vfaxn$cPwzB={SK9|gmY2=Rmc zVfaxn9EcD<6|7ARKMIBs5yOuLpTzK^VvqrnqxfOeB|-jS93x@)kucmz5I+nD5{4fM zzK7vQqshwB;5QIQ_%7rjh6iX6l@bg`&;)u1=mta#$`T@M$e2QgHY(k=KAxUnh@t}z zm2O0C9l-+c?y>3N?t#3I{tq40-TDC;;(8j$_kXDSzVlnC@xbZ4sQv_+@(*KzXxVPp zthbY++Dj8|IGAqgZ#u>Ar{0a(5_>Fe6CUJ{4bz{Rr=Ry(;{()Fa1U&5svbhM+U64xR95g9NOe|;e4*!^Ua~1ts8%COxoaG;nUWp za9xRXK=W|(#=sYCUnV3{-DZcE*pGb~K4H&tornl+&Fabfrb{PuB)0FUJ*+fr#&&<* z2369-j*Powq_k4627aqu()LcryHh^!wJ_zK|I~1wO{HI?rfz(l{V>~9sjHD(@}*2q zk*r|#^2e3Ct@hcMw)>d`-wD-78y^{_9ibb0RWNXQ>~z5yF|%9VyXF6?m|DDAHZXtI zP>bVph6z>iXMo`$Hb+X{+DOaOaMRjSg{k+$Z`ohn|JK@g+9KZkil-mbvOQMmj*mR} zDtQ9`??&>P26CqDu=W)rloB73b&fnryk(zhnijWY&5Eav=NCmz5$ag;*;4ms)|&5O zmJgj6oyBfn1M;0iDwe(2_9AfRyH_r?HE*3ZO!3$K-SoM6_jQVhO~I|5bvLyY-yPQ6 zl(MuX_SNeXkF2CSjoxLa9_}oz2wrjXsr585ulZfN;%#JIe|N1enyau^YGnE+Tl=s6 z&Uc6(_w70E)a1~m%4;KUYAv7Tp>e5L^Vquy{)Y+UrP_YK*oYc$MfIu>8tYVB@b%Q?D7ZeG4`ZA?@0 zd;hxZWwS4-jf+0pd8z#;L(6)f)%IsiE(;77=jdBS*1X&*>^tM=vQv7cCmlaa9a1-2 ze$mBYY-n0Qc8ZQ|{piH3aJ@IhG$G%wN%_g5>HfE8>+k<&|J~{QB5l9Q{e{<$QXX%U zYkgxAS8`f2MQ+%bNu$?4da~#3wyTp2H(B`96IN~fWNIVNP?XV$cG12!$2WwppnZ#% zpW|GkhBRq6g43CDq7i?R|E22Lt7R5!F!?QT<;BqWXB8ty%pnX}ej~%8_!)s;h-dtR z2tr1l`=_R#hl?s^tdOf)pQ`hqV4>|bfOuZ;AOZ z?F^Cnx%O)DXLeNx(ULwK&;Ipga@~sA#le-bbKKp?->0V}lvMKuA6S^=@VNGvh4-8z zGkAk(x6;;`oPR6uDRj^A)xV>D&DnD(L!jZlH2;-iozP3i%j8f0@HLuLD^7{2GsxJN z>6!7fwQcdoh#9v>+LQDS=~YMPHQ%qx^Kn}p z7&w3P6NlUJFUH??DU^-i5!0P+AW-($sLZ%*Z;h|DUY1-ezomGL>@VlW=6t?bf5Vgj z!=|_8zTW#|CJK(vD&Y@^z97D2zG3Hb<><2xuPWd0j{ER*p-23~;pdiY9$RSK9A2q) z#=>a4`IW5?sEo;T{8!d1SqOd|k($>aG$r7MIDOokVas#1;zvrm%nFP5Um8H3+^!N| z9qpqNe*e9p>zUsIbze>1ou)`Uvo~$ho3(C<>s@cjT`%cNir;JrSoS1hnT=Ak!*c28 zLx)l7jwCcclH;*BJwGyV=qJDB5BI%|J0loW;wYZIQg+M(xyVJ4;}V4U)p@0lPf_a- z9p$MF|9zwC_QUIUZ0G@Fem%;|eo-lWac9jnMYqqXa=bzJ!uYa9>r&!ZfVOr9;a<#O5PdW9I{Ta(f^lh@DBe0{6v zr^)FQvoGIQ+H{d~2kttHWZ2BzIll0>b0J+*IquiY z!niE=?ZQ$cl-$LHQ+RCzn#XQ77HBf860q0T(EjkG-RE-4=-*%T#KXT#tzEZ7?`%v% zo!#1XyEQa|ZY3z5cvWI`c>kj;!AX}p`Sg69i{6HNP>!^1U)-LW8`+TfVDC@0%^wXG z#aT!Ga(NWmlK!l1dixcgHL^p+Y!5vulN?uaE=F+fsOtL`tNDFb8XV2CGiz@x^fZ## zmn8ln`K#=X;pC}L7XBDN)6d#lPQ4zMQSDVXRf7KVfQ9Ch3hG7YwX^0NpR=~2DcR6+#f~hKaElL? z+G3gWoh|CC751nc2@swq-!*EU-qze9u5p1p*PC~k8NZzMDpdBy#8JO1Bd5hLwXqM8 z=#Uk-WAJg^T>pKk2Q-i0Tl`tv+56INophJ`r{|1%P+lIhY9y~$?4JF?x?h8&ZdEP& z_BgO>XxBbxNs9Stjl-+bO`+<=FX09uvD(U`7jaR%Sq!;S$iz|G1 zf0baslxgFfocL7p2;1@p&QT;!*%Pd!*}R2NtCGG^Hb11Qa&cYCiP#E#Lf(T}5-Y|NSK6x|f9g_S zmhSC1_C-?aBkEq>FUsjE`7h7J)?HEMkxG~v^6YiPR;%MysysTu))c;a8+z^Y$l!O^ zX$j*-?eKJZxap+n*$91I!R+HYe##YrtqQBZ6Bf_$%2BQPvPkE%iFwYb9iPQAel?g^ z^Uf3=H=^<2e#PZ?f@mzz`_%UJYLtYDl(y4F7WH=~;?_?z!X7%j;dH%p?7`Y|CwD9~<}aNYv45XFSj zI`Xc`iwC>?vKJ0{r~PVU+YOy#>*E|FMYo?5?<8#A+urHdbk4%lIXd-pd&=dz{oHkUU zY4E90?OGSxeZM=;Qc8C*e^y?H?U(~@cazJEHYp44id~vD>)Q3=-&21PCJwuDJ@`w( zWA!ehp2e$#L^qRGmaj z{q585?XGx|H#N%c{m2de)SZ^E>wsNsiUhc=0_WUHAr{SLcv;kM#i$Lhg*R zjdOctHR_G*gT`7LRlQdhReV2UUon0xYuOVjIQd0!>AB#M38gOj{8JCjT$Wa|fp^o5 zynv%Gjre6~D?`VfFBMBVopm`=vVHSSjVUSDx34ibxpZl@+Ro}c^4ZA_p*6#oi7TH? z8Ci5WUoqsmyHut0$^iS0gg}*TDMrs$?lk#m?)~k$TE2eR#mI6c&p?yxE+J#Vwv2$) zo2A+|{v2xTzQ^W#^Gh4*n)600iUg|p6Su!SmY34-zWrcR%K;m*vt*t9Z)4S<$K?9v z7jHxyb*=cOm~H4H|B!F|xmhJE(V;X!XM@qk)RG_k#-(NLrY(iz9NWw^sjE|R_a!fj zn94sz(5K5pW6IMDD|5tkuIyAum}Go?U)ZL_Dpw8^1eA~es3je-x+~CHPB|g={SmXW zEHkBS8N2L&_?`Mz!>>fF5ta|~$&by)efij9Vn<8JK-$fi5Fvd1IK5! zR8-fGcb&6i;id%7xUK7NILUt-DtbXe+LtfEBHYDiRH@5TW69!Q8v^(QMa)yjUaDxF zT*CWX(`b*xxMkV?Yu86@8oliWZ;1MjhNzux(spOPji<j_T`6ZAH|pO+3Ffy8m;?EHR;?co=fEAbHzd)jV?&F zY;3a1qe+d6y0Y!p4u17-{Lyk}Ul?xKcQd|8xvG(_y4Kjh;^Ow~gsG-wL%l4PDn0#X zEi><^tZC@;EuL+QeRrP?FnyVMn{r?FxBR)Ys}8vxmpI;_a%j%Axi9ucZ=2upb!LR| zvt;*9Mt;gE+q{Xw#_f_{s8f%hcE2IqVPW9x+Au#h^jF7{Mao|*C-`U?9h@>Pc5-6W zyqM3~e9bGuMPE6;D9e*hE5CTat7+ru(5ZU$6&*gC&VC@c)tr?JjQO~p&i69kW=ZQd zlZh+b7B3B*)a5$$u1LJNUH#`#PDRz$4kH7`mMAw&+}OE`I%Z^?rgCo0Au$`V)gy!F zAFa5-H&u1W(}3}^B2zDzMkntgWF9{=EU#Kut}$1|d5ltS=fNw9L)@qHtYE;?GN z?xWF^>pFLWTX@vXRT-Th9&8uhC16Z3nJ%$&jmh0c(F0-ErDQH0CB;l`jLI{x9{EN0 zr2Bk@v645YHLQ)@t;27gtEKgBlE^IbalVyFmF-vaT6mr{6`5vj?DY8h*mTQ;P4e=W``u9B1%qQMnmnBqhopekPGd9nyQlIzKr6TZa(j!I9#iY(kI!Uf;AGdwuwsO8VybZHvuI5`%o~354ac7yj(wT{h z#!pVT>8C7vu=K<49AoXW6S}F#ztt&(y?V4LT{rZ8^_PQ@pTd>B?Y`QMXoxS0GU*WF zS#|EZvZLV)!wCnLsO~$EQ{MHeR?19a+o!10dk(0nX>I?SA@V$71;gTy|Ad0a)|6@b zm8G5*t7EPfXHP47UhMO5@AV5410vIQJPg*e?DWldem}$Xcf~@>cY4unCTd>=y=z{+ z*phkq`Lk!@LyMFxL>pGqxP@F&snVq^1v3Y@#?C~;K6-@ZCt>w!XkaMd9J0bN@S zeZ>X2Pv_-MDlvMy%$ZLp(B@%m&LbWz{;5~JCdibxB&o(+dLpvs@T%3C-$fSt-3zQ= zX7x(w%LVPqjOiO*JQ|^46E|6ZFTd~J%(c1(^I9fG9F+4+`pgr#XHG+syzEH1z~GpS z3DasWI$U4DJHzc|-mB5GZt&$zFl(#Xy5NdiGIeqLi^Wk=B@gb{uTMPNrU@pnd<~nw z=8nued@QU?&ADCt_w;G@R%gzwlhGS1J?GZQa-vMq`D;n3^Ui-b8ZEK2s+LFW>1YSF zU8k;!Od36Lw9>&_;ZqrP`i^b3#P*w}2fdfr=lj}*yd7)l@j;01@=IZb@qP#H2&YuP zd05#Y@Yre96MHZ)=$v4sq}%mziY<~8?K;DJzLWQjTaYFx;}IkFWLe`g{^*Iz zY*u&D4yXyMG%6AFb{_|vnSPA#p@eg9_uTq=u_^L$NQm3z zAIds`&MRl}7iJbu4lG{~{idk$Oz3x~Uyth_@0l$+tuwYNY{L8IBS#jUAeH$`7HYif zkldaXMU%X9llDHr+sMe_L&)g06$$&trzk5LuP)T7n|>+7%kaTHa;1QMfeY1q4}Y$J ze*Dac!;+^;FCSQ3N|dP^?^jbmI6E)0w$@g)w@%-nUD|YPrA30YfE!;0L!)p2RAAt7`MGw@W?c~oVAd6^yu`AuWUycs%evB$U(u{988nGyU8x}Bhh<&KpiBzOx>7+N70bF( zL81=Jx>5l+Sk@KIwPIOUQ2dK!UFo0?EbEFuiDg}>00%7VN&*>Xm~{m-z_P9+ObTGa3SYT_s$#x z()Zq-qC3G!Mn(XuV1M7tvGA}7LxxBl;Ra zG!Z6`WdXJ5vRGlrzbB8WXlfcu9?Mf@&}=WF5Rlw4N-}h~BFJ>-jeMsAPF-tdT zsbn;h^8a(kwhWj9{{OjSm|F$|^e?$%EGsArbH_023v-V!uMBgmSgunR<{n{Y7t1@U z!{1=u5zEQS!rUs%GQ+$hY!l0^!Yr&T%&o#KGnQMWz&tjVTcyIhGL~DVKsaIU80LVn z+$ss)VYyY94Trg78qCl_{9w)*;s^7!7=GP3XAD1>@g`#U(P1kvHx6^v7=Cov3WgsY z_5gF^Fq4eoN5^m=V))T8+`Dtf%*-wk!x3h$Vg8teJq`26R16+A^2cOlG+#}^aO}<| zV>nVV$VnKEa5VtT9m9M)%pKEUUKzs?=FUkNj#Laszyu`AOoiELm>-APX^e+tOoB*| zhgk1qjE68=4jw^TLG#>L9-Iu<0KmKM965Xj>x~Tg31|p8MaJ-@Vm*=}PvISgF8~8s zH9>|li%BUN<0)tm{SCvHjA2j4@C5*)zhU?S@X$L9Uovb3!9~feL?8NTnEcSCsIpI)BzPF#EA`vuX`_^IlH@6y&O?nv7 z@w&F-#RV~uTMqutofSXN#ZV7;w#j!iwm!RlHS$8m#r11mym+zQFKK(>1Tii_5w7gd)y}J-I?t#uKy?OET=LbxBb9MRofcHLg9E##L?sMEVr0bhdgXY48 z=Uyy3^0l>9sH-x1&6=*?Z8tw0KDXtdT;Z4I2R9F_QGD^j<;Ao6DsQ$I8i$755?dyE z@~Y6ZBeBy3CLK`l`TD#@eqqUGo2G-8zNEPA8ke}}%+n{|cCODWREat%qpcaSTU#gL z)7x)*<1SQ`x=3cH9eu(ZnYenSFL~BmQ@NWPgzsOUub6gNE`P}u>w>N8U(YQbdMz^U zLR?&2h3CVaLMO|es=bCpx;+e7^Ke1y zTGQy-*l>_BoBqzLNulW>-)Mzj*WY}ZKSEbdDYJE7prU7@N!R=O>nnadE5D=Iw)t+w z$Bkp21;4eOCS=lTaCrG)e)_$6@pIZYWHDM-iv(w%+?_ZluvIlFROhh7!Jn;9S{>_h zu9nH@@g;2OJbmNjwZut_ye=KN9QWhn)(e;84m@r+E_6q{IsNK6JFDME7Hl#dreV5$ zcUp%_N?fylsKOC~;O-sQGn*RZ#fMC2eLPt<;}tD&bjj3JSHn&REt@pf)G5=Qxcg*c zyvv3$7GBNruUfy26?kHybwEd&bob&4Z%Nk+e)TWZ1mC2#5R89uv;RV zYaO3Iy09)vYwMim22=fD{bL12TAQy$-F%^;yj!T`$+&dtkKF}Fi!6$6Jq@ZkGS?#R zQ2W_UtvgmXde2>LRIXJO>SvZ7M}N=fm3hYAUQD|%WN*i^nOY<6`8#Aq`E$y!!=Ieg_sC#D2A{cIuq{tJO5>4QHezcrWtymb8N=PDO+X^}#);ncKpO>dK6(`U2AwjEg+v(m`K z$T@X#`K>AOa~H@g*jXoH<;eHuO^e&*+CrVK?dN3Qe)L?|boSJZ{Yy9fs2Tnkvgb*Sk87`N8zp$cMmq!RlYwJ^ko0;_C`a|XNg9j4{MuW@{jSzuMNtU*?7%MY1NwI(i<}sCwpYs z`ClTb?4KAjJJem<(e-_X&l>T${szfQCYBDHGTW-=v+L#9*795Dw!2xk#m{&9QdnS1 zroEb^oICvSiOPM?{SA2-60zm$GAzS?%-;89qO)Sa7TaS-=I$Q1-dFTcp^{?VqDn1^ z64GW`iMo2mHomm1>=cPBmsGzxMX1P#WLmA1&G|CLB`INMVtR^(;l8~DElq;;=PB1a zB0{V0tF;*isJwnKUzUk$@3^9#dXSI|N-$&nb*PL-Q71Nn@RMPFu_Gu$p4O(;T z1%C`TH5>Ka1e9N;?tYw<^~qVpY2fLXQVYC)`BgC zozyfPZDn2Jnsr&R`*djUvL_ds%_SbZZa5@nUbS-bOkI*pYyj0=+WJQqb>^vscka+`unqgP`b?zW82`JLVwc-aRCYA^2v_nbD3YVS&Z`Cbszt6g z93pUe<6=SCtePt2B~1_OiuK~I6Qf27dh>nq^)nDWe)v&J!#Q66F(0SazdQELVad={ zjnxZ{oJwn)6&Z5k<=T`giKd3vE#Jyo{3?$*GDa`AZ*p&YsX20`&7`5W5nt|flu0jJ zH~)bu{juHhZy}n}ib~IGmz@lIo#cEXSu0D&XpZ*OU2}Y0?#(%opkOPszSuLTBdx_$ zMVlx8nV1hT^755uZd<>H=*=4O+2OE;RQ#5#lclxu7JZL9A}90f!|Dwqu4Ys(RFpj! z#-sDRC1PUkHl;3&muo4*e_Rs~Y%%0-Uvt^9qtPqs-NH{rslm;b8D6KNa%#4=4^5lk z_PzDnqUewZZ=9lA=av_2NyPIjm5G{h(Y?W|C?Keq_F%f2dnZ|K zS)^C1;TZ*$NtRi&tgcFmN(GG@r(=3uCroH_muSnJjLWeptxttYJ+~b>Q}jG>MdO&4 z(fh(WTsQFvEjFn%x0{Vw;_*c=)ywgHTFY+3j!>+!Gd3Ri0 zpnUD*oY{#FEUiU0th@H)*kod$->F;II*mRE=jTLbK7YQn#pl`ip~@W^83P??F%=Sb$xmp@m_o5-PBc#q@}gKfve=UQG-(WO;6ZqCEHz3O9=lIJ41iL zf!+6qD@BJL_|!rxXcV>)Q_J5VTzO09ozmU-=@L=9c*0Lk2_dIwyX~vay)o}=ru8`y zEBo6keuS)@`(w#Ur8x=IR-=8}f;2sHFQ%Vp+Ugs>CG0f6gqT=Z#EdnKNh&k*=&eTl z5_`oYo?OZ`A?WU{PA0Z3u|8fiT_R|gX3Y|b$H^JDW1A>;JTI2I+kG-#Wws}JnzDxz zeRWOxp<-3}(k<;KV~b_|18J|y9!R}uHnMvcWj0%W#fPxAM7XJh z@^Z(saw1~%p^_hr<=RdkR^}F@O>HEzu%~>Y$P-GtIw1W1% z6657D{#E94TPL-Wiqwkhb`-Aia~@JKI)l$zouH& z>24Kw-bq?>mD8>{`*|-FOPml14qiQb%44fvj%w%Xiys=hOfOuN`2MN=Xe0Wt3=1Fm z%c&|t0jWA8th$^_I?OYh{e-X6whG+fZI3zUl zs+o38DqT^Wu)$;|7zXzQB%Gg*RYZO z#%Dc|w!ZQ57blg}Cq-lAV>B5}JC7dMa8i!UB5XWAv0>?!gEkw+-d}#xHdkPaMuA1( zg6eef{Z~ZQ66GX6xo^>KnX_s?Pt>7tsRokYum1Y%Je+W8+xQ!^?Pnj!N*yKb|5;Dk zzl-`ncx6Eoalgkc>(C)<4h|D!7*8y9%1fK1RAW(Es^RPN^je^L*z-$yU#-Y~E_3svl(tbEO`V@e2R_}6w>|d0R%a0*U4LjD(S7;4k_j^u=|d6q${FzLxeB6RE1i=!+)DVqRq)Aetq$?l!k@{;f&BcVDP@X?kUwb7b=H z(HUP_Cj2V8Q*Gx@iqTwNe#Ts3s^2f8Mwz`5Pxs_R`d*H4b3GsFn^}_{aC*MTJFg6b zLbKNqZ#xTEGnNBNMO6Rb_* zpC4|bZ{P7PXPobK(w^-%&f49%slQLI+BazP9sh6Mc?OdY>ba1gk!H29U!k~boA8`j8?UL=(xXo5Rd|2H)*Kcz~&KKL%sE-Y)XFfJW zpIK`g9kq7Mn!KX?gU8tXuRmNnT2+H9vT{LAU^{r14 z-%3GC^WWt5wtsC~xet!R|~Dxz7!-lO9StqxtCT_U2I z`&-QJ;RY3&tnaF@h}hU$i>jj;6T6_Gb?ixE~%f<2G z*6DlS?WLVkd-Nel_oQWGN10F9@5#=gc<-V|*tak!yLzmWQhRm={i<|1QK(gvcfHF5mHOcd{0e3S}hz ztmV26;wwu-OP9y|$p6_^y(nT8$S;lG?G(&oH& zt#o_Lkw!|X;Lp+8w+-@6#mC35s&6oSnp`pRrCR*bBPWd|>MYZ?d`P`3Y3IC)q)%12 z)S^@0_>HEs7<_|r(e;#Rb&g|(%=hV_2gB!#nL;WuQ8KR=stVeU$~ z=CXF}t%YSLZ=@2l7v=6+H*WKe33oChhm}n>Dw-Env|ry-ftHnVwZ=L-cJId2kFDk{ z7A8Nt%Fkb*J=IOv^EPXe^3*6Y#fjt|IRTmSlv7);|tAnbVqykaQ#B7k{|Eus+|0~#=ML8F@jHB zwUpRwoYB5iVBY7kybWpg!Dd=Xa=yOCo(WI(+RpJelNkN};G-^rzk!?W%U?J5f9dj= zR~z6yZiCEIQU8y1lXcgq$CL&aT6D_R{@i%%`cbM~<}b3aEUA_*!E<& zcH;=0t?w@n7f6ZNw@t=(K}5Bx==^27SKL3+CK;ZbG_h_+!H7!-JQtmuzFuVc-W)v# z#k9?Y>B_;YM2_*zlr*>7`^g~ouH`K2$yyWl-*ytMRSD{J_$IgfLeAF+;t=28%AH#U z7$A}*Oz{^Zd%U~M_vLz^?5{B?x%xJ>zisQ+s*Y0r@<=eg?U}<8uaoJ|wtvXzBAu$z z^D8T9I!vsj2W@)A=eM^jFd!q*&FSOs=h;^-NsRVVZX7=;Zqv~c+vaAuJMZ5l3{yF$ zFB!ICRpJz@2~U@M>qqalcxq-NUZ|a;xoY0bSH+RS*_-%2rSSQf?8$t%pwn)ut=jA=bmd301e(@+JOz3o8=YEXu@rtII<>z;jGmhk6Z_b-#b-haIT*4C% z*^~>H-@Fp34b7xKHlI_fC$R0palUqk%F2f=b^AmYN=I6R9}b+GS}%7mZFFYDxb>HQUW87p|geLR&#fXWTFVDO; z?`(di**CvOUKw`20gT z{l#-nKhLw(Se&YOfOve9q(a049@6+xW<%X*GZoHzkv6T&eW}0MRB4fyX3}KeWsi5x zJ#ce}$Y}mBk>fIjwH-f_MTcw4DBl>OHo>Yene1VL;VtdU&0_EPj1j7^ng28Q_xZM(oJ3zaLBqo4 ztJ7LSUwBm7b_)R~$*J7*JKzf(I^pdTbMyK$3nwIk!m)5W6%{qLFw znV2}JnQN}Pwjh1f9o?^vIZk^*>OMt(pFd8cb=(($lg$;wGyI3#-(E38M3|PHIsE;^ zcU_Lv6uF|Ry-Qa~XsNG=P370Rv@$yBf!W!Wk^(A`uG&vT)m5B?%h!q58oxE+pIYk^ z{2|kr^n6{+{x^(Z_1xD7C$FDmHZOu0T${O=^nKnwqR6F0tEs<-p1+;-`>3$XN%Lj9 zsr>I1HcZ|5GqP#%hv`>uSU(^LU7xljLMX}BW9R;)6DN$1mpM^88U<-5KWOA1=oCD8 zQPpJn^}KhcBd0vt5HBiL>RBo}qiX0X5s^%h^tIbAJ+ic3@M>yI)mO1!#g7dGr|W50 zDa84Y@A}Y@(x$ujLvmV6dANRV?KxLz@2hHas;(AazcRCGkz9Dy5#u6{gXWp%8b+NM zXFaXfqVCP5u+D{a_ru~{dr#N%OGrg2n4O&$cSFWLdBOgwA2qE@j-?Q0e_j(XYK;An zrGYzUoS(4cQqaw6$+6xu_sQ;@ac804V}{t6%y98T(Hi%%Tf-XbHb@MADeEq*&{lSB zY@BA=^EHWwOqE+#-d=L7GLL8GrlVgD?-efADDC=edp^_O%f>+1w0n zF~^Lx_WO=^0lXie&ih0U_iJfz6Sn0o<#ahLUur64Yl5tKcx#l0I`ndyv28#sg`8ZZ z{~}d9K^D{Yh$KapYE(>%q4pl;+YxCEQ+iC#x^_K_4i~#D`s}{dIa{>$SC@kMF`h7l zw~xwOWa^u@sWzWNmtQRoHhXnt>?#oqo>-ACZzZ{DSrZ&nw`8h6E{j5dsVX5!KM-5x zajQXvQ>vP_+G`Ws)oH1?LJJpo} zcp5VAWHlV4?ALk@p;wJpf=hN*lvWxoVd~XM{_gDC@8R!Gg-=0c$UsXf@OV^SmZuHA zj;!uG(ZJ0MZXo63V*-<)otiU|-9GI&UnmVbsoB3%hkn7ZuOq3O6EXM^V!H>*6wyZK7DK1j0C+QF=hfU2fwYktdSYJ2Gu}$ zuuUWt8`+BHHB-FxIVyCkn^2!Ciy{9XnQml?8Z2SezAzMBiqf@E%B4IHE_=|9qm4+>6Zc(hl9H36qQ^`?-t`T{!5wJzldZ!)BC38b^YI-*^e>>tKcF=wRAq!D zmHq{-`5hni{|0LUac)4|;@`oVK=9q)!J6ML{8>fgANu{zV9kHq{r@ah69_W=_gGCJ zQ~rC2ocjtcz(35ufA6uH?Dt}hzrw?Sz{Nix@3{U?z&lV7kgp(L|CA!%`uC?$|5LS= z|24LMVeXh%nSbE*{;Jmk#FDZDYg%$J{%f@sI;L-z|G(G}Vz&>^N^ZmMO3efw#Ip=y_8gs{SaYnMxbG_X{w$Okc?iWGhq zUltoNukcxUrcCtO$m6^&a?9w~3tW^~(b+QE3}w^9aCrle#l@I&@kRZl9}GA!&YpG0 z-{LI{qvhd4oUgm2!Zq?TFhJzzgNP|Kyr^)};N@?qSa9oKD$_d0KTEd%ESEP-%S_7= z#7fCA>Qw;INOk+h-eJ^=#Hb)I@}>ZT9UP?Dxe^EDrJ6en$jr^sbjK3_LVALiXaaez8 zHP)-M&E^FL0+Ks_9#0+|gjy@lpvpbGQl zu_=U^=Vjt(vCFD!_Ed|Z@#{JwqVd?)r<+xh~)7e=7O%X@NRs?W6{I*+P^2WO5I zsi%QMYJKT_efV8j)e{B8uVgoX>tu!k#(&}F0C$fh(G3p z>NC7lyZ$Ar;8kIZl9|o$axy9w{)Dd^zFf`HDc*If{W~#w6;@rZuP<7cuWGG&x(@(F z*Dk{mVtFKChbLk)3;V)7GlAquYnV(=R`hRBc(M1_G4fFZZ0<@aUphOnmUl2slv}6s ze%y|6i-a0e0b|X)O}VXXXc**MPSxUXs5}VroF3RF{NiFF)vRLsi6bHf&v09ubM-ZM7-!6*@wmLdt4bpp|aL_!Ebb$9^O%L12vZ zneqY20Be|V%IknyWHj;G9NI&5Ib!|phGcB!Fi}zzEa#&Uqnmx^fW9fkOVVeEFBB@D zx-)Ero*q5T(U|%g*Io|gJEgDb&RB8<#W5EH_~S&c1Xp^~{`Y^cdlWV`1W{1%Hp!~OrSObU2H5D>CX zsOdlE!tc1xpSkc)hq`}^>tBaCMh=d9m+l`P{yNMtv#`+vsYaZ@!|H>F#2j2)^qh!T ze;{H!&<`HS77wNC9`5oTs{T+W@S!x{kFs{(q3RFC>K^D75A=eE(tHo}0;cc&{V1{b z-9MHGy2E$>9ts%#pjSMQCjLaP_)*gD!N2bwF+KSAaL)%Q{sRr<0gC@UW)Jj=2kOBC zwF1aoxR1*Nwc-K7|3Iw(R^j{hyYI9E*6;UxD9y+5eQX~}^Zg)2JWvh3_l)_$zX#&O z1J&T+E)V1P(E7vpeeWmp1GVD&xIa)U9ts~mP%C~=G9LVUpj~_)zXvkI1GVCT%JG9* z@qKK6P%FN-{)1NWKyCP*pRC{G`9P<5pyT|YQan%_9{hW_=L2=*H!20k1I^;WzlVE% z_m3Ue>;Lc*&bQ_MU!HJ)RfSor`pA!o{SLju zK8TvUh6ng7*l3=(lF`@)H{{DYp&}=1+}+$cOkSeZU!8C{oGs5R%vTl2f;<8dS4YBD z#4LP{;$9`i1lkG%LY-wX)&5aqWa%wP6ck8`R;{7T)cUd%8OS^Ya#cm6{fi)5IC`*J zNRZaFqoWa*detD1+NU6CaxSaE<85#RNT9Xs;H_H}DsXG==&vcz(~u7KV~F<^)L_qzCCfGg29+-Jt)9=2h4XQffX0JcDYKBq@TF%Ystr4Z*H= zY!kb}Yo^14XzE2*B4+L_sB(g@3!*M-4s%sPG(B4X0^+=gZ{bxE3EJWV34k;O_Yy`0 zUrz%)3+BN)$dUJzYi&5deGScap%fFO<72m>9VmpAj!}JL+Gbe_@#zbDZl`4}vRL|4 zXIKI-FHKW1l~UP!e^oPB*4D%oUXVtZL|wEUubed4dGt6-!SJ^31F$h6%AKgG ztbe;K#A6C|1DgWo1zo37O-p}L+`0?G?X8#;fqLnblC*L-CNR$&?3sHt1M-U@Af*GOz^nQ84YjxWs8F+qY}5IoMBcp;U=yM>^Yv_X5q`rT$XKtT!$t{6Y>J-= zI36l4dD%q6WoSjR2nxF`}^pe*#uT7{qpYU?nP_0j$#0RVx z39G7C4n~$$amExrk5&sKV@7j8e8Chby@+{0dV1!4?CpI;iR*5BC@~7Lc(Hh?yBfw~f@xW4=F)DcFksyeD} zekA}hi8i$Hy#S^ZP8Gq8;gDa(TghyA)jfjcTyyI5Kw+1%{+uYjLc)3HN8S~ zlEp}Z3~$Dusv&m5S`}+mh{#2RY6rLkCDwi%2KLCh!G3LPsSbzbqP`BXmu=8Dx_MWGzF_IY*}8AR=-Qq((Ph(L8j8B7 zvd`>&0YR4*?uVR;!IClTK5#2cPH`-uq?5sDGi@2!+&!^&9+PGpjmw*6R+>ejR-hiH zW}+?|7z#%&XtVZc-EYNj&2QCjU35jXxO=_W*&QTfHhv_xvxpdcRkL0E4B7%;1f<~*+#9y`<_fp)U>W$L`Es& z3>F&2oOkHHEX*{_9Hh*jbwff(5pzXy0-HYB(A2)5IJL3d+G|FEG*FHQi*7fx^Cq1! zIKI;4nc;geh>=2dt6WxYRjkocXKV*c6OyQzt3IHU`$<}?5v!B*O<);-5Z#|N5zS0BIao7qOIc zV9o2fxh_cj>FGzD@z>n)RhnS%uvF~HMXgChJ!rBHu+F30E}O^8Pg~>*xfk9NDS20@ zoQo;!43n_?1<$2-)Q`|?Dksx*prayNh1I|-z>R@vDR`x02S*l42IHJc;P7H7)Dvbc z0}C@^bv(9g@-$g(IuAFF{*-oTdV-_;!Y<1F9h=Qk%G9pm2PeuGq-&6@5JVl@rf=dG zNN0_MtC2q!f|K_8Z2(tqqQj}soFFQtYpfC;`&;DQjjf2wW2_Rl8v1BXML3d(9YnTq zh@^61?Vh|eSBs*_n#H+vZ+5hv4B?{WT{A)f05=yvap`)T<1t;&)Bw#MY!Kd6A9a5p zzo<>%Y=en@TiDV?T7BaD@bqG(kWi`erTZ-*teYxpiV zstXog++A;-ZeJ`x?K`}_(Cc<1+A-QMz0-a7xq%AB=7`eU%A>s3u~e8dvsQ%qv&iHrRt@V<3 zdwOvLcpMYsmb0}usqe%+_NUk#AaR57CB=MA7?<6MUfZWH1CVO@7>>UxR{JVcP=3zr zKE-rzGN{R-+X+H0of3yiG~}{Juc4Gl3~`;xz@X9dqcXsyKZHSimk@@>VfET@dqRT! z)m}aCm!R@Vfd)<7UiWdd};_hCkyg)@D|x21&2S4wA+ik+zq(kvN^r)u>8U2ECNJc))g z80;s}Efs}w#px`b4S~~q#OVbfBMVYKUtY!Y2u>pnM&2-sp**q&Zq9_D_BoUgS;yrC z^+PHpliL(9JG^~{RzWThbA!!YFdj4LuM&MixS=1jX8<=uTG*h$>J#Eb06lfFP<4nm zYQ4_q@kSc}x3WzBHP*SJ zBTnwLmd>!q=nCa)6_NqLhYB*Xc|WmLgDx;ZjOF9AkzHAcQ* za(PgM@MPQRnMmkcU&!b&m@AXAXFKp8g-|Naz6omDCComp2Tl@3=Buz5rZu3+?1%iOh2*{){*9zhKhPY#paK^5W4m?A z5xagr(b?zGeEPX;%!J5!59b8lD!`eRyr{13?!5~|BgWDBiw`x;P3Nvldrj}wi<{nE z%DFO3&7a1YHX}cWAoi~WKN;#KpyEKugJF;MoK%R(|00QP`i0nSh7C-!BPp7>FTw9t6hYI&h=TK%q{VHTD~`PU60_3Jr!zb4dqR z`o=b`ICQ5ZjKZFLaS_&FRV8AGEG;Evj@n_#0iqg^Xt7i8ERtH$TZ{%U$v(OmSnNW&QXOHGq?Qkgf%Z#zeu`qK zb8R|L$seH;MS12B!(5_%(vj2T@H|D$VbECS^UIlSl+-`y+d=0!CY|;K*Iap7&s_|n7BLeu$6hLZ@F3xhqf!lJaa9=t6w<#)(H1b zVU<@jO zlFyc?Qg2CZXy9XtULcutV8}g9BW}N1&pe(-ohJDZp7zK~IjW9WB(H(U5%noKWfaw2 zYZN@QEm%(-YQSiWnzg7D=nAdR@rUNQss-9$z64?tD#t_&`3S^q=yb&-a*T{6!TFCQ zYQ0i1;o`}LeJ#XxO``{P9EmP1ZC%KTR&yL($;kS_@Xv+}w6t|2n)#V?=Y6)XD#bKE zo$$HK2}Ac}50?*MvaAsn4X@9=IsF*xXxV16Tib={a(fY#SsOBAWCvbXy%WDAePy$4yPt zx)qV~Y?2HH;Ho6EAqXU9qB2!@q%zbfnt7|I&sVoORjl8xSJ6e^oq_D@G>ej&q`^_9 z-!@)$2O0|Im#jxMC)V13tZTtfmT&m7YM1+!J1TX@^=i4hnuCv~$)be2_2X~?<=ckp zp|F-F;j5xJfY9MzHje^h#y_hW3>3SsQ)nD)h z@3yPMTibi1{(L6|g6b>X8KY*-ctQA-!YuVnI#Ns>i|`Y~4E!9VDsIvcR&Ge&GBG5& zjqpn~d^+!zaF$JkN;!FGQEbyR!#5iddXR9T+ZyV5`Z|J*eyYO^(@C!z(ysJjSGNoG zOm!Qp32_200=%ltjo!sdqPMwe&2HY_PIaCF-dJg!?40i@oSqM8YO)bN&%=yjd#d(`ofTU^cW<7O``_K}`{$*nCVjuyi*w)azq4(&o7L4~9%76@q4 zH&gH=!XiZ7Dm}m<8(S<#fey8WukeY4wi;=i(pTE(z8)SCI;QU2w9~gn-8!QQ2tb zvf9l9asKtT@gy!+#C6_fN#=;GR70ZFrxYG?xasAUCuu8 zA=MpruyuT1UrucsH4LjIR^ED!Ru@kiiU7uNcEWe;&M4e0AuqdX9u3uU5PDgV+qFRt z)_2S26!vrk1+@!M38A*jN(qZo5;Jn1LUss*K#JvTBy%T6nae|ya&yX1EJP}&MIXyd zd~z(Q4qKC2xgKUaAz)KwI>5!tlPFgVpoxh!4JD*7-8FdQTM6 ziRw0VegfU>CG4w^*|}~MoX6dQ>V*`{kMogIjp&^VC$G(i;3gGk_bEh}pT&`;r9_|%&G6{QPNm^})1Pj)!u1h<4xdl$+Q8=$Jwu=T%)1idgWv*sJN1NH zStz|6Hml)LWTS2nd+wES6A;AULUW%OHLlCYKx{sB4oB{tbErr@WP;^qDBE0 z*AFry#<)6xuixX7YR15Zi7CO7Ts3mc+(!!E&KKgPGgLu&1euckcxq)*3sWiW>&lJU z18%$IyBE!<7j_($h|FyiPK2>}^J$cjeC*f=s8J!}zW6yC=(rNOvN@7A>df9So!-=w zf)s@S=0@GI_aTr?vTnJ0%EVKXvj^PE1{=wb#+$O$H_c()Ly0gu2@xiaLsO;{ID=mnd4fp-9UGTUTJ&Wk-e1QUi7-t$YT zX&V-#ZdUmPKicE3Lo1eBgDQIN0_GY@R@1i?I{{WNwGcS z?Yi|?J?T$Niy36o++)+7sc@uOV%zG=Y6YpI-o|v+`Y88ce8g=` zD2|+@TI`g^k1sx&{vsT_byS(&=V_3E($KMHWfr|VuW6q$u!Bpn%HMB$-AHQJ=BMn` z9BD^X$~N3k#&Z#OWshOTxG~s zq^J_Hgk-zN_k;w%En>~IwMMeUYr!>o-FIW6`8kwqkcdxs%~egRPTSJCZ@@UO&^){= zgL}bM7Abbm8bV4k3WG~6lCd!@gISS0Hj{=X^FXY|xs*IUDsIyN)+MwhSU;Q_WnH{c z30Cz|>JZq40A*4-#g~~-7$T+k;g`J`^4`4QbfT-}Vck3dR-ZbF$5q~dxI3+3GS1-u zb0@jcB}2gF*qB>V-fo+@Zb9d2&inE)+$&pFO-Cq^1ha@F<34Ci@zWiy%k3Ag33R2C zO!MVtgL^WGj{8$5do|kHlP#x??zGxs5L7Yl?Jo?AcF@p$U_bj>@Ll3ehp?xgS~LX= z6!jTCxq(IfvM>wisPL+lTmX30=H~W1KO_g?N~sYbn9cmKzGyarKAF3>hnL3(9f;J& znll~S|2d{vl|cu6;fz>thVZCj;2gPiL7Zq@3SYLlFBBby7Io=r*ohaHxQPg%gOcpl zA`QuteaPjmYzhI2hDhh+6ZKhg%~Jc)7Dt~GQK5@P?+m4UYv-n={avC+1qXj=+AK!W z<)?j~+qn1(525+EX(QSUk*Jvjotwc&%?ogX*+Ym!-mva-h;>peI0;Xf)lXn$S+Zy% zC(sj9QJW>eQ(|g2g!0+=yRsmI2}(R9#TZ(PCUqJh?4AwT$8^h<`tDqNCz`_JIvuY8 z7k9_<)1CDlo7)Rq&{AmI6csSYzWsCzl!&N>gWWAIedeC8iM@rkM~0T}75*|L3Wl+t z-^e(~VMSl7d$0=Fm{vCL}5vFYCJeSy~#^OKe_vWZNk75r;Z>#*Vtv4GK5?J<;ubbeGuvJ9^!#%+)wWm{lqXbM+hBv0t=1AX<3~>nRsV7tU*e*8fWsP1nyD5)5jY~Z-pRX3QH5o z#7&4XsE`lUq_jZ6NnJq>&$*_Vd`wM`37)0-wp@nUlpJSHGWqLXbT~Z`;bdGWL)2Hu z-Tw@&K{exqkBl9zdKoq#|7rn_EFCtk4OblzqZIk09)zffjylKVDs+*dW95AkXwb$%R-$yeLW^eb9SaQ~2_*2t7X?Jr3}c${$q{ z417h1`iYMVBf(2zTuec(e&4K8`H+wR7hw-pMe}Se{?)pDnmG>@eG?9-I0Py6r8( zszYi-!1u~8;kBT?B!}XtJJaEw#3aFs$+9}A^w;A zG3~$xRfgnrZ#|);2+;uAZ00=!z8f_7^5I_@;MEe?Lt;C;S2lFE0tnWEVVQupAv933^8cg5oksH(t(*eg&sVq`+ zR>6VUKbC&7pUYqcjG^^~3k>Ccnu5{ba;Z=^9DC^aP~ zj)bDM7e!9bHts4XJyuxF*;331=RegGhO5Hx(%exX+*(kfvDxJfiiDCSuzo_{lZq|P z)+8>2eyZmkkrTQ(uuRcRvl)(jp5!J!Oc4IE2X%^Tz-f{<9!cc`^GQdV6Wx~3mp8Fq zgILe$O*Bp|4Q}encZ%84&fRBeQ)V2>mqnoHvIyZ2kKj4zMZK51l*sqNQx@+GLk zlsxUYDRX*{WzcZbe2mCHFR?(s^zuQNmz^Vv78BfI9W@VK!H2EEuTOq)<8qUxV1->ct}0L;^)*I zHGQkMi+5(9j&K_?-9GL0a(jv&A`18M@iUkm_a&o#<%82@>PIuEHMD%OQh2F%cX;Td*m~0Wy6(RnW zpxO{*wTn~r$WWFvLCK^?=P()xA=He*J@h`NB#BP>Xq`1S@*rp=a??m9$(9y#&_#+nT$H z3*^_{hA3!gK()Nh-P)6OJ}+^Azg2?`7 zrTFXm8YWHn;;kQ5&J}&+`7jUQr>EP7a;NIn)nn-UdMUfjAbQ7OQEHpCrNmWOYB~t%6=fTCE!L4Pv-BGrYXSMl!3_T>djU69;+uscHpeg>&G+A zR$;o~H1{5avR>cVT+eA<@1D9|(g7AyNGDsUKTK{Po}R8GesaE)LAmXc;a)!UbWfJP z+lIX5#<`;e=rCOy;Wit0>#*t%3WzHq0a7Nk*5_(^1jLsIOX7wG@eapPuWT?PrBaW+=ee-j4TLmWZ_*{kzDAL-O>VxSgwcPAYP&Xh`0}+LN6FR9fw*N zuh%WbFHN94Jn1|b;G8U2M#7%F_Fi;aU>b75@#yv%WVvPsSXruUYAs&K30=qpESPqz zZ!K+b1?ZSuR8?K51nB5pgu|!Kp$X35@BtY&Ktb1$!PVlimzyUMrK{vH`Ae zJfarY+(|0y9_?Sn#_qwjwUjUE;2yjPNd1f^n5ye62QuG88?*QLs^cgwgU!ikDX!8%g;8~rueUN-)10?9h_N;*UyF3 z;Mllp;}>p(km0FZLIdzruC3s$bT8Il(%*blzGeh$t1UYS zXg!-`x~`~lwj}omT-0Roh*(sCFEOk&_79p+x0ay=JBKp#hbiF{%eSnZmWgAz1_AV8 z7i)6Isju3}$`q0nWf1)`v}RRO`10aZI)e7O?Ic`zgHR z7(1o!06)NFkac9r`1y06eNT+R1hdSF9p`KmET-qC-7MHCpAOvhNKTqrc|#ZT;N|o# z=Bu2U0nt0oqyRK|(&W~Ii)H8MIzV}}_%MPHIPqyyAx6SzBI#~MUf0afF#5KPBj3&3 zWljO?bs!70vCY}A_^HJ7L62(h?nLw~3T8sV(yS`XtSfW7Wj5IpXHi=2)d@7Gu%P;Z z&vU^O4X5PYnK@jKlSYGQ_fVOW7WJqi5gWWKa0sWdOqi1L)<*hKdCA#g5OLl>vG7t2 z%R(_FF(D#J!(@SXFP_B6Cw#I_NO(4iEh|$wIwqfl8XS$b%gTjKx#?>Fj0$|CBf1WL7wWoy0Na(VAQ;Xw?&w6Rr#Ou^-P!&b31+La2?k`z}XT@ zH30OjnK_`4_(Q?749L-hiJUc%Xk-9LcVsrkLZo(XT2<^g1=3iYY{!tSC&5;_FcgZ^ zaAc*5F@bHt3bZs+wFswock58MH3%0(x1z0{;L#f%e?-y){P+r;6h+W*)$cRqK%EHX>|IMHUYDoZL?SE&`0yQN54tD=` z;ZH#1KlJ;b8MObl`}dyy=Li=-t&Dr`fNhGZ5r2#FH(muJF$Yiy1E@a&ROMj%omm0Y z+4yzP9+3Y3C#Eb92na|UNZX%C72o>tr;z>=sp5Z);Ve;Jo`2D~<7Ysd{Y%8FMrR^d<%w;}oO#2u5G^0p!dx0}^y*X!^G!r0`U% zcs3-akJ;6E6rr9vYSg(vU^y&yD83kT!1WhKhazVsAqh|okG`_w8~GJD>YX>Yes zw?1z-s23o_j}%f?0oV4Dvt>^JhVZKz=EUo}BgN8@mqQz>w)}O(@RWJj5z6r_i0g45 zo&2%EM4W;@-OA)B*cS`XDuaBHiQJl0ga8??l^l>Th)Ox{qQEwgW-(dAYva2U2k0PZ z>0N0a)HY4Hmg1|L>Q#~Wi+;gE)!a_SIsyohUe0}jV{Qs zn!$@ZHxow7Vr{FZ$_aQz9(n|$h^QW=M>3ri38mTzIbYDlSmmGg|lu} zXGf4q1AgRv2GMKs1H$@==|d?LqGEDIw`^|uF= zxj7$fkBN>;ESCScRs5j#X)#ENh}<6v41o*mH#(&D{q^^|2rMg5-|71{_3Kr@7601~ z|MRLp($<*23l7N=e@k6Oy;mki#9F}Z@Y`1Lr%e8p?%)t!_7otGEiM;QrIL^6Scoi| zgf2=Xn5nD%d>U3fXIsWRSSqkCQZZHdH8{c6*5l7vVXu6?WWKGfr>d2#v)xwithnyu zI`Gu}>J2}h3$7RQc=cm_!}1>Y6qW^S2uo*S1kHT@t1*xmQ|kARK}BBk>%YG$U3uHH zJ-@SFpIorn5WRLPw7%>3`9`FxfEMP&%LRv$`T(}SYJ?Ml779I+fwwfcbxE&C5zHLT zy8X-NO2}iOW!OC0i z$$C%FGqjU1{m4LXb8xcI$BjDenQ$!UjAiEtp9!UQ{xoFY;{J1Ye^?q=n7%1x$P#~J zW&R8^aE$H`hX1#4yGOJ<1GB;I5|~tpQ%B%pMaQR*flzp+sd9m3(NuTwkvK7C!PA|MmUF}4GUy?w5K?Hg_B)B}n)fisx{!uCEpEtDbyE{@CMd2c`0JLa z&)*Dj+9nMub(J>LcNh|CR_y>1QQ4U2*;qM%GwYX$ z22?nEm}q}CV&S^y=K>||elz-Uhy=Fu?F9O_mVhd2^h|6_9DlRAzw|zh{=tf!k%OL@ zk&_d+5&hc1A7`q6umX0Qo(o7I1}-bVTK(9~{=tfci-n$@gZaMqzgqpZHvQQzpt>DB z6Du1~740{xzt*ZhTLEKE&&I_CRFM14>c`rp#Rk-=``6I|D$&q$u>uw8el-GW^gV>| z&qi#(V6d#xjU1B(Cs z!7HYFS~O6w@V5^BFNwhfBu+B{iPOIi7Es{p-^PNS6)5n>1ypnVt*O8A;?G{OGjq|i zvvK^*=&!W+2O}nSdSGdyzZw0N6~7s=0h64S5je2GdC5Z03Jk^Hy!vxm{4`_d0Gi#4 zRQ~D~$Di}!7b{>kF>|rq$LyDU2TEZ6+YqvHu+szQ*WWS&C@uN#t=NHqXJh%>aNREk z-)H}C@%U?X0-gcr*_rN@AAjrNU#an%)lbKO3V`&S%zqoO`%D zzZ}44*x!4|`M;$H3$R)N3$Tm7XBFq4)8l6tnK{{kYZS-d#tbOM`6thQF#~p&1K8T{ zu5tcMkUuXSoJ{nL_e!I`<_EC8!jHE8Y{U*+dpX&F3ZB1N{mhR)Td}bM*LjY=P0jm_ z>0!kFY{d$6ixDU_`dd?fPL7|!U}9qi&S$2-hyKsm@rxNS@0o$A`1^F>{BwHzVg^in zU|EOzDg4Vi0F-6@;n}Zy(JyAewTkOs7J_f5jGyPi?=Lvy^-PTJU%Ds)U+g*98W`CT z^YQ|J27V%MYh`f%Iz@{?UQ`@dRl>;G9{B3U5_rAH!@t7!M|9woB32ewwo3Pp$v=#N z9~uC)U4iPaz&+*LMfacF>&4y&>iZ|aWBfPk`}c~!*ck)u?svqWcE&(EpxW!NpWI8) ze%r5p+}rqGlJ-7Le!2Iz1{h?F49)a}t(@MKjIvza~p`a5T^vx{;2eJ;ka=Vjf4$J@8dhi^93l1g&qb3ag_aoM;>N`?sgPi-v~bhK7OLkBA4yN4= z+oE7P&Y#k&k{FsT^YSg}XR$VtdVRWew7xFq_-^MG0C6V|USkM9nprExTrq3#g-9aE zw6YSO^ChDy?2!%~v_vkrn>UIZ6Datr!3HyAuE2SaH5K*VZ-a`P}ynS|x9sr3WB=n{6$U zvrylx^H?N*f}nZT_I^@_kO;!EK~*@KMrp!UCFJVM@T1wcNp-TkYZr~ z>r2R8u%}sPB)Ik32W;Wm@~%KfKirrf_yzEazA?7#0lb?+JGm1v z9ZM7~h_ZK4dTd$V0Q{5;Y!y}ym?J+m*sGAJ&Vpc33w9?RL1S`9B_FArT4h8L6PPu& zgmbr*+pMZ9N0`t@Q!+4fk9bm16=33^2XC;_a1dHb@3^$_NqqGPcwh@A`)BkbnyKjB zHWP^gYo`Z|u2n6lxKnQ-NYjnWQn}MW`H)LY!bsNOQqhtQk z9ubA;cUOPMFBi8m?JNsQhA1m#U3`J*c@Ecat*Gc9`_Z2U*T37nVGf;8fAm755?aSe z>9ks>tL*&qs61oR(!`=(f{Y?{Z1XL_XvmjZkx;$kI$<_zWj#7qx6VhWTP8`Fphk2z z9z87|BE&>Up6wGoj!2*;E);sHokHhxF|91uJsO-Yw>U1zce0kI;UGs7*KdPlZ} zEXl9@MoG8)WhVx>d*k`nio_yHw@{m4e#Y_|xljz)p_qj;0Vp&Tmqdo$&mEz*^XUCN zF0QoR?S1}Dx~!DTmE)_j=D;_V!>+!1d*kYe=+jvWET$a(uUJ~~@@zKX{XZB`iNCsr_U3wK5q=z!O=SVwCA z7fgBPGdF#uNl0ITqLiu^?NYB;Bl!G|22xa(aI(%)g>eiEk~#+a)Mea#iU}f31D+2- z5n!*#GTEp!I^a{hs%sv8x<3YG7i{+SQv*i7KC`Bw3Jgm=#b zJWtJ00YMd;_4iVt8% zVykL$+NGhM34CR6n7NWq(k0^{mq2S4J5RWby^1CR@l?i$0bYW-Y8r8Le5(Q{KdK|^ z-g;g*0gc20iEyvJVrqGX2mm-0Q%B(h$|3f3&WB`q#u9Mu6RFJIqYqW-u?LEy8 zSvQdp(O_awrVYLBv|@WJq;s?{OATKkz?k8JKkb+OIyx{6tK2~I$!$sdpkslbfbx>N zIOwtnJuVv-y{BmG(vQXZ_{}Yb-Dg=mxGSFFfR3Ee4bz&cIgyPuXvElD>n0Xcv=${( zg(-eq^J0Y{CCO9Q)WDt8V2)IMrUd<|{$8vO49?RyE9CMlDTuVesm_^Fp`N%~^t8Ha z{)xji4(KVx==MoM^|VlSX!iEJtfNPl<*?5vbrS}`=}@j6#YDw%H_3>c>z`m1)jl#% zh)c)bt&RFray6DmvUj#Sl8aM0Xxlqz6!$DZcn>SsMu)bK!cT|~5c~woEP{->UxPlS zC|yMsFDQbvkD~44lXs8$>uAcZ;DaP%H0ZyO6;WYo(5KZ_essfEJQut&#(4`(9sQiN zP}(-ARN85$*{ff&aL^`?;vj~LexPh&wf2eK^UP}eSdmLIiaLDKOS(Z@v&fr??7E%_ zCK=pL1#5L8OrwmPkY}TkM;Kjo=AlzLb4;9XLyF}y|c;69@#sDBBQKQ zMoEf{kUg?BL?V(=$x4zD$x7DmK9A<}?&I_Mem=iHet-OWy?Q;*bKHC1=Y8(E=bU@) zx#uXfS((Ufm71dbe6i>0iQ}JV&n@vd$IGHGma{tcupFV#JFM)6Jy!S2pr=Q@{?tn2awu8sx$(JO z8I3(*EzV13;TMlmB{>OfKh3DOud{D;&!O_6>dL6bGhD@^3A0WqFu`;-0oWi zElIVlXdm!B(5@YOb-9&2$>*Kco4n`nGuI;ynW!vrl-objG0u2elbsiU{Yn~Lkzxfm zQYp)MZtX68MV8HyUruIf?2&61J;z-6+#jmt2Rb%}5Bjck=c#meP)_0ZeB(qmCTK|5)-@&t0X7Y_PUMG={}kwS*rCvjoMa8^2)!M zYPa%5)>8?lR-gEZw07_>o;YKTyzqhHV_QxKO`O$Dw>P#EFA&39sE~=y345R1WIdB` zR+dD7m~zQ3oI)`%H)g0S_Ea;iiTk8CtlEm=n0k}=fxs-j z5U1Fj?Gh1Lx7S8zN1KcL%h08k^`(`_zVugVd!@*{X#&pj^cT&%-*!z|Z>h0=+lT1g z?R-m1{1WA25}8$Wv+ph%w!5VCZ?gii&T%>g4k#)V;vB2h|6kK!u`Xi}zY6 z`kh_7XQ1)azRrYN@+ozPMV0sK5dCmg{wg#YeA=bYj~}BqHpZNoGdiV zEWi3Gz}J-AMC<(UIztqtW^w^lV^|df_ecMibm2{sbZJlNZ8S(_c`wl0P}v8*VS>1^A1~sGq{%CT2BjE|3D(3`-cRRJe%pnRq#%*jDS~6i|>W|W0 zCepyN+vVLrEkQPQ@4?-e{__m4*^S^?E)zDUL)~rlkAjghMCTK8y(doWd!qGqzBjne zeNup7`7n}3N@-T!ZITJdJnzZ!rT}|}N+R$33JBfxiyN9hUq}oc`0U&cCaU(xww2zc1raTfJy{uh)kF52Z6+C^WPHSLU8Us!2nekrcJv$d;#V5N%luB^Jh@xblT zc&eTNYEfRlpxVmn(?!c;uj*cUFHY4}SD#*byM2%UTuNrb`tk@})naCXfIv#k=bMc~ zOVh^!R+ipA8EF#`Fwj6`V)XZ}F`1A#zF60|r%R{Kd{Ka8e0_TW5&BPuIN0xAFud2~ zTk1_oCnskQ;F?@KFAgU#FV?^*Mc}vsPAPoU-Twur z6dX78+GghNfU9s{H}Ow>cY_Jw`OuvioT=fxXTL|5VZS?7H#qmZ&*~qh8T`o58{Jnn zV|?O%r{aW#MTPY4d`G<3N>U5?>41Ou?4W4rFx79YyTyDpLDTwYB*pc~Fe#Y*w(aLb9S1x{4NZ@wc-G(5 z;%w($m>fGH+)(?Gw};|ok{Z`TNfx-NUUEl$$ctt{Qzf>ZIU?-IiAc?zGI8a`r@Mme zd9IiGQxauWP?Mdryrc6GOR>$Od}ql=SEXq^<8iDci#=`8jdF%LTVv0QX4h|o=GT|? z6;D-7P2BL(bvdM9ebJuvRnj4Atgth(_=5eGTUSd3sfzij$Syi&h72*DCaoGTA#u8^ zdt8UlmG?kzn*`gzUjF;%MwQ5W$`6=bv(MzyiDKA+y`p@Iq^V5#3+YRp1UYI`yAOq{ z6v))Vk0#!M(|J|1HA^nb%G=*4=btNxUoEPc%6gpi2u8d;T0qlHw8i?AZ(q$po2mNR z;e$78XQL%XZ50mJcTsIw(mG+!cxRdPN%%V%=2#6QMWpY|SZ3~>q=)WyHWPOYe-e2X z|Mv0zJ7*MkoA7)R^CKIui#pC<+CegV$Wu2fkfGVJYK@(0SKaaRYp%UIrFQIL-O|cA z*N23>O?W9@?>9Wys-R8e%heJlZcB8-&y3`J*yDn;I*%JN`YF_W3}A2x2oSh;Lc3!idVk1k9dw_q~G+w#W*+Ea>K_e{P`nwp5{V~=w)I*!y=Q)!F3z#&J= ze4jn@I@cEr4C$98`EteXi^^!f^+ zePGU0{;P*c8N8LS{=V~K;X0gpllKPs-J`JNLQBiTN{PDWh#h%_pL2}J_ZXme4z^1o zKf{g1I;ni_w+FX$$q43=VclOa)`$0c&Qlwvi}7vi`84x_V=V!Dob0JU>Y;g$uKJhk z-3OY^`MhDBRcIx;UdPw}Br_dLW7n<9&8-aAyL>`Wt}~n?rM57{TlKNQyRJq)x#U~^ zS#)}G?Wc5>=CPlZy)JphE9b1ba-`;cynem6U3($sbr-(&PeEll1TDL;3} ziEO$xEx*f8;HuP+ap!D_WxA@y4kPt8?RUv%%;!ZZe5oGu!F3WzgWdIbRJq%dw;#Fc z6=aTa3gl6Z=D0R%!17_`{PV}p%O--;LQzUhANESQ2pU|rX!~HbLY2dwc)NK1i?g;M-B+X7yD{U&wfe6ne;nzgf~_oF;E{Hm!ec+L@#N&Wbe0qMbnoY6T07P}Uy ziQ1fQmAhZ9ufNFhcO1E`bMkN*O>=_Ni^?WD+0gbKQzZpcB=AhG13}2HVtf0?X(z9U z#CdngP$jVktKT{F600FJ+}i4KutYE2EU2+U_}0BF>5`ETHR7j*5!c@2oRMMRPmM{$oi27iytH* zy@%F~_)yhHMu|L{ogM8U;wtp+G-ZVA$5)?qu9y|k>aCV!_j%2wV&7q_9Q0BeX`Lbw zC5#_VM^{pR3}3a*eRO|R@_wma-g-1V;C$)+$Px?Rr==F8Q3kxFNhL<(OZ+7kJY*bE zd#LymhWWA@pQ>~k^^m#g#FxC4?(pL;abF;LaJ#kM?D((=%C}36J@Y-yWCq<$C7xpB z=a{{4RWpr{d+{=K4Ub7&E<{q=Ofg%HrZVjk;h5^5aXg)&34OB)V+&C!VxEj2_p-oDeI5%Tm-Xym&@+G0lm51%Bj z#*nfYv~O;ujN?6BUE7TNZdR>#vy}5Ov=)j-3UZ#=^XE!PH@`^w!rrYUsF^Uvr2|>p=4L8uN75 zwmw0khp$h}KX_-pqI~=vSx>d#J2yqk82fddXwQNjlSBbM>R-_G9M;cxMVpq%4Yh8? z-5NWlHE)xD_^!;PT8laW-QSLKm zqT?JaTK3G|d9;7TKig}RNkBV}CYwr_|BCzj^)acgH#Y-EXtE6+u63DY#oiUAOF!)G z(V@lSGS{8m$FDu#C%|Bmtvxmez+HVmC@k@O^l}7P+Hun z6Cl0DAmhU_YZ9_4NpACm_H31;Yqxqx4#qTbNCe2BHms|~qiROLPaH!zu*V>I5L1X$ zmX~_6|9LRG8;|#OM!lh;jgJ)cd!HBLn>WL8hgxRy0MRVym(Vdngt8ux&X;@GJ^ zE_YhQbd`5Yb8tb#zDvY0lX;Auaji8JX7~0TY&C9Sil6PdR}>O)$)V&L%4F+>?Q(Jp z{VBVfof=O)8IO}J#K;NTS>0zUOh;n(?yp%rS$9k9>qYxv#lyEsNEjIh%&ArK`C$!9 zS>EZ*e94OkPQPM*HnWxni`x5q?LLimD6c~PwBVQ2d)_*qwu#ad?XFeGGom}a^CIla zev^nn!h(fEhxzkknP9!OG)6?p{<3p#jvHk7l^m;^i=lP> z;$PFBN&2wQ%zw9k?jmymQ&#}P^^eb`4c>Ijb$5%_`JEO&G+1-nTJdGf{h-z0ZQ;uI zw|3mBt@J(ZEVb?4b+6kY%gLl<>H?%>249i|Ra|Owv;vpbf=ORq&{tGEUPW@JwD-mn z1}V~r#+vl`H_WHJwVRlQZL4m0V2lgu`J$h3@^=p13Tl*Hxc1f7%m46aMrytTN~c+tsVU|jp$aRK%#BUE$5h4 zbJA9GV)K~#a#s6zwkc0h?^G1u@nrdfDOceK)6&8^EgIz~vNSnSLpzgm$3OTc2eBHQ ze5oKdZz94M5^5ALY5(ERi4vE)dJ}`!!Lq)WEs{4D%N^e*UT-WWXIq{a^=CJko zL%CXJD`q0}3fGP=4wH`*YBfI%@M!1_+I9C@g^z!I?0(kcTE=81)*+fLgDNlCniGXS zc9HpE-_?p+8xDCtx|>ET$~}8OmbYK$P{SP^t=o^rC+(g{Ui98Q=4#hJ`LkbdK z2@9tWoGB|&9mnoCiJL6YU?mTxX;Rq7JQ9z2J*sZ)HaA80&d!|1J@VWc?eOF{JGSf( z9UU$<&)O$%^sBm;gi~!TJ(Qm9))d%6Qqne}+STGIk+u79UVLL%9JxZN77KHEW#-g# z<-kk#V_GRXZG}1ZIOg9{?6}Ly^5w0$!>Hm_rC{M8C+|z7J_0tZ7s?WS9RqHrOZaJ@ zo6R{oVR6$pHU&z0kGi)U;HM6-^mVf2a(aglePFq#4 z*UO1dDcaS@g=I4}`829phqShnvgK5t1ul#RquwaCtfi5 z*#^&Z4cx-gtRv`{QUZ2@lT-;XM4z8>U|G7{vvi{2>K^@e%WXIdj`_=-yU z=j#u+__|+}m{*;DF+zQ{eBLzW9pabrreNl@XT7Sklf(-IBi}zwN}}oQ5m>)pD<1fH;r;uMNlZJwP7WlX z*H@R=kFF2*mZJp*_I*eVT%U+w3akupoqf?e!7*@h_wKL3B(~Qn5_}gA28ds1i=b^= z-*Qr^gZ_^my6<6N|BHw2XDAhjALK{jB4C9;)F>_z6j$&O5BUrC9JoRUuAt$gUGafK ze{!PXL-2n((Of`G6*GeCw~|V@@Kk*C+P_2_g>xr@u+txCqd*iN4zfAgIAZ-J+IVl^ z-=O_H5bj^1jT8bAtiPcRV*7BA&C&iIFDCFOYHwU3{2sr>`A2Gh55)Ul(Ebs{iNbko zaZ$){R2nbWl9i>%Z!18NM8Jn z0}!ML*aWq4OB3pO{>IvyqKz-D^*3mLk5m1h(Ef2P0tWaP7rp(H*f3luGWKtX{XJap zkHp58R{0yOzlX{GPgwsTwjc(C--CF_pTveEK#?#wt~4%i=l&(JH$@wNQT1=o{x=5{ zKR6o%H1oqSz^na}*n%iLWK*p1@$G*pMmC}%{|4>vfx`ca+PElBq#){7YJ-CoG>Cov zFKBPvG2Tp$2nqh~RNpww_`BnvpUOrEE(Btxfgt%IwS^Esv;fHFc;gn-Uy~b-W3ay= z_kUB8;64vO1{aS06K`-Y8wc4O?~O=WfZd|bF1V_gD0&W{9lHhx){NEEP7aG=c*$E~ZsW|hBJl|q95 zN>zTBgGeDEpkgrK!ov?ihy-sX2ug(i)p_TJ*1=to*aY!^peA)>`Ue4Ql8viRKja|-0mp;>MjmczfW!ZR z=7jw>&56L>)5BkF`iVJi!-fNGPV>z%{|CAgcRTWbW|p5c2e*R2%^=+Es-KvH9VQ<1 zUoig%+7lnGKp1=R&#e`3j|O+`>Q}W72azp!(B_zLx`TlK1MLa>H`?5!2LL|Lcw*^?-~`31lJXDpiL3SUn%@c zVGjQX>J$F2)aMT@!Hq>U1_`+QhfIVEfxB&JI2!R^5dR126aKH%=MRd5y*&)v(EP>H zf`iRH9<({)n;PZtf1p0$|4M!Spg7pxBapzX`i0_Pe~(6hAhZ91_&?Zl;v=R0SGn@T zwuR$1_!tDZaQlf%=618}<1UORx*Vg3JcLSXyx0CLaqT{Qe8# z|3G_!1Y7?_2f@HqSQP%6=?{4b!`<)3fi}l{(|r))Pudgto1aq%{@=7GE?9Eo%KJ~u z!Scj|HphI^{RHAq+LI9T|F-vp0dB$NegHS5f1(a{%^R@Iao==Hf%udDB*gu{=}(Yk z1P1oVzwGy6g0KzH=7?`|Pgi8pqbH{8sc;1jRWz$aeLf=~S72cP(* z1U~U>2|hQ*+i=d{`fZH2;W+@m@f&g6=eP0j+eF;&Z{va7HvmQO``dVU0~_}nZ>odO zZ{y)jDFDY?Cb-XUyPWXFs=tSdzY`sA-XQZ96|^yd}zo5|FhUUse>`?~gOv2A?>UGt%KwQPL~ z-Bu;;{W8L2Zt*2Ok*@ufn&%Xcx%rkKR!zN4?pSc?Vn#fc->v?XjjZ4$@96Cu=V^#o?DOCjaH6aUrSo4 zIHkJeJ|h~}t@bsqypVY4`B>e>S7}znR$-h1G}gC>TZdFj&!J|8r-}}~H9p|8)VYp% z6vVt_c#Emp|72~pp3(jXdRFGUDrJ@9v8@-l!(11=11C?c*)R4c^i5X|1guy4>B0q2 zR}&Z%9&^l^$53>d4zv&S(2Zo&zQsI1ztX{`3a-_gaZ^Wpn*1^);6{4Co-CD{4^c&Z zJCfnaQeeOho|d(YM6=@^YduU%0lu^2pV|W#SNGTKYv-5?SWBfe&9$^-Tc&ASzk7Lg zF`1|^B`!?^8#o+wHDMX$e=7g03mAxU!bdi$q|#;MjNO+h4MdOi9^*ja^{PLHU^^L48jMh6)(aak7S9;n z(V6y)GnLO`T2Iu#xMV%gNg384mk`>KHvh0ZUVn-1h~2rOc*eF*%HHR=r@}iaI+zzo zh4c?_zaW2capcl5QDnc1^0WC%=cm6ezmlaFxe$;YL^&GORR);% z)@`@<;;L5R6MeT2q1?msy-rR-2QE~o!O%XK)>zBA+zPF&+Us?}T0)mT^ieWDM-Djm zyc%kVJ>=$i-1JD%$;PoF)3;ht&x%LeJ3c8lGm_uA-5=ygW~IMp_k)Fbml@aC%$e?o zuP?~yRz`D5@NoIunhqvqA5{(ae0~ixRDC5`m{jE}zf56lI8TIwU6{3_b~cK;f%)ZY z<0F>iqXz39cLT3U7MD!D*Osr*S>)Dc-X7EY+}fDst6!+bKtCI&V^qhJ{IN2c0>6<) z)rau+{kM-L&D@e64Q$AaJ@JBgvER9^pYn;8mewvsRNQ$DlSBH6CP#OwoZF>$ROk*_ z_5sgCqI(l3*1Ury9kkL;Q3|Z?w?Z%Ma0@eJf2Jcmd6<^3Y3kMRpjZ}lkh$Z)zK|`q za?z5@myrqg2De(h7M{E)BZ?8TiQRQsa@!j3RKVSjdR?eobwd{wlMD7~wHH`r^0+@0 zkjL#=KV{jJ!z*8A)8*qjxs~v95=xw}-Hnoj?7ObA>{2pFca~VX=WJ|n_olIh zkJUQ%q)GE)Z7@glL@!%Z3IB{{u*Wg=x4mkyC1-To@`jdJ*Y{vYSDhXn)GZz;Lt(DI3v#TydCP7mv=2w*}>%AAkR-(#6{VREeOqHrVP0wHWhyI$vL+JMrQ4K zJd~B}lr%{3=11bzU+c~d9U7a$qGETdv`-Qx?$3=l{(PlWNtZ>Ld}Lo*8fwTa>phv= zKF!ejj>$+-lnBMusvA~yCFznO^L4w%W$ku0Q!!4_v_FM^kmVwNK*@W*nv<_y5ruf) zaM|+|_f`dS#h_E?t+)o+56HDEy?PXP|#vYwb`O-vY$8>?sj&+IYo)k!ACDiq9;X9JXwffT0ZG)Pj6;>h|}%u z0e9+nQ~Di-y-4XJTNGLPQghDIbe`0+_Y*!$LM!#UI7efPF3Rv;S&y_-u!Q{kVhhc_ zt@|g{R8zIilGG|2M)g^c@wg#!vzpFG`fX#rZ_pBv^fKp`wChlXJ#zWOIyX-h$KyM% z=j{z<9~>m*p=Y2amXbe<_P1Tihr9;&KrsL;nZikBL^@qS|?MeY}qwEr9&&2BjV0 z^|q%3eEaV{FFtuyBUrA%7yWp3yffsp!^F8g>Y}2CM?7D252+(wuWGn=ltd<%Y%P&4 zX4_j+K*xR|T1&Y|GOEh~ow_ws;hJb;F*V;2W6Cyf;tMGyXN*N{HH5mFecLmQ&2RFs zMy9lu@zbg7yJIL%nUgK+O?DX8ALOjoNU6*u%EX2`ri|u3IVNYf?+SZt3W*74De0Xr zmxjry(Hbn8%dNJGzJaH2#q#NgYwuQ=X?d&H7{b~0AjGI+Eh}SFvp zW~ylA-QF6pQ|aqhH>)H!Pap=D*7fTX4R*#@pZ$80MQAU7CJFa$BP)SwlYOCE*L1=T zL|l$lPG&KfB)xqu;7#ht>(mB{+kAIcFGU(4Wg~XJOk_}vf1F`!+#Ya4;%*C!10_9> zZ(gMv8y}Y%Ds&i@vZXt}`qa6m$R@Gkormt^U_NmsND*uFR(!Gi(6mE1x#`CBcHZ6G z)oNvQjS1xUEF1xanxN znX;0D?Z_(6C~Iy>JvqiAmQjzl-eSW4b)pn)P-~7yML>JH5XR}=wVmxgmzr{duQLQE zT7+`%H(@O%uH)O|#?oVPX_P~R!S;HaX8MuR0~6=T$Uk-pR5M1S4;YBtY~Z0XY>%NP zCCf>ykHzxnj^@PA6z0LMw)NN|#PHS`k3T`ONW>Qjv&vfs4%B$q;sX(ktkYr)d{& zB2L4|$R96Nv$)5FlQ1ST9K4<m_XtDJ`1&!^gSWi|QMT-K6(o6v>`Q zuLV)Ch|{p|U8)dlXlhH}HztM`GlvCzG!NWHShv9G$kW@z5uG%znL}O#7b1W}x|~8z znYdy^dtUIHM0&zhILPPvdH!+TmJ#=xB0MQ~ne#5K3!nLnlSvXwKqm33oAfM{ubyX? zVbN~u=#6!;9_*mH^t?>#Mb!xp`^%ufv*O+-nrGaefBb6Xy3l>5wKKQWR3nE@!inJn zorsu`YW>WRH`zfZGMQW{mC}^ZOo1KV(h{qVwyxU-tGoFINiJ{odS5K{%>ISUv!1Hz z6J#ZJvY%kacdeN(n%iV2EAr-1Mt`c!IqR{oGdLNxaA#XbspGbetH_I`vdEJ(GIyOA z;bueC>3vL}i@u1voT#8Yewc07$Ufa7GI_X;N95s)u`M@<2QJ9Lb>2iEO>Ya1hiVnO zl9h1>zlb|i!2E*YT4pMV3Z?2p&MmKw`c?4|y-5c^zPHnfwJ+XBu z{<=mY_9*Ub%VShb;v}ZO^}>VF(@DLm3L+o$sHgUp)pM(1$X$&Zwq8#=8fikVA)?l2 zCadL5OC0Zb7Tz~E(Q|Rs^LCr&tip+!>6GECVo&cP{L$Bg9euxgaOv)T zLrdptuF0FEnY*tfCG*(U#v^wmxfYwu9_k7eMjZ|jKct=e-0SSHVc!GP{^cEKl8 zzm&5#c==fQwZO6VZWjOhuLTCrv5~UN)6<-d{G7Dg=h@(?ax$koY&TKCH7f&kH4`&C zKDb@ETp*Fa$ClEo&=NBJ{DA(&sMYnVS!TvZ6bfQj*0SOxj*g<2M5q*cFqezR`Gnj9 zD7jp&96DN6x!m6?~18cQz+UOu+wxbnbbah53W>T1&IuZ|Ov$EwaBL#!^ce~fuM8xgYST*9EL zXAl*2<69-Moa5_=LVIt;;mIUDSZ+Lgf7yEQgUp^0`_aX^xjq)bzxM zJ=^~J9P(X)rSs7_CN&M)?WUO?Lu#k(`O}8_Tt*Vi#Z-$J#>3MYnOUv~t{Mqwo^o^Y z;Xmqe#mMK7tOGXw!flg1;>iQ5gY5EJ#;Ubb99u^bH4mHDRV(N99&pGV@|@Xq^XGh9YG1wGZqeCp!LY1NyaWS$5L zv1LD%gGY@*BMTqO#`Ak|?khY9L%AIMoX_01>r!BO>SOAHz`Uz0E|F&&R>RLPM}AUt z7MZ=XPg{((gs`Xt%OfTimG zRfa^dgX3Wo#jz2eCbVYh(gr!AGsUW(BKDH;U$$}Dt73g|cLW7>%rU{Fv+%>jws)G; z3)>Q0LQaxpG_ElC$RBN}>RIwIbLAA;C*Zk|{kY@{X3{stUYU=IOy91qq(7$miQPCg zX@O&(?#H+D>cn-;6=(GB6LA{N(mz03zS5uzWQcnDo}yBJ{lQAEt2f8j6~(bu?fgK7 zeg)=*##SeVdDo9$=bz~2tx^B|0Bgk&Mh(h|2R)JbS z+wn>5)8;&Ss~46XMzZ~DigFI|y=l~b&VHmwOcyQL!!Y)Bae#QQ$GRP6nEYe0IvI%v zyVu~%6U*5bJJo!HP7vFU#h3KIym~@hq*{38%frBhy1<3Lu&}T_(`z4;Ppq^}gsm^X z*t1$3xb|siC@iM-!-&i3bpF~z=3+i$z}HW;8IO{;nr&N*JyXi==k*BL!?wOB^4+-0 zAHt1=5I85)PshvRnADu5DA?HgQDiNHw;B^e{^V_)$ zUIyZRe><1KuTk9ZZ|5?IKb*_phyTe|-_B(~2@yO?{%xjR`tO-`i4>X0dqp%^=Q-cp zEWEsxZ!q=jo)2M%nNAy?`1p3}x=|S}*>0>uV*}FwJ+VQqnZ+ZH@K(*O3zkNi^1- z^lMJ4!@?__)a@jS?vJf>%-=FV9|%Hc)ksmh1==q6sH)!)ukrAgyqjc>dB5iL(Q~$P zDQ{_^>*@Q+`D4ybowK7+nl||+Yh&~wt$HW!&rJ@L>i+BKDWML>YM_WiCG^gC9fAREu5xd(PleLky}Q3o#rV!gW-qs zUgqmV=0r7lHy8Oo&)xV?H~opNV(QKvztlO$zUMvVUo}XV%eZ{?8U(K8ZFenlDt|ER z_8eIve_lFC{!@UNqwWRuQp=pKnDLdiZN2evQipa_HQuGNHsLxaL4RyvO=;$|B)5+) z7s>sC;sr}3mSQE>J#&g&4g$A=EyoKFQhYpIL3uC!!ZnICfd!2#w@;O+N#=(yXC1jl z^iX0%X1e8!kIV_@Ek%+pmlsaO_^&e{FVpRKINYsrH2>=3v+}o>dEQUcARo4JXB6%w zQ)4m~Sj{!*XIQ=&kD1ZP$S^t1Y^94Wi}OKF?+$X)4tl?hlIR>KM19kRioizFA57D~0uW-nc&Y5(l z4Svpl+ve<>Iq=-Scg-Z4`0V-MI{i1%SNo!md=l2LC|>DQeYJM~t5+v1x*}{Xf+53$ zR`ft>M7H`Ab=qO-@V7RZtU`&_X%i0&Dc1#xsJ`+I<=;^@@H{wk+h+gdmzB?^+s*E7 z&yg0(E8YFT2W4qA%A9KNa(AZADUpwvK26BDQCS?uZH8NyaE0QK?83|5*x_@Th3Ty^03iUJtJy3np!^+;`F178yr1&1Ef=v0iIF35 z!D)M&j~U}y!B;Mkvh&+XFoeF~mF2%AC8$Qe9XV6#H!ZHG5}95P-(j(%p|_o>wDs(P z_#Nb?w`n_3Rjv~mjug^iHn3EG$Fx>Aug)>Ed9!rc=R3BFwYOv#Us2}aKFEiZyzIY{ z#6hvwT%D`Sk?ms1*AK&MH9c}~(LMextEU#~s9Cz)6b?~@TktiL1@}-rpLFkV8T8t& zd`z!dlWFUlNDE1~Fu$1(OvYsWq4}K`I2!Y14x~}P=rvbr4^02U6~$cf`R+tC)A^A4 z5KAW^%+8O``K}Hjd6wre6>}@L%ya#fTi_(0ZFLOd)a%VAzHHB>D{*>lg&53!l7*m( z2q~8%L{~Ur zf2%$H7X7PPS9KXzCU@qD9uRS)PuhmuDSFgWL1r<-SW}aoI zJ9g^>Y_Z>1__jbg#T(w)CuhUmPkVgLKx2DRju9OvQ~9?T-fiXAjN#-=80k4C@4$a7 zRa(s{_T1F=a;^EdDEkUt^X<{kpX{t_s@m(!l-`SqBsMS8%xrrsFnxNW z^>uk78l!J;WYNmD+(B{LxQVy9J~xGmsorm9L90{bXpWC(N6gsp@?77?rYAA*oMSYL zgYOToc)S@fBwo$+xR=O8KE$@8@%{r%&ok#tLtb@yyNMj18J@Ju&zIiqt@U_Ia@)H3 zp&fI?-sd8f{m?=KN@6#-87g1+H~5FNXdBx~F!S9$rZ$k8jMhQZk?7OEzF+6}YN^I) zThvt@)f`Dm@vW^$k^HN1Q6dg2$@4;eI}{r}^=eG0WeT&+26?4ASC-%CK9naHsS(|s z$>Drl)xK6cZQJde6K{^nAJAw#v$)tz1?-a(bPH3-KwS%_Qv5Cb2xTfWV0Bi zK3#CIBL6|+(581Wmj@3$nW~93F(NPWFg1P8+}J)AvGn>X zpAI9_XAU7$SWowk*NNQ>6l2nz-TFk2b#GoUWTThBkZ>v4Uk`1MQr1Ug@!Wm#v8aSY z8kQfit=~_l+hxa1!)WR_p&-&7j=VyOT}Nz}T`QE>&tB-bM!~CW4@V|69zL}5iXGQU z`^24*&nt7f=*~PQGRzr%N3@-OYCDHHJc~2$Nqy=)4q}AO{%8uNlF1Xs#q6%9x+gZM1lx!mZk|;8|@O{{nBDHVLzXh5l|r=t-6i$@H;zdwH%=jBv+(Sx25v+uuww zX0M=G#mk~7(PD2d=c9kO_1vvJ`u4M~J|5=|(%;~l9i+`-xy-1@eOcdmc)~Nt>ZD?Nv^|Re^2g~z4)Tq9At*|fm7w*g&mJ*$FT3zOfYwG4z z5Er>K8C#&hr;%f^(9~P@=<~Y==JDrb+s0Wbzf5g8bk;y!EX0>eR=9 zu0N=ldpY@@Pue(Uv(=>AL z>*t46Mm${C!q!%;3KZ#<`v1v`Ls%=<&cnfqnN!-?(u!Hn4ivrf#wAGvsGgyDj4 zlpwgl0f&JnA$bI0M+EV?95;G{6p@=Z{3R))5JAb^Z&o%8M1$h6+3;zpT6vgRnt7Pv zAU_IA>Z_{YZn3+20E8XMM8r>lq9FF5hKRY9jh&My>vUBeE3=)YD65{3s-UWiw3V%$ zg0GvEmam$&g|EE@){<3ROyrdCDMuGaFgo)oM+YZ&;ZvflW}wWVl`!~@0}HS+gRLMp+@Jo~xm;MrDzx4L@=J!VMJG;FI{wyNTis^! z_8tN*Ha~l~{6dZ2Pyv4cs31T~F%e4(VGkUqZ;(>b!DHi#gB|XDgdIR-MnG|pIMmwA z)4_vP?3d*rB7mcngPqvM7kpQNpTmJ~78@+QF`|~0>-V9>RP8M6%^v1BFiT6S9n(=% z;bm60<(J_n7!ltCH{y?Rz|;$WTNm2S&JJR~E)5X@!oT9)4fg_`Al1UgqovGje&Ar` z#HXW0@I?IIaZmi&4L2xQaCX){xTPe9TX1}W2tGJM8x9jjB82g)PFPTI{;$UZChT~iTFsmXs+`s(^ zH;SsNu%eT@hnbUwm7Hb9|A<|rvL)a7iDz=;^mLh z{!cz+X&~DioNaL84Nv=@rGUOmKIRQMiFcFXny8qWTRFHh{|NIHPyr0b%!y|%ys+MI zs%V4S>6*^Y9?TnYthfiLnz`94I$1ma$n1*)fI_RFED^3a6JEl)yMWxm?#$L^4(>SE zMyRl^ot3who4T8owH2sc^lSAd89O)79w)^FRNy!iH#!{i^l-3q0#%+i?n?Y3^iP37 z$UuQ4B$5m$p>O{{5lWnU#(LKe7%mtW_mA1>2Mjp=p)g#5M}l_1eFuSo8c7fsJ}{V| zFA5i|O8~>&JR^i*aCO=U+JRFDLKq0X2Y#yG+ri+tKw<(I0_Th(fZ>z75Wv7u2c#XS zR|$b(a6!lfeL)o}LKx8G5V`>WGo&2?D+Fl=YzhdSK{Y-I42{LPOMk}&1B1>lKpFB} z3`kE6>5IS1K`t93C6<*d=tP> zxEv~kFkB!!0SsJOhrqD7fc4+n0qahP@VVe-1Y|szAOcsCj-W3RSHO<|hQbB06Tr~8 z^2-D;kg|XfhIPdtVp=C$R`%NFm5GU?BJ%(hl6;gTOE-NME=hF4+I~XTV`X z5d7ev=q02b5*OG{&=+4KkN}3pT|gj!fh&g)7`{m3@9hvU++_m-7#vr%lK_UmU5X%p z3E_4N1Tb)04Fbd9QYR3!gRWn27YmoJ`}cOB{v8BABmxC_E+}>j?F+I#LB>Pl&Z!BW z0bQ5i5*TD%!od9x$ap|x6RuxSC=ohup!_EUKOxi~+M!X9@qkE#&=2G-B3!?qLMxP? zff^%}B`_2QI_D@XbS}{#D?TBu&`@0lig-fT0;mcM!4HkX)tvmD_Goa}MF_(PLS+O7 zhO5^3dtVF!Iv?Pm4D!Ah6m$)O%ZiY>1XU3sbOtH~GH>7l806is2waWY-|+)14tWL^ z1(h#Y@WPP3K)4gYfGC0RF0jOL`9XerE*xyO3D++il*T5cGh7gbyP!nS7mYi7B7gzK zMF@jIc>@lE@&*ufpx6V!cz^*R_`yJmBEoiXLFl`||M0%>KfEufWecGn98@xfJOcxz zGeYnWFnp2l-|2$D*M}y6LG=faU=TYDTxb6S3=6TFaQRCJ`5q3`0wG_)kqDgY;&)t- zcr%>cS9j?hpE56FA8c8fy4-qwGUVb%0oa-Le>@z}L5E_8=Ymhm@;0sv)jtd5jyWmIw!$M&|CPJQp zg<&Aiz=8!rI38H$ka@$Rpz;a}BC8;Mu@KthJd1?1LI^_FDp=AGUIUbZ$V6aKL*z38 zY?%n@g1}cs|D9F{u(u+l0Rjex&;S9$mmL3%&IlO(k|zNSFf;)TfW-O3Gk_w5v;&(6 zLKs{S7kKddGw=x>2w_Ob-VbP6$i5K)#6960A%Hj_SyAI@!fXF5U5(C-eAb=?f!3D4y zX{DZ(Sko`FV1@!?SP*_}9>EFlugDr|cgM1{Ab_gggVA}{C4=4smU#RU3 zMuW&x1b7VyoiQLS0O5ET5IF~dA#s5F z3WKhFVC_O=7!u?vh2RXs;sVQlrwcIpA@2)ZOAwlZr3Ilq9ICsKz|Mx?3=AjeGr-v% z1Q#sCW(5a$5IYfwZ0P$U5D*^e#$wS{4jfU)nkRbIggnnSV4|!kUe}>=!{Lhf}3&a(4JS4=&gTz4n z=pex>WG{}yU?6*O;6{hy2YeooHI0Ste~~~PLDmr#1+kw&$`$CmVKERs1z`aYJ_YGm zAoB)XbC7uh=~*E222!;^<_)B4f$%9v-2(A}g7hsAJ_YVS2%mx_2;ozZ;sv6&gkWHG z5%3={6Cvvjz#z6B*eyWL2!IxZ$PyuN>QBgPK+8b(Tfk)ru@i-W^MP>AK`I#tZ-CPe z2ycKD1KC>va~HxJAVeC%8^9WZ*fe1046$jz`5a^|05>aSEeHYGPPk?O3`!SZz!0uM zASR*jfrQ$6Kw3fcFK~lEbfXXw1+js_r5lLvO9<>MAoB+H6_EJ=j6f(Oz`-TN-Vg#0 zhP)eakrB!|At5xxwgp-NV%vhQ5Ze}50uVb9Y+a!53-%BYz6a(m>S`3fv#0F8altgg$Lm)paKZ(Fd+=oZwpi?WN!s56)2x# zp#D?fO@zp7Aq>=y38oFYF0p^$XDslh5y~Mfu)ZNMA?UiqLhVzWDFER~a1;%hH!K!% zwgbFy5S<4kB7`S_MuF_H0ZT$;6Ig8!`3$%oml*3eyBKVfAvyr;ARzJ?c+4R>9tGT@ zgzE@|z(HgQFoz)W3cw(I4?GW$JvIsk3}Zr^!8V?dreIeF;b#;a4t-x>%M-3a+;*RE zy#a3%WX?gTAC%5OcSCT&0>>T!&cMS6(LG>gLHGduhqDtj7B~h7#{l7{WtXV8ju= zFCYuVe*jJ@A-sVFN`;X2I5#U420h=$0-KtU1^@=xHv(-5#RU}ihV%vJeuT6FDTpEQ z8(1_3qK^O!BAc*iX#4?yfua|`uW4|s2H8&o7(}*XF~DGh^aUGg2n>1_jRg}7nIjDJ zECzT*A^rm_@XJH{;*$*iCYykCf$$^{r;u0@00Z}832A_a*aBdwLi7UAS`fblfc=36 zP??Pd$1{ZM13;jBfQ9bCuvlm;1n~Yrd^Z3FS<^s$Kx7GkLF6tLxEUZk34B@*+GC;T zGgvJ2><)-E$es?spz{k-Q$u(NFd)I&2fGU3`1yU_U|{P)xW@r7NbCoI0Yy#N7to4; zpTRw2;2D6lgXnJ14p;N$Hy#2oh;JPRVtWYB;{gnKhY9)u5ld+6fp*|3E~Fh~O#|f3J_W<$=u3Qy)@=KQO$XD)p9R}dZT=7Eoc1xIFJ*FeV3 JE_+Pw{{VQ#-q`>E literal 91521 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

)&CB|*9(XrdH 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 b8FjsSuL { - show terms.item: item => { - set text(weight: "bold") - item.term - block(inset: (left: 1.5em, top: -0.4em))[#item.description] - } - it -} - -// Prevent breaking inside definition items, i.e., keep term and description together. -#show terms.item: set block(breakable: false) +#show terms.item: it => block(breakable: false)[ + #text(weight: "bold")[#it.term] + #block(inset: (left: 1.5em, top: -0.4em))[#it.description] +] // Some quarto-specific definitions. #show raw.where(block: true): set block( - fill: luma(230), - width: 100%, - inset: 8pt, - radius: 2pt, -) + fill: luma(230), + width: 100%, + inset: 8pt, + radius: 2pt + ) #let block_with_new_content(old_block, new_content) = { let fields = old_block.fields() @@ -90,6 +81,7 @@ } return true } + } // Subfloats @@ -110,33 +102,33 @@ let n-super = figcounter.get().first() + 1 set figure.caption(position: position) [#figure( - kind: kind, - supplement: supplement, - caption: caption, - { - show figure.where(kind: kind): set figure(numbering: _ => { - let subfloat-idx = quartosubfloatcounter.get().first() + 1 - subfloat-numbering(n-super, subfloat-idx) + kind: kind, + supplement: supplement, + caption: caption, + { + show figure.where(kind: kind): set figure(numbering: _ => { + let subfloat-idx = quartosubfloatcounter.get().first() + 1 + subfloat-numbering(n-super, subfloat-idx) + }) + show figure.where(kind: kind): set figure.caption(position: position) + + show figure: it => { + let num = numbering(subcapnumbering, n-super, quartosubfloatcounter.get().first() + 1) + show figure.caption: it => block({ + num.slice(2) // I don't understand why the numbering contains output that it really shouldn't, but this fixes it shrug? + [ ] + it.body }) - show figure.where(kind: kind): set figure.caption(position: position) - - show figure: it => { - let num = numbering(subcapnumbering, n-super, quartosubfloatcounter.get().first() + 1) - show figure.caption: it => block({ - num.slice(2) // I don't understand why the numbering contains output that it really shouldn't, but this fixes it shrug? - [ ] - it.body - }) - quartosubfloatcounter.step() - it - counter(figure.where(kind: it.kind)).update(n => n - 1) - } + quartosubfloatcounter.step() + it + counter(figure.where(kind: it.kind)).update(n => n - 1) + } - quartosubfloatcounter.update(0) - body - }, - )#label] + quartosubfloatcounter.update(0) + body + } + )#label] } } @@ -159,9 +151,9 @@ let old_title_block = old_callout.body.children.at(0) let children = old_title_block.body.body.children let old_title = if children.len() == 1 { - children.at(0) // no icon: title at index 0 + children.at(0) // no icon: title at index 0 } else { - children.at(1) // with icon: title at index 1 + children.at(1) // with icon: title at index 1 } // TODO use custom separator if available @@ -179,49 +171,39 @@ block_with_new_content( old_title_block.body, if children.len() == 1 { - new_title // no icon: just the title + new_title // no icon: just the title } else { - children.at(0) + new_title // with icon: preserve icon block + new title - }, - ), - ) + children.at(0) + new_title // with icon: preserve icon block + new title + })) - align(left, block_with_new_content(old_callout, block(below: 0pt, new_title_block) + old_callout.body.children.at(1))) + align(left, block_with_new_content(old_callout, + block(below: 0pt, new_title_block) + + old_callout.body.children.at(1))) } // 2023-10-09: #fa-icon("fa-info") is not working, so we'll eval "#fa-info()" instead -#let callout( - body: [], - title: "Callout", - background_color: rgb("#dddddd"), - icon: none, - icon_color: black, - body_background_color: white, -) = { +#let callout(body: [], title: "Callout", background_color: rgb("#dddddd"), icon: none, icon_color: black, body_background_color: white) = { block( - breakable: false, - fill: background_color, - stroke: (paint: icon_color, thickness: 0.5pt, cap: "round"), - width: 100%, + breakable: false, + fill: background_color, + stroke: (paint: icon_color, thickness: 0.5pt, cap: "round"), + width: 100%, radius: 2pt, block( inset: 1pt, - width: 100%, - below: 0pt, + width: 100%, + below: 0pt, block( fill: background_color, width: 100%, - inset: 8pt, - )[#if icon != none [#text(icon_color, weight: 900)[#icon] ]#title], - ) - + if (body != []) { + inset: 8pt)[#if icon != none [#text(icon_color, weight: 900)[#icon] ]#title]) + + if(body != []){ block( - inset: 1pt, - width: 100%, - block(fill: body_background_color, width: 100%, inset: 8pt, body), - ) - }, - ) + inset: 1pt, + width: 100%, + block(fill: body_background_color, width: 100%, inset: 8pt, body)) + } + ) } @@ -229,49 +211,49 @@ /* Function definitions for syntax highlighting generated by skylighting: */ #let EndLine() = raw("\n") #let Skylighting(fill: none, number: false, start: 1, sourcelines) = { - let blocks = [] - let lnum = start - 1 - let bgcolor = rgb("#24292e") - for ln in sourcelines { - if number { - lnum = lnum + 1 - blocks = blocks + box(width: if start + sourcelines.len() > 999 { 30pt } else { 24pt }, text([ #lnum ])) - } - blocks = blocks + ln + EndLine() - } - block(fill: bgcolor, width: 100%, inset: 8pt, radius: 2pt, blocks) + let blocks = [] + let lnum = start - 1 + let bgcolor = rgb("#24292e") + for ln in sourcelines { + if number { + lnum = lnum + 1 + blocks = blocks + box(width: if start + sourcelines.len() > 999 { 30pt } else { 24pt }, text([ #lnum ])) + } + blocks = blocks + ln + EndLine() + } + block(fill: bgcolor, width: 100%, inset: 8pt, radius: 2pt, blocks) } -#let AlertTok(s) = text(weight: "bold", fill: rgb("#ff5555"), raw(s)) -#let AnnotationTok(s) = text(fill: rgb("#6a737d"), raw(s)) -#let AttributeTok(s) = text(fill: rgb("#f97583"), raw(s)) -#let BaseNTok(s) = text(fill: rgb("#79b8ff"), raw(s)) -#let BuiltInTok(s) = text(fill: rgb("#f97583"), raw(s)) -#let CharTok(s) = text(fill: rgb("#9ecbff"), raw(s)) -#let CommentTok(s) = text(fill: rgb("#6a737d"), raw(s)) -#let CommentVarTok(s) = text(fill: rgb("#6a737d"), raw(s)) -#let ConstantTok(s) = text(fill: rgb("#79b8ff"), raw(s)) -#let ControlFlowTok(s) = text(fill: rgb("#f97583"), raw(s)) -#let DataTypeTok(s) = text(fill: rgb("#f97583"), raw(s)) -#let DecValTok(s) = text(fill: rgb("#79b8ff"), raw(s)) -#let DocumentationTok(s) = text(fill: rgb("#6a737d"), raw(s)) -#let ErrorTok(s) = underline(text(fill: rgb("#ff5555"), raw(s))) -#let ExtensionTok(s) = text(weight: "bold", fill: rgb("#f97583"), raw(s)) -#let FloatTok(s) = text(fill: rgb("#79b8ff"), raw(s)) -#let FunctionTok(s) = text(fill: rgb("#b392f0"), raw(s)) -#let ImportTok(s) = text(fill: rgb("#9ecbff"), raw(s)) -#let InformationTok(s) = text(fill: rgb("#6a737d"), raw(s)) -#let KeywordTok(s) = text(fill: rgb("#f97583"), raw(s)) -#let NormalTok(s) = text(fill: rgb("#e1e4e8"), raw(s)) -#let OperatorTok(s) = text(fill: rgb("#e1e4e8"), raw(s)) -#let OtherTok(s) = text(fill: rgb("#b392f0"), raw(s)) -#let PreprocessorTok(s) = text(fill: rgb("#f97583"), raw(s)) -#let RegionMarkerTok(s) = text(fill: rgb("#6a737d"), raw(s)) -#let SpecialCharTok(s) = text(fill: rgb("#79b8ff"), raw(s)) -#let SpecialStringTok(s) = text(fill: rgb("#9ecbff"), raw(s)) -#let StringTok(s) = text(fill: rgb("#9ecbff"), raw(s)) -#let VariableTok(s) = text(fill: rgb("#ffab70"), raw(s)) -#let VerbatimStringTok(s) = text(fill: rgb("#9ecbff"), raw(s)) -#let WarningTok(s) = text(fill: rgb("#ff5555"), raw(s)) +#let AlertTok(s) = text(weight: "bold",fill: rgb("#ff5555"),raw(s)) +#let AnnotationTok(s) = text(fill: rgb("#6a737d"),raw(s)) +#let AttributeTok(s) = text(fill: rgb("#f97583"),raw(s)) +#let BaseNTok(s) = text(fill: rgb("#79b8ff"),raw(s)) +#let BuiltInTok(s) = text(fill: rgb("#f97583"),raw(s)) +#let CharTok(s) = text(fill: rgb("#9ecbff"),raw(s)) +#let CommentTok(s) = text(fill: rgb("#6a737d"),raw(s)) +#let CommentVarTok(s) = text(fill: rgb("#6a737d"),raw(s)) +#let ConstantTok(s) = text(fill: rgb("#79b8ff"),raw(s)) +#let ControlFlowTok(s) = text(fill: rgb("#f97583"),raw(s)) +#let DataTypeTok(s) = text(fill: rgb("#f97583"),raw(s)) +#let DecValTok(s) = text(fill: rgb("#79b8ff"),raw(s)) +#let DocumentationTok(s) = text(fill: rgb("#6a737d"),raw(s)) +#let ErrorTok(s) = underline(text(fill: rgb("#ff5555"),raw(s))) +#let ExtensionTok(s) = text(weight: "bold",fill: rgb("#f97583"),raw(s)) +#let FloatTok(s) = text(fill: rgb("#79b8ff"),raw(s)) +#let FunctionTok(s) = text(fill: rgb("#b392f0"),raw(s)) +#let ImportTok(s) = text(fill: rgb("#9ecbff"),raw(s)) +#let InformationTok(s) = text(fill: rgb("#6a737d"),raw(s)) +#let KeywordTok(s) = text(fill: rgb("#f97583"),raw(s)) +#let NormalTok(s) = text(fill: rgb("#e1e4e8"),raw(s)) +#let OperatorTok(s) = text(fill: rgb("#e1e4e8"),raw(s)) +#let OtherTok(s) = text(fill: rgb("#b392f0"),raw(s)) +#let PreprocessorTok(s) = text(fill: rgb("#f97583"),raw(s)) +#let RegionMarkerTok(s) = text(fill: rgb("#6a737d"),raw(s)) +#let SpecialCharTok(s) = text(fill: rgb("#79b8ff"),raw(s)) +#let SpecialStringTok(s) = text(fill: rgb("#9ecbff"),raw(s)) +#let StringTok(s) = text(fill: rgb("#9ecbff"),raw(s)) +#let VariableTok(s) = text(fill: rgb("#ffab70"),raw(s)) +#let VerbatimStringTok(s) = text(fill: rgb("#9ecbff"),raw(s)) +#let WarningTok(s) = text(fill: rgb("#ff5555"),raw(s)) @@ -316,9 +298,11 @@ ) if authors != none and authors != () set par( justify: true, - leading: linestretch * 0.65em, + leading: linestretch * 0.65em ) - set text(lang: lang, region: region, size: fontsize) + set text(lang: lang, + region: region, + size: fontsize) set text(font: font) if font != none show math.equation: set text(font: mathfont) if mathfont != none show raw: set text(font: codefont) if codefont != none @@ -333,63 +317,66 @@ } else { text(this) } - } - - place( - top, - float: true, - scope: "parent", - clearance: 4mm, - block(below: 1em, width: 100%)[ - - #if title != none { - align(center, block(inset: 2em)[ - #set par(leading: heading-line-height) if heading-line-height != none - #set text(font: heading-family) if heading-family != none - #set text(weight: heading-weight) - #set text(style: heading-style) if heading-style != "normal" - #set text(fill: heading-color) if heading-color != black - - #text(size: title-size)[#title #if thanks != none { + } + + let has-title-block = title != none or (authors != none and authors != ()) or date != none or abstract != none + if has-title-block { + place( + top, + float: true, + scope: "parent", + clearance: 4mm, + block(below: 1em, width: 100%)[ + + #if title != none { + align(center, block(inset: 2em)[ + #set par(leading: heading-line-height) if heading-line-height != none + #set text(font: heading-family) if heading-family != none + #set text(weight: heading-weight) + #set text(style: heading-style) if heading-style != "normal" + #set text(fill: heading-color) if heading-color != black + + #text(size: title-size)[#title #if thanks != none { footnote(thanks, numbering: "*") counter(footnote).update(n => n - 1) }] - #( - if subtitle != none { + #(if subtitle != none { parbreak() text(size: subtitle-size)[#subtitle] - } - ) - ]) - } - - #if authors != none and authors != () { - let count = authors.len() - let ncols = calc.min(count, 3) - grid( - columns: (1fr,) * ncols, - row-gutter: 1.5em, - ..authors.map(author => align(center)[ - #author.name \ - #author.affiliation \ - #author.email + }) ]) - ) - } + } + + #if authors != none and authors != () { + let count = authors.len() + let ncols = calc.min(count, 3) + grid( + columns: (1fr,) * ncols, + row-gutter: 1.5em, + ..authors.map(author => + align(center)[ + #author.name \ + #author.affiliation \ + #author.email + ] + ) + ) + } - #if date != none { - align(center)[#block(inset: 1em)[ - #date - ]] - } + #if date != none { + align(center)[#block(inset: 1em)[ + #date + ]] + } - #if abstract != none { - block(inset: 2em)[ + #if abstract != none { + block(inset: 2em)[ #text(weight: "semibold")[#abstract-title] #h(1em) #abstract - ] - } - ], - ) + ] + } + ] + ) + } if toc { let title = if toc_title == none { @@ -398,11 +385,11 @@ toc_title } block(above: 0em, below: 2em)[ - #outline( - title: toc_title, - depth: toc_depth, - indent: toc_indent, - ); + #outline( + title: toc_title, + depth: toc_depth, + indent: toc_indent + ); ] } @@ -411,15 +398,16 @@ #set table( inset: 6pt, - stroke: none, + stroke: none ) +#import "@preview/fontawesome:0.5.0": * #let brand-color = (:) #let brand-color-background = (:) #let brand-logo = (:) #set page( paper: "a4", - margin: (x: 2.5cm, y: 2.5cm), + margin: (x: 2.5cm,y: 2.5cm,), numbering: "1", columns: 1, ) @@ -428,50 +416,72 @@ title: [Code Window], subtitle: [Quarto Extension], authors: ( - (name: [Mickaël CANOUIL, #emph[Ph.D.]], affiliation: [], email: []), - ), + ( name: [Mickaël CANOUIL, #emph[Ph.D.]], + affiliation: [], + email: [] ), + ), toc_title: [Table of contents], toc_depth: 3, doc, ) -#show figure.where(kind: "quarto-float-lst"): set align(start) -// skylighting-typst-fix override -#let Skylighting( - fill: none, - number: false, - start: 1, - sourcelines, -) = { - let bgcolor = if fill != none { fill } else { rgb("#24292e") } - let blocks = [] - let lnum = start - 1 - let has-gutter = start + sourcelines.len() > 999 - - for ln in sourcelines { - if number { - lnum = lnum + 1 - blocks = ( - blocks - + box( - width: if has-gutter { 30pt } else { 24pt }, - text([ #lnum ]), - ) - ) +// code-window: annotation state passed to Skylighting via Typst state +#let _cw-annotations = state("cw-annotations", none) + +// Derive a contrasting annotation colour from a background fill. +// Light backgrounds get dark circles; dark backgrounds get light circles. +// Uses ITU-R BT.709 luminance coefficients, matching quarto-cli PR #14170. +#let code-window-annote-colour(bg) = { + if type(bg) == color { + let comps = bg.components(alpha: false) + let lum = if comps.len() == 1 { + comps.at(0) / 100% + } else { + 0.2126 * comps.at(0) / 100% + 0.7152 * comps.at(1) / 100% + 0.0722 * comps.at(2) / 100% } - blocks = blocks + ln + EndLine() + if lum < 0.5 { luma(200) } else { luma(60) } + } else { + luma(60) } +} - block( - fill: bgcolor, - width: 100%, - inset: 8pt, - radius: 2pt, - stroke: none, - blocks, - ) +#let code-window-circled-number(n, bg-colour: none) = { + let c = if bg-colour != none { code-window-annote-colour(bg-colour) } else { luma(120) } + box(baseline: 20%, circle( + radius: 4.5pt, + stroke: 0.5pt + c, + )[#set text(size: 5.5pt, fill: c); #align(center + horizon, str(n))]) +} + +#let code-window-annotation-item(block-id, n, content) = { + let lbl-prefix = "cw-" + str(block-id) + "-" + [#block(above: 0.4em, below: 0.4em)[ + #link(label(lbl-prefix + "line-" + str(n)))[ + #code-window-circled-number(n) + ] + #h(0.4em) + #content + ] #label(lbl-prefix + "item-" + str(n))] +} + +#let code-window-annotated-content(content, annotations: (:), bg-colour: none, block-id: 0) = { + if annotations.len() > 0 { + _cw-annotations.update((annotations: annotations, bg-colour: bg-colour, block-id: block-id)) + content + _cw-annotations.update(none) + } else { + content + } } -#let code-window(content, filename: none, is-auto: false, style: "macos") = { +#let code-window( + content, + filename: none, + is-auto: false, + style: "macos", + annotations: (:), + bg-colour: none, + block-id: 0, +) = { let border-colour = luma(200) let surface-fill = luma(237) let muted-colour = luma(120) @@ -522,7 +532,8 @@ align: (left + horizon, right + horizon), gutter: 0.5em, stroke: 0pt, - traffic-lights, filename-label, + traffic-lights, + filename-label, ) } else if style == "windows" { grid( @@ -530,7 +541,8 @@ align: (left + horizon, right + horizon), gutter: 0.5em, stroke: 0pt, - filename-label, window-buttons, + filename-label, + window-buttons, ) } else { // default: plain filename, left-aligned @@ -573,113 +585,126 @@ above: 0pt, below: 0pt, ) - content + code-window-annotated-content( + content, + annotations: annotations, + bg-colour: bg-colour, + block-id: block-id, + ) } }, ) } -#figure( - [ - #code-window(filename: "fibonacci.py", is-auto: false, style: "macos")[ - #Skylighting(( - [#KeywordTok("def");#NormalTok(" fibonacci(n: ");#BuiltInTok("int");#NormalTok(") ");#OperatorTok( - "->", - );#NormalTok(" ");#BuiltInTok("int");#NormalTok(":");], - [#NormalTok(" ");#CommentTok("\"\"\"Calculate the nth Fibonacci number.\"\"\"");], - [#NormalTok(" ");#ControlFlowTok("if");#NormalTok(" n ");#OperatorTok("<=");#NormalTok(" ");#DecValTok( - "1", - );#NormalTok(":");], - [#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" n");], - [#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" fibonacci(n ");#OperatorTok("-");#NormalTok( - " ", - );#DecValTok("1");#NormalTok(") ");#OperatorTok("+");#NormalTok(" fibonacci(n ");#OperatorTok("-");#NormalTok( - " ", - );#DecValTok("2");#NormalTok(")");], - )); - ] - ], - caption: figure.caption( - position: top, - [ - This is code - ], - ), - kind: "quarto-float-lst", - supplement: "Listing", -) - +// skylighting-typst-fix override +#let Skylighting( + fill: none, + number: false, + start: 1, + sourcelines, +) = { + let bgcolor = if fill != none { fill } else { rgb("#24292e") } + let has-gutter = start + sourcelines.len() > 999 + context { + let annot-data = _cw-annotations.get() + let blocks = [] + let lnum = start - 1 + let seen-annotes = (:) + + for ln in sourcelines { + lnum = lnum + 1 + if number { + blocks = blocks + box( + width: if has-gutter { 30pt } else { 24pt }, + text([ #lnum ]), + ) + } + + if annot-data != none { + let annot-num = annot-data.annotations.at(str(lnum), default: none) + if annot-num != none { + let lbl-prefix = "cw-" + str(annot-data.block-id) + "-" + if str(annot-num) not in seen-annotes { + seen-annotes.insert(str(annot-num), true) + blocks = blocks + box(width: 100%)[ + #ln + #h(1fr) + #link(label(lbl-prefix + "item-" + str(annot-num)))[ + #code-window-circled-number(annot-num, bg-colour: annot-data.bg-colour) + ] + #label(lbl-prefix + "line-" + str(annot-num)) + ] + } else { + blocks = blocks + box(width: 100%)[ + #ln + #h(1fr) + #link(label(lbl-prefix + "item-" + str(annot-num)))[ + #code-window-circled-number(annot-num, bg-colour: annot-data.bg-colour) + ] + ] + } + } else { + blocks = blocks + ln + } + } else { + blocks = blocks + ln + } + blocks = blocks + EndLine() + } + block( + fill: bgcolor, + width: 100%, + inset: 8pt, + radius: 2pt, + stroke: 0.5pt + luma(200), + blocks, + ) + } +} = Explicit Filename Code blocks with a #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("filename");] attribute display a window header with the filename. The decoration style depends on the #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("style");] option (default: #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("\"macos\"");]). -#code-window(filename: "fibonacci.py", is-auto: false, style: "macos")[ - #Skylighting(( - [#KeywordTok("def");#NormalTok(" fibonacci(n: ");#BuiltInTok("int");#NormalTok(") ");#OperatorTok("->");#NormalTok( - " ", - );#BuiltInTok("int");#NormalTok(":");], - [#NormalTok(" ");#CommentTok("\"\"\"Calculate the nth Fibonacci number.\"\"\"");], - [#NormalTok(" ");#ControlFlowTok("if");#NormalTok(" n ");#OperatorTok("<=");#NormalTok(" ");#DecValTok( - "1", - );#NormalTok(":");], - [#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" n");], - [#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" fibonacci(n ");#OperatorTok("-");#NormalTok( - " ", - );#DecValTok("1");#NormalTok(") ");#OperatorTok("+");#NormalTok(" fibonacci(n ");#OperatorTok("-");#NormalTok( - " ", - );#DecValTok("2");#NormalTok(")");], - )); +#code-window(filename: "fibonacci.py", is-auto: false, style: "macos", bg-colour: rgb("#24292e"))[ +#Skylighting(([#KeywordTok("def");#NormalTok(" fibonacci(n: ");#BuiltInTok("int");#NormalTok(") ");#OperatorTok("->");#NormalTok(" ");#BuiltInTok("int");#NormalTok(":");], +[#NormalTok(" ");#CommentTok("\"\"\"Calculate the nth Fibonacci number.\"\"\"");], +[#NormalTok(" ");#ControlFlowTok("if");#NormalTok(" n ");#OperatorTok("<=");#NormalTok(" ");#DecValTok("1");#NormalTok(":");], +[#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" n");], +[#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" fibonacci(n ");#OperatorTok("-");#NormalTok(" ");#DecValTok("1");#NormalTok(") ");#OperatorTok("+");#NormalTok(" fibonacci(n ");#OperatorTok("-");#NormalTok(" ");#DecValTok("2");#NormalTok(")");],)); ] -#code-window(filename: "analysis.R", is-auto: false, style: "macos")[ - #Skylighting(( - [#CommentTok("# Load data and create summary");], - [#NormalTok("data ");#OtherTok("<-");#NormalTok(" ");#FunctionTok("read.csv");#NormalTok("(");#StringTok( - "\"data.csv\"", - );#NormalTok(")");], - [#FunctionTok("summary");#NormalTok("(data)");], - )); +#code-window(filename: "analysis.R", is-auto: false, style: "macos", bg-colour: rgb("#24292e"))[ +#Skylighting(([#CommentTok("# Load data and create summary");], +[#NormalTok("data ");#OtherTok("<-");#NormalTok(" ");#FunctionTok("read.csv");#NormalTok("(");#StringTok("\"data.csv\"");#NormalTok(")");], +[#FunctionTok("summary");#NormalTok("(data)");],)); ] = Auto-Generated Filename With #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("auto-filename: true");] (the default), code blocks without explicit filenames automatically show the language name in small-caps styling. -#code-window(filename: "python", is-auto: true, style: "macos")[ - #Skylighting(( - [#KeywordTok("def");#NormalTok(" greet(name: ");#BuiltInTok("str");#NormalTok(") ");#OperatorTok("->");#NormalTok( - " ", - );#BuiltInTok("str");#NormalTok(":");], - [#NormalTok(" ");#CommentTok("\"\"\"Return a greeting message.\"\"\"");], - [#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" ");#SpecialStringTok("f\"Hello, ");#SpecialCharTok( - "{", - );#NormalTok("name");#SpecialCharTok("}");#SpecialStringTok("!\"");], - )); +#code-window(filename: "python", is-auto: true, style: "macos", bg-colour: rgb("#24292e"))[ +#Skylighting(([#KeywordTok("def");#NormalTok(" greet(name: ");#BuiltInTok("str");#NormalTok(") ");#OperatorTok("->");#NormalTok(" ");#BuiltInTok("str");#NormalTok(":");], +[#NormalTok(" ");#CommentTok("\"\"\"Return a greeting message.\"\"\"");], +[#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" ");#SpecialStringTok("f\"Hello, ");#SpecialCharTok("{");#NormalTok("name");#SpecialCharTok("}");#SpecialStringTok("!\"");],)); ] -#code-window(filename: "r", is-auto: true, style: "macos")[ - #Skylighting(( - [#CommentTok("# Create sample data");], - [#NormalTok("data ");#OtherTok("<-");#NormalTok(" ");#FunctionTok("data.frame");#NormalTok("(");], - [#NormalTok(" ");#AttributeTok("x =");#NormalTok(" ");#DecValTok("1");#SpecialCharTok(":");#DecValTok( - "10", - );#NormalTok(",");], - [#NormalTok(" ");#AttributeTok("y =");#NormalTok(" ");#FunctionTok("rnorm");#NormalTok("(");#DecValTok( - "10", - );#NormalTok(")");], - [#NormalTok(")");], - [#FunctionTok("summary");#NormalTok("(data)");], - )); +#code-window(filename: "r", is-auto: true, style: "macos", bg-colour: rgb("#24292e"))[ +#Skylighting(([#CommentTok("# Create sample data");], +[#NormalTok("data ");#OtherTok("<-");#NormalTok(" ");#FunctionTok("data.frame");#NormalTok("(");], +[#NormalTok(" ");#AttributeTok("x =");#NormalTok(" ");#DecValTok("1");#SpecialCharTok(":");#DecValTok("10");#NormalTok(",");], +[#NormalTok(" ");#AttributeTok("y =");#NormalTok(" ");#FunctionTok("rnorm");#NormalTok("(");#DecValTok("10");#NormalTok(")");], +[#NormalTok(")");], +[#FunctionTok("summary");#NormalTok("(data)");],)); ] -#code-window(filename: "bash", is-auto: true, style: "macos")[ - #Skylighting(([#CommentTok("#!/bin/bash");], [#BuiltInTok("echo");#NormalTok(" ");#StringTok("\"Hello, World!\"");])); +#code-window(filename: "bash", is-auto: true, style: "macos", bg-colour: rgb("#24292e"))[ +#Skylighting(([#CommentTok("#!/bin/bash");], +[#BuiltInTok("echo");#NormalTok(" ");#StringTok("\"Hello, World!\"");],)); ] = Plain Code Block Code blocks without a language are not affected by the extension. -#Skylighting(( - [#NormalTok("This is a plain code block without any language specified.");], - [#NormalTok("No window decoration is applied here.");], -)); +#Skylighting(([#NormalTok("This is a plain code block without any language specified.");], +[#NormalTok("No window decoration is applied here.");],)); = Disabled Auto-Filename To disable auto-generated filenames, set #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("auto-filename: false");] in the extension configuration. Only code blocks with an explicit #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("filename");] attribute will display window decorations. @@ -692,40 +717,123 @@ Three decoration styles are available via the #box(fill: rgb("#24292e"), inset: Traffic light buttons on the left, filename on the right. -#code-window(filename: "macos-example.py", is-auto: false, style: "macos")[ - #Skylighting(([#BuiltInTok("print");#NormalTok("(");#StringTok("\"macOS style window\"");#NormalTok(")");],)); +#code-window(filename: "macos-example.py", is-auto: false, style: "macos", bg-colour: rgb("#24292e"))[ +#Skylighting(([#BuiltInTok("print");#NormalTok("(");#StringTok("\"macOS style window\"");#NormalTok(")");],)); ] == Windows Style Minimise, maximise, and close buttons on the right, filename on the left. -#code-window(filename: "windows-example.py", is-auto: false, style: "windows")[ - #Skylighting(([#BuiltInTok("print");#NormalTok("(");#StringTok("\"Windows style window\"");#NormalTok(")");],)); +#code-window(filename: "windows-example.py", is-auto: false, style: "windows", bg-colour: rgb("#24292e"))[ +#Skylighting(([#BuiltInTok("print");#NormalTok("(");#StringTok("\"Windows style window\"");#NormalTok(")");],)); ] == Default Style Plain filename on the left, no window decorations. -#code-window(filename: "default-example.py", is-auto: false, style: "default")[ - #Skylighting(([#BuiltInTok("print");#NormalTok("(");#StringTok("\"Default style window\"");#NormalTok(")");],)); +#code-window(filename: "default-example.py", is-auto: false, style: "default", bg-colour: rgb("#24292e"))[ +#Skylighting(([#BuiltInTok("print");#NormalTok("(");#StringTok("\"Default style window\"");#NormalTok(")");],)); +] += Code Annotations + +#block[ +#callout( +body: +[ +Typst code-annotations support and #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("filename");] attribute handling are temporary hot-fixes. They will be removed once Quarto natively supports these features (see #link("https://github.com/quarto-dev/quarto-cli/pull/14170")[quarto-dev/quarto-cli\#14170]). The extension will then focus on #strong[auto-filename] and #strong[code-window-style] features. + +] +, +title: +[ +Note +] +, +background_color: +rgb("#dae6fb") +, +icon_color: +rgb("#0758E5") +, +icon: +fa-info() +, +body_background_color: +white +) +] +Code annotations work standalone and together with code-window styling. + +== Annotations with Explicit Filename + +#code-window(filename: "annotated.py", is-auto: false, style: "macos", annotations: ("1": 1, "3": 2, "4": 3), block-id: 1, bg-colour: rgb("#24292e"))[ +#Skylighting(([#ImportTok("import");#NormalTok(" pandas ");#ImportTok("as");#NormalTok(" pd");], +[], +[#NormalTok("df ");#OperatorTok("=");#NormalTok(" pd.read_csv(");#StringTok("\"data.csv\"");#NormalTok(")");], +[#NormalTok("summary ");#OperatorTok("=");#NormalTok(" df.describe()");],)); ] +#code-window-annotation-item(1, 1)[Import the pandas library.] +#code-window-annotation-item(1, 2)[Load data from a CSV file.] +#code-window-annotation-item(1, 3)[Generate summary statistics.] +== Annotations with Auto-Filename + +#code-window(filename: "python", is-auto: true, style: "macos", annotations: ("1": 1, "2": 2, "4": 3), block-id: 2, bg-colour: rgb("#24292e"))[ +#Skylighting(([#KeywordTok("def");#NormalTok(" greet(name: ");#BuiltInTok("str");#NormalTok(") ");#OperatorTok("->");#NormalTok(" ");#BuiltInTok("str");#NormalTok(":");], +[#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" ");#SpecialStringTok("f\"Hello, ");#SpecialCharTok("{");#NormalTok("name");#SpecialCharTok("}");#SpecialStringTok("!\"");], +[], +[#NormalTok("result ");#OperatorTok("=");#NormalTok(" greet(");#StringTok("\"World\"");#NormalTok(")");],)); +] +#code-window-annotation-item(2, 1)[Define a function with type hints.] +#code-window-annotation-item(2, 2)[Use an f-string for interpolation.] +#code-window-annotation-item(2, 3)[Call the function and store the result.] +== Annotations Spanning Multiple Lines + +A single annotation number can appear on several consecutive lines. Only the first occurrence receives a back-label to avoid duplicates. + +#code-window(filename: "pipeline.py", is-auto: false, style: "macos", annotations: ("1": 1, "2": 1, "3": 1, "4": 2, "5": 3), block-id: 3, bg-colour: rgb("#24292e"))[ +#Skylighting(([#KeywordTok("def");#NormalTok(" process(data):");], +[#NormalTok(" cleaned ");#OperatorTok("=");#NormalTok(" clean(data)");], +[#NormalTok(" validated ");#OperatorTok("=");#NormalTok(" validate(cleaned)");], +[#NormalTok(" result ");#OperatorTok("=");#NormalTok(" transform(validated)");], +[#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" result");],)); +] +#code-window-annotation-item(3, 1)[Multi-step input preparation (cleaning and validation).] +#code-window-annotation-item(3, 2)[Apply the main transformation.] +#code-window-annotation-item(3, 3)[Return the final result.] +== Annotations without Window Chrome + +Set #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("code-window-enabled=\"false\"");] on a block to disable window chrome while keeping annotations. + +#code-window-annotated-content(annotations: ("1": 1, "2": 2, "3": 3, "4": 4), block-id: 4, bg-colour: rgb("#24292e"))[ +#Skylighting(([#FunctionTok("library");#NormalTok("(ggplot2)");], +[#FunctionTok("ggplot");#NormalTok("(mtcars) ");#SpecialCharTok("+");], +[#NormalTok(" ");#FunctionTok("aes");#NormalTok("(");#AttributeTok("x =");#NormalTok(" mpg, ");#AttributeTok("y =");#NormalTok(" hp) ");#SpecialCharTok("+");], +[#NormalTok(" ");#FunctionTok("geom_point");#NormalTok("()");],)); +] +#code-window-annotation-item(4, 1)[Load the ggplot2 package.] +#code-window-annotation-item(4, 2)[Initialise a plot with the mtcars dataset.] +#code-window-annotation-item(4, 3)[Map aesthetics.] +#code-window-annotation-item(4, 4)[Add a point geometry layer.] == Configuration Set the global style in the document front matter: -#code-window(filename: "yaml", is-auto: true, style: "macos")[ - #Skylighting(( - [#FunctionTok("extensions");#KeywordTok(":");], - [#AttributeTok(" ");#FunctionTok("code-window");#KeywordTok(":");], - [#AttributeTok(" ");#FunctionTok("style");#KeywordTok(":");#AttributeTok(" ");#StringTok("\"macos\"");], - )); +#code-window(filename: "yaml", is-auto: true, style: "macos", bg-colour: rgb("#24292e"))[ +#Skylighting(([#FunctionTok("extensions");#KeywordTok(":");], +[#AttributeTok(" ");#FunctionTok("code-window");#KeywordTok(":");], +[#AttributeTok(" ");#FunctionTok("style");#KeywordTok(":");#AttributeTok(" ");#StringTok("\"macos\"");], +[#AttributeTok(" ");#FunctionTok("hotfix");#KeywordTok(":");], +[#AttributeTok(" ");#FunctionTok("quarto-version");#KeywordTok(":");#AttributeTok(" ");#CharTok("~");], +[#AttributeTok(" ");#FunctionTok("code-annotations");#KeywordTok(":");#AttributeTok(" ");#CharTok("true");], +[#AttributeTok(" ");#FunctionTok("skylighting");#KeywordTok(":");#AttributeTok(" ");#CharTok("true");],)); ] Override per block with the #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("code-window-style");] attribute: -#code-window(filename: "markdown", is-auto: true, style: "macos")[ - #Skylighting(( - [#InformationTok("```{.python filename=\"example.py\" code-window-style=\"windows\"}");], - [#BuiltInTok("print");#NormalTok("(");#StringTok("\"Windows style for this block only\"");#NormalTok(")");], - [#InformationTok("```");], - )); +#code-window(filename: "markdown", is-auto: true, style: "macos", bg-colour: rgb("#24292e"))[ +#Skylighting(([#InformationTok("```{.python filename=\"example.py\" code-window-style=\"windows\"}");], +[#BuiltInTok("print");#NormalTok("(");#StringTok("\"Windows style for this block only\"");#NormalTok(")");], +[#InformationTok("```");],)); ] + + + From d0a8f6c8bd0d95d8ead041ad260985d118971d72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Mon, 23 Mar 2026 22:13:26 +0100 Subject: [PATCH 4/6] docs: update changelog for hotfix consolidation --- CHANGELOG.md | 12 +++++++++++- example-typst.pdf | Bin 138006 -> 138006 bytes 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b70328..284eda6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,13 @@ ### New Features - feat: add multiple window decoration styles for code blocks (`macos`, `windows`, `default`). -- feat: add `skylighting-fix` option to enable or disable the Skylighting hot-fix for Typst output (enabled by default). +- feat: add Typst code-annotations hot-fix with annotation markers, circled numbers, and bidirectional linking. +- feat: add `hotfix.quarto-version` threshold to auto-disable temporary hot-fixes when Quarto reaches a specified version. + +### Bug Fixes + +- fix: HTML-escape auto-generated filename in code block headers to prevent XSS. +- fix: skylighting hot-fix now respects custom `wrapper` name instead of hardcoding `code-window-circled-number`. ### Style @@ -13,6 +19,10 @@ ### Refactoring +- refactor: consolidate `skylighting-fix` option into nested `hotfix` configuration key with `code-annotations` and `skylighting` toggles. +- refactor: introduce `main.lua` entry point for filter assembly and dependency wiring. +- refactor: move hotfix modules (`code-annotations.lua`, `skylighting-typst-fix.lua`) into `_modules/hotfix/`. +- refactor: split Typst function definitions so annotation helpers are only injected when at least one hot-fix is active. - refactor: update Typst processing to return block sandwich. - refactor: use utility functions for code-window extension. diff --git a/example-typst.pdf b/example-typst.pdf index 49fb99ff1caa4580956b0a7b2d2fb692c224a6fc..b7eeebf0aa2e59b379aab4ad54853dbaac3fe05c 100644 GIT binary patch delta 114 zcmbQXjbqw2j)pCa$6vA<85$c}Oh5CIQ3b->{`DoJ8#B9+m7%c}P{QdgqcNOQ^OiAR nv@pfZ-MFkWC$rMkEH&BCG1Jf|%5B>_#z#8XrKW$EVv+{{{`DoJ8#BA1m5H$xP{QdgqcNOQ^OiAR nw7euN*Cfm^%ReF~BRM} From 08fe7f277b74de3e41ccbc68f2356da2ebc3a521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Mon, 23 Mar 2026 22:20:21 +0100 Subject: [PATCH 5/6] chore: remove example.typ file Delete the example.typ file as it is no longer needed. This file contained various configurations and functions related to theorem numbering, content rendering, and code window styling that are now obsolete. --- example-typst.pdf | Bin 138006 -> 0 bytes example.typ | 839 ---------------------------------------------- 2 files changed, 839 deletions(-) delete mode 100644 example-typst.pdf delete mode 100644 example.typ diff --git a/example-typst.pdf b/example-typst.pdf deleted file mode 100644 index b7eeebf0aa2e59b379aab4ad54853dbaac3fe05c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138006 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 block(breakable: false)[ - #text(weight: "bold")[#it.term] - #block(inset: (left: 1.5em, top: -0.4em))[#it.description] -] - -// Some quarto-specific definitions. - -#show raw.where(block: true): set block( - fill: luma(230), - width: 100%, - inset: 8pt, - radius: 2pt - ) - -#let block_with_new_content(old_block, new_content) = { - let fields = old_block.fields() - let _ = fields.remove("body") - if fields.at("below", default: none) != none { - // TODO: this is a hack because below is a "synthesized element" - // according to the experts in the typst discord... - fields.below = fields.below.abs - } - block.with(..fields)(new_content) -} - -#let empty(v) = { - if type(v) == str { - // two dollar signs here because we're technically inside - // a Pandoc template :grimace: - v.matches(regex("^\\s*$")).at(0, default: none) != none - } else if type(v) == content { - if v.at("text", default: none) != none { - return empty(v.text) - } - for child in v.at("children", default: ()) { - if not empty(child) { - return false - } - } - return true - } - -} - -// Subfloats -// This is a technique that we adapted from https://github.com/tingerrr/subpar/ -#let quartosubfloatcounter = counter("quartosubfloatcounter") - -#let quarto_super( - kind: str, - caption: none, - label: none, - supplement: str, - position: none, - subcapnumbering: "(a)", - body, -) = { - context { - let figcounter = counter(figure.where(kind: kind)) - let n-super = figcounter.get().first() + 1 - set figure.caption(position: position) - [#figure( - kind: kind, - supplement: supplement, - caption: caption, - { - show figure.where(kind: kind): set figure(numbering: _ => { - let subfloat-idx = quartosubfloatcounter.get().first() + 1 - subfloat-numbering(n-super, subfloat-idx) - }) - show figure.where(kind: kind): set figure.caption(position: position) - - show figure: it => { - let num = numbering(subcapnumbering, n-super, quartosubfloatcounter.get().first() + 1) - show figure.caption: it => block({ - num.slice(2) // I don't understand why the numbering contains output that it really shouldn't, but this fixes it shrug? - [ ] - it.body - }) - - quartosubfloatcounter.step() - it - counter(figure.where(kind: it.kind)).update(n => n - 1) - } - - quartosubfloatcounter.update(0) - body - } - )#label] - } -} - -// callout rendering -// this is a figure show rule because callouts are crossreferenceable -#show figure: it => { - if type(it.kind) != str { - return it - } - let kind_match = it.kind.matches(regex("^quarto-callout-(.*)")).at(0, default: none) - if kind_match == none { - return it - } - let kind = kind_match.captures.at(0, default: "other") - kind = upper(kind.first()) + kind.slice(1) - // now we pull apart the callout and reassemble it with the crossref name and counter - - // when we cleanup pandoc's emitted code to avoid spaces this will have to change - let old_callout = it.body.children.at(1).body.children.at(1) - let old_title_block = old_callout.body.children.at(0) - let children = old_title_block.body.body.children - let old_title = if children.len() == 1 { - children.at(0) // no icon: title at index 0 - } else { - children.at(1) // with icon: title at index 1 - } - - // TODO use custom separator if available - // Use the figure's counter display which handles chapter-based numbering - // (when numbering is a function that includes the heading counter) - let callout_num = it.counter.display(it.numbering) - let new_title = if empty(old_title) { - [#kind #callout_num] - } else { - [#kind #callout_num: #old_title] - } - - let new_title_block = block_with_new_content( - old_title_block, - block_with_new_content( - old_title_block.body, - if children.len() == 1 { - new_title // no icon: just the title - } else { - children.at(0) + new_title // with icon: preserve icon block + new title - })) - - align(left, block_with_new_content(old_callout, - block(below: 0pt, new_title_block) + - old_callout.body.children.at(1))) -} - -// 2023-10-09: #fa-icon("fa-info") is not working, so we'll eval "#fa-info()" instead -#let callout(body: [], title: "Callout", background_color: rgb("#dddddd"), icon: none, icon_color: black, body_background_color: white) = { - block( - breakable: false, - fill: background_color, - stroke: (paint: icon_color, thickness: 0.5pt, cap: "round"), - width: 100%, - radius: 2pt, - block( - inset: 1pt, - width: 100%, - below: 0pt, - block( - fill: background_color, - width: 100%, - inset: 8pt)[#if icon != none [#text(icon_color, weight: 900)[#icon] ]#title]) + - if(body != []){ - block( - inset: 1pt, - width: 100%, - block(fill: body_background_color, width: 100%, inset: 8pt, body)) - } - ) -} - - -// syntax highlighting functions from skylighting: -/* Function definitions for syntax highlighting generated by skylighting: */ -#let EndLine() = raw("\n") -#let Skylighting(fill: none, number: false, start: 1, sourcelines) = { - let blocks = [] - let lnum = start - 1 - let bgcolor = rgb("#24292e") - for ln in sourcelines { - if number { - lnum = lnum + 1 - blocks = blocks + box(width: if start + sourcelines.len() > 999 { 30pt } else { 24pt }, text([ #lnum ])) - } - blocks = blocks + ln + EndLine() - } - block(fill: bgcolor, width: 100%, inset: 8pt, radius: 2pt, blocks) -} -#let AlertTok(s) = text(weight: "bold",fill: rgb("#ff5555"),raw(s)) -#let AnnotationTok(s) = text(fill: rgb("#6a737d"),raw(s)) -#let AttributeTok(s) = text(fill: rgb("#f97583"),raw(s)) -#let BaseNTok(s) = text(fill: rgb("#79b8ff"),raw(s)) -#let BuiltInTok(s) = text(fill: rgb("#f97583"),raw(s)) -#let CharTok(s) = text(fill: rgb("#9ecbff"),raw(s)) -#let CommentTok(s) = text(fill: rgb("#6a737d"),raw(s)) -#let CommentVarTok(s) = text(fill: rgb("#6a737d"),raw(s)) -#let ConstantTok(s) = text(fill: rgb("#79b8ff"),raw(s)) -#let ControlFlowTok(s) = text(fill: rgb("#f97583"),raw(s)) -#let DataTypeTok(s) = text(fill: rgb("#f97583"),raw(s)) -#let DecValTok(s) = text(fill: rgb("#79b8ff"),raw(s)) -#let DocumentationTok(s) = text(fill: rgb("#6a737d"),raw(s)) -#let ErrorTok(s) = underline(text(fill: rgb("#ff5555"),raw(s))) -#let ExtensionTok(s) = text(weight: "bold",fill: rgb("#f97583"),raw(s)) -#let FloatTok(s) = text(fill: rgb("#79b8ff"),raw(s)) -#let FunctionTok(s) = text(fill: rgb("#b392f0"),raw(s)) -#let ImportTok(s) = text(fill: rgb("#9ecbff"),raw(s)) -#let InformationTok(s) = text(fill: rgb("#6a737d"),raw(s)) -#let KeywordTok(s) = text(fill: rgb("#f97583"),raw(s)) -#let NormalTok(s) = text(fill: rgb("#e1e4e8"),raw(s)) -#let OperatorTok(s) = text(fill: rgb("#e1e4e8"),raw(s)) -#let OtherTok(s) = text(fill: rgb("#b392f0"),raw(s)) -#let PreprocessorTok(s) = text(fill: rgb("#f97583"),raw(s)) -#let RegionMarkerTok(s) = text(fill: rgb("#6a737d"),raw(s)) -#let SpecialCharTok(s) = text(fill: rgb("#79b8ff"),raw(s)) -#let SpecialStringTok(s) = text(fill: rgb("#9ecbff"),raw(s)) -#let StringTok(s) = text(fill: rgb("#9ecbff"),raw(s)) -#let VariableTok(s) = text(fill: rgb("#ffab70"),raw(s)) -#let VerbatimStringTok(s) = text(fill: rgb("#9ecbff"),raw(s)) -#let WarningTok(s) = text(fill: rgb("#ff5555"),raw(s)) - - - -#let article( - title: none, - subtitle: none, - authors: none, - keywords: (), - date: none, - abstract-title: none, - abstract: none, - thanks: none, - cols: 1, - lang: "en", - region: "US", - font: none, - fontsize: 11pt, - title-size: 1.5em, - subtitle-size: 1.25em, - heading-family: none, - heading-weight: "bold", - heading-style: "normal", - heading-color: black, - heading-line-height: 0.65em, - mathfont: none, - codefont: none, - linestretch: 1, - sectionnumbering: none, - linkcolor: none, - citecolor: none, - filecolor: none, - toc: false, - toc_title: none, - toc_depth: none, - toc_indent: 1.5em, - doc, -) = { - // Set document metadata for PDF accessibility - set document(title: title, keywords: keywords) - set document( - author: authors.map(author => content-to-string(author.name)).join(", ", last: " & "), - ) if authors != none and authors != () - set par( - justify: true, - leading: linestretch * 0.65em - ) - set text(lang: lang, - region: region, - size: fontsize) - set text(font: font) if font != none - show math.equation: set text(font: mathfont) if mathfont != none - show raw: set text(font: codefont) if codefont != none - - set heading(numbering: sectionnumbering) - - show link: set text(fill: rgb(content-to-string(linkcolor))) if linkcolor != none - show ref: set text(fill: rgb(content-to-string(citecolor))) if citecolor != none - show link: this => { - if filecolor != none and type(this.dest) == label { - text(this, fill: rgb(content-to-string(filecolor))) - } else { - text(this) - } - } - - let has-title-block = title != none or (authors != none and authors != ()) or date != none or abstract != none - if has-title-block { - place( - top, - float: true, - scope: "parent", - clearance: 4mm, - block(below: 1em, width: 100%)[ - - #if title != none { - align(center, block(inset: 2em)[ - #set par(leading: heading-line-height) if heading-line-height != none - #set text(font: heading-family) if heading-family != none - #set text(weight: heading-weight) - #set text(style: heading-style) if heading-style != "normal" - #set text(fill: heading-color) if heading-color != black - - #text(size: title-size)[#title #if thanks != none { - footnote(thanks, numbering: "*") - counter(footnote).update(n => n - 1) - }] - #(if subtitle != none { - parbreak() - text(size: subtitle-size)[#subtitle] - }) - ]) - } - - #if authors != none and authors != () { - let count = authors.len() - let ncols = calc.min(count, 3) - grid( - columns: (1fr,) * ncols, - row-gutter: 1.5em, - ..authors.map(author => - align(center)[ - #author.name \ - #author.affiliation \ - #author.email - ] - ) - ) - } - - #if date != none { - align(center)[#block(inset: 1em)[ - #date - ]] - } - - #if abstract != none { - block(inset: 2em)[ - #text(weight: "semibold")[#abstract-title] #h(1em) #abstract - ] - } - ] - ) - } - - if toc { - let title = if toc_title == none { - auto - } else { - toc_title - } - block(above: 0em, below: 2em)[ - #outline( - title: toc_title, - depth: toc_depth, - indent: toc_indent - ); - ] - } - - doc -} - -#set table( - inset: 6pt, - stroke: none -) -#import "@preview/fontawesome:0.5.0": * -#let brand-color = (:) -#let brand-color-background = (:) -#let brand-logo = (:) - -#set page( - paper: "a4", - margin: (x: 2.5cm,y: 2.5cm,), - numbering: "1", - columns: 1, -) - -#show: doc => article( - title: [Code Window], - subtitle: [Quarto Extension], - authors: ( - ( name: [Mickaël CANOUIL, #emph[Ph.D.]], - affiliation: [], - email: [] ), - ), - toc_title: [Table of contents], - toc_depth: 3, - doc, -) - -// code-window: annotation state passed to Skylighting via Typst state -#let _cw-annotations = state("cw-annotations", none) - -// Derive a contrasting annotation colour from a background fill. -// Light backgrounds get dark circles; dark backgrounds get light circles. -// Uses ITU-R BT.709 luminance coefficients, matching quarto-cli PR #14170. -#let code-window-annote-colour(bg) = { - if type(bg) == color { - let comps = bg.components(alpha: false) - let lum = if comps.len() == 1 { - comps.at(0) / 100% - } else { - 0.2126 * comps.at(0) / 100% + 0.7152 * comps.at(1) / 100% + 0.0722 * comps.at(2) / 100% - } - if lum < 0.5 { luma(200) } else { luma(60) } - } else { - luma(60) - } -} - -#let code-window-circled-number(n, bg-colour: none) = { - let c = if bg-colour != none { code-window-annote-colour(bg-colour) } else { luma(120) } - box(baseline: 20%, circle( - radius: 4.5pt, - stroke: 0.5pt + c, - )[#set text(size: 5.5pt, fill: c); #align(center + horizon, str(n))]) -} - -#let code-window-annotation-item(block-id, n, content) = { - let lbl-prefix = "cw-" + str(block-id) + "-" - [#block(above: 0.4em, below: 0.4em)[ - #link(label(lbl-prefix + "line-" + str(n)))[ - #code-window-circled-number(n) - ] - #h(0.4em) - #content - ] #label(lbl-prefix + "item-" + str(n))] -} - -#let code-window-annotated-content(content, annotations: (:), bg-colour: none, block-id: 0) = { - if annotations.len() > 0 { - _cw-annotations.update((annotations: annotations, bg-colour: bg-colour, block-id: block-id)) - content - _cw-annotations.update(none) - } else { - content - } -} -#let code-window( - content, - filename: none, - is-auto: false, - style: "macos", - annotations: (:), - bg-colour: none, - block-id: 0, -) = { - let border-colour = luma(200) - let surface-fill = luma(237) - let muted-colour = luma(120) - - let filename-label = if filename != none { - text( - size: if is-auto { 0.7em } else { 0.85em }, - weight: 500, - fill: muted-colour, - if is-auto { upper(filename) } else { filename }, - ) - } - - let traffic-lights = box( - inset: (right: 0.5em), - stack( - dir: ltr, - spacing: 0.425em, - circle(radius: 0.425em, fill: rgb("#ff5f56"), stroke: none), - circle(radius: 0.425em, fill: rgb("#ffbd2e"), stroke: none), - circle(radius: 0.425em, fill: rgb("#27c93f"), stroke: none), - ), - ) - - let window-buttons = box( - inset: (left: 0.5em), - { - set line(stroke: 1pt + muted-colour) - stack( - dir: ltr, - spacing: 0.8em, - // Minimise (horizontal line) - box(width: 0.6em, height: 0.6em, align(horizon, line(length: 100%))), - // Maximise (square) - box(width: 0.6em, height: 0.6em, stroke: 1pt + muted-colour), - // Close (x) - box(width: 0.6em, height: 0.6em, { - place(line(start: (0%, 0%), end: (100%, 100%))) - place(line(start: (100%, 0%), end: (0%, 100%))) - }), - ) - }, - ) - - let title-bar = if style == "macos" { - grid( - columns: (auto, 1fr), - align: (left + horizon, right + horizon), - gutter: 0.5em, - stroke: 0pt, - traffic-lights, - filename-label, - ) - } else if style == "windows" { - grid( - columns: (1fr, auto), - align: (left + horizon, right + horizon), - gutter: 0.5em, - stroke: 0pt, - filename-label, - window-buttons, - ) - } else { - // default: plain filename, left-aligned - filename-label - } - - block( - width: 100%, - stroke: 1pt + border-colour, - radius: 8pt, - clip: true, - { - block( - width: 100%, - fill: surface-fill, - inset: (x: 1em, y: 0.6em), - below: 0pt, - radius: 0pt, - stroke: (bottom: 1pt + border-colour), - sticky: true, - title-bar, - ) - // Strip code block chrome so content fills flush against the window body. - // set block() provides defaults for Skylighting blocks (explicit fill preserved). - // show raw overrides the document-level raw block styling (fill, radius). - { - set block( - width: 100%, - inset: 8pt, - radius: 0pt, - stroke: none, - above: 0pt, - below: 0pt, - ) - show raw.where(block: true): set block( - fill: none, - width: 100%, - radius: 0pt, - stroke: none, - above: 0pt, - below: 0pt, - ) - code-window-annotated-content( - content, - annotations: annotations, - bg-colour: bg-colour, - block-id: block-id, - ) - } - }, - ) -} -// skylighting-typst-fix override -#let Skylighting( - fill: none, - number: false, - start: 1, - sourcelines, -) = { - let bgcolor = if fill != none { fill } else { rgb("#24292e") } - let has-gutter = start + sourcelines.len() > 999 - - context { - let annot-data = _cw-annotations.get() - let blocks = [] - let lnum = start - 1 - let seen-annotes = (:) - - for ln in sourcelines { - lnum = lnum + 1 - if number { - blocks = blocks + box( - width: if has-gutter { 30pt } else { 24pt }, - text([ #lnum ]), - ) - } - - if annot-data != none { - let annot-num = annot-data.annotations.at(str(lnum), default: none) - if annot-num != none { - let lbl-prefix = "cw-" + str(annot-data.block-id) + "-" - if str(annot-num) not in seen-annotes { - seen-annotes.insert(str(annot-num), true) - blocks = blocks + box(width: 100%)[ - #ln - #h(1fr) - #link(label(lbl-prefix + "item-" + str(annot-num)))[ - #code-window-circled-number(annot-num, bg-colour: annot-data.bg-colour) - ] - #label(lbl-prefix + "line-" + str(annot-num)) - ] - } else { - blocks = blocks + box(width: 100%)[ - #ln - #h(1fr) - #link(label(lbl-prefix + "item-" + str(annot-num)))[ - #code-window-circled-number(annot-num, bg-colour: annot-data.bg-colour) - ] - ] - } - } else { - blocks = blocks + ln - } - } else { - blocks = blocks + ln - } - blocks = blocks + EndLine() - } - - block( - fill: bgcolor, - width: 100%, - inset: 8pt, - radius: 2pt, - stroke: 0.5pt + luma(200), - blocks, - ) - } -} -= Explicit Filename - -Code blocks with a #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("filename");] attribute display a window header with the filename. The decoration style depends on the #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("style");] option (default: #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("\"macos\"");]). - -#code-window(filename: "fibonacci.py", is-auto: false, style: "macos", bg-colour: rgb("#24292e"))[ -#Skylighting(([#KeywordTok("def");#NormalTok(" fibonacci(n: ");#BuiltInTok("int");#NormalTok(") ");#OperatorTok("->");#NormalTok(" ");#BuiltInTok("int");#NormalTok(":");], -[#NormalTok(" ");#CommentTok("\"\"\"Calculate the nth Fibonacci number.\"\"\"");], -[#NormalTok(" ");#ControlFlowTok("if");#NormalTok(" n ");#OperatorTok("<=");#NormalTok(" ");#DecValTok("1");#NormalTok(":");], -[#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" n");], -[#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" fibonacci(n ");#OperatorTok("-");#NormalTok(" ");#DecValTok("1");#NormalTok(") ");#OperatorTok("+");#NormalTok(" fibonacci(n ");#OperatorTok("-");#NormalTok(" ");#DecValTok("2");#NormalTok(")");],)); -] -#code-window(filename: "analysis.R", is-auto: false, style: "macos", bg-colour: rgb("#24292e"))[ -#Skylighting(([#CommentTok("# Load data and create summary");], -[#NormalTok("data ");#OtherTok("<-");#NormalTok(" ");#FunctionTok("read.csv");#NormalTok("(");#StringTok("\"data.csv\"");#NormalTok(")");], -[#FunctionTok("summary");#NormalTok("(data)");],)); -] -= Auto-Generated Filename - -With #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("auto-filename: true");] (the default), code blocks without explicit filenames automatically show the language name in small-caps styling. - -#code-window(filename: "python", is-auto: true, style: "macos", bg-colour: rgb("#24292e"))[ -#Skylighting(([#KeywordTok("def");#NormalTok(" greet(name: ");#BuiltInTok("str");#NormalTok(") ");#OperatorTok("->");#NormalTok(" ");#BuiltInTok("str");#NormalTok(":");], -[#NormalTok(" ");#CommentTok("\"\"\"Return a greeting message.\"\"\"");], -[#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" ");#SpecialStringTok("f\"Hello, ");#SpecialCharTok("{");#NormalTok("name");#SpecialCharTok("}");#SpecialStringTok("!\"");],)); -] -#code-window(filename: "r", is-auto: true, style: "macos", bg-colour: rgb("#24292e"))[ -#Skylighting(([#CommentTok("# Create sample data");], -[#NormalTok("data ");#OtherTok("<-");#NormalTok(" ");#FunctionTok("data.frame");#NormalTok("(");], -[#NormalTok(" ");#AttributeTok("x =");#NormalTok(" ");#DecValTok("1");#SpecialCharTok(":");#DecValTok("10");#NormalTok(",");], -[#NormalTok(" ");#AttributeTok("y =");#NormalTok(" ");#FunctionTok("rnorm");#NormalTok("(");#DecValTok("10");#NormalTok(")");], -[#NormalTok(")");], -[#FunctionTok("summary");#NormalTok("(data)");],)); -] -#code-window(filename: "bash", is-auto: true, style: "macos", bg-colour: rgb("#24292e"))[ -#Skylighting(([#CommentTok("#!/bin/bash");], -[#BuiltInTok("echo");#NormalTok(" ");#StringTok("\"Hello, World!\"");],)); -] -= Plain Code Block - -Code blocks without a language are not affected by the extension. - -#Skylighting(([#NormalTok("This is a plain code block without any language specified.");], -[#NormalTok("No window decoration is applied here.");],)); -= Disabled Auto-Filename - -To disable auto-generated filenames, set #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("auto-filename: false");] in the extension configuration. Only code blocks with an explicit #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("filename");] attribute will display window decorations. - -= Window Styles - -Three decoration styles are available via the #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("style");] option. The global style can be set in the document configuration. Individual blocks can override the style with the #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("code-window-style");] attribute. - -== macOS Style (default) - -Traffic light buttons on the left, filename on the right. - -#code-window(filename: "macos-example.py", is-auto: false, style: "macos", bg-colour: rgb("#24292e"))[ -#Skylighting(([#BuiltInTok("print");#NormalTok("(");#StringTok("\"macOS style window\"");#NormalTok(")");],)); -] -== Windows Style - -Minimise, maximise, and close buttons on the right, filename on the left. - -#code-window(filename: "windows-example.py", is-auto: false, style: "windows", bg-colour: rgb("#24292e"))[ -#Skylighting(([#BuiltInTok("print");#NormalTok("(");#StringTok("\"Windows style window\"");#NormalTok(")");],)); -] -== Default Style - -Plain filename on the left, no window decorations. - -#code-window(filename: "default-example.py", is-auto: false, style: "default", bg-colour: rgb("#24292e"))[ -#Skylighting(([#BuiltInTok("print");#NormalTok("(");#StringTok("\"Default style window\"");#NormalTok(")");],)); -] -= Code Annotations - -#block[ -#callout( -body: -[ -Typst code-annotations support and #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("filename");] attribute handling are temporary hot-fixes. They will be removed once Quarto natively supports these features (see #link("https://github.com/quarto-dev/quarto-cli/pull/14170")[quarto-dev/quarto-cli\#14170]). The extension will then focus on #strong[auto-filename] and #strong[code-window-style] features. - -] -, -title: -[ -Note -] -, -background_color: -rgb("#dae6fb") -, -icon_color: -rgb("#0758E5") -, -icon: -fa-info() -, -body_background_color: -white -) -] -Code annotations work standalone and together with code-window styling. - -== Annotations with Explicit Filename - -#code-window(filename: "annotated.py", is-auto: false, style: "macos", annotations: ("1": 1, "3": 2, "4": 3), block-id: 1, bg-colour: rgb("#24292e"))[ -#Skylighting(([#ImportTok("import");#NormalTok(" pandas ");#ImportTok("as");#NormalTok(" pd");], -[], -[#NormalTok("df ");#OperatorTok("=");#NormalTok(" pd.read_csv(");#StringTok("\"data.csv\"");#NormalTok(")");], -[#NormalTok("summary ");#OperatorTok("=");#NormalTok(" df.describe()");],)); -] -#code-window-annotation-item(1, 1)[Import the pandas library.] -#code-window-annotation-item(1, 2)[Load data from a CSV file.] -#code-window-annotation-item(1, 3)[Generate summary statistics.] -== Annotations with Auto-Filename - -#code-window(filename: "python", is-auto: true, style: "macos", annotations: ("1": 1, "2": 2, "4": 3), block-id: 2, bg-colour: rgb("#24292e"))[ -#Skylighting(([#KeywordTok("def");#NormalTok(" greet(name: ");#BuiltInTok("str");#NormalTok(") ");#OperatorTok("->");#NormalTok(" ");#BuiltInTok("str");#NormalTok(":");], -[#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" ");#SpecialStringTok("f\"Hello, ");#SpecialCharTok("{");#NormalTok("name");#SpecialCharTok("}");#SpecialStringTok("!\"");], -[], -[#NormalTok("result ");#OperatorTok("=");#NormalTok(" greet(");#StringTok("\"World\"");#NormalTok(")");],)); -] -#code-window-annotation-item(2, 1)[Define a function with type hints.] -#code-window-annotation-item(2, 2)[Use an f-string for interpolation.] -#code-window-annotation-item(2, 3)[Call the function and store the result.] -== Annotations Spanning Multiple Lines - -A single annotation number can appear on several consecutive lines. Only the first occurrence receives a back-label to avoid duplicates. - -#code-window(filename: "pipeline.py", is-auto: false, style: "macos", annotations: ("1": 1, "2": 1, "3": 1, "4": 2, "5": 3), block-id: 3, bg-colour: rgb("#24292e"))[ -#Skylighting(([#KeywordTok("def");#NormalTok(" process(data):");], -[#NormalTok(" cleaned ");#OperatorTok("=");#NormalTok(" clean(data)");], -[#NormalTok(" validated ");#OperatorTok("=");#NormalTok(" validate(cleaned)");], -[#NormalTok(" result ");#OperatorTok("=");#NormalTok(" transform(validated)");], -[#NormalTok(" ");#ControlFlowTok("return");#NormalTok(" result");],)); -] -#code-window-annotation-item(3, 1)[Multi-step input preparation (cleaning and validation).] -#code-window-annotation-item(3, 2)[Apply the main transformation.] -#code-window-annotation-item(3, 3)[Return the final result.] -== Annotations without Window Chrome - -Set #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("code-window-enabled=\"false\"");] on a block to disable window chrome while keeping annotations. - -#code-window-annotated-content(annotations: ("1": 1, "2": 2, "3": 3, "4": 4), block-id: 4, bg-colour: rgb("#24292e"))[ -#Skylighting(([#FunctionTok("library");#NormalTok("(ggplot2)");], -[#FunctionTok("ggplot");#NormalTok("(mtcars) ");#SpecialCharTok("+");], -[#NormalTok(" ");#FunctionTok("aes");#NormalTok("(");#AttributeTok("x =");#NormalTok(" mpg, ");#AttributeTok("y =");#NormalTok(" hp) ");#SpecialCharTok("+");], -[#NormalTok(" ");#FunctionTok("geom_point");#NormalTok("()");],)); -] -#code-window-annotation-item(4, 1)[Load the ggplot2 package.] -#code-window-annotation-item(4, 2)[Initialise a plot with the mtcars dataset.] -#code-window-annotation-item(4, 3)[Map aesthetics.] -#code-window-annotation-item(4, 4)[Add a point geometry layer.] -== Configuration - -Set the global style in the document front matter: - -#code-window(filename: "yaml", is-auto: true, style: "macos", bg-colour: rgb("#24292e"))[ -#Skylighting(([#FunctionTok("extensions");#KeywordTok(":");], -[#AttributeTok(" ");#FunctionTok("code-window");#KeywordTok(":");], -[#AttributeTok(" ");#FunctionTok("style");#KeywordTok(":");#AttributeTok(" ");#StringTok("\"macos\"");], -[#AttributeTok(" ");#FunctionTok("hotfix");#KeywordTok(":");], -[#AttributeTok(" ");#FunctionTok("quarto-version");#KeywordTok(":");#AttributeTok(" ");#CharTok("~");], -[#AttributeTok(" ");#FunctionTok("code-annotations");#KeywordTok(":");#AttributeTok(" ");#CharTok("true");], -[#AttributeTok(" ");#FunctionTok("skylighting");#KeywordTok(":");#AttributeTok(" ");#CharTok("true");],)); -] -Override per block with the #box(fill: rgb("#24292e"), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, stroke: none)[#NormalTok("code-window-style");] attribute: - -#code-window(filename: "markdown", is-auto: true, style: "macos", bg-colour: rgb("#24292e"))[ -#Skylighting(([#InformationTok("```{.python filename=\"example.py\" code-window-style=\"windows\"}");], -[#BuiltInTok("print");#NormalTok("(");#StringTok("\"Windows style for this block only\"");#NormalTok(")");], -[#InformationTok("```");],)); -] - - - From d5ab8c39254eac2d93247a46f2f2048c5cd6d2ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Canouil?= <8896044+mcanouil@users.noreply.github.com> Date: Mon, 23 Mar 2026 22:20:33 +0100 Subject: [PATCH 6/6] refactor: example.qmd for improved structure Add example.typ and example-typst.pdf to .gitignore. Enhance example.qmd with additional sections and page breaks for better readability and organisation. --- .gitignore | 3 ++- example.qmd | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 809b28f..a823054 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,6 @@ docs/_sidebar-api.yml docs/api/*.qmd *.html .quarto/ - /.luarc.json +/example.typ +/example-typst.pdf diff --git a/example.qmd b/example.qmd index 401a056..f4c3d3e 100644 --- a/example.qmd +++ b/example.qmd @@ -10,6 +10,7 @@ filters: path: code-window syntax-highlighting: github-dark code-annotations: below +toc: true format: html: output-file: index @@ -30,6 +31,8 @@ format-links: - revealjs --- +{{< pagebreak >}} + ## Explicit Filename Code blocks with a `filename` attribute display a window header with the filename. @@ -49,6 +52,8 @@ data <- read.csv("data.csv") summary(data) ``` +{{< pagebreak >}} + ## Auto-Generated Filename With `auto-filename: true` (the default), code blocks without explicit filenames automatically show the language name in small-caps styling. @@ -73,6 +78,8 @@ summary(data) echo "Hello, World!" ``` +{{< pagebreak >}} + ## Plain Code Block Code blocks without a language are not affected by the extension. @@ -82,11 +89,21 @@ This is a plain code block without any language specified. No window decoration is applied here. ``` +{{< pagebreak >}} + ## Disabled Auto-Filename To disable auto-generated filenames, set `auto-filename: false` in the extension configuration. Only code blocks with an explicit `filename` attribute will display window decorations. +```yaml +extensions: + code-window: + auto-filename: false +``` + +{{< pagebreak >}} + ## Window Styles Three decoration styles are available via the `style` option. @@ -117,6 +134,8 @@ Plain filename on the left, no window decorations. print("Default style window") ``` +{{< pagebreak >}} + ## Code Annotations ::: {.callout-note}