From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EDE99C47096 for ; Thu, 3 Jun 2021 14:11:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CC0416138C for ; Thu, 3 Jun 2021 14:11:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231463AbhFCONV (ORCPT ); Thu, 3 Jun 2021 10:13:21 -0400 Received: from mail-m121144.qiye.163.com ([115.236.121.144]:21558 "EHLO mail-m121144.qiye.163.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230044AbhFCONU (ORCPT ); Thu, 3 Jun 2021 10:13:20 -0400 Received: from wanjb-KLV-WX9.. (unknown [121.229.73.16]) by mail-m121144.qiye.163.com (Hmail) with ESMTPA id DB381AC01F5; Thu, 3 Jun 2021 22:11:32 +0800 (CST) From: Wan Jiabing To: Alex Shi , Jonathan Corbet , Paul Walmsley , Palmer Dabbelt , Albert Ou , Nathan Chancellor , Nick Desaulniers , Wu XiangCheng , Fangrui Song , Bernard Zhao , Wan Jiabing , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, clang-built-linux@googlegroups.com Cc: kael_w@yeah.net Subject: [PATCH] [v5] docs/zh_CN: add translations in zh_CN/dev-tools/kasan Date: Thu, 3 Jun 2021 22:11:17 +0800 Message-Id: <20210603141127.101689-1-wanjiabing@vivo.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-HM-Spam-Status: e1kfGhgUHx5ZQUtXWQgYFAkeWUFZS1VLWVdZKFlBSE83V1ktWUFJV1kPCR oVCBIfWUFZGh9DSFZNTB8eGEgaGE4eGENVEwETFhoSFyQUDg9ZV1kWGg8SFR0UWUFZT0tIVUpKS0 JITlVLWQY+ X-HM-Sender-Digest: e1kMHhlZQR0aFwgeV1kSHx4VD1lBWUc6MxA6OBw*ED8RGRQXHxgcMxhC T0xPFDpVSlVKTUlJTElCT0JITU9OVTMWGhIXVQwaFRESGhkSFRw7DRINFFUYFBZFWVdZEgtZQVlK SUpVSUlCVUxIVUpNWVdZCAFZQUlIT0xKNwY+ X-HM-Tid: 0a79d2370a9cb039kuuudb381ac01f5 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add new zh translations * zh_CN/dev-tools/kasan.rst and link it to zh_CN/dev-tools/index.rst Reviewed-by: Fangrui Song Signed-off-by: Wan Jiabing --- Changelog: v5: - Fix some aligns below titles. v4: - Fix a space missing. v3: - Fix aligns and inaccurate translation. v2: - Delete spaces surround with English words. --- .../translations/zh_CN/dev-tools/index.rst | 2 +- .../translations/zh_CN/dev-tools/kasan.rst | 417 ++++++++++++++++++ 2 files changed, 418 insertions(+), 1 deletion(-) create mode 100644 Documentation/translations/zh_CN/dev-tools/kasan.rst diff --git a/Documentation/translations/zh_CN/dev-tools/index.rst b/Documentation/translations/zh_CN/dev-tools/index.rst index fd73c479917b..e6c99f2f543f 100644 --- a/Documentation/translations/zh_CN/dev-tools/index.rst +++ b/Documentation/translations/zh_CN/dev-tools/index.rst @@ -19,13 +19,13 @@ :maxdepth: 2 gcov + kasan Todolist: - coccinelle - sparse - kcov - - kasan - ubsan - kmemleak - kcsan diff --git a/Documentation/translations/zh_CN/dev-tools/kasan.rst b/Documentation/translations/zh_CN/dev-tools/kasan.rst new file mode 100644 index 000000000000..23db9d419047 --- /dev/null +++ b/Documentation/translations/zh_CN/dev-tools/kasan.rst @@ -0,0 +1,417 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/dev-tools/kasan.rst +:Translator: 万家兵 Wan Jiabing + +内核地址消毒剂(KASAN) +===================== + +概述 +---- + +KernelAddressSANitizer(KASAN)是一种动态内存安全错误检测工具,主要功能是 +检查内存越界访问和使用已释放内存的问题。KASAN有三种模式: + +1. 通用KASAN(与用户空间的ASan类似) +2. 基于软件标签的KASAN(与用户空间的HWASan类似) +3. 基于硬件标签的KASAN(基于硬件内存标签) + +由于通用KASAN的内存开销较大,通用KASAN主要用于调试。基于软件标签的KASAN +可用于dogfood测试,因为它具有较低的内存开销,并允许将其用于实际工作量。 +基于硬件标签的KASAN具有较低的内存和性能开销,因此可用于生产。同时可用于 +检测现场内存问题或作为安全缓解措施。 + +软件KASAN模式(#1和#2)使用编译时工具在每次内存访问之前插入有效性检查, +因此需要一个支持它的编译器版本。 + +通用KASAN在GCC和Clang受支持。GCC需要8.3.0或更高版本。任何受支持的Clang +版本都是兼容的,但从Clang 11才开始支持检测全局变量的越界访问。 + +基于软件标签的KASAN模式仅在Clang中受支持。 + +硬件KASAN模式(#3)依赖硬件来执行检查,但仍需要支持内存标签指令的编译器 +版本。GCC 10+和Clang 11+支持此模式。 + +两种软件KASAN模式都适用于SLUB和SLAB内存分配器,而基于硬件标签的KASAN目前 +仅支持SLUB。 + +目前x86_64、arm、arm64、xtensa、s390、riscv架构支持通用KASAN模式,仅 +arm64架构支持基于标签的KASAN模式。 + +用法 +---- + +要启用KASAN,请使用以下命令配置内核:: + + CONFIG_KASAN=y + +同时在 ``CONFIG_KASAN_GENERIC`` (启用通用KASAN模式), ``CONFIG_KASAN_SW_TAGS`` +(启用基于硬件标签的KASAN模式),和 ``CONFIG_KASAN_HW_TAGS`` (启用基于硬件标签 +的KASAN模式)之间进行选择。 + +对于软件模式,还可以在 ``CONFIG_KASAN_OUTLINE`` 和 ``CONFIG_KASAN_INLINE`` +之间进行选择。outline和inline是编译器插桩类型。前者产生较小的二进制文件, +而后者快1.1-2倍。 + +要将受影响的slab对象的alloc和free堆栈跟踪包含到报告中,请启用 +``CONFIG_STACKTRACE`` 。要包括受影响物理页面的分配和释放堆栈跟踪的话, +请启用 ``CONFIG_PAGE_OWNER`` 并使用 ``page_owner=on`` 进行引导。 + +错误报告 +~~~~~~~~ + +典型的KASAN报告如下所示:: + + ================================================================== + BUG: KASAN: slab-out-of-bounds in kmalloc_oob_right+0xa8/0xbc [test_kasan] + Write of size 1 at addr ffff8801f44ec37b by task insmod/2760 + + CPU: 1 PID: 2760 Comm: insmod Not tainted 4.19.0-rc3+ #698 + Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1 04/01/2014 + Call Trace: + dump_stack+0x94/0xd8 + print_address_description+0x73/0x280 + kasan_report+0x144/0x187 + __asan_report_store1_noabort+0x17/0x20 + kmalloc_oob_right+0xa8/0xbc [test_kasan] + kmalloc_tests_init+0x16/0x700 [test_kasan] + do_one_initcall+0xa5/0x3ae + do_init_module+0x1b6/0x547 + load_module+0x75df/0x8070 + __do_sys_init_module+0x1c6/0x200 + __x64_sys_init_module+0x6e/0xb0 + do_syscall_64+0x9f/0x2c0 + entry_SYSCALL_64_after_hwframe+0x44/0xa9 + RIP: 0033:0x7f96443109da + RSP: 002b:00007ffcf0b51b08 EFLAGS: 00000202 ORIG_RAX: 00000000000000af + RAX: ffffffffffffffda RBX: 000055dc3ee521a0 RCX: 00007f96443109da + RDX: 00007f96445cff88 RSI: 0000000000057a50 RDI: 00007f9644992000 + RBP: 000055dc3ee510b0 R08: 0000000000000003 R09: 0000000000000000 + R10: 00007f964430cd0a R11: 0000000000000202 R12: 00007f96445cff88 + R13: 000055dc3ee51090 R14: 0000000000000000 R15: 0000000000000000 + + Allocated by task 2760: + save_stack+0x43/0xd0 + kasan_kmalloc+0xa7/0xd0 + kmem_cache_alloc_trace+0xe1/0x1b0 + kmalloc_oob_right+0x56/0xbc [test_kasan] + kmalloc_tests_init+0x16/0x700 [test_kasan] + do_one_initcall+0xa5/0x3ae + do_init_module+0x1b6/0x547 + load_module+0x75df/0x8070 + __do_sys_init_module+0x1c6/0x200 + __x64_sys_init_module+0x6e/0xb0 + do_syscall_64+0x9f/0x2c0 + entry_SYSCALL_64_after_hwframe+0x44/0xa9 + + Freed by task 815: + save_stack+0x43/0xd0 + __kasan_slab_free+0x135/0x190 + kasan_slab_free+0xe/0x10 + kfree+0x93/0x1a0 + umh_complete+0x6a/0xa0 + call_usermodehelper_exec_async+0x4c3/0x640 + ret_from_fork+0x35/0x40 + + The buggy address belongs to the object at ffff8801f44ec300 + which belongs to the cache kmalloc-128 of size 128 + The buggy address is located 123 bytes inside of + 128-byte region [ffff8801f44ec300, ffff8801f44ec380) + The buggy address belongs to the page: + page:ffffea0007d13b00 count:1 mapcount:0 mapping:ffff8801f7001640 index:0x0 + flags: 0x200000000000100(slab) + raw: 0200000000000100 ffffea0007d11dc0 0000001a0000001a ffff8801f7001640 + raw: 0000000000000000 0000000080150015 00000001ffffffff 0000000000000000 + page dumped because: kasan: bad access detected + + Memory state around the buggy address: + ffff8801f44ec200: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb + ffff8801f44ec280: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc + >ffff8801f44ec300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 + ^ + ffff8801f44ec380: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb + ffff8801f44ec400: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc + ================================================================== + +报告标题总结了发生的错误类型以及导致该错误的访问类型。紧随其后的是错误访问的 +堆栈跟踪、所访问内存分配位置的堆栈跟踪(对于访问了slab对象的情况)以及对象 +被释放的位置的堆栈跟踪(对于访问已释放内存的问题报告)。接下来是对访问的 +slab对象的描述以及关于访问的内存页的信息。 + +最后,报告展示了访问地址周围的内存状态。在内部,KASAN单独跟踪每个内存颗粒的 +内存状态,根据KASAN模式分为8或16个对齐字节。报告的内存状态部分中的每个数字 +都显示了围绕访问地址的其中一个内存颗粒的状态。 + +对于通用KASAN,每个内存颗粒的大小为8个字节。每个颗粒的状态被编码在一个影子字节 +中。这8个字节可以是可访问的,部分访问的,已释放的或成为Redzone的一部分。KASAN +对每个影子字节使用以下编码:00表示对应内存区域的所有8个字节都可以访问;数字N +(1 <= N <= 7)表示前N个字节可访问,其他(8 - N)个字节不可访问;任何负值都表示 +无法访问整个8字节。KASAN使用不同的负值来区分不同类型的不可访问内存,如redzones +或已释放的内存(参见 mm/kasan/kasan.h)。 + +在上面的报告中,箭头指向影子字节 ``03`` ,表示访问的地址是部分可访问的。 + +对于基于标签的KASAN模式,报告最后的部分显示了访问地址周围的内存标签 +(参考 `实施细则`_ 章节)。 + +请注意,KASAN错误标题(如 ``slab-out-of-bounds`` 或 ``use-after-free`` ) +是尽量接近的:KASAN根据其拥有的有限信息打印出最可能的错误类型。错误的实际类型 +可能会有所不同。 + +通用KASAN还报告两个辅助调用堆栈跟踪。这些堆栈跟踪指向代码中与对象交互但不直接 +出现在错误访问堆栈跟踪中的位置。目前,这包括 call_rcu() 和排队的工作队列。 + +启动参数 +~~~~~~~~ + +KASAN受通用 ``panic_on_warn`` 命令行参数的影响。启用该功能后,KASAN在打印错误 +报告后会引起内核恐慌。 + +默认情况下,KASAN只为第一次无效内存访问打印错误报告。使用 ``kasan_multi_shot`` , +KASAN会针对每个无效访问打印报告。这有效地禁用了KASAN报告的 ``panic_on_warn`` 。 + +基于硬件标签的KASAN模式(请参阅下面有关各种模式的部分)旨在在生产中用作安全缓解 +措施。因此,它支持允许禁用KASAN或控制其功能的引导参数。 + +- ``kasan=off`` 或 ``=on`` 控制KASAN是否启用 (默认: ``on`` )。 + +- ``kasan.mode=sync`` 或 ``=async`` 控制KASAN是否配置为同步或异步执行模式(默认: + ``sync`` )。同步模式:当标签检查错误发生时,立即检测到错误访问。异步模式: + 延迟错误访问检测。当标签检查错误发生时,信息存储在硬件中(在arm64的 + TFSR_EL1寄存器中)。内核会定期检查硬件,并且仅在这些检查期间报告标签错误。 + +- ``kasan.stacktrace=off`` 或 ``=on`` 禁用或启用alloc和free堆栈跟踪收集 + (默认: ``on`` )。 + +- ``kasan.fault=report`` 或 ``=panic`` 控制是只打印KASAN报告还是同时使内核恐慌 + (默认: ``report`` )。即使启用了 ``kasan_multi_shot`` ,也会发生内核恐慌。 + +实施细则 +-------- + +通用KASAN +~~~~~~~~~ + +软件KASAN模式使用影子内存来记录每个内存字节是否可以安全访问,并使用编译时工具 +在每次内存访问之前插入影子内存检查。 + +通用KASAN将1/8的内核内存专用于其影子内存(16TB以覆盖x86_64上的128TB),并使用 +具有比例和偏移量的直接映射将内存地址转换为其相应的影子地址。 + +这是将地址转换为其相应影子地址的函数:: + + static inline void *kasan_mem_to_shadow(const void *addr) + { + return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) + + KASAN_SHADOW_OFFSET; + } + +在这里 ``KASAN_SHADOW_SCALE_SHIFT = 3`` 。 + +编译时工具用于插入内存访问检查。编译器在每次访问大小为1、2、4、8或16的内存之前 +插入函数调用( ``__asan_load*(addr)`` , ``__asan_store*(addr)``)。这些函数通过 +检查相应的影子内存来检查内存访问是否有效。 + +使用inline插桩,编译器不进行函数调用,而是直接插入代码来检查影子内存。此选项 +显著地增大了内核体积,但与outline插桩内核相比,它提供了x1.1-x2的性能提升。 + +通用KASAN是唯一一种通过隔离延迟重新使用已释放对象的模式 +(参见 mm/kasan/quarantine.c 以了解实现)。 + +基于软件标签的KASAN模式 +~~~~~~~~~~~~~~~~~~~~~~~ + +基于软件标签的KASAN使用软件内存标签方法来检查访问有效性。目前仅针对arm64架构实现。 + +基于软件标签的KASAN使用arm64 CPU的顶部字节忽略(TBI)特性在内核指针的顶部字节中 +存储一个指针标签。它使用影子内存来存储与每个16字节内存单元相关的内存标签(因此, +它将内核内存的1/16专用于影子内存)。 + +在每次内存分配时,基于软件标签的KASAN都会生成一个随机标签,用这个标签标记分配 +的内存,并将相同的标签嵌入到返回的指针中。 + +基于软件标签的KASAN使用编译时工具在每次内存访问之前插入检查。这些检查确保正在 +访问的内存的标签等于用于访问该内存的指针的标签。如果标签不匹配,基于软件标签 +的KASAN会打印错误报告。 + +基于软件标签的KASAN也有两种插桩模式(outline,发出回调来检查内存访问;inline, +执行内联的影子内存检查)。使用outline插桩模式,会从执行访问检查的函数打印错误 +报告。使用inline插桩,编译器会发出 ``brk`` 指令,并使用专用的 ``brk`` 处理程序 +来打印错误报告。 + +基于软件标签的KASAN使用0xFF作为匹配所有指针标签(不检查通过带有0xFF指针标签 +的指针进行的访问)。值0xFE当前保留用于标记已释放的内存区域。 + +基于软件标签的KASAN目前仅支持对Slab和page_alloc内存进行标记。 + +基于硬件标签的KASAN模式 +~~~~~~~~~~~~~~~~~~~~~~~ + +基于硬件标签的KASAN在概念上类似于软件模式,但它是使用硬件内存标签作为支持而 +不是编译器插桩和影子内存。 + +基于硬件标签的KASAN目前仅针对arm64架构实现,并且基于ARMv8.5指令集架构中引入 +的arm64内存标记扩展(MTE)和最高字节忽略(TBI)。 + +特殊的arm64指令用于为每次内存分配指定内存标签。相同的标签被指定给指向这些分配 +的指针。在每次内存访问时,硬件确保正在访问的内存的标签等于用于访问该内存的指针 +的标签。如果标签不匹配,则会生成故障并打印报告。 + +基于硬件标签的KASAN使用0xFF作为匹配所有指针标签(不检查通过带有0xFF指针标签的 +指针进行的访问)。值0xFE当前保留用于标记已释放的内存区域。 + +基于硬件标签的KASAN目前仅支持对Slab和page_alloc内存进行标记。 + +如果硬件不支持MTE(ARMv8.5之前),则不会启用基于硬件标签的KASAN。在这种情况下, +所有KASAN引导参数都将被忽略。 + +请注意,启用CONFIG_KASAN_HW_TAGS始终会导致启用内核中的TBI。即使提供了 +``kasan.mode=off`` 或硬件不支持MTE(但支持TBI)。 + +基于硬件标签的KASAN只报告第一个发现的错误。之后,MTE标签检查将被禁用。 + +影子内存 +-------- + +内核将内存映射到地址空间的几个不同部分。内核虚拟地址的范围很大:没有足够的真实 +内存来支持内核可以访问的每个地址的真实影子区域。因此,KASAN只为地址空间的某些 +部分映射真实的影子。 + +默认行为 +~~~~~~~~ + +默认情况下,体系结构仅将实际内存映射到用于线性映射的阴影区域(以及可能的其他 +小区域)。对于所有其他区域 —— 例如vmalloc和vmemmap空间 —— 一个只读页面被映射 +到阴影区域上。这个只读的影子页面声明所有内存访问都是允许的。 + +这给模块带来了一个问题:它们不存在于线性映射中,而是存在于专用的模块空间中。 +通过连接模块分配器,KASAN临时映射真实的影子内存以覆盖它们。例如,这允许检测 +对模块全局变量的无效访问。 + +这也造成了与 ``VMAP_STACK`` 的不兼容:如果堆栈位于vmalloc空间中,它将被分配 +只读页面的影子内存,并且内核在尝试为堆栈变量设置影子数据时会出错。 + +CONFIG_KASAN_VMALLOC +~~~~~~~~~~~~~~~~~~~~ + +使用 ``CONFIG_KASAN_VMALLOC`` ,KASAN可以以更大的内存使用为代价覆盖vmalloc +空间。目前,这在x86、riscv、s390和powerpc上受支持。 + +这通过连接到vmalloc和vmap并动态分配真实的影子内存来支持映射。 + +vmalloc空间中的大多数映射都很小,需要不到一整页的阴影空间。因此,为每个映射 +分配一个完整的影子页面将是一种浪费。此外,为了确保不同的映射使用不同的影子 +页面,映射必须与 ``KASAN_GRANULE_SIZE * PAGE_SIZE`` 对齐。 + +相反,KASAN跨多个映射共享后备空间。当vmalloc空间中的映射使用影子区域的特定 +页面时,它会分配一个后备页面。此页面稍后可以由其他vmalloc映射共享。 + +KASAN连接到vmap基础架构以懒清理未使用的影子内存。 + +为了避免交换映射的困难,KASAN预测覆盖vmalloc空间的阴影区域部分将不会被早期 +的阴影页面覆盖,但是将不会被映射。这将需要更改特定于arch的代码。 + +这允许在x86上支持 ``VMAP_STACK`` ,并且可以简化对没有固定模块区域的架构的支持。 + +对于开发者 +---------- + +忽略访问 +~~~~~~~~ + +软件KASAN模式使用编译器插桩来插入有效性检查。此类检测可能与内核的某些部分 +不兼容,因此需要禁用。 + +内核的其他部分可能会访问已分配对象的元数据。通常,KASAN会检测并报告此类访问, +但在某些情况下(例如,在内存分配器中),这些访问是有效的。 + +对于软件KASAN模式,要禁用特定文件或目录的检测,请将 ``KASAN_SANITIZE`` 添加 +到相应的内核Makefile中: + +- 对于单个文件(例如,main.o):: + + KASAN_SANITIZE_main.o := n + +- 对于一个目录下的所有文件:: + + KASAN_SANITIZE := n + +对于软件KASAN模式,要在每个函数的基础上禁用检测,请使用KASAN特定的 +``__no_sanitize_address`` 函数属性或通用的 ``noinstr`` 。 + +请注意,禁用编译器插桩(基于每个文件或每个函数)会使KASAN忽略在软件KASAN模式 +的代码中直接发生的访问。当访问是间接发生的(通过调用检测函数)或使用没有编译器 +插桩的基于硬件标签的模式时,它没有帮助。 + +对于软件KASAN模式,要在当前任务的一部分内核代码中禁用KASAN报告,请使用 +``kasan_disable_current()``/``kasan_enable_current()`` 部分注释这部分代码。 +这也会禁用通过函数调用发生的间接访问的报告。 + +对于基于标签的KASAN模式(包括硬件模式),要禁用访问检查,请使用 +``kasan_reset_tag()`` 或 ``page_kasan_tag_reset()`` 。请注意,通过 +``page_kasan_tag_reset()`` 临时禁用访问检查需要通过 ``page_kasan_tag`` +/ ``page_kasan_tag_set`` 保存和恢复每页KASAN标签。 + +测试 +~~~~ + +有一些KASAN测试可以验证KASAN是否正常工作并可以检测某些类型的内存损坏。 +测试由两部分组成: + +1. 与KUnit测试框架集成的测试。使用 ``CONFIG_KASAN_KUNIT_TEST`` 启用。 +这些测试可以通过几种不同的方式自动运行和部分验证;请参阅下面的说明。 + +2. 与KUnit不兼容的测试。使用 ``CONFIG_KASAN_MODULE_TEST`` 启用并且只能作为模块 +运行。这些测试只能通过加载内核模块并检查内核日志以获取KASAN报告来手动验证。 + +如果检测到错误,每个KUnit兼容的KASAN测试都会打印多个KASAN报告之一,然后测试打印 +其编号和状态。 + +当测试通过:: + + ok 28 - kmalloc_double_kzfree + +当由于 ``kmalloc`` 失败而导致测试失败时:: + + # kmalloc_large_oob_right: ASSERTION FAILED at lib/test_kasan.c:163 + Expected ptr is not null, but is + not ok 4 - kmalloc_large_oob_right + +当由于缺少KASAN报告而导致测试失败时:: + + # kmalloc_double_kzfree: EXPECTATION FAILED at lib/test_kasan.c:629 + Expected kasan_data->report_expected == kasan_data->report_found, but + kasan_data->report_expected == 1 + kasan_data->report_found == 0 + not ok 28 - kmalloc_double_kzfree + +最后打印所有KASAN测试的累积状态。成功:: + + ok 1 - kasan + +或者,如果其中一项测试失败:: + + not ok 1 - kasan + +有几种方法可以运行与KUnit兼容的KASAN测试。 + +1. 可加载模块 + + 启用 ``CONFIG_KUNIT`` 后,KASAN-KUnit测试可以构建为可加载模块,并通过使用 + ``insmod`` 或 ``modprobe`` 加载 ``test_kasan.ko`` 来运行。 + +2. 内置 + + 通过内置 ``CONFIG_KUNIT`` ,也可以内置KASAN-KUnit测试。在这种情况下, + 测试将在启动时作为后期初始化调用运行。 + +3. 使用kunit_tool + + 通过内置 ``CONFIG_KUNIT`` 和 ``CONFIG_KASAN_KUNIT_TEST`` ,还可以使用 + ``kunit_tool`` 以更易读的方式查看KUnit测试结果。这不会打印通过测试 + 的KASAN报告。有关 ``kunit_tool`` 更多最新信息,请参阅 + `KUnit文档 `_ 。 + +.. _KUnit: https://www.kernel.org/doc/html/latest/dev-tools/kunit/index.html -- 2.30.2 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BBAD3C47096 for ; Thu, 3 Jun 2021 14:12:04 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6FC7C613B1 for ; Thu, 3 Jun 2021 14:12:04 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6FC7C613B1 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=vivo.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=oMZx26VcJORgCkW1ifTrMQKePor3WacYIO9lTeDfn8g=; b=cyicRo6fED/qhD Z/SWBKQxHHdAb8kJcSWRLU+pAWHclvH5rwQJ3762SDAzw7IGIi4qasBJNhCVKruPcRnKmqs5wBdJe PNvd9kJ8g1oBwkWIiYzfLQUOaXSc48sQaiVf7VkwtB5vk4TJgqI6y8b1nULHL0nz08Hp2x8Gj2d4V IctPilfJqv7dlEzmZj1gWSA7VUTkJsJ8nc4j5Bbf74pO9YmQIe7DfOY1BDv3i94GBDmTL2isUcBFB qk/ZvaUWdZ4vj1o3zwi99Kx8mQx1ygKuApM4WjiKBfPAbgjpHHwLnG3XHmPT+dtfqGeVz6peBRxv0 md1rLu3i+dHoM02EEy6w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1loo4X-0094Lp-Rl; Thu, 03 Jun 2021 14:11:45 +0000 Received: from mail-m121144.qiye.163.com ([115.236.121.144]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1loo4T-0094Ja-1O for linux-riscv@lists.infradead.org; Thu, 03 Jun 2021 14:11:44 +0000 Received: from wanjb-KLV-WX9.. (unknown [121.229.73.16]) by mail-m121144.qiye.163.com (Hmail) with ESMTPA id DB381AC01F5; Thu, 3 Jun 2021 22:11:32 +0800 (CST) From: Wan Jiabing To: Alex Shi , Jonathan Corbet , Paul Walmsley , Palmer Dabbelt , Albert Ou , Nathan Chancellor , Nick Desaulniers , Wu XiangCheng , Fangrui Song , Bernard Zhao , Wan Jiabing , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, clang-built-linux@googlegroups.com Cc: kael_w@yeah.net Subject: [PATCH] [v5] docs/zh_CN: add translations in zh_CN/dev-tools/kasan Date: Thu, 3 Jun 2021 22:11:17 +0800 Message-Id: <20210603141127.101689-1-wanjiabing@vivo.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 X-HM-Spam-Status: e1kfGhgUHx5ZQUtXWQgYFAkeWUFZS1VLWVdZKFlBSE83V1ktWUFJV1kPCR oVCBIfWUFZGh9DSFZNTB8eGEgaGE4eGENVEwETFhoSFyQUDg9ZV1kWGg8SFR0UWUFZT0tIVUpKS0 JITlVLWQY+ X-HM-Sender-Digest: e1kMHhlZQR0aFwgeV1kSHx4VD1lBWUc6MxA6OBw*ED8RGRQXHxgcMxhC T0xPFDpVSlVKTUlJTElCT0JITU9OVTMWGhIXVQwaFRESGhkSFRw7DRINFFUYFBZFWVdZEgtZQVlK SUpVSUlCVUxIVUpNWVdZCAFZQUlIT0xKNwY+ X-HM-Tid: 0a79d2370a9cb039kuuudb381ac01f5 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210603_071141_411766_891181F4 X-CRM114-Status: GOOD ( 11.97 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org QWRkIG5ldyB6aCB0cmFuc2xhdGlvbnMKKiB6aF9DTi9kZXYtdG9vbHMva2FzYW4ucnN0CmFuZCBs aW5rIGl0IHRvIHpoX0NOL2Rldi10b29scy9pbmRleC5yc3QKClJldmlld2VkLWJ5OiBGYW5ncnVp IFNvbmcgPG1hc2tyYXlAZ29vZ2xlLmNvbT4KU2lnbmVkLW9mZi1ieTogV2FuIEppYWJpbmcgPHdh bmppYWJpbmdAdml2by5jb20+Ci0tLQpDaGFuZ2Vsb2c6CnY1OgotIEZpeCBzb21lIGFsaWducyBi ZWxvdyB0aXRsZXMuCnY0OgotIEZpeCBhIHNwYWNlIG1pc3NpbmcuCnYzOgotIEZpeCBhbGlnbnMg YW5kIGluYWNjdXJhdGUgdHJhbnNsYXRpb24uCnYyOgotIERlbGV0ZSBzcGFjZXMgc3Vycm91bmQg d2l0aCBFbmdsaXNoIHdvcmRzLgotLS0KIC4uLi90cmFuc2xhdGlvbnMvemhfQ04vZGV2LXRvb2xz L2luZGV4LnJzdCAgICB8ICAgMiArLQogLi4uL3RyYW5zbGF0aW9ucy96aF9DTi9kZXYtdG9vbHMv a2FzYW4ucnN0ICAgIHwgNDE3ICsrKysrKysrKysrKysrKysrKwogMiBmaWxlcyBjaGFuZ2VkLCA0 MTggaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3Vt ZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2Rldi10b29scy9rYXNhbi5yc3QKCmRpZmYgLS1n aXQgYS9Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9kZXYtdG9vbHMvaW5kZXgucnN0 IGIvRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vZGV2LXRvb2xzL2luZGV4LnJzdApp bmRleCBmZDczYzQ3OTkxN2IuLmU2Yzk5ZjJmNTQzZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlv bi90cmFuc2xhdGlvbnMvemhfQ04vZGV2LXRvb2xzL2luZGV4LnJzdAorKysgYi9Eb2N1bWVudGF0 aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9kZXYtdG9vbHMvaW5kZXgucnN0CkBAIC0xOSwxMyArMTks MTMgQEAKICAgIDptYXhkZXB0aDogMgogCiAgICBnY292CisgICBrYXNhbgogCiBUb2RvbGlzdDoK IAogIC0gY29jY2luZWxsZQogIC0gc3BhcnNlCiAgLSBrY292Ci0gLSBrYXNhbgogIC0gdWJzYW4K ICAtIGttZW1sZWFrCiAgLSBrY3NhbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90cmFuc2xh dGlvbnMvemhfQ04vZGV2LXRvb2xzL2thc2FuLnJzdCBiL0RvY3VtZW50YXRpb24vdHJhbnNsYXRp b25zL3poX0NOL2Rldi10b29scy9rYXNhbi5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAwLi4yM2RiOWQ0MTkwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0 aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9kZXYtdG9vbHMva2FzYW4ucnN0CkBAIC0wLDAgKzEsNDE3 IEBACisuLiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorCisuLiBpbmNsdWRlOjog Li4vZGlzY2xhaW1lci16aF9DTi5yc3QKKworOk9yaWdpbmFsOiBEb2N1bWVudGF0aW9uL2Rldi10 b29scy9rYXNhbi5yc3QKKzpUcmFuc2xhdG9yOiDkuIflrrblhbUgV2FuIEppYWJpbmcgPHdhbmpp YWJpbmdAdml2by5jb20+CisKK+WGheaguOWcsOWdgOa2iOavkuWJgihLQVNBTikKKz09PT09PT09 PT09PT09PT09PT09PQorCivmpoLov7AKKy0tLS0KKworS2VybmVsQWRkcmVzc1NBTml0aXplcihL QVNBTinmmK/kuIDnp43liqjmgIHlhoXlrZjlronlhajplJnor6/mo4DmtYvlt6XlhbfvvIzkuLvo poHlip/og73mmK8KK+ajgOafpeWGheWtmOi2iueVjOiuv+mXruWSjOS9v+eUqOW3sumHiuaUvuWG heWtmOeahOmXrumimOOAgktBU0FO5pyJ5LiJ56eN5qih5byPOgorCisxLiDpgJrnlKhLQVNBTu+8 iOS4jueUqOaIt+epuumXtOeahEFTYW7nsbvkvLzvvIkKKzIuIOWfuuS6jui9r+S7tuagh+etvuea hEtBU0FO77yI5LiO55So5oi356m66Ze055qESFdBU2Fu57G75Ly877yJCiszLiDln7rkuo7noazk u7bmoIfnrb7nmoRLQVNBTu+8iOWfuuS6juehrOS7tuWGheWtmOagh+etvu+8iQorCivnlLHkuo7p gJrnlKhLQVNBTueahOWGheWtmOW8gOmUgOi+g+Wkp++8jOmAmueUqEtBU0FO5Li76KaB55So5LqO 6LCD6K+V44CC5Z+65LqO6L2v5Lu25qCH562+55qES0FTQU4KK+WPr+eUqOS6jmRvZ2Zvb2TmtYvo r5XvvIzlm6DkuLrlroPlhbfmnInovoPkvY7nmoTlhoXlrZjlvIDplIDvvIzlubblhYHorrjlsIbl hbbnlKjkuo7lrp7pmYXlt6XkvZzph4/jgIIKK+WfuuS6juehrOS7tuagh+etvueahEtBU0FO5YW3 5pyJ6L6D5L2O55qE5YaF5a2Y5ZKM5oCn6IO95byA6ZSA77yM5Zug5q2k5Y+v55So5LqO55Sf5Lqn 44CC5ZCM5pe25Y+v55So5LqOCivmo4DmtYvnjrDlnLrlhoXlrZjpl67popjmiJbkvZzkuLrlronl hajnvJPop6Pmjqrmlr3jgIIKKwor6L2v5Lu2S0FTQU7mqKHlvI/vvIgjMeWSjCMy77yJ5L2/55So 57yW6K+R5pe25bel5YW35Zyo5q+P5qyh5YaF5a2Y6K6/6Zeu5LmL5YmN5o+S5YWl5pyJ5pWI5oCn 5qOA5p+l77yMCivlm6DmraTpnIDopoHkuIDkuKrmlK/mjIHlroPnmoTnvJbor5HlmajniYjmnKzj gIIKKwor6YCa55SoS0FTQU7lnKhHQ0PlkoxDbGFuZ+WPl+aUr+aMgeOAgkdDQ+mcgOimgTguMy4w 5oiW5pu06auY54mI5pys44CC5Lu75L2V5Y+X5pSv5oyB55qEQ2xhbmcKK+eJiOacrOmDveaYr+WF vOWuueeahO+8jOS9huS7jkNsYW5nIDEx5omN5byA5aeL5pSv5oyB5qOA5rWL5YWo5bGA5Y+Y6YeP 55qE6LaK55WM6K6/6Zeu44CCCisKK+WfuuS6jui9r+S7tuagh+etvueahEtBU0FO5qih5byP5LuF 5ZyoQ2xhbmfkuK3lj5fmlK/mjIHjgIIKKwor56Gs5Lu2S0FTQU7mqKHlvI/vvIgjM++8ieS+nei1 luehrOS7tuadpeaJp+ihjOajgOafpe+8jOS9huS7jemcgOimgeaUr+aMgeWGheWtmOagh+etvuaM h+S7pOeahOe8luivkeWZqAor54mI5pys44CCR0NDIDEwK+WSjENsYW5nIDExK+aUr+aMgeatpOao oeW8j+OAggorCivkuKTnp43ova/ku7ZLQVNBTuaooeW8j+mDvemAgueUqOS6jlNMVULlkoxTTEFC 5YaF5a2Y5YiG6YWN5Zmo77yM6ICM5Z+65LqO56Gs5Lu25qCH562+55qES0FTQU7nm67liY0KK+S7 heaUr+aMgVNMVULjgIIKKwor55uu5YmNeDg2XzY044CBYXJt44CBYXJtNjTjgIF4dGVuc2HjgIFz Mzkw44CBcmlzY3bmnrbmnoTmlK/mjIHpgJrnlKhLQVNBTuaooeW8j++8jOS7hQorYXJtNjTmnrbm noTmlK/mjIHln7rkuo7moIfnrb7nmoRLQVNBTuaooeW8j+OAggorCivnlKjms5UKKy0tLS0KKwor 6KaB5ZCv55SoS0FTQU7vvIzor7fkvb/nlKjku6XkuIvlkb3ku6TphY3nva7lhoXmoLg6OgorCisJ ICBDT05GSUdfS0FTQU49eQorCivlkIzml7blnKggYGBDT05GSUdfS0FTQU5fR0VORVJJQ2BgICjl kK/nlKjpgJrnlKhLQVNBTuaooeW8jynvvIwgYGBDT05GSUdfS0FTQU5fU1dfVEFHU2BgCiso5ZCv 55So5Z+65LqO56Gs5Lu25qCH562+55qES0FTQU7mqKHlvI8p77yM5ZKMIGBgQ09ORklHX0tBU0FO X0hXX1RBR1NgYCAo5ZCv55So5Z+65LqO56Gs5Lu25qCH562+CivnmoRLQVNBTuaooeW8jynkuYvp l7Tov5vooYzpgInmi6njgIIKKwor5a+55LqO6L2v5Lu25qih5byP77yM6L+Y5Y+v5Lul5ZyoIGBg Q09ORklHX0tBU0FOX09VVExJTkVgYCDlkowgYGBDT05GSUdfS0FTQU5fSU5MSU5FYGAKK+S5i+mX tOi/m+ihjOmAieaLqeOAgm91dGxpbmXlkoxpbmxpbmXmmK/nvJbor5Hlmajmj5Lmoannsbvlnovj gILliY3ogIXkuqfnlJ/ovoPlsI/nmoTkuozov5vliLbmlofku7bvvIwKK+iAjOWQjuiAheW/qzEu MS0y5YCN44CCCisKK+imgeWwhuWPl+W9seWTjeeahHNsYWLlr7nosaHnmoRhbGxvY+WSjGZyZWXl oIbmoIjot5/ouKrljIXlkKvliLDmiqXlkYrkuK3vvIzor7flkK/nlKgKK2BgQ09ORklHX1NUQUNL VFJBQ0VgYCDjgILopoHljIXmi6zlj5flvbHlk43niannkIbpobXpnaLnmoTliIbphY3lkozph4rm lL7loIbmoIjot5/ouKrnmoTor53vvIwKK+ivt+WQr+eUqCBgYENPTkZJR19QQUdFX09XTkVSYGAg 5bm25L2/55SoIGBgcGFnZV9vd25lcj1vbmBgIOi/m+ihjOW8leWvvOOAggorCivplJnor6/miqXl kYoKK35+fn5+fn5+CisKK+WFuOWei+eahEtBU0FO5oql5ZGK5aaC5LiL5omA56S6OjoKKworICAg ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQorICAgIEJVRzogS0FTQU46IHNsYWItb3V0LW9mLWJvdW5kcyBpbiBrbWFsbG9j X29vYl9yaWdodCsweGE4LzB4YmMgW3Rlc3Rfa2FzYW5dCisgICAgV3JpdGUgb2Ygc2l6ZSAxIGF0 IGFkZHIgZmZmZjg4MDFmNDRlYzM3YiBieSB0YXNrIGluc21vZC8yNzYwCisKKyAgICBDUFU6IDEg UElEOiAyNzYwIENvbW06IGluc21vZCBOb3QgdGFpbnRlZCA0LjE5LjAtcmMzKyAjNjk4CisgICAg SGFyZHdhcmUgbmFtZTogUUVNVSBTdGFuZGFyZCBQQyAoaTQ0MEZYICsgUElJWCwgMTk5NiksIEJJ T1MgMS4xMC4yLTEgMDQvMDEvMjAxNAorICAgIENhbGwgVHJhY2U6CisgICAgIGR1bXBfc3RhY2sr MHg5NC8weGQ4CisgICAgIHByaW50X2FkZHJlc3NfZGVzY3JpcHRpb24rMHg3My8weDI4MAorICAg ICBrYXNhbl9yZXBvcnQrMHgxNDQvMHgxODcKKyAgICAgX19hc2FuX3JlcG9ydF9zdG9yZTFfbm9h Ym9ydCsweDE3LzB4MjAKKyAgICAga21hbGxvY19vb2JfcmlnaHQrMHhhOC8weGJjIFt0ZXN0X2th c2FuXQorICAgICBrbWFsbG9jX3Rlc3RzX2luaXQrMHgxNi8weDcwMCBbdGVzdF9rYXNhbl0KKyAg ICAgZG9fb25lX2luaXRjYWxsKzB4YTUvMHgzYWUKKyAgICAgZG9faW5pdF9tb2R1bGUrMHgxYjYv MHg1NDcKKyAgICAgbG9hZF9tb2R1bGUrMHg3NWRmLzB4ODA3MAorICAgICBfX2RvX3N5c19pbml0 X21vZHVsZSsweDFjNi8weDIwMAorICAgICBfX3g2NF9zeXNfaW5pdF9tb2R1bGUrMHg2ZS8weGIw CisgICAgIGRvX3N5c2NhbGxfNjQrMHg5Zi8weDJjMAorICAgICBlbnRyeV9TWVNDQUxMXzY0X2Fm dGVyX2h3ZnJhbWUrMHg0NC8weGE5CisgICAgUklQOiAwMDMzOjB4N2Y5NjQ0MzEwOWRhCisgICAg UlNQOiAwMDJiOjAwMDA3ZmZjZjBiNTFiMDggRUZMQUdTOiAwMDAwMDIwMiBPUklHX1JBWDogMDAw MDAwMDAwMDAwMDBhZgorICAgIFJBWDogZmZmZmZmZmZmZmZmZmZkYSBSQlg6IDAwMDA1NWRjM2Vl NTIxYTAgUkNYOiAwMDAwN2Y5NjQ0MzEwOWRhCisgICAgUkRYOiAwMDAwN2Y5NjQ0NWNmZjg4IFJT STogMDAwMDAwMDAwMDA1N2E1MCBSREk6IDAwMDA3Zjk2NDQ5OTIwMDAKKyAgICBSQlA6IDAwMDA1 NWRjM2VlNTEwYjAgUjA4OiAwMDAwMDAwMDAwMDAwMDAzIFIwOTogMDAwMDAwMDAwMDAwMDAwMAor ICAgIFIxMDogMDAwMDdmOTY0NDMwY2QwYSBSMTE6IDAwMDAwMDAwMDAwMDAyMDIgUjEyOiAwMDAw N2Y5NjQ0NWNmZjg4CisgICAgUjEzOiAwMDAwNTVkYzNlZTUxMDkwIFIxNDogMDAwMDAwMDAwMDAw MDAwMCBSMTU6IDAwMDAwMDAwMDAwMDAwMDAKKworICAgIEFsbG9jYXRlZCBieSB0YXNrIDI3NjA6 CisgICAgIHNhdmVfc3RhY2srMHg0My8weGQwCisgICAgIGthc2FuX2ttYWxsb2MrMHhhNy8weGQw CisgICAgIGttZW1fY2FjaGVfYWxsb2NfdHJhY2UrMHhlMS8weDFiMAorICAgICBrbWFsbG9jX29v Yl9yaWdodCsweDU2LzB4YmMgW3Rlc3Rfa2FzYW5dCisgICAgIGttYWxsb2NfdGVzdHNfaW5pdCsw eDE2LzB4NzAwIFt0ZXN0X2thc2FuXQorICAgICBkb19vbmVfaW5pdGNhbGwrMHhhNS8weDNhZQor ICAgICBkb19pbml0X21vZHVsZSsweDFiNi8weDU0NworICAgICBsb2FkX21vZHVsZSsweDc1ZGYv MHg4MDcwCisgICAgIF9fZG9fc3lzX2luaXRfbW9kdWxlKzB4MWM2LzB4MjAwCisgICAgIF9feDY0 X3N5c19pbml0X21vZHVsZSsweDZlLzB4YjAKKyAgICAgZG9fc3lzY2FsbF82NCsweDlmLzB4MmMw CisgICAgIGVudHJ5X1NZU0NBTExfNjRfYWZ0ZXJfaHdmcmFtZSsweDQ0LzB4YTkKKworICAgIEZy ZWVkIGJ5IHRhc2sgODE1OgorICAgICBzYXZlX3N0YWNrKzB4NDMvMHhkMAorICAgICBfX2thc2Fu X3NsYWJfZnJlZSsweDEzNS8weDE5MAorICAgICBrYXNhbl9zbGFiX2ZyZWUrMHhlLzB4MTAKKyAg ICAga2ZyZWUrMHg5My8weDFhMAorICAgICB1bWhfY29tcGxldGUrMHg2YS8weGEwCisgICAgIGNh bGxfdXNlcm1vZGVoZWxwZXJfZXhlY19hc3luYysweDRjMy8weDY0MAorICAgICByZXRfZnJvbV9m b3JrKzB4MzUvMHg0MAorCisgICAgVGhlIGJ1Z2d5IGFkZHJlc3MgYmVsb25ncyB0byB0aGUgb2Jq ZWN0IGF0IGZmZmY4ODAxZjQ0ZWMzMDAKKyAgICAgd2hpY2ggYmVsb25ncyB0byB0aGUgY2FjaGUg a21hbGxvYy0xMjggb2Ygc2l6ZSAxMjgKKyAgICBUaGUgYnVnZ3kgYWRkcmVzcyBpcyBsb2NhdGVk IDEyMyBieXRlcyBpbnNpZGUgb2YKKyAgICAgMTI4LWJ5dGUgcmVnaW9uIFtmZmZmODgwMWY0NGVj MzAwLCBmZmZmODgwMWY0NGVjMzgwKQorICAgIFRoZSBidWdneSBhZGRyZXNzIGJlbG9uZ3MgdG8g dGhlIHBhZ2U6CisgICAgcGFnZTpmZmZmZWEwMDA3ZDEzYjAwIGNvdW50OjEgbWFwY291bnQ6MCBt YXBwaW5nOmZmZmY4ODAxZjcwMDE2NDAgaW5kZXg6MHgwCisgICAgZmxhZ3M6IDB4MjAwMDAwMDAw MDAwMTAwKHNsYWIpCisgICAgcmF3OiAwMjAwMDAwMDAwMDAwMTAwIGZmZmZlYTAwMDdkMTFkYzAg MDAwMDAwMWEwMDAwMDAxYSBmZmZmODgwMWY3MDAxNjQwCisgICAgcmF3OiAwMDAwMDAwMDAwMDAw MDAwIDAwMDAwMDAwODAxNTAwMTUgMDAwMDAwMDFmZmZmZmZmZiAwMDAwMDAwMDAwMDAwMDAwCisg ICAgcGFnZSBkdW1wZWQgYmVjYXVzZToga2FzYW46IGJhZCBhY2Nlc3MgZGV0ZWN0ZWQKKworICAg IE1lbW9yeSBzdGF0ZSBhcm91bmQgdGhlIGJ1Z2d5IGFkZHJlc3M6CisgICAgIGZmZmY4ODAxZjQ0 ZWMyMDA6IGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiCisg ICAgIGZmZmY4ODAxZjQ0ZWMyODA6IGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZjIGZjIGZjIGZj IGZjIGZjIGZjIGZjCisgICAgPmZmZmY4ODAxZjQ0ZWMzMDA6IDAwIDAwIDAwIDAwIDAwIDAwIDAw IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgICAgZmZmZjg4MDFm NDRlYzM4MDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIK KyAgICAgZmZmZjg4MDFmNDRlYzQwMDogZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmMgZmMgZmMg ZmMgZmMgZmMgZmMgZmMKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwor5oql5ZGK5qCH6aKY5oC757uT5LqG5Y+R 55Sf55qE6ZSZ6K+v57G75Z6L5Lul5Y+K5a+86Ie06K+l6ZSZ6K+v55qE6K6/6Zeu57G75Z6L44CC 57Sn6ZqP5YW25ZCO55qE5piv6ZSZ6K+v6K6/6Zeu55qECivloIbmoIjot5/ouKrjgIHmiYDorr/p l67lhoXlrZjliIbphY3kvY3nva7nmoTloIbmoIjot5/ouKrvvIjlr7nkuo7orr/pl67kuoZzbGFi 5a+56LGh55qE5oOF5Ya177yJ5Lul5Y+K5a+56LGhCivooqvph4rmlL7nmoTkvY3nva7nmoTloIbm oIjot5/ouKrvvIjlr7nkuo7orr/pl67lt7Lph4rmlL7lhoXlrZjnmoTpl67popjmiqXlkYrvvInj gILmjqXkuIvmnaXmmK/lr7norr/pl67nmoQKK3NsYWLlr7nosaHnmoTmj4/ov7Dku6Xlj4rlhbPk uo7orr/pl67nmoTlhoXlrZjpobXnmoTkv6Hmga/jgIIKKwor5pyA5ZCO77yM5oql5ZGK5bGV56S6 5LqG6K6/6Zeu5Zyw5Z2A5ZGo5Zu055qE5YaF5a2Y54q25oCB44CC5Zyo5YaF6YOo77yMS0FTQU7l jZXni6zot5/ouKrmr4/kuKrlhoXlrZjpopfnspLnmoQKK+WGheWtmOeKtuaAge+8jOagueaNrktB U0FO5qih5byP5YiG5Li6OOaIljE25Liq5a+56b2Q5a2X6IqC44CC5oql5ZGK55qE5YaF5a2Y54q2 5oCB6YOo5YiG5Lit55qE5q+P5Liq5pWw5a2XCivpg73mmL7npLrkuoblm7Tnu5Xorr/pl67lnLDl nYDnmoTlhbbkuK3kuIDkuKrlhoXlrZjpopfnspLnmoTnirbmgIHjgIIKKwor5a+55LqO6YCa55So S0FTQU7vvIzmr4/kuKrlhoXlrZjpopfnspLnmoTlpKflsI/kuLo45Liq5a2X6IqC44CC5q+P5Liq 6aKX57KS55qE54q25oCB6KKr57yW56CB5Zyo5LiA5Liq5b2x5a2Q5a2X6IqCCivkuK3jgILov5k4 5Liq5a2X6IqC5Y+v5Lul5piv5Y+v6K6/6Zeu55qE77yM6YOo5YiG6K6/6Zeu55qE77yM5bey6YeK 5pS+55qE5oiW5oiQ5Li6UmVkem9uZeeahOS4gOmDqOWIhuOAgktBU0FOCivlr7nmr4/kuKrlvbHl rZDlrZfoioLkvb/nlKjku6XkuIvnvJbnoIE6MDDooajnpLrlr7nlupTlhoXlrZjljLrln5/nmoTm iYDmnIk45Liq5a2X6IqC6YO95Y+v5Lul6K6/6Zeu77yb5pWw5a2XTgorKDEgPD0gTiA8PSA3Keih qOekuuWJjU7kuKrlrZfoioLlj6/orr/pl67vvIzlhbbku5YoOCAtIE4p5Liq5a2X6IqC5LiN5Y+v 6K6/6Zeu77yb5Lu75L2V6LSf5YC86YO96KGo56S6Civml6Dms5Xorr/pl67mlbTkuKo45a2X6IqC 44CCS0FTQU7kvb/nlKjkuI3lkIznmoTotJ/lgLzmnaXljLrliIbkuI3lkIznsbvlnovnmoTkuI3l j6/orr/pl67lhoXlrZjvvIzlpoJyZWR6b25lcwor5oiW5bey6YeK5pS+55qE5YaF5a2Y77yI5Y+C 6KeBIG1tL2thc2FuL2thc2FuLmjvvInjgIIKKwor5Zyo5LiK6Z2i55qE5oql5ZGK5Lit77yM566t 5aS05oyH5ZCR5b2x5a2Q5a2X6IqCIGBgMDNgYCDvvIzooajnpLrorr/pl67nmoTlnLDlnYDmmK/p g6jliIblj6/orr/pl67nmoTjgIIKKwor5a+55LqO5Z+65LqO5qCH562+55qES0FTQU7mqKHlvI/v vIzmiqXlkYrmnIDlkI7nmoTpg6jliIbmmL7npLrkuoborr/pl67lnLDlnYDlkajlm7TnmoTlhoXl rZjmoIfnrb4KKyjlj4LogIMgYOWunuaWvee7huWImWBfIOeroOiKginjgIIKKwor6K+35rOo5oSP 77yMS0FTQU7plJnor6/moIfpopjvvIjlpoIgYGBzbGFiLW91dC1vZi1ib3VuZHNgYCDmiJYgYGB1 c2UtYWZ0ZXItZnJlZWBgIO+8iQor5piv5bC96YeP5o6l6L+R55qEOktBU0FO5qC55o2u5YW25oul 5pyJ55qE5pyJ6ZmQ5L+h5oGv5omT5Y2w5Ye65pyA5Y+v6IO955qE6ZSZ6K+v57G75Z6L44CC6ZSZ 6K+v55qE5a6e6ZmF57G75Z6LCivlj6/og73kvJrmnInmiYDkuI3lkIzjgIIKKwor6YCa55SoS0FT QU7ov5jmiqXlkYrkuKTkuKrovoXliqnosIPnlKjloIbmoIjot5/ouKrjgILov5nkupvloIbmoIjo t5/ouKrmjIflkJHku6PnoIHkuK3kuI7lr7nosaHkuqTkupLkvYbkuI3nm7TmjqUKK+WHuueOsOWc qOmUmeivr+iuv+mXruWghuagiOi3n+i4quS4reeahOS9jee9ruOAguebruWJje+8jOi/meWMheaL rCBjYWxsX3JjdSgpIOWSjOaOkumYn+eahOW3peS9nOmYn+WIl+OAggorCivlkK/liqjlj4LmlbAK K35+fn5+fn5+CisKK0tBU0FO5Y+X6YCa55SoIGBgcGFuaWNfb25fd2FybmBgIOWRveS7pOihjOWP guaVsOeahOW9seWTjeOAguWQr+eUqOivpeWKn+iDveWQju+8jEtBU0FO5Zyo5omT5Y2w6ZSZ6K+v CivmiqXlkYrlkI7kvJrlvJXotbflhoXmoLjmgZDmhYzjgIIKKwor6buY6K6k5oOF5Ya15LiL77yM S0FTQU7lj6rkuLrnrKzkuIDmrKHml6DmlYjlhoXlrZjorr/pl67miZPljbDplJnor6/miqXlkYrj gILkvb/nlKggYGBrYXNhbl9tdWx0aV9zaG90YGAg77yMCitLQVNBTuS8mumSiOWvueavj+S4quaX oOaViOiuv+mXruaJk+WNsOaKpeWRiuOAgui/meacieaViOWcsOemgeeUqOS6hktBU0FO5oql5ZGK 55qEIGBgcGFuaWNfb25fd2FybmBgIOOAggorCivln7rkuo7noazku7bmoIfnrb7nmoRLQVNBTuao oeW8j++8iOivt+WPgumYheS4i+mdouacieWFs+WQhOenjeaooeW8j+eahOmDqOWIhu+8ieaXqOWc qOWcqOeUn+S6p+S4reeUqOS9nOWuieWFqOe8k+inowor5o6q5pa944CC5Zug5q2k77yM5a6D5pSv 5oyB5YWB6K6456aB55SoS0FTQU7miJbmjqfliLblhbblip/og73nmoTlvJXlr7zlj4LmlbDjgIIK KworLSBgYGthc2FuPW9mZmBgIOaIliBgYD1vbmBgIOaOp+WItktBU0FO5piv5ZCm5ZCv55SoICjp u5jorqQ6IGBgb25gYCAp44CCCisKKy0gYGBrYXNhbi5tb2RlPXN5bmNgYCDmiJYgYGA9YXN5bmNg YCDmjqfliLZLQVNBTuaYr+WQpumFjee9ruS4uuWQjOatpeaIluW8guatpeaJp+ihjOaooeW8jyjp u5jorqQ6CisgIGBgc3luY2BgICnjgILlkIzmraXmqKHlvI/vvJrlvZPmoIfnrb7mo4Dmn6XplJno r6/lj5HnlJ/ml7bvvIznq4vljbPmo4DmtYvliLDplJnor6/orr/pl67jgILlvILmraXmqKHlvI/v vJoKKyAg5bu26L+f6ZSZ6K+v6K6/6Zeu5qOA5rWL44CC5b2T5qCH562+5qOA5p+l6ZSZ6K+v5Y+R 55Sf5pe277yM5L+h5oGv5a2Y5YKo5Zyo56Gs5Lu25Lit77yI5ZyoYXJtNjTnmoQKKyAgVEZTUl9F TDHlr4TlrZjlmajkuK3vvInjgILlhoXmoLjkvJrlrprmnJ/mo4Dmn6Xnoazku7bvvIzlubbkuJTk u4XlnKjov5nkupvmo4Dmn6XmnJ/pl7TmiqXlkYrmoIfnrb7plJnor6/jgIIKKworLSBgYGthc2Fu LnN0YWNrdHJhY2U9b2ZmYGAg5oiWIGBgPW9uYGAg56aB55So5oiW5ZCv55SoYWxsb2PlkoxmcmVl 5aCG5qCI6Lef6Liq5pS26ZuGCisgICjpu5jorqQ6IGBgb25gYCAp44CCCisKKy0gYGBrYXNhbi5m YXVsdD1yZXBvcnRgYCDmiJYgYGA9cGFuaWNgYCDmjqfliLbmmK/lj6rmiZPljbBLQVNBTuaKpeWR iui/mOaYr+WQjOaXtuS9v+WGheaguOaBkOaFjAorICAo6buY6K6kOiBgYHJlcG9ydGBgICnjgILl jbPkvb/lkK/nlKjkuoYgYGBrYXNhbl9tdWx0aV9zaG90YGAg77yM5Lmf5Lya5Y+R55Sf5YaF5qC4 5oGQ5oWM44CCCisKK+WunuaWvee7huWImQorLS0tLS0tLS0KKwor6YCa55SoS0FTQU4KK35+fn5+ fn5+fgorCivova/ku7ZLQVNBTuaooeW8j+S9v+eUqOW9seWtkOWGheWtmOadpeiusOW9leavj+S4 quWGheWtmOWtl+iKguaYr+WQpuWPr+S7peWuieWFqOiuv+mXru+8jOW5tuS9v+eUqOe8luivkeaX tuW3peWFtwor5Zyo5q+P5qyh5YaF5a2Y6K6/6Zeu5LmL5YmN5o+S5YWl5b2x5a2Q5YaF5a2Y5qOA 5p+l44CCCisKK+mAmueUqEtBU0FO5bCGMS8455qE5YaF5qC45YaF5a2Y5LiT55So5LqO5YW25b2x 5a2Q5YaF5a2Y77yIMTZUQuS7peimhueblng4Nl82NOS4iueahDEyOFRC77yJ77yM5bm25L2/55So CivlhbfmnInmr5TkvovlkozlgY/np7vph4/nmoTnm7TmjqXmmKDlsITlsIblhoXlrZjlnLDlnYDo vazmjaLkuLrlhbbnm7jlupTnmoTlvbHlrZDlnLDlnYDjgIIKKwor6L+Z5piv5bCG5Zyw5Z2A6L2s 5o2i5Li65YW255u45bqU5b2x5a2Q5Zyw5Z2A55qE5Ye95pWwOjoKKworICAgIHN0YXRpYyBpbmxp bmUgdm9pZCAqa2FzYW5fbWVtX3RvX3NoYWRvdyhjb25zdCB2b2lkICphZGRyKQorICAgIHsKKwly ZXR1cm4gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpYWRkciA+PiBLQVNBTl9TSEFET1dfU0NBTEVf U0hJRlQpCisJCSsgS0FTQU5fU0hBRE9XX09GRlNFVDsKKyAgICB9CisKK+WcqOi/memHjCBgYEtB U0FOX1NIQURPV19TQ0FMRV9TSElGVCA9IDNgYCDjgIIKKwor57yW6K+R5pe25bel5YW355So5LqO 5o+S5YWl5YaF5a2Y6K6/6Zeu5qOA5p+l44CC57yW6K+R5Zmo5Zyo5q+P5qyh6K6/6Zeu5aSn5bCP 5Li6MeOAgTLjgIE044CBOOaIljE255qE5YaF5a2Y5LmL5YmNCivmj5LlhaXlh73mlbDosIPnlKgo IGBgX19hc2FuX2xvYWQqKGFkZHIpYGAgLCBgYF9fYXNhbl9zdG9yZSooYWRkcilgYCnjgILov5nk upvlh73mlbDpgJrov4cKK+ajgOafpeebuOW6lOeahOW9seWtkOWGheWtmOadpeajgOafpeWGheWt mOiuv+mXruaYr+WQpuacieaViOOAggorCivkvb/nlKhpbmxpbmXmj5LmoanvvIznvJbor5Hlmajk uI3ov5vooYzlh73mlbDosIPnlKjvvIzogIzmmK/nm7TmjqXmj5LlhaXku6PnoIHmnaXmo4Dmn6Xl vbHlrZDlhoXlrZjjgILmraTpgInpobkKK+aYvuiRl+WcsOWinuWkp+S6huWGheaguOS9k+enr++8 jOS9huS4jm91dGxpbmXmj5LmoanlhoXmoLjnm7jmr5TvvIzlroPmj5DkvpvkuoZ4MS4xLXgy55qE 5oCn6IO95o+Q5Y2H44CCCisKK+mAmueUqEtBU0FO5piv5ZSv5LiA5LiA56eN6YCa6L+H6ZqU56a7 5bu26L+f6YeN5paw5L2/55So5bey6YeK5pS+5a+56LGh55qE5qih5byPCivvvIjlj4Lop4EgbW0v a2FzYW4vcXVhcmFudGluZS5jIOS7peS6huino+WunueOsO+8ieOAggorCivln7rkuo7ova/ku7bm oIfnrb7nmoRLQVNBTuaooeW8jworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKwor5Z+65LqO6L2v 5Lu25qCH562+55qES0FTQU7kvb/nlKjova/ku7blhoXlrZjmoIfnrb7mlrnms5XmnaXmo4Dmn6Xo rr/pl67mnInmlYjmgKfjgILnm67liY3ku4Xpkojlr7lhcm02NOaetuaehOWunueOsOOAggorCivl n7rkuo7ova/ku7bmoIfnrb7nmoRLQVNBTuS9v+eUqGFybTY0IENQVeeahOmhtumDqOWtl+iKguW/ veeVpShUQkkp54m55oCn5Zyo5YaF5qC45oyH6ZKI55qE6aG26YOo5a2X6IqC5LitCivlrZjlgqjk uIDkuKrmjIfpkojmoIfnrb7jgILlroPkvb/nlKjlvbHlrZDlhoXlrZjmnaXlrZjlgqjkuI7mr4/k uKoxNuWtl+iKguWGheWtmOWNleWFg+ebuOWFs+eahOWGheWtmOagh+etvijlm6DmraTvvIwKK+Wu g+WwhuWGheaguOWGheWtmOeahDEvMTbkuJPnlKjkuo7lvbHlrZDlhoXlrZgp44CCCisKK+WcqOav j+asoeWGheWtmOWIhumFjeaXtu+8jOWfuuS6jui9r+S7tuagh+etvueahEtBU0FO6YO95Lya55Sf 5oiQ5LiA5Liq6ZqP5py65qCH562+77yM55So6L+Z5Liq5qCH562+5qCH6K6w5YiG6YWNCivnmoTl hoXlrZjvvIzlubblsIbnm7jlkIznmoTmoIfnrb7ltYzlhaXliLDov5Tlm57nmoTmjIfpkojkuK3j gIIKKwor5Z+65LqO6L2v5Lu25qCH562+55qES0FTQU7kvb/nlKjnvJbor5Hml7blt6XlhbflnKjm r4/mrKHlhoXlrZjorr/pl67kuYvliY3mj5LlhaXmo4Dmn6XjgILov5nkupvmo4Dmn6Xnoa7kv53m raPlnKgKK+iuv+mXrueahOWGheWtmOeahOagh+etvuetieS6jueUqOS6juiuv+mXruivpeWGheWt mOeahOaMh+mSiOeahOagh+etvuOAguWmguaenOagh+etvuS4jeWMuemFje+8jOWfuuS6jui9r+S7 tuagh+etvgor55qES0FTQU7kvJrmiZPljbDplJnor6/miqXlkYrjgIIKKwor5Z+65LqO6L2v5Lu2 5qCH562+55qES0FTQU7kuZ/mnInkuKTnp43mj5LmoanmqKHlvI/vvIhvdXRsaW5l77yM5Y+R5Ye6 5Zue6LCD5p2l5qOA5p+l5YaF5a2Y6K6/6Zeu77ybaW5saW5l77yMCivmiafooYzlhoXogZTnmoTl vbHlrZDlhoXlrZjmo4Dmn6XvvInjgILkvb/nlKhvdXRsaW5l5o+S5qGp5qih5byP77yM5Lya5LuO 5omn6KGM6K6/6Zeu5qOA5p+l55qE5Ye95pWw5omT5Y2w6ZSZ6K+vCivmiqXlkYrjgILkvb/nlKhp bmxpbmXmj5LmoanvvIznvJbor5HlmajkvJrlj5Hlh7ogYGBicmtgYCDmjIfku6TvvIzlubbkvb/n lKjkuJPnlKjnmoQgYGBicmtgYCDlpITnkIbnqIvluo8KK+adpeaJk+WNsOmUmeivr+aKpeWRiuOA ggorCivln7rkuo7ova/ku7bmoIfnrb7nmoRLQVNBTuS9v+eUqDB4RkbkvZzkuLrljLnphY3miYDm nInmjIfpkojmoIfnrb7vvIjkuI3mo4Dmn6XpgJrov4fluKbmnIkweEZG5oyH6ZKI5qCH562+Civn moTmjIfpkojov5vooYznmoTorr/pl67vvInjgILlgLwweEZF5b2T5YmN5L+d55WZ55So5LqO5qCH 6K6w5bey6YeK5pS+55qE5YaF5a2Y5Yy65Z+f44CCCisKK+WfuuS6jui9r+S7tuagh+etvueahEtB U0FO55uu5YmN5LuF5pSv5oyB5a+5U2xhYuWSjHBhZ2VfYWxsb2PlhoXlrZjov5vooYzmoIforrDj gIIKKwor5Z+65LqO56Gs5Lu25qCH562+55qES0FTQU7mqKHlvI8KK35+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+CisKK+WfuuS6juehrOS7tuagh+etvueahEtBU0FO5Zyo5qaC5b+15LiK57G75Ly85LqO 6L2v5Lu25qih5byP77yM5L2G5a6D5piv5L2/55So56Gs5Lu25YaF5a2Y5qCH562+5L2c5Li65pSv 5oyB6ICMCivkuI3mmK/nvJbor5Hlmajmj5LmoanlkozlvbHlrZDlhoXlrZjjgIIKKwor5Z+65LqO 56Gs5Lu25qCH562+55qES0FTQU7nm67liY3ku4Xpkojlr7lhcm02NOaetuaehOWunueOsO+8jOW5 tuS4lOWfuuS6jkFSTXY4LjXmjIfku6Tpm4bmnrbmnoTkuK3lvJXlhaUKK+eahGFybTY05YaF5a2Y 5qCH6K6w5omp5bGVKE1URSnlkozmnIDpq5jlrZfoioLlv73nlaUoVEJJKeOAggorCivnibnmrorn moRhcm02NOaMh+S7pOeUqOS6juS4uuavj+asoeWGheWtmOWIhumFjeaMh+WumuWGheWtmOagh+et vuOAguebuOWQjOeahOagh+etvuiiq+aMh+Wumue7meaMh+WQkei/meS6m+WIhumFjQor55qE5oyH 6ZKI44CC5Zyo5q+P5qyh5YaF5a2Y6K6/6Zeu5pe277yM56Gs5Lu256Gu5L+d5q2j5Zyo6K6/6Zeu 55qE5YaF5a2Y55qE5qCH562+562J5LqO55So5LqO6K6/6Zeu6K+l5YaF5a2Y55qE5oyH6ZKICivn moTmoIfnrb7jgILlpoLmnpzmoIfnrb7kuI3ljLnphY3vvIzliJnkvJrnlJ/miJDmlYXpmpzlubbm iZPljbDmiqXlkYrjgIIKKwor5Z+65LqO56Gs5Lu25qCH562+55qES0FTQU7kvb/nlKgweEZG5L2c 5Li65Yy56YWN5omA5pyJ5oyH6ZKI5qCH562+77yI5LiN5qOA5p+l6YCa6L+H5bim5pyJMHhGRuaM h+mSiOagh+etvueahAor5oyH6ZKI6L+b6KGM55qE6K6/6Zeu77yJ44CC5YC8MHhGReW9k+WJjeS/ neeVmeeUqOS6juagh+iusOW3sumHiuaUvueahOWGheWtmOWMuuWfn+OAggorCivln7rkuo7noazk u7bmoIfnrb7nmoRLQVNBTuebruWJjeS7heaUr+aMgeWvuVNsYWLlkoxwYWdlX2FsbG9j5YaF5a2Y 6L+b6KGM5qCH6K6w44CCCisKK+WmguaenOehrOS7tuS4jeaUr+aMgU1URe+8iEFSTXY4LjXkuYvl iY3vvInvvIzliJnkuI3kvJrlkK/nlKjln7rkuo7noazku7bmoIfnrb7nmoRLQVNBTuOAguWcqOi/ meenjeaDheWGteS4i++8jAor5omA5pyJS0FTQU7lvJXlr7zlj4LmlbDpg73lsIbooqvlv73nlaXj gIIKKwor6K+35rOo5oSP77yM5ZCv55SoQ09ORklHX0tBU0FOX0hXX1RBR1Plp4vnu4jkvJrlr7zo h7TlkK/nlKjlhoXmoLjkuK3nmoRUQknjgILljbPkvb/mj5DkvpvkuoYKK2Bga2FzYW4ubW9kZT1v ZmZgYCDmiJbnoazku7bkuI3mlK/mjIFNVEXvvIjkvYbmlK/mjIFUQknvvInjgIIKKwor5Z+65LqO 56Gs5Lu25qCH562+55qES0FTQU7lj6rmiqXlkYrnrKzkuIDkuKrlj5HnjrDnmoTplJnor6/jgILk uYvlkI7vvIxNVEXmoIfnrb7mo4Dmn6XlsIbooqvnpoHnlKjjgIIKKwor5b2x5a2Q5YaF5a2YCist LS0tLS0tLQorCivlhoXmoLjlsIblhoXlrZjmmKDlsITliLDlnLDlnYDnqbrpl7TnmoTlh6DkuKrk uI3lkIzpg6jliIbjgILlhoXmoLjomZrmi5/lnLDlnYDnmoTojIPlm7TlvojlpKfvvJrmsqHmnIno trPlpJ/nmoTnnJ/lrp4KK+WGheWtmOadpeaUr+aMgeWGheaguOWPr+S7peiuv+mXrueahOavj+S4 quWcsOWdgOeahOecn+WunuW9seWtkOWMuuWfn+OAguWboOatpO+8jEtBU0FO5Y+q5Li65Zyw5Z2A 56m66Ze055qE5p+Q5LqbCivpg6jliIbmmKDlsITnnJ/lrp7nmoTlvbHlrZDjgIIKKwor6buY6K6k 6KGM5Li6Cit+fn5+fn5+fgorCivpu5jorqTmg4XlhrXkuIvvvIzkvZPns7vnu5PmnoTku4XlsIbl rp7pmYXlhoXlrZjmmKDlsITliLDnlKjkuo7nur/mgKfmmKDlsITnmoTpmLTlvbHljLrln5/vvIjk u6Xlj4rlj6/og73nmoTlhbbku5YKK+Wwj+WMuuWfn++8ieOAguWvueS6juaJgOacieWFtuS7luWM uuWfnyDigJTigJQg5L6L5aaCdm1hbGxvY+WSjHZtZW1tYXDnqbrpl7Qg4oCU4oCUIOS4gOS4quWP quivu+mhtemdouiiq+aYoOWwhAor5Yiw6Zi05b2x5Yy65Z+f5LiK44CC6L+Z5Liq5Y+q6K+755qE 5b2x5a2Q6aG16Z2i5aOw5piO5omA5pyJ5YaF5a2Y6K6/6Zeu6YO95piv5YWB6K6455qE44CCCisK K+i/mee7meaooeWdl+W4puadpeS6huS4gOS4qumXrumimO+8muWug+S7rOS4jeWtmOWcqOS6jue6 v+aAp+aYoOWwhOS4re+8jOiAjOaYr+WtmOWcqOS6juS4k+eUqOeahOaooeWdl+epuumXtOS4reOA ggor6YCa6L+H6L+e5o6l5qih5Z2X5YiG6YWN5Zmo77yMS0FTQU7kuLTml7bmmKDlsITnnJ/lrp7n moTlvbHlrZDlhoXlrZjku6Xopobnm5blroPku6zjgILkvovlpoLvvIzov5nlhYHorrjmo4DmtYsK K+WvueaooeWdl+WFqOWxgOWPmOmHj+eahOaXoOaViOiuv+mXruOAggorCivov5nkuZ/pgKDmiJDk uobkuI4gYGBWTUFQX1NUQUNLYGAg55qE5LiN5YW85a6577ya5aaC5p6c5aCG5qCI5L2N5LqOdm1h bGxvY+epuumXtOS4re+8jOWug+Wwhuiiq+WIhumFjQor5Y+q6K+76aG16Z2i55qE5b2x5a2Q5YaF 5a2Y77yM5bm25LiU5YaF5qC45Zyo5bCd6K+V5Li65aCG5qCI5Y+Y6YeP6K6+572u5b2x5a2Q5pWw 5o2u5pe25Lya5Ye66ZSZ44CCCisKK0NPTkZJR19LQVNBTl9WTUFMTE9DCit+fn5+fn5+fn5+fn5+ fn5+fn5+fgorCivkvb/nlKggYGBDT05GSUdfS0FTQU5fVk1BTExPQ2BgIO+8jEtBU0FO5Y+v5Lul 5Lul5pu05aSn55qE5YaF5a2Y5L2/55So5Li65Luj5Lu36KaG55uWdm1hbGxvYwor56m66Ze044CC 55uu5YmN77yM6L+Z5ZyoeDg244CBcmlzY3bjgIFzMzkw5ZKMcG93ZXJwY+S4iuWPl+aUr+aMgeOA ggorCivov5npgJrov4fov57mjqXliLB2bWFsbG9j5ZKMdm1hcOW5tuWKqOaAgeWIhumFjeecn+Wu nueahOW9seWtkOWGheWtmOadpeaUr+aMgeaYoOWwhOOAggorCit2bWFsbG9j56m66Ze05Lit55qE 5aSn5aSa5pWw5pig5bCE6YO95b6I5bCP77yM6ZyA6KaB5LiN5Yiw5LiA5pW06aG155qE6Zi05b2x 56m66Ze044CC5Zug5q2k77yM5Li65q+P5Liq5pig5bCECivliIbphY3kuIDkuKrlrozmlbTnmoTl vbHlrZDpobXpnaLlsIbmmK/kuIDnp43mtarotLnjgILmraTlpJbvvIzkuLrkuobnoa7kv53kuI3l kIznmoTmmKDlsITkvb/nlKjkuI3lkIznmoTlvbHlrZAKK+mhtemdou+8jOaYoOWwhOW/hemhu+S4 jiBgYEtBU0FOX0dSQU5VTEVfU0laRSAqIFBBR0VfU0laRWBgIOWvuem9kOOAggorCivnm7jlj43v vIxLQVNBTui3qOWkmuS4quaYoOWwhOWFseS6q+WQjuWkh+epuumXtOOAguW9k3ZtYWxsb2Pnqbrp l7TkuK3nmoTmmKDlsITkvb/nlKjlvbHlrZDljLrln5/nmoTnibnlrpoKK+mhtemdouaXtu+8jOWu g+S8muWIhumFjeS4gOS4quWQjuWkh+mhtemdouOAguatpOmhtemdoueojeWQjuWPr+S7peeUseWF tuS7lnZtYWxsb2PmmKDlsITlhbHkuqvjgIIKKworS0FTQU7ov57mjqXliLB2bWFw5Z+656GA5p62 5p6E5Lul5oeS5riF55CG5pyq5L2/55So55qE5b2x5a2Q5YaF5a2Y44CCCisKK+S4uuS6humBv+WF jeS6pOaNouaYoOWwhOeahOWbsOmavu+8jEtBU0FO6aKE5rWL6KaG55uWdm1hbGxvY+epuumXtOea hOmYtOW9seWMuuWfn+mDqOWIhuWwhuS4jeS8muiiq+aXqeacnwor55qE6Zi05b2x6aG16Z2i6KaG 55uW77yM5L2G5piv5bCG5LiN5Lya6KKr5pig5bCE44CC6L+Z5bCG6ZyA6KaB5pu05pS554m55a6a 5LqOYXJjaOeahOS7o+eggeOAggorCivov5nlhYHorrjlnKh4ODbkuIrmlK/mjIEgYGBWTUFQX1NU QUNLYGAg77yM5bm25LiU5Y+v5Lul566A5YyW5a+55rKh5pyJ5Zu65a6a5qih5Z2X5Yy65Z+f55qE 5p625p6E55qE5pSv5oyB44CCCisKK+WvueS6juW8gOWPkeiAhQorLS0tLS0tLS0tLQorCivlv73n laXorr/pl64KK35+fn5+fn5+CisKK+i9r+S7tktBU0FO5qih5byP5L2/55So57yW6K+R5Zmo5o+S 5qGp5p2l5o+S5YWl5pyJ5pWI5oCn5qOA5p+l44CC5q2k57G75qOA5rWL5Y+v6IO95LiO5YaF5qC4 55qE5p+Q5Lqb6YOo5YiGCivkuI3lhbzlrrnvvIzlm6DmraTpnIDopoHnpoHnlKjjgIIKKwor5YaF 5qC455qE5YW25LuW6YOo5YiG5Y+v6IO95Lya6K6/6Zeu5bey5YiG6YWN5a+56LGh55qE5YWD5pWw 5o2u44CC6YCa5bi477yMS0FTQU7kvJrmo4DmtYvlubbmiqXlkYrmraTnsbvorr/pl67vvIwKK+S9 huWcqOafkOS6m+aDheWGteS4i++8iOS+i+Wmgu+8jOWcqOWGheWtmOWIhumFjeWZqOS4re+8ie+8 jOi/meS6m+iuv+mXruaYr+acieaViOeahOOAggorCivlr7nkuo7ova/ku7ZLQVNBTuaooeW8j++8 jOimgeemgeeUqOeJueWumuaWh+S7tuaIluebruW9leeahOajgOa1i++8jOivt+WwhiBgYEtBU0FO X1NBTklUSVpFYGAg5re75YqgCivliLDnm7jlupTnmoTlhoXmoLhNYWtlZmlsZeS4rToKKworLSDl r7nkuo7ljZXkuKrmlofku7Yo5L6L5aaC77yMbWFpbi5vKTo6CisKKyAgICBLQVNBTl9TQU5JVEla RV9tYWluLm8gOj0gbgorCistIOWvueS6juS4gOS4quebruW9leS4i+eahOaJgOacieaWh+S7tjo6 CisKKyAgICBLQVNBTl9TQU5JVElaRSA6PSBuCisKK+WvueS6jui9r+S7tktBU0FO5qih5byP77yM 6KaB5Zyo5q+P5Liq5Ye95pWw55qE5Z+656GA5LiK56aB55So5qOA5rWL77yM6K+35L2/55SoS0FT QU7nibnlrprnmoQKK2BgX19ub19zYW5pdGl6ZV9hZGRyZXNzYGAg5Ye95pWw5bGe5oCn5oiW6YCa 55So55qEIGBgbm9pbnN0cmBgIOOAggorCivor7fms6jmhI/vvIznpoHnlKjnvJbor5Hlmajmj5Lm oanvvIjln7rkuo7mr4/kuKrmlofku7bmiJbmr4/kuKrlh73mlbDvvInkvJrkvb9LQVNBTuW/veeV peWcqOi9r+S7tktBU0FO5qih5byPCivnmoTku6PnoIHkuK3nm7TmjqXlj5HnlJ/nmoTorr/pl67j gILlvZPorr/pl67mmK/pl7TmjqXlj5HnlJ/nmoTvvIjpgJrov4fosIPnlKjmo4DmtYvlh73mlbDv vInmiJbkvb/nlKjmsqHmnInnvJbor5HlmagKK+aPkuahqeeahOWfuuS6juehrOS7tuagh+etvuea hOaooeW8j+aXtu+8jOWug+ayoeacieW4ruWKqeOAggorCivlr7nkuo7ova/ku7ZLQVNBTuaooeW8 j++8jOimgeWcqOW9k+WJjeS7u+WKoeeahOS4gOmDqOWIhuWGheaguOS7o+eggeS4reemgeeUqEtB U0FO5oql5ZGK77yM6K+35L2/55SoCitgYGthc2FuX2Rpc2FibGVfY3VycmVudCgpYGAvYGBrYXNh bl9lbmFibGVfY3VycmVudCgpYGAg6YOo5YiG5rOo6YeK6L+Z6YOo5YiG5Luj56CB44CCCivov5nk uZ/kvJrnpoHnlKjpgJrov4flh73mlbDosIPnlKjlj5HnlJ/nmoTpl7TmjqXorr/pl67nmoTmiqXl kYrjgIIKKwor5a+55LqO5Z+65LqO5qCH562+55qES0FTQU7mqKHlvI/vvIjljIXmi6znoazku7bm qKHlvI/vvInvvIzopoHnpoHnlKjorr/pl67mo4Dmn6XvvIzor7fkvb/nlKgKK2Bga2FzYW5fcmVz ZXRfdGFnKClgYCDmiJYgYGBwYWdlX2thc2FuX3RhZ19yZXNldCgpYGAg44CC6K+35rOo5oSP77yM 6YCa6L+HCitgYHBhZ2Vfa2FzYW5fdGFnX3Jlc2V0KClgYCDkuLTml7bnpoHnlKjorr/pl67mo4Dm n6XpnIDopoHpgJrov4cgYGBwYWdlX2thc2FuX3RhZ2BgCisvIGBgcGFnZV9rYXNhbl90YWdfc2V0 YGAg5L+d5a2Y5ZKM5oGi5aSN5q+P6aG1S0FTQU7moIfnrb7jgIIKKwor5rWL6K+VCit+fn5+CisK K+acieS4gOS6m0tBU0FO5rWL6K+V5Y+v5Lul6aqM6K+BS0FTQU7mmK/lkKbmraPluLjlt6XkvZzl ubblj6/ku6Xmo4DmtYvmn5DkupvnsbvlnovnmoTlhoXlrZjmjZ/lnY/jgIIKK+a1i+ivleeUseS4 pOmDqOWIhue7hOaIkDoKKworMS4g5LiOS1VuaXTmtYvor5XmoYbmnrbpm4bmiJDnmoTmtYvor5Xj gILkvb/nlKggYGBDT05GSUdfS0FTQU5fS1VOSVRfVEVTVGBgIOWQr+eUqOOAggor6L+Z5Lqb5rWL 6K+V5Y+v5Lul6YCa6L+H5Yeg56eN5LiN5ZCM55qE5pa55byP6Ieq5Yqo6L+Q6KGM5ZKM6YOo5YiG 6aqM6K+B77yb6K+35Y+C6ZiF5LiL6Z2i55qE6K+05piO44CCCisKKzIuIOS4jktVbml05LiN5YW8 5a6555qE5rWL6K+V44CC5L2/55SoIGBgQ09ORklHX0tBU0FOX01PRFVMRV9URVNUYGAg5ZCv55So 5bm25LiU5Y+q6IO95L2c5Li65qih5Z2XCivov5DooYzjgILov5nkupvmtYvor5Xlj6rog73pgJro v4fliqDovb3lhoXmoLjmqKHlnZflubbmo4Dmn6XlhoXmoLjml6Xlv5fku6Xojrflj5ZLQVNBTuaK peWRiuadpeaJi+WKqOmqjOivgeOAggorCivlpoLmnpzmo4DmtYvliLDplJnor6/vvIzmr4/kuKpL VW5pdOWFvOWuueeahEtBU0FO5rWL6K+V6YO95Lya5omT5Y2w5aSa5LiqS0FTQU7miqXlkYrkuYvk uIDvvIznhLblkI7mtYvor5XmiZPljbAKK+WFtue8luWPt+WSjOeKtuaAgeOAggorCivlvZPmtYvo r5XpgJrov4c6OgorCisgICAgICAgIG9rIDI4IC0ga21hbGxvY19kb3VibGVfa3pmcmVlCisKK+W9 k+eUseS6jiBgYGttYWxsb2NgYCDlpLHotKXogIzlr7zoh7TmtYvor5XlpLHotKXml7Y6OgorCisg ICAgICAgICMga21hbGxvY19sYXJnZV9vb2JfcmlnaHQ6IEFTU0VSVElPTiBGQUlMRUQgYXQgbGli L3Rlc3Rfa2FzYW4uYzoxNjMKKyAgICAgICAgRXhwZWN0ZWQgcHRyIGlzIG5vdCBudWxsLCBidXQg aXMKKyAgICAgICAgbm90IG9rIDQgLSBrbWFsbG9jX2xhcmdlX29vYl9yaWdodAorCivlvZPnlLHk uo7nvLrlsJFLQVNBTuaKpeWRiuiAjOWvvOiHtOa1i+ivleWksei0peaXtjo6CisKKyAgICAgICAg IyBrbWFsbG9jX2RvdWJsZV9remZyZWU6IEVYUEVDVEFUSU9OIEZBSUxFRCBhdCBsaWIvdGVzdF9r YXNhbi5jOjYyOQorICAgICAgICBFeHBlY3RlZCBrYXNhbl9kYXRhLT5yZXBvcnRfZXhwZWN0ZWQg PT0ga2FzYW5fZGF0YS0+cmVwb3J0X2ZvdW5kLCBidXQKKyAgICAgICAga2FzYW5fZGF0YS0+cmVw b3J0X2V4cGVjdGVkID09IDEKKyAgICAgICAga2FzYW5fZGF0YS0+cmVwb3J0X2ZvdW5kID09IDAK KyAgICAgICAgbm90IG9rIDI4IC0ga21hbGxvY19kb3VibGVfa3pmcmVlCisKK+acgOWQjuaJk+WN sOaJgOaciUtBU0FO5rWL6K+V55qE57Sv56ev54q25oCB44CC5oiQ5YqfOjoKKworICAgICAgICBv ayAxIC0ga2FzYW4KKwor5oiW6ICF77yM5aaC5p6c5YW25Lit5LiA6aG55rWL6K+V5aSx6LSlOjoK KworICAgICAgICBub3Qgb2sgMSAtIGthc2FuCisKK+acieWHoOenjeaWueazleWPr+S7pei/kOih jOS4jktVbml05YW85a6555qES0FTQU7mtYvor5XjgIIKKworMS4g5Y+v5Yqg6L295qih5Z2XCisK KyAgIOWQr+eUqCBgYENPTkZJR19LVU5JVGBgIOWQju+8jEtBU0FOLUtVbml05rWL6K+V5Y+v5Lul 5p6E5bu65Li65Y+v5Yqg6L295qih5Z2X77yM5bm26YCa6L+H5L2/55SoCisgICBgYGluc21vZGBg IOaIliBgYG1vZHByb2JlYGAg5Yqg6L29IGBgdGVzdF9rYXNhbi5rb2BgIOadpei/kOihjOOAggor CisyLiDlhoXnva4KKworICAg6YCa6L+H5YaF572uIGBgQ09ORklHX0tVTklUYGAg77yM5Lmf5Y+v 5Lul5YaF572uS0FTQU4tS1VuaXTmtYvor5XjgILlnKjov5nnp43mg4XlhrXkuIvvvIwKKyAgIOa1 i+ivleWwhuWcqOWQr+WKqOaXtuS9nOS4uuWQjuacn+WIneWni+WMluiwg+eUqOi/kOihjOOAggor CiszLiDkvb/nlKhrdW5pdF90b29sCisKKyAgIOmAmui/h+WGhee9riBgYENPTkZJR19LVU5JVGBg IOWSjCBgYENPTkZJR19LQVNBTl9LVU5JVF9URVNUYGAg77yM6L+Y5Y+v5Lul5L2/55SoCisgICBg YGt1bml0X3Rvb2xgYCDku6Xmm7TmmJPor7vnmoTmlrnlvI/mn6XnnItLVW5pdOa1i+ivlee7k+ae nOOAgui/meS4jeS8muaJk+WNsOmAmui/h+a1i+ivlQorICAg55qES0FTQU7miqXlkYrjgILmnInl hbMgYGBrdW5pdF90b29sYGAg5pu05aSa5pyA5paw5L+h5oGv77yM6K+35Y+C6ZiFCisgICBgS1Vu aXTmlofmoaMgPGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL2h0bWwvbGF0ZXN0L2Rldi10b29s cy9rdW5pdC9pbmRleC5odG1sPmBfIOOAggorCisuLiBfS1VuaXQ6IGh0dHBzOi8vd3d3Lmtlcm5l bC5vcmcvZG9jL2h0bWwvbGF0ZXN0L2Rldi10b29scy9rdW5pdC9pbmRleC5odG1sCi0tIAoyLjMw LjIKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51 eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRw Oi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg==