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=-12.3 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER,NICE_REPLY_A,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 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 21F88C433E0 for ; Wed, 29 Jul 2020 16:49:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D92BF2082E for ; Wed, 29 Jul 2020 16:49:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=amdcloud.onmicrosoft.com header.i=@amdcloud.onmicrosoft.com header.b="Sgijbca9" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726971AbgG2QtT (ORCPT ); Wed, 29 Jul 2020 12:49:19 -0400 Received: from mail-bn8nam11on2065.outbound.protection.outlook.com ([40.107.236.65]:56576 "EHLO NAM11-BN8-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726336AbgG2QtT (ORCPT ); Wed, 29 Jul 2020 12:49:19 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ahFgotyxPZf0ayeFHiN0PwVgnHHlfu2XWoeLJyepI01bxp4VUzsussMdTdHOf9Y2ktWExUQSxu1GPJF3mDdCet4XBFnLSx/3f04HQZTPdVfakpJTbzBmTMHGGBgQVWcGC90IMKIbl4DTlyjorZSEXc+KIaWmuDJZKIxXCQaPprlQ/t7lDTdsHZ8MwAALu/4QAQ+LRzQcCY0lPX+iRn1r2cgBOkNLKawYrE8yTY42BL6ahi6UwWr4Vp73vcARMo3oOVrr8J0sddYxm4E/6HIWCjzGG4su8H8GhhHjc6aSZ9lLcb+pSaRN8Uax/PSXB31a9Qj+/0i6y+LYzqG/WAW7Ag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5+jHWN5OlccZjSfNvqX1/2mYd2T2MXxqlV+fyfztD4Q=; b=iAMauG70Ky+ujG4IIflkGTSAqU2XlwwxjHmih2DYy39jFKKC7SV4XqcfyxPOwMIx3umuVw6eoF/dGF8Ob3Yyk8wKB6MmVYLBJoSKzoYAlpGST9FYJUoTBeNG6lznySnq6lAoIL4jTwnH7pgBAQhBLIm+V2K4tLGsjTavD+D9SUXO3vtWVQBeBiWCnTFJwChoMQw4eVLj2maccKA7NORhUv4uv4I0CfoE79FMveittt2nAh+Z9MUHcyR0wTju1cHL1n7pKMrQ0Pf18CEBYEkasTKm23XUE9/2uBVJuxh03bIHPqS9IcMK4OyCWHlyUJAsKrLKcXRjiXXdeE02vV5wGg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector2-amdcloud-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5+jHWN5OlccZjSfNvqX1/2mYd2T2MXxqlV+fyfztD4Q=; b=Sgijbca9BSns7usREcwESEWQi65dUVxBqkoU7k47UxodVmYj9/t2QlMy5MejI9XJdzNhV1C+VEloe618A6o6i9M/xcADzR/8naWuRga8fdbjs5AVeH9GFayQOalSPxjd4yJGiyo8g65kcNyaVThMOkxa81CS40u3kuBgY9VSPz8= Authentication-Results: yahoo.com.br; dkim=none (message not signed) header.d=none;yahoo.com.br; dmarc=none action=none header.from=amd.com; Received: from BYAPR12MB3560.namprd12.prod.outlook.com (2603:10b6:a03:ae::10) by BY5PR12MB4275.namprd12.prod.outlook.com (2603:10b6:a03:20a::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3239.16; Wed, 29 Jul 2020 16:49:14 +0000 Received: from BYAPR12MB3560.namprd12.prod.outlook.com ([fe80::7d42:c932:e35f:71b1]) by BYAPR12MB3560.namprd12.prod.outlook.com ([fe80::7d42:c932:e35f:71b1%7]) with mapi id 15.20.3216.034; Wed, 29 Jul 2020 16:49:14 +0000 Subject: Re: [PATCH] drm/amd/display: Clear dm_state for fast updates To: Mazin Rezk , =?UTF-8?Q?Christian_K=c3=b6nig?= , "linux-kernel@vger.kernel.org" , "amd-gfx@lists.freedesktop.org" , "dri-devel@lists.freedesktop.org" , Paul Menzel , "anthony.ruhier@gmail.com" , Duncan <1i5t5.duncan@cox.net>, Kees Cook , "sunpeng.li@amd.com" , "regressions@leemhuis.info" , Alexander Deucher , Andrew Morton , "mphantomx@yahoo.com.br" References: <3b7e3e50-2ff7-eff3-2ffc-abaa4b36ce7f@amd.com> <20200728090855.GZ6419@phenom.ffwll.local> From: "Kazlauskas, Nicholas" Message-ID: <18d6a40d-0c7e-fbce-376d-ce468955d4b8@amd.com> Date: Wed, 29 Jul 2020 12:49:10 -0400 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 In-Reply-To: <20200728090855.GZ6419@phenom.ffwll.local> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-ClientProxiedBy: YTXPR0101CA0038.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b00:1::15) To BYAPR12MB3560.namprd12.prod.outlook.com (2603:10b6:a03:ae::10) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [172.31.148.234] (165.204.55.211) by YTXPR0101CA0038.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b00:1::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3239.16 via Frontend Transport; Wed, 29 Jul 2020 16:49:12 +0000 X-Originating-IP: [165.204.55.211] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: b7d97f04-33bd-49a2-d2d6-08d833df5378 X-MS-TrafficTypeDiagnostic: BY5PR12MB4275: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: N5DteoiKxEU2QYWEHIiP8h0bQMNFo7KTHGt2AMlWEJ0d3yTDsl6ULO+z8YCRsS4StUlMJ4IEGbeur/A6ix+dValbNJttQKuN/fb4MDKkVz1Zf2yE0oA6nVa2R+xm+u6VEK2GgZf8akWgb+V2rkZ7kO9yv3vwlTeyvJRyoLU67x22oQ/F54ol88Oe9qXlZh6UM2ZWfZ006Cm2uf8LmMnym3BtEOfU8oWVQ8hqVgnMCU9+VtwDAGgonhMNcS/u09mmymj1WdIFOurBf0LR3HWOZIzu4qQ6WeYdzoaFmmU5mVOt7lJDwkIhBz6ziG+npR4iiKyWtEPYW5rDnHQtwZErfK1S23Zv1CDTsXDq9wgqkHHvpyaLJFPDn+/e499fc42OPUL12eA5QOcfSnmEkvJbD4PVSsrlVl+DM7+yzdzMTp9Rks/Z7HCJJw4k5Wu0wH4TpKCldzHt95Lf5JoviScfFORTkWVQ5Gl4rpHjaSC8/ak= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BYAPR12MB3560.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFTY:;SFS:(4636009)(39860400002)(376002)(366004)(396003)(136003)(346002)(8936002)(966005)(31686004)(66574015)(53546011)(31696002)(8676002)(6486002)(26005)(316002)(36756003)(16526019)(110136005)(186003)(7416002)(83380400001)(52116002)(15650500001)(2616005)(86362001)(66946007)(30864003)(83080400001)(16576012)(66556008)(5660300002)(478600001)(956004)(66476007)(2906002)(921003)(43740500002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData: hhJjmL37s53yvAB5KAEunxVSaXoTLorGZHZ5HEwHcdLSv7YGPgwFcBWtYvrhRZoCH8EIBDva28ZO7Fo54dZNYxQkdgyGWeS5fhVtQ0iy050Ph3GnFAqxeC60hQ3tmBYFBZUnZHFfOo2mbY9/Y/1VhImC9R2UGy0e2YVjRRtzW6WreE4N5Dxe2LB781IbzezFckR4Xgd4mzX+Itw7n0WnMt3AeMm7MzxegpyoonyFR4mwieHIiWJ9Mg0vUOiT6VaSUaaPeLiicatG0iX/N6dzOkNIbSuoV2edeoVcno2M6D/w3dUc9gIOFQ7QpYOdMmOMdhy9pgj9H0EReQR3I8n1dD0rrcqblwdFazuCHKZE3mY9QJ5lk56tQCrFfcVLlM0xFEP9NX1flrXmJEPggbfpyN+aZD3mJFm3Wx7lbqUEQ5MZ5q24bjO5Yy4IxtMSZvyDB14aTs0MvYTe2uYvmRLRDxvPuSCJRAOvfMYORKsNgZ+wJdcqck0BqTw8Gha1wRPYJu16+PqmAwsnp5TjKjVylln0w+4mKPyNxrsUG8LJ5dE4uCjkZvpD2HWALyyGT2rt5qF1jz4L+ozI4uiIS4GjmODdTbS/bV4x12U2iXSeTf1Ys0EUgRM4s+fRBc/Ui9ToxgoPGZBqBKJbT5iCfhum+g== X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: b7d97f04-33bd-49a2-d2d6-08d833df5378 X-MS-Exchange-CrossTenant-AuthSource: BYAPR12MB3560.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jul 2020 16:49:14.7054 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: faJtbtELsai8BgdGC5qCkHfUYRMl1bYXlQTiG4NJlFqi1Y/Y6DLlNktoJRqjh0X/XaPjAy3aWBut0wikPLCWLg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR12MB4275 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2020-07-28 5:08 a.m., daniel@ffwll.ch wrote: > On Mon, Jul 27, 2020 at 10:49:48PM -0400, Kazlauskas, Nicholas wrote: >> On 2020-07-27 5:32 p.m., Daniel Vetter wrote: >>> On Mon, Jul 27, 2020 at 11:11 PM Mazin Rezk wrote: >>>> >>>> On Monday, July 27, 2020 4:29 PM, Daniel Vetter wrote: >>>> >>>>> On Mon, Jul 27, 2020 at 9:28 PM Christian König >>>>> wrote: >>>>>> >>>>>> Am 27.07.20 um 16:05 schrieb Kazlauskas, Nicholas: >>>>>>> On 2020-07-27 9:39 a.m., Christian König wrote: >>>>>>>> Am 27.07.20 um 07:40 schrieb Mazin Rezk: >>>>>>>>> This patch fixes a race condition that causes a use-after-free during >>>>>>>>> amdgpu_dm_atomic_commit_tail. This can occur when 2 non-blocking >>>>>>>>> commits >>>>>>>>> are requested and the second one finishes before the first. >>>>>>>>> Essentially, >>>>>>>>> this bug occurs when the following sequence of events happens: >>>>>>>>> >>>>>>>>> 1. Non-blocking commit #1 is requested w/ a new dm_state #1 and is >>>>>>>>> deferred to the workqueue. >>>>>>>>> >>>>>>>>> 2. Non-blocking commit #2 is requested w/ a new dm_state #2 and is >>>>>>>>> deferred to the workqueue. >>>>>>>>> >>>>>>>>> 3. Commit #2 starts before commit #1, dm_state #1 is used in the >>>>>>>>> commit_tail and commit #2 completes, freeing dm_state #1. >>>>>>>>> >>>>>>>>> 4. Commit #1 starts after commit #2 completes, uses the freed dm_state >>>>>>>>> 1 and dereferences a freelist pointer while setting the context. >>>>>>>> >>>>>>>> Well I only have a one mile high view on this, but why don't you let >>>>>>>> the work items execute in order? >>>>>>>> >>>>>>>> That would be better anyway cause this way we don't trigger a cache >>>>>>>> line ping pong between CPUs. >>>>>>>> >>>>>>>> Christian. >>>>>>> >>>>>>> We use the DRM helpers for managing drm_atomic_commit_state and those >>>>>>> helpers internally push non-blocking commit work into the system >>>>>>> unbound work queue. >>>>>> >>>>>> Mhm, well if you send those helper atomic commits in the order A,B and >>>>>> they execute it in the order B,A I would call that a bug :) >>>>> >>>>> The way it works is it pushes all commits into unbound work queue, but >>>>> then forces serialization as needed. We do _not_ want e.g. updates on >>>>> different CRTC to be serialized, that would result in lots of judder. >>>>> And hw is funny enough that there's all kinds of dependencies. >>>>> >>>>> The way you force synchronization is by adding other CRTC state >>>>> objects. So if DC is busted and can only handle a single update per >>>>> work item, then I guess you always need all CRTC states and everything >>>>> will be run in order. But that also totally kills modern multi-screen >>>>> compositors. Xorg isn't modern, just in case that's not clear :-) >>>>> >>>>> Lucking at the code it seems like you indeed have only a single dm >>>>> state, so yeah global sync is what you'll need as immediate fix, and >>>>> then maybe fix up DM to not be quite so silly ... or at least only do >>>>> the dm state stuff when really needed. >>>>> >>>>> We could also sprinkle the drm_crtc_commit structure around a bit >>>>> (it's the glue that provides the synchronization across commits), but >>>>> since your dm state is global just grabbing all crtc states >>>>> unconditionally as part of that is probably best. >>>>> >>>>>>> While we could duplicate a copy of that code with nothing but the >>>>>>> workqueue changed that isn't something I'd really like to maintain >>>>>>> going forward. >>>>>> >>>>>> I'm not talking about duplicating the code, I'm talking about fixing the >>>>>> helpers. I don't know that code well, but from the outside it sounds >>>>>> like a bug there. >>>>>> >>>>>> And executing work items in the order they are submitted is trivial. >>>>>> >>>>>> Had anybody pinged Daniel or other people familiar with the helper code >>>>>> about it? >>>>> >>>>> Yeah something is wrong here, and the fix looks horrible :-) >>>>> >>>>> Aside, I've also seen some recent discussion flare up about >>>>> drm_atomic_state_get/put used to paper over some other use-after-free, >>>>> but this time related to interrupt handlers. Maybe a few rules about >>>>> that: >>>>> - dont >>>>> - especially not when it's interrupt handlers, because you can't call >>>>> drm_atomic_state_put from interrupt handlers. >>>>> >>>>> Instead have an spin_lock_irq to protect the shared date with your >>>>> interrupt handler, and _copy_ the date over. This is e.g. what >>>>> drm_crtc_arm_vblank_event does. >>>> >>>> Nicholas wrote a patch that attempted to resolve the issue by adding every >>>> CRTC into the commit to use use the stall checks. [1] While this forces >>>> synchronisation on commits, it's kind of a hacky method that may take a >>>> toll on performance. >>>> >>>> Is it possible to have a DRM helper that forces synchronisation on some >>>> commits without having to add every CRTC into the commit? >>>> >>>> Also, is synchronisation really necessary for fast updates in amdgpu? >>>> I'll admit, the idea of eliminating the use-after-free bug by eliminating >>>> the use entirely doesn't seem ideal; but is forcing synchronisation on >>>> these updates that much better? >>> >>> Well clearing the dc_state pointer here and then allocating another >>> one in atomic_commit_tail also looks fishy. The proper fix is probably >>> a lot more involved, but yeah interim fix is to grab all crtc states >>> iff you also grabbed the dm_atomic_state structure. Real fix is to >>> only do this when necessary, which pretty much means the dc_state >>> needs to be somehow split up, or there needs to be some guarantees >>> about when it's necessary and when not. Otherwise parallel commits on >>> different CRTC are not possible with the current dc backend code. >> >> Thanks for spending some time to help take a look at this as well. >> >> The DRM documentation (at least at the time) seemed to imply that >> subclassing DRM private state was for legacy usage only and DRM wanted to >> move away from it. DRM private objects seemed to fit as the nicer atomic >> method for handling this since they have old/new, but as you can guess from >> this issue it's a mess (from our end). > > Yeah, if it's actual state you put in there. But this dc_state structure > is more like a container of state pointers, like drm_atomic_state. It's > not 100% clear-cut, e.g. the bw stuff is more like a real state object I > guess, or maybe it's just temporary storage for computation results? > >> The first step to fixing this is going back to subclassing DRM state. >> >> It's actually the right tool for the job for allocating temporary state >> outside of the core DRM objects, and we need this to form the DC state >> object and necessary stream update bundles which might be too big to fit on >> the stack for commit check/commit tail. We'll be a lot closer to fixing the >> lockdep issues this way once we get around to getting rid of allocations in >> the DC commit paths. > > So on the stream bundles ... where do these pointers point to? Are the > streams themselves in the crtc/plane states? > >> The second step is to fix validation itself. The old state requirement for >> checking stream/plane updates was actually an entirely pointless endeavor >> since dc global validation doesn't every look at updates, just the final >> state for a set streams/planes - it's stateless. > > Uh, is your hw that good, i.e. there's no impossible state transitions? Or > do you simply force a modeset in such cases? In which case, are the > modeset flags correctly updated so that userspace can control this with > ALLOW_MODESET? > >> We wanted to rely on DC to internally notify DM when DRM changes would do >> this, but DM actually requires this logic as well to know when to use a fast >> path vs a full programming path to recreate planes/streams based on the new >> DRM state to pass into validation. >> >> State updates will change to be formed from a delta of the old/new plane >> state, but the new one can be discarded if not needed. >> >> Any update that requires clock/bandwidth changes will have to add all the >> CRTCs and stall for any fast updates to complete first. This is because they >> could potentially reshuffle around the pipes as well, but these updates >> happen infrequently enough that the stall isn't too bad here. >> >> DC state unfortunately still does need to exist due to requirements on >> hardware resources/pipe splitting that don't fit nicely into the DRM >> infrastructure. It's really hard to shift everything over into the DRM >> infrastructure as well because of the DKMS problem we chatted about briefly >> last year at XDC. > > Uh this is awkward, holding up upstream because of downstream kernels ... > > Can't you fix this with a lot more glue in the downstream kernels, stuff > like copying the entire atomic helpers into your driver when there's new > stuff? > > For the multi-pipe stuff, how other drivers handle this is by internally > remapping userspace visible crtc/plane objects to underlying hw objects. > And then if you have remapping going on you add the userspace state > structs for all underlying remmapped crtc/plane in use by the current > update. That should be enough to force just enough synchronization. > > Then in your hw commit functions you simple iterate over all the states in > your update, as if you'd iterate over streams directly. So example: > > struct amdgpu_crtc_state { > struct drm_crtc_state base; > struct dm_stream_mapping_state mapping; > /* this crtc might not be using this stream! */ > struct dm_stream_state stream; > }; > > I think msm works like this, but there's also other drivers. > > When you have to change the mapping then you grab the global mapping > private state, but in any other cases you use the read-only copy in the > crtc state. And the global state is only for book-keeping, so no sync > needed (aside from the sync provided by adding the crtc states for each > stream you touch). > > Ofc might have gotten the stream lingo wrong, but this is roughly how to > do this in atomic. > >> I'd really like to tackle a third step as well at some point, and that's >> cleaning up our IRQ management. Our interrupt handlers unfortunately access >> DRM state directly (since it's so easy to do) and thus introduce a >> requirement that it doesn't get changed while these are still enabled. This >> requires us to introduce our own stall checks in atomic_check and perform >> the interrupt disable in commit before the state swap. > > Yeah don't do that :-) It might work if you guarantee that the atomic > commit_tail is waiting for all your irq handlers to complete, plus use rcu > dereferencing on these pointers. > > Copying the relevant bits over should be much nicer imo, also passing > explicit pointers at least. I.e. if you don't want to copy, have a > dedicated pointer protected by irqsave spin_lock that you share with the > interrupt handler. Stopping interrupt handlers before swap_state isn't > really how this should work. > >> The fix for this one isn't too bad, but it's tedious - copying all the state >> we need to the interrupt handlers before enabling them and letting them >> continue to work off of that state. This way we can remove the stall from >> atomic_check and actually disable/enable interrupts from commit_tail like we >> should be doing. > > Yup. I think you can have some pointers to specific state, _iff_ you make > sure the commit_tail waits for all the interrupt handlers to complete > somewhere (depending upon how this all works). But copying is probably > simpler to understand - interrupt races are tricky. >> >>> >>> See also my dma-fence annotation fixup patch, there dc_state also gets >>> in the way: >>> >>> https://lore.kernel.org/dri-devel/20200707201229.472834-21-daniel.vetter@ffwll.ch/ >>> >>> Nicholas, btw I'm still waiting for some dc feedback on that entire >>> series, and what/if there's plans to fix these issues properly. >>> >>> Maybe even going back to the subclassed drm_atomic_state might be >>> better than what we currently have. >>> -Daniel >> >> I've taken a look at that series but forgot to ACK. While this isn't the >> same thread for it, you can have my: >> >> Reviewed-by: Nicholas Kazlauskas >> >> ...on the DC/DM bits. Everything you've identified there is correct and it's >> something I'd really like to get around to taking a look at by the end of >> the year, hopefully. >> >> State allocations will be solved by the DM state allocation rework and the >> tiling flags thing needs to be solved by storing those in atomic_check >> instead on the plane. >> >> Regards, >> Nicholas Kazlauskas >> >>>> >>>> [1] https://bugzilla.kernel.org/show_bug.cgi?id=207383#c96 >>>> >>>> Thanks, >>>> Mazin Rezk >>>> >>>>> >>>>> Cheers, Daniel >>>>> >>>>>> >>>>>> Regards, >>>>>> Christian. >>>>>> >>>>>>> >>>>>>> Regards, >>>>>>> Nicholas Kazlauskas >>>>>>> >>>>>>>> >>>>>>>>> >>>>>>>>> Since this bug has only been spotted with fast commits, this patch >>>>>>>>> fixes >>>>>>>>> the bug by clearing the dm_state instead of using the old dc_state for >>>>>>>>> fast updates. In addition, since dm_state is only used for its dc_state >>>>>>>>> and amdgpu_dm_atomic_commit_tail will retain the dc_state if none is >>>>>>>>> found, >>>>>>>>> removing the dm_state should not have any consequences in fast updates. >>>>>>>>> >>>>>>>>> This use-after-free bug has existed for a while now, but only caused a >>>>>>>>> noticeable issue starting from 5.7-rc1 due to 3202fa62f ("slub: >>>>>>>>> relocate >>>>>>>>> freelist pointer to middle of object") moving the freelist pointer from >>>>>>>>> dm_state->base (which was unused) to dm_state->context (which is >>>>>>>>> dereferenced). >>>>>>>>> >>>>>>>>> Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=207383 >>>>>>>>> Fixes: bd200d190f45 ("drm/amd/display: Don't replace the dc_state >>>>>>>>> for fast updates") >>>>>>>>> Reported-by: Duncan <1i5t5.duncan@cox.net> >>>>>>>>> Signed-off-by: Mazin Rezk I think this patch is OK to merge for now based on the discussion in this thread and the other one. It's better than hitting a page fault at the very least and it's not a very intrusive change. I'd say I'm about halfway through development on a proper fix for this pending no IGT failures at least. So for now, Reviewed-by: Nicholas Kazlauskas >>>>>>>>> --- >>>>>>>>> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 36 >>>>>>>>> ++++++++++++++----- >>>>>>>>> 1 file changed, 27 insertions(+), 9 deletions(-) >>>>>>>>> >>>>>>>>> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c >>>>>>>>> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c >>>>>>>>> index 86ffa0c2880f..710edc70e37e 100644 >>>>>>>>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c >>>>>>>>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c >>>>>>>>> @@ -8717,20 +8717,38 @@ static int amdgpu_dm_atomic_check(struct >>>>>>>>> drm_device *dev, >>>>>>>>> * the same resource. If we have a new DC context as part of >>>>>>>>> * the DM atomic state from validation we need to free it and >>>>>>>>> * retain the existing one instead. >>>>>>>>> + * >>>>>>>>> + * Furthermore, since the DM atomic state only contains the DC >>>>>>>>> + * context and can safely be annulled, we can free the state >>>>>>>>> + * and clear the associated private object now to free >>>>>>>>> + * some memory and avoid a possible use-after-free later. >>>>>>>>> */ >>>>>>>>> - struct dm_atomic_state *new_dm_state, *old_dm_state; >>>>>>>>> >>>>>>>>> - new_dm_state = dm_atomic_get_new_state(state); >>>>>>>>> - old_dm_state = dm_atomic_get_old_state(state); >>>>>>>>> + for (i = 0; i < state->num_private_objs; i++) { >>>>>>>>> + struct drm_private_obj *obj = state->private_objs[i].ptr; >>>>>>>>> >>>>>>>>> - if (new_dm_state && old_dm_state) { >>>>>>>>> - if (new_dm_state->context) >>>>>>>>> - dc_release_state(new_dm_state->context); >>>>>>>>> + if (obj->funcs == adev->dm.atomic_obj.funcs) { >>>>>>>>> + int j = state->num_private_objs-1; >>>>>>>>> >>>>>>>>> - new_dm_state->context = old_dm_state->context; >>>>>>>>> + dm_atomic_destroy_state(obj, >>>>>>>>> + state->private_objs[i].state); >>>>>>>>> + >>>>>>>>> + /* If i is not at the end of the array then the >>>>>>>>> + * last element needs to be moved to where i was >>>>>>>>> + * before the array can safely be truncated. >>>>>>>>> + */ >>>>>>>>> + if (i != j) >>>>>>>>> + state->private_objs[i] = >>>>>>>>> + state->private_objs[j]; >>>>>>>>> >>>>>>>>> - if (old_dm_state->context) >>>>>>>>> - dc_retain_state(old_dm_state->context); >>>>>>>>> + state->private_objs[j].ptr = NULL; >>>>>>>>> + state->private_objs[j].state = NULL; >>>>>>>>> + state->private_objs[j].old_state = NULL; >>>>>>>>> + state->private_objs[j].new_state = NULL; >>>>>>>>> + >>>>>>>>> + state->num_private_objs = j; >>>>>>>>> + break; >>>>>>>>> + } >>>>>>>>> } >>>>>>>>> } >>>>>>>>> >>>>>>>>> -- >>>>>>>>> 2.27.0 >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> dri-devel mailing list >>>>>> dri-devel@lists.freedesktop.org >>>>>> https://lists.freedesktop.org/mailman/listinfo/dri-devel >>>>> >>>>> >>>>> >>>>> -- >>>>> Daniel Vetter >>>>> Software Engineer, Intel Corporation >>>>> http://blog.ffwll.ch/ >>> >>> >>> >> > 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=-12.1 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER,NICE_REPLY_A,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 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 35D35C433DF for ; Wed, 29 Jul 2020 16:49:19 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 E94FD20809 for ; Wed, 29 Jul 2020 16:49:18 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=amdcloud.onmicrosoft.com header.i=@amdcloud.onmicrosoft.com header.b="Sgijbca9" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E94FD20809 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=amd.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 56E596E58A; Wed, 29 Jul 2020 16:49:18 +0000 (UTC) Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2064.outbound.protection.outlook.com [40.107.236.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4E3246E58A; Wed, 29 Jul 2020 16:49:17 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ahFgotyxPZf0ayeFHiN0PwVgnHHlfu2XWoeLJyepI01bxp4VUzsussMdTdHOf9Y2ktWExUQSxu1GPJF3mDdCet4XBFnLSx/3f04HQZTPdVfakpJTbzBmTMHGGBgQVWcGC90IMKIbl4DTlyjorZSEXc+KIaWmuDJZKIxXCQaPprlQ/t7lDTdsHZ8MwAALu/4QAQ+LRzQcCY0lPX+iRn1r2cgBOkNLKawYrE8yTY42BL6ahi6UwWr4Vp73vcARMo3oOVrr8J0sddYxm4E/6HIWCjzGG4su8H8GhhHjc6aSZ9lLcb+pSaRN8Uax/PSXB31a9Qj+/0i6y+LYzqG/WAW7Ag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5+jHWN5OlccZjSfNvqX1/2mYd2T2MXxqlV+fyfztD4Q=; b=iAMauG70Ky+ujG4IIflkGTSAqU2XlwwxjHmih2DYy39jFKKC7SV4XqcfyxPOwMIx3umuVw6eoF/dGF8Ob3Yyk8wKB6MmVYLBJoSKzoYAlpGST9FYJUoTBeNG6lznySnq6lAoIL4jTwnH7pgBAQhBLIm+V2K4tLGsjTavD+D9SUXO3vtWVQBeBiWCnTFJwChoMQw4eVLj2maccKA7NORhUv4uv4I0CfoE79FMveittt2nAh+Z9MUHcyR0wTju1cHL1n7pKMrQ0Pf18CEBYEkasTKm23XUE9/2uBVJuxh03bIHPqS9IcMK4OyCWHlyUJAsKrLKcXRjiXXdeE02vV5wGg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector2-amdcloud-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5+jHWN5OlccZjSfNvqX1/2mYd2T2MXxqlV+fyfztD4Q=; b=Sgijbca9BSns7usREcwESEWQi65dUVxBqkoU7k47UxodVmYj9/t2QlMy5MejI9XJdzNhV1C+VEloe618A6o6i9M/xcADzR/8naWuRga8fdbjs5AVeH9GFayQOalSPxjd4yJGiyo8g65kcNyaVThMOkxa81CS40u3kuBgY9VSPz8= Authentication-Results: yahoo.com.br; dkim=none (message not signed) header.d=none;yahoo.com.br; dmarc=none action=none header.from=amd.com; Received: from BYAPR12MB3560.namprd12.prod.outlook.com (2603:10b6:a03:ae::10) by BY5PR12MB4275.namprd12.prod.outlook.com (2603:10b6:a03:20a::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3239.16; Wed, 29 Jul 2020 16:49:14 +0000 Received: from BYAPR12MB3560.namprd12.prod.outlook.com ([fe80::7d42:c932:e35f:71b1]) by BYAPR12MB3560.namprd12.prod.outlook.com ([fe80::7d42:c932:e35f:71b1%7]) with mapi id 15.20.3216.034; Wed, 29 Jul 2020 16:49:14 +0000 Subject: Re: [PATCH] drm/amd/display: Clear dm_state for fast updates To: Mazin Rezk , =?UTF-8?Q?Christian_K=c3=b6nig?= , "linux-kernel@vger.kernel.org" , "amd-gfx@lists.freedesktop.org" , "dri-devel@lists.freedesktop.org" , Paul Menzel , "anthony.ruhier@gmail.com" , Duncan <1i5t5.duncan@cox.net>, Kees Cook , "sunpeng.li@amd.com" , "regressions@leemhuis.info" , Alexander Deucher , Andrew Morton , "mphantomx@yahoo.com.br" References: <3b7e3e50-2ff7-eff3-2ffc-abaa4b36ce7f@amd.com> <20200728090855.GZ6419@phenom.ffwll.local> From: "Kazlauskas, Nicholas" Message-ID: <18d6a40d-0c7e-fbce-376d-ce468955d4b8@amd.com> Date: Wed, 29 Jul 2020 12:49:10 -0400 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 In-Reply-To: <20200728090855.GZ6419@phenom.ffwll.local> Content-Language: en-US X-ClientProxiedBy: YTXPR0101CA0038.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b00:1::15) To BYAPR12MB3560.namprd12.prod.outlook.com (2603:10b6:a03:ae::10) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [172.31.148.234] (165.204.55.211) by YTXPR0101CA0038.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b00:1::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3239.16 via Frontend Transport; Wed, 29 Jul 2020 16:49:12 +0000 X-Originating-IP: [165.204.55.211] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: b7d97f04-33bd-49a2-d2d6-08d833df5378 X-MS-TrafficTypeDiagnostic: BY5PR12MB4275: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: N5DteoiKxEU2QYWEHIiP8h0bQMNFo7KTHGt2AMlWEJ0d3yTDsl6ULO+z8YCRsS4StUlMJ4IEGbeur/A6ix+dValbNJttQKuN/fb4MDKkVz1Zf2yE0oA6nVa2R+xm+u6VEK2GgZf8akWgb+V2rkZ7kO9yv3vwlTeyvJRyoLU67x22oQ/F54ol88Oe9qXlZh6UM2ZWfZ006Cm2uf8LmMnym3BtEOfU8oWVQ8hqVgnMCU9+VtwDAGgonhMNcS/u09mmymj1WdIFOurBf0LR3HWOZIzu4qQ6WeYdzoaFmmU5mVOt7lJDwkIhBz6ziG+npR4iiKyWtEPYW5rDnHQtwZErfK1S23Zv1CDTsXDq9wgqkHHvpyaLJFPDn+/e499fc42OPUL12eA5QOcfSnmEkvJbD4PVSsrlVl+DM7+yzdzMTp9Rks/Z7HCJJw4k5Wu0wH4TpKCldzHt95Lf5JoviScfFORTkWVQ5Gl4rpHjaSC8/ak= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:BYAPR12MB3560.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(39860400002)(376002)(366004)(396003)(136003)(346002)(8936002)(966005)(31686004)(66574015)(53546011)(31696002)(8676002)(6486002)(26005)(316002)(36756003)(16526019)(110136005)(186003)(7416002)(83380400001)(52116002)(15650500001)(2616005)(86362001)(66946007)(30864003)(83080400001)(16576012)(66556008)(5660300002)(478600001)(956004)(66476007)(2906002)(921003)(43740500002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: hhJjmL37s53yvAB5KAEunxVSaXoTLorGZHZ5HEwHcdLSv7YGPgwFcBWtYvrhRZoCH8EIBDva28ZO7Fo54dZNYxQkdgyGWeS5fhVtQ0iy050Ph3GnFAqxeC60hQ3tmBYFBZUnZHFfOo2mbY9/Y/1VhImC9R2UGy0e2YVjRRtzW6WreE4N5Dxe2LB781IbzezFckR4Xgd4mzX+Itw7n0WnMt3AeMm7MzxegpyoonyFR4mwieHIiWJ9Mg0vUOiT6VaSUaaPeLiicatG0iX/N6dzOkNIbSuoV2edeoVcno2M6D/w3dUc9gIOFQ7QpYOdMmOMdhy9pgj9H0EReQR3I8n1dD0rrcqblwdFazuCHKZE3mY9QJ5lk56tQCrFfcVLlM0xFEP9NX1flrXmJEPggbfpyN+aZD3mJFm3Wx7lbqUEQ5MZ5q24bjO5Yy4IxtMSZvyDB14aTs0MvYTe2uYvmRLRDxvPuSCJRAOvfMYORKsNgZ+wJdcqck0BqTw8Gha1wRPYJu16+PqmAwsnp5TjKjVylln0w+4mKPyNxrsUG8LJ5dE4uCjkZvpD2HWALyyGT2rt5qF1jz4L+ozI4uiIS4GjmODdTbS/bV4x12U2iXSeTf1Ys0EUgRM4s+fRBc/Ui9ToxgoPGZBqBKJbT5iCfhum+g== X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: b7d97f04-33bd-49a2-d2d6-08d833df5378 X-MS-Exchange-CrossTenant-AuthSource: BYAPR12MB3560.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jul 2020 16:49:14.7054 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: faJtbtELsai8BgdGC5qCkHfUYRMl1bYXlQTiG4NJlFqi1Y/Y6DLlNktoJRqjh0X/XaPjAy3aWBut0wikPLCWLg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR12MB4275 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" T24gMjAyMC0wNy0yOCA1OjA4IGEubS4sIGRhbmllbEBmZndsbC5jaCB3cm90ZToKPiBPbiBNb24s IEp1bCAyNywgMjAyMCBhdCAxMDo0OTo0OFBNIC0wNDAwLCBLYXpsYXVza2FzLCBOaWNob2xhcyB3 cm90ZToKPj4gT24gMjAyMC0wNy0yNyA1OjMyIHAubS4sIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4+ PiBPbiBNb24sIEp1bCAyNywgMjAyMCBhdCAxMToxMSBQTSBNYXppbiBSZXprIDxtbnJ6a0Bwcm90 b25tYWlsLmNvbT4gd3JvdGU6Cj4+Pj4KPj4+PiBPbiBNb25kYXksIEp1bHkgMjcsIDIwMjAgNDoy OSBQTSwgRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZmd2xsLmNoPiB3cm90ZToKPj4+Pgo+Pj4+PiBP biBNb24sIEp1bCAyNywgMjAyMCBhdCA5OjI4IFBNIENocmlzdGlhbiBLw7ZuaWcKPj4+Pj4gPGNo cmlzdGlhbi5rb2VuaWdAYW1kLmNvbT4gd3JvdGU6Cj4+Pj4+Pgo+Pj4+Pj4gQW0gMjcuMDcuMjAg dW0gMTY6MDUgc2NocmllYiBLYXpsYXVza2FzLCBOaWNob2xhczoKPj4+Pj4+PiBPbiAyMDIwLTA3 LTI3IDk6MzkgYS5tLiwgQ2hyaXN0aWFuIEvDtm5pZyB3cm90ZToKPj4+Pj4+Pj4gQW0gMjcuMDcu MjAgdW0gMDc6NDAgc2NocmllYiBNYXppbiBSZXprOgo+Pj4+Pj4+Pj4gVGhpcyBwYXRjaCBmaXhl cyBhIHJhY2UgY29uZGl0aW9uIHRoYXQgY2F1c2VzIGEgdXNlLWFmdGVyLWZyZWUgZHVyaW5nCj4+ Pj4+Pj4+PiBhbWRncHVfZG1fYXRvbWljX2NvbW1pdF90YWlsLiBUaGlzIGNhbiBvY2N1ciB3aGVu IDIgbm9uLWJsb2NraW5nCj4+Pj4+Pj4+PiBjb21taXRzCj4+Pj4+Pj4+PiBhcmUgcmVxdWVzdGVk IGFuZCB0aGUgc2Vjb25kIG9uZSBmaW5pc2hlcyBiZWZvcmUgdGhlIGZpcnN0Lgo+Pj4+Pj4+Pj4g RXNzZW50aWFsbHksCj4+Pj4+Pj4+PiB0aGlzIGJ1ZyBvY2N1cnMgd2hlbiB0aGUgZm9sbG93aW5n IHNlcXVlbmNlIG9mIGV2ZW50cyBoYXBwZW5zOgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IDEuIE5vbi1i bG9ja2luZyBjb21taXQgIzEgaXMgcmVxdWVzdGVkIHcvIGEgbmV3IGRtX3N0YXRlICMxIGFuZCBp cwo+Pj4+Pj4+Pj4gZGVmZXJyZWQgdG8gdGhlIHdvcmtxdWV1ZS4KPj4+Pj4+Pj4+Cj4+Pj4+Pj4+ PiAyLiBOb24tYmxvY2tpbmcgY29tbWl0ICMyIGlzIHJlcXVlc3RlZCB3LyBhIG5ldyBkbV9zdGF0 ZSAjMiBhbmQgaXMKPj4+Pj4+Pj4+IGRlZmVycmVkIHRvIHRoZSB3b3JrcXVldWUuCj4+Pj4+Pj4+ Pgo+Pj4+Pj4+Pj4gMy4gQ29tbWl0ICMyIHN0YXJ0cyBiZWZvcmUgY29tbWl0ICMxLCBkbV9zdGF0 ZSAjMSBpcyB1c2VkIGluIHRoZQo+Pj4+Pj4+Pj4gY29tbWl0X3RhaWwgYW5kIGNvbW1pdCAjMiBj b21wbGV0ZXMsIGZyZWVpbmcgZG1fc3RhdGUgIzEuCj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4gNC4gQ29t bWl0ICMxIHN0YXJ0cyBhZnRlciBjb21taXQgIzIgY29tcGxldGVzLCB1c2VzIHRoZSBmcmVlZCBk bV9zdGF0ZQo+Pj4+Pj4+Pj4gMSBhbmQgZGVyZWZlcmVuY2VzIGEgZnJlZWxpc3QgcG9pbnRlciB3 aGlsZSBzZXR0aW5nIHRoZSBjb250ZXh0Lgo+Pj4+Pj4+Pgo+Pj4+Pj4+PiBXZWxsIEkgb25seSBo YXZlIGEgb25lIG1pbGUgaGlnaCB2aWV3IG9uIHRoaXMsIGJ1dCB3aHkgZG9uJ3QgeW91IGxldAo+ Pj4+Pj4+PiB0aGUgd29yayBpdGVtcyBleGVjdXRlIGluIG9yZGVyPwo+Pj4+Pj4+Pgo+Pj4+Pj4+ PiBUaGF0IHdvdWxkIGJlIGJldHRlciBhbnl3YXkgY2F1c2UgdGhpcyB3YXkgd2UgZG9uJ3QgdHJp Z2dlciBhIGNhY2hlCj4+Pj4+Pj4+IGxpbmUgcGluZyBwb25nIGJldHdlZW4gQ1BVcy4KPj4+Pj4+ Pj4KPj4+Pj4+Pj4gQ2hyaXN0aWFuLgo+Pj4+Pj4+Cj4+Pj4+Pj4gV2UgdXNlIHRoZSBEUk0gaGVs cGVycyBmb3IgbWFuYWdpbmcgZHJtX2F0b21pY19jb21taXRfc3RhdGUgYW5kIHRob3NlCj4+Pj4+ Pj4gaGVscGVycyBpbnRlcm5hbGx5IHB1c2ggbm9uLWJsb2NraW5nIGNvbW1pdCB3b3JrIGludG8g dGhlIHN5c3RlbQo+Pj4+Pj4+IHVuYm91bmQgd29yayBxdWV1ZS4KPj4+Pj4+Cj4+Pj4+PiBNaG0s IHdlbGwgaWYgeW91IHNlbmQgdGhvc2UgaGVscGVyIGF0b21pYyBjb21taXRzIGluIHRoZSBvcmRl ciBBLEIgYW5kCj4+Pj4+PiB0aGV5IGV4ZWN1dGUgaXQgaW4gdGhlIG9yZGVyIEIsQSBJIHdvdWxk IGNhbGwgdGhhdCBhIGJ1ZyA6KQo+Pj4+Pgo+Pj4+PiBUaGUgd2F5IGl0IHdvcmtzIGlzIGl0IHB1 c2hlcyBhbGwgY29tbWl0cyBpbnRvIHVuYm91bmQgd29yayBxdWV1ZSwgYnV0Cj4+Pj4+IHRoZW4g Zm9yY2VzIHNlcmlhbGl6YXRpb24gYXMgbmVlZGVkLiBXZSBkbyBfbm90XyB3YW50IGUuZy4gdXBk YXRlcyBvbgo+Pj4+PiBkaWZmZXJlbnQgQ1JUQyB0byBiZSBzZXJpYWxpemVkLCB0aGF0IHdvdWxk IHJlc3VsdCBpbiBsb3RzIG9mIGp1ZGRlci4KPj4+Pj4gQW5kIGh3IGlzIGZ1bm55IGVub3VnaCB0 aGF0IHRoZXJlJ3MgYWxsIGtpbmRzIG9mIGRlcGVuZGVuY2llcy4KPj4+Pj4KPj4+Pj4gVGhlIHdh eSB5b3UgZm9yY2Ugc3luY2hyb25pemF0aW9uIGlzIGJ5IGFkZGluZyBvdGhlciBDUlRDIHN0YXRl Cj4+Pj4+IG9iamVjdHMuIFNvIGlmIERDIGlzIGJ1c3RlZCBhbmQgY2FuIG9ubHkgaGFuZGxlIGEg c2luZ2xlIHVwZGF0ZSBwZXIKPj4+Pj4gd29yayBpdGVtLCB0aGVuIEkgZ3Vlc3MgeW91IGFsd2F5 cyBuZWVkIGFsbCBDUlRDIHN0YXRlcyBhbmQgZXZlcnl0aGluZwo+Pj4+PiB3aWxsIGJlIHJ1biBp biBvcmRlci4gQnV0IHRoYXQgYWxzbyB0b3RhbGx5IGtpbGxzIG1vZGVybiBtdWx0aS1zY3JlZW4K Pj4+Pj4gY29tcG9zaXRvcnMuIFhvcmcgaXNuJ3QgbW9kZXJuLCBqdXN0IGluIGNhc2UgdGhhdCdz IG5vdCBjbGVhciA6LSkKPj4+Pj4KPj4+Pj4gTHVja2luZyBhdCB0aGUgY29kZSBpdCBzZWVtcyBs aWtlIHlvdSBpbmRlZWQgaGF2ZSBvbmx5IGEgc2luZ2xlIGRtCj4+Pj4+IHN0YXRlLCBzbyB5ZWFo IGdsb2JhbCBzeW5jIGlzIHdoYXQgeW91J2xsIG5lZWQgYXMgaW1tZWRpYXRlIGZpeCwgYW5kCj4+ Pj4+IHRoZW4gbWF5YmUgZml4IHVwIERNIHRvIG5vdCBiZSBxdWl0ZSBzbyBzaWxseSAuLi4gb3Ig YXQgbGVhc3Qgb25seSBkbwo+Pj4+PiB0aGUgZG0gc3RhdGUgc3R1ZmYgd2hlbiByZWFsbHkgbmVl ZGVkLgo+Pj4+Pgo+Pj4+PiBXZSBjb3VsZCBhbHNvIHNwcmlua2xlIHRoZSBkcm1fY3J0Y19jb21t aXQgc3RydWN0dXJlIGFyb3VuZCBhIGJpdAo+Pj4+PiAoaXQncyB0aGUgZ2x1ZSB0aGF0IHByb3Zp ZGVzIHRoZSBzeW5jaHJvbml6YXRpb24gYWNyb3NzIGNvbW1pdHMpLCBidXQKPj4+Pj4gc2luY2Ug eW91ciBkbSBzdGF0ZSBpcyBnbG9iYWwganVzdCBncmFiYmluZyBhbGwgY3J0YyBzdGF0ZXMKPj4+ Pj4gdW5jb25kaXRpb25hbGx5IGFzIHBhcnQgb2YgdGhhdCBpcyBwcm9iYWJseSBiZXN0Lgo+Pj4+ Pgo+Pj4+Pj4+IFdoaWxlIHdlIGNvdWxkIGR1cGxpY2F0ZSBhIGNvcHkgb2YgdGhhdCBjb2RlIHdp dGggbm90aGluZyBidXQgdGhlCj4+Pj4+Pj4gd29ya3F1ZXVlIGNoYW5nZWQgdGhhdCBpc24ndCBz b21ldGhpbmcgSSdkIHJlYWxseSBsaWtlIHRvIG1haW50YWluCj4+Pj4+Pj4gZ29pbmcgZm9yd2Fy ZC4KPj4+Pj4+Cj4+Pj4+PiBJJ20gbm90IHRhbGtpbmcgYWJvdXQgZHVwbGljYXRpbmcgdGhlIGNv ZGUsIEknbSB0YWxraW5nIGFib3V0IGZpeGluZyB0aGUKPj4+Pj4+IGhlbHBlcnMuIEkgZG9uJ3Qg a25vdyB0aGF0IGNvZGUgd2VsbCwgYnV0IGZyb20gdGhlIG91dHNpZGUgaXQgc291bmRzCj4+Pj4+ PiBsaWtlIGEgYnVnIHRoZXJlLgo+Pj4+Pj4KPj4+Pj4+IEFuZCBleGVjdXRpbmcgd29yayBpdGVt cyBpbiB0aGUgb3JkZXIgdGhleSBhcmUgc3VibWl0dGVkIGlzIHRyaXZpYWwuCj4+Pj4+Pgo+Pj4+ Pj4gSGFkIGFueWJvZHkgcGluZ2VkIERhbmllbCBvciBvdGhlciBwZW9wbGUgZmFtaWxpYXIgd2l0 aCB0aGUgaGVscGVyIGNvZGUKPj4+Pj4+IGFib3V0IGl0Pwo+Pj4+Pgo+Pj4+PiBZZWFoIHNvbWV0 aGluZyBpcyB3cm9uZyBoZXJlLCBhbmQgdGhlIGZpeCBsb29rcyBob3JyaWJsZSA6LSkKPj4+Pj4K Pj4+Pj4gQXNpZGUsIEkndmUgYWxzbyBzZWVuIHNvbWUgcmVjZW50IGRpc2N1c3Npb24gZmxhcmUg dXAgYWJvdXQKPj4+Pj4gZHJtX2F0b21pY19zdGF0ZV9nZXQvcHV0IHVzZWQgdG8gcGFwZXIgb3Zl ciBzb21lIG90aGVyIHVzZS1hZnRlci1mcmVlLAo+Pj4+PiBidXQgdGhpcyB0aW1lIHJlbGF0ZWQg dG8gaW50ZXJydXB0IGhhbmRsZXJzLiBNYXliZSBhIGZldyBydWxlcyBhYm91dAo+Pj4+PiB0aGF0 Ogo+Pj4+PiAtIGRvbnQKPj4+Pj4gLSBlc3BlY2lhbGx5IG5vdCB3aGVuIGl0J3MgaW50ZXJydXB0 IGhhbmRsZXJzLCBiZWNhdXNlIHlvdSBjYW4ndCBjYWxsCj4+Pj4+IGRybV9hdG9taWNfc3RhdGVf cHV0IGZyb20gaW50ZXJydXB0IGhhbmRsZXJzLgo+Pj4+Pgo+Pj4+PiBJbnN0ZWFkIGhhdmUgYW4g c3Bpbl9sb2NrX2lycSB0byBwcm90ZWN0IHRoZSBzaGFyZWQgZGF0ZSB3aXRoIHlvdXIKPj4+Pj4g aW50ZXJydXB0IGhhbmRsZXIsIGFuZCBfY29weV8gdGhlIGRhdGUgb3Zlci4gVGhpcyBpcyBlLmcu IHdoYXQKPj4+Pj4gZHJtX2NydGNfYXJtX3ZibGFua19ldmVudCBkb2VzLgo+Pj4+Cj4+Pj4gTmlj aG9sYXMgd3JvdGUgYSBwYXRjaCB0aGF0IGF0dGVtcHRlZCB0byByZXNvbHZlIHRoZSBpc3N1ZSBi eSBhZGRpbmcgZXZlcnkKPj4+PiBDUlRDIGludG8gdGhlIGNvbW1pdCB0byB1c2UgdXNlIHRoZSBz dGFsbCBjaGVja3MuIFsxXSBXaGlsZSB0aGlzIGZvcmNlcwo+Pj4+IHN5bmNocm9uaXNhdGlvbiBv biBjb21taXRzLCBpdCdzIGtpbmQgb2YgYSBoYWNreSBtZXRob2QgdGhhdCBtYXkgdGFrZSBhCj4+ Pj4gdG9sbCBvbiBwZXJmb3JtYW5jZS4KPj4+Pgo+Pj4+IElzIGl0IHBvc3NpYmxlIHRvIGhhdmUg YSBEUk0gaGVscGVyIHRoYXQgZm9yY2VzIHN5bmNocm9uaXNhdGlvbiBvbiBzb21lCj4+Pj4gY29t bWl0cyB3aXRob3V0IGhhdmluZyB0byBhZGQgZXZlcnkgQ1JUQyBpbnRvIHRoZSBjb21taXQ/Cj4+ Pj4KPj4+PiBBbHNvLCBpcyBzeW5jaHJvbmlzYXRpb24gcmVhbGx5IG5lY2Vzc2FyeSBmb3IgZmFz dCB1cGRhdGVzIGluIGFtZGdwdT8KPj4+PiBJJ2xsIGFkbWl0LCB0aGUgaWRlYSBvZiBlbGltaW5h dGluZyB0aGUgdXNlLWFmdGVyLWZyZWUgYnVnIGJ5IGVsaW1pbmF0aW5nCj4+Pj4gdGhlIHVzZSBl bnRpcmVseSBkb2Vzbid0IHNlZW0gaWRlYWw7IGJ1dCBpcyBmb3JjaW5nIHN5bmNocm9uaXNhdGlv biBvbgo+Pj4+IHRoZXNlIHVwZGF0ZXMgdGhhdCBtdWNoIGJldHRlcj8KPj4+Cj4+PiBXZWxsIGNs ZWFyaW5nIHRoZSBkY19zdGF0ZSBwb2ludGVyIGhlcmUgYW5kIHRoZW4gYWxsb2NhdGluZyBhbm90 aGVyCj4+PiBvbmUgaW4gYXRvbWljX2NvbW1pdF90YWlsIGFsc28gbG9va3MgZmlzaHkuIFRoZSBw cm9wZXIgZml4IGlzIHByb2JhYmx5Cj4+PiBhIGxvdCBtb3JlIGludm9sdmVkLCBidXQgeWVhaCBp bnRlcmltIGZpeCBpcyB0byBncmFiIGFsbCBjcnRjIHN0YXRlcwo+Pj4gaWZmIHlvdSBhbHNvIGdy YWJiZWQgdGhlIGRtX2F0b21pY19zdGF0ZSBzdHJ1Y3R1cmUuIFJlYWwgZml4IGlzIHRvCj4+PiBv bmx5IGRvIHRoaXMgd2hlbiBuZWNlc3NhcnksIHdoaWNoIHByZXR0eSBtdWNoIG1lYW5zIHRoZSBk Y19zdGF0ZQo+Pj4gbmVlZHMgdG8gYmUgc29tZWhvdyBzcGxpdCB1cCwgb3IgdGhlcmUgbmVlZHMg dG8gYmUgc29tZSBndWFyYW50ZWVzCj4+PiBhYm91dCB3aGVuIGl0J3MgbmVjZXNzYXJ5IGFuZCB3 aGVuIG5vdC4gT3RoZXJ3aXNlIHBhcmFsbGVsIGNvbW1pdHMgb24KPj4+IGRpZmZlcmVudCBDUlRD IGFyZSBub3QgcG9zc2libGUgd2l0aCB0aGUgY3VycmVudCBkYyBiYWNrZW5kIGNvZGUuCj4+Cj4+ IFRoYW5rcyBmb3Igc3BlbmRpbmcgc29tZSB0aW1lIHRvIGhlbHAgdGFrZSBhIGxvb2sgYXQgdGhp cyBhcyB3ZWxsLgo+Pgo+PiBUaGUgRFJNIGRvY3VtZW50YXRpb24gKGF0IGxlYXN0IGF0IHRoZSB0 aW1lKSBzZWVtZWQgdG8gaW1wbHkgdGhhdAo+PiBzdWJjbGFzc2luZyBEUk0gcHJpdmF0ZSBzdGF0 ZSB3YXMgZm9yIGxlZ2FjeSB1c2FnZSBvbmx5IGFuZCBEUk0gd2FudGVkIHRvCj4+IG1vdmUgYXdh eSBmcm9tIGl0LiBEUk0gcHJpdmF0ZSBvYmplY3RzIHNlZW1lZCB0byBmaXQgYXMgdGhlIG5pY2Vy IGF0b21pYwo+PiBtZXRob2QgZm9yIGhhbmRsaW5nIHRoaXMgc2luY2UgdGhleSBoYXZlIG9sZC9u ZXcsIGJ1dCBhcyB5b3UgY2FuIGd1ZXNzIGZyb20KPj4gdGhpcyBpc3N1ZSBpdCdzIGEgbWVzcyAo ZnJvbSBvdXIgZW5kKS4KPiAKPiBZZWFoLCBpZiBpdCdzIGFjdHVhbCBzdGF0ZSB5b3UgcHV0IGlu IHRoZXJlLiBCdXQgdGhpcyBkY19zdGF0ZSBzdHJ1Y3R1cmUKPiBpcyBtb3JlIGxpa2UgYSBjb250 YWluZXIgb2Ygc3RhdGUgcG9pbnRlcnMsIGxpa2UgZHJtX2F0b21pY19zdGF0ZS4gSXQncwo+IG5v dCAxMDAlIGNsZWFyLWN1dCwgZS5nLiB0aGUgYncgc3R1ZmYgaXMgbW9yZSBsaWtlIGEgcmVhbCBz dGF0ZSBvYmplY3QgSQo+IGd1ZXNzLCBvciBtYXliZSBpdCdzIGp1c3QgdGVtcG9yYXJ5IHN0b3Jh Z2UgZm9yIGNvbXB1dGF0aW9uIHJlc3VsdHM/Cj4gCj4+IFRoZSBmaXJzdCBzdGVwIHRvIGZpeGlu ZyB0aGlzIGlzIGdvaW5nIGJhY2sgdG8gc3ViY2xhc3NpbmcgRFJNIHN0YXRlLgo+Pgo+PiBJdCdz IGFjdHVhbGx5IHRoZSByaWdodCB0b29sIGZvciB0aGUgam9iIGZvciBhbGxvY2F0aW5nIHRlbXBv cmFyeSBzdGF0ZQo+PiBvdXRzaWRlIG9mIHRoZSBjb3JlIERSTSBvYmplY3RzLCBhbmQgd2UgbmVl ZCB0aGlzIHRvIGZvcm0gdGhlIERDIHN0YXRlCj4+IG9iamVjdCBhbmQgbmVjZXNzYXJ5IHN0cmVh bSB1cGRhdGUgYnVuZGxlcyB3aGljaCBtaWdodCBiZSB0b28gYmlnIHRvIGZpdCBvbgo+PiB0aGUg c3RhY2sgZm9yIGNvbW1pdCBjaGVjay9jb21taXQgdGFpbC4gV2UnbGwgYmUgYSBsb3QgY2xvc2Vy IHRvIGZpeGluZyB0aGUKPj4gbG9ja2RlcCBpc3N1ZXMgdGhpcyB3YXkgb25jZSB3ZSBnZXQgYXJv dW5kIHRvIGdldHRpbmcgcmlkIG9mIGFsbG9jYXRpb25zIGluCj4+IHRoZSBEQyBjb21taXQgcGF0 aHMuCj4gCj4gU28gb24gdGhlIHN0cmVhbSBidW5kbGVzIC4uLiB3aGVyZSBkbyB0aGVzZSBwb2lu dGVycyBwb2ludCB0bz8gQXJlIHRoZQo+IHN0cmVhbXMgdGhlbXNlbHZlcyBpbiB0aGUgY3J0Yy9w bGFuZSBzdGF0ZXM/Cj4gCj4+IFRoZSBzZWNvbmQgc3RlcCBpcyB0byBmaXggdmFsaWRhdGlvbiBp dHNlbGYuIFRoZSBvbGQgc3RhdGUgcmVxdWlyZW1lbnQgZm9yCj4+IGNoZWNraW5nIHN0cmVhbS9w bGFuZSB1cGRhdGVzIHdhcyBhY3R1YWxseSBhbiBlbnRpcmVseSBwb2ludGxlc3MgZW5kZWF2b3IK Pj4gc2luY2UgZGMgZ2xvYmFsIHZhbGlkYXRpb24gZG9lc24ndCBldmVyeSBsb29rIGF0IHVwZGF0 ZXMsIGp1c3QgdGhlIGZpbmFsCj4+IHN0YXRlIGZvciBhIHNldCBzdHJlYW1zL3BsYW5lcyAtIGl0 J3Mgc3RhdGVsZXNzLgo+IAo+IFVoLCBpcyB5b3VyIGh3IHRoYXQgZ29vZCwgaS5lLiB0aGVyZSdz IG5vIGltcG9zc2libGUgc3RhdGUgdHJhbnNpdGlvbnM/IE9yCj4gZG8geW91IHNpbXBseSBmb3Jj ZSBhIG1vZGVzZXQgaW4gc3VjaCBjYXNlcz8gSW4gd2hpY2ggY2FzZSwgYXJlIHRoZQo+IG1vZGVz ZXQgZmxhZ3MgY29ycmVjdGx5IHVwZGF0ZWQgc28gdGhhdCB1c2Vyc3BhY2UgY2FuIGNvbnRyb2wg dGhpcyB3aXRoCj4gQUxMT1dfTU9ERVNFVD8KPiAKPj4gV2Ugd2FudGVkIHRvIHJlbHkgb24gREMg dG8gaW50ZXJuYWxseSBub3RpZnkgRE0gd2hlbiBEUk0gY2hhbmdlcyB3b3VsZCBkbwo+PiB0aGlz LCBidXQgRE0gYWN0dWFsbHkgcmVxdWlyZXMgdGhpcyBsb2dpYyBhcyB3ZWxsIHRvIGtub3cgd2hl biB0byB1c2UgYSBmYXN0Cj4+IHBhdGggdnMgYSBmdWxsIHByb2dyYW1taW5nIHBhdGggdG8gcmVj cmVhdGUgcGxhbmVzL3N0cmVhbXMgYmFzZWQgb24gdGhlIG5ldwo+PiBEUk0gc3RhdGUgdG8gcGFz cyBpbnRvIHZhbGlkYXRpb24uCj4+Cj4+IFN0YXRlIHVwZGF0ZXMgd2lsbCBjaGFuZ2UgdG8gYmUg Zm9ybWVkIGZyb20gYSBkZWx0YSBvZiB0aGUgb2xkL25ldyBwbGFuZQo+PiBzdGF0ZSwgYnV0IHRo ZSBuZXcgb25lIGNhbiBiZSBkaXNjYXJkZWQgaWYgbm90IG5lZWRlZC4KPj4KPj4gQW55IHVwZGF0 ZSB0aGF0IHJlcXVpcmVzIGNsb2NrL2JhbmR3aWR0aCBjaGFuZ2VzIHdpbGwgaGF2ZSB0byBhZGQg YWxsIHRoZQo+PiBDUlRDcyBhbmQgc3RhbGwgZm9yIGFueSBmYXN0IHVwZGF0ZXMgdG8gY29tcGxl dGUgZmlyc3QuIFRoaXMgaXMgYmVjYXVzZSB0aGV5Cj4+IGNvdWxkIHBvdGVudGlhbGx5IHJlc2h1 ZmZsZSBhcm91bmQgdGhlIHBpcGVzIGFzIHdlbGwsIGJ1dCB0aGVzZSB1cGRhdGVzCj4+IGhhcHBl biBpbmZyZXF1ZW50bHkgZW5vdWdoIHRoYXQgdGhlIHN0YWxsIGlzbid0IHRvbyBiYWQgaGVyZS4K Pj4KPj4gREMgc3RhdGUgdW5mb3J0dW5hdGVseSBzdGlsbCBkb2VzIG5lZWQgdG8gZXhpc3QgZHVl IHRvIHJlcXVpcmVtZW50cyBvbgo+PiBoYXJkd2FyZSByZXNvdXJjZXMvcGlwZSBzcGxpdHRpbmcg dGhhdCBkb24ndCBmaXQgbmljZWx5IGludG8gdGhlIERSTQo+PiBpbmZyYXN0cnVjdHVyZS4gSXQn cyByZWFsbHkgaGFyZCB0byBzaGlmdCBldmVyeXRoaW5nIG92ZXIgaW50byB0aGUgRFJNCj4+IGlu ZnJhc3RydWN0dXJlIGFzIHdlbGwgYmVjYXVzZSBvZiB0aGUgREtNUyBwcm9ibGVtIHdlIGNoYXR0 ZWQgYWJvdXQgYnJpZWZseQo+PiBsYXN0IHllYXIgYXQgWERDLgo+IAo+IFVoIHRoaXMgaXMgYXdr d2FyZCwgaG9sZGluZyB1cCB1cHN0cmVhbSBiZWNhdXNlIG9mIGRvd25zdHJlYW0ga2VybmVscyAu Li4KPiAKPiBDYW4ndCB5b3UgZml4IHRoaXMgd2l0aCBhIGxvdCBtb3JlIGdsdWUgaW4gdGhlIGRv d25zdHJlYW0ga2VybmVscywgc3R1ZmYKPiBsaWtlIGNvcHlpbmcgdGhlIGVudGlyZSBhdG9taWMg aGVscGVycyBpbnRvIHlvdXIgZHJpdmVyIHdoZW4gdGhlcmUncyBuZXcKPiBzdHVmZj8KPiAKPiBG b3IgdGhlIG11bHRpLXBpcGUgc3R1ZmYsIGhvdyBvdGhlciBkcml2ZXJzIGhhbmRsZSB0aGlzIGlz IGJ5IGludGVybmFsbHkKPiByZW1hcHBpbmcgdXNlcnNwYWNlIHZpc2libGUgY3J0Yy9wbGFuZSBv YmplY3RzIHRvIHVuZGVybHlpbmcgaHcgb2JqZWN0cy4KPiBBbmQgdGhlbiBpZiB5b3UgaGF2ZSBy ZW1hcHBpbmcgZ29pbmcgb24geW91IGFkZCB0aGUgdXNlcnNwYWNlIHN0YXRlCj4gc3RydWN0cyBm b3IgYWxsIHVuZGVybHlpbmcgcmVtbWFwcGVkIGNydGMvcGxhbmUgaW4gdXNlIGJ5IHRoZSBjdXJy ZW50Cj4gdXBkYXRlLiBUaGF0IHNob3VsZCBiZSBlbm91Z2ggdG8gZm9yY2UganVzdCBlbm91Z2gg c3luY2hyb25pemF0aW9uLgo+IAo+IFRoZW4gaW4geW91ciBodyBjb21taXQgZnVuY3Rpb25zIHlv dSBzaW1wbGUgaXRlcmF0ZSBvdmVyIGFsbCB0aGUgc3RhdGVzIGluCj4geW91ciB1cGRhdGUsIGFz IGlmIHlvdSdkIGl0ZXJhdGUgb3ZlciBzdHJlYW1zIGRpcmVjdGx5LiBTbyBleGFtcGxlOgo+IAo+ IHN0cnVjdCBhbWRncHVfY3J0Y19zdGF0ZSB7Cj4gCXN0cnVjdCBkcm1fY3J0Y19zdGF0ZSBiYXNl Owo+IAlzdHJ1Y3QgZG1fc3RyZWFtX21hcHBpbmdfc3RhdGUgbWFwcGluZzsKPiAJLyogdGhpcyBj cnRjIG1pZ2h0IG5vdCBiZSB1c2luZyB0aGlzIHN0cmVhbSEgKi8KPiAJc3RydWN0IGRtX3N0cmVh bV9zdGF0ZSBzdHJlYW07Cj4gfTsKPiAKPiBJIHRoaW5rIG1zbSB3b3JrcyBsaWtlIHRoaXMsIGJ1 dCB0aGVyZSdzIGFsc28gb3RoZXIgZHJpdmVycy4KPiAKPiBXaGVuIHlvdSBoYXZlIHRvIGNoYW5n ZSB0aGUgbWFwcGluZyB0aGVuIHlvdSBncmFiIHRoZSBnbG9iYWwgbWFwcGluZwo+IHByaXZhdGUg c3RhdGUsIGJ1dCBpbiBhbnkgb3RoZXIgY2FzZXMgeW91IHVzZSB0aGUgcmVhZC1vbmx5IGNvcHkg aW4gdGhlCj4gY3J0YyBzdGF0ZS4gQW5kIHRoZSBnbG9iYWwgc3RhdGUgaXMgb25seSBmb3IgYm9v ay1rZWVwaW5nLCBzbyBubyBzeW5jCj4gbmVlZGVkIChhc2lkZSBmcm9tIHRoZSBzeW5jIHByb3Zp ZGVkIGJ5IGFkZGluZyB0aGUgY3J0YyBzdGF0ZXMgZm9yIGVhY2gKPiBzdHJlYW0geW91IHRvdWNo KS4KPiAKPiBPZmMgbWlnaHQgaGF2ZSBnb3R0ZW4gdGhlIHN0cmVhbSBsaW5nbyB3cm9uZywgYnV0 IHRoaXMgaXMgcm91Z2hseSBob3cgdG8KPiBkbyB0aGlzIGluIGF0b21pYy4KPiAKPj4gSSdkIHJl YWxseSBsaWtlIHRvIHRhY2tsZSBhIHRoaXJkIHN0ZXAgYXMgd2VsbCBhdCBzb21lIHBvaW50LCBh bmQgdGhhdCdzCj4+IGNsZWFuaW5nIHVwIG91ciBJUlEgbWFuYWdlbWVudC4gT3VyIGludGVycnVw dCBoYW5kbGVycyB1bmZvcnR1bmF0ZWx5IGFjY2Vzcwo+PiBEUk0gc3RhdGUgZGlyZWN0bHkgKHNp bmNlIGl0J3Mgc28gZWFzeSB0byBkbykgYW5kIHRodXMgaW50cm9kdWNlIGEKPj4gcmVxdWlyZW1l bnQgdGhhdCBpdCBkb2Vzbid0IGdldCBjaGFuZ2VkIHdoaWxlIHRoZXNlIGFyZSBzdGlsbCBlbmFi bGVkLiBUaGlzCj4+IHJlcXVpcmVzIHVzIHRvIGludHJvZHVjZSBvdXIgb3duIHN0YWxsIGNoZWNr cyBpbiBhdG9taWNfY2hlY2sgYW5kIHBlcmZvcm0KPj4gdGhlIGludGVycnVwdCBkaXNhYmxlIGlu IGNvbW1pdCBiZWZvcmUgdGhlIHN0YXRlIHN3YXAuCj4gCj4gWWVhaCBkb24ndCBkbyB0aGF0IDot KSBJdCBtaWdodCB3b3JrIGlmIHlvdSBndWFyYW50ZWUgdGhhdCB0aGUgYXRvbWljCj4gY29tbWl0 X3RhaWwgaXMgd2FpdGluZyBmb3IgYWxsIHlvdXIgaXJxIGhhbmRsZXJzIHRvIGNvbXBsZXRlLCBw bHVzIHVzZSByY3UKPiBkZXJlZmVyZW5jaW5nIG9uIHRoZXNlIHBvaW50ZXJzLgo+IAo+IENvcHlp bmcgdGhlIHJlbGV2YW50IGJpdHMgb3ZlciBzaG91bGQgYmUgbXVjaCBuaWNlciBpbW8sIGFsc28g cGFzc2luZwo+IGV4cGxpY2l0IHBvaW50ZXJzIGF0IGxlYXN0LiBJLmUuIGlmIHlvdSBkb24ndCB3 YW50IHRvIGNvcHksIGhhdmUgYQo+IGRlZGljYXRlZCBwb2ludGVyIHByb3RlY3RlZCBieSBpcnFz YXZlIHNwaW5fbG9jayB0aGF0IHlvdSBzaGFyZSB3aXRoIHRoZQo+IGludGVycnVwdCBoYW5kbGVy LiBTdG9wcGluZyBpbnRlcnJ1cHQgaGFuZGxlcnMgYmVmb3JlIHN3YXBfc3RhdGUgaXNuJ3QKPiBy ZWFsbHkgaG93IHRoaXMgc2hvdWxkIHdvcmsuCj4gCj4+IFRoZSBmaXggZm9yIHRoaXMgb25lIGlz bid0IHRvbyBiYWQsIGJ1dCBpdCdzIHRlZGlvdXMgLSBjb3B5aW5nIGFsbCB0aGUgc3RhdGUKPj4g d2UgbmVlZCB0byB0aGUgaW50ZXJydXB0IGhhbmRsZXJzIGJlZm9yZSBlbmFibGluZyB0aGVtIGFu ZCBsZXR0aW5nIHRoZW0KPj4gY29udGludWUgdG8gd29yayBvZmYgb2YgdGhhdCBzdGF0ZS4gVGhp cyB3YXkgd2UgY2FuIHJlbW92ZSB0aGUgc3RhbGwgZnJvbQo+PiBhdG9taWNfY2hlY2sgYW5kIGFj dHVhbGx5IGRpc2FibGUvZW5hYmxlIGludGVycnVwdHMgZnJvbSBjb21taXRfdGFpbCBsaWtlIHdl Cj4+IHNob3VsZCBiZSBkb2luZy4KPiAKPiBZdXAuIEkgdGhpbmsgeW91IGNhbiBoYXZlIHNvbWUg cG9pbnRlcnMgdG8gc3BlY2lmaWMgc3RhdGUsIF9pZmZfIHlvdSBtYWtlCj4gc3VyZSB0aGUgY29t bWl0X3RhaWwgd2FpdHMgZm9yIGFsbCB0aGUgaW50ZXJydXB0IGhhbmRsZXJzIHRvIGNvbXBsZXRl Cj4gc29tZXdoZXJlIChkZXBlbmRpbmcgdXBvbiBob3cgdGhpcyBhbGwgd29ya3MpLiBCdXQgY29w eWluZyBpcyBwcm9iYWJseQo+IHNpbXBsZXIgdG8gdW5kZXJzdGFuZCAtIGludGVycnVwdCByYWNl cyBhcmUgdHJpY2t5Lgo+Pgo+Pj4KPj4+IFNlZSBhbHNvIG15IGRtYS1mZW5jZSBhbm5vdGF0aW9u IGZpeHVwIHBhdGNoLCB0aGVyZSBkY19zdGF0ZSBhbHNvIGdldHMKPj4+IGluIHRoZSB3YXk6Cj4+ Pgo+Pj4gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvZHJpLWRldmVsLzIwMjAwNzA3MjAxMjI5LjQ3 MjgzNC0yMS1kYW5pZWwudmV0dGVyQGZmd2xsLmNoLwo+Pj4KPj4+IE5pY2hvbGFzLCBidHcgSSdt IHN0aWxsIHdhaXRpbmcgZm9yIHNvbWUgZGMgZmVlZGJhY2sgb24gdGhhdCBlbnRpcmUKPj4+IHNl cmllcywgYW5kIHdoYXQvaWYgdGhlcmUncyBwbGFucyB0byBmaXggdGhlc2UgaXNzdWVzIHByb3Bl cmx5Lgo+Pj4KPj4+IE1heWJlIGV2ZW4gZ29pbmcgYmFjayB0byB0aGUgc3ViY2xhc3NlZCBkcm1f YXRvbWljX3N0YXRlIG1pZ2h0IGJlCj4+PiBiZXR0ZXIgdGhhbiB3aGF0IHdlIGN1cnJlbnRseSBo YXZlLgo+Pj4gLURhbmllbAo+Pgo+PiBJJ3ZlIHRha2VuIGEgbG9vayBhdCB0aGF0IHNlcmllcyBi dXQgZm9yZ290IHRvIEFDSy4gV2hpbGUgdGhpcyBpc24ndCB0aGUKPj4gc2FtZSB0aHJlYWQgZm9y IGl0LCB5b3UgY2FuIGhhdmUgbXk6Cj4+Cj4+IFJldmlld2VkLWJ5OiBOaWNob2xhcyBLYXpsYXVz a2FzIDxuaWNob2xhcy5rYXpsYXVza2FzQGFtZC5jb20+Cj4+Cj4+IC4uLm9uIHRoZSBEQy9ETSBi aXRzLiBFdmVyeXRoaW5nIHlvdSd2ZSBpZGVudGlmaWVkIHRoZXJlIGlzIGNvcnJlY3QgYW5kIGl0 J3MKPj4gc29tZXRoaW5nIEknZCByZWFsbHkgbGlrZSB0byBnZXQgYXJvdW5kIHRvIHRha2luZyBh IGxvb2sgYXQgYnkgdGhlIGVuZCBvZgo+PiB0aGUgeWVhciwgaG9wZWZ1bGx5Lgo+Pgo+PiBTdGF0 ZSBhbGxvY2F0aW9ucyB3aWxsIGJlIHNvbHZlZCBieSB0aGUgRE0gc3RhdGUgYWxsb2NhdGlvbiBy ZXdvcmsgYW5kIHRoZQo+PiB0aWxpbmcgZmxhZ3MgdGhpbmcgbmVlZHMgdG8gYmUgc29sdmVkIGJ5 IHN0b3JpbmcgdGhvc2UgaW4gYXRvbWljX2NoZWNrCj4+IGluc3RlYWQgb24gdGhlIHBsYW5lLgo+ Pgo+PiBSZWdhcmRzLAo+PiBOaWNob2xhcyBLYXpsYXVza2FzCj4+Cj4+Pj4KPj4+PiBbMV0gaHR0 cHM6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDczODMjYzk2Cj4+Pj4K Pj4+PiBUaGFua3MsCj4+Pj4gTWF6aW4gUmV6awo+Pj4+Cj4+Pj4+Cj4+Pj4+IENoZWVycywgRGFu aWVsCj4+Pj4+Cj4+Pj4+Pgo+Pj4+Pj4gUmVnYXJkcywKPj4+Pj4+IENocmlzdGlhbi4KPj4+Pj4+ Cj4+Pj4+Pj4KPj4+Pj4+PiBSZWdhcmRzLAo+Pj4+Pj4+IE5pY2hvbGFzIEthemxhdXNrYXMKPj4+ Pj4+Pgo+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IFNpbmNlIHRoaXMgYnVnIGhhcyBvbmx5 IGJlZW4gc3BvdHRlZCB3aXRoIGZhc3QgY29tbWl0cywgdGhpcyBwYXRjaAo+Pj4+Pj4+Pj4gZml4 ZXMKPj4+Pj4+Pj4+IHRoZSBidWcgYnkgY2xlYXJpbmcgdGhlIGRtX3N0YXRlIGluc3RlYWQgb2Yg dXNpbmcgdGhlIG9sZCBkY19zdGF0ZSBmb3IKPj4+Pj4+Pj4+IGZhc3QgdXBkYXRlcy4gSW4gYWRk aXRpb24sIHNpbmNlIGRtX3N0YXRlIGlzIG9ubHkgdXNlZCBmb3IgaXRzIGRjX3N0YXRlCj4+Pj4+ Pj4+PiBhbmQgYW1kZ3B1X2RtX2F0b21pY19jb21taXRfdGFpbCB3aWxsIHJldGFpbiB0aGUgZGNf c3RhdGUgaWYgbm9uZSBpcwo+Pj4+Pj4+Pj4gZm91bmQsCj4+Pj4+Pj4+PiByZW1vdmluZyB0aGUg ZG1fc3RhdGUgc2hvdWxkIG5vdCBoYXZlIGFueSBjb25zZXF1ZW5jZXMgaW4gZmFzdCB1cGRhdGVz Lgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IFRoaXMgdXNlLWFmdGVyLWZyZWUgYnVnIGhhcyBleGlzdGVk IGZvciBhIHdoaWxlIG5vdywgYnV0IG9ubHkgY2F1c2VkIGEKPj4+Pj4+Pj4+IG5vdGljZWFibGUg aXNzdWUgc3RhcnRpbmcgZnJvbSA1LjctcmMxIGR1ZSB0byAzMjAyZmE2MmYgKCJzbHViOgo+Pj4+ Pj4+Pj4gcmVsb2NhdGUKPj4+Pj4+Pj4+IGZyZWVsaXN0IHBvaW50ZXIgdG8gbWlkZGxlIG9mIG9i amVjdCIpIG1vdmluZyB0aGUgZnJlZWxpc3QgcG9pbnRlciBmcm9tCj4+Pj4+Pj4+PiBkbV9zdGF0 ZS0+YmFzZSAod2hpY2ggd2FzIHVudXNlZCkgdG8gZG1fc3RhdGUtPmNvbnRleHQgKHdoaWNoIGlz Cj4+Pj4+Pj4+PiBkZXJlZmVyZW5jZWQpLgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IEJ1Z3ppbGxhOiBo dHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTIwNzM4Mwo+Pj4+Pj4+ Pj4gRml4ZXM6IGJkMjAwZDE5MGY0NSAoImRybS9hbWQvZGlzcGxheTogRG9uJ3QgcmVwbGFjZSB0 aGUgZGNfc3RhdGUKPj4+Pj4+Pj4+IGZvciBmYXN0IHVwZGF0ZXMiKQo+Pj4+Pj4+Pj4gUmVwb3J0 ZWQtYnk6IER1bmNhbiA8MWk1dDUuZHVuY2FuQGNveC5uZXQ+Cj4+Pj4+Pj4+PiBTaWduZWQtb2Zm LWJ5OiBNYXppbiBSZXprIDxtbnJ6a0Bwcm90b25tYWlsLmNvbT4KCkkgdGhpbmsgdGhpcyBwYXRj aCBpcyBPSyB0byBtZXJnZSBmb3Igbm93IGJhc2VkIG9uIHRoZSBkaXNjdXNzaW9uIGluIAp0aGlz IHRocmVhZCBhbmQgdGhlIG90aGVyIG9uZS4gSXQncyBiZXR0ZXIgdGhhbiBoaXR0aW5nIGEgcGFn ZSBmYXVsdCBhdCAKdGhlIHZlcnkgbGVhc3QgYW5kIGl0J3Mgbm90IGEgdmVyeSBpbnRydXNpdmUg Y2hhbmdlLgoKSSdkIHNheSBJJ20gYWJvdXQgaGFsZndheSB0aHJvdWdoIGRldmVsb3BtZW50IG9u IGEgcHJvcGVyIGZpeCBmb3IgdGhpcyAKcGVuZGluZyBubyBJR1QgZmFpbHVyZXMgYXQgbGVhc3Qu CgpTbyBmb3Igbm93LAoKUmV2aWV3ZWQtYnk6IE5pY2hvbGFzIEthemxhdXNrYXMgPG5pY2hvbGFz LmthemxhdXNrYXNAYW1kLmNvbT4KCj4+Pj4+Pj4+PiAtLS0KPj4+Pj4+Pj4+ICAgICAuLi4vZ3B1 L2RybS9hbWQvZGlzcGxheS9hbWRncHVfZG0vYW1kZ3B1X2RtLmMgfCAzNgo+Pj4+Pj4+Pj4gKysr KysrKysrKysrKystLS0tLQo+Pj4+Pj4+Pj4gICAgIDEgZmlsZSBjaGFuZ2VkLCAyNyBpbnNlcnRp b25zKCspLCA5IGRlbGV0aW9ucygtKQo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vYW1kL2Rpc3BsYXkvYW1kZ3B1X2RtL2FtZGdwdV9kbS5jCj4+Pj4+Pj4+ PiBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvZGlzcGxheS9hbWRncHVfZG0vYW1kZ3B1X2RtLmMKPj4+ Pj4+Pj4+IGluZGV4IDg2ZmZhMGMyODgwZi4uNzEwZWRjNzBlMzdlIDEwMDY0NAo+Pj4+Pj4+Pj4g LS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9kaXNwbGF5L2FtZGdwdV9kbS9hbWRncHVfZG0uYwo+ Pj4+Pj4+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9kaXNwbGF5L2FtZGdwdV9kbS9hbWRn cHVfZG0uYwo+Pj4+Pj4+Pj4gQEAgLTg3MTcsMjAgKzg3MTcsMzggQEAgc3RhdGljIGludCBhbWRn cHVfZG1fYXRvbWljX2NoZWNrKHN0cnVjdAo+Pj4+Pj4+Pj4gZHJtX2RldmljZSAqZGV2LAo+Pj4+ Pj4+Pj4gICAgICAgICAgICAgICogdGhlIHNhbWUgcmVzb3VyY2UuIElmIHdlIGhhdmUgYSBuZXcg REMgY29udGV4dCBhcyBwYXJ0IG9mCj4+Pj4+Pj4+PiAgICAgICAgICAgICAgKiB0aGUgRE0gYXRv bWljIHN0YXRlIGZyb20gdmFsaWRhdGlvbiB3ZSBuZWVkIHRvIGZyZWUgaXQgYW5kCj4+Pj4+Pj4+ PiAgICAgICAgICAgICAgKiByZXRhaW4gdGhlIGV4aXN0aW5nIG9uZSBpbnN0ZWFkLgo+Pj4+Pj4+ Pj4gKyAgICAgICAgICoKPj4+Pj4+Pj4+ICsgICAgICAgICAqIEZ1cnRoZXJtb3JlLCBzaW5jZSB0 aGUgRE0gYXRvbWljIHN0YXRlIG9ubHkgY29udGFpbnMgdGhlIERDCj4+Pj4+Pj4+PiArICAgICAg ICAgKiBjb250ZXh0IGFuZCBjYW4gc2FmZWx5IGJlIGFubnVsbGVkLCB3ZSBjYW4gZnJlZSB0aGUg c3RhdGUKPj4+Pj4+Pj4+ICsgICAgICAgICAqIGFuZCBjbGVhciB0aGUgYXNzb2NpYXRlZCBwcml2 YXRlIG9iamVjdCBub3cgdG8gZnJlZQo+Pj4+Pj4+Pj4gKyAgICAgICAgICogc29tZSBtZW1vcnkg YW5kIGF2b2lkIGEgcG9zc2libGUgdXNlLWFmdGVyLWZyZWUgbGF0ZXIuCj4+Pj4+Pj4+PiAgICAg ICAgICAgICAgKi8KPj4+Pj4+Pj4+IC0gICAgICAgIHN0cnVjdCBkbV9hdG9taWNfc3RhdGUgKm5l d19kbV9zdGF0ZSwgKm9sZF9kbV9zdGF0ZTsKPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiAtICAgICAgICBu ZXdfZG1fc3RhdGUgPSBkbV9hdG9taWNfZ2V0X25ld19zdGF0ZShzdGF0ZSk7Cj4+Pj4+Pj4+PiAt ICAgICAgICBvbGRfZG1fc3RhdGUgPSBkbV9hdG9taWNfZ2V0X29sZF9zdGF0ZShzdGF0ZSk7Cj4+ Pj4+Pj4+PiArICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPm51bV9wcml2YXRlX29ianM7 IGkrKykgewo+Pj4+Pj4+Pj4gKyAgICAgICAgICAgIHN0cnVjdCBkcm1fcHJpdmF0ZV9vYmogKm9i aiA9IHN0YXRlLT5wcml2YXRlX29ianNbaV0ucHRyOwo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IC0gICAg ICAgIGlmIChuZXdfZG1fc3RhdGUgJiYgb2xkX2RtX3N0YXRlKSB7Cj4+Pj4+Pj4+PiAtICAgICAg ICAgICAgaWYgKG5ld19kbV9zdGF0ZS0+Y29udGV4dCkKPj4+Pj4+Pj4+IC0gICAgICAgICAgICAg ICAgZGNfcmVsZWFzZV9zdGF0ZShuZXdfZG1fc3RhdGUtPmNvbnRleHQpOwo+Pj4+Pj4+Pj4gKyAg ICAgICAgICAgIGlmIChvYmotPmZ1bmNzID09IGFkZXYtPmRtLmF0b21pY19vYmouZnVuY3MpIHsK Pj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgaW50IGogPSBzdGF0ZS0+bnVtX3ByaXZhdGVfb2Jq cy0xOwo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IC0gICAgICAgICAgICBuZXdfZG1fc3RhdGUtPmNvbnRl eHQgPSBvbGRfZG1fc3RhdGUtPmNvbnRleHQ7Cj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgIGRt X2F0b21pY19kZXN0cm95X3N0YXRlKG9iaiwKPj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICBzdGF0ZS0+cHJpdmF0ZV9vYmpzW2ldLnN0YXRlKTsKPj4+Pj4+Pj4+ICsKPj4+Pj4+Pj4+ ICsgICAgICAgICAgICAgICAgLyogSWYgaSBpcyBub3QgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkg dGhlbiB0aGUKPj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICogbGFzdCBlbGVtZW50IG5lZWRz IHRvIGJlIG1vdmVkIHRvIHdoZXJlIGkgd2FzCj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgICAq IGJlZm9yZSB0aGUgYXJyYXkgY2FuIHNhZmVseSBiZSB0cnVuY2F0ZWQuCj4+Pj4+Pj4+PiArICAg ICAgICAgICAgICAgICAqLwo+Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBqKQo+ Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnByaXZhdGVfb2Jqc1tpXSA9Cj4+ Pj4+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnByaXZhdGVfb2Jqc1tqXTsK Pj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiAtICAgICAgICAgICAgaWYgKG9sZF9kbV9zdGF0ZS0+Y29udGV4 dCkKPj4+Pj4+Pj4+IC0gICAgICAgICAgICAgICAgZGNfcmV0YWluX3N0YXRlKG9sZF9kbV9zdGF0 ZS0+Y29udGV4dCk7Cj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgIHN0YXRlLT5wcml2YXRlX29i anNbal0ucHRyID0gTlVMTDsKPj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgc3RhdGUtPnByaXZh dGVfb2Jqc1tqXS5zdGF0ZSA9IE5VTEw7Cj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgIHN0YXRl LT5wcml2YXRlX29ianNbal0ub2xkX3N0YXRlID0gTlVMTDsKPj4+Pj4+Pj4+ICsgICAgICAgICAg ICAgICAgc3RhdGUtPnByaXZhdGVfb2Jqc1tqXS5uZXdfc3RhdGUgPSBOVUxMOwo+Pj4+Pj4+Pj4g Kwo+Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICBzdGF0ZS0+bnVtX3ByaXZhdGVfb2JqcyA9IGo7 Cj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgIGJyZWFrOwo+Pj4+Pj4+Pj4gKyAgICAgICAgICAg IH0KPj4+Pj4+Pj4+ICAgICAgICAgICAgIH0KPj4+Pj4+Pj4+ICAgICAgICAgfQo+Pj4+Pj4+Pj4K Pj4+Pj4+Pj4+IC0tCj4+Pj4+Pj4+PiAyLjI3LjAKPj4+Pj4+Pj4+Cj4+Pj4+Pj4+Cj4+Pj4+Pj4K Pj4+Pj4+Cj4+Pj4+PiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwo+Pj4+Pj4gZHJpLWRldmVsIG1haWxpbmcgbGlzdAo+Pj4+Pj4gZHJpLWRldmVsQGxpc3Rz LmZyZWVkZXNrdG9wLm9yZwo+Pj4+Pj4gaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9kcmktZGV2ZWwKPj4+Pj4KPj4+Pj4KPj4+Pj4KPj4+Pj4gLS0KPj4+Pj4g RGFuaWVsIFZldHRlcgo+Pj4+PiBTb2Z0d2FyZSBFbmdpbmVlciwgSW50ZWwgQ29ycG9yYXRpb24K Pj4+Pj4gaHR0cDovL2Jsb2cuZmZ3bGwuY2gvCj4+Pgo+Pj4KPj4+Cj4+Cj4gCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBs aXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK 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=-12.1 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER,NICE_REPLY_A,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 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 EFEFCC433E1 for ; Wed, 29 Jul 2020 16:49:23 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 C6F1A20809 for ; Wed, 29 Jul 2020 16:49:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=amdcloud.onmicrosoft.com header.i=@amdcloud.onmicrosoft.com header.b="Sgijbca9" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C6F1A20809 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=amd.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=amd-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2816A6E591; Wed, 29 Jul 2020 16:49:19 +0000 (UTC) Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2064.outbound.protection.outlook.com [40.107.236.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4E3246E58A; Wed, 29 Jul 2020 16:49:17 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ahFgotyxPZf0ayeFHiN0PwVgnHHlfu2XWoeLJyepI01bxp4VUzsussMdTdHOf9Y2ktWExUQSxu1GPJF3mDdCet4XBFnLSx/3f04HQZTPdVfakpJTbzBmTMHGGBgQVWcGC90IMKIbl4DTlyjorZSEXc+KIaWmuDJZKIxXCQaPprlQ/t7lDTdsHZ8MwAALu/4QAQ+LRzQcCY0lPX+iRn1r2cgBOkNLKawYrE8yTY42BL6ahi6UwWr4Vp73vcARMo3oOVrr8J0sddYxm4E/6HIWCjzGG4su8H8GhhHjc6aSZ9lLcb+pSaRN8Uax/PSXB31a9Qj+/0i6y+LYzqG/WAW7Ag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5+jHWN5OlccZjSfNvqX1/2mYd2T2MXxqlV+fyfztD4Q=; b=iAMauG70Ky+ujG4IIflkGTSAqU2XlwwxjHmih2DYy39jFKKC7SV4XqcfyxPOwMIx3umuVw6eoF/dGF8Ob3Yyk8wKB6MmVYLBJoSKzoYAlpGST9FYJUoTBeNG6lznySnq6lAoIL4jTwnH7pgBAQhBLIm+V2K4tLGsjTavD+D9SUXO3vtWVQBeBiWCnTFJwChoMQw4eVLj2maccKA7NORhUv4uv4I0CfoE79FMveittt2nAh+Z9MUHcyR0wTju1cHL1n7pKMrQ0Pf18CEBYEkasTKm23XUE9/2uBVJuxh03bIHPqS9IcMK4OyCWHlyUJAsKrLKcXRjiXXdeE02vV5wGg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector2-amdcloud-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5+jHWN5OlccZjSfNvqX1/2mYd2T2MXxqlV+fyfztD4Q=; b=Sgijbca9BSns7usREcwESEWQi65dUVxBqkoU7k47UxodVmYj9/t2QlMy5MejI9XJdzNhV1C+VEloe618A6o6i9M/xcADzR/8naWuRga8fdbjs5AVeH9GFayQOalSPxjd4yJGiyo8g65kcNyaVThMOkxa81CS40u3kuBgY9VSPz8= Authentication-Results: yahoo.com.br; dkim=none (message not signed) header.d=none;yahoo.com.br; dmarc=none action=none header.from=amd.com; Received: from BYAPR12MB3560.namprd12.prod.outlook.com (2603:10b6:a03:ae::10) by BY5PR12MB4275.namprd12.prod.outlook.com (2603:10b6:a03:20a::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3239.16; Wed, 29 Jul 2020 16:49:14 +0000 Received: from BYAPR12MB3560.namprd12.prod.outlook.com ([fe80::7d42:c932:e35f:71b1]) by BYAPR12MB3560.namprd12.prod.outlook.com ([fe80::7d42:c932:e35f:71b1%7]) with mapi id 15.20.3216.034; Wed, 29 Jul 2020 16:49:14 +0000 Subject: Re: [PATCH] drm/amd/display: Clear dm_state for fast updates To: Mazin Rezk , =?UTF-8?Q?Christian_K=c3=b6nig?= , "linux-kernel@vger.kernel.org" , "amd-gfx@lists.freedesktop.org" , "dri-devel@lists.freedesktop.org" , Paul Menzel , "anthony.ruhier@gmail.com" , Duncan <1i5t5.duncan@cox.net>, Kees Cook , "sunpeng.li@amd.com" , "regressions@leemhuis.info" , Alexander Deucher , Andrew Morton , "mphantomx@yahoo.com.br" References: <3b7e3e50-2ff7-eff3-2ffc-abaa4b36ce7f@amd.com> <20200728090855.GZ6419@phenom.ffwll.local> From: "Kazlauskas, Nicholas" Message-ID: <18d6a40d-0c7e-fbce-376d-ce468955d4b8@amd.com> Date: Wed, 29 Jul 2020 12:49:10 -0400 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 In-Reply-To: <20200728090855.GZ6419@phenom.ffwll.local> Content-Language: en-US X-ClientProxiedBy: YTXPR0101CA0038.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b00:1::15) To BYAPR12MB3560.namprd12.prod.outlook.com (2603:10b6:a03:ae::10) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [172.31.148.234] (165.204.55.211) by YTXPR0101CA0038.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b00:1::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3239.16 via Frontend Transport; Wed, 29 Jul 2020 16:49:12 +0000 X-Originating-IP: [165.204.55.211] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: b7d97f04-33bd-49a2-d2d6-08d833df5378 X-MS-TrafficTypeDiagnostic: BY5PR12MB4275: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: N5DteoiKxEU2QYWEHIiP8h0bQMNFo7KTHGt2AMlWEJ0d3yTDsl6ULO+z8YCRsS4StUlMJ4IEGbeur/A6ix+dValbNJttQKuN/fb4MDKkVz1Zf2yE0oA6nVa2R+xm+u6VEK2GgZf8akWgb+V2rkZ7kO9yv3vwlTeyvJRyoLU67x22oQ/F54ol88Oe9qXlZh6UM2ZWfZ006Cm2uf8LmMnym3BtEOfU8oWVQ8hqVgnMCU9+VtwDAGgonhMNcS/u09mmymj1WdIFOurBf0LR3HWOZIzu4qQ6WeYdzoaFmmU5mVOt7lJDwkIhBz6ziG+npR4iiKyWtEPYW5rDnHQtwZErfK1S23Zv1CDTsXDq9wgqkHHvpyaLJFPDn+/e499fc42OPUL12eA5QOcfSnmEkvJbD4PVSsrlVl+DM7+yzdzMTp9Rks/Z7HCJJw4k5Wu0wH4TpKCldzHt95Lf5JoviScfFORTkWVQ5Gl4rpHjaSC8/ak= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:BYAPR12MB3560.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(39860400002)(376002)(366004)(396003)(136003)(346002)(8936002)(966005)(31686004)(66574015)(53546011)(31696002)(8676002)(6486002)(26005)(316002)(36756003)(16526019)(110136005)(186003)(7416002)(83380400001)(52116002)(15650500001)(2616005)(86362001)(66946007)(30864003)(83080400001)(16576012)(66556008)(5660300002)(478600001)(956004)(66476007)(2906002)(921003)(43740500002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: hhJjmL37s53yvAB5KAEunxVSaXoTLorGZHZ5HEwHcdLSv7YGPgwFcBWtYvrhRZoCH8EIBDva28ZO7Fo54dZNYxQkdgyGWeS5fhVtQ0iy050Ph3GnFAqxeC60hQ3tmBYFBZUnZHFfOo2mbY9/Y/1VhImC9R2UGy0e2YVjRRtzW6WreE4N5Dxe2LB781IbzezFckR4Xgd4mzX+Itw7n0WnMt3AeMm7MzxegpyoonyFR4mwieHIiWJ9Mg0vUOiT6VaSUaaPeLiicatG0iX/N6dzOkNIbSuoV2edeoVcno2M6D/w3dUc9gIOFQ7QpYOdMmOMdhy9pgj9H0EReQR3I8n1dD0rrcqblwdFazuCHKZE3mY9QJ5lk56tQCrFfcVLlM0xFEP9NX1flrXmJEPggbfpyN+aZD3mJFm3Wx7lbqUEQ5MZ5q24bjO5Yy4IxtMSZvyDB14aTs0MvYTe2uYvmRLRDxvPuSCJRAOvfMYORKsNgZ+wJdcqck0BqTw8Gha1wRPYJu16+PqmAwsnp5TjKjVylln0w+4mKPyNxrsUG8LJ5dE4uCjkZvpD2HWALyyGT2rt5qF1jz4L+ozI4uiIS4GjmODdTbS/bV4x12U2iXSeTf1Ys0EUgRM4s+fRBc/Ui9ToxgoPGZBqBKJbT5iCfhum+g== X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: b7d97f04-33bd-49a2-d2d6-08d833df5378 X-MS-Exchange-CrossTenant-AuthSource: BYAPR12MB3560.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jul 2020 16:49:14.7054 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: faJtbtELsai8BgdGC5qCkHfUYRMl1bYXlQTiG4NJlFqi1Y/Y6DLlNktoJRqjh0X/XaPjAy3aWBut0wikPLCWLg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR12MB4275 X-BeenThere: amd-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: amd-gfx-bounces@lists.freedesktop.org Sender: "amd-gfx" T24gMjAyMC0wNy0yOCA1OjA4IGEubS4sIGRhbmllbEBmZndsbC5jaCB3cm90ZToKPiBPbiBNb24s IEp1bCAyNywgMjAyMCBhdCAxMDo0OTo0OFBNIC0wNDAwLCBLYXpsYXVza2FzLCBOaWNob2xhcyB3 cm90ZToKPj4gT24gMjAyMC0wNy0yNyA1OjMyIHAubS4sIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4+ PiBPbiBNb24sIEp1bCAyNywgMjAyMCBhdCAxMToxMSBQTSBNYXppbiBSZXprIDxtbnJ6a0Bwcm90 b25tYWlsLmNvbT4gd3JvdGU6Cj4+Pj4KPj4+PiBPbiBNb25kYXksIEp1bHkgMjcsIDIwMjAgNDoy OSBQTSwgRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZmd2xsLmNoPiB3cm90ZToKPj4+Pgo+Pj4+PiBP biBNb24sIEp1bCAyNywgMjAyMCBhdCA5OjI4IFBNIENocmlzdGlhbiBLw7ZuaWcKPj4+Pj4gPGNo cmlzdGlhbi5rb2VuaWdAYW1kLmNvbT4gd3JvdGU6Cj4+Pj4+Pgo+Pj4+Pj4gQW0gMjcuMDcuMjAg dW0gMTY6MDUgc2NocmllYiBLYXpsYXVza2FzLCBOaWNob2xhczoKPj4+Pj4+PiBPbiAyMDIwLTA3 LTI3IDk6MzkgYS5tLiwgQ2hyaXN0aWFuIEvDtm5pZyB3cm90ZToKPj4+Pj4+Pj4gQW0gMjcuMDcu MjAgdW0gMDc6NDAgc2NocmllYiBNYXppbiBSZXprOgo+Pj4+Pj4+Pj4gVGhpcyBwYXRjaCBmaXhl cyBhIHJhY2UgY29uZGl0aW9uIHRoYXQgY2F1c2VzIGEgdXNlLWFmdGVyLWZyZWUgZHVyaW5nCj4+ Pj4+Pj4+PiBhbWRncHVfZG1fYXRvbWljX2NvbW1pdF90YWlsLiBUaGlzIGNhbiBvY2N1ciB3aGVu IDIgbm9uLWJsb2NraW5nCj4+Pj4+Pj4+PiBjb21taXRzCj4+Pj4+Pj4+PiBhcmUgcmVxdWVzdGVk IGFuZCB0aGUgc2Vjb25kIG9uZSBmaW5pc2hlcyBiZWZvcmUgdGhlIGZpcnN0Lgo+Pj4+Pj4+Pj4g RXNzZW50aWFsbHksCj4+Pj4+Pj4+PiB0aGlzIGJ1ZyBvY2N1cnMgd2hlbiB0aGUgZm9sbG93aW5n IHNlcXVlbmNlIG9mIGV2ZW50cyBoYXBwZW5zOgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IDEuIE5vbi1i bG9ja2luZyBjb21taXQgIzEgaXMgcmVxdWVzdGVkIHcvIGEgbmV3IGRtX3N0YXRlICMxIGFuZCBp cwo+Pj4+Pj4+Pj4gZGVmZXJyZWQgdG8gdGhlIHdvcmtxdWV1ZS4KPj4+Pj4+Pj4+Cj4+Pj4+Pj4+ PiAyLiBOb24tYmxvY2tpbmcgY29tbWl0ICMyIGlzIHJlcXVlc3RlZCB3LyBhIG5ldyBkbV9zdGF0 ZSAjMiBhbmQgaXMKPj4+Pj4+Pj4+IGRlZmVycmVkIHRvIHRoZSB3b3JrcXVldWUuCj4+Pj4+Pj4+ Pgo+Pj4+Pj4+Pj4gMy4gQ29tbWl0ICMyIHN0YXJ0cyBiZWZvcmUgY29tbWl0ICMxLCBkbV9zdGF0 ZSAjMSBpcyB1c2VkIGluIHRoZQo+Pj4+Pj4+Pj4gY29tbWl0X3RhaWwgYW5kIGNvbW1pdCAjMiBj b21wbGV0ZXMsIGZyZWVpbmcgZG1fc3RhdGUgIzEuCj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4gNC4gQ29t bWl0ICMxIHN0YXJ0cyBhZnRlciBjb21taXQgIzIgY29tcGxldGVzLCB1c2VzIHRoZSBmcmVlZCBk bV9zdGF0ZQo+Pj4+Pj4+Pj4gMSBhbmQgZGVyZWZlcmVuY2VzIGEgZnJlZWxpc3QgcG9pbnRlciB3 aGlsZSBzZXR0aW5nIHRoZSBjb250ZXh0Lgo+Pj4+Pj4+Pgo+Pj4+Pj4+PiBXZWxsIEkgb25seSBo YXZlIGEgb25lIG1pbGUgaGlnaCB2aWV3IG9uIHRoaXMsIGJ1dCB3aHkgZG9uJ3QgeW91IGxldAo+ Pj4+Pj4+PiB0aGUgd29yayBpdGVtcyBleGVjdXRlIGluIG9yZGVyPwo+Pj4+Pj4+Pgo+Pj4+Pj4+ PiBUaGF0IHdvdWxkIGJlIGJldHRlciBhbnl3YXkgY2F1c2UgdGhpcyB3YXkgd2UgZG9uJ3QgdHJp Z2dlciBhIGNhY2hlCj4+Pj4+Pj4+IGxpbmUgcGluZyBwb25nIGJldHdlZW4gQ1BVcy4KPj4+Pj4+ Pj4KPj4+Pj4+Pj4gQ2hyaXN0aWFuLgo+Pj4+Pj4+Cj4+Pj4+Pj4gV2UgdXNlIHRoZSBEUk0gaGVs cGVycyBmb3IgbWFuYWdpbmcgZHJtX2F0b21pY19jb21taXRfc3RhdGUgYW5kIHRob3NlCj4+Pj4+ Pj4gaGVscGVycyBpbnRlcm5hbGx5IHB1c2ggbm9uLWJsb2NraW5nIGNvbW1pdCB3b3JrIGludG8g dGhlIHN5c3RlbQo+Pj4+Pj4+IHVuYm91bmQgd29yayBxdWV1ZS4KPj4+Pj4+Cj4+Pj4+PiBNaG0s IHdlbGwgaWYgeW91IHNlbmQgdGhvc2UgaGVscGVyIGF0b21pYyBjb21taXRzIGluIHRoZSBvcmRl ciBBLEIgYW5kCj4+Pj4+PiB0aGV5IGV4ZWN1dGUgaXQgaW4gdGhlIG9yZGVyIEIsQSBJIHdvdWxk IGNhbGwgdGhhdCBhIGJ1ZyA6KQo+Pj4+Pgo+Pj4+PiBUaGUgd2F5IGl0IHdvcmtzIGlzIGl0IHB1 c2hlcyBhbGwgY29tbWl0cyBpbnRvIHVuYm91bmQgd29yayBxdWV1ZSwgYnV0Cj4+Pj4+IHRoZW4g Zm9yY2VzIHNlcmlhbGl6YXRpb24gYXMgbmVlZGVkLiBXZSBkbyBfbm90XyB3YW50IGUuZy4gdXBk YXRlcyBvbgo+Pj4+PiBkaWZmZXJlbnQgQ1JUQyB0byBiZSBzZXJpYWxpemVkLCB0aGF0IHdvdWxk IHJlc3VsdCBpbiBsb3RzIG9mIGp1ZGRlci4KPj4+Pj4gQW5kIGh3IGlzIGZ1bm55IGVub3VnaCB0 aGF0IHRoZXJlJ3MgYWxsIGtpbmRzIG9mIGRlcGVuZGVuY2llcy4KPj4+Pj4KPj4+Pj4gVGhlIHdh eSB5b3UgZm9yY2Ugc3luY2hyb25pemF0aW9uIGlzIGJ5IGFkZGluZyBvdGhlciBDUlRDIHN0YXRl Cj4+Pj4+IG9iamVjdHMuIFNvIGlmIERDIGlzIGJ1c3RlZCBhbmQgY2FuIG9ubHkgaGFuZGxlIGEg c2luZ2xlIHVwZGF0ZSBwZXIKPj4+Pj4gd29yayBpdGVtLCB0aGVuIEkgZ3Vlc3MgeW91IGFsd2F5 cyBuZWVkIGFsbCBDUlRDIHN0YXRlcyBhbmQgZXZlcnl0aGluZwo+Pj4+PiB3aWxsIGJlIHJ1biBp biBvcmRlci4gQnV0IHRoYXQgYWxzbyB0b3RhbGx5IGtpbGxzIG1vZGVybiBtdWx0aS1zY3JlZW4K Pj4+Pj4gY29tcG9zaXRvcnMuIFhvcmcgaXNuJ3QgbW9kZXJuLCBqdXN0IGluIGNhc2UgdGhhdCdz IG5vdCBjbGVhciA6LSkKPj4+Pj4KPj4+Pj4gTHVja2luZyBhdCB0aGUgY29kZSBpdCBzZWVtcyBs aWtlIHlvdSBpbmRlZWQgaGF2ZSBvbmx5IGEgc2luZ2xlIGRtCj4+Pj4+IHN0YXRlLCBzbyB5ZWFo IGdsb2JhbCBzeW5jIGlzIHdoYXQgeW91J2xsIG5lZWQgYXMgaW1tZWRpYXRlIGZpeCwgYW5kCj4+ Pj4+IHRoZW4gbWF5YmUgZml4IHVwIERNIHRvIG5vdCBiZSBxdWl0ZSBzbyBzaWxseSAuLi4gb3Ig YXQgbGVhc3Qgb25seSBkbwo+Pj4+PiB0aGUgZG0gc3RhdGUgc3R1ZmYgd2hlbiByZWFsbHkgbmVl ZGVkLgo+Pj4+Pgo+Pj4+PiBXZSBjb3VsZCBhbHNvIHNwcmlua2xlIHRoZSBkcm1fY3J0Y19jb21t aXQgc3RydWN0dXJlIGFyb3VuZCBhIGJpdAo+Pj4+PiAoaXQncyB0aGUgZ2x1ZSB0aGF0IHByb3Zp ZGVzIHRoZSBzeW5jaHJvbml6YXRpb24gYWNyb3NzIGNvbW1pdHMpLCBidXQKPj4+Pj4gc2luY2Ug eW91ciBkbSBzdGF0ZSBpcyBnbG9iYWwganVzdCBncmFiYmluZyBhbGwgY3J0YyBzdGF0ZXMKPj4+ Pj4gdW5jb25kaXRpb25hbGx5IGFzIHBhcnQgb2YgdGhhdCBpcyBwcm9iYWJseSBiZXN0Lgo+Pj4+ Pgo+Pj4+Pj4+IFdoaWxlIHdlIGNvdWxkIGR1cGxpY2F0ZSBhIGNvcHkgb2YgdGhhdCBjb2RlIHdp dGggbm90aGluZyBidXQgdGhlCj4+Pj4+Pj4gd29ya3F1ZXVlIGNoYW5nZWQgdGhhdCBpc24ndCBz b21ldGhpbmcgSSdkIHJlYWxseSBsaWtlIHRvIG1haW50YWluCj4+Pj4+Pj4gZ29pbmcgZm9yd2Fy ZC4KPj4+Pj4+Cj4+Pj4+PiBJJ20gbm90IHRhbGtpbmcgYWJvdXQgZHVwbGljYXRpbmcgdGhlIGNv ZGUsIEknbSB0YWxraW5nIGFib3V0IGZpeGluZyB0aGUKPj4+Pj4+IGhlbHBlcnMuIEkgZG9uJ3Qg a25vdyB0aGF0IGNvZGUgd2VsbCwgYnV0IGZyb20gdGhlIG91dHNpZGUgaXQgc291bmRzCj4+Pj4+ PiBsaWtlIGEgYnVnIHRoZXJlLgo+Pj4+Pj4KPj4+Pj4+IEFuZCBleGVjdXRpbmcgd29yayBpdGVt cyBpbiB0aGUgb3JkZXIgdGhleSBhcmUgc3VibWl0dGVkIGlzIHRyaXZpYWwuCj4+Pj4+Pgo+Pj4+ Pj4gSGFkIGFueWJvZHkgcGluZ2VkIERhbmllbCBvciBvdGhlciBwZW9wbGUgZmFtaWxpYXIgd2l0 aCB0aGUgaGVscGVyIGNvZGUKPj4+Pj4+IGFib3V0IGl0Pwo+Pj4+Pgo+Pj4+PiBZZWFoIHNvbWV0 aGluZyBpcyB3cm9uZyBoZXJlLCBhbmQgdGhlIGZpeCBsb29rcyBob3JyaWJsZSA6LSkKPj4+Pj4K Pj4+Pj4gQXNpZGUsIEkndmUgYWxzbyBzZWVuIHNvbWUgcmVjZW50IGRpc2N1c3Npb24gZmxhcmUg dXAgYWJvdXQKPj4+Pj4gZHJtX2F0b21pY19zdGF0ZV9nZXQvcHV0IHVzZWQgdG8gcGFwZXIgb3Zl ciBzb21lIG90aGVyIHVzZS1hZnRlci1mcmVlLAo+Pj4+PiBidXQgdGhpcyB0aW1lIHJlbGF0ZWQg dG8gaW50ZXJydXB0IGhhbmRsZXJzLiBNYXliZSBhIGZldyBydWxlcyBhYm91dAo+Pj4+PiB0aGF0 Ogo+Pj4+PiAtIGRvbnQKPj4+Pj4gLSBlc3BlY2lhbGx5IG5vdCB3aGVuIGl0J3MgaW50ZXJydXB0 IGhhbmRsZXJzLCBiZWNhdXNlIHlvdSBjYW4ndCBjYWxsCj4+Pj4+IGRybV9hdG9taWNfc3RhdGVf cHV0IGZyb20gaW50ZXJydXB0IGhhbmRsZXJzLgo+Pj4+Pgo+Pj4+PiBJbnN0ZWFkIGhhdmUgYW4g c3Bpbl9sb2NrX2lycSB0byBwcm90ZWN0IHRoZSBzaGFyZWQgZGF0ZSB3aXRoIHlvdXIKPj4+Pj4g aW50ZXJydXB0IGhhbmRsZXIsIGFuZCBfY29weV8gdGhlIGRhdGUgb3Zlci4gVGhpcyBpcyBlLmcu IHdoYXQKPj4+Pj4gZHJtX2NydGNfYXJtX3ZibGFua19ldmVudCBkb2VzLgo+Pj4+Cj4+Pj4gTmlj aG9sYXMgd3JvdGUgYSBwYXRjaCB0aGF0IGF0dGVtcHRlZCB0byByZXNvbHZlIHRoZSBpc3N1ZSBi eSBhZGRpbmcgZXZlcnkKPj4+PiBDUlRDIGludG8gdGhlIGNvbW1pdCB0byB1c2UgdXNlIHRoZSBz dGFsbCBjaGVja3MuIFsxXSBXaGlsZSB0aGlzIGZvcmNlcwo+Pj4+IHN5bmNocm9uaXNhdGlvbiBv biBjb21taXRzLCBpdCdzIGtpbmQgb2YgYSBoYWNreSBtZXRob2QgdGhhdCBtYXkgdGFrZSBhCj4+ Pj4gdG9sbCBvbiBwZXJmb3JtYW5jZS4KPj4+Pgo+Pj4+IElzIGl0IHBvc3NpYmxlIHRvIGhhdmUg YSBEUk0gaGVscGVyIHRoYXQgZm9yY2VzIHN5bmNocm9uaXNhdGlvbiBvbiBzb21lCj4+Pj4gY29t bWl0cyB3aXRob3V0IGhhdmluZyB0byBhZGQgZXZlcnkgQ1JUQyBpbnRvIHRoZSBjb21taXQ/Cj4+ Pj4KPj4+PiBBbHNvLCBpcyBzeW5jaHJvbmlzYXRpb24gcmVhbGx5IG5lY2Vzc2FyeSBmb3IgZmFz dCB1cGRhdGVzIGluIGFtZGdwdT8KPj4+PiBJJ2xsIGFkbWl0LCB0aGUgaWRlYSBvZiBlbGltaW5h dGluZyB0aGUgdXNlLWFmdGVyLWZyZWUgYnVnIGJ5IGVsaW1pbmF0aW5nCj4+Pj4gdGhlIHVzZSBl bnRpcmVseSBkb2Vzbid0IHNlZW0gaWRlYWw7IGJ1dCBpcyBmb3JjaW5nIHN5bmNocm9uaXNhdGlv biBvbgo+Pj4+IHRoZXNlIHVwZGF0ZXMgdGhhdCBtdWNoIGJldHRlcj8KPj4+Cj4+PiBXZWxsIGNs ZWFyaW5nIHRoZSBkY19zdGF0ZSBwb2ludGVyIGhlcmUgYW5kIHRoZW4gYWxsb2NhdGluZyBhbm90 aGVyCj4+PiBvbmUgaW4gYXRvbWljX2NvbW1pdF90YWlsIGFsc28gbG9va3MgZmlzaHkuIFRoZSBw cm9wZXIgZml4IGlzIHByb2JhYmx5Cj4+PiBhIGxvdCBtb3JlIGludm9sdmVkLCBidXQgeWVhaCBp bnRlcmltIGZpeCBpcyB0byBncmFiIGFsbCBjcnRjIHN0YXRlcwo+Pj4gaWZmIHlvdSBhbHNvIGdy YWJiZWQgdGhlIGRtX2F0b21pY19zdGF0ZSBzdHJ1Y3R1cmUuIFJlYWwgZml4IGlzIHRvCj4+PiBv bmx5IGRvIHRoaXMgd2hlbiBuZWNlc3NhcnksIHdoaWNoIHByZXR0eSBtdWNoIG1lYW5zIHRoZSBk Y19zdGF0ZQo+Pj4gbmVlZHMgdG8gYmUgc29tZWhvdyBzcGxpdCB1cCwgb3IgdGhlcmUgbmVlZHMg dG8gYmUgc29tZSBndWFyYW50ZWVzCj4+PiBhYm91dCB3aGVuIGl0J3MgbmVjZXNzYXJ5IGFuZCB3 aGVuIG5vdC4gT3RoZXJ3aXNlIHBhcmFsbGVsIGNvbW1pdHMgb24KPj4+IGRpZmZlcmVudCBDUlRD IGFyZSBub3QgcG9zc2libGUgd2l0aCB0aGUgY3VycmVudCBkYyBiYWNrZW5kIGNvZGUuCj4+Cj4+ IFRoYW5rcyBmb3Igc3BlbmRpbmcgc29tZSB0aW1lIHRvIGhlbHAgdGFrZSBhIGxvb2sgYXQgdGhp cyBhcyB3ZWxsLgo+Pgo+PiBUaGUgRFJNIGRvY3VtZW50YXRpb24gKGF0IGxlYXN0IGF0IHRoZSB0 aW1lKSBzZWVtZWQgdG8gaW1wbHkgdGhhdAo+PiBzdWJjbGFzc2luZyBEUk0gcHJpdmF0ZSBzdGF0 ZSB3YXMgZm9yIGxlZ2FjeSB1c2FnZSBvbmx5IGFuZCBEUk0gd2FudGVkIHRvCj4+IG1vdmUgYXdh eSBmcm9tIGl0LiBEUk0gcHJpdmF0ZSBvYmplY3RzIHNlZW1lZCB0byBmaXQgYXMgdGhlIG5pY2Vy IGF0b21pYwo+PiBtZXRob2QgZm9yIGhhbmRsaW5nIHRoaXMgc2luY2UgdGhleSBoYXZlIG9sZC9u ZXcsIGJ1dCBhcyB5b3UgY2FuIGd1ZXNzIGZyb20KPj4gdGhpcyBpc3N1ZSBpdCdzIGEgbWVzcyAo ZnJvbSBvdXIgZW5kKS4KPiAKPiBZZWFoLCBpZiBpdCdzIGFjdHVhbCBzdGF0ZSB5b3UgcHV0IGlu IHRoZXJlLiBCdXQgdGhpcyBkY19zdGF0ZSBzdHJ1Y3R1cmUKPiBpcyBtb3JlIGxpa2UgYSBjb250 YWluZXIgb2Ygc3RhdGUgcG9pbnRlcnMsIGxpa2UgZHJtX2F0b21pY19zdGF0ZS4gSXQncwo+IG5v dCAxMDAlIGNsZWFyLWN1dCwgZS5nLiB0aGUgYncgc3R1ZmYgaXMgbW9yZSBsaWtlIGEgcmVhbCBz dGF0ZSBvYmplY3QgSQo+IGd1ZXNzLCBvciBtYXliZSBpdCdzIGp1c3QgdGVtcG9yYXJ5IHN0b3Jh Z2UgZm9yIGNvbXB1dGF0aW9uIHJlc3VsdHM/Cj4gCj4+IFRoZSBmaXJzdCBzdGVwIHRvIGZpeGlu ZyB0aGlzIGlzIGdvaW5nIGJhY2sgdG8gc3ViY2xhc3NpbmcgRFJNIHN0YXRlLgo+Pgo+PiBJdCdz IGFjdHVhbGx5IHRoZSByaWdodCB0b29sIGZvciB0aGUgam9iIGZvciBhbGxvY2F0aW5nIHRlbXBv cmFyeSBzdGF0ZQo+PiBvdXRzaWRlIG9mIHRoZSBjb3JlIERSTSBvYmplY3RzLCBhbmQgd2UgbmVl ZCB0aGlzIHRvIGZvcm0gdGhlIERDIHN0YXRlCj4+IG9iamVjdCBhbmQgbmVjZXNzYXJ5IHN0cmVh bSB1cGRhdGUgYnVuZGxlcyB3aGljaCBtaWdodCBiZSB0b28gYmlnIHRvIGZpdCBvbgo+PiB0aGUg c3RhY2sgZm9yIGNvbW1pdCBjaGVjay9jb21taXQgdGFpbC4gV2UnbGwgYmUgYSBsb3QgY2xvc2Vy IHRvIGZpeGluZyB0aGUKPj4gbG9ja2RlcCBpc3N1ZXMgdGhpcyB3YXkgb25jZSB3ZSBnZXQgYXJv dW5kIHRvIGdldHRpbmcgcmlkIG9mIGFsbG9jYXRpb25zIGluCj4+IHRoZSBEQyBjb21taXQgcGF0 aHMuCj4gCj4gU28gb24gdGhlIHN0cmVhbSBidW5kbGVzIC4uLiB3aGVyZSBkbyB0aGVzZSBwb2lu dGVycyBwb2ludCB0bz8gQXJlIHRoZQo+IHN0cmVhbXMgdGhlbXNlbHZlcyBpbiB0aGUgY3J0Yy9w bGFuZSBzdGF0ZXM/Cj4gCj4+IFRoZSBzZWNvbmQgc3RlcCBpcyB0byBmaXggdmFsaWRhdGlvbiBp dHNlbGYuIFRoZSBvbGQgc3RhdGUgcmVxdWlyZW1lbnQgZm9yCj4+IGNoZWNraW5nIHN0cmVhbS9w bGFuZSB1cGRhdGVzIHdhcyBhY3R1YWxseSBhbiBlbnRpcmVseSBwb2ludGxlc3MgZW5kZWF2b3IK Pj4gc2luY2UgZGMgZ2xvYmFsIHZhbGlkYXRpb24gZG9lc24ndCBldmVyeSBsb29rIGF0IHVwZGF0 ZXMsIGp1c3QgdGhlIGZpbmFsCj4+IHN0YXRlIGZvciBhIHNldCBzdHJlYW1zL3BsYW5lcyAtIGl0 J3Mgc3RhdGVsZXNzLgo+IAo+IFVoLCBpcyB5b3VyIGh3IHRoYXQgZ29vZCwgaS5lLiB0aGVyZSdz IG5vIGltcG9zc2libGUgc3RhdGUgdHJhbnNpdGlvbnM/IE9yCj4gZG8geW91IHNpbXBseSBmb3Jj ZSBhIG1vZGVzZXQgaW4gc3VjaCBjYXNlcz8gSW4gd2hpY2ggY2FzZSwgYXJlIHRoZQo+IG1vZGVz ZXQgZmxhZ3MgY29ycmVjdGx5IHVwZGF0ZWQgc28gdGhhdCB1c2Vyc3BhY2UgY2FuIGNvbnRyb2wg dGhpcyB3aXRoCj4gQUxMT1dfTU9ERVNFVD8KPiAKPj4gV2Ugd2FudGVkIHRvIHJlbHkgb24gREMg dG8gaW50ZXJuYWxseSBub3RpZnkgRE0gd2hlbiBEUk0gY2hhbmdlcyB3b3VsZCBkbwo+PiB0aGlz LCBidXQgRE0gYWN0dWFsbHkgcmVxdWlyZXMgdGhpcyBsb2dpYyBhcyB3ZWxsIHRvIGtub3cgd2hl biB0byB1c2UgYSBmYXN0Cj4+IHBhdGggdnMgYSBmdWxsIHByb2dyYW1taW5nIHBhdGggdG8gcmVj cmVhdGUgcGxhbmVzL3N0cmVhbXMgYmFzZWQgb24gdGhlIG5ldwo+PiBEUk0gc3RhdGUgdG8gcGFz cyBpbnRvIHZhbGlkYXRpb24uCj4+Cj4+IFN0YXRlIHVwZGF0ZXMgd2lsbCBjaGFuZ2UgdG8gYmUg Zm9ybWVkIGZyb20gYSBkZWx0YSBvZiB0aGUgb2xkL25ldyBwbGFuZQo+PiBzdGF0ZSwgYnV0IHRo ZSBuZXcgb25lIGNhbiBiZSBkaXNjYXJkZWQgaWYgbm90IG5lZWRlZC4KPj4KPj4gQW55IHVwZGF0 ZSB0aGF0IHJlcXVpcmVzIGNsb2NrL2JhbmR3aWR0aCBjaGFuZ2VzIHdpbGwgaGF2ZSB0byBhZGQg YWxsIHRoZQo+PiBDUlRDcyBhbmQgc3RhbGwgZm9yIGFueSBmYXN0IHVwZGF0ZXMgdG8gY29tcGxl dGUgZmlyc3QuIFRoaXMgaXMgYmVjYXVzZSB0aGV5Cj4+IGNvdWxkIHBvdGVudGlhbGx5IHJlc2h1 ZmZsZSBhcm91bmQgdGhlIHBpcGVzIGFzIHdlbGwsIGJ1dCB0aGVzZSB1cGRhdGVzCj4+IGhhcHBl biBpbmZyZXF1ZW50bHkgZW5vdWdoIHRoYXQgdGhlIHN0YWxsIGlzbid0IHRvbyBiYWQgaGVyZS4K Pj4KPj4gREMgc3RhdGUgdW5mb3J0dW5hdGVseSBzdGlsbCBkb2VzIG5lZWQgdG8gZXhpc3QgZHVl IHRvIHJlcXVpcmVtZW50cyBvbgo+PiBoYXJkd2FyZSByZXNvdXJjZXMvcGlwZSBzcGxpdHRpbmcg dGhhdCBkb24ndCBmaXQgbmljZWx5IGludG8gdGhlIERSTQo+PiBpbmZyYXN0cnVjdHVyZS4gSXQn cyByZWFsbHkgaGFyZCB0byBzaGlmdCBldmVyeXRoaW5nIG92ZXIgaW50byB0aGUgRFJNCj4+IGlu ZnJhc3RydWN0dXJlIGFzIHdlbGwgYmVjYXVzZSBvZiB0aGUgREtNUyBwcm9ibGVtIHdlIGNoYXR0 ZWQgYWJvdXQgYnJpZWZseQo+PiBsYXN0IHllYXIgYXQgWERDLgo+IAo+IFVoIHRoaXMgaXMgYXdr d2FyZCwgaG9sZGluZyB1cCB1cHN0cmVhbSBiZWNhdXNlIG9mIGRvd25zdHJlYW0ga2VybmVscyAu Li4KPiAKPiBDYW4ndCB5b3UgZml4IHRoaXMgd2l0aCBhIGxvdCBtb3JlIGdsdWUgaW4gdGhlIGRv d25zdHJlYW0ga2VybmVscywgc3R1ZmYKPiBsaWtlIGNvcHlpbmcgdGhlIGVudGlyZSBhdG9taWMg aGVscGVycyBpbnRvIHlvdXIgZHJpdmVyIHdoZW4gdGhlcmUncyBuZXcKPiBzdHVmZj8KPiAKPiBG b3IgdGhlIG11bHRpLXBpcGUgc3R1ZmYsIGhvdyBvdGhlciBkcml2ZXJzIGhhbmRsZSB0aGlzIGlz IGJ5IGludGVybmFsbHkKPiByZW1hcHBpbmcgdXNlcnNwYWNlIHZpc2libGUgY3J0Yy9wbGFuZSBv YmplY3RzIHRvIHVuZGVybHlpbmcgaHcgb2JqZWN0cy4KPiBBbmQgdGhlbiBpZiB5b3UgaGF2ZSBy ZW1hcHBpbmcgZ29pbmcgb24geW91IGFkZCB0aGUgdXNlcnNwYWNlIHN0YXRlCj4gc3RydWN0cyBm b3IgYWxsIHVuZGVybHlpbmcgcmVtbWFwcGVkIGNydGMvcGxhbmUgaW4gdXNlIGJ5IHRoZSBjdXJy ZW50Cj4gdXBkYXRlLiBUaGF0IHNob3VsZCBiZSBlbm91Z2ggdG8gZm9yY2UganVzdCBlbm91Z2gg c3luY2hyb25pemF0aW9uLgo+IAo+IFRoZW4gaW4geW91ciBodyBjb21taXQgZnVuY3Rpb25zIHlv dSBzaW1wbGUgaXRlcmF0ZSBvdmVyIGFsbCB0aGUgc3RhdGVzIGluCj4geW91ciB1cGRhdGUsIGFz IGlmIHlvdSdkIGl0ZXJhdGUgb3ZlciBzdHJlYW1zIGRpcmVjdGx5LiBTbyBleGFtcGxlOgo+IAo+ IHN0cnVjdCBhbWRncHVfY3J0Y19zdGF0ZSB7Cj4gCXN0cnVjdCBkcm1fY3J0Y19zdGF0ZSBiYXNl Owo+IAlzdHJ1Y3QgZG1fc3RyZWFtX21hcHBpbmdfc3RhdGUgbWFwcGluZzsKPiAJLyogdGhpcyBj cnRjIG1pZ2h0IG5vdCBiZSB1c2luZyB0aGlzIHN0cmVhbSEgKi8KPiAJc3RydWN0IGRtX3N0cmVh bV9zdGF0ZSBzdHJlYW07Cj4gfTsKPiAKPiBJIHRoaW5rIG1zbSB3b3JrcyBsaWtlIHRoaXMsIGJ1 dCB0aGVyZSdzIGFsc28gb3RoZXIgZHJpdmVycy4KPiAKPiBXaGVuIHlvdSBoYXZlIHRvIGNoYW5n ZSB0aGUgbWFwcGluZyB0aGVuIHlvdSBncmFiIHRoZSBnbG9iYWwgbWFwcGluZwo+IHByaXZhdGUg c3RhdGUsIGJ1dCBpbiBhbnkgb3RoZXIgY2FzZXMgeW91IHVzZSB0aGUgcmVhZC1vbmx5IGNvcHkg aW4gdGhlCj4gY3J0YyBzdGF0ZS4gQW5kIHRoZSBnbG9iYWwgc3RhdGUgaXMgb25seSBmb3IgYm9v ay1rZWVwaW5nLCBzbyBubyBzeW5jCj4gbmVlZGVkIChhc2lkZSBmcm9tIHRoZSBzeW5jIHByb3Zp ZGVkIGJ5IGFkZGluZyB0aGUgY3J0YyBzdGF0ZXMgZm9yIGVhY2gKPiBzdHJlYW0geW91IHRvdWNo KS4KPiAKPiBPZmMgbWlnaHQgaGF2ZSBnb3R0ZW4gdGhlIHN0cmVhbSBsaW5nbyB3cm9uZywgYnV0 IHRoaXMgaXMgcm91Z2hseSBob3cgdG8KPiBkbyB0aGlzIGluIGF0b21pYy4KPiAKPj4gSSdkIHJl YWxseSBsaWtlIHRvIHRhY2tsZSBhIHRoaXJkIHN0ZXAgYXMgd2VsbCBhdCBzb21lIHBvaW50LCBh bmQgdGhhdCdzCj4+IGNsZWFuaW5nIHVwIG91ciBJUlEgbWFuYWdlbWVudC4gT3VyIGludGVycnVw dCBoYW5kbGVycyB1bmZvcnR1bmF0ZWx5IGFjY2Vzcwo+PiBEUk0gc3RhdGUgZGlyZWN0bHkgKHNp bmNlIGl0J3Mgc28gZWFzeSB0byBkbykgYW5kIHRodXMgaW50cm9kdWNlIGEKPj4gcmVxdWlyZW1l bnQgdGhhdCBpdCBkb2Vzbid0IGdldCBjaGFuZ2VkIHdoaWxlIHRoZXNlIGFyZSBzdGlsbCBlbmFi bGVkLiBUaGlzCj4+IHJlcXVpcmVzIHVzIHRvIGludHJvZHVjZSBvdXIgb3duIHN0YWxsIGNoZWNr cyBpbiBhdG9taWNfY2hlY2sgYW5kIHBlcmZvcm0KPj4gdGhlIGludGVycnVwdCBkaXNhYmxlIGlu IGNvbW1pdCBiZWZvcmUgdGhlIHN0YXRlIHN3YXAuCj4gCj4gWWVhaCBkb24ndCBkbyB0aGF0IDot KSBJdCBtaWdodCB3b3JrIGlmIHlvdSBndWFyYW50ZWUgdGhhdCB0aGUgYXRvbWljCj4gY29tbWl0 X3RhaWwgaXMgd2FpdGluZyBmb3IgYWxsIHlvdXIgaXJxIGhhbmRsZXJzIHRvIGNvbXBsZXRlLCBw bHVzIHVzZSByY3UKPiBkZXJlZmVyZW5jaW5nIG9uIHRoZXNlIHBvaW50ZXJzLgo+IAo+IENvcHlp bmcgdGhlIHJlbGV2YW50IGJpdHMgb3ZlciBzaG91bGQgYmUgbXVjaCBuaWNlciBpbW8sIGFsc28g cGFzc2luZwo+IGV4cGxpY2l0IHBvaW50ZXJzIGF0IGxlYXN0LiBJLmUuIGlmIHlvdSBkb24ndCB3 YW50IHRvIGNvcHksIGhhdmUgYQo+IGRlZGljYXRlZCBwb2ludGVyIHByb3RlY3RlZCBieSBpcnFz YXZlIHNwaW5fbG9jayB0aGF0IHlvdSBzaGFyZSB3aXRoIHRoZQo+IGludGVycnVwdCBoYW5kbGVy LiBTdG9wcGluZyBpbnRlcnJ1cHQgaGFuZGxlcnMgYmVmb3JlIHN3YXBfc3RhdGUgaXNuJ3QKPiBy ZWFsbHkgaG93IHRoaXMgc2hvdWxkIHdvcmsuCj4gCj4+IFRoZSBmaXggZm9yIHRoaXMgb25lIGlz bid0IHRvbyBiYWQsIGJ1dCBpdCdzIHRlZGlvdXMgLSBjb3B5aW5nIGFsbCB0aGUgc3RhdGUKPj4g d2UgbmVlZCB0byB0aGUgaW50ZXJydXB0IGhhbmRsZXJzIGJlZm9yZSBlbmFibGluZyB0aGVtIGFu ZCBsZXR0aW5nIHRoZW0KPj4gY29udGludWUgdG8gd29yayBvZmYgb2YgdGhhdCBzdGF0ZS4gVGhp cyB3YXkgd2UgY2FuIHJlbW92ZSB0aGUgc3RhbGwgZnJvbQo+PiBhdG9taWNfY2hlY2sgYW5kIGFj dHVhbGx5IGRpc2FibGUvZW5hYmxlIGludGVycnVwdHMgZnJvbSBjb21taXRfdGFpbCBsaWtlIHdl Cj4+IHNob3VsZCBiZSBkb2luZy4KPiAKPiBZdXAuIEkgdGhpbmsgeW91IGNhbiBoYXZlIHNvbWUg cG9pbnRlcnMgdG8gc3BlY2lmaWMgc3RhdGUsIF9pZmZfIHlvdSBtYWtlCj4gc3VyZSB0aGUgY29t bWl0X3RhaWwgd2FpdHMgZm9yIGFsbCB0aGUgaW50ZXJydXB0IGhhbmRsZXJzIHRvIGNvbXBsZXRl Cj4gc29tZXdoZXJlIChkZXBlbmRpbmcgdXBvbiBob3cgdGhpcyBhbGwgd29ya3MpLiBCdXQgY29w eWluZyBpcyBwcm9iYWJseQo+IHNpbXBsZXIgdG8gdW5kZXJzdGFuZCAtIGludGVycnVwdCByYWNl cyBhcmUgdHJpY2t5Lgo+Pgo+Pj4KPj4+IFNlZSBhbHNvIG15IGRtYS1mZW5jZSBhbm5vdGF0aW9u IGZpeHVwIHBhdGNoLCB0aGVyZSBkY19zdGF0ZSBhbHNvIGdldHMKPj4+IGluIHRoZSB3YXk6Cj4+ Pgo+Pj4gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvZHJpLWRldmVsLzIwMjAwNzA3MjAxMjI5LjQ3 MjgzNC0yMS1kYW5pZWwudmV0dGVyQGZmd2xsLmNoLwo+Pj4KPj4+IE5pY2hvbGFzLCBidHcgSSdt IHN0aWxsIHdhaXRpbmcgZm9yIHNvbWUgZGMgZmVlZGJhY2sgb24gdGhhdCBlbnRpcmUKPj4+IHNl cmllcywgYW5kIHdoYXQvaWYgdGhlcmUncyBwbGFucyB0byBmaXggdGhlc2UgaXNzdWVzIHByb3Bl cmx5Lgo+Pj4KPj4+IE1heWJlIGV2ZW4gZ29pbmcgYmFjayB0byB0aGUgc3ViY2xhc3NlZCBkcm1f YXRvbWljX3N0YXRlIG1pZ2h0IGJlCj4+PiBiZXR0ZXIgdGhhbiB3aGF0IHdlIGN1cnJlbnRseSBo YXZlLgo+Pj4gLURhbmllbAo+Pgo+PiBJJ3ZlIHRha2VuIGEgbG9vayBhdCB0aGF0IHNlcmllcyBi dXQgZm9yZ290IHRvIEFDSy4gV2hpbGUgdGhpcyBpc24ndCB0aGUKPj4gc2FtZSB0aHJlYWQgZm9y IGl0LCB5b3UgY2FuIGhhdmUgbXk6Cj4+Cj4+IFJldmlld2VkLWJ5OiBOaWNob2xhcyBLYXpsYXVz a2FzIDxuaWNob2xhcy5rYXpsYXVza2FzQGFtZC5jb20+Cj4+Cj4+IC4uLm9uIHRoZSBEQy9ETSBi aXRzLiBFdmVyeXRoaW5nIHlvdSd2ZSBpZGVudGlmaWVkIHRoZXJlIGlzIGNvcnJlY3QgYW5kIGl0 J3MKPj4gc29tZXRoaW5nIEknZCByZWFsbHkgbGlrZSB0byBnZXQgYXJvdW5kIHRvIHRha2luZyBh IGxvb2sgYXQgYnkgdGhlIGVuZCBvZgo+PiB0aGUgeWVhciwgaG9wZWZ1bGx5Lgo+Pgo+PiBTdGF0 ZSBhbGxvY2F0aW9ucyB3aWxsIGJlIHNvbHZlZCBieSB0aGUgRE0gc3RhdGUgYWxsb2NhdGlvbiBy ZXdvcmsgYW5kIHRoZQo+PiB0aWxpbmcgZmxhZ3MgdGhpbmcgbmVlZHMgdG8gYmUgc29sdmVkIGJ5 IHN0b3JpbmcgdGhvc2UgaW4gYXRvbWljX2NoZWNrCj4+IGluc3RlYWQgb24gdGhlIHBsYW5lLgo+ Pgo+PiBSZWdhcmRzLAo+PiBOaWNob2xhcyBLYXpsYXVza2FzCj4+Cj4+Pj4KPj4+PiBbMV0gaHR0 cHM6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDczODMjYzk2Cj4+Pj4K Pj4+PiBUaGFua3MsCj4+Pj4gTWF6aW4gUmV6awo+Pj4+Cj4+Pj4+Cj4+Pj4+IENoZWVycywgRGFu aWVsCj4+Pj4+Cj4+Pj4+Pgo+Pj4+Pj4gUmVnYXJkcywKPj4+Pj4+IENocmlzdGlhbi4KPj4+Pj4+ Cj4+Pj4+Pj4KPj4+Pj4+PiBSZWdhcmRzLAo+Pj4+Pj4+IE5pY2hvbGFzIEthemxhdXNrYXMKPj4+ Pj4+Pgo+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IFNpbmNlIHRoaXMgYnVnIGhhcyBvbmx5 IGJlZW4gc3BvdHRlZCB3aXRoIGZhc3QgY29tbWl0cywgdGhpcyBwYXRjaAo+Pj4+Pj4+Pj4gZml4 ZXMKPj4+Pj4+Pj4+IHRoZSBidWcgYnkgY2xlYXJpbmcgdGhlIGRtX3N0YXRlIGluc3RlYWQgb2Yg dXNpbmcgdGhlIG9sZCBkY19zdGF0ZSBmb3IKPj4+Pj4+Pj4+IGZhc3QgdXBkYXRlcy4gSW4gYWRk aXRpb24sIHNpbmNlIGRtX3N0YXRlIGlzIG9ubHkgdXNlZCBmb3IgaXRzIGRjX3N0YXRlCj4+Pj4+ Pj4+PiBhbmQgYW1kZ3B1X2RtX2F0b21pY19jb21taXRfdGFpbCB3aWxsIHJldGFpbiB0aGUgZGNf c3RhdGUgaWYgbm9uZSBpcwo+Pj4+Pj4+Pj4gZm91bmQsCj4+Pj4+Pj4+PiByZW1vdmluZyB0aGUg ZG1fc3RhdGUgc2hvdWxkIG5vdCBoYXZlIGFueSBjb25zZXF1ZW5jZXMgaW4gZmFzdCB1cGRhdGVz Lgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IFRoaXMgdXNlLWFmdGVyLWZyZWUgYnVnIGhhcyBleGlzdGVk IGZvciBhIHdoaWxlIG5vdywgYnV0IG9ubHkgY2F1c2VkIGEKPj4+Pj4+Pj4+IG5vdGljZWFibGUg aXNzdWUgc3RhcnRpbmcgZnJvbSA1LjctcmMxIGR1ZSB0byAzMjAyZmE2MmYgKCJzbHViOgo+Pj4+ Pj4+Pj4gcmVsb2NhdGUKPj4+Pj4+Pj4+IGZyZWVsaXN0IHBvaW50ZXIgdG8gbWlkZGxlIG9mIG9i amVjdCIpIG1vdmluZyB0aGUgZnJlZWxpc3QgcG9pbnRlciBmcm9tCj4+Pj4+Pj4+PiBkbV9zdGF0 ZS0+YmFzZSAod2hpY2ggd2FzIHVudXNlZCkgdG8gZG1fc3RhdGUtPmNvbnRleHQgKHdoaWNoIGlz Cj4+Pj4+Pj4+PiBkZXJlZmVyZW5jZWQpLgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IEJ1Z3ppbGxhOiBo dHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTIwNzM4Mwo+Pj4+Pj4+ Pj4gRml4ZXM6IGJkMjAwZDE5MGY0NSAoImRybS9hbWQvZGlzcGxheTogRG9uJ3QgcmVwbGFjZSB0 aGUgZGNfc3RhdGUKPj4+Pj4+Pj4+IGZvciBmYXN0IHVwZGF0ZXMiKQo+Pj4+Pj4+Pj4gUmVwb3J0 ZWQtYnk6IER1bmNhbiA8MWk1dDUuZHVuY2FuQGNveC5uZXQ+Cj4+Pj4+Pj4+PiBTaWduZWQtb2Zm LWJ5OiBNYXppbiBSZXprIDxtbnJ6a0Bwcm90b25tYWlsLmNvbT4KCkkgdGhpbmsgdGhpcyBwYXRj aCBpcyBPSyB0byBtZXJnZSBmb3Igbm93IGJhc2VkIG9uIHRoZSBkaXNjdXNzaW9uIGluIAp0aGlz IHRocmVhZCBhbmQgdGhlIG90aGVyIG9uZS4gSXQncyBiZXR0ZXIgdGhhbiBoaXR0aW5nIGEgcGFn ZSBmYXVsdCBhdCAKdGhlIHZlcnkgbGVhc3QgYW5kIGl0J3Mgbm90IGEgdmVyeSBpbnRydXNpdmUg Y2hhbmdlLgoKSSdkIHNheSBJJ20gYWJvdXQgaGFsZndheSB0aHJvdWdoIGRldmVsb3BtZW50IG9u IGEgcHJvcGVyIGZpeCBmb3IgdGhpcyAKcGVuZGluZyBubyBJR1QgZmFpbHVyZXMgYXQgbGVhc3Qu CgpTbyBmb3Igbm93LAoKUmV2aWV3ZWQtYnk6IE5pY2hvbGFzIEthemxhdXNrYXMgPG5pY2hvbGFz LmthemxhdXNrYXNAYW1kLmNvbT4KCj4+Pj4+Pj4+PiAtLS0KPj4+Pj4+Pj4+ICAgICAuLi4vZ3B1 L2RybS9hbWQvZGlzcGxheS9hbWRncHVfZG0vYW1kZ3B1X2RtLmMgfCAzNgo+Pj4+Pj4+Pj4gKysr KysrKysrKysrKystLS0tLQo+Pj4+Pj4+Pj4gICAgIDEgZmlsZSBjaGFuZ2VkLCAyNyBpbnNlcnRp b25zKCspLCA5IGRlbGV0aW9ucygtKQo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vYW1kL2Rpc3BsYXkvYW1kZ3B1X2RtL2FtZGdwdV9kbS5jCj4+Pj4+Pj4+ PiBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvZGlzcGxheS9hbWRncHVfZG0vYW1kZ3B1X2RtLmMKPj4+ Pj4+Pj4+IGluZGV4IDg2ZmZhMGMyODgwZi4uNzEwZWRjNzBlMzdlIDEwMDY0NAo+Pj4+Pj4+Pj4g LS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9kaXNwbGF5L2FtZGdwdV9kbS9hbWRncHVfZG0uYwo+ Pj4+Pj4+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9kaXNwbGF5L2FtZGdwdV9kbS9hbWRn cHVfZG0uYwo+Pj4+Pj4+Pj4gQEAgLTg3MTcsMjAgKzg3MTcsMzggQEAgc3RhdGljIGludCBhbWRn cHVfZG1fYXRvbWljX2NoZWNrKHN0cnVjdAo+Pj4+Pj4+Pj4gZHJtX2RldmljZSAqZGV2LAo+Pj4+ Pj4+Pj4gICAgICAgICAgICAgICogdGhlIHNhbWUgcmVzb3VyY2UuIElmIHdlIGhhdmUgYSBuZXcg REMgY29udGV4dCBhcyBwYXJ0IG9mCj4+Pj4+Pj4+PiAgICAgICAgICAgICAgKiB0aGUgRE0gYXRv bWljIHN0YXRlIGZyb20gdmFsaWRhdGlvbiB3ZSBuZWVkIHRvIGZyZWUgaXQgYW5kCj4+Pj4+Pj4+ PiAgICAgICAgICAgICAgKiByZXRhaW4gdGhlIGV4aXN0aW5nIG9uZSBpbnN0ZWFkLgo+Pj4+Pj4+ Pj4gKyAgICAgICAgICoKPj4+Pj4+Pj4+ICsgICAgICAgICAqIEZ1cnRoZXJtb3JlLCBzaW5jZSB0 aGUgRE0gYXRvbWljIHN0YXRlIG9ubHkgY29udGFpbnMgdGhlIERDCj4+Pj4+Pj4+PiArICAgICAg ICAgKiBjb250ZXh0IGFuZCBjYW4gc2FmZWx5IGJlIGFubnVsbGVkLCB3ZSBjYW4gZnJlZSB0aGUg c3RhdGUKPj4+Pj4+Pj4+ICsgICAgICAgICAqIGFuZCBjbGVhciB0aGUgYXNzb2NpYXRlZCBwcml2 YXRlIG9iamVjdCBub3cgdG8gZnJlZQo+Pj4+Pj4+Pj4gKyAgICAgICAgICogc29tZSBtZW1vcnkg YW5kIGF2b2lkIGEgcG9zc2libGUgdXNlLWFmdGVyLWZyZWUgbGF0ZXIuCj4+Pj4+Pj4+PiAgICAg ICAgICAgICAgKi8KPj4+Pj4+Pj4+IC0gICAgICAgIHN0cnVjdCBkbV9hdG9taWNfc3RhdGUgKm5l d19kbV9zdGF0ZSwgKm9sZF9kbV9zdGF0ZTsKPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiAtICAgICAgICBu ZXdfZG1fc3RhdGUgPSBkbV9hdG9taWNfZ2V0X25ld19zdGF0ZShzdGF0ZSk7Cj4+Pj4+Pj4+PiAt ICAgICAgICBvbGRfZG1fc3RhdGUgPSBkbV9hdG9taWNfZ2V0X29sZF9zdGF0ZShzdGF0ZSk7Cj4+ Pj4+Pj4+PiArICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPm51bV9wcml2YXRlX29ianM7 IGkrKykgewo+Pj4+Pj4+Pj4gKyAgICAgICAgICAgIHN0cnVjdCBkcm1fcHJpdmF0ZV9vYmogKm9i aiA9IHN0YXRlLT5wcml2YXRlX29ianNbaV0ucHRyOwo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IC0gICAg ICAgIGlmIChuZXdfZG1fc3RhdGUgJiYgb2xkX2RtX3N0YXRlKSB7Cj4+Pj4+Pj4+PiAtICAgICAg ICAgICAgaWYgKG5ld19kbV9zdGF0ZS0+Y29udGV4dCkKPj4+Pj4+Pj4+IC0gICAgICAgICAgICAg ICAgZGNfcmVsZWFzZV9zdGF0ZShuZXdfZG1fc3RhdGUtPmNvbnRleHQpOwo+Pj4+Pj4+Pj4gKyAg ICAgICAgICAgIGlmIChvYmotPmZ1bmNzID09IGFkZXYtPmRtLmF0b21pY19vYmouZnVuY3MpIHsK Pj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgaW50IGogPSBzdGF0ZS0+bnVtX3ByaXZhdGVfb2Jq cy0xOwo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IC0gICAgICAgICAgICBuZXdfZG1fc3RhdGUtPmNvbnRl eHQgPSBvbGRfZG1fc3RhdGUtPmNvbnRleHQ7Cj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgIGRt X2F0b21pY19kZXN0cm95X3N0YXRlKG9iaiwKPj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICBzdGF0ZS0+cHJpdmF0ZV9vYmpzW2ldLnN0YXRlKTsKPj4+Pj4+Pj4+ICsKPj4+Pj4+Pj4+ ICsgICAgICAgICAgICAgICAgLyogSWYgaSBpcyBub3QgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkg dGhlbiB0aGUKPj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICogbGFzdCBlbGVtZW50IG5lZWRz IHRvIGJlIG1vdmVkIHRvIHdoZXJlIGkgd2FzCj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgICAq IGJlZm9yZSB0aGUgYXJyYXkgY2FuIHNhZmVseSBiZSB0cnVuY2F0ZWQuCj4+Pj4+Pj4+PiArICAg ICAgICAgICAgICAgICAqLwo+Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBqKQo+ Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnByaXZhdGVfb2Jqc1tpXSA9Cj4+ Pj4+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnByaXZhdGVfb2Jqc1tqXTsK Pj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiAtICAgICAgICAgICAgaWYgKG9sZF9kbV9zdGF0ZS0+Y29udGV4 dCkKPj4+Pj4+Pj4+IC0gICAgICAgICAgICAgICAgZGNfcmV0YWluX3N0YXRlKG9sZF9kbV9zdGF0 ZS0+Y29udGV4dCk7Cj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgIHN0YXRlLT5wcml2YXRlX29i anNbal0ucHRyID0gTlVMTDsKPj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgc3RhdGUtPnByaXZh dGVfb2Jqc1tqXS5zdGF0ZSA9IE5VTEw7Cj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgIHN0YXRl LT5wcml2YXRlX29ianNbal0ub2xkX3N0YXRlID0gTlVMTDsKPj4+Pj4+Pj4+ICsgICAgICAgICAg ICAgICAgc3RhdGUtPnByaXZhdGVfb2Jqc1tqXS5uZXdfc3RhdGUgPSBOVUxMOwo+Pj4+Pj4+Pj4g Kwo+Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICBzdGF0ZS0+bnVtX3ByaXZhdGVfb2JqcyA9IGo7 Cj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgIGJyZWFrOwo+Pj4+Pj4+Pj4gKyAgICAgICAgICAg IH0KPj4+Pj4+Pj4+ICAgICAgICAgICAgIH0KPj4+Pj4+Pj4+ICAgICAgICAgfQo+Pj4+Pj4+Pj4K Pj4+Pj4+Pj4+IC0tCj4+Pj4+Pj4+PiAyLjI3LjAKPj4+Pj4+Pj4+Cj4+Pj4+Pj4+Cj4+Pj4+Pj4K Pj4+Pj4+Cj4+Pj4+PiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwo+Pj4+Pj4gZHJpLWRldmVsIG1haWxpbmcgbGlzdAo+Pj4+Pj4gZHJpLWRldmVsQGxpc3Rz LmZyZWVkZXNrdG9wLm9yZwo+Pj4+Pj4gaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9kcmktZGV2ZWwKPj4+Pj4KPj4+Pj4KPj4+Pj4KPj4+Pj4gLS0KPj4+Pj4g RGFuaWVsIFZldHRlcgo+Pj4+PiBTb2Z0d2FyZSBFbmdpbmVlciwgSW50ZWwgQ29ycG9yYXRpb24K Pj4+Pj4gaHR0cDovL2Jsb2cuZmZ3bGwuY2gvCj4+Pgo+Pj4KPj4+Cj4+Cj4gCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwphbWQtZ2Z4IG1haWxpbmcgbGlz dAphbWQtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2FtZC1nZngK