From 598ffb7a507fb42339065283141466cbece20155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D0=B5=D0=B4=D0=BE=D1=80=D0=BE=D0=B2=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Tue, 9 Jul 2024 17:08:44 +0300 Subject: [PATCH] add newvault --- DevOps/Hashicorp-Vault/Use-vault.md | 307 ++++++++++++++++++++++ DevOps/Hashicorp-Vault/hashicorp-vault.md | 0 DevOps/Hashicorp-Vault/image-6.png | Bin 0 -> 78946 bytes DevOps/Hashicorp-Vault/vault-policy.md | 83 ++++++ 4 files changed, 390 insertions(+) create mode 100644 DevOps/Hashicorp-Vault/Use-vault.md delete mode 100644 DevOps/Hashicorp-Vault/hashicorp-vault.md create mode 100644 DevOps/Hashicorp-Vault/image-6.png create mode 100644 DevOps/Hashicorp-Vault/vault-policy.md diff --git a/DevOps/Hashicorp-Vault/Use-vault.md b/DevOps/Hashicorp-Vault/Use-vault.md new file mode 100644 index 0000000..2d4d80f --- /dev/null +++ b/DevOps/Hashicorp-Vault/Use-vault.md @@ -0,0 +1,307 @@ +# Используем Hashicorp Vault для хранения секретов +**Источник:** https://habr.com/ru/articles/653927/ + +Методы авторизации +Чаще всего в WEB-интерфейс мы авторизуемся либо через токен доступа, либо с помощью логина и пароля, которые могут быть внутренними или храниться на Radius или LDAP-сервере. + +Авторизуемся в хранилище с помощью логина и пароля: + +``` +$ vault login -method=userpass username=admin password=strongPASS +``` +То же самое, но с использованием curl: + +``` +$ curl --request POST --data '{"password": "strongPASS"}' http://vault_addr/v1/auth/userpass/login/admin +``` +При использовании vault cli инструмента чаще всего применяется токен для авторизации в хранилище, который сохраняем в специальную переменную среды VAULT_TOKEN. +```bash +$ export VAULT_ADDR='http://10.10.10.10:8200/' +$ export VAULT_TOKEN= +$ vault login [token=] +``` + +В последней команде опция token является не обязательной при условии, что мы установили VAULT_TOKEN в переменные окружения. + +Для выполнения запросов через API из приложения или из утилиты curl используется все тот же токен. Либо с помощью нашей учетной записи мы генерируем новый коротко живущий токен и используем его. Все подробности по работе с токенами можно найти [тут](https://www.vaultproject.io/api/auth/token) + +И еще один способ для взаимодействия с API – это авторизация через AppRole. Для того чтобы выполнить авторизацию в хранилище, нам нужно знать наш App-ID и Secret-ID. Что гораздо безопаснее, чем логин/пароль и токен доступа. + +## Авторизация методом AppRole +Вольный перевод документации гласит: + +>Метод авторизации Approle позволяет компьютерам или приложениям проходить аутентификацию с помощью ролей, определенных Vault. Этот метод аутентификации ориентирован на автоматизированные рабочие процессы (машины и сервисы) и менее полезен для людей-операторов. +AppRole представляет собой набор политик Vault и ограничений входа в систему, которые должны быть соблюдены для получения токена с этими политиками. AppRole может быть создан для конкретной машины или даже для конкретного пользователя на этой машине, или для службы, распределенной по машинам. Учетные данные, необходимые для успешного входа в систему, зависят от ограничений, установленных для AppRole. + +## Конфигурация Vault +Для того чтобы начать использовать данный метод, необходимо сперва настроить наше хранилище. Для этого выполним несколько простых команд. + +Перед началом работы с хранилищем настроим параметры подключения к нему. + +``` +$ export VAULT_ADDR=http://10.10.10.10:8200 +$ export VAULT_TOKEN=your_token_here +``` +**Включаем нужный метод авторизации.** +``` +$ vault auth enable approle +``` +Затем добавим тестовые данные, именно с ними мы будем работать в будущем. +```bash +$ vault kv put secrets/demo/app/service db_name="users" username="admin" password="passw0rd" +``` +Для дальнейшего конфигурирования данного метода авторизации можно использовать root token. Что само по себе не безопасно и не рекомендуется. Хорошей практикой является создавать отдельные учетные записи для каждого инженера или, например, включить авторизацию через LDAP. + +Чтобы пользователь смог выполнять действия по дальнейшему конфигурированию, необходимо назначить для него следующую политику: +```json +# Mount the AppRole auth method +path "sys/auth/approle" { + capabilities = [ "create", "read", "update", "delete", "sudo" ] +} + +# Configure the AppRole auth method +path "sys/auth/approle/*" { + capabilities = [ "create", "read", "update", "delete" ] +} + +# Create and manage roles +path "auth/approle/*" { + capabilities = [ "create", "read", "update", "delete", "list" ] +} + +# Write ACL policies +path "sys/policies/acl/*" { + capabilities = [ "create", "read", "update", "delete", "list" ] +} + +# Write test data +# Set the path to "secrets/data/demo/*" if you are running `kv-v2` +path "secrets/demo/*" { + capabilities = [ "create", "read", "update", "delete", "list" ] +} +``` + +Сделать это можно через веб-интерфейс или командную строку, останавливаться на этом сейчас не будем. В нашем примере все действия мы будем делать с помощью root токена. Хочу отметить, что делать так на боевых средах не стоит. Этот токен стоит хранить максимально надежно от посторонних глаз. + +Перед тем как создать саму роль нам нужно определить для нее политику доступа. А именно, что и на каком уровне доступа мы можем делать в хранилище. В нашем случае разрешим читать созданный ранее секрет. +```json +$ vault policy write -tls-skip-verify app_policy_name -<RoleID - это идентификатор, который выбирает AppRole, по которому оцениваются другие учетные данные. При аутентификации в систему RoleID всегда является обязательным аргументом (через role_id). По умолчанию RoleID - это уникальные UUID, которые позволяют им служить вторичными секретами для другой информации об учетных данных. Однако они могут быть установлены на определенные значения, чтобы соответствовать интроспективной информации клиента (например, доменному имени клиента). + +Теперь рассмотрим параметры, которые нам необходимы для создания роли. + +* role_id – обязательные учетные данные в конечной точке входа. Для AppRole, на который указывает role_id будут наложены ограничения. + +* bind_secret_id – требует обязательно или нет предоставлять secret_id в точке регистрации. Если значение будет true то Vault Agent не сможет авторизоваться. Параметр задается при создании роли. + +Дополнительно можно настроить и другие ограничения для AppRole. Например, secret_id_bound_cidrs будет разрешено входить в систему только с IP-адресов, принадлежащих настроенным блокам CIDR на AppRole. + +Документацию по AppRole API можно прочесть [тут](https://www.vaultproject.io/api/auth/approle) + +## Использование +Для авторизации можно использовать 2 метода. Первый метод заключается в передаче полного набора параметров необходимых для авторизации. Затем получение токена либо временно оборачивающего токена для того, чтобы получить основной токен. Как правило, оборачивающий токен делают коротко живущим, чтобы, например, произвести выкладку приложения на сервер и получить основной токен. Затем основной токен сохранить в память и использовать, в это время оборачивающий токен будет уже не валиден. И второй вариант более хитрый и более безопасный, который мы используем в нашей компании. Рассмотрим оба варианта подробнее. + +### Вариант 1 +RoleID эквивалентен имени пользователя, а SecretID - соответствующему паролю. Приложению необходимо и то, и другое для входа в Vault. Естественно, следующий вопрос заключается в том, как безопасно доставить эти секреты клиенту. + +Например, Ansible может использоваться как доверенный способ доставки RoleID в среду, где запускается приложение. Рисунок, взятый из официальной документации, показывает наглядно весь происходящий процесс. +![alt text](image-6.png) + +Для получения wrap token, который будет использоваться при авторизации и запросе secret-id, выполните команду: +``` +$ vault write -wrap-ttl=600s -tls-skip-verify -force auth/approle/role/my-app-role/secret-id +``` +Затем полученный файл необходимо поместить на файловую систему виртуальной машины, где запускается наше приложение. Этот путь должен совпадать с тем, который ожидает приложение. Полученный токен может быть использован лишь один раз. После запуска токен будет прочитан и использован для получения secret-id. После получения secret-id приложение может запросить данные из секретного хранилища Vault, пока не истек TTL для secret_id. Данный способ хорошо подходит в том случае, когда мы заполняем начальную конфигурацию приложения на этапе запуска. Например, применив паттерн Singleton, заполняем значениями структуру Config. + +Рекомендации гласят, что wrap token должен иметь время жизни равное времени деплоя приложения. В то же время secret-id могут иметь длинное время жизни, но это не рекомендуется разработчиком Vault в силу большого потребления памяти и нагрузке при очистке истекших токенов. Лучшая рекомендация гласит, что нужно использовать короткое время жизни и постоянно продлевать его. Тем самым избегать дорогих операций авторизации и выдачи новых токенов. + +### Вариант 2 +Для получения secret-id можно использовать vault-agent, который позволяет, зная только role-id, авторизоваться и получить token доступа в хранилище. При этом агент берет на себя функции по обновлению данного токена. Агент может поставлять как wrap token, так и готовый к использованию secret-id. + +Подготовка конфигурации агента vault-agent.hcl. В данной конфигурации для демонстрации мы включим запись полученных токенов на диск. В результате мы получим два вида токена wrapped и уже готовый к применению обычный secret-id. Хочу отметить, что записывать токены на диск не обязательно. +```json +pid_file = "./pidfile" + +auto_auth { + mount_path = "auth/approle" + method "approle" { + config = { + role_id_file_path = "./roleID" + secret_id_response_wrapping_path = "auth/approle/role/my-app-role/secret-id" + } + } + + sink { + type = "file" + wrap_ttl = "30m" + config = { + path = "./token_wrapped" + } + } + + sink { + type = "file" + config = { + path = "./token_unwrapped" + } + } +} + +vault { + address = "https://10.10.10.10:8200" +} +``` +Запускаем Vault Agent. +``` +$ vault agent -tls-skip-verify -config=vault-agent.hcl -log-level=debug +``` +После запуска агента на файловой системе появятся два файла согласно нашей конфигурации. Первый файл будет в json формате и содержать данные wrap token для получения secret-id. Второй файл будет содержать secret-id готовый к применению для авторизации. Агент берет на себя функционал по обновлению данных токенов. + +Применение такой конфигурации оправданно, когда наше приложение постоянно читает или пишет данные в хранилище Vault. Ну и когда мы хотим обезопасить наши данные максимальным способом. + +## От теории к практике +В качестве примера мы попробуем сконфигурировать демо-приложение и сервер nginx. Для сокращения размера статьи я опущу некоторые подробности, но предоставлю ссылку на репозиторий , где можно все [посмотреть самому](https://gitlab.com/k11s-os/k8s-lessons/-/tree/main/Vault) + +Vault для быстроты мы развернем в Kubernetes кластере. Можно использовать Minikube или Docker Desktop для Mac, включив там опцию Kubernetes Cluster. Все необходимые манифесты расположены в репозитории по ссылке выше в папке manifests. + +Вы также можете запустить хранилище vault на своей рабочей машине. Для этого нужно скачать бинарный файл и запустить его. + +Пишем демонстрационные данные в хранилище. +``` +$ vault kv put secrets/demo/app/nginx responseText="Hello from Vault" +``` +Создаем политику. +```bash +$ vault policy write -tls-skip-verify nginx_conf_demo -<DKcY1stJ^C2$*X#9sKJWX!uIs+;*WJ_Fs=IbD?;s;1+oi5{;tUzt z)^0MgEp`NQeC6l%HAXTrb~5!7isxLnOeMSM?`iCOXR|#hNl||fxB7C}~C3D9)?_w)YGFa6v{o>uP>Bwe(F;(snh`j$fITT!zA z{U!GxGOM|iL7E(L(hvM!Kix8PYZux7`jTG?2bn>oWtno;|GqCW-0If<{iXlct@>?f zrj?aRh>HICl69fctLbI4o15Epu?qP}_JyiK(sS|OJ5BpP&(&f=o}rVfci{q?u=yP& z)56-@lze=AGrg}0)6>(dssim5(wy*whL&4Z|L2bVaybSD27HP4?%!t>znP@hpFcPJ zo|ajJz+rA}y~Ci=Mljs_0-x2KxA;iQWjv}>w8D)WH=LZDR{64Xa+*GU(o|P}{`~nh zZ#{K&b$k2Y!L)1%Y}V2lFJB&&m92X8h@3GiFHc8D$7kVZ>-$Ky9=ZJR$JfQAd3ky9 z?Sg`WaI^jLbryvV4i3kKg^xD+`};2}EHtOeyHt*r*fcaZ`^=AO+3Y%h{`}LYPn}M( zD%siDxx2gLT0PTt>$<9{s)~xWT8Uy0?%&_Tz`(GujgOz7UqIl`?Ciks@Nsc*N`cRR zE?ir3Bo?_Y-3rpfV-JXt$H&Ki{`}d(!eaaO?LDQow7YiYWM!>d^J<(rHQJPzk(PGr z$A<@_fu%Qkc!Y#%?1tZs27mk9U1%Bk=+RKIO&7ucl5o6;2Wny1H|?&VJh; zZ-Z%R56B!ka>P3Sh>eZSu3h1Vr8kRRMWm$MzrMWOQ*y(m`DKaz*7%DiCI|NJeGnb( z=MZr~_C(;%*@M6_F{D^SHym4o$M$T7_WHs&J!vssGV~W(>ZDHQrKYl3 z&B=*dS9M=*8LDz~d@YV+?9RD`C+2xpRwyyyxaDVDBvsC9Vrq&X@xsOBxHSDe&z<$a z0YMH94k4k`2Mek(DwQmE{p-uMHBW1Ak2d_mDJ?AlAt5ZqpUJKlFJ2743&*e9 zG{5Q)P87SLM7X@)$kepPs`a3xW2jd-_dI0 z_^?SkU%z(k+C2R$Y04rAmq?+7+;!xu($u~8Daess*5Y1IcIEBeyZ6VBAN`eX%5*q{ zii8`zWzknk68RN)j_~nq&Zlm&2S|+8XlZHfR+F64MhmrUcQ`f|Kr1z_Yt~* z9_HpFhyZ!d^2J{W2sG-;FT-GSXtb5;f)^&NlBG1GbYBy#$I0QxTUL>mh=?0>Gi|I!$PLjn&FO- zp`krh9;NyDbLCExnOdI9v$Y>TPBzBy9zJ}y!evHGSom9+9Vf%WmoHx~gBWH>qB_Vsy_(!%Jd zoSfXqV{L@>rAq_2KY8!9pM!&!5r&s94^B=RoZJ-MWsoU?P8E7tBfm= zL&RspQ+D<(a||dCC9~GFfs8)GExqr-Y0flUrC9)yR$RL@bB_+ z$&DVBQ6hz|k&%o|C;#@_endJV@u;xykwb@$iit7o-Me4bz3Be^`#Alyw6tt&skym= zhZ&larNymU*s+Ydy1LtMBgXQP2|D$-bk)!o@$Sy_4S-aV`*k{g2a)925*IXU(7 zLr9hE1henuPG`=XkyuP-C-hR>t|ijb5C8b_AS&u*LBSiXfZ$-%E~}}p`JAc|dv@<0 z93ECC96odi3$T}g;d7!m?HFOlj?XEwi3{;le_ou=8u{_Vwzo`?c;f2Srw<-Hz>Owr zGZKkW(b2jWE{y&7VO(gj>p;uPmoK9^Re#UTAyE?WXXj2l17oo7*yyNsf{41VuHD-5 z9PWyooScBiN#9CIb2R=F{>D#o1~5?vB_tSldR7(|78VsP#2>eO^!V|Qkr68q=49=- z2M>x13)?$856HM4t=|3;OO%V}e)jAcKSSt3k~Cdf{i`di>5Th%fg*;f)3+metuXri z{{7psIpwOkd6ezS^1^s~lB5GsNn2an+=AsawvCI6Yx^$d`?0Y>p~#-N3sjd27cO*l zbr~8M91Mu%zeu-#|N7eBd6dpptD?K~yrUx{p7CmZFE4LZx)U61IoSq>hUPC-n3fZ03+?=70Z28KR@u zO;7(gGxN~l!{b9k_mYxGSsPWdKzjG?-AYPIg!F6e&rr8!5bhsi1(XQ_CY5D4lboDa z{{H?^b{B*d}NdDHP9LxX@o_H;mPlC<&hW9e19gudmN#x_6K; zsiUPO>on03!>f~E8Zz>#KiSuHZbpTYw?qwTB~+jNACLxoynFZVPDa5K1g(ch{gf4o z^tQz`;z8uG8%VrV{>ud(>@=q(U1!-D(h#CCJX!}IvlILg>(AQ9B^LH+%m?md96EGI zsJ)y;{N|oLd+I_2L`9J)oxT-abLEjZdXy-%w_e(*x5g(mHPvUR?k?-MZ58ELKQaUm zO+M?RT6+GqmrAa7n$#=c)YH=g8a!~|fa$X~9E(t*l+T8Yn+Ok&ijk3LXZA%_|GVsW zLK%gA&(G_`3kQZ3-w6-@(%O1VTwLhL5rcBa!_VvO=*4gLT3K1Wj+V!P#Klbf4_MM_nBi)|Q{2+f``qES>=u3Q0DNffsQrf!Zu z9$b4VDrSzK!3N2Yz`@6t1+0g>7SIy3i>1K;W%t@egy2sKD*G-qaEp=CNsCeIoD8S!|{#)g(fjQ`lN=ucdP zA;1I#lf&qz!LI^i9na4?N_owXHkpR+d)(RiS;T72+27yn7Z-9#a#|V_i8=VjC}?X( zJbpYJ#i2}8!fkr4EF8AH+bN$a?Lxy*bZbz_pS_^4P&J&Hn~Q7V_YVz!cI3~{G52QC zZ%AdHUS5s+Y-EH4`S~?>iDy{P#R-`LRA5J*rlpZ($pSwDeej!g=9xBs{1_U@9_+%; zu+zqr-(+%fl2OQnpMzufo;@dGvFveCQBf5YtBAA=t;8VWxBM&bah$XfXMjvd9Unh@ zKw){3kr9(IP?sX>;p*x-_3KxoC(=!Hbo7G<=S@tifwpJ_yz#_1I;j0f3)5fohllDz zL5vpX=cVmO?u3Pfy?9{_5}~OXmX+Y63emrJj z2c1INNfIfnBabJsQNKLmosf_>ij2Vdsu8TUZqi}m#NZG1F| z52o3Vx_}S@@~AbGy(hY~al*hL0iPWAlbxo$y`9sik%RC^R3JAmPe@SkbN&_|6O+D& z$F2YtXY#Sl+S1@T@#`ZkLn$dKzl=22_sbY2G4@xu2&wwa6>Nz(+1B66n)K!m5Wd4Y zQJE58@TVvF;NT!iD1k#m<0Fcem+Dqc9tR**85tRnRM!=tyTY;qmX?+QQGR}kCr;E= zsZ{uEZlD5B_f@TKtb0_J=dT+ivEKn_V-B~teAy0c4LDVPb1kNP;=W@_$B^s6q~7*f zAVTwf+4ZtAGDx{Vsmp)=l3)-6L(uwKMk_E)V$BPO^_4#&%)2N{2fhKIg3=)wefaQ! zLCECOF`)y@%n8ZKIZvN*3kdxB@#Ex;gZRV4gMb-L_1PF~8IqKgY$}#`PtDiOC?j+L zwUmu*^DV9X+R9{J2j!8<8i~#!=H@6A^$iVC7|wEAu*?rpD0;3f>*DZh zY284C;zAt++ZUxMC|I?oB}UuadX(9V{GE?Zh5{V^u|i@F46Gk~8=N>pGd(o)=Iz_Z z5K~H+7#J3>9(Q6Ds=nSWOe1iBj_!=Hag})^9U!&+)_wl$J9g~Q%Qd=YYikM|F;IKE zq*#K+hxhU8#%FfqHgljK0Im@%;@U_(Pdh|`zyPBr~0Ranlb+__*L_upi5J0Q7bqjk7FI8{3lg7Dojz3${L8wY^elI_D zEc=0JjkheIj;KxNz_qDPsra}!aom|qoW;$X+JetMH8#deIZebF&(g3;oCXInFqru9 zqyEy-hKIJ;j@`SXeSOIaELd1rw%@iJe6!7;osOO!1wr^)8<#!jEwRKZ+kUwKVz^3s zON&(#pIBme|DQr2ySBD7m0!}r!l*@6uC6ZrLSc|N_pYZWvG!8ferYi&sq*Y>eo0BU zzDhUOjQgYHKY#U9pFVx&%$s9JmW|~>q?;NW)8)Qix(N(y>U_P@ zdwnHN+4YRWyRdygbWqN=Y}o=fQrA;esGq&Oye!mH-_Y1-{L20*q$JcFiI?60R1o!C zN zCr%){pFMjPxK=^oQmy~Cj;@8%lbZ#zx{8W^AlU#Es3>Y`4X;WmqOq{Yuj}FSqZ=(1e6@)B{dJYN; zDH7`Oai%b+pM$D-y}d^J_wUC?odM^#&idHjM?_6Wr>mpm1mT*MRi)=&I-Aqk^?XN; z%)T(f2iR9U1S&$&9MlqMykRMkG}FWeS_c-6veD4E!BBMr;A8PPYqK+gWc(>TGYP-?Qh5 zpw~^4?e@N8io~?~L1BPdGJ+?IUqeGfva}0u-<6)48=!g19^%r{9y5Jaf`Wn_%fk#k zYTDX;1y?^}FQ1q1i_=t7`&x9Z9RMyvGrj;y#Lu5r1wkz>Er^)YU8Z1sU7ej`Kshza z8_RRUBzXF6-`L0qsVY%#fBY-ZciXmYP`$)OL?B(SfidDaB3UJsz7tU10P~UC7^Kfa zP8c381p5Wqh7d6`(in5YMN(L}?ZXFaux-=}BnACrpy-s_w}0#Dsqt8%Q7!HH_U+k| zCj&gzHa2#ipP#75j5epvOigKuMaRdx4ZPkm5gUkIiFm(XCrQF@>>-lb_ugJ0Tvk@r z%+}pyqo85XgQBh<5*J^3?YFhiqG_eTEi^g#d))fINH%$t4khjEzG|N25FCRaBx{j#9dWMFF7vragFQ>?Pm4lt0 z&(a(G^@YkmGcWIb&C%0rr46k!>vxNaM37)nXJRkKR7><&`vX4aHklc!Kt==a)@Y=pj>+u!GBGtB<3e)-*RkoKzW#^a#T z!GkyU@X$tcu$pUM-~v?rw*1|f{f^M!aEC%@?ku>O4Fq)L+L03;7mC`PoXiB|ZuUyp zD_V!%uq$P-wX)JLxxUY8jv@Gfuq65@V`SuP08?b-Mkh&<9+3PhQl4br$G7K`M`Ax$ z0xw}-!5Ih~l$61_ck+I2KbKZd%GuT-%bB(R0PtMA&WyrMVR2oGfnU&oRYPEl@q_PNw zQ>Q{gLp3g4y3|u!VbnDv*PV_o3-Ft%X@50e9qFPp29-J+fBz)41E@sE7EzNfO9m=8 zN$^Z%$ji)Zfc7|<6B`qA*1#YnPO8ZA7f)U0t?y3X1NQ^c1l~%whKls>cf1105}R_t zSC*N(XIcPdS8*;;5xQDi<6HQ&G&F1wK(1M=Ekj;E?oIP~`!me&ac=YeZ`bRm0lAP# zae!GsxZ|;u9kOP}8VlsKeNoeupYN ziNjR-)&G80RhR-09^~J)ry4mqIryE#`}Y@eR%;!s=7eS#w2(E`)Rvd$IE#-6_L#1< zXXv0b;)}~oX+)vEkGYd3zi6!HOk`ySSV?P1qC(SLr;Uw&{rrjZYxs$uU`S2>^5O$jE8W|zuQWp|%E~fdyr5wbn*!;iP<*M+@7kr~Vp8f=E`T+3 zUw-{R51*_#fS|yWgGK@ZLnDLm)Y;jIVu=*`OLv6TKt@VxWvSl>%3Xi{6-q`MI~|>7 zputFh3rH!8B2y!L_jNxi=H-%TTW1Sr5z&n4>b14#ek;-v)zbVaT#ag?mq+E9lac%ruc=d38C znbJdJF)p@#aQANG3!dYmqN2!OU0tO`MKVqk=Wtb9q%q{MUWa*LxZbSoYKIln7)Sxfj~_RDWzQYV`kpO3Jp9kXLT9eA2eg{y zWmju+xw`SQXm_`Y zbh~**;?%hq02ep0c*<+j2d1?~JIw*h1j9#r&9yg6V#1x1%p$a$vs)w1e5$P-REy~r z?;ccFnkFPkF32o!*xH*d&;!%7dmzi=uzQ2D=JfE)wp(vWFN zEt;4a8RMYZ4vJG$xy=ItnfI32u{!kB)#TJO?d6HNTgnDSGmW9SscFBQXW64iko;vt z3%a>6JGZPab#DbEN?E>2Mdx=tgjz)nfL%5@yBJWndFF}HIv9a^=^0Kp=L(l81!ui+G*ch_% z-)c9MjjA6)Y->LSq1#l1iWL2e&!4v`(1Xl1sVaB>V~sn7b}4LD`{~n^VKMX4gBhvX z{_$r1{^gd1nxTOMYq?wm=bt721RNC@r%f}GU*%Cd?IX{CmD@3xQre?4Z30@`#?@4zB}MluUN)zwi@ z`iVq#S_urK5C2Wx7duy6j*Upq$Ozti8hhh0W0S5(b8YRh6d#zFJg-D)e~gxY zClHTTj7Ilnla21PJfl}_9UVooI!4P^6#%0Fm>@7g^nw)2IX46i9%95h+fN*u+wC13 zpk8%9VgTquGnP4+!NtKrnUG^xN>e1!NTjQZMOHGA78&@bfu;ph0iI{$ywO!pEmu%~QfhznEtv zOrfY*CQMy_oNQAtA3plsN=|EZRledDD5!jh@pWMzA0PY6)(SD(&P>@qHojJr74DqV zm@D2L&a>0H=u$|a$hRhl)9XEGgWL93dy!zv(u`@jV`E!eL9y4lhQLJ77}OI~x+fFA z8sv^3t+KOULM1@qqo|kj*_av`aU5xg2EIQ*jfj*ny zXOU9d4JspPSj%=%0OA0lh}-swh>7uJoD2^OgSfl0Ja;96sv*~j+^ zM==l(5J;8v=zJQk^rI?RK~3!rB*(v8L8hhGP=pag=tez!`1R3__ZvVBD0p70ix&+I zS65fh_D6INZ4BX;SW=24guG#&U|~rVFf5VrUW03cWntj71HwG7Pe{ns&wtb3U&E(lyDI(DqEnCVEl`a_|wr67&R5o91^v zT4gm@Tm01n{cjW*rK>CBh^t`x5DpIdosGrv{_yEQ2Te{kzFb?= zcdV~}i=FLeXh;Z2(1h@XQ-J)8QvgPGR&?P)#pm>TL%!zpdccC&M@An)dQI+UL;QXI z{BmJ8g<=uY<2S8ZEkmpd16No`7KtsCH2+fa%Hb`xwzk4X`Z_u@b$97g<$b0z_*X8L z+I}y8nw4dP%>w~tV>2~1-OM4Y)(OSIup4iC3S4a1x2lQs+<1>0^zZ#Kv9$V{Klglp z-yp?@7@NdD7unB93J9@CgR`q%pocQDvS`Jwa^CUo97{@KH8eB?pFkVLbLoyxFoR`b zH{w|({9XHMn05wd0E3_r)^o@F(E60^Bk6K*CFw)TEdQ`+^~u+bjq0YRY%{!7X7wQ; zZr<%~1%0|Nq3g@@thSk5DZh+^;d z`c)H(l_YT%O*klFSzJP z6^O!SGjmUo#FS8r$QUeEzHfKgn?KmB$%E*{~#%8 zZTh=(#QBW+`g$ZpNcbIZk{<*WCnleyo2bQ!c>4fxOZiSe!!N`0P9m4vAyJzEe3b?sf=$T!^nfTOR{@ zn_F0Ne|uaHWf!so#kOs*l}Ke7X9gQ$*~dDg1HJz(R&^@Yea5nDrdd-%gPwt*v$b`w zGxlAGNlcI zbGCjyJdsYP*}pSyX&K6i_VfIgMK;02DmNp%f<01VV|k7od6AxO2LTgMP1fx<7hn`P z2`A_6db8*+rO)dB{P}}5L-kdPMX?nUviQE|&sLhU8! zNcik1;~)y6RWufnAzy)q1fW4!5Q=%hHCK{-)>n$*Nwl`u$-obSc5rf3SOB6%iG{3+ zqtyDla2E48jx7`hq|WF`{wONaLHOB)bFefyIHNy?O@%#3(zdU%UaJJ<8R`f!YR8u^ z(N0(&bd277{MaL7Vx+8m1!g7)|K__W6bD@Ap!Jk62~|T>x*4kb3T7%O`waa0Egj?a zP~qCYeDT^?ll*d7ZL8lXt|e|sF8MFGH%RHwr-odr#fKpjq(QIk6B<+9*TpW{p#fZP z_Nt;H@!>-mx8DK$>ckT;R=^;E2J0ryxAg|t0*)Nq8AiIgicPdTcfw&64-=fIQnEoB z=QzWXF3GRiIlO7n(beVhL_nfco`_XqQ`xsdAU*c77naJEX$(IdP9L-l)kUKpsZ{% zb4bwqTTLI*YStW^nLdCetLTZewWTduEtbO9-nI}vz7o`jcEhx?MNP|lN! z(sTMWu^6@o_RsG6_x5@rfR&uI$nUT}0&_4Pkp zrUZ_MjGIBVL62_GVPS<+kT=k$RgFAgTy_g-7`o^#d`SZ?oFc2;ufpZINQX^~9A7vl zBGUWv^6jcB5_X0s%iiApp{B)0pVv`6mvN8MVZLT z3=9m;o^^l(Nkc;ep&Z?U%@vIx+WkCOqPK)}|2(3arY1_4BYM2kHlt9*M@M1ps?UG^ z_kt94u%7}S7G#r=I<(#$F$UjX*uLZF!g`#ztne78*^_MxJQUDcVR|_T71iQ{;j1q` z4q{ewwkq3svEyVE)uE^okV_aLnRm6cEX(aDvqVO0(ICJv1AEpnF|oypn?bkQYDfo) zk!G2Ug0y17=8~_R#ui_4Afj`IV!5EfLAV+ z8=cm7A|jj}9X;1qoNTsXTUqz-ha~XDU`xY{Eyc=X68|+u1FJ4@Nok!zaEqTd7dsCR z{K<>1{hfXVt=hf40yeND4!=KZv*nP&ouoAzh{=s zwhCrsC=(d7o@0BrKsHc(Hfs?b3U+NpjK7siTGY2os4Z;U}6I}T70|e zp;}IDP|3Nl^79p*@wmk&1%lnD(Btu+kjPMJ{Mq5Ul>J$mGSg*>sz zBF4@P1ra_t2=60z;brIKREDy#JUgiG2}9Ngpx|xWw{627!5#;b?EQMPFI`>Y{muAY zoQKk7L3f;*>{riCzI1kC!;Ujiqubumajr6&*=+@2_IV)suxR9vQtB~*PbxOmiI4$OV&YcEWan$xuD8hCaqQaS6t7=DSR}MV@?N_(< z4tMtNj8qGp0^YEY=s)Y;t3)|LL0*;W3qL#5?$sgL@(fP|$=MN)m)}PXlA0{!-50E| z{iu~KU0q9m{y5p&548-z0)pg7QpPQt5@76c0$Dlpiieliw!45E-4Do_;E&1B6CjrV z`t=K#pWqMk;c*d>k>TN(*jNAyG<%$ljgvDn#*h+VxF>lKV1%2Uoy|n#7#gCH>jlb< zreVj|dlM7Z!1o~Sa`4GXif7jg@bhQ>P6!K7B!IVxiijAM-5P|W1Mn882X|ZM`Bzwx zh($u01%!d83YIq$eB_A}6nc&L+@7LqF%T~P)DA#xTxHII0SG7x?h`FFwbz2!CrV06 zSR_BE%0reEftenic{oww9(uR!>vd<~7zD-Gr}%l?^Yxw*0Un;9J-zT$Lt}tRa0e}| z_|c;;OG>66jjxT8ab)xm78nIKn&mgaLjHKylO2F?-g1&+JM95hI=Z$SOP$qyM60=K zIsg7a9|r+%xD^pP0a0kD!yNq65j%K9$qH_>vJK#@2&QA?9HcyMSpl_zX1`Rxj~TSm zcPjyl$*;}c#+(sKvXchgxaX*GeF(tauQgS6cu#>wxQn6DJYm*Q1BZMWqyV3l+M6(~04`D=ROe&y7 z+qpsly6L25@TpTfI2K@2L`shNrQ|P7SlB55#wKswktw+1A8bvs$?#F&_nGPG-|k1*l~J$F8Vg!~sAK;Xzb-_wL)cIDBs9MXbb~BC=y!79iiJmH!@Oz8(2lJzyOT1iMGVq#%4MS^2(sC7NLI3^}j4pF%`NJd7@z*s%@a=oK zQ@*RkuG-q99_C7j9+^C8Q_hgXlWv1T$5v(PlFs>M@sq1(1f_-1_ctwFAlReJuw-55!LhvhRDgb#`=oLgy$owg3C~s*}FZ5ETgs z6U@|r_9?>I2FqTv0w@Y41qF=na2&eMnXRGqnpjhp4XCo4qsVRE!n$}_as=&G3dOJ8 z-5ddMKZRYjQ&HL8x3Nt+s8}Lp@!fd{H}@Ro!D2dES_a0(mKGN`gzc&^^bpWOnqRnq z>sF%9= zx7ml_U*366Uf;hS>$SEbqHPowAk{`z`+LTSPCov zQvd-NkzmB3Us9As!4cZdf|W#RZ+ zhE3t*i4)V`D^zoK2^kl-E zAZDJ&V&QNOlEad7l5pee%R%tDhl8l}AVRy9z@MHlm{vFo6mM5^*tbQnYY0h7LOaX$ z+O}B+wE1#5U%!73BW?ZF(%;%MXaZ`hep}_^Dt1L+CpMw?Sb{16box96(kc~4(Utc! z{_MA21_MtcQPYNFNK6Qs4{D3u(1|mlEc^CFAL9b_!nuCJK$>4$EtW`Zk^`~sV-AF{ zreF=}%Kk(A1g|0y)*l@mAvBi$^BKs4SYEWY%+=3?ZX%^g;9K-Nmk^Rs^{A!0c0Fw+ z73QqW%uD(DIOi5enOrBB9m*WX=>#K-%h0FKYm`)ReG5U3yK1(F>W25o7gmmuop~Z!=QyO)PeWn?B&KOLCfDf}cV^H)#wD?n}Xn zM3Sst-jEt%R<6~pNL}3w;x}JxablA>O1j2)UAF>beYyb%8fek*sfQBWYW_&GM_lG8e?%@1LbkPe&385>`bxZMK=0-r4k z#czD0m{}OFu%?osBsV^F31)|p9Y+N#a$HW4o`1)?>hn}Em51$!5JSmNUo>k<5H%0m zL9?qLV-v*+=(XkK2=ukq$Ql?aDGdQ3@ME&?0Lk|F;r)9k8>-tMVB%@uX)GLD`!S;V z>=}=@I`PXE;qcjK7|rn|l+kdSF)xm8(#U%&jCY^2o?|Lh;v0k>Maf z3%VN^N^g`^Pio?rH$(}p3kH86rQ!+-^Q%`;3mfXimuQ@K6}eJwS*&kY7l;ra2E|%r zY|I23g)y`@86*wP=6eQf5W&D@&B1i7tE`+NbMsBg2y=tT4I0z2V*l#I7e0UXuh$ph z7lF+Ub51YymlhTvCUNg1l4e7W!!{@+T{SSauVsi!Ur_s22I+ds-BmL?w#~AVaskgJ zjD^}ZS^b*C8rYbZNyrNc(b`G}G3sFk0HON5;!L6oSmFR`?%`5x)^l=0PowZiu%1*1tcUeN2ibKj8v0% z7oD>E=o>IFAm@l3UV?s)`g51$MXs0TEfG5ijsCq3`ACub{5>p)&-x!mrJqQeBdrj7 z)_#8!a_xVMoCg=-cH7k(SFR{0o6*9NT2s{wb*`-Jp^O(Ai3Epmgt6;#3KH znV)|QUIL6t{rGVe$>hr^bf^0ot^%B~h+QWQRY{j2wF8NUuoGAr`WMeqc8hSW9NIG7 zF@%j=&M(NS`IzoaDnf!=;00tb?dnpU8BLx9!T)4+}A~ z{Le#=EGKU_R0k=#AuSZD0%`<=sn+oYA@Xw=O8fHSJbGI7>)|0GZLO{OXtc1ogY&@g z56|taAU9Gwg!#u%RWM2i<^kdzCtxUskyMx(Fp#9DSAuE^R~dNYz1^JnakQog>HCgb zL?sH8-06D%9QNKhaaT^uSGsr^H#qB+KJ$X&-wC|Q{t_~5r`YA6?JkQE z(wN{Krd~DL#m|t1Dg>FS8<|>phYUUQzXeA@aYZ!)VJm z$s&n~6x6C4eU%rrwR6MW2TrqbL#uMeyg}#9=yfr+BG;Pz?ms0UFn-s>oh+lxG+4D{ z`rrg0I!OI@&*xq?4yYDLJi#c&|jNvL*jxsF^>>W7_ zNI|{*wswZJq@=9Z$~n~Vk9Oe503c{=!un4FPIx~8NIYnOYrFee!geDnxBO@-w7tLT z#BlZU(ot_8MjNKz-OJv~tz}47x(-KHc2Z%+Ho4vmSaV_CbuYDFy;-qkr9MAHOk;pX zmTY$UE9%l~cKT)A+J7EnEX?$JXA`5*Y9gpO%i&u+-G`0PqM7_?askbs^!9P^9)z7F z&NnWUoRoz2C61mfhFtNaaFwHXh^ar2U1S`z#$oDAk@xXNeTF=Pk4!vn8G$Y*$WdO+ z#t}RR>I*yjQKT}GNb&dYI3_9Lj^`Pce(vaSL>R#6&|h#h6dDRb*@N zX4}`h!B?1ip8`_OR%7^?M@FE#oW<3RjHYI0*qE75eVo z-j`bFTNvCyM(eq^>!digb#!=`e&0Uz57U@Uk(8E(xH2(03A-t9T##o4 zvG~p66BcG>1Rcm6esLOG>%WQP$XbkLhgb~ z9zNh6i2R`K#>V?E!Zyu+=+GUhY0N!BGH_p><=~IuKI~-dpH<`v(J4G!i`M(`QqD8n zdbbm!9;J;oEP>PF85>B+$a?60NxS`i5*euj%P9m%K&(>CoI`>_6Yy7mO@CcoK%==y z*{#dKQ{bB*{MjVaz+ITI*GcX*t%N=BEdB`BMWyzc8>)x4G}mDEfDH%+GaBd4iMUJ~ zL56|&4>4NsLRd614eO7dM)IHrl)$?n45Rh^2M%dqaS+q3Nzm0aOo)Qyaaz& zJP$2xGmaS6!*GEYQfJMcm`?L$+lyz;*rQ(NXqCBocwm4GV?0-`yq(*Th@e9YO6>e% z&8A&4%2f;qf^^0uOmZTY@!vHO%+>coN>Ja#a0kW>>+9;!Id0VCiMe+Dy5{3nK&O}( z41wa7Upb7mS&0Bp`?JGvi?{?3+N}hO9!7kqw{PWmf~80`X`t_khkDS`+4-#13e3;z z>UT9*fdI&6FK}Vr63`H{7D{Ru+-YmOH+%-~V32m2xDV}2NeyHajuA+89CgjjHP_mC ze(yR3gHPR648v55HN1LBf=vAU*~v2LUzc_d91$=%f4&$^HSgRb-}=2UvDN1``S-U{ zFhEdg4JRx2`>=fw9Ty?IpfKR3a61?azjODlR)R=lZ?DYp7 zpL`cnS<#Q?F>X52;UTRvvth>1@Ug!Bq=JI4c7~At%hzw;4ntG}i#LFI6vR!*3dePX zMHU@#)D%#)amN)5V!|Ck@-Yp*34||gsOu%#YK)uAm;#hQ-34i4AA=E`1-w<|$NRXxwFmt@o=B>OLY19p$!~m*86u>kxr2lOtjx&qBrPrK z-aUKhQ@dEiaLrMO8JML&zMuo}hWQDKIH|KQV1RY11$ksAO-9AsyZ1~d^#BVC&cBVN zC0Z>i+mqnl8yOpmME~Wr?-o)4@LYb00ajpAE0KhdkPmUCBEzXy5h1AUB^p&Xd@Mda zY~8s@bnoPb7os_}-VFZw-yg$-UiotT^E{Ty3JGEi27~nW{xR$XhS0qS4&ap|M+2g& ztL0RCmB26|X`zn8tDCHyvBT7#9rSDC-wQloL{sA?&FBH)vIjs-%>0}4G+y%=*rJfo z3}h6nGStS+@pfLLhmGdB2E{u#%z;mX0x2jd@xcE&ibdGv=!9jQRs=ONIg+BOl2ys| zZhxWyIIEMCJeVhx-xCCQb99FV4d%l?p!Yg7|f!h^IjRx5Q>>byK*G$^rW9-2Hxo-P>sook{ZXsLl1n> zd;`pu{&8v|`xLsTsyy|(l|afqHZ|3s?YO;t7sMxf7nh~kS%kfvlM^xu^^P6j7~SZ+ zW@K0z8-E99gSwmW@ZlZew}Pu078awBBGIvP`q{#PWCr{V@Lm4uRd-JhD2auoC8kf& z@FTsGz_hxzy`3}x0!a}ULUDjp0N?|ycX{W75azb3_}56hgEm3KI!r|plus>$(h-zr3;P`vP>I44~3LeKt;I{v~>w$rharhHSRA_WX zY(p@@aZ2);`g$y&1tCm2;nvn@PWuyoFD>zAy}646j!8c}PKa`f{hs0F<)QkWFxUd6 zz&Hgkg;y|POrt;(Eh`j!^h&QY-v9!}ufdNm>G+fMLIeB^b{=5Ak>Mggrq@~k5THSv zBH|Seu@IwcYBnJo>49p(HO!i9df@^i6O+~T>uY1FK7z*O9j&c%iR5$m!QDzeYjdje z@3G)`(bCQ>Tl|pI2ULY+>gaj3acsC&1L+~YVLO0oFc3+hSn2-f6wsiq?lC#Jl*e2f zDkVilYtP15BTfxm=^?oZECO48RD*c#mv%1ly6ZUKil@Qr03sIPpqN8qbY&xTn1DdI zHDaLzufp%`;UO(84LLwFLF6zy`v4vWeF5NCG^99ER8s+$fk;v0t1&qOvj~V1@^LTB z-onDa;Sx6Gslj$5Ww@btjXZ>rYuNbAko&M%C{s`~@eOb*VBQ7DdD3m$BuW!WCan!i z41Y+*mJr#b_B@iNMVvc(WZwK`%k*)j4l*&oi08@JHkh4_nPN%9c!*;7WM zZnAkVD;gQCh4yh19+j23j(&=V2M0$gUfebX#r!64G;l6Q02=Y(x9f2%b}NxyKoAv% zX9W9$$bCK1_DQP#PxQwzOGSDO3x~OljmCjpG&FD$-0&8<_uv6WRxqQXNWkk1Vn&d+ z0t2@xHGKb`{BPC{9}o1*>hU-&&DX0Bi230|CMAOEUA$lc4GLav?&x17(dgAMOWJec zH8Z89E}`|X8(uLp0}EFmo&cVM|EM}3hz%oe^>4bnyMgHH2X#g&UCqo6stzJvIRnr> z?ntpb8sRW_g=E^c-3aciu@?~$`R2xGHOBoV+6<3_4*KK(SBLW9bAAT%=h_}@2*)sysYR?`naRo4TOc%a$(Fq{-o!utgi0Q(u z2XSIiOUDKV*x}pAnz$r1urN*XsQgV8u$mjyESI8e)}QGv48ESpNg6+d)_O1i!J?(d z#LB9f(f&T1=p+_x^jd%IsT}w+#Lk?;V*E2E#g3QK{2@$Vy;M`dni;F6c0h%1m_K+4J<0I{%E z9$;k+>)Am=^G>%F6$s^D=Xt6mi7zhBL!ek9;d`Lb{zpE!mMRzm>Bls5XeMW z7~bR5hwOu6;W<=C)mwxL71N0H&CSNvA3#OlV9NDSbM#xW&A4MZsGuSdsTe&!b|p1E zJ!b%IjJxB6qCbcwhxH7wfK-cgby2$OqUC>4U39}oZOFMVPVJ+r!6Y_z<3;OiJI%%e zA78vVhO8dR>zM>;X(6Cv7e$0Bz ztd7JX$ln9`{`we^Z+;_(8%}(Ve~!Jmxnb4pN`TzA>0`6k`BG*VmzGoscmyH^UexA= z%!rx1!3POYRgjsu7#|ksXT!0$2D0ONoam`sTLT*J7L(*++jPv@8^Z|UDytY)0k)#@ zcLfhe$(5J)3Eimx_ZQ&NsmHCbuKDu586F-++1Q-loT_p$+M`}1X7rYt`Wk^;neKGs zp&kC&OvhCBY<=WQv8~JZ;e)iyhu=kW%Cqj(7v-k;hEVN3sd*?(jZQJ@=t$U;_>Hm- zm(@k-ty>AyV@1Z;YocR$?u6hpW*yT{Bdm^610-Nvng7A5D(7F! zMK9qX#&ivLv>K+u-ie||2g-3k#ELlmFd%j46Gl?Ox6Y}nkAo~PccU@1Z{3y|uj+#C znfU!0ENys`MJ_&$m-qeOyIXBTEz>L|@18h=H=DJ$vxr)E+}X_u?!)m0&7&j}L07~3 z<5J{zLN_0c_{LeUAJlj<_=H@DvM;>g(4HOPDz{sU%kvF8_SzB^jFQ@8*#$q}Rga8? zy$+1h5SbIywk$38*4${|!>CYX{e8~MKRz<5i9>^vFMR?S4=)!y)iR^(pX*7sN0d3Z zJV11xJ{84#FffCXL_f@2lHm8z>6um{=E3iSAl$!C(WPgguRkEih3bZcgUA^#3+WdHd11u zqSBB(Fr|fF=Ir2G5H8S`z@VTAR!O?e6R&v^ejSyPGQjomPJ^F%jsP1?u_9;$p-jGA zmV{gfcnXCJHv*T&mC4}wS+G*Paf~CT5lkD!3&X}}m6A4D+Ib4C2RnJz&q0|_3`t8a zUb1l^t^gO*_8P9h%jYU8DuRRGW9Pvy&;W%270lx7nKJ_)PJ+w>Clu`s&idl91e#v~V#)Cs> zKA{uG8Lj4eE*9rY@&6$2y#IRa`~QD5R7horgO!|Jm(F2C6)zYVV$H08paeyyYUtd2x z*1Bky))KJW1q((%7i!g&P1@yPm+XgBBV+w6j0&u*#4`R5i1USlyduY^Z{o+o9&uCC zd--N~4_Es-`uTp0(Re$>E(SG0a`P?^9X4#*k&)dMM)&JSZQed84eN>CiId;G904qM zZt-OW9dN(>yBlI^O`i-2G#B%!r&;a(QMC+$X;R!dI+QECN=__hb_xm-b3Xpfwe|Qt zs?qh;7QZ=ON7%gnGpYP;U3vo$8fH{N?ljD<~oID>2TWDze zPz$wD8;8oT&a*Srj@Sx5oj4(WFv*?Fws7GyrartO{=kxyrGYf&eg8Fcskmrl@`kS%mYBUJ5j?y*0g*^go3bPQGsmpNsV!kJzNti=;PM?41*?L z>Cp1?CzdNrQW9)4-8WeJpUrFP8W(k!CK+U;@4TW+Z+rWm-R3P>;<9@6jiSO%s0|u= zkv8MX-rxSXf*^z&Xl2>n)?dHcAa60i^D6ief8xaQ2d8IHv{0rxuiJtBV(%`i86I*X zIohb)qy^kAC3b0qrmtDG%6GlG{yZGxE;8~aa)b`4^Ioy<{c33?mHP7!>(alyc=2LH zTcXnoA2EEG4Rz^oSN-OCep-X!Kfqwa!zJeCaRIx=%jc7H$`(abbCww1&^~0}+e@Xu zH~dYt{uOXP7cAiozRKWqNYcHN8`@=_W^4=4sk8c1`=p%Zj_qhmqX7g_``-mZ6npWw!j7!~u94HKY zKL9*Gc=QOlo?6j{ZCCYO*NWBR^L)+vT4EiL0YF%D?~OQ4U=MVC`C!j9zc1Am`bYNe zjYF>4vuCc+1|KkYey`VE#pQ671cAnsd}iDI5X~QdNJg+L+1LMWn8rfUDk5!FqiPVh z1e>WDXJ#8eRdkU8FWV_x@1vrzUPGdw@ac}v*G8!uIjTAs9#5-F=IWc6n&Kn%o>Tm{ z@<-;;Ztm{SpeI3vQy?fh2khT&a5-3q9;UL$ zv39#SKuq=T&b93jc;7kSIZ3;3UlmPFtJy^r6-UFmrD5rXg`j(kMv2`TrOl62 zgGjlAZ-$y~L49GL=#PCvx20v^j6fKB|pa zhhuPA`Rs5!cg*>W`?B#&&^$WMW{rRw%b64$F^@%J&j;p^R?Ys3@Tg%dpm9ezIg||M zR!5_wH=~JS;FBfUI3?FWU>qU%zJ0oR^Cl&{(LgcklLoIS>E^u&uU7Nk^a@R1-_L6H z&t00L)2kPvI6PMqO-IU1)gz^5thm zMWS18XWn&YsuG^(Hw)Jngs5p_sevN>QaJ| zgESwus-w~K;PF3vB6jS!1(A$qMr@Pw&oVPxyJ{6rV?h7@pi**_e)a zY1ndq#p2>(S>f2}(}#{6S&UcbEBjYRdU_8#)cEaNVENZeA7;71KNN(zMsr6Su!8lU z=4aeivd#TLrPlnK{#x3t`qY^-?XQjy1h~{=KfR{oAx29H7*0K4;_&d{I&LJC)81X$ zCx&htMSl}*p@YMuYQ+$_`fY_vbG!c}e7$atM=(E|YnT zR6Wyi)P}!O5zNtX1YudThHusWU_H!ki6WKwd#m_6Ec(M*bM5u+ZQ*$?|3xJGUAp+| zzqs3%{{0Ja96O(8Pt(L6M>1i=wjQDpOkRFtFL4YT!-*g+Q~SUNSpc081=*7G-{4JP z$Gx)m>Y?~jl`&(-(Wd>luU0W8{E?*Oau5$P665`}t1B^$^_$u!Dl)Qa&9SLsiR7IV z-#tdP68}Jxnt^z@WukG>TX5kucn^_-{)IAW?fQDkGjYTPgr&k56qKjcr}WJMr!{N* zTY7q#-}`=6t$X**M?a|sQ3+OAdOTYLSMi#1%X{uN&&BCs{k_lYGn@Ha_^LP{HhS+P zeT=tleW%}{x;nbex}b2xp!e_h0wCYO`1j+-d~09TAV$@{X{vBv!3np=gh|wrx3f4c zAIZI4`%Jaw|DQ7_@Eu?pq?3;|HO)w=TC2pvNNx6Hn@2YaH|oWqhK4W(0W?!nQYfr~ zY>s=(RY1;I_8!NjXj?oP`P#D>J@fQ4R%OX5hpqemX#u$nI&qB=6Sy3{FF+eq=IV!b zeehJe@DiJuv{^I*$kh)*?4flDpAbO}8W9m?>g5a}MDv6$A~Hrh04|P+rgvRl=H`wa zH|`a!vE!&^s&khtsek{TSy?ExGl zzJZ*ALQvNyn08)BPPU6u-H4qjpa?U<%CnC;_nH87C9$NUySh65=}t?R=DjV>JN1DC z10#KUd>MlwL>(YVl;JSQm`O3bNWmsNZWaykQLu;vMg{z}O;1%#JZp$iA@dCN^coM| zHvA74;5O4PzDjfTLZeWKEp*0*z=~}~n0!*EjA$EC{=&tk_DM>>m+mDS&P7H=jg#X9 zi5^2=Ri;m!y3Ixk`_7yVUxF^`*-WO9NH6ZD(zWZdmTS*O`Ym6z>iVw>(cRdFk)VjG-Rc2+tye*u z1p%16_Doh5FBE%< zBgsww80>tCYvQ=mmd@z;|JK*L_RkK0dkzxZ7SAIQwdIENuV5M{)TQ+Yd zOQFM_8oeo~Jcq%s2##&d)J-H7bHn{cjCMT~Q44>=P0zs2j!1;MbBO>Y66^ivrYb>*dHupc|r(guX*nZ%|;1~X6 zYNrM7Bo-#d#oh0my1-QHPdTtnR+prV zktuT_Tkj!?4=Q!48HkCU>!z=+XC7UNr+hyV8!O@U>(ioXCIf$g<`I~`G&HRGI4Aa^ z#`<}`Dl6>(?-(uDeNg%~&O&f&JZe<&E3HaArs0yPpi7^K4fMfyodKe1hP1Tr479~) z&|5p_XiaQ<6ucf0Sc6CGXe#~f(sSqcV<;L63)?k)uRAdM%E<`iEpVvX3YJxRS{^;! zRh=@fMJuW1LkLv&XU?;aqXuYhR7ji|Trs@r*|a_p3usUQ#TPFwecLytUCI!qDMeZuJ5?Y40)x@D@NAFRO*&5_vr|GA1!6e&u<&a^}&d z_`~xYejmQOPI~*2xgJ(y;&#f*K76lDE0DhCuO|7-BYy90Hw8gBOwHU@lYwazQ83hPdO{?VfYXV z$tU|f-Q6XHONE7`_-mPJp|i9y;!}3+R7g}TaUDziEwzyoKe}~$bD^iNQcZi}{=22e zWWSz)N#Y*4pB7`U(`493BoRTTq2C2T34AV}k+84x6yY&4Nt?7TK%g z=HJQHgQpTK6A;H>sA}ahM{{me>05cPx3{_*2Us1yhbk&;EyNR?_bF9pE?5w%(q#y7 z-%$R~7w}yS>&Yln@CB$!P8js2w2+Sd>1^F8ec$pygfZ5x9meZA%4u_0Jna4)mW^@H zGtK~oGXp4VA62*%5Re<__1a(wqAMWEn;UyHNqg3Q|3UwuKlbM{r_z&>VTJH*6UZq) zeY%!Uw9+3{8BgKGSg55Su!T^8ADV36fCh=UsS`yM?smW9`EBFuFnf5evLw&+Jj_y> zm;nO-+vjQ6+G=&~EYbAq=NS7@5jJqW8(r=?mP1*()qf3RuYxt0XfSn3Rtq%8?|33M zh+00aDI{0^Fk>UiO@M7jX6%d*Ix(O~9vdK&oA7L-e;9-yxEFO5Ic=gZg#8-u@f4r7 zt%{1f#36&}`diPRtLsa>Q8yT1KaL|<{p+9jd%vrgRnpSZXe%8${+wZLUHRd|z+IdckI7G&g8XibN-r_s&-n|nCnGianqi%k^ zB6-^?@{`284HWCOqqVWgXmqX zT6bL=Npo@NtHop}l^{!e=f+iF?-G-#`R~;^oL0G zJ^91xEdUkDdJCnG3f(#c);K)Ti|Z~Q1bGcB7@j0P@ePT(g+)coD3vZRVXX^Awx`7b z#BuwlV3g_j_`&)U>FYl-EnKsDHN9Gjp2M2-p67QTIDo^rF)iBq^mes&!Kc;4f@Wv= zN5A<{(9gU$)A;$bJL73U1PzTC>byFi1j<}UV@JkL*4aZRA3EUSg9kW^bomRHM5(Bw zlj9|`9G_hZy5(i3B`a8eB=)Jf=p8~A!?}`73A=|>kV5(thEF~O1dKzDy0$nUI z#i6Y6*wW>LK}Q%K#kTNvOo`A;Z6JyrUS^W*-B=Ci7`;_)YM(D$H-cmMu3b#0b6bKp z#Y2llwF;wwOb2p?Y>okkSuBM#%n6R?+I2fKsTxL){!Lm0-^nnY!eSVH9`?gj#v&PE zsc;%UJ9;N_G)!6dQqhbP7?>4I9J|!invl~Y97eM_fI0ZxyRJ0Hf-i|s<8g;Ncg0`V zAta!b1HPpo3Z0#C^{S@i&END~CWOkuwes>F zV|b8X>5+-w$h~PcV^$4b_@4Y>h5{5o*FWy^ZKoL)SHW8biSxr4*2WiC+brcDc+ z_Zk$9NzAqBz}$R!xInLI{|m}@Ow$P~dnO&HEUw`WrCxZHfhzZrbe=qKHEUI`JV zKz8kn8J(-EYyH2Un?u}gmi624r+E(Ta=nmDPoF`Xd~EIZy?bZ6x*E=~wX=g+`AMYk z<>6T~WXMJ4in*h5X!X&kY^6kHvLu(*n|C7)j65d6Ze!y04!ge!blEr)EuS9>o36GafZplu8Haz#*hT1^F6;t=uw!KWhRGi~MPa*hYd zZ)&LY<4^>ev*87fAB^U}Q@tTE(;@&5fS)p^p@bKa`rqC7P7qPB_Eq}&OLc_%a!ADG zp6wOP&vjQ0d-MK%d*MlrkI$d^=d2ksZj_c54Xl9d2yDP#<>BSUd>CIOamCD~O9k1# z6PM)h`L@E+!KDc%0CgTEGR%P7`R!DL#_F?8B>#QF3>%w{@vqx{ywmEJa_pEL^&?_f zoTsV(n5?{bq0uIvS5ycI{)<8viesheti9Oy?E{Whwm;SnA*^wfwT7&e&njWYjk=hv zJifW95Un8L0f!QbAZf+kxVrA+0R~IpJB(ezCqS2dHCVO@zM^oATy#&TbbZqJ;(^-w zzt5%kFR{|%Qq`ptnQl!d|1{p3rCvOPT~e$JIQ<&H*DlLkxCXZ0_|D+G2#RJjcd3^U zv|%DsxAQ<4^gL~K!HN(53>%8noW~o=kF$*qu~~AX7ojrXKcTYy>uR8NG9;D<(gH5p zuR*sQF90UB6P{e%V*2|M&is$bY0TZ(RdD1ZmQw-x;^>b8fJBKnR`6YM^FZ$EQsy`~ z8(#}P!s&pkS1I`u*>diU8D3sqf^gzG%{>?*0bh;fIq*K{%ozBCLK~$f>v@c#Xjz!m^-R;ZIFVQ#87X3_brrJ5FNO zBA=;BuNO)P^kztieLG>B32NL6ru4xF_;yj`!2_0iRBZT(+W{4D=G?hK5vNE=vI4Z= z4I4M&8AUQe;Cwv+USMVGMkJB88qzAETQRx2zPl%fwE1x%jj`Ea*@wvNneor#XUx6; zw*BncVGA8772Qpa5`y#kB@&x~MXp9-@%ZXX9VeBbv=ANYy~4l{d56*P4h2JS`I>F7 zK7HaphYZPY`TFhKUraS4ZUB(^o#Lc*+SzgI2H%gPxw$y)%C(SUe$jjN@7Ce5Ev~5xu`^lshM*m&qOM`8ImD-ueCgc7z$3wCG)=p*+*hNHmHw#$o6sPApw_ ztXdo`w@9l5gkXIz`t`o`+L@t56AP5PT;htAB_d6L(U*6&M^IM zJESkt$AiyYXAe)s^1*UucY-hOPxh*~IhhM)$eL3mqb~$zb^p2UNqPAz1rfx8*hDBQ zSP{a2R7QY3X|K8-s-+-AS<`-X2wb{iMWFo?=qD3)X(q7g^09MKaWQo|gG9DzRj#4L z#QtC<8_h(%*^!Z}zi&iUCN4^_vx{W3NsCVj<+*%-bbc~I3+mnuf&Rh!HZ)cT@=MI} z>fTp<{D@(rA^mvVkjq%s`1)Quzu=;w{1xv;9pT!82m4f4eddO_CgYcV;zYsSyU7U? zp$DsLM&0BzPVGbcBd=u;WY0sD5%^-uRNvOu@AAN##8tS)=qtoPliHoa_%M&U?veSY z?Rtt{DHvGvIRNN2t6w({k1u@El9DOj<14K;!$DWUx8m+yUoB}nmk7d^ep$BJzwZCc_HEFW)))kR*^q3X6>FZE;rWk6C3+9uDRFAgP0cjYBf zq%H_WOBES4)L(a$emUZ>O5eE0^F9OA4mZ5TU4kDE@nb!KjX@O!BBhVxy1Vx2+De+5 z`ntO91a{7Cgt3&KK0IE4i%@Bew ztn48B<}72+cH1P>f&DNvwdXhSJD}`1JL|KnF}@5I?#rx|ZZwmE@Q)EX8meZ5qpNk? zJQLos@+yv2thksz;+3VFnUR5GO2niSRD$_^UcP+EXxwqzH(FVmcWyhCfnn(}EKFt; zz$-xE%8p11HX04ME4qLG?YL~22Y2z;k(N=4-kQd)V%i}I%pS0g|8U(<1OJHuzuOuG z({1{X8O#JM>3e$i0NX_!-o2ufotxG>B%c0-jEOta#OLC8RS-y91)E%5T@MXj(P2l_ z0^T7z4x?3?zI=i29eh|x)@I(kiMF?d!+~|SQ?DF*vPcCa*4-N@y`YY}3&5a70 zBM%u5yZ^Lp>VgH4fq~;)!u`x+le?#p+^DNtskC}o-LX^s4&_ZLUlQ!EYqtC#`E%#b zL(E20U!bM;p8HOnV=>g^rf5fJnp)pyXV2}&{m0$=CJ$1)Ni{#2@}CBw{OQw#1s99( ze?i(=77&@x-lTPeG@DaM*}$S5w310;lrVxYY*;FBymCvmysE<(dh6Ra`?+cD=SPIW z*&d&c-Gzj}GE@^?-SHDA%GPZxAN}yXr%B3moWa?50)DYfl^RWA%WQ2GML9X&v1M~?x;!ukO~B3j!GmsFw~%Q@ zLdfDPR?S_(PbQNP&x&I!kBsoDQ)hPm)e0RKOrr)R!4T(*nmskOwfrF}qLu1Xy_OU3_L^j04Py~?Ev$8hxR$&Y9O^{s>TN_Qp zx^=Y2+o{oEDEHaWRL8H~U2!yI7pr*)_|#2Uj!yZsZOEOaDaZ16@u(Te(I!~TXXy~E ztd}pZ#_4v>Y)1Yf2n;%+v)%gpZNv!Fb4}cK%ix-BbT8?zq)rAWP7Q}E&)oRC&P;0J zURU3s+UG<$6Q!H`^*1oUVxj+x$?e(^0_CcgRZ|>6e1hrO+7^X(>y*vMJgTZ2uJldu z5w7vPLXVCeBp;wS%OnQp8mn%#(2^W)-Y7&ec4PVA6onEmCE&VHFSQ_hp!IV$_gQj* zEg@p_5T6Q%bD;`XLIll;?V1kaaJDTrnyb{1y{>AFxp9w9x~EQ_?Bq20Zrdih+1UgB z^19`_?)UE&7vUN+11=Q4BI9)S5SW;Rxi6gQ(ON*8!g;!89pri;;)#@szQQm+#etwu z1RdPph|2sMtb_46(l+^g$|(-Ao7P{(23UttjvT}+=JW(ANpN2Tpu{I=_*`wCG(ZP^ zVoiO$Vn7!*L3k}+-^yUPz7PKhL*&Mqs@}SPVwdLD_Xom#mnq zEfq9+0O-c1S+lxEtFT`6#_ijI&9Bo=@I5G#;@U6kx?Kw?MDD;NkN1);?Zyz_sa@>{ zN78y*=qu#p-$K||FL8A{798O>moO(!{SmXhc2VFHsS+<`-jC_3^D~CgVL~8z@zhj4 z-_UC3%}qlA)1UVFOMl7LTgt_wb>FK#py3}?22^*v#Nwv#Nq3jkKTGYHZ&;(27#llw$9{z^AL%p< zDDjz0&Two`>6K9VYfFj!hYp3ecYAPCo6VkeH?*6}R%{Bpye`l_fT zzOV(keJ+O_)CGQbK@>#fDF_;$KJBjGlkZy?aJ6f(+!vTkcgtdG+%#Fy!q#rqlw?d# z<6%O3Jn`&bpP0FG`{*E29QQA|SA>%RCFD1^AJ5ne2sZhJW%S`=d#!rHFDR}ZcD6k{ z^+wq(#q}2#AMGY946SdumiBGoh7BX!#`X=ecTM#7js$cGRd@r$gtSguT##f;^z7VW z^I}oPfe52u7Qii`pE(903Wda~fisuOzAGf}g-o9=pU>D+LSy=kS65$!0sIIMM{oHKS$#@8J4zzxWs()iYOp<9VRc=5<3>E@|D?$P z0bV|ssT&RphGgB|y`?8yDSPl>+ldZVA$XtEzRWf~shhjOd2{Ru@Qy(98M9_lKi(`Y zb$+>A_NOutVBEY>8F4W+21oYo8@lT5F{+m?uP$G!*}nS$RZ9MD5eRKzzA<<1BMvQf z2Vu{)_u3RtoPoQA$9-;2_)09!RwzpAR`T*1-d<7=%c^5^_D{ znWs*z1ZyNe(6zt29VOc<-?ci2jhw1Qd%kqD-7tboMSF$OTW-vLG`+~3qxbB=5m{ID zv0_}Oip`Z5M5->)a10CN*z$>KSi>2GWolD`Hx?ZJ4;R4F67+NTw7G1BVhhK`9;2Rr z9)UuA%E=P;QeE9Vf-Bvt*DG2R_=&{8yDqZ&z1O+Au6mn6Bh(O+%QC_dBYx1h!E*F> zTix){9lixaqqIlU2;8~jPm&LaLN`iEF2e_A5E^Q6+5Jt2&0(r+Bu3l0#OK#Tb(gDY zY06tWElyclNP#SxYS%pzg`&}m8WBP*i^q$?y?gIeqM6VjKNgGh_TcK zvpI8yp)X;_n5HN3rdtO%XX7SJ2(pUL4}9McA@-*f2o##!RB`O7d~_L5*Go2{?l|XU zXD0;w#bOir3)7Xupq}ar*N~sPY5)fS?-Oo9d&r=mk{6Ou?#{18J!{Q1Q-1CO&T|*D zZ)k@rk zdb_O}^+nZ`>PRxEeSVOHuyCC|Q7C@q8NnABHWEgvHr_U18Q7)hl;^Bd_2EN@_=u{l zuKb_3$I1f_NY2ZcGHFsPA_rF^THqz)#|KV1Y5vt!!_F`f$(A5sqRVYz%Ufk#okF%O z$YqeCmVyBJFYmandBu2c`Zro6Mp?a;qm^{wR3jz53b`D%bI_sd<;N#fnZf6fy2XUwd#;hMkjJ4m+_{y=_0~OWvJ9iY{nHUd-ZOLEf z1`Ke-{dUV*BAyq%1^{^w8NlzMteaqbwfQ{mUo|xBJGO84|8fd0iZ}u+KVOSi3n|`l z?OId&ylwDmS?BlHl08(Jz&4~dG?#$`S*9!M1sK{^_mQU=1MJl`F$0RvyK!SR5T0wx z5x)E@kJGnPy1lBdhL>dT;~eHlg+f4gQVdDa3XR>@N@$akN-g7G>-f zhqoxdvufxR@+#FjG2HdBhV2~Hi*G1>!C`V&4{UT~oW5(<9i9vBB~em-WvedH`!XMR z`uzE3Y)ybI2^`G@9ilBNkf-rmLGuW#RGZX)4Q_Mh%@ZRDRav^;7v%z%v~e%Y6hy0>(j9~j*yaG8hSnzg2p@4t zNq3Z`gH8)U_KZt_Hp)>L_MLi&e%0gKhdI^i)@#;$;FCk^gKtzha28`S+;YyGc@Nwd z6BC0xeAgx`boZ2WtZ1uJ^yBZB6oB_buUMu`o*0Z*pGf&3*qKNIiWCG7YubbbWS5FL z@!#sa=fh6CG2WxO{h?VJU~NVdJ?h4B<~0GYKRHn3M1S9(Fe0o_XS739`X*odJZ6!c zu#o*D7OkSP%DnY8zuo8PUgo;dau9~V{;s@!BaZ|?*9iDA89(rXo3oTI+y49b!=s*U=`p>nf=uvb;I%95DwJ9wa zokC8VOjW}YUmI~{?~LOUL^H$rnHM(z<^Y3{Kl5YOLbDJ3eOGLUwt^3ZVa#+Cm04K&Q$5Wzv&H8*V`1@--m`vBr7x_HEk95%2cHnaEdBdKHtr zg6zex$8@~ZlZ|G<38JDTe$fQoTJ2;=YMVD6dw8XTK^B>(K4`jqj~mQw-Cl$+mPmED zqnTFHuzPBs^78WZ73ok;3>ICs_}U-KZGX4T_94$HB0IP1{DlBY7U1|%l~@E^;)e>p zl!)aWesL!*uAX%K9wvh22SiN(E#dOD{t7nZ?GUzSY`TE1yTjwjIjqsGMsKi3ZM-{Fr?1S$?xgc<$1QTw@$6(1xE zhZcb8jvhEt7_!?xf0q=Gli3>ceWBD^ zH8aa)agjvAFp`eZ$Vuw|KH5qukkQBbPfC}Ej5K<{fDZY|q$L_zFOhV(O)%hRsSj`8 zFW}!NIdTF`)8d7#TL-R%g~>m37F^O_>vylR`=!DM+2H8C+xX98@m0FUAI@s~+);Dq zRJ59WmKZQb#T7a;DQA}$QFnDx z>=OL%UvJFAX`1ob_rV0-)a6e68Mg@E!T)(u%S6GFk;hIGbAI(_Kk-36Y0!52_m_P| zVVah%;v^?N-m!At!TisJXQ@d?-%Q2sJ(?e|2d$ zsrP+mdKg+i&k257cAR-|agc22xPNbnNJ-uFtmI3g53mFt-y9r&e@U5u8Fww)Z>LBQ zD>9fO-otlJePZA+C3c4NkLko(h9<3lmx#0|H_aZJy%nHTiX25(kyYt@yygCa>xEL1 zlBZ{{ss8|vFFeD$X|W_Jva+(_^BYT)qmNmI6Wme6`v0=X*0_gwnzE zuXN4nZU5~GISeV;(yZjxIC^vAv$-)-PV!?~faE~Ufb?y%H>MI}%OAGA+wl)&1IPb; zQBj+!^4js1x`Y;F-w?)x{g-R2)x|%)m^H|E?23p&SpW$NqSW+%7|>;Z`M0pA(`Wm$x&t~IjUz*d+`dClq{Nk#b@Zm z|8g*Mb$>f_t2(8GIhFiw$(+qttpHnQ$CslQH^Uo&Z0YP9N}KOSj8) zGkg5s(^#*+_GQa28rhb|$G)h^)7f+XI4oo;;7zdRn$22c%FL@L|%&qQP#Rs}QPNi&$XViS_ z@UU|UDeI!c!a_oB9Uargu_uJk!HeL~przZW9ud_61VqHdIN96hu8_Q{*Y2nFh}YF9 zt!njRAPvEggW1wqWnv$Rf1{0(WR`gJUdEZdFks4#Hg!-|)Lu*hRAjp#sHRP#y7Q2n!s}xLtaSB#^A}x(lTe&A})yrseTlEDN|6bD?Ju#Ao zC%g;Xw>1;l^gj)i(@{r~;9)Bux=&Vw&*KynH|I~Zc)msjmw~i@kGqJS=hMjOc zrL)_B{U+Gx@NNuMchH){HoK0mOK2!5XDjSgRs$5|q9P|Ua86jq>0uSwb?x_Wtp+y> zxm&F0_(p)ok745Y@hGEGlg8a1?^95?NAKSf*6*c=ZtKfj-WBt6U50TFS6T^TF0_tT zVlI|&;`#jg)%6tnb(?v>z-;{e5&{{Y9)lVj?LiYVA)~(TX-8Ues|>Ce!cBt*Ay}srZvE)EIbN9}FDrf%Q#;s=Wez)~(J#1_Hr!Ln;H-vnYut3|lJnZq< zSZl<^Q3nqKAYH~I;-4)*2XgI5E)StOwAmgpn(+CYn;XPDwjF}0(Op7#ofd7J;^TAB z_h36Wx8)uG{p*gUi`8_e?GI$be1_@k_wSD=@-s#OgnBXz%~4uvhgk%WOmUe4fUUf9 z21}FSx{UVjY?AOfDZh|N!@LztDh#8T{Cw8Ffv!J$-}v>m%>VgjS8r%6Ec^Mmib}_y z3`M^}Zef~Fxx@2tn)arxKe~SQU`ehNUDHoVr)Xce(UB< zG?Ovx$6+yUTfpI)AxbI})0Fw$?07e0pOq5GXI5j)4hp1C4 zZGZZ}fk%)`aj&Bpz7u2W;OO`~=hxm5oom+VD`bBe!usa2GIrJ9uh;lG!axEtRpZMG zW|Q>Id1RPxu|5$=pZ?GNGa2fkjTYGwx&E)ecOZSCwrN>zpXAZV+rgYQ8&6=ag0ZnT z-MDSq`#lj6OiLhDK`*?_6=%^8{n*ih?6p&xbX4ZeoQcqM7F%!OiUOpani`q+wxl9; z&$pA0c%a*Vj5Y5}T=BiJTr7b=CW+zmFRl!yjJch(57=m4!opOlFIrl$7P@qPUz1YL z&_99bYJqCT$7lK~%$3)9d9ebl{zz$G#;{x;(6zLO`!{pjN!V8a*aC9Bf464RqsCad zSlW<{;I>le(ydVU@ud)wrq9W&IM~!d1#E}?ao$*P@`t|G?BRxO+h&myeE6n7BF?TI z+eQ4q+NP$PD4v33g6P9Qo4{olQQEYH>9Xb#><%)d1-``hO9t!cuw%1Pb71d12T2g6 zg=S4DvufQNp*_MQ;lj6;#&dzN5`+SIVMMfbzkLw9WTd5$a6@W+`r-xXXtrJ@R8Xw< zp}0^m6Psb~85@q$32FA+76xo`IQ2xLX#?7E)LRloo&e^6ljSIKLx0NOg4mvQ$z+nU z`LTIQ;#%(u%R`w_Q{e*@iawYT5nl%Wh;MDX%%`EM1Lj&z{O03;seb+PrDaCb@p)$B z%r^vxt!?n8OE(K)6X51u)HWNhj7w||=mEuiA#*=Y4#I;R_U7RQ1#`_tqtzASIS4VB z9D5jP5K*P7C2Mvz?j!i_bY;!T4d{QA>i8fXev)>Pt>vOELVW58W=g1OkJjEkdr{+i z)KAjipDvqN2DszQRFjs|bluO{qkH9~Kd9OF9ITZ7g2ZRZW50P*G>@Hid&Zm5+r$qY zWaYa)(|fqWoUvo=+4CbRh7zlgiP>gl!};WhiTWpQF_;#+n!naN)tUx+Ow2GA>=1hJ zjmBUW>+5S4|1)?$FHKy)M@HrFFdMs#<@(22pT@)%8I(&?CojLW`>dQ_sm|`GsI^W` z31`o$sjB|LI^Sm7i2EKyzHQ==R)luh=i2Xm>A{)!ee-^R)xe@2`p}5htX#PsDGDc7 zbkQ|2ac}${)N&d{BJ#o-o(!nW^w?LC=&>Qy4D8p> zTkVG@b1kRw8{WN~-ZnZc!~4!t)dxe&k9l>r8yrbk6Q`!kfkB+>2Ym6k4_XzQkdSSc z>)+aXbc`_VjVY(;3B{(Jf4=M1!X4&?JLOK)*&{D658rn`ljJ>n zSWn;s>HBO#iBx7*fUUY<$fT7M^&Eayz!h!S2n_U@0h!I)iX@4E?k7L&U`j9j(Yq70 z)i$+Fz$RxIMF~Oi_Vw#E$9tjYqkM&`oyn$aEe*+;QKrNrk3o00e44$>-3^&F+1K2~ zh0P?5U5h;24j@QA9TsLuexqWtv#TTrv-PM&^>EhA^jEgg=CR%zH-a9IFgCt)E{69X z96WL9(rQ>0;JU-{UwW-p+HNSpw!FQka?iV7oxLHSWA91X3xB&pV?2Q}D5wZ@j`F;v zuHWvrP9mJ6BK4x!>YI|vLEJ{!{f420y!6#o_jL3Vt9XyVZSa{uq(mKl%F=f4w%-{o zvsUq3xtqR%0HX%UL?P#b+4QsfmW+4V-iquWsG6NrJPi5@r#V4yK>tCj5+w;eV3Qfzgia>r$ z-^20VcOWk0RZi)O_eRrr!NWb{S{^$S#7b$8h+tr|Omm*6PeA_>O&83Z1dyFs2+PR} zS5&n8mfCo5;{E=7cF|xXAos}?7XyduYVh6o>73JnBzJ^$V54-#wFCNL6!rdnCehBX zwH8sVQ3U*?U)&zd<FkDuuKg{$#ayRjQ4XNuH!$bP{;@lG=T9Y@9o}@ z`WRQ%nB7`FI6FIAytQy?6pUQXE#!NHDL$?k_w0k#elKOe%F0ScOqk|-rd1it!R>Ah z@Ux*|qrpklnWsb}sjNkb_ZD6*pDI4u2&Pd1D!g-|3AtI2-tzSm`9{>u}$s{ z{@SHW02|-jsfK7fpF3#k>bdm>G7EcAN zcfsChv%ub%edLeJvhrGi8o_z>>K`!vo8;vo?6QGZZ@eDsb$DX{X7sr9&nzd%Cjo~1(N z?ccZWI|%q_F5mA<4-E=x8#G|^f4Bfe6k+#OfY8u=k>_fAM8`VT?O3nU(&tnmTeATUHUeeQWTUNM=tC2K*0pP9gjxnT-YPLB>&{*@Lc|aAxV<3S z3m}+ggBjkeSrH78UcX+hQ;~4)oaMA>zkdIMjx`G>we0LsLL~>0%9o7g>Tv+=E8NrI z)DsNYvxXnS5(!GT)2dZ9^spfp;EquW!rdMuk8-XPFh)oS9%BK$Zr`}!=IV+e02ZY# ztYwI}0f9cs? zC1lfOG=ZS?#+d8V$rWt1J|Zg?Ia0g#gy@TgAr5D5CfVdH(ig!oP9W=SuXNeVzoMeb z`7(_+T#(2R{Ky3uW+cw>pVTJ;4G*()_Lp*Z5UD`~>!A;S!NTIi!?%vZWSe8@paDpn z(cKOlSnk%3&YH7gGkZ2}Wo>wl@cGxB9Wg_6?&gY;uVgRSpn>|MIbhsLm@Cf9Ge!@}1A^db@}j7S zjZiQ-dGtjzbs@?h)-x-Hy||N z33IUVT%bgPOUF>d_4DF|3pXd$#CdUT=;{nv7}o@Yt8SUJ%ClgkDfno+dgM_br0EU%W8wd$h#-v&9 zO>{_2O^rITN>OUx_Z`is(cr<=U+H30#4;3uNMn1W(yi9*E!aWUz&+yR^RP6Ew?Qw1 zB0$dp?f?nlz4y4Z!(?v)>vT)YsF526m!FYX7m{IoNf#i7gOBe9FT`nm^Y8XPZtw(z zYy5Ejp&XVIl2cO)JIz7JCR}^=Ow9nV{%rPT;(WqAU>;7x+DSNM>XnG?KXHv9MTNTg z2jyKG3UooBx`O@Vr|^aYDJx8kG7`%ilpQdtnXCa-=lzk4Q}*@lB0|{A4{4bYJ_^D= z94kpl5<&lNB~%^yi?im>nbXdc-2m-^>%~Se8Ih{RV7|S=((nJ$fz&q+Xv5oO~rx0XMgN5l_HA>tg&l-@>IZ?`m#MxIi znN4>fo3GwBqivCh()=Db0#6h|BafG*gGHX^Fk&B3mAh30(O;lnm^fjA`IYe&kn!&E zu^5UITBw8;LwJlX(0SyyVcoiKfW@E^l`q^Mjny@l1p1SgSq3cPJ$d3_t_1mbk^I)U z*w{u8EiiwHx+U94b9$Hr)=YPWNcWkeLQj%^`!X@2AAbI^v8>jWZ-I+~>zli)>ou-i zA%4tg8LvILb7g(4qyWKZoKIuBj>=|ri>3K6CLs zH(pZ$FjD1%qiq6OV2TeRt4~CCSi(AcMBhR%<*daXJXi`KWLo}<2l72`CrL0RSdlUx zCaJ8@N~|_4nL>vO4+Qj+&>469IO9Vq{awKuf|9f#nW+X*kuXD^4g<`@L`}i|^Xs-< z*-1i}`-X}miw?{;n`tq#vvEl13xA!evE#>I18>T^mKdN>e8A9b>>veY?LJF;_Ea4@ zU{bv2r@RZMK3h$->eK%|-LL0)k0tLuXASytYe>`I^_%KH4Y{+b*U6nDu|+>T!lRF% zO(@Zp(DLjjH9yR&U-lF4D~7(QEUcQ|)bGnUz2EuHU+Z49z}vlf{kpi1^u?7X+CD0$ zk<6>fNr?+C_TeyL^h;I7X|6cvEF~iknfUvcFI_u#{$YPSLma?z=HaPuyG+*(;=ZeW|j~*=?8EShX4336(&^bPB+o?RUO5Jwh zX7VFPxL-}1L(ofP$GnqWyA-!6g)Zd3xIWR*(QpjlUUH|wUMPe3Z{U8yV$kZX4>pqS zm?i){i4LujGe8cC{L0H@P$Rp75 zx4ulWa{cngGQZoYGs1v^IO^tdlwt^`a4T8u3rO6v zXBF_){IIs&0|g<}Vj){;i8sWUg|n_^mtfb9*@wl%iRmk+mY=(qxLS6tTjKD$2CLlq zL}X%TAo!j*@fvqzPft(W3$_18vbAg@phOrf;b+b|Zs7B87r!GwQSgc8nrtQNkmMNdFh49kNVjw_btlCW{t8a*f4?2toWBgyV=8SV z<>vu0<_~DdUzoK};7QKAX|Sr1Lq^OSTCfZlW;r<%AVZy^kRx?w_F24KN*cZJC>yXJ zQ@ZIxaVdO>cb&hFzFuN{yeRMnK|l6+Y99}x?xe7?_g_hvh(+md3~bVF9qGi$0b^1h zy%{k7Z`L{RJJ&RFqIp8C)?sYPktjUx@piU-%KV{foeF)93v5md;MH8o%*6FdN=Sxd zE7$X&G7IZY%sj*6^0Jc>dxK|?VgR`gUcX?T?5AkrFLA!m)PIiS#Vy^hEsXYhFuq5s z$Yvep^z0HQUMOI%^Y&Ta8WuL|%xs;UDIX*A7G{03josV3%Z*2mz5~YdRqCSKC6Q{W z+5P{?}g&vHhygNvHp?)z*0eO=UFc~v*?7tEF6hYXoGI60TtBeaz zOUuY0h7h$`>$SImE&v@_%vCP6Y0l`SdX0VF^9zm25AuXIOq_RVMp$~U&fGW2NU{=v zgu(=ZW{&l*__Ok=hLr>=egL)Hm^pjqbzG)b`fc&*8DUT{5#pgyF;YzAPF_q+Z6~OY z^xl1QAGQn~eqc)*x_!IOo=G5&r6?hkP!q5QL=aY%Mu%Q9e)jPliWQ|iN;j9)R3i03 zbFD9^KxQ^q<~8F?2zh9%94xtmX>QH!~APMulk)mVfQUovJ3G&u%EzxH+r~>W{2Nzv-U?viylvX`vxzaVeEpZ#rOAR zvO)tA9d>x{dmyR>D1~{$<8vf2HrC#<>vKAGjhYO!l9NRjKCJ6;#p~|)WRC+7o*-OW zK!5+1n8i#1&v=p4iN`IUS5NO39)0`DkV3(@#@Ax@sNusg@mqJzSAwohDUVxyY)3Gy zFG0tAp?cv47PSKQ14Yx9VQSj+@v)+i%w8u<`b0S=#!N+2L(sU!y&kLv%O3OyEZ&M``Kye)13oHZmL6;05T9sXoSJL z$~sT;oEVjJUNi`RvJXO@m7Tqz|FW+%*KjRvWu8;m)&Ru;3G+gTv?X7Qf84(e0?%m< z2pIRphKd`uIr~B>qb?^fJAdgAHDMI7_(Vb(09OLk34Izj_s<-1%h| zCPF_Us2O{8=$oE%O!QjCO+oZarb3>-U;%J{!~L0A|Da9!_KP^P*fJe3bkCM!umQX5 z%MbV2IIhD@>b&3@(yhG_5i}9Ij7}%n2N=$uF=G$@f0V8VEa%Rd;}%pvC&qNZJ@G7^ zHjZ2yTbtd;?RXa0$6vjALz2x z95w9NlP&D@h&2A;VPWGk=hD@{oMD_gBLy@95Qn<9ODg4&8r5o-E}xNdm-Y#fY(Dl% zb(Mi0omyQ@%_N;YtV_tm{0PLtWlN=LoB`)m`rM-8K98!SU0&C1*^%nqq?t3Jo=#F+ zCLLdfbv*<&HG}kTZD5fUl@J9&cJAatFSohfIQQ4lht<$3Gu>VV(X9st7J{TJYM2yQ zN(@-^?$@?ax$>7{{JuY|hTu1J&>*Zib~E+G(}3k;<#qOJ|E4BTJ8;>hyBNu5kv>t@ zW!Xoy$Gv@#Q^2`%A1UBu6x5sb>R2i3GN`QNBW(rIi_-Ds%a;Hy3Fp7XETyz(`T|6b z&BWt-_kLL281rTB$5e0Fklarr^3L)bT?o!}ic~W2Hasi5gzxG@u9eGQI;hNkOGa-) zh7N@?@e7CmXpLBm%61*4B^Bk)w@Papcdl%1dR9yxzErH3D$d)nhhwBRt2~IH1?)!) zvpLN4d|^)E)Q?Gg60QMsQe3>->1nLpvM6ycB{hN^HW4rtpRjshMu*C>N2?mCTp1!b zJ=kh7mWITYqA86A&q zGBPvM-0u4yJP$WooVze9TzY-uhxuV&b}IacRX(_Xf6NojLui&3KK!azm#o~TJY>u| zMoKTRWxlZ--or=J9P`Z;r$AMhA99+3dI<`@f93gndQrc&kqVbb0*-%=iG$Hz}JA`HhJb-!Zi!2UPkfH=U@=w?Pmx|FWmJnZf3H;{JYZH)YAv zgV()?(|J^#)oaYw(}ku9=cw>h9ug4A@KgKn7P{3o|C)6Gro344+ZnQT#dF;{pR;vZ zb27&3VLo&(4V9oiSBmpaFSzQX1$i77q@n$-{+|3vdHUv0y;oLFUv_LwZn%OwM#+Sg*Z3+}{x-e6X$I(4xC^_3(K0JUz8m$}iQse8i^`W$}}A z@)tkJin1e=b{LFg1kI%q!vjPO0Pj>&<{dH=#1g>b`F|f^j}jKS8J3k_PRZjtalF`* zmr6;^eSMr@;{bN#Rf;A2?rf;kg;Pj2i)QGwOhiA*V|`QT@V+oeEbNU$Y5X$ zIfU|_62N``kJMS`3w^@V>t=Rb+jy$}b=~HmRBtcMY^`Q-Y!4d8eW5A^&D`oREFRJt z7z2KeXbQl9@g~`7r&b|jhTrbhtG{Vpc~x8;sy^O@g{^VtgL&(cSr|y^m$WwMn`6e% zrQ>=T85Qwcca453ZLHL#VMWBr$?o9kG@Yu!tMJB(f0WXo$JCuJ{lYg78sQdt0wlTs8tmP z4VTrw;1=5H=!E7AZcGpdIyMh0Og)uRTGYwt_p;Zflk4@1hsGs;4)I7(|v%Sd17 zTu?Mh0qmo~;nmn#BbUFL(M$7Us+DYm!CChz4P0aEX7{NsZ)^IW4eh1zp+u$!VLS_h`;}p?qrIrlIW%jdNa& zJ6$Q%?J343;MJ?E)ocR7|iZ^j+RgfG`h zqo<~+)Z7g%T3Uob8;MUVjN*mq3F@eEGbvS3Ic@CXd}IBuC+rGMOuX@8R$J93%4hO0 z45t%V-b(H7`r2=frkd`V;9PNfV%;;PC&jCJ8FwogV^(SZscfXTZq1D~8^2`UoO-Z} zi(yc8Hp?Xn4%-mY4xY}5Z9SEm+8JWs)OS7xV}RTgMMx_rdjD>ouCC-&mw5P8Nw>S? zqZzWq(xH3Hsv{ZUr$Xu3Ub@tPc!uE!XEt#hJ-W!NBB$W&kAx9Y??=4b z9pK~euuQ4`(nO!OU%fQS`rlpkW#06C)@i=o%CEK_Ts!&jyEPAtZ{!SnpF1<;%eP-s zBjcidyNzuZk!jteqF`_EP{sGpE1ScwzXfCuGjOim-Pq{Ya}dtuzn0bk2jJ*RJwfVX zYcC*@i(-`6OfGqSLQYImHak>)H8d>S@G7(OXR5+=OrlVx19*%$(ZO4#-BBDJ;&SgY zb;h+~Nsz~f?y6efPv95SPgnP9X6D&BXV2NK@*S2Ypqz53RLBDEz-fp5x;X_@ zUd>%gcvrKo7W8nH?QH)H}hWQdx{@H}CqH#H9J{mI7a@i9Kdk8Zp*e(>q-1 z@wppHztz(&t2G$sd>fasqCD|f@ry32jdL12itlbb*L93k?VcBMhQsaiWK#NnF4o$qv%+KYkzt3!rCtnsAv@E1hKY?$Z>sKx`w#Dq z-sz#|QAu{Od2D}woPg}g#)WvstqO9BN zrR{>=SNiWPwtZ(IsZr;B$4_f-w1Q?p-rbQVZ&qm0RPT>AoopF6FouJHZ0N7|HHW}t z=+G~Z%m*l1$%L|32BT^uOE>6W63zT{MvdxmNrD1uW7abJZeD(GlvD{pAlv9CGWMAZ%KvAZ=Jl401Sq|Tlenw)(@5`?fpo|Gt3|UdzsEv^ey!01Z5h~M~@#v z{92?GyxKhBbWX|Uy9Qp;UUg-sBwk%uCAax77#W}QMn?;d0dkr?T~3Z#AK|k=W<>bL z8c)9;Us+sCl|}kqzG4NaD5YwD$0VZRr*Ge$xEfyl+Pmk-aJ9zUYE_!z0^)9(n&toz zpfQu;hvbx$Wb)&C#NYehLb4`q&B#kzsrdYR$xzuAT)>E0*TCQj3v(cP7mZ0jf1ahd zFV6NISGB1|>T4H|kYB1*p8EVIAmjv2&5IXXI%yO(_-t_0lsug?@5tuG2DG#ren>Vb z4-HYPQk8K$nNzSbamsQ0>kbZIDf8ZO?m5?+g#4183J-=3?pCVw$YP%xb+6d>FtH7O za2j&a`{jAQVrNH-O&0_9HQQgz97@agD6_}B9C=rns|r$Mj^-3h&p`NKVp53onf8Mf zoRDGFt^RjqjHKc=UK*PJ%~4!Brg*EO!VPcraGzT=zaJmPul%PjzqJ0he#bdc!BJ{& zGGciD1s#j0KN38W7OFP3(~p@iAd7@J`TcA0{B-tiXbBUnEoao=*Uc$<8+}>wTRV@C zeX8^~t&ovq)Nh;t!YN1a5JS5xYDGUbekkSP_@OQ9tGV7rHLJb5iH~Hoe9L*2@!M-? zP0-DfXa3)Q>2J?_oo|nUF!&$(RFKByNEb+3kLP`j82EoX-`C>@yG|9qYRrP9XveHC z=J{#;;v^mk-9@;E0Y7#s3IeJO?uKadyja)%mScj~oV8z-X$;q1UU-T>Z1HOW_;b(o zX>Y%|%E-#Ra)|N;R|jmOuQ}M(TeYy_PRRFn5``6ie_61pl>3nQ#7<1t7+l|x>yAY? zLy2}?eY!;6l6c~HM<08bLXCInJg!*VK<{*4w}9u9*{pNj<4S_>!~TU8=1uEvAG}3( zQ9?8F{5iA?gNH3Dv(i-B^wZZkrVtd~cZ&JaYAKI$7lnX57ZMdm*W*%jV8iYyJ&n7014;sSdrh zw3btkW2l8q8^*ILf<>}DN?q+Rl!a%~O>i}O(jHk{$L|{@X4XI51MmrPdjX}hIG_UzjSHYqBBzr!Y`WDy}j8!PNL^R@qKF8 zANtz4u;O6L(|eCs&6Z)y-K{H$4?&ZHO)7M>v;?chpI>HU0A)P56jO$Q-#6wuudJP%L>^B3 z6F{%@Pgrc+zJ0r(vl1u-c40{{LRg1{vAW}NadC#_V)3-%99CBFo{p%v%hKYY(o${)&=d|_puK`U#gMi+$ZM$>)`{xw| z$NQ)7gn;%CJplNh)<2(&fe~q}Eth&EY&QzI$XKA>)Ya|1>YfDGRH|h5k^)f%PE)*v zI30@8LYCr!L>jXWTR=ojq;TXAph6)AC?K%R%{+hpDTMg=@%M= z-n9}+j<;P6QIb<&N(f}`@td{7i1Y*`{y+)6N0?{{2%)^Hs}+)(02ZZ^fu0YhX{Qus z_N8JY|G4VIhjG>?KxY7Kq73nfvHm(C@=4#a@Swr1bE+)RF_%}ou`z)1fp#dRtoffA>H zZ-Y&DFeW7_HZtKXzgh7OY9r=}?xc^{m3!pbr=nEnU93oS)SP)bHFeyIURH6tc7?h< zxN^TwdLu82aE^e<;lwW#=dse`y;>mTdG**&*Rs#bJ&OQFf~5jR(1o)H0KDY zWX#tBiX?#3iFS4kHDzrN`_~5*+Z7FB#bz^rx`_1U5{M~gV}HQvN|c^KsnoiPxpK5-K;g=S6h7XKeL=CH+~ z5#1H!ad zx);)hxRz-)`X6L39BE3ah*WX6kZ_Kn3V-!py?k9=^ZB{tejuO2-A(|NX|P`FX(4}_ zHfX=`lBY~S#7)xuZ_%=4odt_$?~sGALYf;X{40hOBS!ey82q zoy=cu1VR5XP2zp-x7yt*XHT7)2NI`I_Q3hvRg`i@zwiI-&qxC+9T#~8?%lUBn}^=ID;XQoVydT+n+0qoph&QH%)H zDPi5xL?=4wW)hb;xAgjT!HymbV9uMj9+=oVq!C5~XpdDIA#$j~)Gn?PIfD1-L@j4y zLWjX`d+i_Jzw7ME1-}VbEG#NIJNJT2H$^3-E6g_RAAgzF{MAWO~ z`~x#B2*i9!bXb6}W4Vz*6DCe1{=!r%&PHSrf-PtckS z*z+HYr%(X&8F%H|>Zs|=)aW?7qG}{L@>6M;^DDD&-Pe}F`2S|gLJ%mL`dSq`h-z>S298~dCL^0% zc@$+8axVA8Dtwqo8-98Fdu+nT{`xT*Wq0eVT;IqfjQ zvgfe*W3PV(2Tf#D3!M&tD|(;dbig3O_Dvrg1A&>vfoa4y$r}mf^rXx@H1XN_r|1CJ zV;p*7-R(<5xP`A6tHDLvZH}$2s5k%i?Hdde0Y_X&kCILHJHHSgOmXm+*|&4&41IzJ|8@*SuCh#k8~^dHwged<(6`jW0UrHuTZoXm-Q zuL%#!=3_vL_wsrQtfTMRb*#zAdKaqmiteGlos6%?h^^an8OG3tExar5mNUh)+Gf?N ziv;JBCzk-1m{v=!{ykE@cE5^3hYoKa+$fA6{Im1YsQd~VVclsrIOg?A+ zC#>{giv@@6f`UdHB`&4iFI5W;4nE>EGU7yxVJ1lD;m{xBl5FBV=V_+*^m~1E)rmOr z*^1lji_&lZ?r8aj^=&y3z~d0M+=vo2jK#BZyKiz6y71;^VD+=oEZZIk=K zHbK0tm-xX$a>d_?O9Zw$ILw$4_@{Z;RZkC(V@R1ke_qGTJaspE!nqebaQTqc@ACNJ z!vk3Y~@)(A*$hFiiI@b*l1(1}qhYweaZsvg_ zwr96pM!K0@1uL?KAZ`fv(TdbmCq<*v*t&iD_!ps}p(keyP?{$$trxO6^acJ)h;o-N zV~}OIzkJffiG&NLQaDSS6;Z%fzs`gX>bChm)6=!RF9m#+e)H;07$SD1PjBD9U&OY` zvuAy?$KlUi@e#GE5P~gz@-r%BETFK@89HW6FK6xa06gaH!UJF&Q5#J=Ib-+7BUeWA+-ErD2RG44BIxzi>BVa|Nz8v%L5`wL`TcUA zU-!Yj3m1lZB#FZFloUi4J-DSUmWUll6rz5)(`Q=Q-#%*aW!khZ zlT+wF53j95nvqhfg}erQ$oh90y)oXtJdRh{+2!ft2czp<3IT z4sb<>?_Ni3&kPSU4F!41cM?_nC{>@)EDdWhz8U|u2DuKzwQUr7`Kj?k+Qp*)vgroE zmGh~?h(qk~y}BNjgja-;*k9bUz3TG}YVF<1BJ4u*!%hmVF2})?yB26s7kSd~2UYRw^B(IWGx4;K<$;CNdJFS6Rv<46^_ zVvS_K!+!rQia_dcPjL}x@Prd4P0C`Rjy9Ua?dVkTa?utK7JLCZ@{mA=38f!?a98Uo zU(uWc7Xwbi-u z*9;XwOKMkgYmpgjkBFf3fA8J72P2oFTnW`DjRci6C!AkIt<9os{yEnYWFDG+7tWt@ zkJ&N85|TE$98Y6MdZe*aL|8hddZQrjGQg{}krs!)&)7M;ovC>!Z7B3Ck6cM$&kPo> zD^`5xFvTixNpWVP>##QAy1cm&OmLpM?KBaWu8A6TX>mqyTPtHwq1JWIpesDJ9=|?(3w&t3&F=QQ_oQKj+I+$_D0|>glhnl7Ph%-Z z7ni&%Ct~70K;}c=T2DPpnLy94naEC6DVUDOZt)meC(?Gkp1V2d_PDkiRa6h_Ouye4|DExguTRau#G;)o)xX`mCHDC(JST>Hdt}~64Ew4{%2LeLWs%xtsE?3Z|IN#xQl_iF9!$_wILBM zYgVtObv#4;f-;eTNpj||>XMH&HEe$zZ*Iw3D`oAmL0esakMcD}hUjsYHLq)Zd%H(> zF-s`2p}d>O2JYGOnpyE*&FiU0sQfuS2_sewNQ>yGFtElbJJeCrDuW`wY}n&MrJbAd zD{y$zUs@Ob=_z1!%G8gv185p01cY09_D6sZ@q*-V>fb#fG6iu)DHOz>7Z)MCvXei2 z>QvP8wMez7gOmoh0#=b=4zEh&pyN|w;mj1oO`1Mh7-OU_00TER{5HXJpP3H;7pP3` z?D*u{oRQZ?7Z!|{A9(3yH`QW%A=32qYDSg$Z3i@vxMMMYK5LI2B0oWk(Sy@;I`Pwk z7IzO1aBZuxV;9o=p$l|=IrHm04Yl&g`mGJs2>LFj)*kci-iwj>{AtJ;@B8}fAIgWo zPD6PJx~>Y=pL@%I(lBJEi^r?gRSfg&-8(*gMz>6Odn<2{cmICv_wQEd$8J$N^Ub={ zRp@P(i~Tfs%$PEW3++Y2zAIX>qq32-oRYU_$&!;ObfcmkBA1A*xPltHrtd-TeGYfW zjY!-`4)go4*}L+#^6bB@$`C0U0{Vu}MQ6)!*#J+2S#Bcc)9GLTy%r7*UA&_2sMPsI zMMb1D5zsH%#A7+9J}8e_UqUF%$u>f49cCNaTbL9r%%^mc{BSb z!vyIA`^CDHB1^E=8TM`pOEAj!JK|dX`r3L^Mi7u-5*9NiS<2$Pq&p>{_;6dJjz?0x z+H!w?>keuMf@jrrgT8>CNh`Cqrg_(n$w!Zh)&>-% zY|SD*Rn6OJV__jGXn?ecCTJ--C@74ftpfsbXzDp?9aBQp^v#Th=`FAsE89p~L+dl% z-5sCSDi|Lo%7DtcC@HZQv6U#A@>vu(AfX%6){=7e?DoQTWPN<0^Kii7^o$<;CND1! z%lhS0ot#RMiI-y^g}_`5$okUbl);n0f;Ab_r! z9ag_8xmKx;!WtsPHm2@i_=y?+@x~!3(Sk;%cROLePbqc!jBtFdr%gK#4g>__^a9^& z_9X06AgJ5f{m18Y>M&x*FfO7$UN8v{U#+xMTY&# z`eA%;!%g`XZFz_kIayg-b`s>|_^pb+=?a}H2=Fo`Cvq5Y143f7#o=2R&x+nczIx@o z7gY*VnURqe42_JE3p|MslnrQqsxK;30R>R~QAr0?$r$7>QY-h<@2veOHy0`Ym+Mz0 z){FgcdT%MTY6PLG^Hbfws`40X$I9R^Lb)Xf6f5Ne5)K^_t#$J9g4vstI&aMSb@1{> zatg9CkW>og@VR5W+FQ{qj6IUWRRzK(!SFFlyq0_*pJ1hE;`8c9$C$SRoWmsE6jdnR zqFTZ@>O>EhkHyOW-dq0j=XWlQcYgOe^fe!8^G0;Kf`IV=IdFJ24@FXFWkJ-F4&E}M z1#ZS27w3GqNAX7{ra`fdN>O3eMPXK-qCL2Sr-t1?YR{pgS*YrMh3kO-c6wWn#m+LJ zH{H_A&Ki$d_9hn1|M$AO1^RCiPA&6)zdgUAYF_`r)veEZEK+Px8(O=GRrppShK0ckaIoqf?R<2lqR`dWg7Jw4xAi~)U(J-&6 znqYq4h4s)Rb!JKk=~l9!>qwCC@I~6oC5pcED!-uMC8!)7#=IY&AxEjjAdM2t*Pg$4 z@h4fz!N^L)q-jDA!cG$`JQsVtTg==iV!=a)-Y`DL_}hWKd&38SygFZ7w+g%-B@WPs z=#9*phI8jKHheT;3+$;=A~?WMP_JI1B1{wyv6uJo!bZ35i_51L@OBtv9&|7Gtm-Xf zsX^VP=uNJz{5Yk1u;#*F;;EfA#2&Hqr8JQaaOlfiEnpJYziRtyRz^BH?zcONEFAqg z092?|vN*dlE(N4CG*m*M61>x59C|Zu^oFZAuCTi=IcJ~#JT|Hru{&#bd#g#4yh-Dp z`@9Z2`!AQ(-rE;P1U>55F$U|eWErpRWtuWdxzH?VBl&78K zDiTSs>j#%)fs_?^Ffdf_K7EYc?<+zg>|UlSXki`A5)SQzF~Or>J;1LyfGvPTri$-! ziK{!xv}ys;-Sa#5pr*^%4ChDLHEynqh~AN&c{#vfVLy>b?llBF60(7sPwAMLvXkv) zI;rD}zW2a^k#2Wn1)@%SCT*z8*1T0i-I>?*p)VRlOn& z>nU$#s}K2GW8bOP9V?xZLRA|t&>Yx z*~LaqGXM?^#&}OZBB}D7^Ei(S*`NTjp$YAQuA~K~kuiQv`9e9!q2hVKwt-Q+dtLz~ z1SKR!BV3;2Ze*gVnjfin& z^s`=prPov&E7Q#$oIZ~@*T^VsN}+Vda8dFwR83Ju1-I}fkov1dW7XD2iBU9MV#LAG z?DH8CpT((=eTz(&YsdM8Gw7hrA{MrKiQRA?;%E)H0q>g^*pEw?x706vHRj$g1OefN z$_6~?`^4Jvc0OkP1^^~9^YwtfJ~*0V?*{J060$yBL{xz8v*=|8P6;@)3E2-HGE{)| zv6R5vi3M=|6u<(UyC>oOA6Cm@G}|s`ImL8TV^>i%jTDb2fmZI@q(vbmw@7^>qBl}s z02?J`=Pzsazq?FKm1T>|nW7d1d>X0Wc6S#2(e-AtQDOtmX35D5h4jK?A6zaF3M7b)kY% z$-3vBSFgltLJ69xx`#(^EHLdQ5qr5LgKf*37M`oDMqW@@VPzQ>Wh=jJ}L$Q;U6v?3^C4E{)G zoPwmw9%}+s7AA_J)WsEDdB`mp!4(EO>^ltjK*5z8q4#kD9X`WUg6NIynYa;^Q+T{L zwnB{h0>bbHz&!*GpMR8NAe~#MTxqDcD-Cs)qltvHMU1XNdo#)dZkI4>{a$OGpL}c< zrw`ozfb3WBYO<_2$txky0f2|-g)|Ugso6kKI8W@K+2Yv3)lrtqxp_1B>ec;mm2K^G z{q~gIhb*3a|LotL@b5|7*h!dTTMo{-`^tsa?W9d2c%3anM6ifY0mgEWpboste`b*e z-VIhu6tVDN87b0{-Wu)MCOb*H)VQo7T)6N86K&LwfLuJyzxXr=m&V>zQ}!F5OcpI= zX*uaS5U5hf;|bxg?mMwQMX~#jkzyYJ8$svB*E&%1GgSASgdnyAPo7XJaU<|3AX3DI zCK@dq2T6kfXa5GIs+$z4IFpZhVJ7hVV`4DEnH?nvsX`T>e)8X~iJ8C_)jZ-CGr1^* zn2ShiS}%kkkHc{7)zJvONQJ8%A-FD^PXm3W_QNfNxIsc*>E}21l6O31O1E*{JwUae zu;@WegXjbc>|8we>#IB?%Bbq9stjlu9#Q}kn_*#rtu1PKn=ZGs+?s796)Z1>zKpB@ zQN*q4ed&~S<~wSmX%i=&(pJypxN)S$z&V~hTZ11G(E-cNj@oe6!we1Wr%gl9&2q0= z(lIciDG4Wi;S{Wsu#F&BhI$l2PAmk&XD1xaC%d!5qS)c-&4@hh6<3GCYW>qA6F@#r zh(;VhnY6(e1aaR~44hcqt?9P?5yR+2tMpM26pbewQs@W6hp0aFOsA`aw^Pf>NKs)q z;1I?GbD_Iw=k{}2eW8bbN{{S=;~&sr(3%&yyHIPi_z5qQvM@G85z}q=%O3u zuj2ZOkmFQy)Su=hGC>u--MWkYN~@|26&>&Z9Ls_6p0ri04g*$;yYGXMhq9U)((SEP z`1YZxB$ld8yG!FjDWcaljh9cANdvmz5@vrRMl_2YpJVJT_aWeswR}xf6s4t3Zqil$ z;^tJy&$Kz<0&q_W8Zsij2h1WZElQ*7HQGhxh?^sxJki}5H5R4QIP`qX_$qy3CJhj1 z3o_t@;akhI*7tDLe{=0_$MwG_%c#oV<;!71s1ao0#5j0p=xv0KH|DCBi4pu?mnIe( z?Zjc=j`EVLlShf&I+|6^`ekw+V#{>T0#c-({MhyOQ9l3gUvdy9(H$PSWgdJaM2~|* zEu}1{;I97qm8~2Yc$=TX--AsZ$JZfTDq5*)SbJO>6E0O+@MK{~jvN1M!@$`KKQHfhDd0^Gym5=#>Jf+pIe_ZPc~>G(ByH1^BVW(_dX|^xD>`CfM73eh6obf% z0sXqh9QdLq!_w~K$NR-}uh9!ia~7+h3##I3%iX(?ydwVr)Wiv@#*&Qk{SkmS-nLN--ln~T=y%>2_rLdyMW5Y{j z6U1{f!Mf7pZ)xGKMQx6d0VzfG;zN7);srDYo&F#b!aAT?&hYWHAyk6m_{B+4wv0J8 z>JO-C#yne^RuWvJazs4=S|%D0hd%4LeQbH6x&al=@Al*nk(3eH(TEp_6jY0M&XCp! z?f4golizvUhMkjqZN2-u>{Q%SGNQ^*(SL1lGa5dkX{C zMDY3OE3XCp8DU_+c9)%=n{K)y#7_<>C$JN>LBT7&t?9huCg=(qF)0(e^kqnP<;xJo z5AWY^zHoCU?NLV~;M#5~Dh(tzaj4&FpaQGvAt$DruqTSOn2T-HqiG}C{;@lV10r|r zAl2~VpMLtmsp7xrw2v?%GIWrYrR&ffwsZ!096PKb4;k`nU(Wr<7>J~4y^?5jV!Wpr zeTRK8N-4O(+qZ5(tYnmiDh8n{;_*~<%~30zhGS%We57oD_CPBr_$~_T7Cmkvtq=1S zF)_N06xzfnSQAMB`yJ?;J&mXNFd+BhR!)8&qs{M*L{zDdz*GS;@E0~5S3letgF3Zx z^VH0NqDZ4C_I8kX)}rN^WMVWIoWL2L(ix55bTspZuGwOE@1%h(9C!>k3F>=?uijvR zF)>d>xzOtI7twARVJ-MqTL=?*1{@IAK+rNqYj@c8!HphO3M_`%@Zpqlk^(TIxXswM znAVjlmCx&BYYWq60cw|>O?8xX{d!NUMh1Q{n!t01@oW#kZ~AUZXUYqXXl65Aa)lf79|THDwrK&>)#7XuJ9J<^l$EK6N^!l^)|oqK*1u97(1hNP=*WaG zWo7I|jtT)e?|^9yhOd06eX+630Lv8QU+&DZISR}-ApU^(7z2tMc+C7Ha|{{ifKh;B z`-7N;XV>Drt>>s_{{DT@OcP9&b9-pSs-;+l(w@_FbNxl`EJpL)ch*oAzj(n7>2@v| zx`Vdas{gU$$C<8S)g9WgWP9$Gn0rgF!LNr%NU?K?|CySUWTCqY=?D@QRG8Xf)C1Ko zPEi&DD>878Z;e&N{x4-W#;8xHnq*+&I_7(8nL9A0?L!vX=OjspBg5GAOJ;oSPtE`~ zp~j@&?9y9OI}jj)^^$jTa{4RV(eEID?xms`llWgbo+Bc|~ z$Ho{8Mf5a1Wt^WOT`+qzo(g?8810>qH0>nZ4|Tyt#lv}%xTg|gd5g`ID2#8}dH1C> zQZptM1m1f{{krbM8D))D@DKa+kO6;U8o!u` z%kj}#2)WFUgsHODiB>hbb@S!|KBN#r+`1On)Wxb1n?c%I0J^TbHY?uZObG%kj=XkO zaNFq3R&PIkWIgl{mK~a!?gK4SRz}!tCHaJkfP%_er^lEe&0*_4Kkwfq^7*ORgP9mc z5rkt{l(h~ZhPD{rVB~PZ$JLfTl=@F>QZ4N4M1IbuGl(Wy*;MD=-$n=2S^)cCDj_ce z>Ggm;WrE?7r$_j4)G0rqd@NmAuBb8UHqj3OydW?wd;ap}Uc;6u3nC`Nuj_OWdq}o5 zWRM9kapfe_2{FxUXZ*av@~?J8C(;^Bvjmq?7<~$(%~n@fA=qUtARB_gC&-3|qp2RS zXTYFAUq60quZ`04>$BquJHyeNQYMY-u{$=lgS@2II;RiL@Gg<|WUL!Dj#b z`f?@AAZi%JTSSUs(o24PDe?t*M{ zVq$X4UQZDEe9;brb0QFn7C)iL;5f*gg<8mdLj73T`ucj}!vH-!7T%F@04lZzmg{V+ zPftp6WtKq*(H1Nx(*Pu=_ zvWZSN6ZfDS>+5$C)xz~KS5g9ZTsw?gw<|VQZPYsB<0_XgTA|gq1G8NOzkRb^G@1q-lod2nDg2 zO?|fBsp1;U>m%|c);dkUe|KGzXukGo?JChj&?;`{PQ=s4vH68!m%~(XD%j%q@wBiQ zGx~FGg%H}0-hKBUI>ho{NufAv?a(m8-o2$Je56sQ9A{8_*!E*uuWZ`4wbUyJuJoza zxuB|;y718Y^eyNviZcL)b;Q{N1nl_x#pA~gRfpe@mduX5q77n(UvF`Sa{JJR&{NJ8 zKd7eo7`$XkTg&df*bR)jJ81*p8lL{7KsF>=J^CY}41`({j~30;l6@uV>Ckb}rxPQ1 zvBv>O+}-<#=$_nU{gk!e$UpSkTO%SA%cfD#i2EA_iBL#ZTSQ5%xh>2c zU~IwJbIXwvLLwtO$W4wXE#3BRMWvcQY3=IOV&)ODU%rgbb>F*tcapXSxfAUdiZI-QO*Y1&_7%R~A@FV$n1QDf;IiPn) zG&!rhvgBze`G-Dn6LsaW#rY+M5744Q>*fLKCR zODc_3fd=r2+pDXyIX?#-It%8(MZSMufpiNoIY~sRfjN5GU@B>_@rWq>o-E>p@mO)j z8n%M2d>#yeo!wSI(A!gcQD!E*pv&zj%t6c)rnsbz_p7L_#@~kSw9J2ugW&-jKOPSDE>apv-Ns)mDqJ0G=^Zifayb7-}f6Z~wT0p*Sn!~%;JnDUb zFvgMPaRH|B&?5a`A2_;@Lc!9g9G&blRop>f5i%`cKPjB zaCEJk_`B$VPdi@R+9<1ZIp2~QCjfT1au|X;tG--LbklDw*&>Y0A1zk$qs`q0id1IJ z!g2~TL9kk$WIljTK;v!EHU0iDwlF3>t>Ah9rrimwrURA`_^;MmP5pDQ8OmSX>8&0i zhJY?wx+0|9W9JiLHJmM&Pb(1qK)t?ovf6rBmr0X+owa2J7345X9sg+vD0oQo=-wb) zq!+XRH}Q)g=K$Rd{|*rxgnHPY0Zz7t!hxwG#<`*IhWB4u(CJAO`;B=q%oq$YHpY1K z1mKIDq~&=ch6s2h{I@^Xy^F*>YG=+e8!5++>8N$VSltJ~32|Y}wtGxqS8eH-8Y0Jr zCi;gNGmg-v<>hVn2<(tZiC}=d?(EsAo^^ngN^2->ne}^iZhqGdqXOzbMB^pM_K*k( z1T-Wv>V{`<(&RmgGlv-p1M-gM9G`qZw}0OWlMauSW$vsm7WnCn@Kz4~k7>)09Y!kQ zD5Z@1Aay8PA#k)pU*#D8bfk%i%Acoh?(W9Ht$}|)3X#kJ9-gpBCdlHTWBi$8(@q*D(NkRGJtL6mbHE=BmtgVGv4t=d z@gAg+Cvt-|?yA@95h*c9z@{QFYKzxp6t|qFiASfYPCb0|=!<>+db5t9bAxvgt2(41 z$PSoz2;ZJ!;HVe2WeXV|=PnfDFK*p(qw&x0`jut57hz9slhrjM*F(hHD2o$rj8oD1 zE?BZ;!s?s6n?JR;6)5GY;JlK(Hfe!DE!bT^EILq#;OgAv%P>1Eu;}MMT|X5orJx$69z8HN zfKTqQDP;R5ej}%Sn5pTOXHRbg2V?X@;AbmJM`=l1S%3u0*Eh(|Ew*A&*j>0ag5mS$ z=@e+5huU{iHwK?=yc&8s2jC7BEvsSgt6a(-owb_T7@EkrBq--Hau5j)uU2t9{ zahTVvlz_VYe0#X0Wu<0mbL5Bqcu`nrcl0Ur3W~-@2TT=YrqZ$?&Dvp={3u~~JyDq$ zVACsxf*WBDDQA-wO*Bv!?U4F}#bKu$Hr}he`67|1L$O8NZD*;7N$Rvle}`=k7!2Y$ z(9IWIvr1n6w?81<)i$;8EHNEDFe&NkRU*D4V~ zK#$isit5n~h#J4Y0KnxguU)sUi?ko1Xx!A%`d)Q#e}?goC<=Ox2{I?c>Gs>`CG3xO zP#d|LT5UB1%@AR!Usd-p>l+3I?qy}V!N7rIhwemKgFN(#6TuOK8(LKY@xiFp7l+(9ME1sG?&ORSpv_R*qRwpm_@S!XfH{WQoiOz-Hq5B+_#R13B_t z$oGf{*%1dxA)PC~qdS2H${jq=emd8h0->G2MhOjl`H(Af`8tH*1+&yLOuE168*9s$ zx`eRfEoHo8Va4+54s$^co~-Vj|YyqZ6lo`-XT_Mn(o0$SbtOV}X9m2c_<>OaW<2ezh$4 z!u1T%qPye3bFUq=hLnCm>%RZ=`Xm?4&pUw|X?bZ)&bZtd-M{}QDt*INuDX_fXTeiF zWyqojyN?C=#pNEj=}MztNtH!mLN{jr>+cHj!LhbUDwosJwAXK**AR7Evo|kO)YOVV zmA&G&yhAuxTPh-f*j#6b#Q9xafaJzgQymll>^DWzk8vC4T0 zZ!ytEM=9=7U%bViJc-eqwi5*eqi-e$UY~An%S}oO|x3K^Q}3e8j?)0*=yk2)x%LW5r|N0 zS)Dbz?^27<1imsV$BntM;iE>uG{io9f6Kb>w39zT`v$3;VxWoA4GUS85D^!;hTg1# zu6FNS)NM!aO#$X_AW!J;U1fhFKLnOxa&Q%u4mh&v%psonNxZ>XGiHclvF1hzL0fxP z+r}OLM+>06;z|qJ1=wMF{SnEW;1crIILCxs_ZYRIGXE_VIlXMk2x@Ak6c8zte}Cx` z)MTT(i*5tyyqbna?;8R5WP*axA5wqVd@-YEtyu zJv24Bn!I`Bi}zg(nU|T8V21DDv9o8(;G9>CmQ(%Id5`_{AkHdtTn>Fs6h3=KSvlRh zJ7bUJo9#@FUcWv+E%+S{aLn{LI#RBxQAx(cblz-*+GwPF7QW8((^5hlC+g+Pn?5cu zBd*3))S|#^{7QRG!%50aU4%EB*FMl^S8h<#`|bnwu(cAU3!>>{C^NqbYn~)`hM_Uk z)uZ?S(eb({d6fR&|dioK2J$Q@ou3L33Ett~HEFG`n#&43k z6L{{Mm-(74A`u!U2Y~*FwiuX7EL}Q+jV~E>&!~yme#0IzI_nNA9|rzhl8f&!r`f8PzC5|fNhyOIDR*o2C=KNaPr54;NeEyuS(QM?%+wGE&diGErz<)m*5>Z)%R!H4^7!nH)~%O(`pN3(>UuCm zPA+_B*x|eyF^&p`qJ#s^#08dsCAsqhlkHX2)kmP<@$&it0tT`_3ZLWLW`Z`dy&V@< z;JruCrFV~fa{}&@fB2}RL}PRjEgS2_*P$NkJ#O2aG&dW>m&>MnYj!DQNt>yONdqMs zm>!`eB>5eI{Wat3lfHKHdBX7a&mtGFt*Fu#k+7DRr_)6+CYt%fnJ#!YYSO)+uf=I( z933smjiMj|2?qVRyX?F3_IfRq+uPzLp_6%&M8|g30qs^Ep{D=M|6z0MdwI?vsHq|Q z9&*(xq8?$~tR1_3m3fGb2>tzX^)cO#}WL zo2s?%VYgJfjTRy5yK~+37C1dC>9EOjX_qUOaa&UnQJg-fF%zvewHxWuUdiO@D@tBx z=f{4n1O~pNw%+cUsZBq*e0zoEA7O*e!tokZD+3&NH(CH>9Aolb$8V@wNM{? z-?3nTU&oG7WY&{29(=4X(2#jPk&crVrU)D0>q^cx?INwGabc%Vf98FW7J{%bI&r(o zhr=3eu_n*Yx}~XJ9JI%-U9ZkZK7Bd*Qzur|Wb=PF4b(SyH;j~0`yODvdq?~Dq7&CA z>5g3Y;{@6`z^W@#o}IVtQ&AVdkA2+Pevrz^5x-ss~~TC}*2R+q@2wm)mqS9kTQ%e${`8r{KFGI5uv7F1sUgf*{WgLFqP z-qPbtH68-s>hybUYXtHN) zh=C6t{MSi0urVWcLvkkN#kaB>Wv4G(8m6MGqCy*K7(eOz{4wt|7(HUdr@+qcd*2x` zQBl1IYg&K2@z@Go3*p%{=+WS*KU+?9q#Ic$YSgag;NRo|u-TT4>4gFFSW0x3JfgkyEbs4!ZsOcg7Pfv=o!J^?f`myPuJSE&ebq zldH6(kqc;bjoczWtT>C`{j?Ni34ZrS8eeQPdaD#@Ac-`<;C#mG!IP3ss*GXiFvg+j z)`gJF+tPn;kCrU%+*=>Mr=oRJkINn-hWlPhZ{?~(Eg;0HNOPNV(o}qV4c&6)j`%l{ z7Ah&qZ6;_CkqNr*UJo2us8{DXT1~7z)a*+0i~1raD0;tr{k?y`AVeC%6rS5mv-7@( zqZt3YyQxF^BzW_^P35Pm!^Pji@jB;{^?H)3iSplP6l046#Q-xiD7S78>QL~NmX^kt z*_$7mI*z|LHN1=Ik5ys=ysD}4&Hp@D*-aR4i%UOhYvaZQU*ET{`(wmx%RI$>SLd#{T^)RY}s)l9r6r29Etw|91JBH7EfWQHHkfVbrs*pBCStUr59O z&yGA^-;NhTe0X;xzDvdZC z`|7DN-4VQ)wU!hu`=Fq)_3s-R+0P!lUs?Ixw{J0FW-o`eQfRFnJ=(kVqYl6HqfS)G zpIiLWwp-bLYyRg*xJyD;v&$A2hNVYxFgL(Q4!rZowEkB{8!VLE!8dF?kZ&no8%y0T z3Q~U`;%eKZW5+zGV7*N;V->gbdg;9yMO=)!@0PB=`%b#+*fP=n?uI}K@pwqw&*=C+ z$J3(&ojS@b9QsU7iL(B4URiUOHTJPooD)@f*0Q~}J)uf(ehU+*AX=f140_7^J+(e@ z77wTRop^G^=^LVZztlPt^JtgH#sn7ib)|L3#WQjIedN6VIdqiT#c$@22nP=2f``>Ta9%8Q-_Gvl}M?MY5bsgJGoQpjx~vEDeN1!{ym6PA795eMETa(ikH>)Leu2! z?Y!!I*EQFb|2>P171E7?t^6XY)dek)^w0Yq0>EBp6@an`i;3T$zP>WZtb9V}Ew~bd zTz=b9@$ALwkvyR4C!H>Rbx{(n=CJcA4J^ib>ajYm_s=U&eQtzZM!HM%WClbdVE4+rjOEESZ9O@|l#0XG{a{+&<4Z|wu$iOFjp*mzo}QS3oq6=m{x5^FRVJX?u(Hr6%vowCHob{5xg=QmR(vACNC2(DAb^7BHTrhZW8BVD@gaeNoe*I!w z4}atvszL(DqtomjT0^lx3y8pLxtZn+wamLE9}FOvJYp=K9& zU5*8XKh+&u*iOz6EqiiQ z4p1E#R5>w02xIVm#af))=wOp{62a(rh=@l=$agZ|v0a-Rc`yI=uS?q8p3BL(jgO9r z{NecVTW-3xG*)isT&S5YOF&5+A3t~C2H$_k45%J2jyjK8^9rYmd1=aeL7*=>^YXZ3 zpDyunah_gYMTLbyAKnI4e5kCf#9M5e+EB-5%XkIsgP}Qp6`=yY%={$9!SWcg!zcf% zJVVWn2`_oompnXs&FzN=)Rg1mgn(8AMFV{Uj+{Gsyy*2Z=;37`)rk`y0!bxDFT`<- z0skfljJ>`s_fAng3L*UI;L|T3$noQa5N1p+o)21ovM@iNIy)4&4HC5%bS-kkYhDa6 zJ6#VPJ~xUmts2d2{x1R%GnjEaExHUM?A5T2WrM_s^zvklrxbpRDUYklwv8X8LUk)8 zV5}qC4xY&U!b>3pw*1DGPh+Oklw4->0~C9k*+fNpR~Q{Zut*%3H6Yd&JQFi7T+W*U zN1G#1pgMnnJPL@M8(^iSXt8(>O73Zppo1{>Val+zkeY+J{jSon@ZCto$&5X>w{LgU zLMs3kfj)tDv3Kr)zl>Tp44?Mz-|D!`-K2%3oICdJl^F;m+xA+)JTZ@8KwsxmuvvvA2;a(e9Ddml#aBQqRhJiB*mQB_rEqd9S-)9-IVtc zMjee*tnCkEWOI^V>UB<=lfWTi>A*6yB#eJrWNTjra)_Taiyt&=mhP@xX~~;3(k$+U zx}m}8x5thtdRb9)a56PDX8ZPF@GX>Q_6I!e&p{lx*xQpNZ4|A6ve32iZ|=DHrHH#9 z2{wkx|6xw-Jc@=bDo0#PVX4Tz%=C0+lg;YE%*@eI<3F`vj-h`P5}jQeK9X3#QDD6% zOE2xEqE*7xLQsr)?A9)3t`M&RkrDsM*JpA3$jeJ)%94x#lLMa9WiyW(diXA~fsN?(GYJJm}<$1Mo43gakSR6PTH+z8sTn06b)GrWwD8VHYujojG&X>5AmM5Cv5N6*0j2@!^TmmZeu$c_CT@ zV;3Xs=g)B1wAGmLz)sTXA20Cayg-BS=f3cD;wS0uv3v3C83;Q6wX(j6uYMstokbt~ zF@Pe<+Y{ZdI0d1ksk#1p%G|l}R>}VGaYaSlJ0tL`WHsTNEkK7-g1E~D7Yk@Ys}gQ1 zW(T36QU|BtyLKrptph%9vu$(=IQT$wcU%p5c4nGS(5>kyKOlkJAL~^kwjZP>pkLG9 zM~c+-J9hwM{lHU=j%-lp_=;uAQo$tHc>nwk@76y4Q&p9o`+Kk^ z?r3`f`M1b++p^=~BdSs(Re4p9TBa3<&I9@s@kdDFt*_UVNeBod_m5cCVUw(^tRPUX z;f}mYq)N7QZYKy#|SDhi~7oO~itx z{p^~f$B&P_VWu2|szF9z0eQ#G5vpoxAcyRkNp-yV;O0#U!H|UkM7OTeN}8JT?LED{ zv+%-V?9q?7HTV$*ONgq@|DMTCnUQ8vknKn{v0AwWu^sbKY! zDlD}8{7o)r@IOXD0_@h*+`R1N`9+{gLI`v%8=w`XEgPa-GFNvJ%0GPItg^|T$}!&` z01RtN#&rmtH*2?ZQnUv*;#b!}VEK@IpK$NqvN}da1<#)=3$PDY#L}gs3R|{709pCQ zJEg(#r+{JAHkl8k(}S8>oRw}b?=m>flK~OcF zs(1&BrSe@;RJRQcCWeNB04vElp;+^)G0w}bscg}#t(kGJb#%IiKZRL%m(*vSWo0+t z;@a-0KS77r`B-)3By<0&d~P6q7*ay{ax*jtXO<`|t>c<5V?K*DIUCyy=A26+#1aWG z5y;Q%5W1bhIw=pM`_D&nu_zpf&h zLzBOy@Z}{W*#&8CKpCW-Gz3-FhJF?!_4r#b6V;i_4_k>Q6pRA$t!WOyjh zS0oasA^8SGAh*VCBg;x7s`1$~-T2!8K?Z=)V-K*Leexk5E0N&2hrt5zQtZ1sg<9!s z&$tTyu$e9&YKlPzCGfT%-&X2XFgT%?$Q134g&42E;_OP=I}coTvlG_8t^NjUEN6jw zjZ^Yi# zlLPzr&v!=bU~uaOH1e*cG__a?-ywc4HR3GA&?-#TKpvBw-Cx#>SFv=dmh#*1cbavJ zPrNjkB0U^@wrGl;oZ0DMYYOtIkq~mY?R@=PzajG!jR@j*J%m0 zXvMg(8c__oL5rauYl|P3c5RI2Bs40@m~P4I@vCq}idpBWQ7-Tre`=JCk{{sfoL6dtT&S zdxx+Y7R;Y-5hK%NmT6~g?M1OAjC4j2pZ4cq`&$^oEWh657s+AQgy z<-liA?wNF7r0e{ev7VQl#$d#kM%o;s>CInX#R)joTum(Gn^|%CD~eTSnzHd13u*+OGIzk+X9SIzS3nK9;g{)UWgEjsqw3$Bf~K zZy{yWv+pR*QmTVY_ARdz@J}W#jIJmIAlF;2;8_bXGIYS0Z&fb@HY3-dbYy8Ze&7c| z(6)N}q3jSLQ>C%UX6XN#lynj3y?V7$N@`s*N2bt`h$#kQDF@t4Ss7AU>7)^bqWK)Z zif@*`xF_Ax4%P7MW@FioZ}YeL8D(ULC>TLO1uh)cYM-lD z<`{+iMe+O5%-cVCq;y7vOxM1J`YbY%SqvH?cYyr+zCpLYTI3NTu`V#MmB{SAOnjiF z!%?$GbJBjB6mY|AwH44KCP)RWkFJJ2La5)99kzUVO5ih9tv^|(u=j06WHWhKS z%xELIH))3+rWHv_4bcc>bls9DJ>sidZfl8-CQM9;%9zPljuxX1&P_C#qxQ=OQ1{iV zW`t)XEkZvrU!@p`30ss#YAyaw7Z?2b`Hvq9Z7h+<`r02XDWGEc%K-m>^-1{RNq_zH zI7j5<15JJ1Q8V(oAZLiAM1Kv&MD<1E`0kxMbb?33+P-@Ix@1WQ1)gV~X;7)ov>K#& zGl5f@8lju*XU%$9o%0cTXeHGFMm4AwyI}1V3!f`0R7;H<75%pTdlQ z;KB6|qrmgJ2cRgp4FDS;nqGa>;dWKY^3M-1#C)}@?G00TU$xpiSoZ#rRk2HMM5~d$ zdtTR4yDc1ghgGjVStC%hYfim-rrg*P7|aQ-ySRZyC|R_g63PCAgw~k5GxTeWVoGWB z<_5f!czZj6rI##W>MXG!41d3~BIBvKCdi3Ku8OiULN-Wva4_1%eFvC&UR+Z%xahQf zlKG#s9})B3GCN)5aZAQ*6Csie_9dRH6-hVlmQtVsO(p^sSGiW0uVM(XI~4<}u4YJofq|Rk_;rn_qR!JrC28f{f#;d@y>W>vsl^app0k9Y7uZ?A)lwn!SycX; zwyq%2NlTlAc4_Y{9^oJGY}Q~6Man{gRpNV#27;*9KXk4<~- z);RFzNp75zCmWF}H8!He+6ID^_FL;5HQKN;J13{$#Z4?i7o5@?Kr>i8O~#MMx*8cB zy;Jpqr&6PTj;$WSA_(yUQ{t>h(0gxfhY}g2LFE^yTcX__!;va(qYA!LY&2$F+bvPOlg!k<@q`e!9 z9Ay{xFAd;epTVnIPHl2zV{+JHf@6NQ!wA7`fZtO0K`^a)KJRv;|KJ#5l7*+I+;T@q zik~GCLxx<&&1_^BQtJWJ4cs(W`Slld)9;v~e~k?7bf=(qHB%jPnDWP;!Fr684mZ$F zFuO@d6z34~g}9|}*&haOSG()KZD_C*TTwZX0i2nY6}x3oy$AKsFKjlXA_CQL;6R}y z9Xvf#EX@04;3zkr_5q}j>}Nz~{v%9cigOVJC`)R9B|8eV+lySv062KaF{UXqn31JT z--(S2B~FPCQhoIBVW^Rn&isY?_v(GM#ZCQ&pY7DhG>xABl7yV27M0h@uLcN!hx!ra zd2&Jh?A})G^e03jUhZN04O|yC+x+00k{zFflVbS|p)% zJTVk4-B9o{LomQOMD;T7nufe~cbZII6`IWybnLjf;+<6BKQCauXy z%d$EBgHIMwh=Mmf_F5+Rw2)+CV6uY4V&6KxlCD0!cpijevFu8XG|&$cLP6i0?qtv+ zUlDhx+Zeb?Rx4>c-d;h>IOf*2W4fgAMa1| z*xQd)p&mc(Knd07sS_t8Yu1bv%UkI@;He`K;YqVD#`M{=Yj8Wya4 zGE|@r8#BLeNdZR2xx#31)nW_EU~)-R(ZffNtSzqaH}5%Qy}y0?CQFAA@>g!W_~>Dh z&s$NGi#>8=)z9Cim4bKm4GeqtNin`>GmVxAe)#Xa~n zo3A|9{G+=JE*60d9X7(w9nfi6XKO1znUf7luud}5n_QtrcoHGHv9Xakys(TaeO@KI z(AwRzN2qFf22^@tmW(qQyB(xVKLn?RE@ME!m$pT`&RE!W|7nj~t`XCcUt`Q-rW{kIHwO1j_d~F|~i1KO;8@Q*n0}i^Z4FMJ2TOvSfT0A0c=E1#IoM z_Fm5IIC&Jq8l=*l_x35V_~1fCAtY;D_b^A)JX*3H0E4vLfq-bhhr%-hAE z518mFGV0}Jp+UxIuwXI*e39Kj@UPd36;L(E+!zz`<&85Etvj;tS@KCP?pujEWtU^n zz5*|fQi4Mg0+o)4N_0O$=D{rlGAXI5qN9KPB6^dMRcM^|%Ufv4fj=>C3)A*EHHTUzFiao(}^W8#+$@CmTNg?9p^XBVUe zaJ)imiIYg#mDhLa6rZ25Vh=$VusrG!kJwFk zgg8tf76^5`uq=;^-(de3#Eua2Zs4X#89jYQA@3&`3cdoJ9|BRE6dJ8UOp}y3B*xGl zCdS4mA9$0Nh(e8ocWii4!JFp-N-ba5kZNtgfY?ttc&x{9NCJO8}{KP-;M9X^Jd8qo7;URC&RjBwggZ?4Ejc`HSJaI7U#?ZV}|kOo!6z?tb5F@I@Rk zX|wygF`lf1$cumVP>{pE9g4X6(_J-rIT|9QN7zubJaHBOp?lCyNcSUxH9C-ki4Znk zA6%={f7AN)#?|Mwh9$EuW~ApClv@+0;;b8Kbpkb-deLZ&D5Uj_WTMB)tdv@xe1%M_ zvGMppasCV1XuA^b20%ET5dWAS4V)%Ck5lFzLm1(dKjWg_v73>_|531VaeV_2InF}eK zq4(f9nP*MwFx_cP?+Ap_B~v4dB$c{H9OPu4&mUmoI2Gv6lI?ppFd}a&^wqu13NOah{gbVYX@+z z2pY+#D29+tKNMvJDX;Uvw*Fj8pqb-Lo+cw~tgNVkhjT}F_p^8g2NbOx6CEx6_zgOd zpWc(dKfJ1?6tmdXN#Cn=uP^CX*XL$)u+Wna{;4c`kp1x)V!T2xE7HmV*4HY%)yKI7 znz<1*h6oyx?19PDWp_l?58{P(etdm(>}E!A>)w4naq1zPO^zrg+;YFo3I6GQ-T3Vq z3VOqbb3~B3Q`-1JWAwJ)qqrzxWhk0OA*V(fPjjA_oqTal9S;}exjdulZ{dv7C3g#G zvcF6ezt)~YbyagJwdbI}Hp_zIxK2QKk-LTT0F%V6(pzeu7G!;Ht~(;AVf4k2DjSJd z0`>N5A5HiAU48v{$&KB@CSu;VOGw8rd*`c}X3{KB37>!-er!CchqWV&UtNyq9&@F; zQ2dB`E?YHEPOoE(Aw+uvqPs}?sKD%~<1>EF@@pCF~1rHM~>`95Y z32{(f2nEyX%*wY(E(OM20y#mn7o+Vwa`7q#l_|2>k2}<`#w9kHe57#WS4v?A%C$RdcfSZwdSq69wX8ztVi8(>}dS+ z(NA{euE`Lnf{cYbdbR&0$Nr@>E^YMpxMdoDTVTK@6;$P|QL7c?f&9fG3YkZyOC%>q zbXRuRzC?3P#gkV(e2dn`qI{`sIJdE4yi%B@bYI8?zj^cSLl|7IxT>|jBG9$#N8M$A z*`5#HfCRi%?_2l#P*65U_=?L-tCSu~20c*`0OCDY_u1w$+hN<_^qLM397l>VHr~k_ z-Zfz03EV%Ehd`!9oa=a`mqt>TBTM`N{`shAx zShh*l_iNIj>7Wx*uAm;vmI*N5B(a&aZcR;rg5ZO2<+itW3GM{Vr1{=_HZg4|fm`RY z-Lh#@f&46~I%9G7Mnrte%=636QklieRGDTQNR8rP7aJQdsfyDj(IL ze;yv1(m5f8^+HX*Oe4WWq{u{`aRexHlLVFgcDVMFYVedHW{(@1gJjdc-BlA}Kqwh$ zfRzMm(zjP#pFYlaAl#(xyF!hgI4 qjqKfZ1uOp}tNo9<_Wqo@PMLuVF6SvHdBA6iM6;~tT3xVo5B(pMFd6v( literal 0 HcmV?d00001 diff --git a/DevOps/Hashicorp-Vault/vault-policy.md b/DevOps/Hashicorp-Vault/vault-policy.md new file mode 100644 index 0000000..32b759a --- /dev/null +++ b/DevOps/Hashicorp-Vault/vault-policy.md @@ -0,0 +1,83 @@ +# Vault policy +https://www.vaultproject.io/docs/concepts/policies.html +По-умолчанию, применяется модель «Все что не разрешено, то запрещено», то есть для доступа пользователей или группы над явно прописывать доступы к нужным SecretEngine либо на более глубокий уровень. + +Выдача доступа к SecretEngine строится по логике + +* Создаем политику и определяем уровни доступа +* Подключаем пользователя или группу к политике + +**Проверить текущие политики** +``` +vault policy list +``` + +**Чтение содержимого политики** +``` +vault policy read app-policy +``` + +**Создание политики** +Удобнее политику создавать через GUI, чем через консоль и файл. +Пример политики +```json +path "examplestorage/" { + capabilities = ["create", "read", "list"] +} +path "examplestorage/hello" { + capabilities = ["read", "list"] +} +path "examplestorage/ansible/*" +{ + capabilities = ["create", "read", "update", "delete", "list", "sudo"] +} +``` +**Подключение политики к пользователю** +Политику можно назначить, в момент создания пользователя — за это отвечает ключ `-policy=policy_name` + +Либо подключить к уже созданному, например пользователю vasy, который входит по логину и паролю, мы подключаем политику «my-policy« + +**ВАЖНО**: Tсли мы хотим назначить сразу несколько политик, надо их все перечислить через запятую, иначе my-policy перезатрет все остальные политики +``` +vault write auth/userpass/users/vasy policies="my-policy" +``` +**Несколько политик:** +``` +vault write auth/userpass/users/vasy policies="my-policy","policy2" +``` + +## Подключение политики к LDAP группе +``` +vault write auth/ldap/groups/ldap-group-name policies="example-policy" +``` +**Узнать какие политики назначены на пользователя** +Например пользователю vasy, который входит по логину и паролю +``` +vault read auth/userpass/users/vasy +``` + +**Узнать какие политики назначены на LDAP группу** +``` +vault read auth/ldap/groups/groupname +``` + +**Узнать какие политики назначены на пользователя при входе** +Видно в выводе при входе +```bash +vault login -method=ldap username=username +Password (will be hidden): +Success! You are now authenticated. The token information displayed below +is already stored in the token helper. You do NOT need to run "vault login" +again. Future Vault requests will automatically use this token. + +Key Value +--- ----- +token s.bwcvQFpodcXWrRiOYxLO80RI +token_accessor 6Ypav42huMYvQfccWYK6CNH0 +token_duration 10h +token_renewable true +token_policies ["default" "example-policy"] +identity_policies [] +policies ["default" "example-policy"] +token_meta_username username +``` \ No newline at end of file