From patchwork Fri Mar 3 09:57:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrea Cervesato X-Patchwork-Id: 1751408 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.linux.it (client-ip=2001:1418:10:5::2; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=YK3dbZYU; dkim=fail reason="signature verification failed" header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=ERYFPTe3; dkim-atps=neutral Received: from picard.linux.it (picard.linux.it [IPv6:2001:1418:10:5::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4PSk3N4FTXz246T for ; Fri, 3 Mar 2023 20:59:44 +1100 (AEDT) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id C80903CB991 for ; Fri, 3 Mar 2023 10:59:41 +0100 (CET) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-7.smtp.seeweb.it (in-7.smtp.seeweb.it [IPv6:2001:4b78:1:20::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384)) (No client certificate requested) by picard.linux.it (Postfix) with ESMTPS id 641863CB973 for ; Fri, 3 Mar 2023 10:59:38 +0100 (CET) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by in-7.smtp.seeweb.it (Postfix) with ESMTPS id 9128A2009F3 for ; Fri, 3 Mar 2023 10:59:36 +0100 (CET) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id BAEC820401; Fri, 3 Mar 2023 09:59:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1677837575; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=qsyib0qXpc86G+nWXSDb8lOiZcvn3Pkufl8MaeFZ8EQ=; b=YK3dbZYUFUNcd+XLDqDRn9X7oAc+Gty9ZPCaAZfGR3ri03chlQkS2Pl48wcJczUnXZtSV9 eVcqtqRQ5OTQItiWbKAGgqj2sGChzuBk2Cf9bla+vWsTmazOzM+sOL7QozormuCuw2pwMZ xi37dgBEAwmUA8J4it+Z7x0evwt6gYE= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1677837575; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=qsyib0qXpc86G+nWXSDb8lOiZcvn3Pkufl8MaeFZ8EQ=; b=ERYFPTe3EX8SXxmEk6OlCAKUKMFuHZDkTttVu22cegWZOqL85rmJSLsJ/wxGEljFT5X+lP CFgUSAQkotqX+6Aw== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 3DD6A1329E; Fri, 3 Mar 2023 09:59:35 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id DiMVDAfFAWR9fQAAMHmgww (envelope-from ); Fri, 03 Mar 2023 09:59:35 +0000 From: Andrea Cervesato To: ltp@lists.linux.it Date: Fri, 3 Mar 2023 10:57:30 +0100 Message-Id: <20230303095730.26049-1-andrea.cervesato@suse.de> X-Mailer: git-send-email 2.35.3 MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.102.4 at in-7.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=0.1 required=7.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS autolearn=disabled version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on in-7.smtp.seeweb.it Subject: [LTP] [PATCH v1] Remove tomoyo testing suite X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" From: Andrea Cervesato The tomoyo testing suite is built and installed inside the LTP testcases folder, but it's not used and maintained anymore. This patch removes it, so we get rid of ltp_clone_quick as well and make some space in the installation folder. Signed-off-by: Andrea Cervesato --- testcases/kernel/security/tomoyo/.gitignore | 9 - testcases/kernel/security/tomoyo/Makefile | 29 - testcases/kernel/security/tomoyo/README | 58 -- testcases/kernel/security/tomoyo/include.h | 379 ---------- testcases/kernel/security/tomoyo/newns | Bin 0 -> 22848 bytes testcases/kernel/security/tomoyo/newns.c | 49 -- testcases/kernel/security/tomoyo/testall.sh | 46 -- .../kernel/security/tomoyo/tomoyo_accept_test | Bin 0 -> 46136 bytes .../security/tomoyo/tomoyo_accept_test.c | 146 ---- .../kernel/security/tomoyo/tomoyo_file_test | Bin 0 -> 57296 bytes .../kernel/security/tomoyo/tomoyo_file_test.c | 304 -------- .../security/tomoyo/tomoyo_filesystem_test | Bin 0 -> 88160 bytes .../security/tomoyo/tomoyo_filesystem_test.c | 633 ----------------- .../security/tomoyo/tomoyo_new_file_test | Bin 0 -> 84864 bytes .../security/tomoyo/tomoyo_new_file_test.c | 627 ----------------- .../kernel/security/tomoyo/tomoyo_new_test | Bin 0 -> 69800 bytes .../kernel/security/tomoyo/tomoyo_new_test.c | 652 ------------------ .../security/tomoyo/tomoyo_policy_io_test | Bin 0 -> 49648 bytes .../security/tomoyo/tomoyo_policy_io_test.c | 195 ------ .../security/tomoyo/tomoyo_policy_memory_test | Bin 0 -> 34080 bytes .../tomoyo/tomoyo_policy_memory_test.c | 358 ---------- .../security/tomoyo/tomoyo_rewrite_test | Bin 0 -> 44712 bytes .../security/tomoyo/tomoyo_rewrite_test.c | 169 ----- 23 files changed, 3654 deletions(-) delete mode 100644 testcases/kernel/security/tomoyo/.gitignore delete mode 100644 testcases/kernel/security/tomoyo/Makefile delete mode 100644 testcases/kernel/security/tomoyo/README delete mode 100644 testcases/kernel/security/tomoyo/include.h create mode 100755 testcases/kernel/security/tomoyo/newns delete mode 100644 testcases/kernel/security/tomoyo/newns.c delete mode 100644 testcases/kernel/security/tomoyo/testall.sh create mode 100755 testcases/kernel/security/tomoyo/tomoyo_accept_test delete mode 100644 testcases/kernel/security/tomoyo/tomoyo_accept_test.c create mode 100755 testcases/kernel/security/tomoyo/tomoyo_file_test delete mode 100644 testcases/kernel/security/tomoyo/tomoyo_file_test.c create mode 100755 testcases/kernel/security/tomoyo/tomoyo_filesystem_test delete mode 100644 testcases/kernel/security/tomoyo/tomoyo_filesystem_test.c create mode 100755 testcases/kernel/security/tomoyo/tomoyo_new_file_test delete mode 100644 testcases/kernel/security/tomoyo/tomoyo_new_file_test.c create mode 100755 testcases/kernel/security/tomoyo/tomoyo_new_test delete mode 100644 testcases/kernel/security/tomoyo/tomoyo_new_test.c create mode 100755 testcases/kernel/security/tomoyo/tomoyo_policy_io_test delete mode 100644 testcases/kernel/security/tomoyo/tomoyo_policy_io_test.c create mode 100755 testcases/kernel/security/tomoyo/tomoyo_policy_memory_test delete mode 100644 testcases/kernel/security/tomoyo/tomoyo_policy_memory_test.c create mode 100755 testcases/kernel/security/tomoyo/tomoyo_rewrite_test delete mode 100644 testcases/kernel/security/tomoyo/tomoyo_rewrite_test.c diff --git a/testcases/kernel/security/tomoyo/.gitignore b/testcases/kernel/security/tomoyo/.gitignore deleted file mode 100644 index 698646d93..000000000 --- a/testcases/kernel/security/tomoyo/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -/newns -/tomoyo_accept_test -/tomoyo_file_test -/tomoyo_filesystem_test -/tomoyo_new_file_test -/tomoyo_new_test -/tomoyo_policy_io_test -/tomoyo_policy_memory_test -/tomoyo_rewrite_test diff --git a/testcases/kernel/security/tomoyo/Makefile b/testcases/kernel/security/tomoyo/Makefile deleted file mode 100644 index 00e4cc3ed..000000000 --- a/testcases/kernel/security/tomoyo/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -# -# kernel/security/smack testcase Makefile -# -# Copyright (C) 2009, Cisco Systems Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Ngie Cooper, July 2009 -# - -top_srcdir ?= ../../../.. - -include $(top_srcdir)/include/mk/testcases.mk - -INSTALL_TARGETS := testall.sh - -include $(top_srcdir)/include/mk/generic_leaf_target.mk diff --git a/testcases/kernel/security/tomoyo/README b/testcases/kernel/security/tomoyo/README deleted file mode 100644 index 0cb538868..000000000 --- a/testcases/kernel/security/tomoyo/README +++ /dev/null @@ -1,58 +0,0 @@ -Always look here for latest version of these tests: -http://sourceforge.jp/projects/tomoyo/svn/view/trunk/2.3.x/tomoyo-tools/kernel_test/?root=tomoyo - -These testcases test the TOMOYO Security Module. And they are not part of -default LTP build/install/run. - -A kernel with TOMOYO configured is required to run the TOMOYO testsuite. -The securityfs filesystem must be mounted at /sys/kernel/security . - -Preparation steps are: - -1) Download tomoyo-tools package and extract and build and install. - - # wget -O tomoyo-tools.tar.gz 'http://sourceforge.jp/projects/tomoyo/svn/view/trunk/2.3.x/tomoyo-tools.tar.gz?root=tomoyo&view=tar' - # tar -zxf tomoyo-tools.tar.gz - # make -C tomoyo-tools/ install - - Programs are installed in /usr/sbin/ with prefix "tomoyo-" and - /usr/lib/tomoyo/ directory without prefix "tomoyo-". - - You can make a RPM package by "rpmbuild -bb tomoyo-tools/tomoyo-tools.spec" and - a DEB package by "alien -k" after "rpmbuild -bb". - -2) Run /usr/lib/tomoyo/init_policy . - - This will take several minutes. - - Hiding kernel source directory by "mount -t tmpfs none /usr/src/linux/" - would save some time. - - Configuration files are saved in /etc/tomoyo/ directory. - You can do "rm -fR /etc/tomoyo/" if you want to uninstall. - -3) Reboot the system with TOMOYO enabled kernel. - - To make sure TOMOYO is selected, you can add security=tomoyo to kernel's - command line. - -4) Build the tests. - - # (extract the tar ball containing the tests.) - # make autotools - # ./configure - # cd testcases/kernel/security/tomoyo/ - # make - # find `/bin/pwd` -type f -perm +100 >> /etc/tomoyo/manager.conf - # /usr/sbin/tomoyo-loadpolicy m - -Test steps are: - -1) Run the tests from the directory you ran "make". - - # ./testall.sh - - Please don't run the tests inside /tmp/ directory, for /tmp/ directory is - hidden by "newns" (a wrapper program to run the test in a new namespace). - - You can use "| grep -vF OK" to pick up only failed tests as testall.sh does. diff --git a/testcases/kernel/security/tomoyo/include.h b/testcases/kernel/security/tomoyo/include.h deleted file mode 100644 index edaf1170f..000000000 --- a/testcases/kernel/security/tomoyo/include.h +++ /dev/null @@ -1,379 +0,0 @@ -/******************************************************************************/ -/* */ -/* Copyright (c) Tetsuo Handa , 2009 */ -/* */ -/* This program is free software; you can redistribute it and/or modify */ -/* it under the terms of the GNU General Public License as published by */ -/* the Free Software Foundation; either version 2 of the License, or */ -/* (at your option) any later version. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ -/* the GNU General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -/* */ -/******************************************************************************/ -/* - * include.h - * - * Common functions for testing TOMOYO Linux's kernel. - * - * Copyright (C) 2005-2010 NTT DATA CORPORATION - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "test.h" - -/* - * Some architectures like mips n32 don't have __NR_uselib defined in the - * system headers. - */ -#ifdef __NR_uselib -static inline int uselib(const char *library) -{ - return syscall(__NR_uselib, library); -} -#else -static inline int uselib(const char *library) -{ - errno = ENOSYS; - return -1; -} -#endif - -/* Is there an architecture without __NR_pivot_root defined? */ -#ifdef __NR_pivot_root -static inline int pivot_root(const char *new_root, const char *put_old) -{ - return syscall(__NR_pivot_root, new_root, put_old); -} -#else -static inline int pivot_root(const char *new_root, const char *put_old) -{ - errno = ENOSYS; - return -1; -} -#endif - -/* The sysctl() wrapper is dead and newer arches omit it now. */ -static inline int write_sysctl(const char *path, const char *value) -{ - FILE *fp = fopen(path, "w"); - if (!fp) - return 1; - fputs(value, fp); - fclose(fp); - return 0; -} - -static inline int read_sysctl(const char *path, char *value, int len) -{ - char scratch[100]; - FILE *fp = fopen(path, "r"); - if (!fp) - return 1; - if (!value) { - value = scratch; - len = sizeof(scratch); - } - if (fgets(value, len, fp)) - /* ignore */; - fclose(fp); - return 0; -} - -/* Should be a fairly benign path to bang on. */ -#define TEST_SYSCTL_PATH "/proc/sys/net/ipv4/ip_local_port_range" - -#define proc_policy_dir "/sys/kernel/security/tomoyo/" -#define proc_policy_domain_policy "/sys/kernel/security/tomoyo/domain_policy" -#define proc_policy_exception_policy "/sys/kernel/security/tomoyo/exception_policy" -#define proc_policy_profile "/sys/kernel/security/tomoyo/profile" -#define proc_policy_manager "/sys/kernel/security/tomoyo/manager" -#define proc_policy_query "/sys/kernel/security/tomoyo/query" -#define proc_policy_grant_log "/sys/kernel/security/tomoyo/grant_log" -#define proc_policy_reject_log "/sys/kernel/security/tomoyo/reject_log" -#define proc_policy_domain_status "/sys/kernel/security/tomoyo/.domain_status" -#define proc_policy_process_status "/sys/kernel/security/tomoyo/.process_status" -#define proc_policy_self_domain "/sys/kernel/security/tomoyo/self_domain" - -static FILE *profile_fp = NULL; -static FILE *domain_fp = NULL; -static FILE *exception_fp = NULL; -static char self_domain[4096] = ""; -static pid_t pid = 0; - -static void clear_status(void) -{ - static const char *keywords[] = { - "file::execute", - "file::open", - "file::create", - "file::unlink", - "file::mkdir", - "file::rmdir", - "file::mkfifo", - "file::mksock", - "file::truncate", - "file::symlink", - "file::rewrite", - "file::mkblock", - "file::mkchar", - "file::link", - "file::rename", - "file::chmod", - "file::chown", - "file::chgrp", - "file::ioctl", - "file::chroot", - "file::mount", - "file::umount", - "file::pivot_root", - NULL - }; - int i; - FILE *fp = fopen(proc_policy_profile, "r"); - static char buffer[4096]; - if (!fp) { - fprintf(stderr, "Can't open %s\n", proc_policy_profile); - exit(1); - } - for (i = 0; keywords[i]; i++) - fprintf(profile_fp, - "255-CONFIG::%s={ mode=disabled }\n", - keywords[i]); - while (memset(buffer, 0, sizeof(buffer)), - fgets(buffer, sizeof(buffer) - 10, fp)) { - const char *mode; - char *cp = strchr(buffer, '='); - if (!cp) - continue; - *cp = '\0'; - mode = cp + 1; - cp = strchr(buffer, '-'); - if (!cp) - continue; - *cp++ = '\0'; - if (strcmp(buffer, "0")) - continue; - fprintf(profile_fp, "255-%s", cp); - if (!strcmp(cp, "COMMENT")) - mode = "Profile for kernel test\n"; - else - mode = "{ mode=disabled verbose=no }\n"; - fprintf(profile_fp, "255-%s=%s", cp, mode); - } - fprintf(profile_fp, "255-PREFERENCE::learning= verbose=no\n"); - fprintf(profile_fp, "255-PREFERENCE::enforcing= verbose=no\n"); - fprintf(profile_fp, "255-PREFERENCE::permissive= verbose=no\n"); - fprintf(profile_fp, "255-PREFERENCE::disabled= verbose=no\n"); - fprintf(profile_fp, "255-PREFERENCE::learning= max_entry=2048\n"); - fflush(profile_fp); - fclose(fp); -} - -static void tomoyo_test_init(void) -{ - pid = getpid(); - if (access(proc_policy_dir, F_OK)) { - fprintf(stderr, "You can't use this program for this kernel." - "\n"); - exit(1); - } - profile_fp = fopen(proc_policy_profile, "w"); - if (!profile_fp) { - fprintf(stderr, "Can't open %s .\n", proc_policy_profile); - exit(1); - } - setlinebuf(profile_fp); - domain_fp = fopen(proc_policy_domain_policy, "w"); - if (!domain_fp) { - fprintf(stderr, "Can't open %s .\n", - proc_policy_domain_policy); - exit(1); - } - setlinebuf(domain_fp); - exception_fp = fopen(proc_policy_exception_policy, "w"); - if (!exception_fp) { - fprintf(stderr, "Can't open %s .\n", - proc_policy_exception_policy); - exit(1); - } - setlinebuf(exception_fp); - if (fputc('\n', profile_fp) != '\n' || fflush(profile_fp)) { - fprintf(stderr, "You need to register this program to %s to " - "run this program.\n", proc_policy_manager); - exit(1); - } - clear_status(); - { - FILE *fp = fopen(proc_policy_self_domain, "r"); - memset(self_domain, 0, sizeof(self_domain)); - if (!fp || !fgets(self_domain, sizeof(self_domain) - 1, fp) || - fclose(fp)) { - fprintf(stderr, "Can't open %s .\n", - proc_policy_self_domain); - exit(1); - } - } - fprintf(domain_fp, "select pid=%u\n", pid); - fprintf(domain_fp, "use_profile 255\n"); - fprintf(domain_fp, "allow_read/write /sys/kernel/security/tomoyo/domain_policy\n"); - fprintf(domain_fp, "allow_truncate /sys/kernel/security/tomoyo/domain_policy\n"); - fprintf(domain_fp, "allow_read/write /sys/kernel/security/tomoyo/exception_policy\n"); - fprintf(domain_fp, "allow_truncate /sys/kernel/security/tomoyo/exception_policy\n"); - fprintf(domain_fp, "allow_read/write /sys/kernel/security/tomoyo/profile\n"); - fprintf(domain_fp, "allow_truncate /sys/kernel/security/tomoyo/profile\n"); -} - -static void BUG(const char *fmt, ...) - __attribute__ ((format(printf, 1, 2))); - -static void BUG(const char *fmt, ...) -{ - va_list args; - printf("BUG: "); - va_start(args, fmt); - vprintf(fmt, args); - va_end(args); - putchar('\n'); - fflush(stdout); - while (1) - sleep(100); -} - -int write_domain_policy(const char *policy, int is_delete) -{ - FILE *fp = fopen(proc_policy_domain_policy, "r"); - char buffer[8192]; - int domain_found = 0; - int policy_found = 0; - memset(buffer, 0, sizeof(buffer)); - if (!fp) { - BUG("Can't read %s", proc_policy_domain_policy); - return 0; - } - if (is_delete) - fprintf(domain_fp, "delete "); - fprintf(domain_fp, "%s\n", policy); - while (fgets(buffer, sizeof(buffer) - 1, fp)) { - char *cp = strchr(buffer, '\n'); - if (cp) - *cp = '\0'; - if (!strncmp(buffer, "", 8)) - domain_found = !strcmp(self_domain, buffer); - if (!domain_found) - continue; - /* printf("<%s>\n", buffer); */ - if (strcmp(buffer, policy)) - continue; - policy_found = 1; - break; - } - fclose(fp); - if (policy_found == is_delete) { - BUG("Can't %s %s", is_delete ? "delete" : "append", - policy); - return 0; - } - errno = 0; - return 1; - -} - -int write_exception_policy(const char *policy, int is_delete) -{ - FILE *fp = fopen(proc_policy_exception_policy, "r"); - char buffer[8192]; - int policy_found = 0; - memset(buffer, 0, sizeof(buffer)); - if (!fp) { - BUG("Can't read %s", proc_policy_exception_policy); - return 0; - } - if (is_delete) - fprintf(exception_fp, "delete "); - fprintf(exception_fp, "%s\n", policy); - while (fgets(buffer, sizeof(buffer) - 1, fp)) { - char *cp = strchr(buffer, '\n'); - if (cp) - *cp = '\0'; - if (strcmp(buffer, policy)) - continue; - policy_found = 1; - break; - } - fclose(fp); - if (policy_found == is_delete) { - BUG("Can't %s %s", is_delete ? "delete" : "append", - policy); - return 0; - } - errno = 0; - return 1; - -} - -int set_profile(const int mode, const char *name) -{ - static const char *modes[4] = { "disabled", "learning", "permissive", - "enforcing" }; - FILE *fp = fopen(proc_policy_profile, "r"); - char buffer[8192]; - int policy_found = 0; - const int len = strlen(name); - if (!fp) { - BUG("Can't read %s", proc_policy_profile); - return 0; - } - fprintf(profile_fp, "255-CONFIG::%s=%s\n", name, modes[mode]); - while (memset(buffer, 0, sizeof(buffer)), - fgets(buffer, sizeof(buffer) - 1, fp)) { - char *cp = strchr(buffer, '\n'); - if (cp) - *cp = '\0'; - if (strncmp(buffer, "255-CONFIG::", 12) || - strncmp(buffer + 12, name, len) || - buffer[12 + len] != '=') - continue; - if (strstr(buffer + 13 + len, modes[mode])) - policy_found = 1; - break; - } - fclose(fp); - if (!policy_found) { - BUG("Can't change profile to 255-CONFIG::%s=%s", - name, modes[mode]); - return 0; - } - errno = 0; - return 1; -} diff --git a/testcases/kernel/security/tomoyo/newns b/testcases/kernel/security/tomoyo/newns new file mode 100755 index 0000000000000000000000000000000000000000..e790d2771ced0007ff364304b71dfcb2fb4cfad6 GIT binary patch literal 22848 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 YdV%r+bMWpuxqSO(NB&TOKmn@$FXt*$UjP6A literal 0 HcmV?d00001 diff --git a/testcases/kernel/security/tomoyo/newns.c b/testcases/kernel/security/tomoyo/newns.c deleted file mode 100644 index f888ca31f..000000000 --- a/testcases/kernel/security/tomoyo/newns.c +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************/ -/* */ -/* Copyright (c) Tetsuo Handa , 2009 */ -/* */ -/* This program is free software; you can redistribute it and/or modify */ -/* it under the terms of the GNU General Public License as published by */ -/* the Free Software Foundation; either version 2 of the License, or */ -/* (at your option) any later version. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ -/* the GNU General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -/* */ -/******************************************************************************/ - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include -#include -#include -#include "test.h" - -static int child(void *arg) -{ - char **argv = (char **)arg; - argv++; - mount("/tmp/", "/tmp/", "tmpfs", 0, NULL); - execvp(argv[0], argv); - _exit(1); -} - -int main(int argc, char *argv[]) -{ - char c = 0; - const pid_t pid = ltp_clone_quick(CLONE_NEWNS, child, (void *)argv); - while (waitpid(pid, NULL, __WALL) == EOF && errno == EINTR) - c++; /* Dummy. */ - return 0; -} diff --git a/testcases/kernel/security/tomoyo/testall.sh b/testcases/kernel/security/tomoyo/testall.sh deleted file mode 100644 index b103be6c6..000000000 --- a/testcases/kernel/security/tomoyo/testall.sh +++ /dev/null @@ -1,46 +0,0 @@ -#! /bin/sh -################################################################################ -## ## -## Copyright (c) Tetsuo Handa , 2009 ## -## ## -## This program is free software; you can redistribute it and#or modify ## -## it under the terms of the GNU General Public License as published by ## -## the Free Software Foundation; either version 2 of the License, or ## -## (at your option) any later version. ## -## ## -## This program is distributed in the hope that it will be useful, but ## -## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ## -## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ## -## for more details. ## -## ## -## You should have received a copy of the GNU General Public License ## -## along with this program; if not, write to the Free Software ## -## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ## -## ## -################################################################################ - -cd ${0%/*} -export PATH=$PWD:${PATH} - -echo "Testing all. (All results are reported)" -newns tomoyo_accept_test -newns tomoyo_filesystem_test -newns tomoyo_file_test -newns tomoyo_rewrite_test -newns tomoyo_new_file_test -newns tomoyo_new_test -echo -echo -echo -echo "Testing all. (Only ERRORS are reported)" -newns tomoyo_accept_test | grep -vF Done -newns tomoyo_filesystem_test | grep -vF OK | grep -F '(' -newns tomoyo_file_test | grep -vF OK | grep -F '(' -newns tomoyo_rewrite_test | grep -vF OK | grep -F '(' -newns tomoyo_new_test | grep -vF OK -echo -echo -echo -echo "Testing policy I/O. (Only ERRORS are reported)" -newns tomoyo_policy_io_test | grep -vF OK -newns tomoyo_new_file_test | grep -vF OK diff --git a/testcases/kernel/security/tomoyo/tomoyo_accept_test b/testcases/kernel/security/tomoyo/tomoyo_accept_test new file mode 100755 index 0000000000000000000000000000000000000000..7c7e5e2e84e9020bd690beb5404f31a48cdf2d3b GIT binary patch literal 46136 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

1I^ZDmuQM~>ilZA3ZY|Q1L-T#3B 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 / tmpfs 0\n"); - fprintf(domain_fp, "allow_mount anydev / tmpfs 0\n"); - show_prompt("mount(NULL, '/', 'tmpfs') ", 0); - if (mount(NULL, "/", "tmpfs", 0, NULL)) - printf("BUG: %s\n", strerror(errno)); - else - printf("OK: Success\n"); - fprintf(domain_fp, "delete allow_mount anydev / tmpfs 0\n"); - set_profile(2, "file::mount"); - show_prompt("mount(NULL, NULL, 'tmpfs') ", 1); - if (mount(NULL, NULL, "tmpfs", 0, NULL)) - printf("OK: %s\n", strerror(errno)); - else - printf("BUG: Did not fail.\n"); - show_prompt("mount(NULL, NULL, NULL) ", 1); - if (mount(NULL, NULL, NULL, 0, NULL)) - printf("OK: %s\n", strerror(errno)); - else - printf("BUG: Did not fail.\n"); - show_prompt("mount('/', NULL, NULL) ", 1); - if (mount("/", NULL, NULL, 0, NULL)) - printf("OK: %s\n", strerror(errno)); - else - printf("BUG: Did not fail.\n"); - show_prompt("mount('/', NULL, 'tmpfs') ", 1); - if (mount("/", NULL, "tmpfs", 0, NULL)) - printf("OK: %s\n", strerror(errno)); - else - printf("BUG: Did not fail.\n"); - show_prompt("mount('/', '/', 'nonexistentfs') ", 1); - if (mount("/", "/", "nonexistentfs", 0, NULL)) - printf("OK: %s\n", strerror(errno)); - else - printf("BUG: Did not fail.\n"); - set_profile(0, "file::mount"); - } - - mkdir("/tmp/mount/", 0755); - mkdir("/tmp/mount_bind/", 0755); - mkdir("/tmp/mount_move/", 0755); - - /* Test mount(). */ - { - static char buf[4096]; - char *dev_ram_path = realpath("/dev/ram0", NULL); - if (!dev_ram_path) - dev_ram_path = realpath("/dev/ram", NULL); - if (!dev_ram_path) { - dev_ram_path = "/dev/ram0"; - mknod(dev_ram_path, S_IFBLK, MKDEV(1, 0)); - } - memset(buf, 0, sizeof(buf)); - { - struct stat sbuf; - FILE *fp = NULL; - snprintf(buf, sizeof(buf) - 1, "zcat - > %s", - dev_ram_path); - if (lstat(dev_ram_path, &sbuf) == 0 && - S_ISBLK(sbuf.st_mode) && MAJOR(sbuf.st_rdev) == 1) - fp = popen(buf, "w"); - if (fp) { - if (fwrite(compressed_ext2_image_sample, 1, - sizeof(compressed_ext2_image_sample), - fp) != - sizeof(compressed_ext2_image_sample)) - err(1, "fwrite"); - pclose(fp); - } else - fprintf(stderr, "Can't write to %s .\n", - dev_ram_path); - } - set_profile(3, "file::mount"); - - /* Test standard case */ - show_prompt("mount('none', '/tmp/mount/', 'tmpfs') for " - "'/tmp/mount/'", 1); - if (mount("none", "/tmp/mount/", "tmpfs", 0, NULL) == EOF && - errno == EPERM) - printf("OK: Permission denied.\n"); - else - printf("BUG: %s\n", strerror(errno)); - - /* Test device_name with pattern */ - snprintf(buf, sizeof(buf) - 1, "mount('%s', '/tmp/mount/', " - "'ext2') for '%s\\*'", dev_ram_path, dev_ram_path); - show_prompt(buf, 1); - if (mount(dev_ram_path, "/tmp/mount/", "ext2", MS_RDONLY, NULL) - == EOF && errno == EPERM) - printf("OK: Permission denied.\n"); - else - printf("BUG: %s\n", strerror(errno)); - - /* Test dir_name with pattern */ - show_prompt("mount('none', '/tmp/mount/', 'tmpfs') for " - "'/tmp/\\?\\?\\?\\?\\?/'", 1); - if (mount("none", "/tmp/mount/", "tmpfs", 0, NULL) == EOF && - errno == EPERM) - printf("OK: Permission denied.\n"); - else - printf("BUG: %s\n", strerror(errno)); - - /* Test standard case */ - fprintf(domain_fp, "allow_mount none /tmp/mount/ tmpfs 0\n"); - show_prompt("mount('none', '/tmp/mount/', 'tmpfs') for " - "'/tmp/mount/'", 0); - if (mount("none", "/tmp/mount/", "tmpfs", 0, NULL) == 0) - printf("OK\n"); - else - printf("FAILED: %s\n", strerror(errno)); - fprintf(domain_fp, - "delete allow_mount none /tmp/mount/ tmpfs 0\n"); - - /* Test device_name with pattern */ - fprintf(domain_fp, "allow_mount %s\\* /tmp/mount/ ext2 1\n", - dev_ram_path); - snprintf(buf, sizeof(buf) - 1, "mount('%s', '/tmp/mount/', " - "'ext2') for '%s\\*'", dev_ram_path, dev_ram_path); - show_prompt(buf, 0); - if (mount(dev_ram_path, "/tmp/mount/", "ext2", MS_RDONLY, NULL) - == 0) - printf("OK\n"); - else - printf("FAILED: %s\n", strerror(errno)); - fprintf(domain_fp, "delete allow_mount %s\\* " - "/tmp/mount/ ext2 1\n", dev_ram_path); - - /* Test dir_name with pattern */ - fprintf(domain_fp, - "allow_mount none /tmp/\\?\\?\\?\\?\\?/ tmpfs 0\n"); - show_prompt("mount('none', '/tmp/mount/', 'tmpfs') for " - "'/tmp/\\?\\?\\?\\?\\?/'", 0); - if (mount("none", "/tmp/mount/", "tmpfs", 0, NULL) == 0) - printf("OK\n"); - else - printf("FAILED: %s\n", strerror(errno)); - fprintf(domain_fp, "delete allow_mount none " - "/tmp/\\?\\?\\?\\?\\?/ tmpfs 0\n"); - - set_profile(0, "file::mount"); - while (umount("/tmp/mount/") == 0) - c++; /* Dummy. */ - } - - /* Test mount(). */ - { - mount2("none", "/tmp/mount/", "tmpfs"); - set_profile(3, "file::mount"); - - /* Test remount case */ - show_prompt("mount('/tmp/mount/', MS_REMOUNT)", 1); - if (mount("none", "/tmp/mount/", "tmpfs", MS_REMOUNT, NULL) - == EOF && errno == EPERM) - printf("OK: Permission denied.\n"); - else - printf("BUG: %s\n", strerror(errno)); - show_prompt("mount('/tmp/mount/', MS_REMOUNT)", 1); - if (mount(NULL, "/tmp/mount/", NULL, MS_REMOUNT, NULL) == EOF - && errno == EPERM) - printf("OK: Permission denied.\n"); - else - printf("BUG: %s\n", strerror(errno)); - fprintf(domain_fp, "allow_mount something /tmp/mount/ " - "--remount 0\n"); - show_prompt("mount('/tmp/mount/', MS_REMOUNT)", 0); - if (mount(NULL, "/tmp/mount/", NULL, MS_REMOUNT, NULL)) - printf("BUG: %s\n", strerror(errno)); - else - printf("OK: Success.\n"); - fprintf(domain_fp, "delete allow_mount something /tmp/mount/ " - "--remount 0\n"); - - /* Test bind case */ - show_prompt("mount('/tmp/mount/', '/tmp/mount_bind/', " - "MS_BIND)", 1); - if (mount("/tmp/mount/", "/tmp/mount_bind/", NULL, MS_BIND, - NULL) == EOF && errno == EPERM) - printf("OK: Permission denied.\n"); - else - printf("BUG: %s\n", strerror(errno)); - - /* Test move case */ - show_prompt("mount('/tmp/mount/', '/tmp/mount_move/', " - "MS_MOVE)", 1); - if (mount("/tmp/mount/", "/tmp/mount_move/", NULL, MS_MOVE, - NULL) == EOF && errno == EPERM) - printf("OK: Permission denied.\n"); - else - printf("BUG: %s\n", strerror(errno)); - - /* Test remount case */ - fprintf(domain_fp, "allow_mount any /tmp/mount/ --remount 0\n"); - show_prompt("mount('/tmp/mount/', MS_REMOUNT)", 0); - if (mount("none", "/tmp/mount/", "tmpfs", MS_REMOUNT, NULL) - == 0) - printf("OK\n"); - else - printf("FAILED: %s\n", strerror(errno)); - fprintf(domain_fp, "delete allow_mount any /tmp/mount/ " - "--remount 0\n"); - - /* Test bind case */ - fprintf(domain_fp, - "allow_mount /tmp/mount/ /tmp/mount_bind/ --bind 0\n"); - show_prompt("mount('/tmp/mount/', '/tmp/mount_bind', MS_BIND)", - 0); - if (mount("/tmp/mount/", "/tmp/mount_bind/", NULL, MS_BIND, - NULL) == 0) - printf("OK\n"); - else - printf("FAILED: %s\n", strerror(errno)); - set_profile(0, "file::mount"); - umount("/tmp/mount_bind/"); - fprintf(domain_fp, "delete allow_mount /tmp/mount/ " - "/tmp/mount_bind/ --bind 0\n"); - - /* Test move case */ - set_profile(3, "file::mount"); - fprintf(domain_fp, "allow_unmount /tmp/mount/\n"); - fprintf(domain_fp, "allow_mount /tmp/mount/ /tmp/mount_move/ " - "--move 0\n"); - show_prompt("mount('/tmp/mount/', '/tmp/mount_move/', " - "MS_MOVE)", 0); - if (mount("/tmp/mount/", "/tmp/mount_move/", NULL, MS_MOVE, - NULL) == 0) - printf("OK\n"); - else - printf("FAILED: %s\n", strerror(errno)); - set_profile(0, "file::mount"); - umount("/tmp/mount_move/"); - fprintf(domain_fp, "delete allow_unmount /tmp/mount/\n"); - fprintf(domain_fp, "delete allow_mount /tmp/mount/ " - "/tmp/mount_move/ --move 0\n"); - - while (umount("/tmp/mount/") == 0) - c++; /* Dummy. */ - } - - /* Test umount(). */ - { - /* Test standard case */ - fprintf(domain_fp, "allow_unmount /tmp/mount/\n"); - - set_profile(0, "file::umount"); - mount2("none", "/tmp/mount/", "tmpfs"); - set_profile(3, "file::umount"); - show_prompt("umount('/tmp/mount/') for '/tmp/mount/'", 0); - if (umount("/tmp/mount/") == 0) - printf("OK\n"); - else - printf("BUG: %s\n", strerror(errno)); - fprintf(domain_fp, "delete allow_unmount /tmp/mount/\n"); - - set_profile(0, "file::umount"); - - mount2("none", "/tmp/mount/", "tmpfs"); - set_profile(3, "file::umount"); - show_prompt("umount('/tmp/mount/') for '/tmp/mount/'", 1); - if (umount("/tmp/mount/") == EOF && errno == EPERM) - printf("OK: Permission denied.\n"); - else - printf("FAILED: %s\n", strerror(errno)); - - /* Test pattern */ - fprintf(domain_fp, "allow_unmount /tmp/\\?\\?\\?\\?\\?/\n"); - set_profile(0, "file::umount"); - mount2("none", "/tmp/mount/", "tmpfs"); - set_profile(3, "file::umount"); - show_prompt("umount('/tmp/mount/') for " - "'/tmp/\\?\\?\\?\\?\\?/'", 1); - if (umount("/tmp/mount/") == 0) - printf("OK\n"); - else - printf("BUG: %s\n", strerror(errno)); - fprintf(domain_fp, - "delete allow_unmount /tmp/\\?\\?\\?\\?\\?/\n"); - - set_profile(0, "file::umount"); - while (umount("/tmp/mount/") == 0) - c++; /* Dummy. */ - } - - /* Test chroot(). */ - { - set_profile(3, "file::chroot"); - - /* Test standard case */ - fprintf(domain_fp, "allow_chroot /tmp/mount/\n"); - show_prompt("chroot('/tmp/mount/') for '/tmp/mount/'", 0); - fflush(stdout); - if (fork() == 0) { - if (chroot("/tmp/mount/") == 0) - printf("OK\n"); - else - printf("FAILED: %s\n", strerror(errno)); - fflush(stdout); - _exit(0); - } - wait(NULL); - fprintf(domain_fp, "delete allow_chroot /tmp/mount/\n"); - - show_prompt("chroot('/tmp/mount/') for '/tmp/mount/'", 1); - fflush(stdout); - if (fork() == 0) { - if (chroot("/tmp/mount/") == EOF && errno == EPERM) - printf("OK: Permission denied.\n"); - else - printf("BUG: %s\n", strerror(errno)); - fflush(stdout); - _exit(0); - } - wait(NULL); - - /* Test pattern */ - fprintf(domain_fp, "allow_chroot /tmp/\\?\\?\\?\\?\\?/\n"); - show_prompt("chroot('/tmp/mount/') for " - "'/tmp/\\?\\?\\?\\?\\?/'", 0); - fflush(stdout); - if (fork() == 0) { - if (chroot("/tmp/mount/") == 0) - printf("OK\n"); - else - printf("FAILED: %s\n", strerror(errno)); - fflush(stdout); - _exit(0); - } - wait(NULL); - fprintf(domain_fp, - "delete allow_chroot /tmp/\\?\\?\\?\\?\\?/\n"); - - set_profile(0, "file::chroot"); - } - - /* Test pivot_root(). */ - { - int error; - static char stack[8192]; - set_profile(3, "file::pivot_root"); - fprintf(domain_fp, "allow_pivot_root %s %s\n", - pivot_root_dir, proc_policy_dir); - snprintf(stack, 8191, "pivot_root('%s', '%s')", pivot_root_dir, - proc_policy_dir); - show_prompt(stack, 0); - { - const pid_t pid = ltp_clone_quick(CLONE_NEWNS, child, - NULL); - while (waitpid(pid, &error, __WALL) == EOF && - errno == EINTR) - c++; /* Dummy. */ - } - errno = WIFEXITED(error) ? WEXITSTATUS(error) : -1; - if (errno == 0) - printf("OK\n"); - else - printf("FAILED: %s\n", strerror(errno)); - - fprintf(domain_fp, "delete allow_pivot_root %s %s\n", - pivot_root_dir, proc_policy_dir); - snprintf(stack, 8191, "pivot_root('%s', '%s')", pivot_root_dir, - proc_policy_dir); - show_prompt(stack, 1); - { - const pid_t pid = ltp_clone_quick(CLONE_NEWNS, child, - NULL); - while (waitpid(pid, &error, __WALL) == EOF && - errno == EINTR) - c++; /* Dummy. */ - } - errno = WIFEXITED(error) ? WEXITSTATUS(error) : -1; - if (errno == EPERM) - printf("OK: Permission denied.\n"); - else - printf("BUG: %s\n", strerror(errno)); - - set_profile(2, "file::pivot_root"); - snprintf(stack, 8191, "pivot_root('%s', '%s')", pivot_root_dir, - proc_policy_dir); - show_prompt(stack, 0); - { - const pid_t pid = ltp_clone_quick(CLONE_NEWNS, child, - NULL); - while (waitpid(pid, &error, __WALL) == EOF && - errno == EINTR) - c++; /* Dummy. */ - } - errno = WIFEXITED(error) ? WEXITSTATUS(error) : -1; - if (errno == 0) - printf("OK\n"); - else - printf("FAILED: %s\n", strerror(errno)); - - set_profile(0, "file::pivot_root"); - - } - - rmdir("/tmp/mount_move/"); - rmdir("/tmp/mount_bind/"); - rmdir("/tmp/mount/"); - - clear_status(); - return 0; -} diff --git a/testcases/kernel/security/tomoyo/tomoyo_new_file_test b/testcases/kernel/security/tomoyo/tomoyo_new_file_test new file mode 100755 index 0000000000000000000000000000000000000000..56c7216221421acfd1fc2b47b1a14ddeb820e68c GIT binary patch literal 84864 zcmeEvcX(9Q_Vzh5NthIpKqv`yfD8-~Qs@GK3C#p4K|w*p5K^0dIU@Uf*ci)@fbslNW)|FG+agms=}~pIgg_B_KZ@~ zTL)yh*s)S?h>ay~J>2-WokYnn^j2HvHeA)ojYpN_);&oU_11`&W$Mva-z-`7&GHDs zzokQ1Dw5?^>(M>xol$ycl%C!mQI6@Yj*qc%ovPxSYV)APvWFXEjQ9;~Da$4In75F$ zXS^t4>k)+BZjx+6Z?)bO=+VzVyQs7n7bttpuJDTG+R=q^x>T z-$g?P^&K=IwW>U|pNP8+9AQe&n>5Y%aL0-#HlF)z^@r`_4;}xgV8(A-#=k+o=>zd7 z!-ew79D0^v48_Wr*atde?SoY>luO3y#Ck5)!B_`i?Si!@*8W)2u=c~sB@$~_tmj~L zV{MDI7uHr-xzJzQq(7-x2Vw1tbs*LjSm`VKT@2Qy7Tpd_)meE%tOZ5Ks%>-=b!4fo zc~)(lh0_CcdsR-twl&rcSfjA&KG_{~ORVj%CSXm+nu0Y0Ya-U(SUY0n(oJqed(da* zMf5KcX1t9&=Dm04b)C*VxmNF{-~=z9ph#armyW<`ioYI$P4TBR!ynTOpKaU}&SlN; zr#HiYxf%YDX8ixP8TrCy_^&p@zrGp%;%4}5n(=3TGxBWvrt-6=8Gd9l_#ZSQ|5`Kr zkza{IZ$^G%GyFTicLFPP`4)_(^2~j%DgKCN@ZW7l zp8IxFI2;?A;%{z-&+(%v`Ekwo!?C0(d0R8`KQ<#@)(k(d8U8QL@E>l5KeHKsIAAs9 ze@Zj*JQg)2KcN}^@@DveZxZKu@LOTTK9cVN6&SM*fF|FV;{g@m8&%~6^NYMjadByN z)jT6FucES~%v+pSFmJw5w5X_{)F>{mC@M3myp?4I3o49aZ)J5^LB6-hxH7-QYgCj} z6v?`Z#gMF=Z&a7zKtA7CFu$;*(#R`X1fjV_-ine!qiXR2QB{m`6_rXQE-0gNfe_Ct zs;n$4&nqp5g_80zV@^p~p;1|sUkJyFEuK|*3(KqFbVaqdK>Su2#RaA1RrIA07)D8X zfwvS&Rb>{fyu3vV=9iTh8U=ua_LY?-h@-NoEPnwMi@flzXijx8T`QOe=kpc@*(@z8 zsz4A`1^K1ONJBBC0@;n_iswyY*=DR`hs1Iy&m*=x#&h1Fmm?OwQ!}yE{giVe&ISC-9FHK$ z=lsCG%=QS9b17v~lpPknO>pE-yoGPK@DnY3>zvDJ;nTKW+!nr=zo?3I3!gseWr&5Z z=S{5hSolbsf62D+IoHxlu7z)%*G;$Zt#irQ7Cz@_dYNb8>vN0-YAt-u74>q5h0i&&Uba~HoLlSVVGE!0PQ7fk@b$cvb=xfbL@kVM zy@k*DtzPz9_usveo^Bh7iJ`11c4|+La;dj$aY|mKu-7S1W zjqB`dJuG~Og`aHU$6NR=3qR4q=Xs7^oECmB&BWGi;d4%`mvjriw`O8H#KPyffnGco zKF^`_l5OGl(M)V}EqtCw>1Dcw&+{z3%(n1(-lms%7Cz^!da1DRIhWGQA`8EtW@5YC z!tZb4ud(oX{-~E)3!mqJdbz{G=Q*NYwpjQ)7u8Gl%5NRnYs0H28AkT%dateVK=#U) z9eZ@O(KzsOR5iLv@f+9G1B&H&tZz8dh{ZLBWe%AQ2SoW2mTfH8i}D35+gaW!%Hvt) z(Acm=lt;15A+e!Wl!vm+p|D}ODEDKT-Lj!Vlv7yd(AO|ql)JOcA+I4O|HI_LvHEa>(mssYI)KDwRJ6PsW)UaHX|G_ec zpoR)jew1YnJq@!(`EM+9$Z5zG<-1tsA+o_E${Shc(9@7E$~UmgA*aD9$}3prP}2}E z%2%<>A*R6)1>-{B zRnW>fz3Wkr$EXRPcqs%DA+WkWZuRRJCF*{ngPtsp;cG?rRwD`F7ndTkRd1s@yJnwn zI{>8Eno$t@nns0~TZqk8VjKNp+bFijFZT0%qTQgx=F1>{08<8W7Z@wgM8&O+ro`IJ zk5J`a*5amWKB;2OR{y1%yNSaRdR z5Zql~q270{tV&_kFn`s<@XyypR>iT3vsJ<*VOIS^R{fn-?B25K2&--vRhes0wVf&0aYo05UU-Aln@_!v$nsFN zwq@^2L_)?>z@HE(PLYa3$>;tl4JPKmU{6%}zQ;iTDQnGoj^DCAf?X?u^;aOV8TB*w zY-dyM*aw%;+M9BeAPk&9yNG?ow-?m*M2dOv^UVj_*NhU!Tg;-QX9hAS%21H_vWoAN}Tu;@XVkIW=!zmR<9C_R6Cta;N6(t53xak-cyC zlf$^#SKk)L+_rCyGYsreV+>>3w)%WjWQyOKW8U`LU`QOgTh7`=X5$edH)~I^*w&FZ zE&JO4D243ZzuU8GPGs-)jm$RpX21Qrx2+!`I)Gqk{pFe0X2U>r`)S!V$9zjM0PYPh z2gjVXN8q2@Q(T-H*L4-WzytxNYL3nNrUu3(D{ETTRI%GkyHM=qoNxGg{a5V~JH;OH z%FcOc#O>n|crBV_#yqi0t=!|-F%QX-sh&!ewdbG7Uj1tI$2*;KJjU3Jqp&xj=7`t_ zvuh4x_sg#Ny6!Z0JPP=ZoKa?;f^T)1_>p|KeKhK1Z&&@?g*a8{hT}J(cng-v~KQ}f`sQJ&Xhp5VN^wfip zTnovpZPUSnOx*4DJD$>7oiO5WyMh&QW9!lVu7G|+A7q&GEOe$RwBZ7d?8vpqg)b8_ zs2ap79wTMdHdb|)RUKK?%U^YbRV`$d5e(=Ug{p5E^xBrkilNopua(ZKw?$RvYpC+M zNMmA{UGv?{Sy`86&1!h&G!-*19mjnfMt0n!<3cD8LR{`i*MPG0klL)N(`tUau;v%v zyFXID?R#T!k7=#5ZacIy>ZQ*9pBfuItB!jUR_-yqNwl|X7pfZ!m;|f3XV%JJO>gR$ zny-8l0Z)PKnwRQcf{Z%UHLM1NP&`J(eXu1;Z?d!$*lv^61VZbc@HUt&p#a z!VkHpeh^%*eJ}Qo&NvQ=F0S^DdiLe&b|{HM9#N}+vbsJi?v|Iwu0HC$7dr+~W(jU} zEyKS8h*>LtH@#Q;_MU2N+y_H2b?wWHOXQzTmNhHuGK@5E;pZJKP`|4!Obh3I8T5N? zW_QHa;1avd7`pnMFA>0qyZYfe1Huz(zTVXnTXajdUma7ps|6Uo(!V^<%CM{5c&U@o0d^O-f%zKudRkmgY; zp-cQJu0HD5AceIc~EzIq?S%0hM4%HNo;+fG{YMb9kxlH+m{`7-Ii+RU%# zAYXabeEEO|&;9xOT<0qf8g-0c<|~)Q(0pAidg#;~=1lg?g2Qs8zxLZi=4>cJm{9Xw zPR+}{dtqqe>Z5V1qR=yIUddh?_K9;mvb#332u@8X_$_<=rOELtUx{Ha?WY@>lTSxZ zP5s!6)9Bs>$9>rX@r3B`ND}(`gqqL&-S=x45#6^24dT!30LhizcPyZ{$Dlf>`#zq% z{%TnMFS@F)=zEd(JC|S6CqA=!WA<8avSa-EYlgM-ogj^F`vv-+39b zr7^ND%gRH8uor&iTMohOwNsNFJWBXRi7xpo8nuq&r${mS=r>?k#()d!E`YN*NyupQ z)pCN2PLT~9!QN#@48Fx+`&OOMP6Q1}wHMZ1=GV`KVBLHafi;FSFSZi!pGXcS+7-m5 zxWw(I#bvQI&2+Yy5y$@v>lXU)PjHF}I0u9TTPl7Cw(sb7P5a0BK;25|(^d!ypLX2@ zhR-Ant0c@u!rbGB5tk{7Ycbw#>)&tipdrpd8FidN2x086+rk;!m}D=`VXjF}Pse0x zOmZo@eIvFQDUmpyABucP0~ss^!tc%^gOjxhEC##@W06fGYk$N9v+iDh@kr}{l#z=7x;^(F|)-vUgBtU)qUZ=VyZ>bHxly>-(5IF zivb%w>~|gs*Jd7ufE>d+Q(_S$GESrVFscEQD`B346iMG1)Mu~1CfV!TY{B}6#Jbs! zCFUza>`D!IqXb+d0Sh5Y()SSReK!2?6z@k9W6?h8&SesFq#tt$B@cm1$!8%c{2VM{ zmm+?I+Y-_weYp^>t6@^EL-*qG=0AbZ?GpOva2r~EB0nWvLmF|H`gR@Xscd81s^PePdy~U+TU}pc_r%@0@2A7QbLDZj18mEz zO_z>k(3xMM4adfkK0#VI))UmqdNXd--*KVKcL)wMpBrIUtP&F9!sivC+0jkj_oUX=JA(4w7iRts_L=_du@Toy#~>Y*ev`?~~FS_f$ObPZLW(<(!u5-_(yn|mcl z@pdQ%%q`ZsCvjC0=BD_~-4vviA22sgt2_ghfVl*1?xG+?caXU#tvg?u`y3Z0WOU9T zt&?av72O9o28x9A2{Ly-G(|GM0wlapY1z(Rfn5_b3S{PPt$P&LU=dxF-`vwdS}OzQ z=4q7&pb{9xv)4bKycM{B%5re`WPGHvGlI(;>?EK$tUyk}Z z=0KeIey}|mbZB%i7M$tZg6RSIm`mKo!Tt@9G*cZ$K|h_YoV6?3%t4;F|9y zxG6HJQ+t^|2By{n7eupMfp`&4qCcFALKR)oZE8hntu&b>9wjkqet^3W4NSle^a6R* z|1XR48&C`!NjISurk;Rw#_4^W@8EhB5bJE9c2NU?{F6Eiu4WGm-ic|<%3rWM{R0gF z-7BCgJKR&Dic6u0>{6>hYgIri(8bfCEc#p(bOU{EY>>rXTGuTtHsa2Uw3r#B6&En~ z112}Z$p&1m0B+bwk(J%hBFWSpum?(C>cJ-IvxB|kegsmtn_0*L4=w%1SJo^%g=3URBJbA-5nrk7FG~O;TVN;5 zpN+E`II7_<*C6fvAidZnVH(%+;2}C|igtDZ&;rgTXlE~yY$g3GuI`J_MmA|XGAM>` za2OFWtZS)bc$fpr+RW{Mkum%P7tfAi_m}<{9@HSi{2&DYkuj*u76VRX_7R}%%4LoZ zW4A>#@nb}gVjt`CgMI~faJ=EEobPJ%G3gO)pj95F6;{>kk>@5eMCZhL zS?(7B`(9~(n&1A-#5@hD6i5li4rkM4&u9Z>lD>F!}qYo?ysDnt+NcgOwRgcDaPCvxrBm3=)dPFyLSnC^GtHt6o6yswXPB0Cf%TcCXM zxk}Ce>BLs)L==!n`X(wTJUi~s7f!5IPI&lKk#959Mc6ptoWvm#nRqu{XQCCIpuF!P zv=~Df5{fcJpiI|JJSC2@yVS&FHIT%_WIw}$dV1)T0s?R%$>PKU>BJBJG42|lz<(l=T;;oNcmZjp(5RVJK5{T8U}O!#nEL?&KM)0t>N zCnzt@_ZdoJC`zJ0nWUX~Kpa_jImU{S>}nv9^wq&PIk$M0Xipsu7_E{7K0s%>F`7{vD{Qy7?SNkpP@hkkyJxr*ULqSBckmdwS zjZf(^aigG4(zhDgb&W8$E75~uge9h-(o#pir5UtDS>JcCWYIdH&9#6E_E=@)6WnqU zMx4P$?z4pRK8}$H=Xr?AVd4jRER5U`Y-GMR@;7lv*G3j;BRipJ@oBilNQE>q#c$*$ zzY$lkkqB)hGssASHgZw0kq<^e;d7u#(zlL^X>9YCuoKpe1tp7r zw-#oXYk^K&7*r(CYmh)^sFj8foMRXyeF=n^L5LheTtUO47-cbB zheI;rycbF`nV%4rvc4*4NrlK@{nvEF*FsrJoF`p4AYGUUG?KnrfK9;j5&yv0l2N~% z&&=$YkDt2hVW4>5D)D56iA%ZrPT`94K41FBh~ypNh&=1+3Rkn&%O@~)ltHs*U(Ft0 zq@|&L!@*e`Q^(^}29dm~f9+&3r?|0~!JU2^H7|j66ixN zTOgN-kivaEUXjNQPB2=4(eTmlxIB5-_sb#B<0SnZ>9&&og7nefgvG3#;1ARB?9Gnb+zKL`TNv|Zm7AHX9UnyiHJ)iV;%yYrdBRx;j z7n1%2vqSLDBfU=2!$`X%oksc#%$p$7gY+GeZcm!$h~P()j+S)e2cZ9j*#P*bNUxIg zSENUg{?7L?=~r;f2mKc5m6F~=dNK}E;Qy0!yrdr^y&r=<`1g{ok@U@^vm|{zX`7_4 zCcOg#BIL_SU(Mn3F{=BVHRLqFe98?t2Keqc_`2fU3sVZEzo zcRaC@y}mEE7iQJ`mQ!Pu9e3#YO=HJ=4 z+n;^zC)Ho`W{>Z*b(Q9&$~2l--*%!znyrASqXw{j$3y>cT9^2M7p z?}Canp_|8aDIN8GiWcOnKdQ$6R*$Unzp5kJqOwT7DWmn~;Qbt}xL|(4y!=XqB46)O zI^wMwsZuZxZKY%i=9OPr=BMXY;*}zyAm7;0@|ES~ey7W;%QRiRz*49vSy=AP6Owo% zr~Jx1k@hsaGn9sK&?JJXI+8QM7w;@tH42Lsrj=FWr5=$r@rqC$U*wUglae9>Y_@=6 zn&b&3@!pSBGR+Tqwn9ji1%{0(tqN4#Di)UXuCi$ESvHM>JZ1o@}-n^1! z$1PNyJP>TJ6K z{}$vg$}1}KRxZx$mp)*KjwcOCC=f|1EApn5R4g2TAMv7KXTK3Vb`K{_Hi!1y0FBXiNiLIa+O7wV{Um$q55+(m7Bsck>CH9Oje zZGu8;te$S$C*BTq+aW1?3^~OfNnYiW6#>Q>nFMq4Cu@CsQZ-bAm^BwT9t-$sW zw)NQJbkazFud#6qwzF~ix*Xg3gN=>i73*FZo)epH-)Tn0y2r#ivtkn=GAhVThrS3W# z1g^7>j&-gKTM!kS2vd+9A3fDiPmRv<)8nHdEk&TtSiZ$N8+cjRNF1GaRM#i+>J~r05jxk*qJ|;GOWyF-& ztsdK(4x;TlBzevFM~+p+(B z`)*^SIOvGBt3;HtT|1#J9({8rs2#8Tcy$e`VmW z4E&XWzcTPw2L8&xUm5r-1Ak@UuMGT^f&YIpuraPiIZh;2vl8~7e+2UR|y>Uq6_3$LAU(bp30uz6TCe*C?$oLgs@hZ_UW zE{SDZq(^M=D4JNZRlUB%`jGOM*F?C8Yc|-n6{WxrFOhKZ<$1&wmqx^LMmeId^R-a? z_G&vX#v>@rcc`+CW44luR9kHy4^@eH4n=!JO`|I7JfBeI*{WWt|3BO4@70GIyiK+D zgKGP{+U`}`gKGPw+MZV1h}Iqf)lO}Ds_h`P9jCSzsco^^E>zp=)b=*DeNb(mSKGa6 zdr)n^RNK>P8s_pY?yH{-ws_mC*ds=NH z+9>;K+f!`^sqHwmy-00~)pnuUUZ=LVsqKSm`@GujRojDVE0S&b`M@LXZy6@HPPLz& zH+u9?r~ATb7mjsK;D`BpI|ru@OilM|^17qk7i5n9C zjNzhw0e)q@9zS?LfQueK^!_iof!_%rZN^RbmHPE+d^*%k${bPgi)-m%@q0~N#5GVs z1^>wS?kd)JIzJnO#r!4d{{{23e5LB&dORAU@~X>zMMb1wtMVy!b)C;>6$iyQHjc$= zE+2;9FmX@9VNL-Zvl8Pht1rcBy9)?r`*T4?+C9pyJuDpGbvDBKfh+#Ffz3D%l*3#} z1{U5x2^eUBz{89g;5*Fo;a5yO(z*hJqS+iR z_H$!Kyns6UGZ;i8d-kTZEj%9}_PddWNH=>^nDi^W1hl;Yqh(|Y-sA*AcpNO+U!>}W z5v+^^e&j}0+CPFvkv9wSL#o^&1P&AQHo@(TbVS}RxQ%cm@{Z+H<9FmD?-bK^o$@~w7*-BP8xk#kUc5;`UvDP(vgGT zD3Zv*9`M7-u$RJW)Y!v@VMH$m86O?B8tj;%@HRSzJ{U1qAwALYZm=Cj^doSkHYRl( z8=w*jG3nO}p%^H{415^0Bj!BvGwVRd$CyY_%!p?|C&sLS)ff-EYp0kyaTJWnx(Bo~ z<};)GxGdS1-iq%Wt-i;M`yaS=$7TYO^r0vK$0NVH2oBrev?TNf>3LGn@c zh}HPvD#Ve8DeyZn&Ugu|m~!|XXRvjRm?-ci9Tw9D@y8kAFyx5gm*pfKZ$uZv)}i=} za~R`?NMw9}25rRr2y5|!*fx%sR!CU((V`! zoQNMrIz8qI(!)s)iHSw4#b=WC#9U5Y59#cfb+nsBIydHiL=iuV^z@j%2q1pUD7ZE| zW;NxSHb>=A5e_|FU7f9Gg}x*hsP0Gq>l&rGpdc$P~ZiN3i$P8`ZFp zjzK8I4MbI>gMX$bj!=<~a{LO}8$bxz1jBwVFk27EhpfF9ep*lL46yi)$YAT5$AlW2 zIErNa{qV8%4T8J`scF4dkoO=P2_5Kp#BoS{jBJU{9>-+2{l_|h#Y6z5?Xv_oV!D9e_Bpa`G9#Nnij1^0 zq922PS-Z}=sq_)(c3q{?60}M?C)rBrZLKt4M*f*DdyH__wL1lq?Yo%dxBG!~S3yUx zm&PI$!lG%!=OdiNdw+*m{D+7paZ3rDjAwHt-nX1&0RT0_bppg#3$FD$Jbx0QEZg4yF6Ds`?c!$A)ygd@+Fp~D?pxrTX0?B*eM8~AdNPdHO zJ9elB*B6 zxd|pXr3ssXvnt^;$gfG5kKdYv^MKRX){S4oG!o-G9b5%6=?DCDIwZ(UIM(UITgWwF zq0>kAQ#Rs8Xp<>gA zbs0eL`1=6cWzcexEnvNi=&)iYF%l51jQBT^%C5x&P>8<}+Fj=gHNJ7*^?8yVFM=cH zat=?C_S_X7u)vIhym_r;X0Py&XLOteC3A&jdRBPIliAz~=}v4Re8RTly9n1@c`sO) z^Hq8%WOU|V-7r`2afV2{Q!zX4Kp5d2INC+px8+O8E+0WXe4dT2h0cu4O-Zfc_Djh1 z?zU1Kk2V|Om)kCi$MNw^@Moi3jJE0a78?XhcmA2P+uM0Wp%%5~ca`|<(FOZ$4wyX> zK=3@bhXcgT6iZG4^_)_HL9v)8-lkeEs&;|VV=RczNel(yKwPeUN+YKLBeOXz5PVN_ zsy(VPuBSQ0Rt1gZ2cdCcq6Z`rBYxr4NglX+>_!!zJ?Zs42v>y?nl2Ehni=RCI+OzN zhC)SH;^%3(z*3~0UmO;T`;hXe46+wUS$g2QO5rY+o)T9$bwtT`lKO`E)3e$s&Zv6O zDgJd0*RM*@?-*i>v>);)!xBvk>FX-ynHK0jBE)}cv@eL(zP;32E!~N1?4h7-r7YfO59dpr;HU~~z1f~}CWB&Ikjaj5IHxP4TC?-FW z9E^z*9f7Gu{g}VlF}R7)`9zEGlaGD5=7nPN>&n5HBNV0<^<(~evBpfWD@=}Hu9cyf z{48@YCQcEBpIX$9`P*X}lXFMm=WWE?9E!>BIR|47RG3=SkNJC}#@wwjj}voyC?-Dy z9gNvuVd@Txh7pVD>m94|nTXLt>@6~)>r~hFTmQI9OODZ!uKPmwE75)Tc{~bU6 zd9MsQWv?0tZz;gwa7Y!lpfDLaVsPMR)Va{5bi@6flHmYywU*)MB$Z60o!?g%OG*p1 zpFd9UcB(+dXSL#*QBoG*R>f4SVx~p$xK`ZOwBj_YVzDZ0gT+=D;Sr8G)JVBnv0nx| zWsNF)jPc&B+l&L-D5a2LxOD0*~COz7I0d~?_!zlQ4RNohWnXtDGJWt%@cF{%`Qf0nB_Qn^?yv6ns~yG5zJ`c>!=~zv*I*_Tp2s|hhbvyXsMdDNf z-X*ujAGnh!Q&IIYP-Z{@O{-vrbaCi)_8_))-L%{xl7=1w`Mg!v` zCG@pSS)`pGALAm&I71-WdP&|EBJEkKk;VW(An`A}xZ;)2A0iD?LI;TS+J236i$>Z; zq?|v4bcGT!*r(oV-Bv|+R3kZXgmW$XGf0mrp>!f0yi_CcG(ki+ok-jM4AK!LG@D2t zKd6ybX{3jV^q)V2l;oBfuO-swCp6M~8tDv?dMTkl%=ly_R8OR@hPG3AO6E+0y&xNe zYu5jS#Hs()O6UZUeq2B#PW`<^;?(~x5}f+ifiRM1L*-tj(iIFY;V0gqS`Df`qx2FG zVLWzU0U`y2t4?YBTp$lp>0%G&#~Qg{f3Zj1->Rp1fqg^0R~b1LYUI@5_R7db#HNwO z+Q_{$64qP7{m(|W!H78TX{l6r6)gPp0Ol8(cFU?-fykrIKv31}_rVk)qN|J)yU7<>GHs!arK z0I{FMry%}A^w|o%l|;8KS?yaL`kH5fri>Z zsBwP=>Ix;q=~Q@MGhai!sG&Y1)QUfX>Zkj-5?W5Ee&*vEswI!+Y{3i=uAP4d>Nh2{ zl~BXXMh!JfL#-fGLZ6UaWsQ^!bXA*Uw;VGu=MsD1SS5UfkXhyhom9@A)R6BIa_0XA za<>wW=Ol8H`GAIO)R4(I%)37L-#|w8l@WLdIn_L)A#*ulU=FJZ*;PsTJINmfev=Ze zAY_3#wzCTSJ`K5#kXu3_`CUgYV%+5SH$@irE3qvEn`ds+V5c-#5{}re5C0t4z*K4C z0Kuxv!y0TXkNOODKEcK*DSxm{dse2za7)4nUu5>_qQbmggS|+wWq%ILl_ot)C)gVE zN)6Va!CK;I?i!?|n(~Yn#LnSN;1MO%mC3{seyjNj;W!mImvaIhr7tDHslW>2?pG?o zM`?bol8fxt*NUk?ZMCxUU8t2i%+atYtURf$ysfSLL@TlB67PSuvPN4;RVw~i?lB+H zR(kL-&sfeQ!B`f6a7}E|3O{sUSErcC)s!omTGo(^d{?D=&sxdCqLvUBz-tTXFE<$yicBxc=Rw6@JN+i)Z$x465wwYDh$|VG6EK9VNztc*0r4rmOO>_`F(7)UNkP(}>>Yn6E}}?_kNSCw3p(Bw};Awx5t3aK9zw3MJ(q*6#3Q1tvy! zDxnjE%COz7p%Qt-BGd>Fu1Eg>${xjU`H7>-ZYAc71lSPt>{-d@O3#iE>{6TQf1H&EOBOucdB%?ojV7S{@WLoyJ z#;!k!V7Pl&WHN$e^yd-`cR!2Fv>+M%DFwrwWszANB%?pGV7PNFGWP_@=ua>h?mUak z?jRZcc?QE>W|27-Br|M;%!=V&Vv&h-TVvOsbuirPEHZtAWb`K=4ENm@nJGas`g0J5 z`%#Nbb&!nzQxWdnO6IW(4dYHJ6KPKzE#1W+jg!ojy-KEQK6bWuRN=#khVi0M;QdpH=mHi|QFAgBvxDWND46oqCIu;0FC@s|)VdN+x0szSJ*ec)8nfcTp8| zXM(5@?xa~T3j*wOEil(uVMbYCZdUSeZH5KrpHe>3z9z`El*^Qi$WEmN=i`9gl@^?n zes;@%goK4Xzy z7BCd&l9-hKyEeqXuEa(4gpNu^+>z>KDY!FKVN@Y*2}y0P}Q*DUZM(DpwR6cTE_(T(8Yp}s{lHTQnA_kcg1eQfyakm% zNHpqnS8N(_^%0R;anCl=Un$VYD4{SlU}TJ{TwH*Y0f|NXU!PhYXSH@2mnU)-3bD;O_kXJ`)7+zKf#`+vIC>~J_L0xl9gvgI?x?R zRaFoG(Dm&H0^ATVI?tl>P>>Fcu2GeoZM`llL$ABK^_>Oc@(cgifg|nw0}NbLyT4{J z5|QQ)_+!PUYUco3-$uxofEO188;JT$&~WP;0PGMKDlPb`uZb#_lhK-b= zsV41sP9W05K>#qSuLl$0bin8oi%tSgkPu8DQhniq7Nh#wFL4iO8U6_&i%hpZvdI2*Jje(f8=xxL zpJV!|Hq=*04Y$4!O#B|ATKHXTf%HhNK(ZEFAoI?KyjfKfa;2`ehQ)MQWFFEoAz|qY z%EWnH%UE%c!ebUceNsmG2_t7Lezxd;R_OZbGV!~JY7u%$-#|8pNv%NWnW~c6yyR@i zi&Zrtm+ES3Snw)e$$SBbd$f$cifgzRSs-@nYW{&GE~+Q$i`X=COv~_(Az5UeR5G+xC9*QoZgmW?b+O1S)iNQD>FeCY`J0xp z;=tBag+u3e1vvsE`r0-D4vI?Q{0$bJQ$acae8S>b`+=$}SRDiI%NChoS|-G?14?EK zW+i!AMmL^noqt;#Stw+Lf5$EG>jUhcEr?GygJ?^Wsb@O&D^&!Qq}WWvw^}vCVSVkM z2hsRJB5-vJG;lfMJcUD<0ZK;R;0(y*Dw)R-_!KD<*efnomGp0(s1y+|P;C0QEWlo9 zf!Y)bwafzbjM71<8x@=T-8)hTr*3K(G~D{O0xg}^)zgD_i1#eWEeFee39Wuiv8kFI zVC!25G&owYF%8f+9SnE-^gxSTqO{l#ttFu)Zc3)tsM3x4R!`2>p?qPqLmU_U;!sCE`IqS3yy_%R^B)|c+-$AubEUxqi_ z-7*6CxLj$$4}B?~e%z?FLZ)X07S#s=2EB?+)fWP6ec7FUe5?@z)3XOHU?-Ip{Lq)t z3D)jhm5(FA`S4j(`wAJ6kDnErs$&9deaW1D6lg?!`P*=x(=U*ZtCSY}7^T<*+pM+t zSF*UM;bV%D*@ivsWi7+MiKS%30}1X~76TtE0~{MI22KXpixm6z^YOgKP!+$%G~Cx) zOb!mMhFj8Pt;OUdAtfe>4_QoBYUP&${^G1c`p0Uj?(AA#> z#piCPWOz)!Ld)=Pd&!WTs`>yTu06ZDkE-VI`H-jH#InlUrmVrGVr6+QL}igv7VqVy62@m4jx?ykaqPu8SlM5gBksR z1##AC8BefGt;NGfq)gy4#WqXj-q6ZVER|mbRl>Awi1dVk^SdfR7yEiyDm#Z(4p)^t z!_ShHf!wIT###WT3mFlwex`xv(bq`Tv(B}vlqzMmD4Ec6?Q4__&$VBaGJ$jL)fU_D z1#I7}*lmjp_Kj6q#@aU^^Q)3!_y4<=33S1Pb7lL{`aWGfZ(LCK(ocPG7x76MvmaXsKVq+) zu0Wi~N$h!+uGtuxCrmNc+RVj{VJI_qt~7 zK4!6dk1~Ls`+~*5vjMyN6`S|Q{^iFs+#g!_M=ktg7XGgm{`VGsn{1sE!~L6u-^ap_ z94d28yJIZ;wif=S7JfGi-)rIbweZ(j_~%;q_gna5E&LZO{3#axdlvpI3;$aSzr?~1 z%L&9=ZQ*ya@UOM-2Uz&)E&K@<{+$+np@si|g@28O|FngFi-rH9h5xvP|Eh)mvW5S? zh5v60|1%5!2MhnWg MkcXcw{A3G1d|05}hb#UTP@TXe%oh|%Q3%|F8zskZN zXyI?N@UtxZXD$4R7XH61{23PhQ47Dw!vEF6zrw}ihmBqiXoCOj<=C^ z{uxfOxbCpXKu^_wnyKoI2!3#eFGz~-U_=|?d~Z^G^M-G#$j>?0jkM2N;Ayi9O`Z?y zImpXgW>E0luJAb5Vzoc&1Gx-5jd!U<=Heikz$Nk$B{K+JXrYvmhi!5BETuwKi>Diw zS@0fGc(M%wHgB}ZydEUux0!OYl9AaMz^FT!>=fze3c3W5r!R^kI|rS!pLk8T3%N#@ zTOeW1Fj?5r)kBsc{yGY_=BBrB?C$T45fT;PtVX8#FNqLkX6|j22YAC#o@r7RA0Zj< zfgGNiDy}fhS>|I9N_Rqt?+u%mnTH`1wxNF4vO!l-D^J*c1p)(0i^>dhwn;0ky5aWg z2{_tuGAarHG|%L#zvqGPp5XLA1hX>a_dSG&c2d)#p@#cvRXG8bXLMx@W&^e*5S(IL zhJ*X9O6Fq7K)FSgvCQb+qa}pGH*DLr41RXyi{?jFGHPMiEHbO%ig2=A9EeZ=$C!tiuIGM`h8RyrOVkc-Vnh|K3yw-cGqsU9Z5=Tz<85$HMmY)Vh1 z6VK4Gm~%}VQYpTh(i2kRyD2#&_}!Fp5UxQ=MSV9#cf!W5OvE+7aPL(i^2-CMKtne0 zzI~R522jAYy1+M2-qy0n+BhkT&Ko;uQCgKvr84IF(IPGUYvIo={L{{2fMs`N?-HY~T@JXMdddN}tI_4(?8ZYxhpXr! zt%*M&1gqvI&M^D$U>_Y~5@}<1lviL_Q5xT)EV}ei(WP^H=q^1>b?F1TOAi+o?u5XQ zFO->NMuw$sit5heM0aipzWaodVR!yJ>aE?`Wmicrmt9php=dkt!1G3>%L9&?X`Y0- z=t$`R79Hs#66{D<(FO5wf*neyjqnJ1W6bj|fE2%iaSz4$F&fi_{`01i4DQ;m4fhC5 zcI|5j%HF9(<2C45a|=QFRi8e<61{UW3HHuvqJOH;o9vx96iaW1s06q*@M!Y~?d=`J zqqi>;Z?cl~e@dZkpr6PS_`%4w&KP^V6HP99)V5I`0Uy%i;}jx$_7Ew{IYLSY#b?iU z&$9^43JAHcReW~x71~fwze{2Vbk$mf&hFdVEsW7muw%9o9n0t}ot=v|=VET63E6d9 ziLUz{(jmL9)R@#$b=?Hfb)P^{j>c^)T{q4SsJ6nwX$Z*Cxt%EA*bDJ5S7tAkR*fg8 zs;=x5UD<{Pa<5l1?8;@Rw{~Usi>i`c`DR&(-M7*s@VM7kp%LG;2>G=+%%}(aRrL`t z%=YHzfD!%O1?!@}pHG7Qy__9J4CA><$H{%9i`jn~B-qzCQk1>tGziyRCDnXirxT*D zYf*n+?`p0iDEoT1-XQn|t1%?l*DnX*x>BM4abI_+J%X-tF*}<_w72VtM{lz?uV5u`+BmJ6@C3{#TR{jh%!r|oPdyfisG{)mT5!Q zzK-0vW?O{L?(5nu%*F60;tey*4E>s~xrv`A8(O@;%UTZ6N0EwQ19o5j=fv+Cic=rd*>?(!%hzeCaH7Q(ec-E%~_PYKj2 zhlXODc|!5{K(Xtes<254*c=#q(vBf$^L3M7Z5f`)`PP3p-NKNY#ER?m2a?4f5M&UW zuDTR+s$Dz|t|1v|pPl2Of{|Hbn13q)(U&lPC(MWNOMLCcykCBE&N;^e0gMGX9VGFT zDB_9O8JIqZN#av%mx1R1hLg6foU<)JNqqO|7NyluX_-5BO-Bm2FTM^L(Yt>F;d)95 z2JeeohD)PzN`-F`aE?}|L@R)4*2lpQf!Do{!kYxb^<9&APle#QrzYNOGfc!Ox1Bkm^} z=ZOCy!J)1-e2|~kOI2#Ewc3-eOCZF7X#|ACz?4sd1Jm^&TppznGBBMM-_%=3TxR)< zlJd9QON)uimV1V99G4CgE}^4GnD&oLwJI)*HsTm;bGQ_y7WHH9c|&7Hr7FxpAY7@T znA^_6#PLe_sYU&mFL#@%{LI&w>xr2Yih1NLOdRtBrWW;MzEZ6*w`t6y#4HTObc~Y8 zI6HPN>c`yss>X~F}D4kZ-4 zXWcYhJIb$Z`Fo=K!z9V)@nZtO#Hg+7gO496YZWrbsu9{39w%Hcs~Wx|Ack5sRlfm< zVyfQW7`Z+I4(D_DvA+#=`aV0$981zYQ6xE#c*F^!km~nOatkOchP^^D?1@V(pJ~_v zV`K>r4HpYoelJSGUL1fGqyU&907f37-Qhxk-(X6Agv01?Di~Q0JK%WtTS43T27CHX zqD60utm6wYg|goUmC>&N9t`4*u8a}%GY}kIgz&+? z9<(v)5g<5Tky`bBtyiR0LQ7FeKEAQbPiJLyhaX{cnIJodj`Y`}Ssp`Y!bH_cm`m>k z#jv@;udFLzA#51kwR7$+HAFeR5s`$6@9|2FVN&D2aMso+Z1BM7$;+!knKnR{ffQ-@ z9A#VM(=cab^^F8wEi$>1Hqww0TeWay6l~b4$z=%OXN`i(wh|%C;YJFVPOK01)=q>tA4YDDth8bgdCFy|b;-Uc&mbr=VX7xCRs*T*APk{IsM7Li+v`NRY zi<6X3l-5>ggm--bM#TK20`;ylsxEkbvVFJ*vRsl05Yfpa3h-1c;oX1LAe#U(E?(7d zl~aaD`>tU9UaDRnWx`XkW-BLNrv5NhAMC_S!5|}*kl%?u*J_Xx1j$kLekYFk_0MDO zCWh$$2JLKSZdne~W{eLNIKL7>PGJ0@HR0~woZv;AEGmZLxQi9C-}0NoJ>bhFMQ5KA zTUQSydQxUeoY#)!05w}xWGOXs6W?i?xD!?O4a=8x+Y2Hw14-KoViJi5KwJ-^_gx^O z?6XICgzCNG+qc&$xOfdW{}px=9-!-}%rl42Nbmq1(GQ+&P#XFGeI>?Fe8#1amvC^x zgqy2MfP?h+0270>wi-N0yY5u79GB%B1~)}HU~W|vfiU@mUXNc<)f--PYk`5K8bt5! zgM)JKw^%QS%GuWa-@J4mQL?`y$?K&oPB9n`&-{E%`Nj*&N4m)jj?g*V#9Z|L098@` z$Mf!WpHO1F==r@wS69LV??5*y89q|k9w5S7{e&MJk*9W-lmsQi z-eXMS@R${j;pazElcO;4exiE){$v&1&(7mWSiV~sON z{6h%=twG;gC|$V^JeaYU~qM;Hz&=(b~@HLgH-N=2#KrX5_1xdGKpB@ z3{q3VH``0gjoe8D$C`AXnR`7{xF-EzoBR^AxOQ{p9)=yRN%`jF6%ggxeR}SBU~x^# zwB`Paz_})snYlYq%{6JJE%y+%T$2vlb3eeAYtm_Z?)8x6>c}*6_ak7gNu%t!jV5kz zU`;yLp8L5CUy;U|)ZLzY3|p>AZS9kLMxxoVw!URDzYQq94_G{T1<<(msF*wqT&_`D zCuhMwuF1VGD5|V9xb{k&+!}f08g+7V7%I8CKA$`Xm|R`!a*rShTwUYM+;4!y)pe~o zxeW|(b=6FM5KY6?cFE+EsO4&#nfo6oacv!C%guuz*Q6KBDG{5)CZ8W=Ou8KL^P?GY z2B|4+Hz(j!d8o6nq_C`)*IArjQkoiNOzE&Waq{^?ow-Go3rec0O3KTeg+*m0MTMx# zT?{?0uJvZ_DOlp#y3!{8Dtef4H$rik2hp2imf@!Zx_0QF#OWUkPu1UTxd7s}Lt`Kn zHUK~B55k1YKlY;kv_gDXW*oZVd{r;^)8kh925B^hx5KU`_#Aht2lrIbs51#~n&M`&h{Yya~ltpD9Qe7+f|3ureb4L`RQ^wxgqj^)zx4gbHA$MKldEt$iy~04Y5#$VtX^-UQ)n4v;hhZnO6GRG2jk!+(`ru6P>|VV&r#8HAg0i7{hxdOwVxh6Bb*FpG#Jy`lk7GCACj}7HM?7cM9zAItD0oi5D@C3##OVz zL|@6i=-_xujLmU@ z;yYw-4<3f-+8>S}a@YtD3?$YOM2#LC2qN2>y+k6T!sYm(S{*r;J8(=}qZjt$mh|SV z&WeG=n%$sI5T_aeNbGEu(S^lUfnL-)&?#7xAR7Xsi)9yU8`z851?3Cb#_$|E)=mf4 zZs2UnFwI|LTjJN`kpQcinwnO%xT>(IqAG3CkU@ETTeHfWU+GP~kkv?t?MR}Bgkc|H z+T&A4^%yZRIk|eFJ>EOdW&)`PtBlV0Jqz0?DJ$`&7Esy9$BJiG@Oze66D|}~dP@Qx z%x>j@9`tt`=7j3ZG@A_|@J#=`Kl{6eX$u4IJakICu?B!loga#7Z#<> zDe+brK^){Dh!Io}@@d}16-7#@v}Dep0cmp!3RKSeR#jIO^)2P!KujB~tpr1q6?sdr zp2ai}z5l=Vue`Jn4**GLQ|B@CDsN#)c|Xu-6hUjUvZQQoUU50{Rm?e>5b%~SC|_Kj zS5|aoUU5ljQJ%M`N;N}uSqZeIRB=I>x6}`r?*$i$6H!_OKw_R*<*lqP@aB0-78F%g z6cvDp`2+e1m83_7Ma7`8y8=JIa;~I@jc_4X|(6X#wEWL(aKu@WFa>5yn@aaA5> z%B65rftMG|&o3;j43vsgO?4S~@VTmFZdraQXsFXgN%><1cW#llyuzDTP+rMOmBTV` z-)j85LxO-)!Yz*7C5!{Juj;A-k+*pUrZE8uo}%?30#vwJRxZga^U>3#GjLZp2**mw z3%vA;K6=?wQn*Tp)u*eA9maGKcf#W0#CLc1fn=TCg8qHXhtVhGR1d4=+0^ z3MU0k@k7Su3=|$%mWsj`hHZ;!zL1ky1lFcyba9V?zXKU=KfTm3y*LfrH;m~hKC{d# z=;5HBTjppz!yY>wjN#)^-nne^jFRhhX^aS3RE(hqpiKKhM{19|C%%f}{U(hZU3zk5 znth&Q{3V+vyn4wKpr0`v(?7VU8o@ogloJ0khYOl6zin;?{nS!P55F8R` zo!lu5t``PR34`l}k)MRY8bu3(e_Of(MnuAgpPT_J%D{SQ;Ok%m zA4fHRzc~L&NAi$v3NNT4e^B4-zUd^sN zIAJF_9ldGx$j$bJo2y^lP&4CLQ_ELXPt0&6I1)bOmQ)4^*p7(UFMeO(uOmVHUdmrw zG7gJ)LUh*%`(x-);bhnk8lvMz>{K<6pbx1k^i=K>5jO|aNeL@EN$qr`J4%7EW?3!b z`>)|h-B5l0O=(X!5_Y2M)nkq=_EIlg+X7+Jj=znH%{~0tD=2&K{ZRgCDV5inLOCbx z^{OYrTG-E^<-_eaAiFKl;U%3~y%D8TOX;8eCQ9E!Dn~ zYIlpOV?yn2Q>z^jqJI;0pDJ3aeJs@;5>+1xwTJv_?+MW-Mcq4!mTGTFwP!@t8$#_F zsNIat^zqWoaQOjq#U=3AVgCuc2cloF|LJun<_|Go|CS;A?uzIzPtfn?C&hC#ct}wPWt$a zW87iw2f*2C76al50r9@nc}x`~-op~_BU$&L!28IblKX`0XCm%<6)p8PNxd&c)m=jE zOTXH!LiD)Ayjc~bUaizSDeG<&iYNVwHA41hS$VxGNX1oB@poCbLMZ+&6`A@L_Fs_D zaQpQ($8;2aRt4zZi{g(VK4e1 zih#J{;}tJ!adp?aUbgPKTD+pJvcLD7_xH`r`7Xg{|K0Ct^PcZLzwWU75w+mERrgUHLYN7p{Xh-i~tpxNTx@ zyjCEOXJi$BhaJZ^pd!ukB%`uqia4)kt9R6o8(s`p0c`J-zjK{xiGdY{w%f|Un)PrUVmSN`B# zwGUm1JpJez+vsoXS+p+_^-VnuxPNFv-P9u!{|~QOw0fBczi*?urRO%ZloMngI@r7N z%4TNfwoLQh597(y@6B9&Z|0|%q37=XuqZRHwi>73gZG8D|9j!y)%GraSKZrtQZH6y zn39g}e&9r1+a2zaHQo2F?Ypu*{e|ye)cn(Z__53V=pH!v6-ehdUL)(PJ21S8TPE-K z+O@+$b<3Q7Dpqfq>E6D#%IfUrSQ=s^?&7TDv8^uCH_WE&rE8i&0 z2!#+@Wq+~Ks4c7+TK%FSqz*CH5O2O*?k`j;ps6$@vRbuSnZhRy^3s^WyW>~pY7JRI zLXfkP`1jjSC%jau@Q{RrKqwpKdjDK?s#snlO=mV=?l0~wqLfOxu~8F@Z4Kmeu@c~$ zd&+)<&KCM>#d5WPt%hj5=~hAz*vbiN#d@)}8v$_yp;0U5=fDskmvd$;m)o{=VrwwE zA!nLW%DYTGAC&TQv*iT=O_q1nXYs3S>%TkRvP78Ke_0|h^uucM${N#u7IgJNY0pRcRsBRMEntMij6&@eljCvxWE zYHe4s7T~H^N%ZvW6p~zDn6r5t-#T(>ux;(jO(0+1_>`6}Z^`7G6iRJwYPL3PrmAy! zlz2(%*v7l3Hrpr$llgivjA(Sr$l9Di0ucFZsn!f6J z)!F)#Tv)OI6_lR}Y#vR3b~sxx^~q)l?q&^zTW-!lfrO&t)Ic(iuj)n#z+HHeule(B zZA=w+TZy(j6DDx`dQ@z^h&~Ezv9fy>4bs@`uOAu7IoG!Jo6Y>}d@(3V(?X||NJ?$7 z6w1YXO=`B$l(H|0!2 ztrT79&Q2ABseB_Z_0XI}Qi=`f_EHcw!Q-Qs<<^c|IyzyHn_9lM0EWGDyDHTwG+o&a zDNgmF@Q`>UrieBluvTj*8dEBitEf5MCz8#LKzf?1ta=%>!Fp@VS`FRYuF`C&8uI1FHXCVQu3gD4Ql%>GF)t$<%CKAtTtfzjMAlv% zxyx7EqPNX&zELytDC`odvos%6OC?l*Z4Yzv5Ey*gx2a6vYQ7$J!hB`Hj8Ci&Hf`OS z3r4nX-!g$1wdjIIe%jQ_#iHayDuXRzb8gePN^fA{NwU4^;GuZAD0+Nr7pt3ULy56h=w&&V9 zpR85$Q#PLg_C;A46Qko3!M4$f?c27rVi~_YXR!Gw9TPnc`pmjc+g&F*)*9u0Occ1+M9CR!uj1HB;{DRhm?W;4@Ju<&E%fO*$ zyR6CJEF%gB;fjvJ$}(!jW9N0=>Jx2)TQsUaNt=S_8Yu~sT0k0@gN zFXj=uZK}Jqgr&}`0+W#&{n1R^Ov;9U$;h^8X+bDIbSEUl%|{K}8)O`mEoL)Y$9uVm zq}ueX->?ls1X?xzg~c*H0zMg8>?qud!0=qdv<5+-w!ZL_nx^W`R%3Ys)zQu1Zn80#Ia zOIxO$y|7-eW6VsoiAG*;77AG38Eouh^hH~eDZM$bHC&&;e!oPCL0@Jf$jambhH+Cb z)MWJr1=7FzTtvu%->_}eCCzqVDSi9{KYAjDxMrhZf7b1~MVc(bjcnC1IJ%|oA52xD3|Iy#Zt zXd1hNN*(pD>+C|YHkhkb{}jv9`e3;+KPaP)R=#z;!p{89Bwb1vD{cr zN;QySn~tW0aqWL-wagPTO@_Igz)GXIw@}3JTt!1f`?oVz6@hGgw)x=eK$;W!8Prv& zF)gpomfV=CHqq6Q)B+Y}4I|^O>vy|~3wx?HtoH2st!*@tnN7!~FcCUqO7Q5^w>}#KEI1|$0lud!tP?GjA&bCbgc)U5fL9pSu5aXn?EgQ)p4>-RZfpdf z9jNm5kF(ZST>Lkh%)Yzb$cwg#Z^%gPxEgD#E>XmOwaF*@(n(p_DKLMlvI~a_)yXTu zyUh5w{)T#oN~mn8wjU(AOGEdVr1JBAXKzeMEwR(f(~@pqi*_c7 zme|GRX-Rimi}ubWT4HZqo|bg%t!N2{l4yy&XL;JIwWq&cC1|rrRYuGkTiC?@@P5U7 zx`jP_aYCIvqL_m%Y$7kS|MgbsKAzMei2di~i-B~HwP+Lj8L>x}rzPDpS~*J`6^K1n zu_@h`bT4Spo-&qDxWqocMVni6SmQl|3b~|3d(>J7jf@J!jwg_Q>H!+vQ8t(MCA@Xit2JI@;}qA8mXu zQAbL?P2)QAn_7)v>OUP+9O?} zj#e|_M{Ar*)Xi(-fFEs9E>X8i>mPpmSx3~ds^NDt{itL0w}+#yqD=#SVI5I-(nVpJ zg>_3EElwd^*j|kH@ZPQm&kT8Zc~qny@uIGuJP9ms&6@iY$J=erjqnjuP)v_`>pwP@ z_*PbJmzkiGWDe-%#E_2YjFFqYyoXmtz4>{`=_2NJigD5L?M6JzY|o(EoyyC8Xs?~%BAr6m^8juE6=_ZJ|C0D$BV7* zPvP@1X?(or>Zd7uJ|>NicVG?Z7#>$2J|>NCtMcSi_3vHi7d|MiRDDdBxy;WXL1niYiqQC&v`oBDdG1f)^D$|B-%*~GFUZ<5 z0QNUYg~Hp{Rw=gI3`g?fW77C|Gg~Qz&&Qwl9^@N2M|Hda*TwE{$=0 z*~g^uJ)}GjtBjfA`EC0dg~+<%`bgFJC`1~50k_qfbsoLSCI0CuVh&CzQm4^KeNZZ7eS^f8~l^cvTIN12~~cFJ!)c=vJL=4FwD z`k0vLXl4JHGhF3h7@_l=P&H2HxvJ_hKkM2aiH>&h-ya6tPUlxc)i|ABOXZ@)`b)!r z+v$9Js2Zp9mQ*epb-(x7VIJxHS*RMPljgP)@~8p+J`6ZP=ly-8-$Cc6R3%&!OMGJt zU1kR=vg7%@(moQ>=jgmOq`!*JcZRC%blw-Lu3~hbYpLk`QmEQaXDd;#aMk%RQH)mF zJKc;#h8wy`71u9lM4h(f@tdUYX=09qiOO}x4|@#iRZ52Rsu$VN%V~o?(ol&#Ii%a} z$4IO8v^tN$%JfBud{kVHeN4=6#TW_g)pwal9rzHW=ZR-W(&M9I;-caA*PouXc}9n) zb5+>ruA=iCRk_Zo?RH~rGkeYb`~+fT~hotnS+X2--6 z71!*1OiWXtA$;Z$UFNfD6Kd&|nnvce-OtZ!yPuyS#_`E9k!)D4AIv92u@PbSK^ zPR}a=?g;Z8>GUkF3l$RI>3x(WJ}HA_ifQ@04S*%x-g*6!Zuj$xx82WA2IDAchEmSd zuvzeefS6A2L*hHVkBZ4Uv&?L!b$Vh?*CvpX1={H!)4z>Hr>FCyp=#VOBU`AkPpQJFFGT}y}c<;NlqGdqS5+B7%E36 zt?^rSzR;Y0%+j2YyOatQb~|TFrht;z4=EO{C%2fTZ-@N0LVn(&rD6U^p%dFGgUGs- zl|U=|Naf607juM;*khJYWuHO@RLT&wB0}h+;)W<6g9P?XCM1xtWi{5A!NG?hVZV$X zKlV{+k+LFapC8z_B$Xhs$7^Fwsb|vBL_cV0$3Iez#P%;wOFCNV2Q5wcM`(%NxI8WC zXs92wz3UQciP*yOw4|e1f6%T==I(xiW+5NN9WTS|-3noe_?%OQqD zS`J^?QW@`w5>1eZhPU0y%L`}zLu01(a;#?<9SxF0Mcd;vFAfzgiPP*iR7u=4pN^8C z&Gbk~bZg!iId+=PEBSsrJh^FuJZ7%+A+gc>pqQv=fc*Y2_uJ__5~?nz^D$Mq z&vHN6pHtsQ!hktCe-f%9g}Xv&vMSLr=$sE#JLqhxDn12Kt_gD0LatZQ+0Hc)sk!Ob9J}$_JqvUGki#k7kS>-oXa=pOoYZ#7_R{(rZM<&gjQ^!y?!Q!- z(S1Me10JLA$EsYRa-~Xc;gOfp=k>$AOvB%-@)nicJS7jMpAN>$Z9U>Bd5ZR5^rY># zRr2I5ag;nIyFyQb9^zW?mm?~ z`AQrmPpSS`aYt10WGiu$JcW9eo|k-)N}gOLj*_QLcPK7U$&;zXQC_3|`&6E&hv%NH z@=TRH@yKwLJYULi#PJj(ag;tUaXfcO93>ADE^0dVtK{KB;wX7g@MDU*PbCi*5=Z$Z z_5Zp`9vzO1;fs^oz`;wX7I@9BD=?Rb?u&_^6458qv^xQ!}#V2?OT9mc7{rxb|a3G$I@oKuQRq`Mjag;nT zcAes`SIJ{$#8L7<*lIn&b&*OQA|sBHrzWn`;|m8=@>m0Ll*HZO;ds`8I7*&iSUfLl zRr^)))B|ypJfHAB#oeWnry7W(E4M0;wX7CU{Z0@DtVrOILb5ick(Y%IiQk%3wNQuuTkm$x}Q9h59&IPe=*6weEzpn zvV?TVH=N}3{Htf;`PZZ!V7%O<_;;w}pNGF!-#?&|e^l;=rv+yI^%ZwIxvfcSfJy1~ z*TY-~?>WxpgX`cmFLCdF{7LWcg!#Q5^Vk!KV%o~BH;!Xg4$;XeoDODLfG%rW+)^0 zQ_Ma2tksZbR`L9dZpG^^b+sJ#VlO79l-uH=G~B@&(^X|qv^Su`bDQF z{ywW;Vfrp{`aZnN^BMe?^z-n@xmIh;msHQg8?RLTLDlns2=U)m{h>3m7Wq>96W0N$ zzVA6%tJ!<16}S^e%Tv?ew* zo|mBCmY}aD=ob_8f1RLzAN0qeeh+#5ZVMV%ANu2+s%J{?OW^rZg8oApDTnCuodohB{=vSCi%_Cm=&s02rUCo=+&$s$$IxkJopCsw&eum+` z21D*hz|SY>_a*3WO3;5WL4SXO{_6?)3lj8)6ZF4M(92zSarJvzg8sq;{U+#F#I(07 z6Y#%DNKZKd|Jnro0qFZ!d2RAt&>x4pYwpfx+qA~qC3>VZtMfKq?ehsZ;>zLXgmiv2 z0WX(~%D6%Ey3@*^Ju066R|!0yL_b)8etpGaRvDa-i`#_%kgl_2zLy7g=2*PnU)~Qt z!E?QHI`SjWNeTUQFhM_&pvT2XvE??Npf4uq_a^9HpHTjvNElE4Jb~v{=#T3@)jZ&} zhxaDnA4|CDA*(;u@Sx~+9Y5DVFY|(# z%vx%$i*gA(Fd7D%VJ&062}TTYX`$&b!%Ays1FMJ58*Vo;3u9$4;VJ4DivhLJI%Atb z%>iq}7-kjc2hLH;XwDdAo5#6rMiASrh<4a`Tmv(4cMv6Ps_7bEHjhI92P*?+$9UAGO9SUs^wiUtN?rdjH ztgT@WFU6&129bA|8tw2`yNn$=XHK|71#8)Ju+!+Gl~y@buLd*u%9NP4gGtCXOXRe` z?1i@$Iz3(3w5?S_XE@P=Ox9tHTf0ol{B#JCb}tr!LxnVGXTh;UWet3GXq?T~4wW6K zIyBA(aEB@gCN__RUB1m!W{8qBp`@+(+E6L!vR1G=G}iuchh`7V-F7I%^l66z)cDt_ zYO{#z?22}JTLYgRDl-7P=dce7*{C@=Ll=yZ7HjinpaNs~12ASiAf{TU`Y|Ls)!KDq zu&qCBtltdm=9_`3g$nqbgk??Z11q_5Yi`F&06&}>i6wCN99uDFp5 z)5!o@n!%(rHwO)J0wd#M-8WyE7Ekv&TY;5rdQDE&V6|G`#40)6C`USBbem3P;@aZ> zBL5hHWodzBmwnFf&Z@M+oaRLMQ6_ThSoJnNzTRb)H)HNO z+6r@rSK!{Oc@<#T(+tzU^O&p+xKk2^r{P4Hex{Rh7yN(U7XDEU|EPvvrQ!YbtJ+)* zhh&v}y-&+puimFwVRkwZ#_#9l8Pm;b%1b<64eV{wL$VAO6kINtv*IxbEJ0 z9F%w@O#7pBq3Q;>+QYwA_kmxl;de^qv^}~#iElFZ+z8Pgp8K|kPH_I)&QhQXhNIT) zi?-6weT#En;t<*l2)AVwzQA!i{!9EUe}4aFH9S5MJD$FdH)HO^dq?<7vKEoO!~x&o zMEKJ$zmLGDJ^UdJe@Me`^vaL*N5Ti-kR%eu{k_AoA&tk!^PTeZz&r#08J_!|N1kN( zM-f)q4#RWb@o^1*NHT{<+P^%Em-YA^=mf&>kLrHoqk*91+r9H)c*-BZyFEPjD-Ub< z2Q+@NFdXGiyztx?yfg1YaGdeO^ZgeZexEA%9sPiYXZqQU7%#&gkMxO-`R9J+BN~2h zACXRaujXWg$3J_KZab3U{qze~9?Cuq@3gI-NAk{{BT&7VA0h`6!eyY2DA%f5ivG)-`Dh%*J{x`w(X$@nWoR=*I&Eeb`vaEozbtcU|D z1{dSpD#h`asv5^mU@7Rhs9vFiaumBMGUL-^P6&=!I>oW7%!u47XT+W5MwVldYUHUN z=^DJ)$OjwTGQsgWQV8LAh7of;Qjh9=sp@^H>T%qq6yuoNM{T34T(z&<;YN<~Zi>V_ z`8O03mO|OFKozBH7s)JQw@h&St&+zv*EMlb(I4SaeNde380f5?15}G z5LY@bvMq(dxRP)s;u?U9!WdlRaHZiIjf(@>i*%s&Nk5^4mg*oH*>A$g8%~??SqBd{ zPp)@P|lzE{K9Z6opR9L?k}Hh=N}PybERaa32Vf z_y8V}{z4Qwjr&M^&Wl2)c_b2^22Lb8jloFt`BCUEMWO#!6nb(LxnD=Y)7%wFpZqBF zswniEK_7tGb=75Vq(bxOJxCM1%|;j1)%C3{wZiLdYOeDKs=bx9YeaQplg}?&0?q!) zh9+@&MO{EN)iwDY>OQ5Q;H6W@XuToT3);G5Jz^e)s zMO|ZMpdRoRzXk7G=c`=ngXqS~{i6Ev=DGmzz5rD8t!}L*H7aYNrgv>GA@x3Alc=by z^tDJ$si{ChNF!mfPF8wb0u{{xZ$m|$Ur?Tw$!X&3(uH&8dh@gMv!|NrDcJ?6Q`6As zS9QFww*&w5f9s#7(7o&R&KawW2Hq3kW4s?|9bSi}Nf%QTEijDo4sjOp6pl2yWlU=b z`96m(3!T=R@3hcqE#r`CpUAJq3s7EOhH8=dgut-4h5d5{U8UIg+88%h_fto+EZ}I zwa_Op5pkh~&UFJ2wQi0@_&VZxmuxHcL&Zo?pJyWklQP0?`@i%3Z8!5`y zQh9e*55m}H%4?KAEc2IAo`!sPr_8UWJPq~ky)u6xBX-KjF4KzSOH-9qLal&7KCef)b6#(upDc^ZP)^EXkRhEjK`%wJD=8baMd=C7qZ4V~`e z-%uE2|EG%uGm+3A=$`hEL zGGSh3S;~ac%vC89$}^i%ChW{?L!FcfcV=#v@qL-QW&B{~UKu}@*@^hTm_XPFtu)i=X@AqxQS=7Z_yYuac3!5F9MJ>0sh(}~GF_nb&sCK4VAr>( z-!b(b;17~R26KpEN71by1m_}su!^YNNPYNu%BVJEMDYd1=NB(4E?>5kMrLp%nw)p? z;Kvi)qCIv`BhV{>-qM+}<#r620|}F$t;lzaU^%hg0*l1{dIOrd`6?89+Mf-c0R{$a zUoK#iP1scuc8-F@ny?_j;!IenglP))KSqnr2GM9y66$UGG9hKl%NWsU+GLajYe6Ix z4}x~!T~o#1f-F@$l(P9&6g`?X(=8tP1)7#Jit7GzJz3qe=_%*_)G2Pm#KHThQpch% zJzM_R`qrbnF^kR5I|_Vhd)Fh_=Ae!5obcT1Y5(BBNsQ5h1PIUuoPy7FzxGUwSPqw`&How%mt#n(h1~p5d z=KeF#D(M4xou%#F!8mAH+WyJGDIh;WE^*>6AYDKf?|T{z1SaLDo%?5Tt<&JV`|hQJ zlzE--v}d4J_XLct?VgUL?rR`mESN|E2Mb|~;LXzTNq?py8XHE@Dk{3tDEd7W(J(QJ zuA?HaQFLo>hI^@Ko>6oS6-_W}9igHLvZ!b^ih{o&!?b@I{O_;ftr&Kq*UfLe?YrY>vfjQrc0Oeo#kQY5RM@t!QM=tDcUlTzMyh?U+0A;9l5TNQNwa zJQX%Ae(YVi-Z|~xV;tqZMMy`_tKi@MPA~})ihEv@_AhOJKbU07K7qbm*fF1X37ekM zHhmM*`sBh*hqBJu(i0d8b_+Wij-S)vbDq<2jqAg^47nHv1FjO{5%Pll=d=IAx^BXW?Wiw_d9r%U24e#+>N14LWq+4za7;CbSE-P3;D^F;70 zkM@k`uipm-n;a5D90b>IE7H&)(K>XQr~O!PJ*KQ@Vn1Dud%ugHl5$QwRo$yS1iSdd zb_h3`XzVwOzFWsW;pO3uemM9qIf%MYxSw`l(pm>&fC&BsMIA|Z)uL@3MF$CB&J(m| zJnihh7KrNY9YyPb+0@e$i0v*r+0$d!hvZ{Hz4;6`t?=Ii(H>h$T)_e@ko#dn>=Op$ zEeV;x5URhw4Xy)MG{mwrs-5FUSt_`oy~lKiR-PBk_a!#M5KzgJ&D~TO|Hy zbzkju6MmJwi~_$16; z7#HuIp!OE@iAQtA!AS=GA&HOa6F-OW3l02MiGQW4FZ(#io;3#ke2KraPy8IhZ!z%W zBtFn5-a+=v!rX%Pp8QPuf1mg{gfBGk&q(~BKJgB+=dTQXZjtz-m3_5$4&glp|7wYU zFamzr(gV`)#_UA1MQ{dz4+XD1j_6Zt$ex9vg~)s9zAl+AlU4{jknp9-G&DTv=-$9pKS zV9Q&rrJil&nJ&+^KxXPeVjMgdm9PiuxH_}{ez=1;uzMrjnDv9I!PThi0ms0ayq@4# zWaN7IZ0vg#Li7igDg_@09SLWscJNI_3f@kM!H)u-*SY1T_GKdF=FWc|X^*`h6m(G` zy68Xvjp5tVe*%BtDQr`i&;$2J+2X>DtR5<-@BzxN5-@4&|z6E}h= z`zJ&THh|V1JBgW8Z->3xziU51VuGnC>@cL$4cJylZIAtCm2|qzkiO-uj-ro{4NTn9 z)0)#U_$bl`ZlLaf!zra#UfjI`P;-BPt>hV-dbGgw;FGd7PvfTh$pbf|(#nffmF_H* z@P49W@Q;Y=?ErkZN3P#sy-&isJ3sE}k$2PWCvii)u>HHG2WfXEZ(;BZLAcOsr;(KQ zf1t-7p#>3piS~D}BbK)@17Mo@TTa3W&uzlyY|B1DyYue-zW{sXtJre~<0Xp^4)lyd zKVc6&3}(RwEM@av;16IQE2%$*GPEtzpMkwU0|$AZsBSSk>4va%2y*gviMXBseoJR@ z%1@rgEka-y?kZk1^~$8=t0j?StyDn6a^z`CdTay+3S9gwsf{WOU?TGhh#6@GF=rsA4$_* zq?yHD#y-{)ZZEPow3`X-y1iC=T?cN^+_cxbY_G+rae&%y*vm~>o4uCe25i$uu4m?D zj>7gI_h#*H6z}Ud5$*x4#D40=1Mn-j(EE9vxakUB^#N|ZX#;won90HEXeFNYtb!h! zzDaL=6m#=Xun0EdrUzrqwURdfn*kT%-F#@ z4|7Sd8zo4a$Xv;u`PC9XdLC!+yN>xKMB*pG$MGNq{7j^L9%$;fm-xL1h{3M_9VYeL z4^o(Z61>~sXCk*FPx^NhUB8mM;3AmMV7P=lpuyySg!R2J5`PJH8~jaVF7o_5av_ar zW9F=UM?P}I44Uo|BKRgGmbQPou>I-au3%5kIrKmy0sh&3$kP$?x2~CJR!7m`H5ihW z-+8uOl$pBeP=A_5{m@TpN{>&S3)?&A=bgm#TlsNtpX7L4PRJO-!-S#{SYFj z*LJwGIra+-sxiH81nWm=&FwY4-sjnN6(oO+sWjO7zML0+)^_z7sYR_fc{&1_&XR3c z&q@k*KsearF+w0a_yAzR3HW197Sv?RWFeng(72^%7Ht4}I?6Mh^e8Y3xBQqgOQ}ET zfr6X@K$r!B?S3!#FFaR*qbvt3xCoCE4*UoWkPm~TN36pzW@NAn*@zUbV(HW7JJylZ$I%A zdXe~}29o%U*&$k6e0Xc2vAV9_=gLjMC;s)m%76pRQdjP@Y12egMW9xdEty|DuXs-Bd{>SyP?>YlM3Fyr>g2hL z&t0(a?3pviwiHqOtRz9wXU>GN{CKIur?T``Mk{hOyy{WpZ**OgpqR)vQF2&ClYg!sB@ji_-PsXD(Y3oU(vwkRWI5| z*6Pg{m9A-SQgw~DWekCM1*WkPFV#p;Lu0F-)2-G_Q{CFefL9{9UqrpHqS;^PuMzCH zc-O|~M|V~dv7)}d@pAYayj8kOHC~!oZKb-|ofJ_yXO(Ylj=#0Oo}u)1P{?JG$x$WB zk3s`d(WL=gIn2lKVnZ8g4{MQG1-6Mmmv*w!*G(;$n#Y>Srdj8a+^8kd>*T9CJV-)K zr5@qZh(kA2NH(@AG9{`a1yM_;MlG4vr;1z}QN>W9UB&5&X@n`M(A1=l!U#n(`l`o; z5$ffI`mL|hNM)gZ?W;6W8FyZ!GVZ=eWuXr2t29zssDmSwhI%SeDfd>yPR{GI!}8ej z5$opXW6?(FYbvj5q&MxnO^x++l~)+>KJmVFmA)o=htN{RvWhKSJh!~mTVA~6?D^%! z*v3lMYYj9I=Po;E&io}<1!>UdPL`3)(@ghbG7A(L9Nd}8v z#>#8eOHP9Zu9tp1ae5_7gQ4QrmmSrfNFt5B1eOzjjnBoKr9h+0x_ldpp~2XgKO;|4 z*g}XEjjgUqxj(_~%N3}tYay;R%@qwUTHhtXSgElNBlM+bLxsPh#@8$b6JNg%n*iw6 z?5nA33HTH@W{(1_?o{0B?b^n()t+)N7;->e;8MigI{_JJgQ^+ms%`ZwjfjR}B8NK;L)T>uV z_RSAB_$r(Nm)9E?Np60Gevf8f-raC}Bin;er_gK4574WZpE2GZ)9Z8;=nWqV75IFJ zf?vf~srbKC{9_gGRxv$!qHw>;KdRzCs`zykA64%St-^O*O8|_KOvsVh8ryDW*|1l-^e;X%- z;m>X*kMr#R-`V=N&4%Ogk&YL2tYMW6$Kxm0h7&d%k1vnH9Up7(W&Ju;p7rZgez057 zS-&QgXZ?aU9P7t8)-QFMA+Jo;XZ>6%&-xWA+}=zB-=@ZgTjhBi`BXa?w>JuI!zpk) z@73Dmc17X$GaElUj_1YSD_m}t(GJE5mFM~LuQqy`P){$L-i|Ylk}uKPO&r zqQLfRih>(+3LMMbXOp`-3cuMles&z&?|g-0`!UXLzkrS3;V5!^s7Wv9S#d&_Kc?fh8oWj21DQRLoe!yS);yZ010)^D9nKi6r7J?;MTtc{-? z$9CSW__5zJ&hGdBu<u1NY zeubyNvD{fUxm{7@uCnp7wj>50$6gal?tqR9}&;0Cuf3vN=v6_0p~%ufNf7tRJtxtRM5U z>&NRa^ApkLQ?(vN!?8c}ddWEZI>Y-vUbmv*xE;K1MZ>XNUbh%`s`Z0$JU`p*%=3LT z9P7vPJ=>Z2+3n2pJ@adeGOzLc91X|q<@uR$_W6(P%=2V49Jhn#$!Iv1%kw1TPBmXK zj^_iroq2wVhGYGBeqlQ^Kf9fIei1(~Xe0DlbY|0;z&oG9Yb_2TZavh~a~ky|S-h((7@e#xx z#LmC;^sGW$h?vf|sztmV@vVsWAbt*UC*m&=A3>aTxTohh;^l~)G5F3uVi)3lhzk)1 z5tkuO|7%YVedF4LxDD|-#PkKsJ&5-rK7#l;#Lky`db$u7BK{I_E#lNz$VZ%o_)ElP zh|^yNKg5NI+Ym2Dd@JHTi1#Ai_exLC+lY@K{v2@-u`>?!5ub)Q{nehH0>sZD4j?Xk z9ri+8djxpIM-UI{2YufF4)H$3<%olb>k&KO?CIHzxDfG9#LE#si1<3hFCgB7_$cBa z;%^Z<-vU4MSMA%dFXCGfuS5JC;_Zmz{)YA<-ip{AZ#c*xA!<4p;x@dwK>^83O5X1Fm$?MiK#h zmM1$U{Z3?Ept}@(rJ_HEd=}_Z5#TRY^jAQ4gFaT_S1I~O$S;pTkAY525$LCZeq985 z0qDCU&`Uwz7lB>{`r!!lt3eM&p#KDPfiY^=|31*uBha4)JvRdVZO}at=%0hWDgwPf z`kCeiyWC9Bw@0AQ27ONiI-Nz=8G&98`jH6q&7dETK;H?v6LXPWp9evAMWDX`dSL|m zQP9h5^h}ueThMDkUrBxf|J>>*PEOyXmnFL#@O2Q1lbz(3nV73~1Lq8gp8--J+S{Pf9GxO5#u%e{m+D(}n~idshpGNv!iH?IFxj;pDtM$V z&P`l`^g@{~Pb^PPUm%mhjVd10FU9;`Lv5IoocbfjoaFRv`ut?q4Kc;ZSzBZ0CFgF6 zJ1=>!+i@fzId?&FR&lZm5J2Z7JLe@9qS_7Mu?}sm+aa~JT}FaQ}x>t zlCu^hyUPtiJ1kM*DiY0`fax-i#qiByovgD8Kjk8)=$<|C{Vk?NBV&^mGv z%Eu9Z%Ut6IJpj5((JxSay&UwbBjB4r|49V=b)fHzfZq-JgAwriKz|H$`GFerX;5+x zgMQS8_dvHG=pTW;OxgBEvh9!bImxbVF>{i$ZlM0z8dscLxT#-x@?p2*L_%^QEC{m$ zV)oPgM6v~~fdXqH`7YVQt7Mmgo*sct2S(=F=%uK7HR#Vhj_ry%azAplYLs_<5*}=OnwElMBJ$)<8LKXbnFTeBd(w z3IDOce=P7H3;f3d|FOV-Ebt!-{Ko>Pu)yAQw?wq5n6{e~Ca6SzBP+_1-7=M=@}H~E zq2+xIXnbD!2vv^995M`7@$m+?Owrz+0+;ii?N*1I$l{Cddm1SY>TZezZ8a%)oNgIo z%P2!?j9bQh|8$|!S8gs*LeDcO3^pS3FK(w~2sXN9j9W?>=y?|f+AmYUmQseHD&C&p zmMNy^syw%2mBOjVI;MPl-O@?KGB3Aa4Lyzs5sOCL_(Ofkjm)155 ze`Dla;MC4Ty8m1KjpB=taoh$D+RzzD#_M8&8!=8sj)}$b)*>dKGW4*N=ljLpI)d7=IHE;SW@agUnbW=pUkb z{QO@~av;D7N2sn|hw{X%?~qK)LoyEbh#P`GbV=^8f_&=VUn~VFX$H9T7o;qH%mCeL zq+^nPE9s<@Gifr^?=SUB75xvx3`dgk9)rlFrvOTtLduJz6OfiPjkI(o&43Y;rc*jK z=_N2tDx`FJ(%-1k3`)C_Mxw8iW>PvU=}QMDEYkB{24z)JHsKe%fpl%s)1;4w^lVCcfG`Uw9Y`8S za!dXT>2*m{34acCW?Rw;;(zXZq_0i#QhM<_;Ik>|Ba(IAr}%qa(nPAef(Fv|q|=DL z@@xFPHR*lgb5Sh*?oLW1n_Nsf>`7V+BPLx!2Hl(Vb84gaeWdp#y+r9%q)%tkzeu;$ ziKzRu&|g86+>bgbxs&)zO4$iYyz|ds7w;r`9QgrhqdGR;`7AOi!zADfN*IOqcidd_|%QwKnUly-WA8}FnpPM~CJ9QrEddYSwc%#qR|lf_gt zoHUPHk7Nt30V0+T2ab2X4r(lY>Xkr$Qe9x1I)V@w5)Z?27+XVN5UJH~L6%yL5(DF% zl#~4E*{vkIMeIJL)Am500jFz3PrHZGqhvbn5M+J9U`?d1Ldyp3ItEH=EINMRZc;Jz z4de&j-bTsQ1h`8A`Vrs(33!VDzac;xwIOYkV=i#5^#euW%8C-B=cpJO=!ZP z=`xu@$yt=tSD^Ob^ioQ`2o8gXT|&uUqSb?kw<0+xb;xVfql51TX~+?o{1NyMdE+oq zSHsvt-t0nB#I@ot5v3hcL|hxvR3h{JL|g~b$2qTy{zu?UsY70ghl)w}5TCbhK`FX| zK&ewf9&(flQ#)Y4A;)C082Ow@Lre5ASe;1mfL*>KhH>b4+{~E!M9!h@FZk-Qfw+hvqUo zp&#--^wu}+1u0(d+~_8DBAtGqK;Qf}lJWW;MI7=^=&ng`jMwjE;sQw4Mv!Ll`ff!W z_6Cqy+Ep4ofE_**thKAP-|4^%{}W}dks0Uk7+64CFEgpb=~scY4H`Lf`tTbG)+RG9 z5jPlY=yOlmC$(b4b+CrEQF6z^HOmdg*f@Mb415k!#lC23J5LP6PvX=Gtwxp;{`6FE zr0I3kZLpJesVvAufy<48QBOk;tzHthgE;zw!EQwOUcedXYt$N}Ez_oq(aIfHqwrs< za1jbmlZEA4t{ANi3Du!hfa>IOosU%EzHQ{Y@Tc&PAx^ZjCvV$we_<76EP8vU7`W;nVF>V4rQTRk{wpLMB);exOr;VQj`rd(t zA$NnWf7IR|okYp3N|a5g$Debc;=~_gjXk1}r>VB+zkUNMOnLxCw*WKgS4cdGM8@X| z_z!G<$mn@vwDaP1I!DNX&A7Rz5sYS5@P&N zkcOygG_U9nR8f^8kSht9kHl6=j7Q==Br>uT`V*;%vZS7HG6fpJ+W7g14sb6}sQZ*E z_1I@kxB&%6z+=Kskw}HdN*ioYP`-uLAN>cZKsN9LBW-XS5*fECU~e1HQOy*_XiFT| zARbS4y+=U>2BzLQ1;Qo2L(K1=#P7|B{AStsjh?Gu-=V?hfm6tRoJAtzLQAQoWU^{p zmnt?J_hct4GYICEjdLTB@r?pHXG#h2I-LtmfqUEG9IJRT)a3cpAWR9efoquOPl@M{ zK?VzxCmkqFA;fc>;>l2x=hJkizU28N^Q0LoBhSv0PNMG3bG+ioP?P7O$C&3Z^owje ztsEJpcAj*Eb#I>Bc7~cfpGn2=l6p2V&z;1x#?F(@zV6L)g3_~6O*3F5gMQac=J_mG zO{PI8Mjuooa40&c8s+G0%;x!SSp^1-*WXp1BeGkR@G-zZbMC44JhCM8} zKa+&T zd8=(=Qm#F`5Wf>7V)gM^V}Q86FW4?lc6ThZ-37`xwqMLV+ll8+J5M^jodS1}!#P#)WN4-=hZB9jl6le-0og}g#PeZ0PdfIU zLWt)S#k0{ql?1mi&qU1o##AD$bd^HFdu7ny{S70hn@G8qwJBs5Ir>{)FshPK8Mi1v zZzrd7(2XGF-K{|IV;S^UM-5OGypcH>{r7-EnzsH+BO@PWWX2yA$Q%lE1UiL~P0kP^ z`-Ivd&BNdw9Xrr~lp(VlEahxKKYc-g>R~5&n!?bG@d9Id&9d~H7&2rRDC|YVe6FQp zEapMUoX)bO0Os*}sNza%#Y-&}&*X}9sAGhR*IFz7SY>JPN|50n zMXV-gHTq<(?2|0C)##IXz51k6wWo{*!`a#pRFZ>XEAX;UXs0Cmf1u-1sSv=P3l!ln<~<)hV=SCp_E?nI-Ryo0Ru%(m=kCEjL5r` zL{8KA+XNwzSF*@E?IH^ekw0dUkC4dyc9C=-yeZOQ6}g;5=4nl;Mo8qxEHYphImHlp zj78FZFXMWENL}MEs)a;;!6Kiwi;OiyKFuOOAdzn>l5TLwr$Vn0ayioXOHl6V9X zr_zjGWtaGkoY3iq6=g^Mhy-3~7dYN3P_qimh=;(>b5(_qK+ow)V1ZrWNhxqY3w(zJ zme>W-@5!hZS~ne{U?9o+RD{WUnB~RT<^5C2OT?~PHZTW?jNx{94~OK*yMJSkBMLMU z*Ug6{gqoK%N;U75;fA87n|>(8tz>ZL>@n;hFrdw4A3B1as1kSSyd|L`U4{~G=UQPlpvtZ zN41ndhtnNeqYADkdC%}yzsE=rC_85(DQB6@iWPiB2JJa1?^c%g7|HvoT^{}J7X>ts z?rznMhA6n7?&l8j$xzcIhQvJ!aTDo&a?m)pBx2o@L3`p_6lG^BvT-{(MdfHad>4x4 zZ3UgrPk}_{iTni?j4Y=!`$OfTU`;FpKT@V(E?GvZOvu2E%PLE4CkSB@aO2Ws!GuZ3 z#pgFS_Xoe<^D#f;ObHz%VTxr-e<@2y@1}~Vi!&i%lcjbx2$BQ+t^)k2s-VYLPKCWOcSw?MWB?)4jTN21y%R!JFtP;=$9uejZo>c<1;eBdD z2Ok}^(v)xpnlr7sN@&~YfzWu`7dTEg7u2QM~rYJK`3tkk^ zvuFyqRTzD*!VCrG42i*GO_9xQC8x-KM`0*4I>lv(%0Pun zRRuh41ZVmIFBvlU#5}^FNwl3q`BRfrxhS}lEWff-^sRZD5e@1}{doZnWxgj=w4<3!cCr_8;mKi{o@$jG4WoH7aZOZpHzG!Yfus}v$M z{j{KBM$0J$&o~x~`ZKixKkX={u2L3qnF{;^e2jZSRfM}+8MNtg?x!;nj`Nd+CX*;K3NiCxHmVjsiWe>y_ z(Q9SM6Q|FSA8{MyS89Zf*XhTWD2%Lb68gm&y(+g99wZ+e>z8N?0E*esd2quh`QnjR z$_)ZAvfk$x`YI`M{%Ev=quWrSQSl z=tZjVyjencxv)RXf!A(mw%q`$`4r|NU{JYVi`XE>WF!F;yJO$M4Y1fa8cq+YT}2!8 z(0$t5;3kLXHYg!S{v$|a1Qn|HVDe8ibTr=g!G}90XL@{hL%W`iNUJ@Gbi zruUy5BaooCC&nQmrqJ6HCsmzPYC3{mqt#J8dI@SF!RhshdPEvwsR1QWkHWk~@-j$u}Bx5qB6M+U*%{ zWsVZFCt+;sh0@`6k8u+VAx|ejtnH)^wTkE!Ng#;RA7H_vugUR^8iP(#EvnXl^mN$+f?1bOGJ#64Lx zEuwd>CB~#}twLe{B7;6xTS<&b+ee8XY5P9$+n|u++b{-=0zePTCuM&HKAyo{XqFmV}U3u(i82537Ay> zQ+3*?>51RENCh4+JIe88!xjf2vT?eVvq$GciL=UmvBNAf_}E&jT;%>ot@hU*AUD z?^fLV_VvOsZpgqZxbiQw9jTp-u9e#EC4Qvs+r)427`Mdq?dxnU^7R%lk{;IUZIh6% zrzno(>m3GG`ucE1m%d(W0qqTeMsHMfa>Q3zkk!{=yNvA?P`IzNT6pCGznzC~Ole|( zTTpmI{-r6J-ex|lx*XRo(ZDQNt6Svk=I23e*HHdc5{$;!p*89XL!{fy5oeYOg|FFIgE= zjhw)jkUH?0Pk>~QsZgTU53QN>J<5&{mnRgLo0UT7hU^y=O}?P{y2{*c036OL?CxAK z(Cm4QUgs{JM*FQ#XuE}i8xiSSwO^rN$UkWjyN;6ax=U@&rqv1k4%+_7TEC)NL+CXZ z{Z8Xc3%f6K6CY7LNACT8L*|}F`>?%-Bwa4HbgL~F+o59aWe^fKW*mv7g=y9uGEWj_ zRiT68#_XeHT|6bE97WwR!Kk1$2MW=5kBOUK2>O-lPjq^lb(btC6@3TbA)Olx|XB0TXGi zzks70MTKMGwD+m9-lK?qf|~;EGS?!WNNn~iD3q2#%lMpGRe_brA;oeb<5gB=JIGR% zw~>&l{891PO{!#_O+XsZgT~?B@O8T?s?KMM-bHoJxQ^?%sg85BTk6tVefpViBS@i{ z3Y6*qgNe_A!E_QD_u1^(K;`pl{G2f?vb5&jxQ+Xxe`>mhP}J+?pSQxaP=3I@@$I7xA}0Tob>#tzYuh#yy+Q+s&u8iT0-X$ z(lxx!QIZ5lq$@4pC|L<4U1_7VlFz`Ju9P#i5_%bxu9SGk!fn8A!qs0;s$@7g(v?=B zmAnbH=t`TRFC>Q)0K|@TlCHElddbzOMc2q8&GUB@(>3gdlB*$vu3;rwNh-XNu3;NBPXeHH4Quz5 zKt;M77kVb5lrG20lIu~4u9O5v$t3{NmG+ocI_#H2BmS;xf>=oBMoz@lUr?%KF8(%ppsOFgmU|iE_^tSpu!#Q16#YTb4f5|z_^ZC9o2Ww@Eo&7hiMNB1Hc=*j z3-z=!WbzM0&8DQh#X5`x33&~1|HP*WmwO25#Lp<1N6DmjDe3(r%Z&`R+X&juYMP$2Z=nTfL!7p9#x z%#n`ODN`gSo|&jSVVrSdVVbN0Hp}87Gg&rtfF>EKdQdkO{w_h$JRVmx2?C59Rx(p#_PFq$br%N;3HuqFOSGLr>sqxyiGKp%1Lh zBEo>tXvo09Vm#7msxX$?OofAnY9a1}L)>BS5FawmP^mG@m=3zrFdNZ_nF_{|g2NRH z2p|PVgya$Uv~2CHVbbWaoh^wrnWTM_E{a?jkxS zu=Z;;^k<&5=9ufR#g9R!@0bG-8C-z7r9>bG_9G@^K@|hE9}{BSNK{(_F3S^FNS()9 z2-3<~1tJfXCQwAWOe6rYLJbL+6stxWHM2)#u&0FnM1`!Gjc6FV8y&_^ee0g zI~Z2@sbPhDL;aiQ45Ru}td&SafvT2ht2WgFgxRNs`UoqfR2B^{B#>%2Kr^zHFO47O zLUv||HEax7vtmtO!@X~$o>Mv(DWK}PGr@=)#NM>C0F!j1gWb?b6enV6&rv-r2f$oY z5Zbsf&6QXny-k)p?dOWY|P4Hv*mh>W_ zn-(d8({OnlvM~*g)_X3Y{_ArZFvfmtXg07;18NGOu^vBI8!sD+6_E0YA-foZwZAcl zlSnC}6&5$ZY+yA@FRw}obtU<;Ws0EefY3M@7;+pcNi)0=(}ZP&4G#JDkY4tJ6Jd_E zPngR=)kQ9qY2PF#;jc#1IW8?bn|`~p%GcDAv#xNO7hWsy%hAn&?4?u;gE;sM5dBO| zPtBf_appOhnXPN})IhC61E&mtbb-fZ;k-qizb=qnNo+&~E?wXuWH>B>3YE=)x{wBZ z3XA@P&`Mj2avTmYfo6Ofi~h3E95JBXi)BL>vuT5BZ)Z+xOLI=0zp}oy%7@>S58y}J zEfgbDU$=T%K~7C&r833j7W}&EWc>1X>$;rjT)9_0$tfprMU$^LzZ}0WP=`yPZRUTL z-dJDNn+ZAqUqP2Yr0(_mF89*!vKwY=2~^cJ=4aPZU#RNHAjkrPUR~)A)GJJ@A3xbz zWzbs!&G=z(FMba;P*;tgw>PL#S4%}CVJ=jv@>L^^%^uPf%{4}P_UhKU`oQEm|Cxr+ z=GMx9cfrEa`6$LVAe3T#h}RV@UTjF~p$Sk>yrr(jUr~=V3IlZwJ|ktS3Tlln(AX64 zRyHp`0wmc?Q|71OZeylmOYn*w=cgy^(nsa&07swu!*9htp@vv11m z-JE?@X7A(dVVV6cXP=kZhmfr$&WB|7F)r%~aYRv%=fFiLz%lJ)n%?@^BIhD~W#E4J#0w$-?1LMglj&-tAKDPe@#P@&fRDNv3Yo#kMH0jqeeXb*u{LDZvH>kRPx3>KCU$n;b(;r;FJVw`F&}Pf@Y^49H z{SxWltT)oLFGZE-U>aTjt#%aYzpS6F|2N!H*N1$zk_xjw zTLCFbz&1m`2fYO}9@PgNjnV#UO>02Dm{m6W9&1`gJ^Kww`ayVx;`m*NAB`wP_J_Y zHX-vbh}89s4)TYdYnG#TDrX}(lBn&DY=r=oy7x)#HIV-%KD!BKLl z3-d2|Kwszl5Q*q7}!W`1y#Dcf?}7i_tM}@uOmWvx9u-z4Z<+ z3Uo|01Cc$xo^;$!-9#DZYcVnUMdTR!P);%*bM!Y>RzBiHKNdsv-@p2`6)iO{9-GyA z=_dSHWBh>!JF>O+W}Zpye{=)!J|vv?p|!u<@ES-@8vbzS2B! zu?vfw8$rBpLkWmSg!7lk?AdTsWDob(K1bU%eM=1VbLih(MgG+u<9J@vcC5&`$(fdO z|E?W+Ap1R7!Er;Jb9S6Q$my!hS&_4==#RU05LI87P0_wMs28Wdf7O0)*c0R2ult+> zUk3xga)J8rDzrr!nSAf~ddhqy98;(}{%Zr}J{FD%8lLfL+HJJL2-=)Q-md(x{fNNt zi(`f6ofcLFfC1+oRcIn6H&$BlZz*vDEJ0*s=LTJGRxyZjvta@!BG}ON1hP_MARR(Zcq9IlS}CscmfVSEy5;u^0WfiH; z*92;dazSeKUtZ_0njENDUGHl_zM|y{e`RfRqrb7WWwN~x?WtTdxw5{ZrFJrYmptIB z4AeFHQLCvUP+3bXh@m7-Hhxq-Z`v7o&<>KDAs0VWJh`&b4>tY)32Sa_^ssU{%_}!w z-YVZ(ufMgvUR2imD*UZYUir)G-Ws&4NuYL1-IYFXK#H$~Zk1~TMxV}@@o)C2rC(83 znE+l8fJy5rT3|w>jTLKsUZ1}Td+TWxRaMR2`o_kl)i9M<(Ad1j*X+efRV~6xJ6ddF zX-8{nPFqhe{Q$d{e`Q)!H8xb#`LW?fCrS2~H`fJx-qjT?J^{|)+TshK(PmYleyiS# z53HogNgWBVti>aEz(l-CfMnBpOK9|>3`MgyXfeNZmBWrbQHC%*l3w%{B zGz*$kH~W0ez80^vadl;VBW$Mbh@`p5Nx@g%j=;uiD-5JzPz;lhQA7O!HLmnmG(ZV2 z#&xAx3C$+QRCbl@rM*M$Ndu!rG&R=ORbHX`lRdVv$>(Q>Mcb%brKQQ{dDCQ4jyo!; zpwW&-*H?QD-;m~zecBXg7S&DO#_DP`LH0*O6Cw<5xRF;j%X%XvRA;o9o?79*LM$zx z=Pg~lxXe3u@v?Kv(M)9)Z=j+^wAA~2O#-H_Mjsk>vgqEhrmC)47!IoZ)@ZK4jTk04 zi><3A3SCrRQPYyISoJbFsZ3@JHP7&QZ$*_zlOF&8RlH(iGQ9LlQ28 zVN0ID9);OQ)v*ksDfvd_2PzZQst*ECdR{lYkD|1M5nkq=;F~)GSEJ);9pTIb| z9HY6VwcfCjVR@Q*XiOS&q-i2=UM^2Seq#nQ)og0Tj9O!L9C%w}v%#RUwx+o$%6?M&dLkxt-P@A$_wkSys!?-3+u7GurA9B>$AKWg3L>+oYYiK|Gq$_mv(Qf z(Ir(CSJcA%GUh+Fz3w=Ge~}zLGq_Skyc~aQZt*e zAyiXaSiktzRr;_-G-9WNp-mHuzY(?RbtDWYObx1{bxe}uVfj#w)N5eF#Tr}T1K3Vg zV&{aBPSd&cMq`qsrBY3orew8N8OvJ80_Ik%!Wb83o2IB18+^=dsMpH|#~7-vZ*8eH zXB6uu$Lpmjtrd-=Z3t$d=87w5qtr}Wl4{U;ku0}k;E$UXFYZ$$tT&p*8ExErVN7Ae zN<1~alGZ1af!qPn-OhjRaDLbwPT9h_*!kP;d_uQKk#B&ET||g@ zH$=C>4-Yo(fge$^L*(v~H^r7eCLsyJ5UUn5T2)qjXlb%csz#S|iQ)@70BDmWrsQklBD-vd$PW`tRaxr)D5-?w^t*}%c6=x-A4=#Dd0|#qqTsKX z)t1_oKQz#=$g3*WL>VXfz(!4+&xa54xo$w&8F4K>p*2C6$Fhd$#n=-{XuL4bM7Fba zrWyM2;jA$tL8OK;w4)-qgdGC~`5nYCek?6pNrwsSirFDh>}1L*8TBP}krK8-#ky$H zcD<}JZ9pg%hzzsgGhv}+;S{$-g|TDo*QeH!+3~TkV9RI6 zhOuSr;6aAmJ{r&L@)Q(o`S{o{wv5d^HCtxKhr@y`pCB8?ma&UY&6e5mQLpL}DX2(auLfhlf*fO^5)NGj@p9)L1of^fqjQ#nk*)lucyMZmA9vkKf zjD6_TYNDZ=M zA~c9a@tL2xa2AId#tw?W=P{*nSEzNIJZh3wa8isl%m~A*-^H0BiWp(RV(!O&fMM*| zNQSXvA~c9a@xhxB4PysI;KL_u@~6 zoXjweO(Tu&;A1XH$Cy*1z_D`4}`IO5rj;TsVKBSU#bes|e zj(mt^7`E#)LwP=fl5`B`Xh(q~pHUgckyD-4CClh8uIy%;HZUjw4=b0&xZ`-$mc@x@s6Zp zxa-(a;K;{6hH>O$ANlk~(lMN)9R-ejx?>o}?IR4=;nNvO$8guNqrj0*Zw%wON^#`l z7fHu(j&>9{^6`ve9CH;%K3_571ZD?;As@dO#!x7Re1Kx4hd_1=`0??IVf^@HMLr=B zO?HR7jvWP#e1c*aM?N}{k3a-R5zf($0!Ka~F^pr=aHFI7j6>2f+;!|IaO5)(!#MKc zhkS@3=@`z@jsizMk5s?w29DI^`kUB`|BM?S?cjANJjjwK&MNIHgdw4=b0k0}h} z$mbLCIfHOU_bEYO$j1u`Fn;26qoaqZIMPgO$ABLnKo-W2 z&#~f@xE!M3lo;^a9qq23`Mo;I&{G$5T$e5Ip-_C%6d3Y>RAIsy`@U*$AG>&F7q4XZ z0p(Y&`8X(Oz^6uqX~5Vn^_q4cY?&P&2?e%%Y*ZLq#(r~Zw#;s%a;82sSfwDXDvmVy z*)h;Es(-i@A3pLZlKuBl(o#;ArdEd znWSZ$3@LSyZR7}6ip5fYaGHfspL3d7Me4WPRm1qiB|JcUP$|=CDi!vb2A=~pEjr`~ zGgc5d1fR?l)`^UL-?Vbrb8J5AiO*u9Y2Fpa$c~ECVml_nEgTDpGn*II2X+Yb=@}KK zj~x|3*6uNemp-Io3Yk5iewB1&OI9f+I@xD|JGz*&dJqgt&2Iy42|)@ zxe)uX4?&(&Z2w}iFXQATCj0Zl8J%y}lNn7{wW#MfJ>R6|?P6AUn6%toeBMu|g~n;t zJ<=TLQuuroNBHoL)jFcu7uoIXs7P*S$3$?250nsYBZds0__V7->Bw!hmf72CEwkI1 zWqhY(VHx4yQnf?BR}eleD#B-dc1Yw=U`Iu0Iyae{i6-zFQelINvFnvd`e*_l5ixhP zTec2^i<9}Pb(r)yIaQI2!Ns|shJccXnC#0rSzy+>gpgw~MuCHfg!LHmWp>A#gxQ*7qYqzwu%-&XOnXmlY zLC@H8Rk!!i1pZ1=-2k_=0|q@O-!Mr_Z6-3$t!h#bD8pw`h0Q?sD$H+8c1t+Pr%lBO zoIv#hDxPPr7{N}=^9d!+A!deg=7WW9beWCj)4O{xehD<@kODYAEj^D1Xv%_gr)IBDe- z-k0IL&SPEylNVk`HiDJcd0}lVR;YTjV%W;c5RZaT7jU}TthQ98B1AnZa1oz8z~5)% z69@RaY>eZW9}5gt_vph^%m+;~j$=Mp?*=uO@KnZg4C6TF^Y)WZcT3Vh74x$v#&OKg zUo`dnC050JNI2s-<}=QAsWD<7i;Ux#48r-OGH>sGH zZ^m)_GnaQ!#(A%b$MQ@%-H5QT6EI85O^*VtzF7mdgK+in~<&4;AxM1v`H`Uwge2^@yQX z#cNc|&vWej?0T?Ve$rsaf1<`YzYX@qAh(2c4mM(b8H#^#)?R<_Km*6`yxLz*v*Y>g z&#W|~-XsCzhL=@!ab(qXH?9uICiPLy*}&3FKTgnSWi2ie{uXqWe0v+jo+Hv zt?2w7oV`BFvD=g1(z4_Er5gSXX8Q{?c0Bh><`B0m;uoB`UD5FNm#BYm{d7YP|4=D! zo_VLt-^-8YANKW&*R2}$eQaL0zEelO+4YZ>r?cB)#6NrNfug(Addw$- z4$uv`ciQ;WDLg+%AF23Uqv)#?AD5!op(<2L#xMdwfd8Go~)^LqwNzgyAyjRvMaqUij31=F8b z^e*)d0@MGd=={nE(?3;o_eeJ^i?i(HU-*v0uxFEvo~G!#ZS=8Ng6yB%kZ8rK9ioRRXPgnSDir%T{C5nERqT7Fk=rKiix!e*t zOyU2c=x#;Fd5|(3Q}i-LPf_%*6n&MVvp)SX9?3u36n(G4r>k+w4@Y@^7_0F1AJLwn z=x(*|s8M_tDf(U;eWjwi)Qe=}6uwc>%M{(E=o=Ni$%emK(RbVMbVMh$tJ8*mRMC&y z@GmMl|5n#DCAUk_%hW!H_4z008YV~n$q}Z1E9t|<;T>+tf$i20jwI)S@diChmg2ZZ zMYsR@{8@@_{~_+>pp#raO}kU^sg`v3?PUgkp0}G7Ud%G+wQ4@6Q-33^7n?vQJyX@X zsMw1wite`2Z&ma*8~p*$X&har^uchJ;c-bHB#t+@6~%~-Dn5H{e2zw{N?@{QVN1;38u(YEeSE+tvf4;V#5H67} z-0W{kwGqJcT5r{MauoVmQRo*#P$WKOQSgnc}*o+^f!`m;_O6+U;g zf#;vJxH$^{JyGb_k=-0Af}c|`|NT+$FGitvMWO#I3jLNS^mz13B)bidLO&x4y(kKO zWfXct6nY!zsS*5STNM0=DD>T+yV$sv_&1;rz~Q7Gn;$+#beaU!!#+$SGCVK&CksBL zsfKyQN4DEr63?JeT!4O0#ke@K!yO_bwN>%&8fwrdsnSoP@DcEH;=|*MnbE$0<^jI{ zI01PS`bQZTW24X)MWIiRLNAFzKP`&C{h#K}9X5_4jN_vNBoGJ;O@auL1(8S!7Gr^l z3()x)TlgF+SSUoG^_jc)tmN)2pA*^8M1lqib(oSG)u$ zMIijY*X+!kS3=M*^6kug^ZjRbW_KocbGhHXT;kt_{r<{>ZXvlYub240S7N_jV*jkf z{uPaL}%{yl#3OZ(zC`pkUkgB0{L3R18^AF`p3*w6=T=;Jl? z;TrmA4WntZK(Qp}{yzjvBxm@q84z4gg6b;g%dmGsPEuP$T(P^R?`C7?gRL>s$7+bF z7;+28Hm))@h3K7#T_O6IWMnOIJq*oB7!!UDgn$U~2`yGn2*D7q&{BBOfGJUn8DSw9 z&AfQ#gie8hz&pKcWEg0V04jDs4+}h&RqMN26eWEw3XI^BjXe3xu)?J%EmN=O0D|jn z067Ip9KbQn6%f-vQQK$(@&g(e0cZgHS-H?%u3yL-8{Kt4xGrwGSG(;sq5(Cskdkc~v7g9RJH9~SspB}4C+%^{zBX@0CWI}w){ z>jU_Wd}=0_8fGR>yZq$bsqwM7{M7XH3sZ~v;@J4y6xHgf9YhB~K4eQ(PtMJbPvjsL zW>29gB)cR_sM}EhRRBt3;-pkWZ0?r%PlZ%2Z?!I#*;WL9*mc zCcWwMFGM`0wFuTNs)VO`WI->$WJyh+)x{aOAMfi(N0p?7gRZ+3adRuM6EoBf&+_Ds~R?YP_ zmvzAB%m50^m^S)2-tvfPYXgWqcvCjpioOyh3E_U7j{sv!yFps{yU$L?M(RQCJ!k*W0ULa;|hy7Y-RWz?Cun zQ81&qVMc+11l$QLafTbjWmtLJu%IV^G7{6R-dUkS$*y+JbuC?AUS4lrvK&zyEsb%s zB$$Vm)SB%5=zokKf}Zwlux-fUM5U@RNA8G3{z$%IcoZ4D75DnZN)uD^)JqRQ(|5ibJZOK@ojqvh%-EsUnBxf2v_YPZ%F-IN1Amt7j6{KW^RX zntuPbD*NqYe~-d3iHM2M!StGS^GMu{m+1#?uX53VHgG~?>LZH!R{gf>cl0`t{t#X|EZAv~@D3sx6RY1o4=&)V zDhi|tgI*4AdJCygzoy^kt*L(7I;INUR;3*W4)5X^>h1e6e0b#WYjOgnlTthcFVWln z(r?GaLocJb^H}=~5+C42?fcU_UPTV!xJ0c-B(~$AB{aTBQs%V9(?KgkvMuhsKC3PQc@6Ys13jJ98<|0&Vi zK5exwin8{tzTZ{gtu%E*_3#e=FBYjM0>m$a?_R+5g#6D9iHWl_|gGo{4Vu372(+SEp64}T~gZ|i=Z z`KP|KCHjv)62<$v4wmU@zl!P{G6#*H{X`Pq*o9NOwQuo~>Jzy;vLlx3kHsaXGwb;h z{q7IyVG~EQ>G)H9e(kbK5%2yena}aeJqkzhdJ!+1H+Emp`e^qal0ICyDanCk0Zq@J Rmg$4^*X|I{twfMy-QRxKS^@w7 literal 0 HcmV?d00001 diff --git a/testcases/kernel/security/tomoyo/tomoyo_new_test.c b/testcases/kernel/security/tomoyo/tomoyo_new_test.c deleted file mode 100644 index a1ab259e5..000000000 --- a/testcases/kernel/security/tomoyo/tomoyo_new_test.c +++ /dev/null @@ -1,652 +0,0 @@ -/******************************************************************************/ -/* This program is free software; you can redistribute it and/or modify */ -/* it under the terms of the GNU General Public License as published by */ -/* the Free Software Foundation; either version 2 of the License, or */ -/* (at your option) any later version. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ -/* the GNU General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -/* */ -/******************************************************************************/ -/* - * tomoyo_new_test.c - * - * Testing program for security/tomoyo/ - * - * Copyright (C) 2005-2010 NTT DATA CORPORATION - */ -#include "include.h" - -static int result; -static int error; - -static void show_result(const char *test, int should_success) -{ - error = errno; - printf("%s : ", test); - if (should_success) { - if (error == 0) - printf("OK (%d)\n", result); - else - printf("FAILED: %s\n", strerror(error)); - } else { - if (error == 0) - printf("BUG: Didn't fail (%d)\n", result); - else if (error == EPERM) - printf("OK: permission denied\n"); - else - printf("FAILED: %s\n", strerror(error)); - } -} - -static void test_read_etc_fstab(void) -{ - result = open("/etc/fstab", O_RDONLY); -} - -static void test_write_dev_null(void) -{ - result = open("/dev/null", O_WRONLY); -} - -static void cleanup_file_open(void) -{ - if (result != EOF) - close(result); -} - -static void test_mkdir_testdir(void) -{ - result = mkdir("/tmp/testdir", 0755); -} - -static void cleanup_mkdir_testdir(void) -{ - rmdir("/tmp/testdir"); -} - -static void setup_mkdir_testdir(void) -{ - mkdir("/tmp/testdir", 0755); -} - -static void test_rmdir_testdir(void) -{ - result = rmdir("/tmp/testdir"); -} - -static void setup_execute_bin_true(void) -{ - fprintf(domain_fp, "%s /bin/true\n", self_domain); - fprintf(domain_fp, "use_profile 0\n"); - fprintf(domain_fp, "select pid=%u\n", pid); -} - -static void cleanup_execute_bin_true(void) -{ - wait(NULL); - fprintf(domain_fp, "delete %s /bin/true\n", self_domain); - fprintf(domain_fp, "select pid=%u\n", pid); -} - -static void test_execute_bin_true(void) -{ - char *argv[] = { "/bin/true", NULL }; - char *envp[] = { "HOME=/", NULL }; - int pipe_fd[2] = { EOF, EOF }; - if (pipe(pipe_fd) == -1) - err(1, "pipe"); - switch (fork()) { - case 0: - execve("/bin/true", argv, envp); - error = errno; - if (write(pipe_fd[1], &error, sizeof(error)) == -1) - err(1, "write"); - _exit(0); - break; - case -1: - error = ENOMEM; - break; - } - close(pipe_fd[1]); - (void)read(pipe_fd[0], &error, sizeof(error)); - close(pipe_fd[0]); - result = error ? EOF : 0; - errno = error; -} - -static void test_chmod_dev_null(void) -{ - result = chmod("/dev/null", 0666); -} - -static void test_chown_dev_null(void) -{ - result = chown("/dev/null", 0, -1); -} - -static void test_chgrp_dev_null(void) -{ - result = chown("/dev/null", -1, 0); -} - -static void test_ioctl_dev_null(void) -{ - int fd = open("/dev/null", O_RDWR); - errno = 0; - result = ioctl(fd, 0x5451, NULL); - error = errno; - close(fd); - errno = error; -} - -static void setup_chmod_group(void) -{ - write_exception_policy("path_group CHMOD_TARGET /dev/null", 0); - write_exception_policy("number_group CHMOD_MODES 0666", 0); -} - -static void cleanup_chmod_group(void) -{ - write_exception_policy("path_group CHMOD_TARGET /dev/null", 1); - write_exception_policy("number_group CHMOD_MODES 0666", 1); -} - -static void setup_chown_group(void) -{ - write_exception_policy("path_group CHOWN_TARGET /dev/\\*", 0); - write_exception_policy("number_group CHOWN_IDS 0x0-0xFFFE", 0); -} - -static void cleanup_chown_group(void) -{ - write_exception_policy("path_group CHOWN_TARGET /dev/\\*", 1); - write_exception_policy("number_group CHOWN_IDS 0x0-0xFFFE", 1); -} - -static void setup_ioctl_group(void) -{ - write_exception_policy("path_group IOCTL_TARGET /dev/\\*", 0); - write_exception_policy("number_group IOCTL_NUMBERS 0x5450-0x5452", 0); -} - -static void cleanup_ioctl_group(void) -{ - write_exception_policy("path_group IOCTL_TARGET /dev/\\*", 1); - write_exception_policy("number_group IOCTL_NUMBERS 0x5450-0x5452", 1); -} - -static void setup_open_group(void) -{ - write_exception_policy("path_group READABLE /etc/\\*", 0); - write_exception_policy("number_group READABLE_IDS 0-0xFFF", 0); -} - -static void cleanup_open_group(void) -{ - cleanup_file_open(); - write_exception_policy("path_group READABLE /etc/\\*", 1); - write_exception_policy("number_group READABLE_IDS 0-0xFFF", 1); -} - -static void test_file_open_0(void) -{ - result = open("/tmp/testfile0", O_RDONLY, 0600); -} - -static void test_file_open_1(void) -{ - result = open("/tmp/testfile1", O_CREAT | O_RDONLY, 0600); -} - -static void test_file_open_2(void) -{ - result = open("/tmp/testfile2", O_TRUNC | O_RDONLY, 0600); -} - -static void test_file_open_3(void) -{ - result = open("/tmp/testfile3", O_TRUNC | O_CREAT | O_RDONLY, 0600); -} - -static void test_file_open_4(void) -{ - result = open("/tmp/testfile4", O_APPEND | O_RDONLY, 0600); -} - -static void test_file_open_5(void) -{ - result = open("/tmp/testfile5", O_APPEND | O_CREAT | O_RDONLY, 0600); -} - -static void test_file_open_6(void) -{ - result = open("/tmp/testfile6", O_APPEND | O_TRUNC | O_RDONLY, 0600); -} - -static void test_file_open_7(void) -{ - result = open("/tmp/testfile7", - O_APPEND | O_TRUNC | O_CREAT | O_RDONLY, 0600); -} - -static void test_file_open_8(void) -{ - result = open("/tmp/testfile8", O_WRONLY, 0600); -} - -static void test_file_open_9(void) -{ - result = open("/tmp/testfile9", O_CREAT | O_WRONLY, 0600); -} - -static void test_file_open_10(void) -{ - result = open("/tmp/testfile10", O_TRUNC | O_WRONLY, 0600); -} - -static void test_file_open_11(void) -{ - result = open("/tmp/testfile11", O_TRUNC | O_CREAT | O_WRONLY, 0600); -} - -static void test_file_open_12(void) -{ - result = open("/tmp/testfile12", O_APPEND | O_WRONLY, 0600); -} - -static void test_file_open_13(void) -{ - result = open("/tmp/testfile13", O_APPEND | O_CREAT | O_WRONLY, 0600); -} - -static void test_file_open_14(void) -{ - result = open("/tmp/testfile14", O_APPEND | O_TRUNC | O_WRONLY, 0600); -} - -static void test_file_open_15(void) -{ - result = open("/tmp/testfile15", - O_APPEND | O_TRUNC | O_CREAT | O_WRONLY, 0600); -} - -static void test_file_open_16(void) -{ - result = open("/tmp/testfile16", O_RDWR, 0600); -} - -static void test_file_open_17(void) -{ - result = open("/tmp/testfile17", O_CREAT | O_RDWR, 0600); -} - -static void test_file_open_18(void) -{ - result = open("/tmp/testfile18", O_TRUNC | O_RDWR, 0600); -} - -static void test_file_open_19(void) -{ - result = open("/tmp/testfile19", O_TRUNC | O_CREAT | O_RDWR, 0600); -} - -static void test_file_open_20(void) -{ - result = open("/tmp/testfile20", O_APPEND | O_RDWR, 0600); -} - -static void test_file_open_21(void) -{ - result = open("/tmp/testfile21", O_APPEND | O_CREAT | O_RDWR, 0600); -} - -static void test_file_open_22(void) -{ - result = open("/tmp/testfile22", O_APPEND | O_TRUNC | O_RDWR, 0600); -} - -static void test_file_open_23(void) -{ - result = open("/tmp/testfile23", O_APPEND | O_TRUNC | O_CREAT | O_RDWR, - 0600); -} - -static void setup_test_file(void) -{ - int i; - char buffer[32]; - buffer[31] = '\0'; - for (i = 0; i < 24; i += 2) { - snprintf(buffer, sizeof(buffer) - 1, "/tmp/testfile%u", i); - close(open(buffer, O_WRONLY | O_CREAT, 0600)); - } - write_exception_policy("deny_rewrite /tmp/testfile\\$", 0); -} - -static void setup_test_file_truncate(void) -{ - setup_test_file(); - write_domain_policy("allow_truncate /tmp/testfile\\$", 0); - set_profile(3, "file::truncate"); -} - -static void setup_all_test_file(void) -{ - int i; - char buffer[32]; - buffer[31] = '\0'; - for (i = 0; i < 24; i++) { - snprintf(buffer, sizeof(buffer) - 1, "/tmp/testfile%u", i); - close(open(buffer, O_WRONLY | O_CREAT, 0600)); - } - write_exception_policy("deny_rewrite /tmp/testfile\\$", 0); -} - -static void setup_all_test_file_truncate(void) -{ - setup_all_test_file(); - write_domain_policy("allow_truncate /tmp/testfile\\$", 0); - set_profile(3, "file::truncate"); -} - -static void cleanup_test_file(void) -{ - int i; - char buffer[32]; - buffer[31] = '\0'; - for (i = 0; i < 24; i++) { - snprintf(buffer, sizeof(buffer) - 1, "/tmp/testfile%u", i); - unlink(buffer); - } - write_exception_policy("deny_rewrite /tmp/testfile\\$", 1); - cleanup_file_open(); -} - -static void cleanup_test_file_truncate(void) -{ - cleanup_test_file(); - write_domain_policy("allow_truncate /tmp/testfile\\$", 1); - set_profile(0, "file::truncate"); -} - -static struct test_struct { - void (*do_setup) (void); - void (*do_test) (void); - void (*do_cleanup) (void); - const char *name; - const char *policy; -} tests[] = { - { - NULL, test_read_etc_fstab, cleanup_file_open, "file::open", - "allow_read /etc/fstab"}, { - NULL, test_read_etc_fstab, cleanup_file_open, "file::open", - "allow_read /etc/fstab"}, { - NULL, test_read_etc_fstab, cleanup_file_open, "file::open", - "allow_read /etc/fstab"}, { - setup_open_group, test_read_etc_fstab, cleanup_open_group, - "file::open", "allow_read @READABLE"}, { - NULL, test_write_dev_null, cleanup_file_open, "file::open", - "allow_write /dev/null"}, { - NULL, test_write_dev_null, cleanup_file_open, "file::open", - "allow_write /dev/null"}, { - NULL, test_write_dev_null, cleanup_file_open, "file::open", - "allow_write /dev/null"}, { - cleanup_mkdir_testdir, test_mkdir_testdir, - cleanup_mkdir_testdir, "file::mkdir", - "allow_mkdir /tmp/testdir/ 0755"}, { - cleanup_mkdir_testdir, test_mkdir_testdir, - cleanup_mkdir_testdir, "file::mkdir", - "allow_mkdir /tmp/testdir/ 0755"}, { - cleanup_mkdir_testdir, test_mkdir_testdir, - cleanup_mkdir_testdir, "file::mkdir", - "allow_mkdir /tmp/testdir/ 0755"}, { - setup_mkdir_testdir, test_rmdir_testdir, cleanup_mkdir_testdir, - "file::rmdir", "allow_rmdir /tmp/testdir/"}, { - setup_mkdir_testdir, test_rmdir_testdir, cleanup_mkdir_testdir, - "file::rmdir", "allow_rmdir /tmp/testdir/"}, { - setup_mkdir_testdir, test_rmdir_testdir, cleanup_mkdir_testdir, - "file::rmdir", "allow_rmdir /tmp/testdir/"}, { - setup_execute_bin_true, test_execute_bin_true, - cleanup_execute_bin_true, "file::execute", - "allow_execute /bin/true"}, { - setup_execute_bin_true, test_execute_bin_true, - cleanup_execute_bin_true, "file::execute", - "allow_execute /bin/true"}, { - setup_execute_bin_true, test_execute_bin_true, - cleanup_execute_bin_true, "file::execute", - "allow_execute /bin/true"}, { - NULL, test_chmod_dev_null, NULL, "file::chmod", - "allow_chmod /dev/null 0666"}, { - NULL, test_chown_dev_null, NULL, "file::chown", - "allow_chown /dev/null 0"}, { - NULL, test_chgrp_dev_null, NULL, "file::chgrp", - "allow_chgrp /dev/null 0"}, { - NULL, test_ioctl_dev_null, NULL, "file::ioctl", - "allow_ioctl /dev/null 0x5451"}, { - setup_chmod_group, test_chmod_dev_null, cleanup_chmod_group, - "file::chmod", "allow_chmod @CHMOD_TARGET @CHMOD_MODES"}, { - setup_chown_group, test_chown_dev_null, cleanup_chown_group, - "file::chown", "allow_chown @CHOWN_TARGET @CHOWN_IDS"}, { - setup_chown_group, test_chgrp_dev_null, cleanup_chown_group, - "file::chgrp", "allow_chgrp @CHOWN_TARGET @CHOWN_IDS"}, { - setup_ioctl_group, test_ioctl_dev_null, cleanup_ioctl_group, - "file::ioctl", "allow_ioctl @IOCTL_TARGET @IOCTL_NUMBERS"}, - { - setup_test_file, test_file_open_0, cleanup_test_file, - "file::open", "allow_read /tmp/testfile0"}, { - setup_test_file, test_file_open_1, cleanup_test_file, - "file::open", "allow_read /tmp/testfile1"}, { - setup_test_file, test_file_open_1, cleanup_test_file, - "file::create", "allow_create /tmp/testfile1 0600"}, { - setup_test_file, test_file_open_2, cleanup_test_file, - "file::open", "allow_read /tmp/testfile2"}, { - setup_test_file, test_file_open_2, cleanup_test_file, - "file::truncate", "allow_truncate /tmp/testfile2"}, { - setup_test_file_truncate, test_file_open_2, - cleanup_test_file_truncate, "file::rewrite", - "allow_rewrite /tmp/testfile2"}, { - setup_test_file, test_file_open_3, cleanup_test_file, - "file::open", "allow_read /tmp/testfile3"}, { - setup_test_file, test_file_open_3, cleanup_test_file, - "file::create", "allow_create /tmp/testfile3 0600"}, { - setup_test_file, test_file_open_4, cleanup_test_file, - "file::open", "allow_read /tmp/testfile4"}, { - setup_test_file, test_file_open_5, cleanup_test_file, - "file::open", "allow_read /tmp/testfile5"}, { - setup_test_file, test_file_open_5, cleanup_test_file, - "file::create", "allow_create /tmp/testfile5 0600"}, { - setup_test_file, test_file_open_6, cleanup_test_file, - "file::open", "allow_read /tmp/testfile6"}, { - setup_test_file, test_file_open_6, cleanup_test_file, - "file::truncate", "allow_truncate /tmp/testfile6"}, { - setup_test_file_truncate, test_file_open_6, - cleanup_test_file_truncate, "file::rewrite", - "allow_rewrite /tmp/testfile6"}, { - setup_test_file, test_file_open_7, cleanup_test_file, - "file::open", "allow_read /tmp/testfile7"}, { - setup_test_file, test_file_open_7, cleanup_test_file, - "file::create", "allow_create /tmp/testfile7 0600"}, { - setup_test_file, test_file_open_8, cleanup_test_file, - "file::open", "allow_write /tmp/testfile8"}, { - setup_test_file, test_file_open_8, cleanup_test_file, - "file::rewrite", "allow_rewrite /tmp/testfile8"}, { - setup_test_file, test_file_open_9, cleanup_test_file, - "file::open", "allow_write /tmp/testfile9"}, { - setup_test_file, test_file_open_9, cleanup_test_file, - "file::create", "allow_create /tmp/testfile9 0600"}, { - setup_test_file, test_file_open_9, cleanup_test_file, - "file::rewrite", "allow_rewrite /tmp/testfile9"}, { - setup_test_file, test_file_open_10, cleanup_test_file, - "file::open", "allow_write /tmp/testfile10"}, { - setup_test_file, test_file_open_10, cleanup_test_file, - "file::truncate", "allow_truncate /tmp/testfile10"}, { - setup_test_file, test_file_open_10, cleanup_test_file, - "file::rewrite", "allow_rewrite /tmp/testfile10"}, { - setup_test_file, test_file_open_11, cleanup_test_file, - "file::open", "allow_write /tmp/testfile11"}, { - setup_test_file, test_file_open_11, cleanup_test_file, - "file::create", "allow_create /tmp/testfile11 0600"}, { - setup_test_file, test_file_open_11, cleanup_test_file, - "file::rewrite", "allow_rewrite /tmp/testfile11"}, { - setup_test_file, test_file_open_12, cleanup_test_file, - "file::open", "allow_write /tmp/testfile12"}, { - setup_test_file, test_file_open_13, cleanup_test_file, - "file::open", "allow_write /tmp/testfile13"}, { - setup_test_file, test_file_open_13, cleanup_test_file, - "file::create", "allow_create /tmp/testfile13 0600"}, { - setup_test_file, test_file_open_14, cleanup_test_file, - "file::open", "allow_write /tmp/testfile14"}, { - setup_test_file, test_file_open_14, cleanup_test_file, - "file::truncate", "allow_truncate /tmp/testfile14"}, { - setup_test_file_truncate, test_file_open_14, - cleanup_test_file_truncate, "file::rewrite", - "allow_rewrite /tmp/testfile14"}, { - setup_test_file, test_file_open_15, cleanup_test_file, - "file::open", "allow_write /tmp/testfile15"}, { - setup_test_file, test_file_open_15, cleanup_test_file, - "file::create", "allow_create /tmp/testfile15 0600"}, { - setup_test_file, test_file_open_16, cleanup_test_file, - "file::open", "allow_read/write /tmp/testfile16"}, { - setup_test_file, test_file_open_16, cleanup_test_file, - "file::rewrite", "allow_rewrite /tmp/testfile16"}, { - setup_test_file, test_file_open_17, cleanup_test_file, - "file::open", "allow_read/write /tmp/testfile17"}, { - setup_test_file, test_file_open_17, cleanup_test_file, - "file::create", "allow_create /tmp/testfile17 0600"}, { - setup_test_file, test_file_open_17, cleanup_test_file, - "file::rewrite", "allow_rewrite /tmp/testfile17"}, { - setup_test_file, test_file_open_18, cleanup_test_file, - "file::open", "allow_read/write /tmp/testfile18"}, { - setup_test_file, test_file_open_18, cleanup_test_file, - "file::truncate", "allow_truncate /tmp/testfile18"}, { - setup_test_file, test_file_open_18, cleanup_test_file, - "file::rewrite", "allow_rewrite /tmp/testfile18"}, { - setup_test_file, test_file_open_19, cleanup_test_file, - "file::open", "allow_read/write /tmp/testfile19"}, { - setup_test_file, test_file_open_19, cleanup_test_file, - "file::create", "allow_create /tmp/testfile19 0600"}, { - setup_test_file, test_file_open_19, cleanup_test_file, - "file::rewrite", "allow_rewrite /tmp/testfile19"}, { - setup_test_file, test_file_open_20, cleanup_test_file, - "file::open", "allow_read/write /tmp/testfile20"}, { - setup_test_file, test_file_open_21, cleanup_test_file, - "file::open", "allow_read/write /tmp/testfile21"}, { - setup_test_file, test_file_open_21, cleanup_test_file, - "file::create", "allow_create /tmp/testfile21 0600"}, { - setup_test_file, test_file_open_22, cleanup_test_file, - "file::open", "allow_read/write /tmp/testfile22"}, { - setup_test_file, test_file_open_22, cleanup_test_file, - "file::truncate", "allow_truncate /tmp/testfile22"}, { - setup_test_file_truncate, test_file_open_22, - cleanup_test_file_truncate, "file::rewrite", - "allow_rewrite /tmp/testfile22"}, { - setup_test_file, test_file_open_23, cleanup_test_file, - "file::open", "allow_read/write /tmp/testfile23"}, { - setup_test_file, test_file_open_23, cleanup_test_file, - "file::create", "allow_create /tmp/testfile23 0600"}, { - setup_all_test_file, test_file_open_0, cleanup_test_file, - "file::open", "allow_read /tmp/testfile0"}, { - setup_all_test_file, test_file_open_2, cleanup_test_file, - "file::open", "allow_read /tmp/testfile2"}, { - setup_all_test_file, test_file_open_2, cleanup_test_file, - "file::truncate", "allow_truncate /tmp/testfile2"}, { - setup_all_test_file_truncate, test_file_open_2, - cleanup_test_file_truncate, "file::rewrite", - "allow_rewrite /tmp/testfile2"}, { - setup_all_test_file, test_file_open_4, cleanup_test_file, - "file::open", "allow_read /tmp/testfile4"}, { - setup_all_test_file, test_file_open_6, cleanup_test_file, - "file::open", "allow_read /tmp/testfile6"}, { - setup_all_test_file, test_file_open_6, cleanup_test_file, - "file::truncate", "allow_truncate /tmp/testfile6"}, { - setup_all_test_file_truncate, test_file_open_6, - cleanup_test_file_truncate, "file::rewrite", - "allow_rewrite /tmp/testfile6"}, { - setup_all_test_file, test_file_open_8, cleanup_test_file, - "file::open", "allow_write /tmp/testfile8"}, { - setup_all_test_file, test_file_open_8, cleanup_test_file, - "file::rewrite", "allow_rewrite /tmp/testfile8"}, { - setup_all_test_file, test_file_open_10, cleanup_test_file, - "file::open", "allow_write /tmp/testfile10"}, { - setup_all_test_file, test_file_open_10, cleanup_test_file, - "file::truncate", "allow_truncate /tmp/testfile10"}, { - setup_all_test_file, test_file_open_10, cleanup_test_file, - "file::rewrite", "allow_rewrite /tmp/testfile10"}, { - setup_all_test_file, test_file_open_12, cleanup_test_file, - "file::open", "allow_write /tmp/testfile12"}, { - setup_all_test_file, test_file_open_14, cleanup_test_file, - "file::open", "allow_write /tmp/testfile14"}, { - setup_all_test_file, test_file_open_14, cleanup_test_file, - "file::truncate", "allow_truncate /tmp/testfile14"}, { - setup_all_test_file_truncate, test_file_open_14, - cleanup_test_file_truncate, "file::rewrite", - "allow_rewrite /tmp/testfile14"}, { - setup_all_test_file, test_file_open_16, cleanup_test_file, - "file::open", "allow_read/write /tmp/testfile16"}, { - setup_all_test_file, test_file_open_16, cleanup_test_file, - "file::rewrite", "allow_rewrite /tmp/testfile16"}, { - setup_all_test_file, test_file_open_18, cleanup_test_file, - "file::open", "allow_read/write /tmp/testfile18"}, { - setup_all_test_file, test_file_open_18, cleanup_test_file, - "file::truncate", "allow_truncate /tmp/testfile18"}, { - setup_all_test_file, test_file_open_18, cleanup_test_file, - "file::rewrite", "allow_rewrite /tmp/testfile18"}, { - setup_all_test_file, test_file_open_20, cleanup_test_file, - "file::open", "allow_read/write /tmp/testfile20"}, { - setup_all_test_file, test_file_open_22, cleanup_test_file, - "file::open", "allow_read/write /tmp/testfile22"}, { - setup_all_test_file, test_file_open_22, cleanup_test_file, - "file::truncate", "allow_truncate /tmp/testfile22"}, { - setup_all_test_file_truncate, test_file_open_22, - cleanup_test_file_truncate, "file::rewrite", - "allow_rewrite /tmp/testfile22"}, { - NULL} -}; - -int main(void) -{ - int i; - tomoyo_test_init(); - for (i = 0; tests[i].do_test; i++) { - int trial; - for (trial = 0; trial < 2; trial++) { - int should_fail; - for (should_fail = 0; should_fail < 2; should_fail++) { - if (tests[i].do_setup) - tests[i].do_setup(); - if (!should_fail) - write_domain_policy(tests[i].policy, 0); - set_profile(3, tests[i].name); - tests[i].do_test(); - show_result(tests[i].policy, !should_fail); - set_profile(0, tests[i].name); - if (tests[i].do_cleanup) - tests[i].do_cleanup(); - if (!should_fail) - write_domain_policy(tests[i].policy, 1); - } - } - } - for (i = 0; tests[i].do_test; i++) { - int mode; - for (mode = 0; mode < 4; mode++) { - if (tests[i].do_setup) - tests[i].do_setup(); - set_profile(mode, tests[i].name); - tests[i].do_test(); - show_result(tests[i].name, 1); - set_profile(0, tests[i].name); - if (tests[i].do_cleanup) - tests[i].do_cleanup(); - } - } - fprintf(domain_fp, "delete %s\n", self_domain); - return 0; -} diff --git a/testcases/kernel/security/tomoyo/tomoyo_policy_io_test b/testcases/kernel/security/tomoyo/tomoyo_policy_io_test new file mode 100755 index 0000000000000000000000000000000000000000..4c6c145b88f4254e6662e0d76f68bf475b285cf8 GIT binary patch literal 49648 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 literal 0 HcmV?d00001 diff --git a/testcases/kernel/security/tomoyo/tomoyo_policy_io_test.c b/testcases/kernel/security/tomoyo/tomoyo_policy_io_test.c deleted file mode 100644 index b1897a0fc..000000000 --- a/testcases/kernel/security/tomoyo/tomoyo_policy_io_test.c +++ /dev/null @@ -1,195 +0,0 @@ -/******************************************************************************/ -/* This program is free software; you can redistribute it and/or modify */ -/* it under the terms of the GNU General Public License as published by */ -/* the Free Software Foundation; either version 2 of the License, or */ -/* (at your option) any later version. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ -/* the GNU General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -/* */ -/******************************************************************************/ -/* - * tomoyo_policy_io_test.c - * - * Testing program for security/tomoyo/ - * - * Copyright (C) 2005-2010 NTT DATA CORPORATION - */ -#include "include.h" - -static FILE *policy_fp = NULL; -static const char *policy_file = ""; - -static void try_io(const char *policy, const char should_success) -{ - FILE *fp = fopen(policy_file, "r"); - char buffer[8192]; - int policy_found = 0; - memset(buffer, 0, sizeof(buffer)); - printf("%s: ", policy); - fprintf(policy_fp, "%s\n", policy); - if (!fp) { - printf("BUG: policy read failed\n"); - return; - } - while (fgets(buffer, sizeof(buffer) - 1, fp)) { - char *cp = strchr(buffer, '\n'); - if (cp) - *cp = '\0'; - if (!strcmp(buffer, policy)) { - policy_found = 1; - break; - } - } - fclose(fp); - if (should_success) { - if (policy_found) - printf("OK\n"); - else - printf("BUG: policy write failed\n"); - } else { - if (!policy_found) - printf("OK : write rejected.\n"); - else - printf("BUG: policy write not rejected.\n"); - } - fprintf(policy_fp, "delete %s\n", policy); -} - -static void stage_policy_io_test(void) -{ - int i; - policy_file = proc_policy_domain_policy; - policy_fp = domain_fp; - for (i = 0; i < 3; i++) { - try_io("allow_chroot /", 1); - try_io("allow_chroot ", 0); - try_io("allow_chroot /mnt0/", 1); - try_io("allow_chroot /var1/chroot2/", 1); - try_io("allow_chroot /mnt0/", 1); - try_io("allow_chroot /mnt0/", 1); - try_io("allow_chroot /mnt0/", 1); - try_io("allow_chroot /mnt\\?\\*/", 1); - try_io("allow_chroot /mnt\\?\\*/", 1); - try_io("allow_unmount /", 1); - try_io("allow_unmount /sys1/", 1); - try_io("allow_unmount /initrd2/", 1); - try_io("allow_unmount /initrd/dev3/", 1); - try_io("allow_unmount /initrd/\\*\\+/", 1); - try_io("allow_unmount /initrd/\\@\\*/", 1); - try_io("allow_unmount /initrd2/", 1); - try_io("allow_pivot_root / /proc3/", 1); - try_io("allow_pivot_root /sys5/ /proc3/", 1); - try_io("allow_pivot_root /sys/", 0); - try_io("allow_pivot_root *", 0); - try_io("allow_pivot_root /sys5/ /proc3/", 1); - try_io("allow_mount / / --bind 0xD", 1); - try_io("allow_mount / / --move 0xF", 1); - try_io("allow_mount / --remount", 0); - try_io("allow_mount /", 0); - try_io("allow_mount none /tmp/ tmpfs 0x1", 1); - try_io("allow_mount none /tmp/ tmpfs", 0); - try_io("allow_mount none /tmp/ nonexistent 0x0", 1); - try_io("allow_mount none /proc/ proc 0x0", 1); - try_io("allow_mount none /selinux/ selinuxfs 0x0", 1); - try_io("allow_mount /proc/bus/usb /proc/bus/usb/ usbfs 0x0", 1); - try_io("allow_mount none /dev/pts/ devpts 0x0", 1); - try_io("allow_mount any / --remount 0xC00", 1); - try_io("allow_mount /dev/sda1 /boot/ ext3 0xC00", 1); - try_io("allow_mount none /dev/shm/ tmpfs 0x0", 1); - try_io("allow_mount none /proc/sys/fs/binfmt_misc/ binfmt_misc " - "0x0", 1); - try_io("allow_mount none /proc/sys/fs/binfmt_misc/ binfmt_misc " - "0x0 0x1", 0); - try_io("allow_mount none /proc/sys/fs/binfmt_misc/ tmpfs " - "binfmt_misc 0x0", 0); - try_io("allow_mount /proc/bus/usb /proc/bus/usb/ usbfs 0x0", 1); - } - policy_file = proc_policy_exception_policy; - policy_fp = exception_fp; - for (i = 0; i < 3; i++) { - try_io("allow_read /tmp/abc", 1); - try_io("allow_read /tmp/abc\\*", 1); - try_io("allow_read abc", 1); - try_io("allow_read /tmp/abc/", 1); - try_io("allow_read", 0); - try_io("allow_read *", 1); - try_io("file_pattern /\\*\\*\\*", 1); - try_io("file_pattern /abc", 1); - try_io("file_pattern /abc /def", 0); - try_io("file_pattern abcdef", 1); - try_io("path_group TEST /", 1); - try_io("path_group TEST /boo", 1); - try_io("path_group TEST /bar", 1); - try_io("path_group TEST /\\*", 1); - try_io("path_group TEST / /", 0); - try_io("path_group TEST /boo", 1); - try_io("path_group TEST /bar", 1); - try_io("path_group TEST boo", 1); - try_io("path_group TEST boo/", 1); - try_io("path_group TEST /bar", 1); - try_io("path_group TEST3 /\\*", 1); - try_io("path_group TEST3 / /", 0); - try_io("path_group TEST3 /boo", 1); - try_io("path_group TEST3 /bar", 1); - try_io("path_group TEST3 boo", 1); - try_io("path_group TEST3 boo/", 1); - try_io("deny_rewrite /", 1); - try_io("deny_rewrite /foo", 1); - try_io("deny_rewrite /\\*", 1); - try_io("deny_rewrite /\\:", 0); - try_io("deny_rewrite / /", 0); - try_io("deny_rewrite @/TEST", 1); - try_io("aggregator /boo/\\* /BOO", 1); - try_io("aggregator /boo/\\* /BOO\\*", 0); - try_io("aggregator /boo/\\*/ /BOO", 1); - try_io("aggregator /boo/\\* /BOO/", 1); - try_io("keep_domain ", 1); - try_io("keep_domain /sbin/init", 1); - try_io("keep_domain foo", 0); - try_io("keep_domain \\*", 0); - try_io("keep_domain /ssh", 1); - try_io("keep_domain /ssh /foo", 0); - try_io("keep_domain /foo from ", 1); - try_io("keep_domain /foo from /sbin/init", 1); - try_io("keep_domain from /sbin/init", 0); - try_io("keep_domain \\* from /sbin/init", 0); - try_io("no_keep_domain ", 1); - try_io("no_keep_domain /sbin/init", 1); - try_io("no_keep_domain foo", 0); - try_io("no_keep_domain \\*", 0); - try_io("no_keep_domain /ssh", 1); - try_io("no_keep_domain /ssh /foo", 0); - try_io("no_keep_domain /foo from ", 1); - try_io("no_keep_domain /foo from /sbin/init", 1); - try_io("no_keep_domain from /sbin/init", 0); - try_io("no_keep_domain \\* from /sbin/init", 0); - try_io("initialize_domain /foo", 1); - try_io("initialize_domain /\\*", 1); - try_io("initialize_domain /foo /bar", 0); - try_io("initialize_domain /foo from /bar", 1); - try_io("initialize_domain /foo from /bar", 1); - try_io("initialize_domain /\\* from ", 1); - try_io("initialize_domain /foo from \\*", 0); - try_io("no_initialize_domain /foo", 1); - try_io("no_initialize_domain /\\*", 1); - try_io("no_initialize_domain /foo /bar", 0); - try_io("no_initialize_domain /foo from /bar", 1); - try_io("no_initialize_domain /foo from /bar", 1); - try_io("no_initialize_domain /\\* from ", 1); - try_io("no_initialize_domain /foo from \\*", 0); - } -} - -int main(void) -{ - tomoyo_test_init(); - stage_policy_io_test(); - return 0; -} diff --git a/testcases/kernel/security/tomoyo/tomoyo_policy_memory_test b/testcases/kernel/security/tomoyo/tomoyo_policy_memory_test new file mode 100755 index 0000000000000000000000000000000000000000..7f308afc4e190d7665092f97e217d5cde0033f35 GIT binary patch literal 34080 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 EA1^IOrvLx| literal 0 HcmV?d00001 diff --git a/testcases/kernel/security/tomoyo/tomoyo_policy_memory_test.c b/testcases/kernel/security/tomoyo/tomoyo_policy_memory_test.c deleted file mode 100644 index a6620ba30..000000000 --- a/testcases/kernel/security/tomoyo/tomoyo_policy_memory_test.c +++ /dev/null @@ -1,358 +0,0 @@ -/******************************************************************************/ -/* This program is free software; you can redistribute it and/or modify */ -/* it under the terms of the GNU General Public License as published by */ -/* the Free Software Foundation; either version 2 of the License, or */ -/* (at your option) any later version. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ -/* the GNU General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -/* */ -/******************************************************************************/ -/* - * tomoyo_policy_memory_test.c - * - * Testing program for security/tomoyo/ - * - * Copyright (C) 2005-2010 NTT DATA CORPORATION - */ -/* - * Usage: Run this program using init= boot option. - */ -#include -#include -#include -#include -#include - -static void BUG(const char *msg) -{ - printf("%s", msg); - fflush(stdout); - while (1) - sleep(100); -} - -static const char *policy_file = NULL; -static const char *policy = NULL; - -static void get_meminfo(unsigned int *policy_memory) -{ - FILE *fp = fopen("/sys/kernel/security/tomoyo/meminfo", "r"); - if (!fp || fscanf(fp, "Policy: %u", policy_memory) != 1 || fclose(fp)) - BUG("BUG: Policy read error\n"); -} - -static void check_policy_common(const int found_expected, const int id) -{ - FILE *fp = fopen(policy_file, "r"); - char buffer[8192]; - int policy_found = 0; - memset(buffer, 0, sizeof(buffer)); - if (!fp) - BUG("BUG: Policy read error\n"); - while (fgets(buffer, sizeof(buffer) - 1, fp)) { - char *cp = strchr(buffer, '\n'); - if (cp) - *cp = '\0'; - if (strcmp(buffer, policy)) - continue; - policy_found = 1; - break; - } - fclose(fp); - if (policy_found != found_expected) { - printf("BUG: Policy write error: %s %s at %d\n", policy, - found_expected ? "not added" : "not deleted", id); - BUG(""); - } -} - -static inline void check_policy_written(FILE * fp, const int id) -{ - fflush(fp); - check_policy_common(1, id); -} - -static inline void check_policy_deleted(FILE * fp, const int id) -{ - fflush(fp); - check_policy_common(0, id); -} - -static const char *domain_testcases[] = { - "allow_create /tmp/mknod_reg_test 0600", - "allow_create /tmp/open_test 0600", - "allow_create /tmp/open_test 0600", - "allow_create /tmp/open_test 0600", - "allow_execute /bin/true", - "allow_execute /bin/true", - "allow_execute /bin/true0", - "allow_execute /bin/true1", - "allow_execute /bin/true2", - "allow_execute /bin/true3", - "allow_execute /bin/true4", - "allow_execute /bin/true5", - "allow_execute /bin/true6", - "allow_execute /bin/true7", - "allow_execute /bin/true7", - "allow_execute /bin/true7", - "allow_execute /bin/true8", - "allow_ioctl socket:[family=2:type=2:protocol=17] 0-35122", - "allow_ioctl socket:[family=2:type=2:protocol=17] 35122-35124", - "allow_link /tmp/link_source_test /tmp/link_dest_test", - "allow_mkblock /tmp/mknod_blk_test 0600 1 0", - "allow_mkchar /tmp/mknod_chr_test 0600 1 3", - "allow_mkdir /tmp/mkdir_test/ 0755", - "allow_mkfifo /tmp/mknod_fifo_test 0600", - "allow_mkfifo /tmp/mknod_fifo_test 0600", - "allow_mksock /tmp/mknod_sock_test 0600", - "allow_mksock /tmp/socket_test 0600", - "allow_read /bin/true", - "allow_read /bin/true", - "allow_read /dev/null", - "allow_read /dev/null", - "allow_read /dev/null", - "allow_read /dev/null", - "allow_read /dev/null", - "allow_read /dev/null", - "allow_read /foo", - "allow_read /proc/sys/net/ipv4/ip_local_port_range", - "allow_read /proc/sys/net/ipv4/ip_local_port_range", - "allow_read/write /bar", - "allow_read/write /dev/null", - "allow_read/write /dev/null", - "allow_read/write /proc/sys/net/ipv4/ip_local_port_range", - "allow_read/write /proc/sys/net/ipv4/ip_local_port_range", - "allow_read/write /tmp/fifo", - "allow_read/write /tmp/fifo", - "allow_read/write /tmp/rewrite_test", - "allow_rename /tmp/rename_source_test /tmp/rename_dest_test", - "allow_rmdir /tmp/rmdir_test/", - "allow_symlink /symlink", - "allow_symlink /symlink", - "allow_symlink /symlink", - "allow_symlink /symlink", - "allow_symlink /tmp/symlink_source_test", - "allow_symlink /tmp/symlink_source_test", - "allow_symlink /tmp/symlink_source_test", - "allow_symlink /tmp/symlink_source_test", - "allow_symlink /tmp/symlink_source_test", - "allow_truncate /tmp/rewrite_test", - "allow_truncate /tmp/truncate_test", - "allow_truncate /tmp/truncate_test", - "allow_unlink /tmp/unlink_test", - "allow_write /123", - "allow_write /dev/null", - "allow_write /dev/null", - "allow_write /devfile", - "allow_write /devfile", - "allow_write /proc/sys/net/ipv4/ip_local_port_range", - "allow_write /proc/sys/net/ipv4/ip_local_port_range", - "allow_write /tmp/open_test", - "allow_write /tmp/open_test", - "allow_write /tmp/open_test", - "allow_write /tmp/truncate_test", - "allow_write /tmp/truncate_test", - "allow_rewrite /tmp/rewrite_test", - "allow_rewrite /tmp/rewrite_test", - "allow_mount /dev/sda1 /mnt/sda1/ ext3 0x123", - "allow_mount /dev/sda1 /mnt/sda1/ ext3 123", - "allow_mount /dev/sda1 /mnt/sda1/ ext3 0123", - "allow_mount /dev/sda1 /mnt/sda1/ ext3 0x123", - "allow_mount /dev/sda1 /mnt/sda1/ ext3 123", - "allow_mount /dev/sda1 /mnt/sda1/ ext3 0123", - "allow_chroot /", - "allow_chroot /", - "allow_chroot /mnt/", - "allow_pivot_root / /proc/", - "allow_pivot_root /mnt/ /proc/mnt/", - "allow_unmount /", - "allow_unmount /proc/", - NULL -}; - -static void domain_policy_test(const unsigned int before) -{ - unsigned int after; - int j; - policy_file = "/sys/kernel/security/tomoyo/domain_policy"; - for (j = 0; domain_testcases[j]; j++) { - int i; - FILE *fp = fopen(policy_file, "w"); - if (!fp) - BUG("BUG: Policy write error\n"); - fprintf(fp, "\n"); - policy = domain_testcases[j]; - printf("Processing: %s\n", policy); - for (i = 0; i < 100; i++) { - fprintf(fp, "%s\n", policy); - if (!i) - check_policy_written(fp, 1); - fprintf(fp, "delete %s\n", policy); - } - check_policy_deleted(fp, 1); - for (i = 0; i < 100; i++) - fprintf(fp, "%s\n", policy); - check_policy_written(fp, 2); - fprintf(fp, "delete %s\n", policy); - check_policy_deleted(fp, 2); - fclose(fp); - for (i = 0; i < 30; i++) { - usleep(100000); - get_meminfo(&after); - if (before == after) - break; - } - if (before != after) { - printf("Policy: %d\n", after - before); - BUG("Policy read/write test: Fail\n"); - } - } - for (j = 0; j < 10; j++) { - int i; - FILE *fp = fopen(policy_file, "w"); - if (!fp) - BUG("BUG: Policy write error\n"); - fprintf(fp, " /sbin/init\n"); - for (i = 0; domain_testcases[i]; i++) - fprintf(fp, "%s\n", domain_testcases[i]); - fprintf(fp, "delete /sbin/init\n"); - fclose(fp); - for (i = 0; i < 50; i++) { - usleep(100000); - get_meminfo(&after); - if (before == after) - break; - } - if (before != after) { - printf("Policy: %d\n", after - before); - BUG("Policy read/write test: Fail\n"); - } - } -} - -static const char *exception_testcases[] = { - "allow_read /tmp/mknod_reg_test", - "allow_env HOME", - "path_group PG1 /", - "path_group PG2 /", - "address_group AG3 0.0.0.0", - "address_group AG3 1.2.3.4-5.6.7.8", - "address_group AG3 f:ee:ddd:cccc:b:aa:999:8888", - "address_group AG4 0:1:2:3:4:5:6:7-8:90:a00:b000:c00:d0:e:f000", - "number_group NG1 1000", - "number_group NG2 10-0x100000", - "number_group NG3 01234567-0xABCDEF89", - "deny_autobind 1024", - "deny_autobind 32668-65535", - "deny_autobind 0-1023", - "initialize_domain /usr/sbin/sshd", - "no_initialize_domain /usr/sbin/sshd", - "initialize_domain /usr/sbin/sshd from /bin/bash", - "no_initialize_domain /usr/sbin/sshd from /bin/bash", - "initialize_domain /usr/sbin/sshd from " - " /bin/mingetty/bin/bash", - "no_initialize_domain /usr/sbin/sshd from " - " /bin/mingetty/bin/bash", - "keep_domain /usr/sbin/sshd /bin/bash", - "no_keep_domain /usr/sbin/sshd /bin/bash", - "keep_domain /bin/pwd from /usr/sbin/sshd /bin/bash", - "no_keep_domain /bin/pwd from /usr/sbin/sshd /bin/bash", - "keep_domain /bin/pwd from /bin/bash", - "no_keep_domain /bin/pwd from /bin/bash", - "file_pattern /proc/\\$/task/\\$/environ", - "file_pattern /proc/\\$/task/\\$/auxv", - "allow_read /etc/ld.so.cache", - "allow_read /proc/meminfo", - "allow_read /proc/sys/kernel/version", - "allow_read /etc/localtime", - "allow_read /proc/self/task/\\$/attr/current", - "allow_read /proc/self/task/\\$/oom_score", - "allow_read /proc/self/wchan", - "allow_read /lib/ld-2.5.so", - "file_pattern pipe:[\\$]", - "file_pattern socket:[\\$]", - "file_pattern /var/cache/logwatch/logwatch.\\*/", - "file_pattern /var/cache/logwatch/logwatch.\\*/\\*", - "deny_rewrite /var/log/\\*", - "deny_rewrite /var/log/\\*/\\*", - "aggregator /etc/rc.d/rc\\?.d/\\?\\+\\+smb /etc/rc.d/init.d/smb", - "aggregator /etc/rc.d/rc\\?.d/\\?\\+\\+crond /etc/rc.d/init.d/crond", - NULL -}; - -static void exception_policy_test(const unsigned int before) -{ - unsigned int after; - int j; - policy_file = "/sys/kernel/security/tomoyo/exception_policy"; - for (j = 0; exception_testcases[j]; j++) { - int i; - FILE *fp = fopen(policy_file, "w"); - if (!fp) - BUG("BUG: Policy write error\n"); - policy = exception_testcases[j]; - printf("Processing: %s\n", policy); - for (i = 0; i < 100; i++) { - fprintf(fp, "%s\n", policy); - if (!i) - check_policy_written(fp, 1); - fprintf(fp, "delete %s\n", policy); - } - check_policy_deleted(fp, 1); - for (i = 0; i < 100; i++) - fprintf(fp, "%s\n", policy); - check_policy_written(fp, 2); - fprintf(fp, "delete %s\n", policy); - check_policy_deleted(fp, 2); - fclose(fp); - for (i = 0; i < 30; i++) { - usleep(100000); - get_meminfo(&after); - if (before == after) - break; - } - if (before != after) { - printf("Policy: %d\n", after - before); - BUG("Policy read/write test: Fail\n"); - } - } - for (j = 0; j < 10; j++) { - int i; - FILE *fp = fopen(policy_file, "w"); - if (!fp) - BUG("BUG: Policy write error\n"); - for (i = 0; exception_testcases[i]; i++) - fprintf(fp, "%s\n", exception_testcases[i]); - for (i = 0; exception_testcases[i]; i++) - fprintf(fp, "delete %s\n", exception_testcases[i]); - fclose(fp); - for (i = 0; i < 50; i++) { - usleep(100000); - get_meminfo(&after); - if (before == after) - break; - } - if (before != after) { - printf("Policy: %d\n", after - before); - BUG("Policy read/write test: Fail\n"); - } - } -} - -int main(void) -{ - unsigned int before; - mount("/proc", "/proc/", "proc", 0, NULL); - get_meminfo(&before); - domain_policy_test(before); - exception_policy_test(before); - BUG("Policy read/write test: Success\n"); - return 0; -} diff --git a/testcases/kernel/security/tomoyo/tomoyo_rewrite_test b/testcases/kernel/security/tomoyo/tomoyo_rewrite_test new file mode 100755 index 0000000000000000000000000000000000000000..60361b70023ed0555c4782de85490e4fab80e426 GIT binary patch literal 44712 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 literal 0 HcmV?d00001 diff --git a/testcases/kernel/security/tomoyo/tomoyo_rewrite_test.c b/testcases/kernel/security/tomoyo/tomoyo_rewrite_test.c deleted file mode 100644 index 7bc22c39b..000000000 --- a/testcases/kernel/security/tomoyo/tomoyo_rewrite_test.c +++ /dev/null @@ -1,169 +0,0 @@ -/******************************************************************************/ -/* This program is free software; you can redistribute it and/or modify */ -/* it under the terms of the GNU General Public License as published by */ -/* the Free Software Foundation; either version 2 of the License, or */ -/* (at your option) any later version. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ -/* the GNU General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -/* */ -/******************************************************************************/ -/* - * tomoyo_rewrite_test.c - * - * Testing program for security/tomoyo/ - * - * Copyright (C) 2005-2010 NTT DATA CORPORATION - */ -#include "include.h" - -static int should_fail = 0; - -static void show_prompt(const char *str) -{ - printf("Testing %35s: (%s) ", str, - should_fail ? "must fail" : "must success"); - errno = 0; -} - -static void show_result(int result) -{ - if (should_fail) { - if (result == EOF) { - if (errno == EPERM) - printf("OK: Permission denied.\n"); - else - printf("BUG!\n"); - } else { - printf("BUG!\n"); - } - } else { - if (result != EOF) - printf("OK\n"); - else - printf("BUG!\n"); - } -} - -#define REWRITE_PATH "/tmp/rewrite_test" - -static void stage_rewrite_test(void) -{ - int fd; - - /* Start up */ - write_domain_policy("allow_read/write " REWRITE_PATH, 0); - write_domain_policy("allow_truncate " REWRITE_PATH, 0); - write_domain_policy("allow_create " REWRITE_PATH " 0600", 0); - write_domain_policy("allow_unlink " REWRITE_PATH, 0); - write_exception_policy("deny_rewrite " REWRITE_PATH, 0); - set_profile(3, "file::open"); - set_profile(3, "file::create"); - set_profile(3, "file::truncate"); - set_profile(3, "file::rewrite"); - set_profile(3, "file::unlink"); - close(open(REWRITE_PATH, O_WRONLY | O_APPEND | O_CREAT, 0600)); - - /* Enforce mode */ - should_fail = 0; - - show_prompt("open(O_RDONLY)"); - fd = open(REWRITE_PATH, O_RDONLY); - show_result(fd); - close(fd); - - show_prompt("open(O_WRONLY | O_APPEND)"); - fd = open(REWRITE_PATH, O_WRONLY | O_APPEND); - show_result(fd); - close(fd); - - should_fail = 1; - show_prompt("open(O_WRONLY)"); - fd = open(REWRITE_PATH, O_WRONLY); - show_result(fd); - close(fd); - - show_prompt("open(O_WRONLY | O_TRUNC)"); - fd = open(REWRITE_PATH, O_WRONLY | O_TRUNC); - show_result(fd); - close(fd); - - show_prompt("open(O_WRONLY | O_TRUNC | O_APPEND)"); - fd = open(REWRITE_PATH, O_WRONLY | O_TRUNC | O_APPEND); - show_result(fd); - close(fd); - - show_prompt("truncate()"); - show_result(truncate(REWRITE_PATH, 0)); - - fd = open(REWRITE_PATH, O_WRONLY | O_APPEND); - show_prompt("ftruncate()"); - show_result(ftruncate(fd, 0)); - - show_prompt("fcntl(F_SETFL, ~O_APPEND)"); - show_result(fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_APPEND)); - close(fd); - - /* Permissive mode */ - set_profile(2, "file::open"); - set_profile(2, "file::create"); - set_profile(2, "file::truncate"); - set_profile(2, "file::rewrite"); - set_profile(2, "file::unlink"); - should_fail = 0; - - show_prompt("open(O_RDONLY)"); - fd = open(REWRITE_PATH, O_RDONLY); - show_result(fd); - close(fd); - - show_prompt("open(O_WRONLY | O_APPEND)"); - fd = open(REWRITE_PATH, O_WRONLY | O_APPEND); - show_result(fd); - close(fd); - - show_prompt("open(O_WRONLY)"); - fd = open(REWRITE_PATH, O_WRONLY); - show_result(fd); - close(fd); - - show_prompt("open(O_WRONLY | O_TRUNC)"); - fd = open(REWRITE_PATH, O_WRONLY | O_TRUNC); - show_result(fd); - close(fd); - - show_prompt("open(O_WRONLY | O_TRUNC | O_APPEND)"); - fd = open(REWRITE_PATH, O_WRONLY | O_TRUNC | O_APPEND); - show_result(fd); - close(fd); - - show_prompt("truncate()"); - show_result(truncate(REWRITE_PATH, 0)); - - fd = open(REWRITE_PATH, O_WRONLY | O_APPEND); - show_prompt("ftruncate()"); - show_result(ftruncate(fd, 0)); - - show_prompt("fcntl(F_SETFL, ~O_APPEND)"); - show_result(fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_APPEND)); - close(fd); - - /* Clean up */ - unlink(REWRITE_PATH); - write_exception_policy("deny_rewrite " REWRITE_PATH, 0); - printf("\n\n"); -} - -int main(void) -{ - tomoyo_test_init(); - stage_rewrite_test(); - clear_status(); - return 0; -}