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 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 654A6C433EF for ; Sun, 26 Jun 2022 09:12:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234325AbiFZJMG (ORCPT ); Sun, 26 Jun 2022 05:12:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46262 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234159AbiFZJLQ (ORCPT ); Sun, 26 Jun 2022 05:11:16 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 78E7412AA6; Sun, 26 Jun 2022 02:11:14 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id E410EB80D35; Sun, 26 Jun 2022 09:11:12 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D9249C341D1; Sun, 26 Jun 2022 09:11:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1656234671; bh=tckixiBJ1nvT113nNubWzj7Vwk5u4aCs7z08EClBjQ4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=u3VwKWMt28kuGociqyLRd4sQq1xwnwQpNP9c6H6LWTELMZwnzc1LGkMt3AIWNegHq av8vIdb7Xsq8wT041E9fnsUTQmuSTiManUWPDJajRrQYdzFCsY5CzE88zE2ewY+W43 Ef/FtQQXF68TYxvVrLhLtbc8DNwOYBiVS4xW8EOwAZnCN7AzTQhtbz8O6zZyElKXJ1 gHiC8k0+KRgVQtafeA7Gf+54L/z2QUdubDqyi7gzO1K3dQ9q4KFVBpgS0rNuvC081D aOID9d7L2YyF2Osc5b3eAZA+Uc0n+0EMw81wzGmlqSD3LkbPI542oskyPri8je2dWy AGD26Fu3t10wA== Received: from mchehab by mail.kernel.org with local (Exim 4.95) (envelope-from ) id 1o5OIN-001coM-TW; Sun, 26 Jun 2022 10:11:07 +0100 From: Mauro Carvalho Chehab To: Linux Doc Mailing List Cc: Mauro Carvalho Chehab , "Jonathan Corbet" , "Mauro Carvalho Chehab" , Albert Ou , Alex Shi , Anup Patel , Atish Patra , Palmer Dabbelt , Paul Walmsley , Yanteng Si , linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org Subject: [PATCH v2 04/20] docs: zh_CN/riscv/pmu.rst: remove old docuementation Date: Sun, 26 Jun 2022 10:10:50 +0100 Message-Id: <1222dc234722e8c6f2a1fd0e5c875149bbf4f538.1656234456.git.mchehab@kernel.org> X-Mailer: git-send-email 2.36.1 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org As the original doc was removed, it doesn't make sense to keep its translation. Fixes: 23b1f18326ec ("Documentation: riscv: Remove the old documentation") Signed-off-by: Mauro Carvalho Chehab --- To avoid mailbombing on a large number of people, only mailing lists were C/C on the cover. See [PATCH v2 00/20] at: https://lore.kernel.org/all/cover.1656234456.git.mchehab@kernel.org/ .../translations/zh_CN/riscv/index.rst | 1 - .../translations/zh_CN/riscv/pmu.rst | 235 ------------------ 2 files changed, 236 deletions(-) delete mode 100644 Documentation/translations/zh_CN/riscv/pmu.rst diff --git a/Documentation/translations/zh_CN/riscv/index.rst b/Documentation/translations/zh_CN/riscv/index.rst index 614cde0c0997..131e405aa857 100644 --- a/Documentation/translations/zh_CN/riscv/index.rst +++ b/Documentation/translations/zh_CN/riscv/index.rst @@ -19,7 +19,6 @@ RISC-V 体系结构 boot-image-header vm-layout - pmu patch-acceptance diff --git a/Documentation/translations/zh_CN/riscv/pmu.rst b/Documentation/translations/zh_CN/riscv/pmu.rst deleted file mode 100644 index 7ec801026c4d..000000000000 --- a/Documentation/translations/zh_CN/riscv/pmu.rst +++ /dev/null @@ -1,235 +0,0 @@ -.. include:: ../disclaimer-zh_CN.rst - -:Original: Documentation/riscv/pmu.rst - -:翻译: - - 司延腾 Yanteng Si - -.. _cn_riscv_pmu: - -======================== -RISC-V平台上对PMUs的支持 -======================== - -Alan Kao , Mar 2018 - -简介 ------------- - -截止本文撰写时,在The RISC-V ISA Privileged Version 1.10中提到的 perf_event -相关特性如下: -(详情请查阅手册) - -* [m|s]counteren -* mcycle[h], cycle[h] -* minstret[h], instret[h] -* mhpeventx, mhpcounterx[h] - -仅有以上这些功能,移植perf需要做很多工作,究其原因是缺少以下通用架构的性能 -监测特性: - -* 启用/停用计数器 - 在我们这里,计数器一直在自由运行。 -* 计数器溢出引起的中断 - 规范中没有这种功能。 -* 中断指示器 - 不可能所有的计数器都有很多的中断端口,所以需要一个中断指示器让软件来判断 - 哪个计数器刚好溢出。 -* 写入计数器 - 由于内核不能修改计数器,所以会有一个SBI来支持这个功能[1]。 另外,一些厂商 - 考虑实现M-S-U型号机器的硬件扩展来直接写入计数器。 - -这篇文档旨在为开发者提供一个在内核中支持PMU的简要指南。下面的章节简要解释了 -perf' 机制和待办事项。 - -你可以在这里查看以前的讨论[1][2]。 另外,查看附录中的相关内核结构体可能会有 -帮助。 - - -1. 初始化 ---------- - -*riscv_pmu* 是一个类型为 *struct riscv_pmu* 的全局指针,它包含了根据perf内部 -约定的各种方法和PMU-specific参数。人们应该声明这样的实例来代表PMU。 默认情况 -下, *riscv_pmu* 指向一个常量结构体 *riscv_base_pmu* ,它对基准QEMU模型有非常 -基础的支持。 - - -然后他/她可以将实例的指针分配给 *riscv_pmu* ,这样就可以利用已经实现的最小逻 -辑,或者创建他/她自己的 *riscv_init_platform_pmu* 实现。 - -换句话说,现有的 *riscv_base_pmu* 源只是提供了一个参考实现。 开发者可以灵活地 -决定多少部分可用,在最极端的情况下,他们可以根据自己的需要定制每一个函数。 - - -2. Event Initialization ------------------------ - -当用户启动perf命令来监控一些事件时,首先会被用户空间的perf工具解释为多个 -*perf_event_open* 系统调用,然后进一步调用上一步分配的 *event_init* 成员函数 -的主体。 在 *riscv_base_pmu* 的情况下,就是 *riscv_event_init* 。 - -该功能的主要目的是将用户提供的事件翻译成映射图,从而可以直接对HW-related的控 -制寄存器或计数器进行操作。该翻译基于 *riscv_pmu* 中提供的映射和方法。 - -注意,有些功能也可以在这个阶段完成: - -(1) 中断设置,这个在下一节说; -(2) 特限级设置(仅用户空间、仅内核空间、两者都有); -(3) 析构函数设置。 通常应用 *riscv_destroy_event* 即可; -(4) 对非采样事件的调整,这将被函数应用,如 *perf_adjust_period* ,通常如下:: - - if (!is_sampling_event(event)) { - hwc->sample_period = x86_pmu.max_period; - hwc->last_period = hwc->sample_period; - local64_set(&hwc->period_left, hwc->sample_period); - } - - -在 *riscv_base_pmu* 的情况下,目前只提供了(3)。 - - -3. 中断 -------- - -3.1. 中断初始化 - -这种情况经常出现在 *event_init* 方案的开头。通常情况下,这应该是一个代码段,如:: - - int x86_reserve_hardware(void) - { - int err = 0; - - if (!atomic_inc_not_zero(&pmc_refcount)) { - mutex_lock(&pmc_reserve_mutex); - if (atomic_read(&pmc_refcount) == 0) { - if (!reserve_pmc_hardware()) - err = -EBUSY; - else - reserve_ds_buffers(); - } - if (!err) - atomic_inc(&pmc_refcount); - mutex_unlock(&pmc_reserve_mutex); - } - - return err; - } - -而神奇的是 *reserve_pmc_hardware* ,它通常做原子操作,使实现的IRQ可以从某个全局函 -数指针访问。 而 *release_pmc_hardware* 的作用正好相反,它用在上一节提到的事件分配 -器中。 - - (注:从所有架构的实现来看,*reserve/release* 对总是IRQ设置,所以 *pmc_hardware* - 似乎有些误导。 它并不处理事件和物理计数器之间的绑定,这一点将在下一节介绍。) - -3.2. IRQ结构体 - -基本上,一个IRQ运行以下伪代码:: - - for each hardware counter that triggered this overflow - - get the event of this counter - - // following two steps are defined as *read()*, - // check the section Reading/Writing Counters for details. - count the delta value since previous interrupt - update the event->count (# event occurs) by adding delta, and - event->hw.period_left by subtracting delta - - if the event overflows - sample data - set the counter appropriately for the next overflow - - if the event overflows again - too frequently, throttle this event - fi - fi - - end for - - 然而截至目前,没有一个RISC-V的实现为perf设计了中断,所以具体的实现要在未来完成。 - -4. Reading/Writing 计数 ------------------------ - -它们看似差不多,但perf对待它们的态度却截然不同。 对于读,在 *struct pmu* 中有一个 -*read* 接口,但它的作用不仅仅是读。 根据上下文,*read* 函数不仅要读取计数器的内容 -(event->count),还要更新左周期到下一个中断(event->hw.period_left)。 - - 但 perf 的核心不需要直接写计数器。 写计数器隐藏在以下两点的抽象化之后, - 1) *pmu->start* ,从字面上看就是开始计数,所以必须把计数器设置成一个合适的值,以 - 便下一次中断; - 2)在IRQ里面,应该把计数器设置成同样的合理值。 - -在RISC-V中,读操作不是问题,但写操作就需要费些力气了,因为S模式不允许写计数器。 - - -5. add()/del()/start()/stop() ------------------------------ - -基本思想: add()/del() 向PMU添加/删除事件,start()/stop() 启动/停止PMU中某个事件 -的计数器。 所有这些函数都使用相同的参数: *struct perf_event *event* 和 *int flag* 。 - -把 perf 看作一个状态机,那么你会发现这些函数作为这些状态之间的状态转换过程。 -定义了三种状态(event->hw.state): - -* PERF_HES_STOPPED: 计数停止 -* PERF_HES_UPTODATE: event->count是最新的 -* PERF_HES_ARCH: 依赖于体系结构的用法,。。。我们现在并不需要它。 - -这些状态转换的正常流程如下: - -* 用户启动一个 perf 事件,导致调用 *event_init* 。 -* 当被上下文切换进来的时候,*add* 会被 perf core 调用,并带有一个标志 PERF_EF_START, - 也就是说事件被添加后应该被启动。 在这个阶段,如果有的话,一般事件会被绑定到一个物 - 理计数器上。当状态变为PERF_HES_STOPPED和PERF_HES_UPTODATE,因为现在已经停止了, - (软件)事件计数不需要更新。 - - - 然后调用 *start* ,并启用计数器。 - 通过PERF_EF_RELOAD标志,它向计数器写入一个适当的值(详细情况请参考上一节)。 - 如果标志不包含PERF_EF_RELOAD,则不会写入任何内容。 - 现在状态被重置为none,因为它既没有停止也没有更新(计数已经开始)。 - -*当被上下文切换出来时被调用。 然后,它检查出PMU中的所有事件,并调用 *stop* 来更新它们 - 的计数。 - - - *stop* 被 *del* 和perf核心调用,标志为PERF_EF_UPDATE,它经常以相同的逻辑和 *read* - 共用同一个子程序。 - 状态又一次变为PERF_HES_STOPPED和PERF_HES_UPTODATE。 - - - 这两对程序的生命周期: *add* 和 *del* 在任务切换时被反复调用;*start* 和 *stop* 在 - perf核心需要快速停止和启动时也会被调用,比如在调整中断周期时。 - -目前的实现已经足够了,将来可以很容易地扩展到功能。 - -A. 相关结构体 -------------- - -* struct pmu: include/linux/perf_event.h -* struct riscv_pmu: arch/riscv/include/asm/perf_event.h - - 两个结构体都被设计为只读。 - - *struct pmu* 定义了一些函数指针接口,它们大多以 *struct perf_event* 作为主参数,根据 - perf的内部状态机处理perf事件(详情请查看kernel/events/core.c)。 - - *struct riscv_pmu* 定义了PMU的具体参数。 命名遵循所有其它架构的惯例。 - -* struct perf_event: include/linux/perf_event.h -* struct hw_perf_event - - 表示 perf 事件的通用结构体,以及硬件相关的细节。 - -* struct riscv_hw_events: arch/riscv/include/asm/perf_event.h - - 保存事件状态的结构有两个固定成员。 - 事件的数量和事件的数组。 - -参考文献 --------- - -[1] https://github.com/riscv/riscv-linux/pull/124 - -[2] https://groups.google.com/a/groups.riscv.org/forum/#!topic/sw-dev/f19TmCNP6yA -- 2.36.1 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id C0A8BC43334 for ; Sun, 26 Jun 2022 09:11:34 +0000 (UTC) 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:References:In-Reply-To: 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: List-Owner; bh=53agjXo8TsAGRdAY9tPLitjc22KSvc1yxO7uKyezxpo=; b=wQrY2rJA/MhtJy 3vxkovxsTIzVNAskE/yVGE493lsLUJJEX++fHIUlnNMowC1Jj9jP4btnHfLmBVQwHmP+dbGqkA6v8 PiLJT8wJ0nhKefxzzkAzz2UlM13HcXKFFkipUV7sQQm4SLha4BLD+ycx4ja5jd4Whk+51DRMB+wtl HuH9aOy3ZCT0vB66RgxRHaFhWVIKXkRha/Wwpp7XLV/qN9wHgTkB/AFR2sYQf4abFhAb22jQvDNYA GyhgrGKpSMHiz+QFwgmBXQFOKf/11y4Ifrn3BcvvDHFOx5OU+8+tdwHAtqFCnWvD/qrt0+YZ6oegk DR5ArvCVNilwkLMY1+HQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1o5OIZ-00AoJZ-Cm; Sun, 26 Jun 2022 09:11:19 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1o5OIT-00AoBZ-RN for linux-riscv@lists.infradead.org; Sun, 26 Jun 2022 09:11:16 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 5B7F3611B4; Sun, 26 Jun 2022 09:11:13 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D9249C341D1; Sun, 26 Jun 2022 09:11:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1656234671; bh=tckixiBJ1nvT113nNubWzj7Vwk5u4aCs7z08EClBjQ4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=u3VwKWMt28kuGociqyLRd4sQq1xwnwQpNP9c6H6LWTELMZwnzc1LGkMt3AIWNegHq av8vIdb7Xsq8wT041E9fnsUTQmuSTiManUWPDJajRrQYdzFCsY5CzE88zE2ewY+W43 Ef/FtQQXF68TYxvVrLhLtbc8DNwOYBiVS4xW8EOwAZnCN7AzTQhtbz8O6zZyElKXJ1 gHiC8k0+KRgVQtafeA7Gf+54L/z2QUdubDqyi7gzO1K3dQ9q4KFVBpgS0rNuvC081D aOID9d7L2YyF2Osc5b3eAZA+Uc0n+0EMw81wzGmlqSD3LkbPI542oskyPri8je2dWy AGD26Fu3t10wA== Received: from mchehab by mail.kernel.org with local (Exim 4.95) (envelope-from ) id 1o5OIN-001coM-TW; Sun, 26 Jun 2022 10:11:07 +0100 From: Mauro Carvalho Chehab To: Linux Doc Mailing List Cc: Mauro Carvalho Chehab , "Jonathan Corbet" , "Mauro Carvalho Chehab" , Albert Ou , Alex Shi , Anup Patel , Atish Patra , Palmer Dabbelt , Paul Walmsley , Yanteng Si , linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org Subject: [PATCH v2 04/20] docs: zh_CN/riscv/pmu.rst: remove old docuementation Date: Sun, 26 Jun 2022 10:10:50 +0100 Message-Id: <1222dc234722e8c6f2a1fd0e5c875149bbf4f538.1656234456.git.mchehab@kernel.org> X-Mailer: git-send-email 2.36.1 In-Reply-To: References: MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220626_021114_026561_5B67D0A3 X-CRM114-Status: GOOD ( 16.06 ) 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 QXMgdGhlIG9yaWdpbmFsIGRvYyB3YXMgcmVtb3ZlZCwgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRv IGtlZXAKaXRzIHRyYW5zbGF0aW9uLgoKRml4ZXM6IDIzYjFmMTgzMjZlYyAoIkRvY3VtZW50YXRp b246IHJpc2N2OiBSZW1vdmUgdGhlIG9sZCBkb2N1bWVudGF0aW9uIikKU2lnbmVkLW9mZi1ieTog TWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGtlcm5lbC5vcmc+Ci0tLQoKVG8gYXZvaWQg bWFpbGJvbWJpbmcgb24gYSBsYXJnZSBudW1iZXIgb2YgcGVvcGxlLCBvbmx5IG1haWxpbmcgbGlz dHMgd2VyZSBDL0Mgb24gdGhlIGNvdmVyLgpTZWUgW1BBVENIIHYyIDAwLzIwXSBhdDogaHR0cHM6 Ly9sb3JlLmtlcm5lbC5vcmcvYWxsL2NvdmVyLjE2NTYyMzQ0NTYuZ2l0Lm1jaGVoYWJAa2VybmVs Lm9yZy8KCiAuLi4vdHJhbnNsYXRpb25zL3poX0NOL3Jpc2N2L2luZGV4LnJzdCAgICAgICAgfCAg IDEgLQogLi4uL3RyYW5zbGF0aW9ucy96aF9DTi9yaXNjdi9wbXUucnN0ICAgICAgICAgIHwgMjM1 IC0tLS0tLS0tLS0tLS0tLS0tLQogMiBmaWxlcyBjaGFuZ2VkLCAyMzYgZGVsZXRpb25zKC0pCiBk ZWxldGUgbW9kZSAxMDA2NDQgRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vcmlzY3Yv cG11LnJzdAoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3Jp c2N2L2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3Jpc2N2L2lu ZGV4LnJzdAppbmRleCA2MTRjZGUwYzA5OTcuLjEzMWU0MDVhYTg1NyAxMDA2NDQKLS0tIGEvRG9j dW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vcmlzY3YvaW5kZXgucnN0CisrKyBiL0RvY3Vt ZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3Jpc2N2L2luZGV4LnJzdApAQCAtMTksNyArMTks NiBAQCBSSVNDLVYg5L2T57O757uT5p6ECiAKICAgICBib290LWltYWdlLWhlYWRlcgogICAgIHZt LWxheW91dAotICAgIHBtdQogICAgIHBhdGNoLWFjY2VwdGFuY2UKIAogCmRpZmYgLS1naXQgYS9E b2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9yaXNjdi9wbXUucnN0IGIvRG9jdW1lbnRh dGlvbi90cmFuc2xhdGlvbnMvemhfQ04vcmlzY3YvcG11LnJzdApkZWxldGVkIGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggN2VjODAxMDI2YzRkLi4wMDAwMDAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlv bi90cmFuc2xhdGlvbnMvemhfQ04vcmlzY3YvcG11LnJzdAorKysgL2Rldi9udWxsCkBAIC0xLDIz NSArMCwwIEBACi0uLiBpbmNsdWRlOjogLi4vZGlzY2xhaW1lci16aF9DTi5yc3QKLQotOk9yaWdp bmFsOiBEb2N1bWVudGF0aW9uL3Jpc2N2L3BtdS5yc3QKLQotOue/u+ivkToKLQotIOWPuOW7tuiF viBZYW50ZW5nIFNpIDxzaXlhbnRlbmdAbG9vbmdzb24uY24+Ci0KLS4uIF9jbl9yaXNjdl9wbXU6 Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PQotUklTQy1W5bmz5Y+w5LiK5a+5UE1Vc+eahOaU r+aMgQotPT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUFsYW4gS2FvIDxhbGFua2FvQGFuZGVz dGVjaC5jb20+LCBNYXIgMjAxOAotCi3nroDku4sKLS0tLS0tLS0tLS0tLQotCi3miKrmraLmnKzm lofmkrDlhpnml7bvvIzlnKhUaGUgUklTQy1WIElTQSBQcml2aWxlZ2VkIFZlcnNpb24gMS4xMOS4 reaPkOWIsOeahCBwZXJmX2V2ZW50Ci3nm7jlhbPnibnmgKflpoLkuIs6Ci3vvIjor6bmg4Xor7fm n6XpmIXmiYvlhozvvIkKLQotKiBbbXxzXWNvdW50ZXJlbgotKiBtY3ljbGVbaF0sIGN5Y2xlW2hd Ci0qIG1pbnN0cmV0W2hdLCBpbnN0cmV0W2hdCi0qIG1ocGV2ZW50eCwgbWhwY291bnRlcnhbaF0K LQot5LuF5pyJ5Lul5LiK6L+Z5Lqb5Yqf6IO977yM56e75qSNcGVyZumcgOimgeWBmuW+iOWkmuW3 peS9nO+8jOeptuWFtuWOn+WboOaYr+e8uuWwkeS7peS4i+mAmueUqOaetuaehOeahOaAp+iDvQot 55uR5rWL54m55oCnOgotCi0qIOWQr+eUqC/lgZznlKjorqHmlbDlmagKLSAg5Zyo5oiR5Lus6L+Z 6YeM77yM6K6h5pWw5Zmo5LiA55u05Zyo6Ieq55Sx6L+Q6KGM44CCCi0qIOiuoeaVsOWZqOa6ouWH uuW8lei1t+eahOS4reaWrQotICDop4TojIPkuK3msqHmnInov5nnp43lip/og73jgIIKLSog5Lit 5pat5oyH56S65ZmoCi0gIOS4jeWPr+iDveaJgOacieeahOiuoeaVsOWZqOmDveacieW+iOWkmuea hOS4reaWreerr+WPo++8jOaJgOS7pemcgOimgeS4gOS4quS4reaWreaMh+ekuuWZqOiuqei9r+S7 tuadpeWIpOaWrQotICDlk6rkuKrorqHmlbDlmajliJrlpb3muqLlh7rjgIIKLSog5YaZ5YWl6K6h 5pWw5ZmoCi0gIOeUseS6juWGheaguOS4jeiDveS/ruaUueiuoeaVsOWZqO+8jOaJgOS7peS8muac ieS4gOS4qlNCSeadpeaUr+aMgei/meS4quWKn+iDvVsxXeOAgiDlj6blpJbvvIzkuIDkupvljoLl lYYKLSAg6ICD6JmR5a6e546wTS1TLVXlnovlj7fmnLrlmajnmoTnoazku7bmianlsZXmnaXnm7Tm jqXlhpnlhaXorqHmlbDlmajjgIIKLQot6L+Z56+H5paH5qGj5peo5Zyo5Li65byA5Y+R6ICF5o+Q 5L6b5LiA5Liq5Zyo5YaF5qC45Lit5pSv5oyBUE1V55qE566A6KaB5oyH5Y2X44CC5LiL6Z2i55qE 56ug6IqC566A6KaB6Kej6YeK5LqGCi1wZXJmJyDmnLrliLblkozlvoXlip7kuovpobnjgIIKLQot 5L2g5Y+v5Lul5Zyo6L+Z6YeM5p+l55yL5Lul5YmN55qE6K6o6K66WzFdWzJd44CCIOWPpuWklu+8 jOafpeeci+mZhOW9leS4reeahOebuOWFs+WGheaguOe7k+aehOS9k+WPr+iDveS8muaciQot5biu 5Yqp44CCCi0KLQotMS4g5Yid5aeL5YyWCi0tLS0tLS0tLS0KLQotKnJpc2N2X3BtdSog5piv5LiA 5Liq57G75Z6L5Li6ICpzdHJ1Y3QgcmlzY3ZfcG11KiDnmoTlhajlsYDmjIfpkojvvIzlroPljIXl kKvkuobmoLnmja5wZXJm5YaF6YOoCi3nuqblrprnmoTlkITnp43mlrnms5XlkoxQTVUtc3BlY2lm aWPlj4LmlbDjgILkurrku6zlupTor6Xlo7DmmI7ov5nmoLfnmoTlrp7kvovmnaXku6PooahQTVXj gIIg6buY6K6k5oOF5Ya1Ci3kuIvvvIwgKnJpc2N2X3BtdSog5oyH5ZCR5LiA5Liq5bi46YeP57uT 5p6E5L2TICpyaXNjdl9iYXNlX3BtdSog77yM5a6D5a+55Z+65YeGUUVNVeaooeWei+aciemdnuW4 uAot5Z+656GA55qE5pSv5oyB44CCCi0KLQot54S25ZCO5LuWL+WlueWPr+S7peWwhuWunuS+i+ea hOaMh+mSiOWIhumFjee7mSAqcmlzY3ZfcG11KiDvvIzov5nmoLflsLHlj6/ku6XliKnnlKjlt7Ln u4/lrp7njrDnmoTmnIDlsI/pgLsKLei+ke+8jOaIluiAheWIm+W7uuS7li/lpbnoh6rlt7HnmoQg KnJpc2N2X2luaXRfcGxhdGZvcm1fcG11KiDlrp7njrDjgIIKLQot5o2i5Y+l6K+d6K+077yM546w 5pyJ55qEICpyaXNjdl9iYXNlX3BtdSog5rqQ5Y+q5piv5o+Q5L6b5LqG5LiA5Liq5Y+C6ICD5a6e 546w44CCIOW8gOWPkeiAheWPr+S7peeBtea0u+WcsAot5Yaz5a6a5aSa5bCR6YOo5YiG5Y+v55So 77yM5Zyo5pyA5p6B56uv55qE5oOF5Ya15LiL77yM5LuW5Lus5Y+v5Lul5qC55o2u6Ieq5bex55qE 6ZyA6KaB5a6a5Yi25q+P5LiA5Liq5Ye95pWw44CCCi0KLQotMi4gRXZlbnQgSW5pdGlhbGl6YXRp b24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLeW9k+eUqOaIt+WQr+WKqHBlcmblkb3ku6Tm naXnm5HmjqfkuIDkupvkuovku7bml7bvvIzpppblhYjkvJrooqvnlKjmiLfnqbrpl7TnmoRwZXJm 5bel5YW36Kej6YeK5Li65aSa5LiqCi0qcGVyZl9ldmVudF9vcGVuKiDns7vnu5/osIPnlKjvvIzn hLblkI7ov5vkuIDmraXosIPnlKjkuIrkuIDmraXliIbphY3nmoQgKmV2ZW50X2luaXQqIOaIkOWR mOWHveaVsAot55qE5Li75L2T44CCIOWcqCAqcmlzY3ZfYmFzZV9wbXUqIOeahOaDheWGteS4i++8 jOWwseaYryAqcmlzY3ZfZXZlbnRfaW5pdCog44CCCi0KLeivpeWKn+iDveeahOS4u+imgeebruea hOaYr+WwhueUqOaIt+aPkOS+m+eahOS6i+S7tue/u+ivkeaIkOaYoOWwhOWbvu+8jOS7juiAjOWP r+S7peebtOaOpeWvuUhXLXJlbGF0ZWTnmoTmjqcKLeWItuWvhOWtmOWZqOaIluiuoeaVsOWZqOi/ m+ihjOaTjeS9nOOAguivpee/u+ivkeWfuuS6jiAqcmlzY3ZfcG11KiDkuK3mj5DkvpvnmoTmmKDl sITlkozmlrnms5XjgIIKLQot5rOo5oSP77yM5pyJ5Lqb5Yqf6IO95Lmf5Y+v5Lul5Zyo6L+Z5Liq 6Zi25q615a6M5oiQOgotCi0oMSkg5Lit5pat6K6+572u77yM6L+Z5Liq5Zyo5LiL5LiA6IqC6K+0 77ybCi0oMikg54m56ZmQ57qn6K6+572uKOS7heeUqOaIt+epuumXtOOAgeS7heWGheaguOepuumX tOOAgeS4pOiAhemDveaciSnvvJsKLSgzKSDmnpDmnoTlh73mlbDorr7nva7jgIIg6YCa5bi45bqU 55SoICpyaXNjdl9kZXN0cm95X2V2ZW50KiDljbPlj6/vvJsKLSg0KSDlr7npnZ7ph4fmoLfkuovk u7bnmoTosIPmlbTvvIzov5nlsIbooqvlh73mlbDlupTnlKjvvIzlpoIgKnBlcmZfYWRqdXN0X3Bl cmlvZCog77yM6YCa5bi45aaC5LiLOjoKLQotICAgICAgaWYgKCFpc19zYW1wbGluZ19ldmVudChl dmVudCkpIHsKLSAgICAgICAgICAgICAgaHdjLT5zYW1wbGVfcGVyaW9kID0geDg2X3BtdS5tYXhf cGVyaW9kOwotICAgICAgICAgICAgICBod2MtPmxhc3RfcGVyaW9kID0gaHdjLT5zYW1wbGVfcGVy aW9kOwotICAgICAgICAgICAgICBsb2NhbDY0X3NldCgmaHdjLT5wZXJpb2RfbGVmdCwgaHdjLT5z YW1wbGVfcGVyaW9kKTsKLSAgICAgIH0KLQotCi3lnKggKnJpc2N2X2Jhc2VfcG11KiDnmoTmg4Xl hrXkuIvvvIznm67liY3lj6rmj5DkvpvkuobvvIgz77yJ44CCCi0KLQotMy4g5Lit5patCi0tLS0t LS0tCi0KLTMuMS4g5Lit5pat5Yid5aeL5YyWCi0KLei/meenjeaDheWGtee7j+W4uOWHuueOsOWc qCAqZXZlbnRfaW5pdCog5pa55qGI55qE5byA5aS044CC6YCa5bi45oOF5Ya15LiL77yM6L+Z5bqU 6K+l5piv5LiA5Liq5Luj56CB5q6177yM5aaCOjoKLQotICBpbnQgeDg2X3Jlc2VydmVfaGFyZHdh cmUodm9pZCkKLSAgewotICAgICAgICBpbnQgZXJyID0gMDsKLQotICAgICAgICBpZiAoIWF0b21p Y19pbmNfbm90X3plcm8oJnBtY19yZWZjb3VudCkpIHsKLSAgICAgICAgICAgICAgICBtdXRleF9s b2NrKCZwbWNfcmVzZXJ2ZV9tdXRleCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0b21pY19yZWFk KCZwbWNfcmVmY291bnQpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVz ZXJ2ZV9wbWNfaGFyZHdhcmUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJy ID0gLUVCVVNZOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICByZXNlcnZlX2RzX2J1ZmZlcnMoKTsKLSAgICAgICAgICAgICAgICB9 Ci0gICAgICAgICAgICAgICAgaWYgKCFlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICBhdG9t aWNfaW5jKCZwbWNfcmVmY291bnQpOwotICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmcG1j X3Jlc2VydmVfbXV0ZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgfQot Ci3ogIznpZ7lpYfnmoTmmK8gKnJlc2VydmVfcG1jX2hhcmR3YXJlKiDvvIzlroPpgJrluLjlgZrl jp/lrZDmk43kvZzvvIzkvb/lrp7njrDnmoRJUlHlj6/ku6Xku47mn5DkuKrlhajlsYDlh70KLeaV sOaMh+mSiOiuv+mXruOAgiDogIwgKnJlbGVhc2VfcG1jX2hhcmR3YXJlKiDnmoTkvZznlKjmraPl pb3nm7jlj43vvIzlroPnlKjlnKjkuIrkuIDoioLmj5DliLDnmoTkuovku7bliIbphY0KLeWZqOS4 reOAggotCi0gKOazqO+8muS7juaJgOacieaetuaehOeahOWunueOsOadpeeci++8jCpyZXNlcnZl L3JlbGVhc2UqIOWvueaAu+aYr0lSUeiuvue9ru+8jOaJgOS7pSAqcG1jX2hhcmR3YXJlKgotIOS8 vOS5juacieS6m+ivr+WvvOOAgiDlroPlubbkuI3lpITnkIbkuovku7blkozniannkIborqHmlbDl majkuYvpl7TnmoTnu5HlrprvvIzov5nkuIDngrnlsIblnKjkuIvkuIDoioLku4vnu43jgIIpCi0K LTMuMi4gSVJR57uT5p6E5L2TCi0KLeWfuuacrOS4iu+8jOS4gOS4qklSUei/kOihjOS7peS4i+S8 quS7o+eggTo6Ci0KLSAgZm9yIGVhY2ggaGFyZHdhcmUgY291bnRlciB0aGF0IHRyaWdnZXJlZCB0 aGlzIG92ZXJmbG93Ci0KLSAgICAgIGdldCB0aGUgZXZlbnQgb2YgdGhpcyBjb3VudGVyCi0KLSAg ICAgIC8vIGZvbGxvd2luZyB0d28gc3RlcHMgYXJlIGRlZmluZWQgYXMgKnJlYWQoKSosCi0gICAg ICAvLyBjaGVjayB0aGUgc2VjdGlvbiBSZWFkaW5nL1dyaXRpbmcgQ291bnRlcnMgZm9yIGRldGFp bHMuCi0gICAgICBjb3VudCB0aGUgZGVsdGEgdmFsdWUgc2luY2UgcHJldmlvdXMgaW50ZXJydXB0 Ci0gICAgICB1cGRhdGUgdGhlIGV2ZW50LT5jb3VudCAoIyBldmVudCBvY2N1cnMpIGJ5IGFkZGlu ZyBkZWx0YSwgYW5kCi0gICAgICAgICAgICAgICAgIGV2ZW50LT5ody5wZXJpb2RfbGVmdCBieSBz dWJ0cmFjdGluZyBkZWx0YQotCi0gICAgICBpZiB0aGUgZXZlbnQgb3ZlcmZsb3dzCi0gICAgICAg ICAgc2FtcGxlIGRhdGEKLSAgICAgICAgICBzZXQgdGhlIGNvdW50ZXIgYXBwcm9wcmlhdGVseSBm b3IgdGhlIG5leHQgb3ZlcmZsb3cKLQotICAgICAgICAgIGlmIHRoZSBldmVudCBvdmVyZmxvd3Mg YWdhaW4KLSAgICAgICAgICAgICAgdG9vIGZyZXF1ZW50bHksIHRocm90dGxlIHRoaXMgZXZlbnQK LSAgICAgICAgICBmaQotICAgICAgZmkKLQotICBlbmQgZm9yCi0KLSDnhLbogIzmiKroh7Pnm67l iY3vvIzmsqHmnInkuIDkuKpSSVNDLVbnmoTlrp7njrDkuLpwZXJm6K6+6K6h5LqG5Lit5pat77yM 5omA5Lul5YW35L2T55qE5a6e546w6KaB5Zyo5pyq5p2l5a6M5oiQ44CCCi0KLTQuIFJlYWRpbmcv V3JpdGluZyDorqHmlbAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLeWug+S7rOeci+S8vOW3 ruS4jeWkmu+8jOS9hnBlcmblr7nlvoXlroPku6znmoTmgIHluqbljbTmiKrnhLbkuI3lkIzjgIIg 5a+55LqO6K+777yM5ZyoICpzdHJ1Y3QgcG11KiDkuK3mnInkuIDkuKoKLSpyZWFkKiDmjqXlj6Pv vIzkvYblroPnmoTkvZznlKjkuI3ku4Xku4XmmK/or7vjgIIg5qC55o2u5LiK5LiL5paH77yMKnJl YWQqIOWHveaVsOS4jeS7heimgeivu+WPluiuoeaVsOWZqOeahOWGheWuuQot77yIZXZlbnQtPmNv dW5077yJ77yM6L+Y6KaB5pu05paw5bem5ZGo5pyf5Yiw5LiL5LiA5Liq5Lit5pat77yIZXZlbnQt Pmh3LnBlcmlvZF9sZWZ077yJ44CCCi0KLSDkvYYgcGVyZiDnmoTmoLjlv4PkuI3pnIDopoHnm7Tm jqXlhpnorqHmlbDlmajjgIIg5YaZ6K6h5pWw5Zmo6ZqQ6JeP5Zyo5Lul5LiL5Lik54K555qE5oq9 6LGh5YyW5LmL5ZCO77yMCi0gMe+8iSAqcG11LT5zdGFydCog77yM5LuO5a2X6Z2i5LiK55yL5bCx 5piv5byA5aeL6K6h5pWw77yM5omA5Lul5b+F6aG75oqK6K6h5pWw5Zmo6K6+572u5oiQ5LiA5Liq 5ZCI6YCC55qE5YC877yM5LulCi0g5L6/5LiL5LiA5qyh5Lit5pat77ybCi0gMu+8ieWcqElSUemH jOmdou+8jOW6lOivpeaKiuiuoeaVsOWZqOiuvue9ruaIkOWQjOagt+eahOWQiOeQhuWAvOOAggot Ci3lnKhSSVNDLVbkuK3vvIzor7vmk43kvZzkuI3mmK/pl67popjvvIzkvYblhpnmk43kvZzlsLHp nIDopoHotLnkupvlipvmsJTkuobvvIzlm6DkuLpT5qih5byP5LiN5YWB6K645YaZ6K6h5pWw5Zmo 44CCCi0KLQotNS4gYWRkKCkvZGVsKCkvc3RhcnQoKS9zdG9wKCkKLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCi0KLeWfuuacrOaAneaDszogYWRkKCkvZGVsKCkg5ZCRUE1V5re75YqgL+WI oOmZpOS6i+S7tu+8jHN0YXJ0KCkvc3RvcCgpIOWQr+WKqC/lgZzmraJQTVXkuK3mn5DkuKrkuovk u7YKLeeahOiuoeaVsOWZqOOAgiDmiYDmnInov5nkupvlh73mlbDpg73kvb/nlKjnm7jlkIznmoTl j4LmlbA6ICpzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQqIOWSjCAqaW50IGZsYWcqIOOAggotCi3m ioogcGVyZiDnnIvkvZzkuIDkuKrnirbmgIHmnLrvvIzpgqPkuYjkvaDkvJrlj5HnjrDov5nkupvl h73mlbDkvZzkuLrov5nkupvnirbmgIHkuYvpl7TnmoTnirbmgIHovazmjaLov4fnqIvjgIIKLeWu muS5ieS6huS4ieenjeeKtuaAge+8iGV2ZW50LT5ody5zdGF0Ze+8iToKLQotKiBQRVJGX0hFU19T VE9QUEVEOgnorqHmlbDlgZzmraIKLSogUEVSRl9IRVNfVVBUT0RBVEU6CWV2ZW50LT5jb3VudOaY r+acgOaWsOeahAotKiBQRVJGX0hFU19BUkNIOgnkvp3otZbkuo7kvZPns7vnu5PmnoTnmoTnlKjm s5XvvIzjgILjgILjgILmiJHku6znjrDlnKjlubbkuI3pnIDopoHlroPjgIIKLQot6L+Z5Lqb54q2 5oCB6L2s5o2i55qE5q2j5bi45rWB56iL5aaC5LiLOgotCi0qIOeUqOaIt+WQr+WKqOS4gOS4qiBw ZXJmIOS6i+S7tu+8jOWvvOiHtOiwg+eUqCAqZXZlbnRfaW5pdCog44CCCi0qIOW9k+iiq+S4iuS4 i+aWh+WIh+aNoui/m+adpeeahOaXtuWAme+8jCphZGQqIOS8muiiqyBwZXJmIGNvcmUg6LCD55So 77yM5bm25bim5pyJ5LiA5Liq5qCH5b+XIFBFUkZfRUZfU1RBUlTvvIwKLSAg5Lmf5bCx5piv6K+0 5LqL5Lu26KKr5re75Yqg5ZCO5bqU6K+l6KKr5ZCv5Yqo44CCIOWcqOi/meS4qumYtuaute+8jOWm guaenOacieeahOivne+8jOS4gOiIrOS6i+S7tuS8muiiq+e7keWumuWIsOS4gOS4queJqQotICDn kIborqHmlbDlmajkuIrjgILlvZPnirbmgIHlj5jkuLpQRVJGX0hFU19TVE9QUEVE5ZKMUEVSRl9I RVNfVVBUT0RBVEXvvIzlm6DkuLrnjrDlnKjlt7Lnu4/lgZzmraLkuoYsCi0gIO+8iOi9r+S7tu+8 ieS6i+S7tuiuoeaVsOS4jemcgOimgeabtOaWsOOAggotCi0gIC0g54S25ZCO6LCD55SoICpzdGFy dCog77yM5bm25ZCv55So6K6h5pWw5Zmo44CCCi0gICAg6YCa6L+HUEVSRl9FRl9SRUxPQUTmoIfl v5fvvIzlroPlkJHorqHmlbDlmajlhpnlhaXkuIDkuKrpgILlvZPnmoTlgLzvvIjor6bnu4bmg4Xl hrXor7flj4LogIPkuIrkuIDoioLvvInjgIIKLSAgICDlpoLmnpzmoIflv5fkuI3ljIXlkKtQRVJG X0VGX1JFTE9BRO+8jOWImeS4jeS8muWGmeWFpeS7u+S9leWGheWuueOAggotICAgIOeOsOWcqOeK tuaAgeiiq+mHjee9ruS4um5vbmXvvIzlm6DkuLrlroPml6LmsqHmnInlgZzmraLkuZ/msqHmnInm m7TmlrDvvIjorqHmlbDlt7Lnu4/lvIDlp4vvvInjgIIKLQotKuW9k+iiq+S4iuS4i+aWh+WIh+aN ouWHuuadpeaXtuiiq+iwg+eUqOOAgiDnhLblkI7vvIzlroPmo4Dmn6Xlh7pQTVXkuK3nmoTmiYDm nInkuovku7bvvIzlubbosIPnlKggKnN0b3AqIOadpeabtOaWsOWug+S7rAotIOeahOiuoeaVsOOA ggotCi0gIC0gKnN0b3AqIOiiqyAqZGVsKiDlkoxwZXJm5qC45b+D6LCD55So77yM5qCH5b+X5Li6 UEVSRl9FRl9VUERBVEXvvIzlroPnu4/luLjku6Xnm7jlkIznmoTpgLvovpHlkowgKnJlYWQqCi0g ICAg5YWx55So5ZCM5LiA5Liq5a2Q56iL5bqP44CCCi0gICAg54q25oCB5Y+I5LiA5qyh5Y+Y5Li6 UEVSRl9IRVNfU1RPUFBFROWSjFBFUkZfSEVTX1VQVE9EQVRF44CCCi0KLSAgLSDov5nkuKTlr7nn qIvluo/nmoTnlJ/lkb3lkajmnJ86ICphZGQqIOWSjCAqZGVsKiDlnKjku7vliqHliIfmjaLml7bo oqvlj43lpI3osIPnlKjvvJsqc3RhcnQqIOWSjCAqc3RvcCog5ZyoCi0gICAgcGVyZuaguOW/g+mc gOimgeW/q+mAn+WBnOatouWSjOWQr+WKqOaXtuS5n+S8muiiq+iwg+eUqO+8jOavlOWmguWcqOiw g+aVtOS4reaWreWRqOacn+aXtuOAggotCi3nm67liY3nmoTlrp7njrDlt7Lnu4/otrPlpJ/kuobv vIzlsIbmnaXlj6/ku6XlvojlrrnmmJPlnLDmianlsZXliLDlip/og73jgIIKLQotQS4g55u45YWz 57uT5p6E5L2TCi0tLS0tLS0tLS0tLS0tCi0KLSogc3RydWN0IHBtdTogaW5jbHVkZS9saW51eC9w ZXJmX2V2ZW50LmgKLSogc3RydWN0IHJpc2N2X3BtdTogYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9w ZXJmX2V2ZW50LmgKLQotICDkuKTkuKrnu5PmnoTkvZPpg73ooqvorr7orqHkuLrlj6ror7vjgIIK LQotICAqc3RydWN0IHBtdSog5a6a5LmJ5LqG5LiA5Lqb5Ye95pWw5oyH6ZKI5o6l5Y+j77yM5a6D 5Lus5aSn5aSa5LulICpzdHJ1Y3QgcGVyZl9ldmVudCog5L2c5Li65Li75Y+C5pWw77yM5qC55o2u Ci0gIHBlcmbnmoTlhoXpg6jnirbmgIHmnLrlpITnkIZwZXJm5LqL5Lu277yI6K+m5oOF6K+35p+l 55yLa2VybmVsL2V2ZW50cy9jb3JlLmPvvInjgIIKLQotICAqc3RydWN0IHJpc2N2X3BtdSog5a6a 5LmJ5LqGUE1V55qE5YW35L2T5Y+C5pWw44CCIOWRveWQjemBteW+quaJgOacieWFtuWug+aetuae hOeahOaDr+S+i+OAggotCi0qIHN0cnVjdCBwZXJmX2V2ZW50OiBpbmNsdWRlL2xpbnV4L3BlcmZf ZXZlbnQuaAotKiBzdHJ1Y3QgaHdfcGVyZl9ldmVudAotCi0gIOihqOekuiBwZXJmIOS6i+S7tuea hOmAmueUqOe7k+aehOS9k++8jOS7peWPiuehrOS7tuebuOWFs+eahOe7huiKguOAggotCi0qIHN0 cnVjdCByaXNjdl9od19ldmVudHM6IGFyY2gvcmlzY3YvaW5jbHVkZS9hc20vcGVyZl9ldmVudC5o Ci0KLSAg5L+d5a2Y5LqL5Lu254q25oCB55qE57uT5p6E5pyJ5Lik5Liq5Zu65a6a5oiQ5ZGY44CC Ci0gIOS6i+S7tueahOaVsOmHj+WSjOS6i+S7tueahOaVsOe7hOOAggotCi3lj4LogIPmlofnjK4K LS0tLS0tLS0tCi0KLVsxXSBodHRwczovL2dpdGh1Yi5jb20vcmlzY3YvcmlzY3YtbGludXgvcHVs bC8xMjQKLQotWzJdIGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vYS9ncm91cHMucmlzY3Yub3Jn L2ZvcnVtLyMhdG9waWMvc3ctZGV2L2YxOVRtQ05QNnlBCi0tIAoyLjM2LjEKCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5n IGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFk ZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg==