From d63aa0aa4eaab9463a621fe369ab1c3c8b27f2a1 Mon Sep 17 00:00:00 2001 From: Dita Aji Pratama Date: Sun, 11 Oct 2026 16:01:32 +0700 Subject: [PATCH] AI slop cleanup --- config.default.yaml | 37 +++++++++++++--------------- config.py | 4 +-- hendrik | 2 +- hendrik.py | 22 ++++++++--------- interfaces/tui/actions.py | 14 +++++------ interfaces/tui/app.py | 2 +- interfaces/tui/keycodes.py | 24 ------------------ interfaces/tui/talk.py | 13 +++++----- plan/asr-push-to-talk.md | 1 - plan/milestone/coding-standard.png | Bin 22178 -> 19863 bytes plan/milestone/coding-standard.puml | 6 ++--- 11 files changed, 47 insertions(+), 78 deletions(-) diff --git a/config.default.yaml b/config.default.yaml index 702ee42..2a4d9c0 100644 --- a/config.default.yaml +++ b/config.default.yaml @@ -2,9 +2,9 @@ agent: character : hendrik # Directory name in agent/characters// - max_iterations : 40 # step(s) + max_iterations : 80 # step(s) max_history_chat : 0 # message(s) - 0 for unlimited (Dead Config) - max_tool_output : 0 # character(s) - 0 for unlimited (Connected to AGENT_MAX_TOOL_OUTPUT but Dead Config) + max_tool_output : 0 # character(s) - 0 for unlimited user: id: # Fill your user UUID here, empty = TUI/MUC guest @@ -15,26 +15,23 @@ llm: moop: # Model Option db_path: "~/.config/hendrik/moop.sqlite3" -asr: # Speech-to-Text (push-to-talk TUI). Model dikelola via moop tipe 'asr'. - record_dir : "~/.config/hendrik/recordings" # lokasi file hasil rekaman - record_key : f9 # tombol push-to-talk (f1..f12 / ctrl-) - record_backend : pulse # ffmpeg input: pulse | alsa | oss | windows - device : default # nama device input - windows_mic : "" # backend=windows: nama device dshow, - # contoh "Microphone Array (Realtek(R) Audio)" - format : wav # wav | ogg (opus) - sample_rate : 16000 # Hz - channels : 1 - max_seconds : 60 # auto-stop pengaman - transcribe_timeout: 60 # detik timeout request ASR - keep_recordings : true # false = hapus file setelah ditranskrip - auto_submit : false # true = hasil transkrip langsung dikirim - # false = hanya mengisi form (Ctrl+Enter) +asr: + record_dir : "~/.config/hendrik/recordings" + record_backend : pulse # ffmpeg input: pulse | alsa | oss | windows + device : default + windows_mic : "" # if backend==windows: device dshow name, example: "Microphone Array (Realtek(R) Audio)" + format : wav # wav | ogg (opus) + sample_rate : 16000 # Hz + channels : 1 + max_seconds : 120 # second + transcribe_timeout : 60 # second + keep_recordings : false + auto_submit : true -session: # Chat session +session: db_path: "~/.config/hendrik/sessions.json" -ragroleplay: # Use nomic-embed-text +ragroleplay: db_path : "~/.config/hendrik/ragroleplay" vector_size : 768 # used on table create only @@ -53,7 +50,7 @@ xmpp: # - "room2@conference.server" nickname: "" # custom MUC nickname (empty = use username) selective_response: true # true = only response if mentioned/relevant - debug: false # true = tampilkan log debug menyeluruh (semua stanza XML, lifecycle, dll) + debug: false # true = display debug log (stanza XML, lifecycle, etc) mute_session_end: false # true = tidak kirim pesan saat sesi berakhir (timeout) telegram: diff --git a/config.py b/config.py index d281d49..e23c22d 100644 --- a/config.py +++ b/config.py @@ -58,8 +58,8 @@ ASR_MAX_SECONDS = int(_yaml_get("asr", "max_seconds", default=60)) ASR_TIMEOUT = int(_yaml_get("asr", "transcribe_timeout", default=60)) ASR_KEEP_RECORDINGS = _as_bool(_yaml_get("asr", "keep_recordings", default=True), default=True) -# Tombol push-to-talk: "f1".."f12" atau "ctrl-". Default F9. -ASR_RECORD_KEY = str(_yaml_get("asr", "record_key", default="f9")).strip().lower() +# Tombol push-to-talk dipatok tetap ke F9 (tidak bisa dikonfigurasi). +# Lihat interfaces/tui/actions.py -> ACTIONS["push_to_talk"]. # true = hasil transkripsi langsung dikirim sebagai pesan, # false = hasil hanya disisipkan ke form input (user kirim sendiri via Ctrl+Enter). diff --git a/hendrik b/hendrik index 32c3118..6ab73b1 100755 --- a/hendrik +++ b/hendrik @@ -1,5 +1,5 @@ #!/bin/bash -# wrapper to run the TUI agent from anywhere +# wrapper to run the hendrik agent from anywhere # Set HENDRIK_DIR env var to override, or update the default below DEFAULT_DIR="/opt/hendrik" diff --git a/hendrik.py b/hendrik.py index 5578b19..77f8b5a 100644 --- a/hendrik.py +++ b/hendrik.py @@ -14,20 +14,20 @@ from interfaces.tui import HendrikTUI tools_definition = [ # Coder Tools - gadget.tools_mapping( schema = coder.schema_read_file, handler = coder.read_file ), - gadget.tools_mapping( schema = coder.schema_write_file, handler = coder.write_file ), - gadget.tools_mapping( schema = coder.schema_edit_file, handler = coder.edit_file ), - gadget.tools_mapping( schema = coder.schema_run_bash, handler = coder.run_bash ), - gadget.tools_mapping( schema = coder.schema_search_code, handler = coder.search_code ), - gadget.tools_mapping( schema = coder.schema_git_operation, handler = coder.git_operation ), - gadget.tools_mapping( schema = coder.schema_search_grep, handler = coder.search_grep ), - gadget.tools_mapping( schema = coder.schema_search_glob, handler = coder.search_glob ), + gadget.tools_mapping( schema = coder.schema_read_file, handler = coder.read_file ), + gadget.tools_mapping( schema = coder.schema_write_file, handler = coder.write_file ), + gadget.tools_mapping( schema = coder.schema_edit_file, handler = coder.edit_file ), + gadget.tools_mapping( schema = coder.schema_run_bash, handler = coder.run_bash ), + gadget.tools_mapping( schema = coder.schema_search_code, handler = coder.search_code ), + gadget.tools_mapping( schema = coder.schema_git_operation, handler = coder.git_operation ), + gadget.tools_mapping( schema = coder.schema_search_grep, handler = coder.search_grep ), + gadget.tools_mapping( schema = coder.schema_search_glob, handler = coder.search_glob ), # Carrack Tools - gadget.tools_mapping( schema = carrack.schema_sendhttprequest, handler = carrack.sendhttprequest ), + gadget.tools_mapping( schema = carrack.schema_sendhttprequest, handler = carrack.sendhttprequest ), # Vision Tools - gadget.tools_mapping( schema = vision.schema_describe_image, handler = vision.describe_image ), + gadget.tools_mapping( schema = vision.schema_describe_image, handler = vision.describe_image ), # Image Generation Tools - gadget.tools_mapping( schema = imagegen.schema_generate_image, handler = imagegen.generate_image ), + gadget.tools_mapping( schema = imagegen.schema_generate_image, handler = imagegen.generate_image ), # Instruction Tools gadget.tools_mapping( schema = smart.schema_instruction_use, handler = smart.instruction_use ), # snippet (global) gadget.tools_mapping( schema = smart.schema_instruction_char_use, handler = smart.instruction_char_use ), # snippet (private per character) diff --git a/interfaces/tui/actions.py b/interfaces/tui/actions.py index ff4c73e..a77922a 100644 --- a/interfaces/tui/actions.py +++ b/interfaces/tui/actions.py @@ -16,6 +16,7 @@ from .keycodes import ( KEY_F2, KEY_F4, KEY_F6, + KEY_F9, ) from .input import ( new_session_popup, @@ -29,11 +30,8 @@ from .moopui import ( providers_manage_popup, ) from .agent import submit, log -from .keycodes import resolve_key from . import talk as talk_mod -import config as _config - # ---------------------------------------------------------------- handlers --- def _exit_app(app, stdscr): @@ -55,8 +53,8 @@ def _record_talk(app, stdscr): def _talk_configured(app): - # Tombol rekam valid (di-resolve dari config). Ketersediaan chain 'asr' - # divalidasi di handler supaya bisa memberi pesan panduan, bukan diam. + # Tombol rekam dipatok tetap (F9) sehingga selalu valid. Ketersediaan + # chain 'asr' divalidasi di handler supaya bisa memberi pesan panduan. return getattr(app, "talk_key", None) is not None @@ -118,12 +116,12 @@ ACTIONS = { "label": "Change Workspace", "mnemonic": "C", "shortcut": "F6", "handler": workspace_popup, "enabled": _ready, }, - # Push-to-Talk (ASR): tombol berasal dari config.asr.record_key (default F9). + # Push-to-Talk (ASR): tombol dipatok tetap F9 (tidak dikonfigurasi). # Handler talk_toggle memvalidasi chain moop 'asr' + ketersediaan mic. "push_to_talk": { - "key": resolve_key(getattr(_config, "ASR_RECORD_KEY", "f9")), + "key": KEY_F9, "label": "Push-to-Talk", "mnemonic": "T", - "shortcut": (getattr(_config, "ASR_RECORD_KEY", "f9") or "").upper(), + "shortcut": "F9", "handler": _record_talk, "enabled": lambda app: _ready(app) and _talk_configured(app), }, diff --git a/interfaces/tui/app.py b/interfaces/tui/app.py index f29f702..38c7bc7 100644 --- a/interfaces/tui/app.py +++ b/interfaces/tui/app.py @@ -60,7 +60,7 @@ class HendrikTUI: self.talk_done = threading.Event() self._talk_thread: threading.Thread | None = None self._talk_result: dict | None = None - # Kode tombol rekam dari config (None = tombol tidak valid/fitur mati) + # Kode tombol rekam: dipatok tetap F9 (lihat ACTIONS["push_to_talk"]) from .actions import ACTIONS as _ACTIONS self.talk_key = _ACTIONS["push_to_talk"]["key"] self.talk_label = _ACTIONS["push_to_talk"]["shortcut"] diff --git a/interfaces/tui/keycodes.py b/interfaces/tui/keycodes.py index de4c4c3..61ec6e3 100644 --- a/interfaces/tui/keycodes.py +++ b/interfaces/tui/keycodes.py @@ -263,30 +263,6 @@ def read_key(stdscr, timeout_ms: int = -1) -> int: return KEY_ESC -def resolve_key(name) -> int | None: - """Petakan nama tombol dari config menjadi kode kunci. - - Format: "f1".."f12", "ctrl-", atau "esc"/"enter". - Mengembalikan None jika tidak dikenal.""" - n = str(name or "").strip().lower().replace("+", "-").replace(" ", "") - if not n: - return None - _F_KEYS = {f"f{i}": k for i, k in enumerate( - [KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, - KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12], start=1)} - if n in _F_KEYS: - return _F_KEYS[n] - if n == "esc": - return KEY_ESC - if n == "enter": - return 13 - if n.startswith("ctrl-") and len(n) == 6: - ch = n[-1] - if "a" <= ch <= "z": - return ord(ch) & 0x1F - return None - - def is_alt_key(key: int) -> bool: return _KEY_ALT_BASE <= key <= _KEY_ALT_BASE + 126 diff --git a/interfaces/tui/talk.py b/interfaces/tui/talk.py index a4875da..5408d67 100644 --- a/interfaces/tui/talk.py +++ b/interfaces/tui/talk.py @@ -1,7 +1,7 @@ # talk.py — Push-to-Talk (ASR/STT) untuk TUI. # # Alur: -# * F9 (configurable) → mulai rekam (ffmpeg subprocess, non-blocking). +# * F9 (dipatok, tidak configurable) → mulai rekam (ffmpeg subprocess, non-blocking). # * F9 lagi / Enter → stop rekam → transkrip (thread) → hasil # disisipkan ke form input pada posisi kursor, # TIDAK submit (default). @@ -25,12 +25,13 @@ from tools import asr as asr_mod from .agent import log, submit +# Tombol push-to-talk dipatok tetap ke F9 (lihat actions.py & keycodes.py). +TALK_SHORTCUT_LABEL = "F9" + + def _shortcut_label(): - """Label tombol rekam untuk pesan UI (dari config.asr.record_key).""" - n = (config.ASR_RECORD_KEY or "f9").strip().lower() - if n.startswith("ctrl-") and len(n) == 6: - return f"Ctrl+{n[5].upper()}" - return n.upper() + """Label tombol rekam untuk pesan UI (selalu 'F9').""" + return TALK_SHORTCUT_LABEL # ------------------------------------------------------------------ helpers --- diff --git a/plan/asr-push-to-talk.md b/plan/asr-push-to-talk.md index 47116fe..6bd8860 100644 --- a/plan/asr-push-to-talk.md +++ b/plan/asr-push-to-talk.md @@ -13,7 +13,6 @@ tekan tombol → bicara → stop → teks hasil transkripsi masuk ke form input ## Konfigurasi (config.yaml, blok `asr:`) asr: record_dir : "~/.config/hendrik/recordings" # lokasi file rekaman - record_key : f9 # f1..f12 / ctrl- record_backend : pulse # pulse | alsa | oss | windows (dshow) device : default windows_mic : "" # backend=windows: nama device dshow diff --git a/plan/milestone/coding-standard.png b/plan/milestone/coding-standard.png index 6e8ef04356478a3227f5a20c9440c666dde283c9..0468f58517a84c7dcd4c5b71cfa5e5bf93d9a13e 100644 GIT binary patch literal 19863 zcmbTdWmH_j)-Bq&6Er}u1{!yF*M{Kk?i$=_+^unU3+@&q2_#5x3GVK}oyR%fy<@!l z>%DR7Pwzczt=iqyReRK$Yp!S&C0PvAPpAL@00S&1r3L`NfB*ovOk}usM4=(@;T-^~ zeAbYDzePkvL_tA8#YX)=_yHRm8;ckV7l=#v-e?JlnTSc*NNH$js2HgzcqnK@X=uf0 zSy));dFWY1Ss7#)nB|$--kT^JhZqO1GB3L-JC81psHiBPGM})PFrNXRkcE(_ji{`w zteCc#q=lrUv!twttb&4qoR{3^z|Tq{N@{9qs-CK<;i{T(n%YU)Mn*=)_QpD1I{JzF zx+%KG`No!(mR1f{rm?0b1tylome$qQj*gDbuFiHvc6Rl4PHj%k9nLQAt<}Y~!_{lR z%iG)A=a-NFAOFC~z_75e(7&N!OJQ+waZ&40(Oc1pr->;kDM@EZd3kxIrKR=t_3iEL z-QC@TgM-7v!&6gJtE;OU8yhDlC;$HadwY9J29P$s&k=*Ww2r&Evx|>|rIkBC*3!w+ z)zsb60%+y~v~hQLaT8!=b#X9ta`$j_U@>=g^c)`{f1hC^TMZre|BVA+-pBFI&4Yed z`pJeRHF3|#^yQc$oD2&`Rg=2~2WRUCLC5fX24LP($CCqEq~uULY~@;2)d7*&=tT@+o2n3QKzZHPt>%JGIn;~CmrB@kGrpRHY(?tz#rkbrERa;X?UG_(Cth>b=N8ivQk=Mp zEA=)XpVc^>1Se;AwSFV+^c1bRTj<%clWGX#kOtMy{$leml(p=IM#SF~n~5objSbV- zcZX$^X`CttTK{lrF!CsNEQBJ@&<<92Ce>wHOjndtpWhs=NYDzKWsdd?khr+t7m@bNqp#bsKvj(G@md3rcLTHp^zKA4C z#~4+2qT`YZF$aepeI#Tv>^J1UuC+AxWJ{kVhYdrFCxH2sWRBtWtddwG0%q)WqLS)m zPXGOWCjkELhf&7nJiWDqeR5VNcuCcs%mrCJa{Gjs{YFqvH+MTT6g}c(AdS)$#r&?g5@?m6W*4_N+2cQ1;d0v&)s&7TXJ0gP#T}BQqg0eh|5l4rO zeW4qkLvKad}+{dwznbGRBN!taS zrzgpyz5{XjP7;xxzvrs5z9vZ}jw|F{M%rOhI!wz}FE$zNi9flM>YtFFFHl7;Qjz&u zhlmH(GmunC;9T|f>=y@Qzg2@?@7Gv5f8&x+m&hXD2K^+vBi|ALhbD+&N^T}yFGo&~ zwtQ?E!*p(=LUE^PEZL+IJZY~T8TyN}Q>hvW#AM)FnN7!&tv{zKemzWh^O*&yJSG%( z!kBKUVuoGuhp#ylMEP?I6g0)Rd8v~^HR!-8q-xf;3mHP3uKGbMWLej3=s^TsdTXz!@rIN^rM++a&yp(X_OgtYWmfd9l!gl1Sw*xcpLr3|u1&>RPE| zflX`{yKfkZ3FGP=bD;`yroZ`?jFCOGCt zpj9gdowW;eZxp9byO_FA@D$N5*cFj>IBj;5P_LXmQ&3UoOUK73m~7BUmVYTTAA)Pe zSS_OpD~!_g)DD%!+cZgk{PRSvW#>L6rVVthRFAUOkh6K=Trxh4C8P)b8q1`J`bLN9 z)4$fOp2mF?54bZ;2)H=jOfo~}_r}OD)xAvM>`KT3D`b?WAB2!w99e4|mzb!noo@Qi zec7$PXzi2SZ}0}nnV<&s7n%*S<$iZuzY6@@c0?9%^*K0?ov)5UAZi-}LgVm5zu)TI zPRT1B5+uq5A%zWFK?;kwhEUV%RNOq7!Z3kh#QIF}VHBVha%xr%l@^3>h)m!*N^n+V zQEN2}83Za-z4HkULj@WVKIH_L;;wW2_a~eR)RQg3-WEj#I*(f72FC&ppX!9kC=JP6 z`vD!WId6+WN~#yvwtw-=1T5OYbH-7-O(Up?V*(N7pwsD~^W`tbPK!Cqc10&kU>8D(*q`MwHLp`3mGm6v_#{{B`Qq^-ZWz+r~KY~YvrBNZE&Ot;rtS*2I{0bdR!a&=g3;?AI z(3>QEk@3YZE{!Q%BydAA^%1tr0kfqd?uFveF>%T+p+I4122h4n2n#MYABH!CH1^p4 z>tjr`RT$D=E+N<7gX+9;wHX8@ls*0?mT9>%ube#>^+1)Lpx!|#|BshojFskjgmMec z&_wHZeA6SWMsEfVxZd-FDJoHFz6yqoB~XM$%f{8f^e?Dg7tkB1KR9!Nv=kI3?7*N6 zC0FWCmSQ~mMW<~3tV)P^vVL}RfgHuAbixMSpM^K@D8a7{zgPX1>)?jHZs2F(A%ya` zZtY3*0JFzS!@EvQE@ndhwt$tPv*}v?`uq6m(#~;BYmoEJ4ep)oW@iX+m^^3wOy~jl zF(Ri14J#bManNjGcp;>$%&9czt*~8BSt!SG25r0wxr1kzoD}Q9$Y4we0y??+rU@M8 zn%s=e5Epb;W<}wH7ALe9ZN@@Z4JJn^Nm7^b{Wqll>|x>Zf6`iD>$@X<61^J5j2FVy zqTI~&g;YB&W54nWl$~#O4!&CNZ#yyv^feeqSq1D=p1FxgFT-m4S1wZ+R$fxd3uyyD z(ugZX$;VKzZ&;8*y=q_y{X=E)w&eQgNu)gT_f824dX9~?Q~64V!*VQ{LutH#u3J4l zSPb0$rBW4({udxStZbqy7dQq8ICTT02Uzqg^5a;$fPS!UD~Nx{-H=0NwRWJ9Ra#nI zaBg*q^o>UDmoxj(4Ba1&2kMS0nE;vP{`0_vPnnI90fS|ATfEbyl&7&6dAa?A6w zf$roUH?kVu%g@&m6TAI#OZ(t#@Xcc-yXbe_%}QD;mrV{f=-QVaJsWv{U%dgrc>p(DyaneVizJKQuI)>5p6jrGLxhzY?mcno*} zC~VLbcvK1Ef;qU!`kvYhNt};^YD`R}$}muK}OvSplyx7#N(@! z0A^w=DMBZKAY-x)9J1riotirSB!Cg;vG(F_38pbKUo>Ov;gVw*eJlDri>L+S+`Wu*+L zg(X~(b;>1~2Q_$KiYo@S6g0)NGdAq(J~y3^6i2%9;9k7&^ROC50!KZV=aWS;`!@S* z^Y;1Q=3x1@rO)XP1n#s6MTjS@vpCLO)ens`@P9zjTxHlj#k_b7 zuI*m@-Mctro)=7k+W9|6uc=M>rti`7i`i`4s|&qsWK~|ADe z@C{F^@38guwhAacT9!1{Ci_Jtc7I?hoGVB&5&30|-5zby3Z5?qLW#29r^UY<9%i@y zm`Jsj$?AHR-u-~ij7BL>EFoyTh3cnIz}Vv!h5eu>A6`iQnT^zKu-xV0jN;HMvlr>p z=H%IZxQjrYizbFQ?vitLrx4C(Q`bNFlGT6wLM$T4Gru`S!A`hbP%5%_=nuPV$EQWnu}1)fdDUptOHX$W@`m4KC5 zbAaUtg<4mh4+Ru73D_YPCpBuuKVGbtGVVlxAjdfr3uoG@W1M&!x+X=gu{Z9MG7*fi zyKn)JT={k#=K=Cg6wA>ncL6(2J4n)x^w)as^6C$ZXTvC$^rhq$#Q_5Owc@)nXj-A- z>wbG7>Fs%X6d(@4u^BGIQDG-Ghg7=(tdJy$l_}*@r-P;a6@4XU(R1fl7oqLrFMi`H z?tCUR2-k`eB^I@9kc6-4zyZk>aF3KScY^-fO5cJyp)#mzJ7~Phxu-WVN{?r;rl9-m zkVRrm4(mg(K@^#(s0ORrpJN+C<^b8LKlXKbGQWG=D&U8k08(I7gq!8$ac=iJy=)kT zyOeX3rM1}cHS)|9JQ!r zvH^+7>mrWsh{dgHsZV)NDZLhojq|;kRRLBW;aXcBK8-@`DN;cNiXAIGS5 zGgCU!NuBS}$1|ngOED$o*>`xrxP<6p<9>+*4lBxhl&6v6@ouGz5?=das_0IN9#ZOP zmf@Tm%94!0)8qwH&jL_lQ&(cw4Mc{vMKyHqq#x{EzaOO<%tri-PT1hVf)?II7N0e2 z)&43A57hgIBGeNM%@s14ZKw`Y4_(IEInBRwRpflQXCut0j1;Y2`)zOBQn zWr45p#7^aV_Z~~dwI?S4-MUp6d?NKp8p&0D$e&>{o!Uz5MDw)|*+x zEa2H9&D%?#|I-043+<~Dljy{T2cw&HVE1>&wVrMOM8WRdSBb^Ey z_C6=q6?pexRE>K5MHsQ_dFKf1d+<`5>l7sC5`72>?jEd1J-;x1YPpFH0Ltn8CAy}o ze6&JJ>Q|n|{ORfRblPd1D%!84Hc3_~d4N%u$9o0407m7@SUfzHqTmJtK#Pmx@n2bz zURHnhzj7R>W56wq{^ct@ffRs9mz^ett`~%W{YujuGZ2Z+$P9-?5IH3xm#R6 z%(Z4sXS06`Jf!nI-$a4?G;zT9;}Dk1GuxFOz2$9=bauM@*O15|S+KaVq1ew76 z_Um-(5_+=S)tvx~K3mP%(I47jB&+*;uFZXP%uJTyRl{%BYE^Q00a1EPvJ;&5t7D1R zttLmBH_QQ4S4Yrm6)*8u-{M9EP)xp^4i`e)Va`lmvPj&~NLw%V!OJMF+>%?KCPy!J zZ1J7O{NW0zEh`$Pr-^1^n+LiCBRUGW%U+$wiy*o<2-iX8!;Bl7l37~`SITy$HS{Aa z^qW!H@pP5yb=@vU0jJ~o$IPRjLL-0g6cIL%x6ZNN?w1PPN4H#m9uL5!nve3Oz=zsLhXv4yT6iKumagRStfXEgYg(X?b&)yXuFZY7-f)EwND;)ASH<}L8!FLEh@eh{wEjrS!ZFFWx|3oN}F;_aZsm|Znj zYxPNo(-+NG`+hB6>68QX@3*P@e+)BF6mR2&k7u6U^`O`cl&GiVo z%OJr&)_`lT4$1$jn{GfK>+ivG3Pz*L%fY&LLl2$MD35t9~q~s5; zIpVnMW7lnKE3&&vGgW$AeQ}dVwW9>G&MzO8ME;Hai8SOD9=ceV&}x9WNspq=*8RC# z64~kU@-rhk>%drKp;zYXs^uP%$_u^p9VUjqe`)D8GU{rV6K?^n0kZCdu3Z8vP`zjH z#~o!6xdoc zI>Lsg0I|_a?18bP6Ijv=;7=`MLkEkw0Uq!10?Dof*5#Xtu364gaMA#?r_|4zZPO>p zd;6BjNUgKv4357%McxuEq8R^n7dwL0Wb8Ka8q)~IeUu^ze>g0%1bK*T_cTz9O_++W zNQ`M&Ue~iNh~RfE5!?I=FZLr=@ivpEWN{d#=J4K_2>V!KOt27?n*TEF8)Q_aHI>4G z0iJSs@m>%icVNxxZ3!H^mznBWc0y1Ynt1I|q?(upC*$oqKZN#u!Sf|+d}H=ebveL! z`rdZ4ZAtAlf_?bwKkhpJb$66IT&T+xECm^q;=Zh6@hygqJG@1bz3A4o+m*kH8}NVE zYF=F=3macqLnE;@`GD(~vhWwjA{j&?Y`p!(YlIegEc-?|Dht-8O_+`^o2U;Aq6+ZK zW}BZa5R}Aq_%$#GG&h+r*u``;2MQ7x{uw+!5EM|c$#k5sf6aT*n!}z9C-)YtT8y|M z`imy=pf;X85*^kz{JzMY+aFl1G8GPR_lv{WbJ=b2f)wpCE=6(OZxQoLHqO*S9#SHf z$9bRK|LseUl!&}<80LJWpilRpQ}lGPKx%xoJ2Q;AH)aWO>1$IYxB}XRPtTWDV}x?k zL@SrlH!kP9q>$aoZ~P zb(+;)et9$yC~si3XS*VOe@kFWKw-O4S=TT?X~NCc8bLHYa;nrn$o`#)kNnlZ7Z-yL zaui)`p(v<5nd#J*CkV;=#TQv3yQ!K*=t1%n!d8Efx2GcLIy=3vKO{9fEvFX2*`SRB zYcf&VcJsk{$Y2IH5p|q~^Ps)Y(NeyNxe}{~vM?5J3m?aM7d{}}SzA0YOf78fE74XSXujXbtn(eZ4(0OslBx2lrQjqUGsf#DT#GuU zJy;i`Dp!ns7CnJ(YDK1ir1CTK&@_e!vs7nT<**ZyoT`TPodPmUg=>x$LbE=ppK-CD z={rBAF-KU1TPX65lQwiUF@*|lJZ7f~ZhYGwOxqBBgC4eh6WsV`unM!^`UOdmHw))KLO7mY+}T=U70b2Svr{1QViGl7xnH;Hzl9<#~l8l>j!FZ zRNqu@!a)Qh;_EP*h_v@>kJ`)tOxVkzw}r`$scoE&-?PeU>=7}v0FWei@AVLs#gZ0~ zkMV?sa33cxxw>W$5d?HKU(~LNOw=ASopru?W5vvUTDF4A$`qub`WpuV+FCU=iY%F7 zwA3q$G;ABM37D%rAY977ANK*b;=4j31UV4J=F~!+-n5T}3EZys>pK>jU(@WU*a1-F z_WVRq&f4hq(RY$;ZH0Or^ClZ{R&Nmw2qs6L`-j-7r0P{WS=dM{dlGk8{6(egh7h@3 zQ}A>HEbuIKauQQdoXFYNxZDma8;6Aj(u8;X1|FtsgVVk+f@2ZAnU3(AT*5IGOR^|Y z_)!fOrqriC0s0qvD5#Fj6G=AeRlk*u!2bcD10XgC1k&_!G_IN-~J z#$hBzZhli*Cqw=)96WeHFaWr6&KIO~78Ii60W*@s5RZcl7OWI_zL4^|RL(0DVapP^ zv}Y*~<9N~&Y9!LZ0zgZdJ)y*}-uI@{5LSx1;WVQtOLO7J=;d?+rbf*F7=Xx|WILvU zuF(=mSaY>P(ZG-nl5E@2?xCIeX|{rKK~E=fuMo5zoxEGE7F{1<*jE5&v)rX1QzSlW zIn(Any4`G5c#Vi$VP-syIp(?S9ZgyFz?Mw6n+0ys-~S06hi)icO{|(41JXySYE&A? zoR+@5*;md$s4}4zWf+Zn@I7z0^JzF$h5xP|vu_3^{~R3BxZ8L=OPus``Srgt7wov6 zc=>z1S)fhBzMt}^tiG#s+)m~YMJKbT3S@A(mnNp3_&D`YGTpeD z_}R}BF4iv|?Oj(!Dp})5EbnpHfS|k1u*$-Lf7d9_=sz)z;#>Z3tCYW3U+czgwoTuo z-D||<|^NcCc|Q@o|b5(?ki*V}9I_xO+5boCqk`J7 z7@s4_WC#Ge|9wSyApU#k9Ph1Tt9REy`UoEd_zIFHP*9s}jF{+-HG=yegd!3ioQAwk z_FdtBxnWS|3|uTsa>S3)MrKF+$0!1nf|MrLx!#6Q!M19NYJdfVC4|bcQkH$PX$rE% z997&)??-^4giu5;NElp%@zoe|@);mlTW|aad|dxK8Uhr9 zX9HoAv2cjF{+c`>G~o9EMScPHaFJ@5YiA%so<<=@s5B>}|Gi>JW#HIj zhRAKnr2N`lxf=ceNC$-~9B2GQ=!Z(dqe=sjM?mIQsFk}Bl*2Lv;1T3H&?2g|7)%q0 zh@d4<@H2#R_y=Y?MmUFGC}q`bVp3g`*e7Z_sN6VALy?@?qkpH&(}m~w!wy2BRtySD z{%S|2Ru8X&At0I<_AA0Wt(O6k%wEj7JLR)l);uw~OI^edm15M1{BK`+^C1ar+EcC}Aw zed`BV2&@c_D66=P_T|wIrX8fql5h@mtMyKoQhv*v%@Q&js6qq2%5X0X!uHEeM=n+= zdA|JoiUy34CqFx|Jb+rbQjbqu9KlBYh;mu}Tcm)~mD_;>(IybXyB~zzfYqtlTyH*6 zmDv1UjRr)0HiL0d^04GO4=5FF&gph5`R1t750Hg&s~y-o1u&gfr9*1>ohCbS0t@$dp&{$0 z9Oc@eQPqw_&F)|+T7TX&RkjOZkeibioEtnC>fgh?+XYyW^H6t|`VXH&?`;Dx_^CK_ z2d`3!cJV0k^u-V1p`vpEy1mBlE&jgpO8W_mr3g$Cx0_x&3+im7N%|NsB=~?`08@Xe zw)O6}>JL)(ksOAQ<++NUlCH4=V$FdSCai~ABmYIptHH+jVxmK-<*8}Ejic1 zvOatSKrQfd;uNB3=|ZU=7euEF=^eJTH2|P0`8W_xthYqXwE+P?*z_GrZKT6@>^ya) zz0&>Z_{(q=0Op9sOclro_9`;bTKZy*A_u(}8;<$7;WTW@d@ztl4Fs1~df_Yz?yF{} z;Ji~GCm-F1pdd1Q9rHj~-OciE`|oKxIcNf&q5b@gy7ESwn0Jp0eqR}kT4|Nqik)f4 zW@md98)KFUjgcq7I}Osg*09hT%}NBNT~~C}`S-NOR;~QEeje@{vW0s)pOVH5xCMhbx(9khLbuf`yZ8n1cXKya-PTn>KhZx! zzldw-`dcSCj7ld8^6L1ApVL2tto4Ji^OK^m%>#Gj>PF5wMYID}2MQf*z2(qYA_Mdp zh_9$<^)wgZ=t-|5rxe`MzO_t>9{9cDVK+Qrb}bwk(5lCME$xErY94>`wG)(SD_fw9&!c?zOlhsh6;Ag?AV9kdw$3am)0F~1rqWGHIk4B?XiSjZcy)%B4ja8AA zlo_F|ZBv~eB<<;XRRcG-zup6JCHs`nON#ch z)c+nUu9@2*i};(1X8g=&xzF3ajf+OY&ldXu%gP#G_ay!+ODH`joG4(yQ0BX*N{@NM z^WE|cQ?~vGYgeOlAWD`;Ao`P@N-7O^{5JwFXvRS7|HVpY7k8R)XEa+*Dzs-!Ze9#- zQqdaT9czosNA~T|gQE_PVgf(UB5b5$7muL4Yg|BS5zL>M_NiBb%3n0b!rA1RByW^* z8e$IW(GxuO8&JQVE)ld(l4vSnA=Ai}M+>ovT2-iX6HumJzubDRUHk^AxvDPDtbzHy z=8FA>$3-{rYjPw2Qw3U*2=q$QW@jJhUsY_&W|C={Ap1G33Q(qdbc z#}ekB>)~}XqBAlhQ*qvD2xoG4JCQQi-)plzzPf*O#I2gH z24@PDqdKlE;21V&UJAVEj7zo40I3>6qFg0Dvx$G^r_eQ|SXE6qfhiHffN2F&avZ=C zYObcI1`zUB>)WN2Hh0fNoaUwFV3XA>?|$CbIA0Y=zZ#kfGdfO6`RoB@n1VjO3tLcz z^=LKoK$4^GYkX>IGt5odVmC-Bj^F9$&gp}zOmb@6k5Z&=S;uzs(J=oo-;5r=^YS!O zCLC`u5FRy^u*JnXJsl@r^TPrhT$OpchVvo#}<=d z#Z~;zi<%uffqhvkO6 zoc9?#9lbFAtgwH6b*-9-YA2c^`owsS-Jv_(;H6J~EE>{RHb;6${<9~v(-ZV?Zon`h zOn{wg+!gA>i*_pK>kz)wQ#bxd=p2!q+;V;tK3)Cyrt8*iLK-k8r$>tqzs(SqHL%QJ zD>FT+)e--}y|zT>Y9^+15_2ao+rvBju9Y(SS8rYcR#=To(BfnaNG7Zl!@(~byXnV^ zrDXFFjjO}wy^mz-9N+p-i@SD1Fdm5Ywu9#tsD=E^?aT6bZhxM^nez&w-zj&ixWPR= z)uyT^=F*m|Qy#V%*y|slZ~ArZ3OUA=+CI!#y0nRNyFG|apN&DwiLT>_c>1Vl&E%%H5G&GHl$~Ha@y`}Emme|eS zEWb2ZOar|z>&1HA>Nk?J^+E#65Y!!Zuy1hYA3^P7sEze8NkK%*i*m*cJdc28Jm?5} zZWY%!6fcTyAl#*Rvq9350A+Q(6Z7lm3ubXP+ORlKv|g0Ur&ZegXwy;SLL(Vw=)CMJ zkXxIxP^?&;yT>zLIQ^12eO&B|v0YgH<>O`kS-lZClCO7K1R$kO6g+NyI-=udAHvSUG z>Y!w{+a$k&7Ut?xC@M(N7%v)mI*Y>VSm&4h7;df8Wz7|b;`vjZx>@A%FBp#y>s}6hLF6!)$1=W!xX}y*QIVA~sv0q@B5sJOx zbwu$iP=FV8_oF{Bhe8=g(8%TfN?-n3N@6ngkVZ!DblxDNKm(6V3n&|0)yfI~i(?)O zFYkkQV%cQ=d_6tZZ`^Q~4Lf~j$lF95Ld3HAB=P*)FL`av`QCk(%udMZ$L`@?5O<=l z{Y8BbiV=(7u|M+?_A1Tb{wOfGs`|yu+8ud)dEu!BD@9d2zeHDmKl;~{z1i3%zuOD#E%bexVO!U?&ypB#U|fEjinX=dza46o*pe#-Nspb2 zN01&KB%m^%tNI1tz)!zf+(8(+p=my1)G1&UP6*ba2-@3q2(OU)5 zVoMiKnkhhc^FqbtbJKuvfBoCh`V?bw)+g34k%CH8ig)vntdlbS%stco1u>9BrI&U* z^kh9Eec6>Fl5hBS_5MYmIDU_Jw8nVjgupYjjW>CdJc3W#l5Ypi)Vgaan{SWx^o)j7 zHwfz6TXW38Fg@)4AxmY?69=fT$XQO*)Hf@O*m2)mmne-^ug&ItR%5v}-rD2b2-uMj zUSvagQ7s~fX~DDM-!Fn|44%y#b2hiG>2a)}Pe1r0HFnwSUA?@wp2dCR}>Jm~6f5N*ti6TorQ=BWXP%z3@l# z&Sgy6rqkkkll2cgjfOX*@EDS=jfIp%t_2SBdb~2N(lK5ML89(5V&UtdYFpycoj*S9 zKLy@JT&EhJduvmC84>jc>khMNt_T(>(tR#Ij^DoMp{A{Zl)qFYRzFQgmu8^%(Xto& zR~~EJ`=zqh{$=cj#f83f;QMwxaQJnNMJv1C_4O8Yu-;($mk-MUJD;=b8mI_#pMFyL zh@_MWJ{7a3$L|Mc8Hj!rkd$+%D&09ytyybd{UG%M-!z3V+1mRD7upd?!OoLJJ?@c= zC?IGE>1s^+$ccx)cSuVfbKh*a?*kx~1)|`~P2ar$x9F2(2p~_yFB!;x-nY!USh!zi zcYYa(LIqkwN6h4N&V?xd-(bl!OZG_dWZexC4S0(-6>H?D*PYmzX;CC<f`6s+TSFN({BTG@SPlBjnlKHo|_K%PYdTQhQ6F)&lyq*KtKEneSCSF zvCa^vpwP%+|5OjpV>LghMX@dZ!pi$PNa>-ZP{~)zGmDzO2j2zwR~SfjNt+B$a>0uG zU~)Z`arbO|o&7TT+4S$pITu_8x<@Sm41H56F_)9r!?+HK47bQU( zYOLH1pCrQBf~YVzGZ7>Pv1(}Qq-mKSGRK&Qop?15xM0qoteGz4IdTqhk=eH&l~rDX z5$ZngFo2t0+gE)Qu|%6%?;A$5#OE#vb5mBO;t7Eqim~+x|%{H7D>Dm z-!XAc=a`o6HEw@Zxs+VGaAo3k|5av<_tP0q(Vr_|i+{T$F;#n;Tf6!#+*U#9;U3GS z@G8yauNg%&60QQUBJlSWu;80>E3DQ89M;bF5sTN7|2v^J4yF1fx72qFi7VtP5Q3MC zrGqvdq^D%M@E`;((gG@xTlb{`*3f+E?FiG(cJvN^Avei_83p~3Wsad%?9c70N#Fc< zL6Tg{#$zAzL$l%+{W{J95P4>Gs*$Hll8RyoTpGF69Okh;=7%Dg+I0kUl)=3s3c&=O zg-4m$HE&H}Wbl$(Kx#mc(=p*dsc?P}7Sz2@gkW{s%GKaFBRB*CI#*J1;(P3+eo^9*L&X+_BjfRY@bwmfYq*6j97?ewz{Iw2 z-gFCc6q=(zluuyde#!4LsJZ3h=<3Cc2nc$scz@O=Q2HDQPcQ3*4zOtH8FV*@^%+lF zir#aT$<3iNTpJ=qqf-HR2mUHNlkZ2kjJ$v%#fXI-pPK;R(FhuzBR>zD-eLsB8nU-Z zx2ssSKym~;aQTg(jij1X6OilT3kI)@)DX$C@AcM0Z`eI@e#b za)w_V;qVWonlZ9(uljL2ObDdZf$}EYTfdj}KWQVS|Ytiwcnoptv<=5@5x@SklMzgAb!{ zu7HHbYZyXaZd5HLVfY0RNE~(=WW@-xkxr`t_rkEK00aT&-?9I9!NpDu8t_lGiX#l6 zI}ALXN;D+b^fU{KX5fnb8dN3*(kX9{_E&>`&3A8ZDxXuvx) z2#c311rYg9afCa)f1Dk@}Ux@}33kJiR%pzdz>FMCW@cn00rf5L!e;m@KAh3oI zLJm}TyzKwE#DRw`Rgs%x&Y^$mWUAwz94bV+a3A$qiu&;bK>JaDLA^WwlM)cfK!l|z zf!`zrIY!S;!>CHJ578kJ+4MzlX_5E?ZN$lz+YjcbNMH{JR zVkLgZ;7ZF(B$R+FSWvJN2$arcgA6)U8cEm$t^bnZ)Xvp=uiWw@!Ov3n$)sMc%Is2JFL|TIbm|faH z4Lf}dJG-E}U?!^^?-O+)A^wi1mlnR`N3gk_gFJJ=FAM+X56S(0P}BYA*QhPvz}R}g zEKLP{ve}Yxp#2Gj)>Z~8yn8{V-ZUu`;0J1{XU8VC6sV^lK{S;asIi5IE}2RoaIqBR z?RWx>u8A>}1!DB5S(5xY85GWhUHC3|VtMAvz~hRPFa&gZTe6leP>a{vJ)UKm3hJn)f zgZihxJI3D-%!61=`P|qqa1qnnBDzo=0-<6!K0k$1s}Iw%J{>WzRX{;+pv!^ldi*ke z^mL-T+V+=Ly*@lA5I0$bGQU^@jOtXQ27HyMpsq*lL2>T2S+Oj>P1-Y= ziX7u7lmEX3H~(j;4rC8)S{`J<2_tW&rT-oz7x*<=**J+H0<~(W!MQaaV_&Fx+b`A5 zq6yMP%`$qFTGJ~dZUocQ?M@uGZU;Vk!g!p@Ws}(3z#Q`M6ofmOpr!5>>7KWV%&(!k zT}k$o!+iTPt(UyhH{*iN;5;L}4V=fqtbLD=ZG%Tw7EblQXBEhRPP3m z3Z4#QwDN!A$N9Qfso2Ip1$sqaRKFAR@N=P;IUPk&)2z5mRUrC?X;L{6nQ^}Lro zc@BT%6}-hb=jrD`Tbz|P=xnD=(EEf{^L-XzXh;Ad~U-f#{kQd9Udmv zQ|^Cep0a+6K9g@;eQ;@O`N&i8M&Yvlkxf^Mo1S`Qzw z{yW05#p}8zh~Oo86y1qv9mtS`hj(oAS(~6AZ{ztxRbb7U0Xz%0m+gsWRD862v@u+y z7|9Gz5XxG=eVnRkE*Dj=mG?-X^(o|@wn}WeIIOT?yFRfXnLEu}cvTB7UAe)p>wAin zrh+EJOxnxMzJiXkRbbz(*yHCjUT^^;zi-Py!02ZCUQ2~X>0Vn@9E2Q}iOl~y*aaFA z5n8YHUW_zXc*D4d=>p{u*DjcY;RB;lckUN)7lKi1@gapcT;Sj%*h#N&nkuX%M;B1Qp;}?ai3r^LE028 z%l)xVuAX~CN~GMcunaW={ZKrYa?yg=aVPX!CB};_8i!krfUf4EG{4HOPNw!Wzw>-Q zBJ3t=v5mCsQeofzvVI`qFvwxc-WFK-gt+WU zN%>w^G*$}YGwITZITk6)_zcHKm68IGR|6_?T}rMZ#JL%7Bdkhx+(D?pU2e;6d4mGu zTzMX+!97THV6sE-up#jt=@sVUS;&8YX-{x{yCzu1b@FJCaS#M}NAi~KB|D*UJB2HN zJ$yv4T6Vy;HKuuAVX(3;hfLfsdj8 zsImre_fmP;bZ&5P0O08mi|#!B2pe<5f2R#c)F41oX;L>(YX$3oK}@V%N=<`c^TwgD z>F1C6!7OR$x@O@2NYX3mFW7~S4&Ut?K*KFAeSs#&PPY_XPuDuuCQ)XQNdFa;pG2F= zdJUc$dUkL>-dgan{%ua<^q_K9`Hz}>PoY(w!2~Sd;)2ApH$Omgq-qFnwKa>fbHD#t zkTakQWwFmvxgqGoX@W6wHN6y>HggYrtDGJm$=he);x50fWgQfEnBp$vCoVygNx`*7 z@`X)&)xrFQER&>y9Qy&;{I7@9l~T}2PTPQ;4{8B{8U(?6Z=Y@{$vf&s3aOGpM?v|? zcD^VK$)JnR*`=?b#an3)Y$lt?mu}7BK$m7|m)~k3BvnN+@56uqb(?F>QGvd}YZ<+Y zpM}0ZrD6&$(xKP{j+tKTO_*TGT_&#|jFE9ZI zT>1jzYox#tl9T9Uijb*x>A!j2-{I%3aWp7xH>K|Dop+S!_rpTXw*Tm=2Cg z()rl=5o~+l|7(HQs-R?yM|5dfjh3Xv8Z4nA3Ht?Vv9Qm%xUssKyw%^`Lee9Sby`!#f*x*t+Um0tqJY283A+J)~XL+-vQ?33=ozVd+#2_-iRQ)a_OuzQued)%q1x|enNM*)DL zPWYVTxo*4bdzRxoYpDB-)XWW4h(E7f-IIjOBTdKUdg;&6%uV%8=ROsRDR^XDWW9+a zUw}7fqidU>$CiG>9md_G^S#J`{?2vifxR-L9s;W8tqzX(x8rSp=^edhM!vK^I@z05 zchYUNSBGYD7IOSoO)h(MS|rF~C2xhy!K?8N!+6}=cKF}+`#55@Fvt`jdW9z;Rbfx& z!^sknu=(AWUL*wqAl}ft$oYa?6Y3)g2=zbwT(_xYZt2PCRk;P#v$vpG-~l7a)ct+V z(87v|mj82xL)iLVTA{V!qGMW829^fz_aAG`;Hd$|tx>pPnR{Acn`srSO)z#;d$wQa zHQ_PF4%+q;zeSSQdwIcl&#`P?dF2-otFrwD!84js!5J=NKlT0IbB0n^kg3{No-|&r zB=&9p6F9WTgn!S6YKP&YFUf*_%JujkWw)q@?O5uu3HM9LJJbWa#=FfTmyU!*3nti#zoIkCP4wRo=Q4c28><*@tT|kz#dU5CWW|?bcrR_}%KReo z7#!-HVj8Qpbf|TTzS^v#!W7--GbCzM`5=U%%ZX==%LK$>8E?+Z9F|vHu5?wy1B3$qVOqsqscEEFw@W#W zLF9Gz@S()OsmHksidWyossK4`v9CPsbu_=(f-s|EqE=Lv=o9z^Qbm@{WZsX%85 zo-siuOgf!vymlUVAbppeTV#A#dSl3Yf*}c8h7Yjs%9O^OO;oHpraX?y+xE4dVabF? z49Kv_&>hQP;OEyN3M-1Dk|p4HD;8A-1qgQddQt~iyX6DW9C|+k*iGR z8gdqvBez2Gq}(|Rqxr4p`TgvV_w)Jh^FBV3Ui&^2=gTaM)}!MqDfYRx za~F;a3&JW-x*t~GBXf`Kpxt*55{9e{efRHneQs*UQSg@EB8nZNU3^NN$p@lZQ?GW4 zE`@7za+dAC@^;>43C-_RXS}y`=1Dpu&e7W+h|OeP@j+?_EWJM)7axbS4Yp!w%?U`z zQD~Z~X2)rmHD{MsV`n49?vvMh__?63PnMrmXaw4KN#^GvWbvts=L?>Cc|c^tHu}w5 z5URd8Uk~d{6w9V62VA{hW{X)9$mE}$>x=Z}2KD%h)kl*H$B4t*T?lW?T|YZ?z0w_v z_3sB42A@@Q=AQQJoS_iI30dzZPTDPd1IU zwA=%$Or(FJtWMHohJuG1)Yo!bF9A9M^P^@Gr?Q-OrE0z_H{cN%Z$JVtnfygiOQxeH zUVejd60}?JI}VBWytr9FT};dI1q14XIKQ}A&sivjjVL-cThU9A{d|X1?#rqaZQI)c zofGZ0oKqMN1oYi`{Egh&K|MZ7CZ3gz(j zw!<+E5r3xGP*B8&m*}w~LX4CoDwEh=8q+4V`wc=XSPviLB{)I@(fkJY9&pUU#odln zdo~`7h9;>+SNL!c52)LADcMgg)AL-<3a_3V1ns8`RlkT@8#p_fv)ThN5-M=9tU!h* zgmy-%q2EayB*Ew%k@_Z1!eW0#pa0Wd+v_JO9zNAn=++|Bg z7TQzlNh9~l8*uC%@i%D-k>eRTC8}`}vA=O(gZ&UgUR8G z8-|)~^najnW@dtsO>M37N4X=SF7N_aeD$( z#%DzG&h3+T_bOxCY)A(h<1O%HJ7-hlmDAw-2MR3jxES6LfxGpjN>{Ac3|H0<%ZFxX z!frU)Zp(L{IjYiDyK=rCln*V+&dPwJyTb@!cPpG7cSOzb+ul}%=Q&P$^$d-f5$XM^ z6nEvtOwlyeu{aRdtHfy5bWUH;jX#C8gVh%dn~2`&IX2v4m7#EucJl8bo&K^%oI;qS z;fvkwM{$;H)Juo7hW1SZH)6s9VXJ#F^EO<74!gL#rL-Y^GJr#?do%|ndi0i0^6Vo+8V zCY@YYBAUyw$@e+rw%V?u>Ou6zU>}vMwSi7623~n%{Q!SW1qmBitxWmm(%r`s@SH6^ z_<|;igI}>qXBoXBZNL0E)7Lv}&+mQc)sW+NZ0;US=?U9l)JAoEa!Ec8Crp+5(k)xMgv9}j~Fl-J5FE@<_A{kv7zL4A_$Bm?o z4LE>I4I;(YRq5fTNr?aENsCzMNEIn;rRrAm>W8I@lz?|Sym*B!bH3Hau+c4^(ce@$ zopr=xN!Qy^FD?FAp56Q6mie1Mnz~34bDrfnN^fanM7U!m7wWhSic?Qxsm4fbDcC;| zWEBf-&!%o>Rx4qKIJ^4}o|`5ZnwSrh3?VKZGCTR8xid2Pe5hh*P3fgrG&5-`CNcGJ zl((R|gEbV1Tl(uCn(^Y)A-CXV#(T7=4$>v*40ICc3zf2}>G zdp(Qf{)pq+hQ};VduZ(Wgy(P@Xu-Q@TSBjos}pMH~q{NOXGz z(3GYFFJdtdl$~rOAFs35dx9;uc1E2)>={hiV$ZU-VF=<|HRmK;wK+lMOv#TQ)FDLn z&v*j@TcHqe!voY-*3F*9$_Y%YeLGFC2n6ayq+Qu$(xp70s1d#V`g4E~wK6dQ!jS~I zvnIW`WL)dH~hFV(xNuT2Fj>ssYCWbYH0zLJ&hP zdQa|=ihLVcZW5uE$!un?V(lQ`{bM^>=P){ONd-YkqqkBwk$_6pqZ!aZuYK+9g@IXS z$v?z-#t{$TBRcTr@9Oxl>YxX#e_jA5U}$@`#)o1aJXHjsY{~pRuaKM+gePz}#-n~} z#;+C%#mPkJp5x^|9Dh1*zDF(fk){C>gl*Wj4V5?F=y36E@}Es*m4l0EVHJb9GJ5@6 zMU&pjA|3|nR5CJ6|56rn1zI%7F7Q|0MB5EdhtxbTxa$5B!)E(r8o>BsuDwgOA@pkr zcfLTBvrk*5NLog&62@G!?ptk5ja5t!%N8iyUiSc2$3vBthd2Ua^U?P+zh=gG4dZbS zpN_a{a{H1rp~?L6zPFt-!2VrGjI{`UwuvnCvs{)N1Nh>34&1D8<1F&DaIHM`;aXM1K0rxNtLrw_wjR zHv5DK!USK{yQksgW@6x%WdFOV7&R1!={6+;Cp&Pfuu4+W6z~4f%dEp)Wc8(dZ>6Nv zRa5oa^^k8fOI?Th=)cHg{8{`0a@Z#NuS4$(5j5m-{D_DjK5)^LYh8nCvBds#4!rpF zjQ;%#f@sgsXbz@kg5gbZR)810I>kEp6qbuOnm!Cq3qAhm$=V15dl`d)A}<68GwjKm zpJqc@{0OW+JUh|crG6)50t(x{H6Nl(HQxSHMQQOZ8@m*$xV)oracGFY`BzKFO>^_^ zaQTh=LWhs#bNka%&${@bLb+KMKMT?LBY6E!Fsrs-yP=5@mTc ziFXkJ83Fk{U?F3Cz`(-7!X(DT0pk$92O2_R24WHx5-KVxN_t9iE^=yNY9=P8&s?9G zgqi3h=@?}hS>A&%3%3$Cs|qW(F1N6-u%LvX@E2hoJstrw0bwg)DJdz@FQQ^*Vqy+r zQf^Xma&poh((?ZDicrNbU%sfgtEhyksK=;lCTJSG2V(uPKJ278Al2S-Oo4^I!r-;T~r&K^A;o}QjweO^98KK>K_ zfq{X+bHO2tA<@y%5o-~Vo00J+@yW@_DOo8ArwQ5F*+oS~#Z|@C)zyuSjeq|9>FwgdA9%F%)2eGOJ#(ol-K=*yafMEjB#@R$UL#)^Zt%^yBI+L|mqCCJD$M<#sJh~9;Rmk! z^(5{I8-msQe_IP<+rp=JODFaonkZ=Sh?~ZIPGleHiC+_C^DHSVg*WB5yEs`o!Xa%@ z6$5F1Z+nSN6Jjm{hqdJFK*$aIp<2?SW*K`cyK^=*S_7!hUt!srO8HKV7zl@EJ&RbG z#>pxNMSWbX)K5+`I6kUxHO=wsLFddW65WhGJBEOSzN-}>jInMFDMU`oW`sQX$V!wO z<;`bLra3dYhiN6Cef&d{m&}+~60^VQsVH&qGPnb8oi`|cSi+efysoz7^SIuJTq7gl z9}v4|dsFW{XwU)B^@LNY1^;;egH>~7#35>)izjW7n#7t7Lf%E?qB!6WKm^;)c~pFu zrTMrEOpF>+kB=UFeowEbx-YZ(M=u`Lns-O-&DpLW`P@Y}>uEj`BaIJmc>+u%KggjH zRTOFdsQIK`hLEjK_4#qOHnChWyZq60x2~fN?G2;605is0Sfs2_HUU@;l*#*liKI!+ zNKDhAd!X*TttqN}V#wk}3o-HON%;Xipwu1GQ2s++`!4 ztiYQ5o=00-+C1ECP>NAcO&g{*GL9x)ov7?4C=Kgfg-G>_kD&C(((?FpalBwd8Bs@@ zca&6r+3n!P2()hi#qZA&yCrMTDkv7LO1(f+>lpAiwzz)V!5+^9@9y2{DZDV&9ZMa) zXlQO>*Um8i3J!7%UmgCGKZt>snTyH)d&qV~QiZ3}-xb@|<5a5j?}}2ZGJ6(-A#~a9 zP4m!nKl)geRr~|ec9CbivysK$W_MW!llo7zR(OVj9F&$erX+9=jTaSwRMzY9Wgh$>SNHdV8 z&r38;yyMks%sd5J2Zr+3b*Q$vkpJ)s+4cT>LOY1S1IbU#f`hwe|KTN2h{!?tiC`UA zxjV`?Xft&6uQuJVy?AXCkq3g}_3bY!hj7WK@a6|{uT(HN@bzm*Sf`*B#d^|Gsrd4c znBe!RBp41zB3DqbphDxU&+T9{=Zi&Ld$H+5P$S0T!V3NUCi__8lyUMemZckS<+H%{ z=<0D`+XAJisF{n7cVoSODWvgL5VW6bscpLxz4(WKH575i>@x#01ZVrRD_j9CVFJLB zyLyceoe6*=&VS?IWdfs+Kxdlv1(pRuuHVnX1CSq=EIWQHLtugAd|5EjMBB$!qbdcP zxHjKib^=+=*M{J5#OID){3YPh^J>WuU~uXy8V!DVc4F86_($7P1dvmHzz7ZmU8Z(< zhXIX1i%bDfkt2YrmNxB=OlBgUkh@<%y!4@`wWi>NJH^i9MN38|L@lUze`KxemBe4N zi&1$krWw3sL|RC_G-%WHN{UnKb8R8|wp)CC7Jb3zPjRq9d2|U;piuEXC2m%LPVZuLfgpkwrUQ zR1^Tb+BYYO$>qQ7g}k^pCQih!lSlE#q8SUy=2GPSn;v#-oW}?KP}-?m_-kEyU1nRITOOvhlV2c6f~(e|XUF||#CN>-#cM5Drtysk$9JN~jf20tW-opmf2;x20|&Lt zjr{$qi8<}Ya&}#>#49Yz1~ocZ(kDkOM{lcE9Sl1}!J}p^#vx0J1z{>zNpE7)&lYXj ze(~($D1uWt*`{SU+e+WS7SG?bzQ5Nzti5?$nSsNlI9J;>I^4LRWZO$Iyc|GnZ(f_x z*0ck!V6mfh2!v0jqV+y{9#mWVAgcwXq$DZU){BdPzav(nb(ff!3{*Fg0j zP(szKqltDk8*lc#L2P#bWk*a!-DL_@wzS9Q&zN zM`vrf-y^H3QVc54nE^KN3-Im8{}khDAN9;=KbpOnGNs7g0N8B#wL^Vf>SdL;DcTm^ z`C9N^euWO!2xNlIX~QqaNXxQKgF=M0lY^&VN1rZvgNyhJ4VkL=hpIL;3v3*`V<*Fn zSjDY8Knp5*v6fh4CitOjv?dUDRGMmD{i!&Rik3Cu*2A1keNQXT%5&!M9}GxVzSm&8 z93_B_Y9h@x)x0ZS4D+h^$qSBoLcqBBJfA= zO>;E_0_|M9!f*FT?b(GVT9QI@(wC+UP^6Siwrf%>eN382y$XWNF)_Mo2Ha*)+8lur zThk2N4kpUn&v%X^DceR{2KQl)&4SB3v_g2Mv_ZL}*9&bl&Rf>FXw^%aDSnt>$g+se zcr}26$#%`JG&XcWvd6hioN<`23V0Gx+I>{@K4UqN+>A(R^@)4$_1s?a=D*q~ja4uI z;}p`=Kc!FT7D){v7t&+KXRFbF(OA$;`ir$~8I2h0;-*E`iPba0L80E8&jZTSW}6MOCkPW0WsjdFQ8E;0BDo? zD)I8H2LLjWOQ=51-U6iMU3$d9Eg;k+KUBUe-e0G_%BjsQ7sWOcRav1#GzQGm|4M#9 zc8r5-GQuY>%HCq(fhB-_Is#HgWLMz3#^Eevb(;TMb{vM8BM#j8$Wp-Qw8!J*(7D3( z@ek3f{uwRb90CJYghgyvh7oy_QHz|a;8fpKmc&Jc01$JjU!}&7M&$W?i zOaci^*h~O|ZZ1*tOkt2=(x*hQwrN88BRAvV*_dE@vf!j4zpnyC11Tc1qdCh($?lq^9UyXr9FX zlYK@cc!=NrtEfxei`!M-BOc`SwQ{ z-CadX zjstt}z^~p&E8l+7uN1$0FvfGh?sWLFSh(pe6svmd7X~9>{}g$WjYsjQOgkqzne;Zq z_oG~lEOS%esXpC!wszuJRC?w1`T!;l-*=wwO2?-!MW(l;$^elquzS^^oJE_z{I!%; zYxKaajN$oSN}+rOx428;#&O}tfz$&`oy#8@Ni04Xw16hM)Q{5reZu$(z0K%6kK2e_ zL4DiLg$~ELH5JPrxsR+qirq=Y)Z9%9QW~7Wzyr3mI^T---kz#GM=rx^3q-=+{P_Y% zVjqe%jS^Y!tXQ&kzJS+!0`E4?E|jhVWid@-sSqbIs?4)l3PiXdx&~6iBOeEv4facU zml#dk?*KE4o+L=f8A)&lzu2ENN2f-J30`Aw^+x?rHwv*Mz=8T!w9vzh9_NL=jVyLF z;)N<%n=ur9W?wZ}1C-8NI%Vcvnu5q%S2_>vi*!WU$)TSZu-nMu<5jGzcqshN4(lS! zM)r}j2dSIvgK(G-m_p%pkD70d64E)kArm9)W4hpH&){!)BF|s`aZT)0Y>l3*$24s5oRU>;DQ4j1+CR`)RVpy0gu!QlIh$CdtDuzPxP21fMvxu zM&9%E+zpi7Ta{@!n~TWQeGVs%$&VN9bL#1(ch2Et{Df%R;uX;I2iv9@!MqM#Jb{sQ zN((EKc*gJ0F#Ye3OzsYh$p9*VI&_mgHbT|c%Eqnve1F#|VhaUO4(zog%8!GV`S-SX zg++~V2*i4K7+eIBM>O3jzEUlzW8LYZnH5S3O|Gmrwu`Xg=y zW+SW!P+~+SJTPst7KjSb82z`Z3FA+Yhg9oS{vhi}4-m&R1tXD0S*XreDVWbb*FLZ> z5XE;qT|96a(I~R0qt1|TV==$F;K2Fucq5u_S&rGGZKNq*!Kgw_xEj(3?8Nt|nYMIB zxLdwUVbO|#SDv}bna78GE-wBSTwDUJei9%-O|mHT>eEUb(2Q2ltUorvZ@G}eAVCY< zAkm)8@%r3rQlo%Yab!$j4LchBWfbi_L7UsE9r~oh+Xsq%jxb>4lZ%N8ikOR zfUhKU?gQEYFmPc$BTT9&AnUZ(U(R%nqf@tt4RIj3rj8vgvDw$wrK5YLjXPy3#2YzY)l}$^dfk6NNNX7A^5cay2aMT7+aJj7bp#)I20#=8LB|p z=+OCt8eMVe0MhIQ7ZbI+BQ7#pqc@-Ii|>D$m!pRPLjJ^%w4Ed+vz=ds-4OCu-3s1% zT&r3&=Xi-^*B9Q@tn|m7x+RnJa`lyMU}lW_G0cVgi&`Gjo_|LfJX)GDJ0dHHvYT+9 zFc3m%@Az#%VxjxJ(Gbla_db`_Ies|X!|#Lmtwyp9nRj!{_`ef&OB(wQ#ZMjqoE{hV zY5Wo1A5G|IBDgZCF@X~?GO3j7^8?=$UF>M0R@xVBKTxO6lds9>E(K{0OdHqq!nf6& z1=uwDCbV~Q*nSmqAx;!jS_q3M^Vizb$xS(V2%)9u1>E!8ML!HFU9ESGiIs zLJzi^x$+A&ZsixvXCQE*Ph>r)Qo>{$ab$CSGb{jzN=0M#8Pfg8G@|~&(m4rAkw90^ zrtPdJc9N$M_UB0{-XU$cC~W*A{wEvE16d(}KSJLrrRU!~nYDhmZeh4@DV9kQ$!`oO zFPFy^<<#z4Or%@MFgMn8v08HHLxlaWA?ub`)4kGhyL=Kc9 za>UQ?3y+Wqea$>8bsj;Xw-hTu{=OA+ULvADl&~UAI-MpgaeUk&&_C=hY-}F}$s!2= z9%xsf_I@z$qGG;W9M;Xc^Wk?vn*<^VL+VGeV(fUR1Qy*;V@=HVPxdiOVNm@qgHwXb zwpvz{lLz*T5Mwu41B{n)E!oX2Uu(s9agGG&nQA`0o4z>)w6lRx64xv7t`8rSz3gtq znT2m6t%&-`EF@JlHEXCntN%>`9V&{2R)@k-BtB8Zw>9z#>TG8dF{S>%Dwz|tcZ6&7 z2(8pBZSx8EVbKX8JMfBsd6HkmVpKtZvK_Aos5VMCwh3&_SSjEV-h-U;Xy=9y!JAY2 zfMehUzGaB6qMktBUBw2BJG7hg#_6i(Axb$K2D3i;JJ&IT(kz=*;0}NvLTt>xr!ja& zCsdIHaECU)UNk@J!F%>a!tp~$tAjWS=D&n;K;}VFiAxh2qryh;JpPezchcY8L&WTm z+Cue%$1$7aFzvqTt_CL%hr@Ly0qmiorA`^5F&%8XACQD024+h|%B7v$ zj~Xiz56lF|hZ_%OG~(u}MgrI&HPSD-G|2pPW;sFPEnXn90{E=pN%Xxf5>LalB_h z)NfQ21?mQ@g($0o-kuXO*rsKwJ;9}(rt`WoF~$Awzxh*FEk2+{q(>hugl<_?&-sXK z9{N;hk=PIUaJhlwE<0YHi?%%5vfP)n<`k7aT;d4|hZm4+i#u$9#=a)v?crOscjp=2Xh+qWqpAKlfy!#*y^kV_?3;U*N%6QetpfJsplLg)Y$ub`;;RX<4Mv`m zM%{nsqH@*C?7S5)87s!mXf#f6)=kPnI;&1hYgscmMHWC3kAvcxhjQvD!nR%1rrR>Jx*RW zh%G$(x~(ex_9$^kKxPuYqq`pGxSn22jFcRsGT0UU+=lc=fVm-}*g$oY6)il|u$>yQ z%U2WSZM{Oc`qs6eIr2qne?s}uA-SxfPPKI)mR#ySuppCJ$Q9KMQTY*}Vv1CA=pMnk ziiTe|F}#v(Y_~-ZBETkp8{P11x!o09OR2pl$#t3|9j8JoLZkVHjpSgw=_bU5+y&8-`%{* z<$^zU=q?upl3g9J1}~b$875wadDg0Y_HfU@$rKmInD}>+idL69cbcl$ zA>oN*VPZei+Mw}q-hE%{DloE%L{3mJQ5qBin;nN|N6ysabLc?*vDHY@a&cm_sK6&P zxxJr_dmsQoPC>rN0o~*vBQnPrZ&!L%Zm$-nW{~uF zI-3q&k&%;l_+KzR8K%9NlWCf0ULS`!l1Q>4c#Y=vkhz9W z`gwPm3YRSdc_k2z`Skhj)>BPp(cv5Ex=EB!ZnKKPC(jhng+2ZU5(_C$Zk5r_bJ>kB zzC9*t)eT~^-t0T(Cq*h!9Yvgw&yT)gVA#)hmKiu3Z7y9`nbkVTqZ*ORo>!rXcpk4z zE_y+`q^j2ss1SsI74y`8ZAQOmlV~}Lk1~Dm;LLxp&kaoC^|EEt=rIE+`++BDYsgSGfP9D*vw`_KgDk?hH0CClHD$x z6FOZW)oL#zGrQ|L^WBVoD|VFHc)>6CK({r~K3`CSu1y-Ae@5AC+xU~>Qna%8IQnS< z_1%n!7FY`1WZ&qd8Cd1{VKz#TWj#3KmuX#Uxo@^XIJ*6N$IH`s}G0DFwSM|3WY+{_Giq9hv`B4bM?Z79IPwbGA}heIh^gPQ%+nw%7C_17Fr#g|0F$E1jo;Rf#gWDiPj(79fiCT|2%DQk@zh}4k!?_Xz^ zYEy38vEly6)O@z3W5*RJ*BMvz`dg(ul0$Qe^oV!3i#DC=hc{!}*{nQA)bt0tWU47p znR}i(c(+qQ87H*CWIvD#=L_TeW`x*$5(CD0HWQ^^rydAdbq{&Bg(R0I@S8vsa6_>U zSk5Q-x$0lv_si9h?|ANPFoGmAs7)ZYaW{li@D#QlEv8+NU*EoKk2J!EMNVz5X}~xA3I#-2hW9Zj-#ezcjC2W_J^IB zG3ViS#jdU*GQ@p{9*(1JBd7F9gaaF01SHyCj5o@#I}kU2OX%Y8`v|+~mnNzFz$!`B zhp)UewL)JxY?Hg|5<6wF&6JA~KCBYu;p@?;4G=C_PA<0P$&h)L; z{EJMe zD1a5Sgy2OgoW8iet%s;6 z1#Q+iH%MB-D_kHL<$!%Mk~IIt-+oL)tS7S{$c}9l0+z+R%opbli@-VJrHPK?&Sk{k zo7|yFBr6r-uQZzX20#zLIz)k|`BK@R>G)QkE9ROHE|XgILqdXi4R&a186>Qz7L zFQa!izvNv+oxybN3hze7Q4nh34tvFwczaUbA05VXI@xugI=E?kR92UImD|6Kfz=1w%72Bv7p=Ys%9ddn30Ta z*^P`la|xk1>EL_jNQ2zaf}MVB<%~sihb|wFAGP+1id^G@%d~Skl5_`}2p;<*|5tX0 zoR(^kQmYr=mobagF8xN*sJzPQrnCq1oa}{h6P$E4$47a#Qzp0L0EA4#MO{L1V%(o4 zDkKiPHN`YjsCZZoLN8Qdv`ONAWwQ?rCk)2-b*1WNbnmr&NF$^25JfURRmA=?@VU^N zK89PVkF$_|*{yPfAt~r{dhAqclXkNmsk$coC~eP&!SJtf!4Fs1h5^or0a(MKtNQH; z0kJ3)2Z9lH&9ih3R+>1|-hGQ_;cr)`<|=aScJSB$ci?3Kiubm%wAstHblM z;}i%v7ucJ%+cLU<8jDKlFMS~YW*2>a=`kkogU5-ycNZl=zrnY_UMM(Svp>WDVO_B= zFk8|mL{Nhqv3n~7U)Ucas=EVLx1HOT(lE}oj1aghweKi%(EV7(rw0mTstM9W4mqrc)Y54(l2ZEM8nhk$(jr(ngDM{IZY>v`5*BAMGB;y z4u4c-V`bdejZbA7Cin`Q8sIkf;;@Y4otzvv%M}%oSy}6Xc609vCSL#tz4GKfxH33u_yF>V>pB-SN^MxYQqMrlo>5LwX;&dbgFtdxqgCUl zhbT;&Kuoh`s`=(txU`qRszCAqrTh7dUgrzm0}MhaR8sL<^A}&mN4UO3!mmb_g+P6f zqO%cFZ4ZxW{6Hjx{*3uX z6;U3tK&Xs|GJ~+N;Oz%rKgj~j5M4Gyb<+T0!yM4?%Kc6Ckk~8YH%k2(5s^qaP_M-k z7Q&~LHJ@#V-%c!Db!_|1#YDrZ7Hc6(gGBF#@h=Fw3hDbk2hIFPoMmF*u(cZaXT}Te z_RRY%Zxtps)h1syAt>$xCf_yz^?*;b>xrt54gb(tX7k=$J!l?zN}3q1G%mA@s})~B z(4*qS#FAAQZNaPNB$X@f)(DAhe4wvV8YTY69yL12=LWR=xR2k*L&)>K+s4hhPz}&- zdoS@%#8OgA#~T;O1nVGdYpoKw_53++_hqMh)F94D|GZ+?$T5!(pcuga-GjDqx2+lc zp%!CG;c?&ttq$9JGWPF2&Tvlp=8CAqJ;A2UvP|!szhmZ|vX~jloFs#lrkT>(EVH8X z;p=b@klzs0L~tqR+}x5YeY<~k76OHhY(|J~K! z?@9&x)Ls)at?)Bj?{IZk@$~fW>Sd!$-z+8m;Y#7@9A-?s0LLw3EuE{{Py||9)uPea zw(Mtin%P8veXL21crUZlE!U~yE6lShrK3$p$)7NEt=#y$j83)Fj^H)_Y6KXZ9Ej)i zybhdtsAXpT*#fG8Oe)fa&2^6Mjr58*i&trM1mzTl$Ijdei%%A&4&YplVfN-OK3PuE z|I9%Y45vENqXyPg(ljUD_L>X1P~Rk0XG#qWwzrPNyJu7`&>|yFB0}ZqpRAmyEL6Ye z&ZPDKt}=84)+Dn|(r43o-4PbN`!By7z{v}sI(6S6FxQZd8s;Mvn1m>~o3J}KSdjdp za6l1VS~#W64!--EHv25XIr;vhCO8CHT4$KyoLLmKCi#?z(J~uVUTr@A+y!>2vzq!Y z7?3IoeV{6k)Kq=!9FM0Ix6Ap_{<29Td4z=(VhV%q^7NBZ6Mi1!?WKO*_S*`ow z*TTX+Nk<@y1;?x!a&Zxz!>i%J;6g&k7J#NPXjSV=QF(&r3S795W82@7j^OFQ^Il=! zV4|oo@k5EcOEmCCBE<}UIDM&tRTaVN0NgJiR(ItH;01L`FlPczL}@GltJL=;0@u|q ze86VNvtV(U*>I{8h!6vIH~EThAnS@cvccd|E$F8eL9WLk?JkTbEEadYxfFx!~R&_OC4aErPgrKH?hZ%z( z2X2U3aH=9b1dd~;M8+z&2igSBW2=FfLOS1<2EA#6Hp6Pq&J+5K1&FfPgNLajP+J?i z_|I?#MJgfos!jRzC?0N(wq2;Uh3$mAS>PVEG!H|E0np}Gs4 zPNPnX6!5b>zgpDkRW{(<2u;1- zi5Je}JQ64B-dKC#7W(P|THZISWuNfR%;-bT=fK<4lyIRT!r5m4D2o2j+PQ!7x()q9 z&Czu5zJ4#CFW}Pv_8Q*M4cCE0_`3aIent zQDFNkeAE`QJwM!q57Ly!uo_6^_(a3FQD8IkwW%Zp77UTOqaL`qdMfy;cDTFpyK7F| z15rm`Xw=^a3qj3VRHNqoTwD9ln^Zb8Qmt5p))2=`-cO+`o1rZoEHQwcvdAg$JR*@8 zN;cEtb%{D5I#!>VeMK{_b1mY99WpE<=DhXWDRI5L-0f=Qcp{a6V?oe8#kYa%k_vp) zAeqc8)tYM`T1$dbIy>T05)(oGUjQQxt{sjR;x1{im8Zu&=9X|4LoM#whB|+o0E9%D z*f}HGM!8-^d+EtjT86N&*wIZF#XpoS)Q*!jea#>=?OvdI zTQI3noqz>g1vXX+IDf_^tHldqE5(94fhv+6oDPp5O6Ydg?WoIgdJl(VhDU_7F*Sl> z^49}oy_u9j3xpIXu4=z{t$t?Q za0iyMdiX~zcedKV$|?`j*aD}U9GoLddks9r#!6(Cp99fx6HDoPo9tH)lnGiS319WA z5wmUn+Lt29CN!0ZC~^x2HCNg<9RoaxwV=qh<|;nI8fBRTURdBrUIqwu7;T63itk4^ za|bDO`Gi7QWn-QSXiIk~^P5rMFCgg87Y6!HY;g^Ew@~r}aLF}{oH9JmKoHe{2vkZj z2;rCTZgK6|UJ!`xEeMkZ;`7gd2SYyL_c6&f07vZ=j@$_PZ>zI zE$(VSF;18Hp!hm4L!+)^>JA-xxce=yVJm0b8jc6TiL$WPhExGEcH#;7L^HJx-1(lN z(2yz(zh&gCC`%PYQ%ds(tDDH7-HM0n$CpkVvmv&p84>R4{fz`QN}v+vx1H5ba@@?J z%@Pk^XCOMJ7)qFYJ=Lb#Enc5nzmW}b1vz z)$B3;SAP66hApW_%Rku>{*%qgJe9`>oTVmK%0EBLL~N=SJTz&nj?9+hRarRAL?;hf zmS|`DA34Vft`hxPL)jTR$&~+{o&CwLWY@EUapJx&Uh4!ybpJv_b+f)Ze2$_oY2gg- zV2M}7SC-?=Uy`2r`!2`-MduP!vUlK~t2K8>JK!!%?dgrAY^%6inybc)WTukFbRJp5 z7V3(8Z-iHlh5-kf=>KrKijCTrg&usgq?UARQD-9S8Z8tDkY6frAYnPK?Aeu>duCgo zCj^w}<9jAQ<#NAX%D-oq>ED^Fs4hj}4WT8}f9FX+io~y6b?B9xPWs)0MTj=&*;#t{ z?P~vIw!b*DxP&yH&0np5|Lmpnq28(pg_7#~nAJ|U9Jz&)CT;Bbw+u=RhX{*jVpQGM zfsjri|Lup-&zdKc)E5#PTL*^F$%2P^jdl<7p7DKL`Cw$S6XGY!W4fz^G7!IyvYycx z3Gc;m7AU(}(1XWc$5}Z}Q6_M(hAVu#-BV|qQ zhxu=xM6L{e<`*%9wI*H6bJFb3%Yr^+hYIu;C0QvZz%k2q(RBw>~Gz;(MEOCDky&9-Hb{>b#1N^*Pa0`HlZ&XvyS+W+(#H?Qp4#PY%j- znq@mhQai0vaIXzj7@X8VN$)fR(El#_%%HvDJOJ8^QFVY?ofQ?WO9~Oi8GG!NGec^2 zd`gefKTL^@cWD;RlfWLyDw}=sv=(mnHm>DFe{ml3C9&z`6XZfyMe;L$EP`=hHg>&c zde)8mXy6~W=-iFyH}%=ZLG?pv#SOR9Bm7ii-qW^rgnf9E_-cQ8wm;CW+8?;3`2F6> zjo8rs5zDnvztUF}Ira9>J=;_)`0W-`YgKINb(392lpDI5zHxm;&E5`>Yr)z+MHp^f z()T5m*_TjeK>F~fhB0EKG0OnR`l|~Li|a2@8&VW9W_{dZ)62*Q2G_^qmM*4mW$u?g!pntXOlNu;>9G^KPxT1FR$zEn142khnZYR8h`?dTR>f@T;`cGDN&q?#k z9EHRRmFO!C*;J?jyWZCHXS%8F9REd^Do`Wk$OA3ygDS&5I^-g6hcP=$6c99aza z;UP<0w*Qz?!8(pD$u}Osf>;JDKo@Ps7@O*F%*Ts$XOqXsYC{$SLjVIz& zl(pw3;Th(3lqGGb6peM#1r2-UTNKQ9VQ{9R8LGN#@PBH&AlE zFQ%JHde**qxbl46xua7>Y^7FzcBlN8Z66o)KN{&Sd#}Gn!PkAWg)Y!={jG2ag8N4k zr3+ri0jhT$FNv=k;tjg=r%W6~Y+uxU8o=z-Y8s%C=`cKfG`nS%W z=gr2orS{?neBAF&C(F${8H}Ha5w7e*^rM(zyS$f%LHM3^m!|XiCvNX^VKvj{HjPa= z>!$LtK3Cj60iwjNj&L*bQ#D3xWm5Q(<5!=r-VdKw*kU~TQ}1kFPcUY7j9Yz=1iOmq zF%!+eM&(RS_** zn*ZN%2>Zp$)iy%2bX5>poTlUh7A0*PN&DrCgAHki6Uoj=2+i#n4)M0=99ztr)5y1^ zs19gu-t?~L@zdJk1Y*F(SqRPD*cS1&z_~z8@~8{mga82r?QarAsb;?wKVJTg_tHO_ zEwiy--(tii-*X~RNhsgC^YpHP(tKT@Ec$oxdbDL=@^tObDZqkECT|y>+lp6U7@~5k==pIOq1m&c=Rm@@VYx;07tp-n?^AaG<><%S z{GZw9Je$PZn>QnlkA}BNk>*;cY$z7me|DZnF6P&mxOb03_C&3ivtEg+ua#&By>dO5 z%KEOcA3aOc#Th;Q970_(x#5z`JQrVfiyh^z=yVEzf_Ay4sI?(O>CBj6n0=7ka4E zu3iUo<-YsfiiDS&$v>NIMZj$)QXQi@4D6cPUY(WSSSYsH*8D?+mMpZzYm-6ay}@Q! z;;ZM&akPJg4oOMqrqxM0Xxt@h>`ALh4Q}=8j)MnIE!ls&UCxyiW;SY6<7G7@>)uez zSh?nYxdHut(X*4*y&3o_SgMqECU|(5WCOjET?C%BISAt)=gw%sqWT@o3CN3_9(}ld z>Eh?5yV?wko|Mc|yVEThcj8P1P+t*`L@U3ZDe(z+TO;@?dv@pl!_HgMhXp!;Sw{UM zP^MrDCEQX0cI>Q`{ZmA?x%>@4fv=@?z|PX}G!({Tlu_SILsOK4-R6$6fM%fa)Za90 z$n?&Wm+oEYyQNlv)TSroQ-E$3+&~iTv`OP;_eioG~V2AxfA9!E`0ew+op#Ck0~;tF(P;v^r}L0!gTT6=*G%Vt)#vgJA!!BA70C zcB)Y^$a8Qi<|PQZN)aB<+}QnO%3n&0eH*)IK8RJpp^4^DXxw;Am3aHu`sYd+zk|A- zB{W%%aZlFExEaX|hlAgxTueO~`#!ZDhTyxFlG%-k4f`D53}j-*2sO+0!m zWze>U01$u{N1@J%yDA*MZ~;2Eri6l+nvEO(fjoT|X^aqJ`ATqb@9Wc05vzmCNl1}> z7hRlhIYLa^HP@xziRFBQZ=3nwcMP>hF{x>PXec2-bS?5CS)D6{#GYpQFavOw!HZO4!<{God(v>a z3MRyZ6WiJiIrM6j;ny2fl44`hz(eH^0_G>$GL115;FyUQ!9?L-P}=Qd^de`V(TjB1 zj0;>>9nXI#f&A%?U*Ez5_8G0`qVv8BQ%@iEC5v4E&NMfrw#0ekBvF?+KY1L-hXT*= zU~{CL^Z&w1o~NwOz*IFNm5T>hVHAnJXVwdpJtGPvPK7c zYg?%hWqgWQrMXT^D}`@hG%F{oU0QAc$`fQD^K(A3b`0RI6gPcGnqH{>=uVTdoSZT^q`xsUh#ub)0v2T_lI$=`>SkX zqg9gsu_gkrIH?{_r5<%87Ff*qm(l-YN#v)yFBzRsl1_8H-$x`&B;nh$c==&MtW#Lw zh5MCkniy5PcSlH@LzsbxSxGISB~5Ak_E1WT@31dO_gmq}HjZoK3Y2C_$XW92t{Z_A z@_It9mto*RD8ONcuU z3Cg*VdMou&>)i9{*q z4C7DVQM&e*?6w3@i+s_Gl0xWb`UBUe1#g>A4ke^;AB4{SEZ)ws@WT>j@UO`USqS&q zC+_dC4Na}-RHN6~sj$f$M*R!^RmweS+Ti-7CNVy9#12k1;)=njPFW!u2|oDZcg%mu zy^MQ4;KWZ}p{ovsc#yCCut!5ED7y5t2iohyTZE4uO07gc{!_nNReVr)9Q=Pg!5=A| z#P<29t-NoaJfl*^g4B}!-LQh6WhI{uR1I5&B6RGurJnrVu|Szl$f0FDYi3D3c=y!w zRKd_V__$@0%pK`I?sFd(;T-w*i{Ag|b>;DzPVgg2FXr4x*_K5e_f8bsjte-W=U(E+ zBjLcYb;#T6pJ8XIf2JZSTv0M;gw*8aO4Nh5teB6NcX$PH|5Ct|1qxo_v76Nym%It` zN&2|-QlhzD81Gn3bLmHrpyG-E#y86R{?g37eCVg^cf3zPEg^(7*FGm)Hfh{+YUD~; z1>0M%#fvnZj7~;0UWR*2Y&}ziN@l-if7h#&2jn;LuA}=R%3PGGNw^dqj+`=1@D6R{ zQ&3&2ue1W`%qP*p{L3n)0wGjeK@rf@|_z!vz&SmV7{_pzF0_v6 z_RB`PMAS=I$n^dNx^tu0M}xP4tHsE4G^BwpEBxXTFTzQ4G$ezXK&v?Jr{+n7Lot^vPE@?Rh|6P+^p8n7Cdqu4v_XkJNT?LB8doR0CD@UKoZtb_dY9u&r zYNs$f?5rj<#$LFygi>XDC^!~oNjpaMiG3AZJ@RIDwvHPKjMEdpy#g8IJnrBZ%CAQK z6Wo1-%$n!ju9fXiJBDl2C_>!N>OYO#YkJ(Gwi9#L^OKU+Qd;0!ZI|&whR6JlD{9Q4 znStCf$BXk1_a9)Jo8Kn;CnFQ~AY&WXb-Cm^`x)+aF0VkHXi{1qXsfEIqKbQlUnE9; zGn%{iuMuoqGV#7QITAS<9Y3#DLBFr;nMLon7Tx1XsB%vby>Uj6qE_t$lS!XL+NH_j z^S9F<|4Z&0xe=7<;yu&i!;19eTGmst5=UK7yK0&7__*Kvn}XKeL)!D!Tr$&X$It5S z|Lf#Dqv7h`HEbBsqeVoCZuAnpGonNFDnHtV@@lPFO%?s0NL`M&QctvF zoJ~MdxMBE!p}*&G5`{v7{XfU8s9MEjhZ^U7*Z-q5q6&uYYl-)|ggL>heFRn|nlg9k z7Sv-Ye{II#3tA~p?u^J=n-0GZRPd-0=e(fdx!3M@GhINZD`O&(8$V9xTmBp5By8S^ z-DWL9qJAY4>1i9!N`89M=J}SA)oJ-}DnEcCNqK9YMfRxPrmBisCq!8rF`@z(dz@hn zDxf$3O5fS8l)(i7rg0xcfEvU$!E7WE*d6r-C*OzNO^$x@ch~>^j0dh~vq!iNhyipG z1j~qLfts#D7P@qfzhc?~Ws#B2STkcxhg7|(DIj3n@lWYmzC!M~3SAhu*;Lj6tUZu4 zOJ~UAIxabSzGhrI1!YL+R6r%WVV%T}?S!IZ9XSH%7pJp?>4s8+epRcWE9%BkWh|&e zS0%#5MGENEgVv@4vOv@%^~}wwipwXmsXm$CFq6tCpFb%QaIl~k3e>LdVnMg-l$_lY zdUlH4R~iDJ2u@k#H?yqKe!TX&S{~BJF(a4Ky2|(+o?~Tg+|w@W$9C$2MB}@$$jRW+ z&ZQiBy^#=ewQ^h1;zNAwc1ja&H*@jdz=>CmA4xbu$R8a|p(tX|sr1`#eG3@b`F#Su z>}VHZ_~lj*yZ~*g55afIgun%Bv$^NkLSVNcX$BS{aEvyTumVFvyQOJj9H_WA1dDsX zRyzD+;y1933nhow3FNWHSN}>Mf@jQu6ruL(icPu$ylPd{z*>;ypR$+ZEt@hP|8(}{ZW|Fxr^z_q4vl#i zY6kFGKUv9H0}kI!xx?tx=q<~gOG*gku<++N^(_i(L?#p53bp>sjtX_BGLE~-P;G1B z7Dzrdq?DJCIO?2}?<8Ycj*2tl&k8~s^~)^-QuEPX3S;v^3`8_?=QZ{-F-%qm9j|~| zRgv{}Bf%?zUda$L7MY1p-M>2QLmhI%{cv7D3k&<<46P8H7x@M+puLL@Bui4*Wb1Uv z`5`-BzSg@2nL+Y7U39Ow<;d!5ln-L-U6+gCs!y_B$q*z0c~Wn!NHBApdK))LQ%~xkkmB6jzL5?_D3NFy8X}D$tY#JVukw(5MIWF~m=wF9CeEWNYqmr3XhT zw{pE(%&LW5+=s<&?k!_j_qL~Vd)MywHWn=QFUdT(uML^(8`uj%SYIqxda9C*NgeKk zHCBd+_&txknYU*T@GjgYFAjF!C(2wk8^72@e*xajir3zCGuu>VB=_P_HI6Y;uhh`b zO#oUxNY@C{C|WkU6vT>xG(IDYN$UspH+zVC*tG12g|WTP)NlAUwSs=PvJA>Guo=V& z=&6vG!IXffJYh5ad{IOJy2*ZA3s(2nd-KH0k9~5TpE29t$-N{;zua$X$6VX-gF!b1 zoCppTsd<5?@@nm_3P-lG!{Kw}DK1!TS#-pG4T#Jan{^ll(3@Qm|JpCw7VD`jK|6Pm z&o1apI3t2+8J*_oPBv0>n4G+d)796EA?P8gN$Ud`t}JQ9qB; zpz#b`%fU0z-PD*dIh(;E+rBw#hfzmpaOPoGll3Z)87aG&j|ICnv|d4VuW)(GU?RZq z6piso%h1zGz6GriJ53`s1+rBgtS(m4&B_7;*1ouh`TDGuk)ro9HHBCr9UIiphugQd+ zbiV=A?2a)y9L8^!!p^-U_vFlwk%k-l7Vv4q19SQ)(;!D1tYfp&h+_$$toXY#eB{u` z;l->LF}{ek+l9M{j9Y~j_owA{*PeMWkX{rCB}wh;Ur-P3sBNs<%|8EPk#M+`jmM89 zjy8jcT;Q&ox$o#4aO27v0n6t3MDy~Mfay^3QJ`5aMM)Nnw7(>41@fdFAY`#h{@JMm z?#0y1ebTEuch7Vd?uGkB%i7nz=27AJ!O~ob_TyJl%VFP?r(-poB#&+xk7qqSorP1j z2_B}2E!`AOT5|pBj-4FLbH);Uwb8b~$B7&w=JEG5$fM#zg+0J*2-iAmk{JArQIdeMVvou|#KgA0-j0U0Me7yfqrRhmP|*ThqrM z7qvARam7>~QDJ3JJH``&1#X7N@Z3Iazlk0rEZk`_;Od!&Z1G$Yc&vBxD$htkKX{7v zg#iTpJzxiV)Off}_um!IGZQq6jPM6tjhu1GgpL;>k?|QXvo?2MdpaISYSDC zjAP`N(O%9lr!AD>Bq{lG*bcIXMR2V-avEe(kPAT>orzZ5mg+JXLJzhU^q2qM_2umS zlcf{m7u2;&v3Ht=@VR8t&|cFM%-Z}(OglU?agiPYFBqbPjq$Jz!KuPcp&lYb^Tf1~ zLsbUmI+Pxbk7U%ER9x^{ttDTBSzq{7TSfMX4(WK*NnJ5MtVM-sjjK)E3?BzONM0>v zE>~e|Bu>*5677y4rf?qK5k>ImhJ!wM2kv(m0iGGnV0Tw7h+d4%P5(PL<4ba%$6g!F z$RCZ?bt!4T#_WOK1$?6$3n?t3LlFA4JkPcg6kR~NH_PP?=5<+-yi#-qC&)rEYk_+# zAToILDeIOo(I+0Tmz7iqC#KReTSHZrs>&7sX`7cAjjsN`NG-}p4!n|`VrDuow>^QN`A)UcT1FAh6Nw+VRK zaog^P1rzbCc&V4=jBXE*8+>-A8mK)g6~2*#=Q~scuDfqU{GQ4YsD1sZW`emf?a}pC z>Ow)I`~6y-*~oRB%h^ZJ_Ehvw&McY5Y=idb*KpPuPYOC;&mlv zhkdF^FSC$AA{T=5+>_ld%(}j>%hjIoxt|6QZri_StLU26ie|@}5(jut1UepHrq&JQ|i$oK`rAv{9WxKy^+wQQF4S&z1l)d zIUPyzI)$FXGf)Ru!#_X|iz-|-f_Y>t&H$;`=X{dnV=8rsnxn8>f}26&R$@}1aW=s| z>gp`gc0>GdfD#Fq)vU|!eDTIR!J!72#6S&U>@<4f6+s@%^CNE~r-$L~hw%XdKzx4V z`NoH~SK@rDJw$BfFL9Fd;zu;;Nbecb_n*r)&=E=hL$zMj#JM|(DJ)EGk5ftF!?qN> z+Fw7##O)+ifLN7P!h#QJbVfKm+|cxj$=sR#?CmPPJlD#7Vf?i)WW;X61O(Xq^`89`Vr`VI?kkzPX<|0|i+NY*Lu zNH^SaW3?{fp*+{DRAQ=Z**~$+i z)C}M_w<~gCCwe|^<4Ctdk~}Z?KlCad)Rg#(++y@WXGr1uzU$FDe?y!ghCts>kGOfC z(UkCA?flFg*NnaD=%Ka9xLzwRj0@K3(x^`Y;P zbepQ0MMz%P&h&mvv{Jy*Et`0YxHGAzVZn zi3M;I$CKNp_(J{dbM$(q5yhjBU81*8r@;VjB25yi&`6q+r@!A|NOb#mSnGtCS4dR1 zRQSTr9lc&AA$W<|i8Zu{!o( z>j?Za24Kon+@7;AW9exLocYLA_^MQ?$>h8^lSDzn(9AV;H{k7#a;E-|ct0=)kaH^&dD+?6bni?OrfhETdy~ARJI|gas;3V#q*1;DXvzYO ze^wIGs}JKHC$=bWjUo&GmEaZBR#C8Hr$zIggR-hEUb=gM`MXPFz8v#QI-LaZ>ElR_ z6z(K2Q&lf^hEU&g$&nuH<1oE0!L7-IMR@x{Y{bX(X1R~(G>t}Qv2#jgv?}C3S#pYd z!8hJp4*7E_X=>!NL=`)koKY?am{UWX^nD`pdW(>n=vW-pZe$pbZ5tOYIBCG29oh(E zUpEL*OZSjYM4%t(r||;ub?$t~2db-!4{aO5Drb8eo<37ZV%b{ z>H@jDUI@(CAY9du{9fz#b8JTO?_7(tojG^9<$ZruVQl;V#!q{@6L54#I{E{H&*(uJ zL9!!%zJk0M)$6~Od%QASfUc!aWSrF1A>)Fp)AR2DoofAzi=+SLs~D9V4zSBr=ok6dak^Brhw!3vL=P z1SP7cB99kLjeZIYm?mnHEAI@ge5-it-y%3*{sjc742=`EK@cb+9`@6xZ(B2@aED!D zw*=uvC(iG`?8Aka-5tm;(zVDuc+We4e4g(QFr|kQZrOg1wP6c?7{s{_g$oVYo#%Qt z*n+SPPFMBPES8I}bOWbCnfiz_fmRH~_=`dI?}0?uy7T@)Ia zi2IlFz1zTfqK#vB-dH0hOC+JGU#2Ba4&&7(hZ!hl{oWNc(&&(%j(oXxG@9_$u2Ywx zp3wF)Eo*I|Ve9`1=lsim&{U_+6j{)EiOWN}LH@`zXV6!%D(vGt8JHIg<&71W?ISlv zaqyDQNl_Q3=rcBUTx=CGKIgFK6O$wSA*aP26rAw z^9Hl`m~B#M@D3|F@(#-E?e0=CmRp)g|`rm>QF1dpHzKp(R zLJ@;qfUW!|hHXr8#hi6QL|WiUp%tUlLy3P}pzrWt0lK{j6yO{^?cJ+fSoiHcM~+ya z#D28-{Ns!yB!?R{C&_EA?{dei(Bb{T$y%IguJIvqDk!0yIM$W{QO5!&NNtENP`DIH z?o3Dr_NYHtECnC4%{-BU+BnP?6}1`n8}VYFpjaGvP=fw)$2c?80Z^8P12_B1UB1rA zCq_k?b$^J%pZH5kY{+$p{3XkCWV5x(OGVE+x}%gEU2`XEXJ_!@(*8loWyk{E_JOqU zAMfiA+yVZ_omG{$tBF-vlvA~$gd#T!*GLwGT6jqM(-@34bw<-Ss-{DgtUU%)v=0M%2P%e&qNYNnyan{X01Z4ar~m)} diff --git a/plan/milestone/coding-standard.puml b/plan/milestone/coding-standard.puml index 85a4354..de199cd 100644 --- a/plan/milestone/coding-standard.puml +++ b/plan/milestone/coding-standard.puml @@ -28,12 +28,10 @@ mindmapDiagram { ;top to bottom direction * root <> -** .env <> -** .env.example <> ** .gitignore <> +** LICENSE <> +** config.default.yaml <> ** config.py -** config.yaml <> -** config.default.yaml ** hendrik <> ** hendrik.py <> ** requirements.txt <>