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 F1B5AC001DE for ; Thu, 13 Jul 2023 20:30:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231597AbjGMUay (ORCPT ); Thu, 13 Jul 2023 16:30:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56152 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230456AbjGMUax (ORCPT ); Thu, 13 Jul 2023 16:30:53 -0400 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 899A92120; Thu, 13 Jul 2023 13:30:52 -0700 (PDT) Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 36DJsYpk020458; Thu, 13 Jul 2023 20:30:32 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=message-id : date : mime-version : subject : from : to : cc : references : in-reply-to : content-type : content-transfer-encoding; s=qcppdkim1; bh=vs8LTN8zAxmwQ45mO8Cvh/7DVenMQkWIcHjbBWki//w=; b=U4qmgeJ6zKaSFk+MiBo4TJ6HKrOz2Xaz+CcN/+xW69xM0I+H+7Aw15sJRE8DUQfuYRK8 XBjJ/g0YUGpGzzcNVxMNImMNZrTY5Tl8yXAguO4RleYQynDfemoZ26PiRekPMvSDW6qa 1U2okeuSweg19uXSytPCnZZRuZjCBZlV7LHyMTW0DnXtcrAvMsgKAUbDezQftR5v+9K+ dXHjMiDqfd5d1UxX+wxNGCWtxX3WW8BDuKRcnXrHrw8l1xBUMA210qlAKo60qsvanpiW 2KAmYGTwwtAkjjAAgw+LuyYcAqQ1pdSYYqOsoguFR+pAEYXJkaN8FGkrBJCQ+kuAPsl7 +w== Received: from nasanppmta02.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3rtptu864u-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 13 Jul 2023 20:30:31 +0000 Received: from nasanex01b.na.qualcomm.com (nasanex01b.na.qualcomm.com [10.46.141.250]) by NASANPPMTA02.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 36DKUUkl029931 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 13 Jul 2023 20:30:30 GMT Received: from [10.110.48.195] (10.80.80.8) by nasanex01b.na.qualcomm.com (10.46.141.250) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.30; Thu, 13 Jul 2023 13:28:35 -0700 Message-ID: <04605642-cad8-1701-ff41-63f2f00ba5f6@quicinc.com> Date: Thu, 13 Jul 2023 13:28:34 -0700 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Subject: Re: [PATCH v13 10/24] gunyah: vm_mgr: Add/remove user memory regions Content-Language: en-US From: Elliot Berman To: Will Deacon CC: Alex Elder , Srinivas Kandagatla , Prakruthi Deepak Heragu , Murali Nalajala , Trilok Soni , Srivatsa Vaddagiri , Carl van Schaik , Dmitry Baryshkov , Bjorn Andersson , Konrad Dybcio , "Arnd Bergmann" , Greg Kroah-Hartman , Rob Herring , Krzysztof Kozlowski , Jonathan Corbet , "Bagas Sanjaya" , Andy Gross , "Catalin Marinas" , Jassi Brar , , , , , , References: <20230509204801.2824351-1-quic_eberman@quicinc.com> <20230509204801.2824351-11-quic_eberman@quicinc.com> <20230519115948.GB2637@willie-the-truck> <20230605141839.GD21212@willie-the-truck> <3bd86221-ee2e-d157-009b-11f6ada98537@quicinc.com> In-Reply-To: Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01b.na.qualcomm.com (10.46.141.250) To nasanex01b.na.qualcomm.com (10.46.141.250) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: 3oym6Wpenj-Rn6j76kn-kvjFzKHYvRg7 X-Proofpoint-ORIG-GUID: 3oym6Wpenj-Rn6j76kn-kvjFzKHYvRg7 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.957,Hydra:6.0.591,FMLib:17.11.176.26 definitions=2023-07-13_08,2023-07-13_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 phishscore=0 lowpriorityscore=0 clxscore=1015 mlxscore=0 suspectscore=0 adultscore=0 mlxlogscore=812 spamscore=0 impostorscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2306200000 definitions=main-2307130181 Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org Hi Will, On 6/22/2023 4:56 PM, Elliot Berman wrote: > > > On 6/7/2023 8:54 AM, Elliot Berman wrote: >> >> >> On 6/5/2023 7:18 AM, Will Deacon wrote: >>> Hi Elliot, >>> >>> [+Quentin since he's looked at the MMU notifiers] >>> >>> Sorry for the slow response, I got buried in email during a week away. >>> >>> On Fri, May 19, 2023 at 10:02:29AM -0700, Elliot Berman wrote: >>>> On 5/19/2023 4:59 AM, Will Deacon wrote: >>>>> On Tue, May 09, 2023 at 01:47:47PM -0700, Elliot Berman wrote: >>>>>> +    ret = account_locked_vm(ghvm->mm, mapping->npages, true); >>>>>> +    if (ret) >>>>>> +        goto free_mapping; >>>>>> + >>>>>> +    mapping->pages = kcalloc(mapping->npages, >>>>>> sizeof(*mapping->pages), GFP_KERNEL_ACCOUNT); >>>>>> +    if (!mapping->pages) { >>>>>> +        ret = -ENOMEM; >>>>>> +        mapping->npages = 0; /* update npages for reclaim */ >>>>>> +        goto unlock_pages; >>>>>> +    } >>>>>> + >>>>>> +    gup_flags = FOLL_LONGTERM; >>>>>> +    if (region->flags & GH_MEM_ALLOW_WRITE) >>>>>> +        gup_flags |= FOLL_WRITE; >>>>>> + >>>>>> +    pinned = pin_user_pages_fast(region->userspace_addr, >>>>>> mapping->npages, >>>>>> +                    gup_flags, mapping->pages); >>>>>> +    if (pinned < 0) { >>>>>> +        ret = pinned; >>>>>> +        goto free_pages; >>>>>> +    } else if (pinned != mapping->npages) { >>>>>> +        ret = -EFAULT; >>>>>> +        mapping->npages = pinned; /* update npages for reclaim */ >>>>>> +        goto unpin_pages; >>>>>> +    } >>>>> >>>>> Sorry if I missed it, but I still don't see where you reject file >>>>> mappings >>>>> here. >>>>> >>>> >>>> Sure, I can reject file mappings. I didn't catch that was the ask >>>> previously >>>> and thought it was only a comment about behavior of file mappings. >>> >>> I thought the mention of filesystem corruption was clear enough! It's >>> definitely something we shouldn't allow. >>> >>>>> This is also the wrong interface for upstream. Please get involved >>>>> with >>>>> the fd-based guest memory discussions [1] and port your series to >>>>> that. >>>>> >>>> >>>> The user interface design for *shared* memory aligns with >>>> KVM_SET_USER_MEMORY_REGION. >>> >>> I don't think it does. For example, file mappings don't work (as above), >>> you're placing additional rlimit requirements on the caller, read-only >>> memslots are not functional, the memory cannot be swapped or migrated, >>> dirty logging doesn't work etc. pKVM is in the same boat, but that's why >>> we're not upstreaming this part in its current form. >>> >> >> I thought pKVM was only holding off on upstreaming changes related to >> guest-private memory? >> >>>> I understood we want to use restricted memfd for giving >>>> guest-private memory >>>> (Gunyah calls this "lending memory"). When I went through the >>>> changes, I >>>> gathered KVM is using restricted memfd only for guest-private memory >>>> and not >>>> for shared memory. Thus, I dropped support for lending memory to the >>>> guest >>>> VM and only retained the shared memory support in this series. I'd >>>> like to >>>> merge what we can today and introduce the guest-private memory >>>> support in >>>> tandem with the restricted memfd; I don't see much reason to delay the >>>> series. >>> >>> Right, protected guests will use the new restricted memfd ("guest mem" >>> now, I think?), but non-protected guests should implement the existing >>> interface *without* the need for the GUP pin on guest memory pages. Yes, >>> that means full support for MMU notifiers so that these pages can be >>> managed properly by the host kernel. We're working on that for pKVM, but >>> it requires a more flexible form of memory sharing over what we >>> currently >>> have so that e.g. the zero page can be shared between multiple entities. >> >> Gunyah doesn't support swapping pages out while the guest is running >> and the design of Gunyah isn't made to give host kernel full control >> over the S2 page table for its guests. As best I can tell from reading >> the respective drivers, ACRN and Nitro Enclaves both GUP pin guest >> memory pages prior to giving them to the guest, so I don't think this >> requirement from Gunyah is particularly unusual. >> > > I read/dug into mmu notifiers more and I don't think it matches with > Gunyah's features today. We don't allow the host to freely manage VM's > pages because it requires the guest VM to have a level of trust on the > host. Once a page is given to the guest, it's done for the lifetime of > the VM. Allowing the host to replace pages in the guest memory map isn't > part of any VM's security model that we run in Gunyah. With that > requirement, longterm pinning looks like the correct approach to me. Is my approach of longterm pinning correct given that Gunyah doesn't allow host to freely swap pages? 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 06693C001DE for ; Thu, 13 Jul 2023 20:31:29 +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-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:References:CC:To:From:Subject: MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=PkWCQ16qC9CnDwwj59TDp+q7m1LtR9cD2Kc6DEcgfJg=; b=C9/gbjnDKUiwZ2 8SDXfJ2eMCuetfq1wEjDKHJoGG5kSVK4gQvMyn1ooBLP49M2YXW9E7E3J9Vb7eqNzFhWCk9msuL8A NkIBOK2mK62H5NmQU9ylbCCU4pHlGwBZHqPPITlC+KgCli//H4qyxozrhPFQEAskAVKq9/X0Esv2A LVU99wxSP0rUSkRXJc8mukJxDH93T2YIjBCQJryBwK6TWG8+1Nd8x2tQbO8vGsBYMivdaNeGO+uic bgwsLAFbH/6LdfOqArhWY7g0VRv1ZERpSTXnNEfHGW/Wf2/4UYbC4HTemJO/MlaHI4fkyoRfT/fHs dz2nYmp8r8HZVT8kUMwQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qK2xi-004JTU-26; Thu, 13 Jul 2023 20:30:54 +0000 Received: from mx0a-0031df01.pphosted.com ([205.220.168.131]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qK2xe-004JSY-1Y for linux-arm-kernel@lists.infradead.org; Thu, 13 Jul 2023 20:30:52 +0000 Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 36DJsYpk020458; Thu, 13 Jul 2023 20:30:32 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=message-id : date : mime-version : subject : from : to : cc : references : in-reply-to : content-type : content-transfer-encoding; s=qcppdkim1; bh=vs8LTN8zAxmwQ45mO8Cvh/7DVenMQkWIcHjbBWki//w=; b=U4qmgeJ6zKaSFk+MiBo4TJ6HKrOz2Xaz+CcN/+xW69xM0I+H+7Aw15sJRE8DUQfuYRK8 XBjJ/g0YUGpGzzcNVxMNImMNZrTY5Tl8yXAguO4RleYQynDfemoZ26PiRekPMvSDW6qa 1U2okeuSweg19uXSytPCnZZRuZjCBZlV7LHyMTW0DnXtcrAvMsgKAUbDezQftR5v+9K+ dXHjMiDqfd5d1UxX+wxNGCWtxX3WW8BDuKRcnXrHrw8l1xBUMA210qlAKo60qsvanpiW 2KAmYGTwwtAkjjAAgw+LuyYcAqQ1pdSYYqOsoguFR+pAEYXJkaN8FGkrBJCQ+kuAPsl7 +w== Received: from nasanppmta02.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3rtptu864u-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 13 Jul 2023 20:30:31 +0000 Received: from nasanex01b.na.qualcomm.com (nasanex01b.na.qualcomm.com [10.46.141.250]) by NASANPPMTA02.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 36DKUUkl029931 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 13 Jul 2023 20:30:30 GMT Received: from [10.110.48.195] (10.80.80.8) by nasanex01b.na.qualcomm.com (10.46.141.250) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.30; Thu, 13 Jul 2023 13:28:35 -0700 Message-ID: <04605642-cad8-1701-ff41-63f2f00ba5f6@quicinc.com> Date: Thu, 13 Jul 2023 13:28:34 -0700 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Subject: Re: [PATCH v13 10/24] gunyah: vm_mgr: Add/remove user memory regions Content-Language: en-US From: Elliot Berman To: Will Deacon CC: Alex Elder , Srinivas Kandagatla , Prakruthi Deepak Heragu , Murali Nalajala , Trilok Soni , Srivatsa Vaddagiri , Carl van Schaik , Dmitry Baryshkov , Bjorn Andersson , Konrad Dybcio , "Arnd Bergmann" , Greg Kroah-Hartman , Rob Herring , Krzysztof Kozlowski , Jonathan Corbet , "Bagas Sanjaya" , Andy Gross , "Catalin Marinas" , Jassi Brar , , , , , , References: <20230509204801.2824351-1-quic_eberman@quicinc.com> <20230509204801.2824351-11-quic_eberman@quicinc.com> <20230519115948.GB2637@willie-the-truck> <20230605141839.GD21212@willie-the-truck> <3bd86221-ee2e-d157-009b-11f6ada98537@quicinc.com> In-Reply-To: X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01b.na.qualcomm.com (10.46.141.250) To nasanex01b.na.qualcomm.com (10.46.141.250) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: 3oym6Wpenj-Rn6j76kn-kvjFzKHYvRg7 X-Proofpoint-ORIG-GUID: 3oym6Wpenj-Rn6j76kn-kvjFzKHYvRg7 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.957,Hydra:6.0.591,FMLib:17.11.176.26 definitions=2023-07-13_08,2023-07-13_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 phishscore=0 lowpriorityscore=0 clxscore=1015 mlxscore=0 suspectscore=0 adultscore=0 mlxlogscore=812 spamscore=0 impostorscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2306200000 definitions=main-2307130181 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230713_133050_526640_81222813 X-CRM114-Status: GOOD ( 34.08 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgV2lsbCwKCk9uIDYvMjIvMjAyMyA0OjU2IFBNLCBFbGxpb3QgQmVybWFuIHdyb3RlOgo+IAo+ IAo+IE9uIDYvNy8yMDIzIDg6NTQgQU0sIEVsbGlvdCBCZXJtYW4gd3JvdGU6Cj4+Cj4+Cj4+IE9u IDYvNS8yMDIzIDc6MTggQU0sIFdpbGwgRGVhY29uIHdyb3RlOgo+Pj4gSGkgRWxsaW90LAo+Pj4K Pj4+IFsrUXVlbnRpbiBzaW5jZSBoZSdzIGxvb2tlZCBhdCB0aGUgTU1VIG5vdGlmaWVyc10KPj4+ Cj4+PiBTb3JyeSBmb3IgdGhlIHNsb3cgcmVzcG9uc2UsIEkgZ290IGJ1cmllZCBpbiBlbWFpbCBk dXJpbmcgYSB3ZWVrIGF3YXkuCj4+Pgo+Pj4gT24gRnJpLCBNYXkgMTksIDIwMjMgYXQgMTA6MDI6 MjlBTSAtMDcwMCwgRWxsaW90IEJlcm1hbiB3cm90ZToKPj4+PiBPbiA1LzE5LzIwMjMgNDo1OSBB TSwgV2lsbCBEZWFjb24gd3JvdGU6Cj4+Pj4+IE9uIFR1ZSwgTWF5IDA5LCAyMDIzIGF0IDAxOjQ3 OjQ3UE0gLTA3MDAsIEVsbGlvdCBCZXJtYW4gd3JvdGU6Cj4+Pj4+PiArwqDCoMKgIHJldCA9IGFj Y291bnRfbG9ja2VkX3ZtKGdodm0tPm1tLCBtYXBwaW5nLT5ucGFnZXMsIHRydWUpOwo+Pj4+Pj4g K8KgwqDCoCBpZiAocmV0KQo+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gZnJlZV9tYXBwaW5n Owo+Pj4+Pj4gKwo+Pj4+Pj4gK8KgwqDCoCBtYXBwaW5nLT5wYWdlcyA9IGtjYWxsb2MobWFwcGlu Zy0+bnBhZ2VzLCAKPj4+Pj4+IHNpemVvZigqbWFwcGluZy0+cGFnZXMpLCBHRlBfS0VSTkVMX0FD Q09VTlQpOwo+Pj4+Pj4gK8KgwqDCoCBpZiAoIW1hcHBpbmctPnBhZ2VzKSB7Cj4+Pj4+PiArwqDC oMKgwqDCoMKgwqAgcmV0ID0gLUVOT01FTTsKPj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCBtYXBwaW5n LT5ucGFnZXMgPSAwOyAvKiB1cGRhdGUgbnBhZ2VzIGZvciByZWNsYWltICovCj4+Pj4+PiArwqDC oMKgwqDCoMKgwqAgZ290byB1bmxvY2tfcGFnZXM7Cj4+Pj4+PiArwqDCoMKgIH0KPj4+Pj4+ICsK Pj4+Pj4+ICvCoMKgwqAgZ3VwX2ZsYWdzID0gRk9MTF9MT05HVEVSTTsKPj4+Pj4+ICvCoMKgwqAg aWYgKHJlZ2lvbi0+ZmxhZ3MgJiBHSF9NRU1fQUxMT1dfV1JJVEUpCj4+Pj4+PiArwqDCoMKgwqDC oMKgwqAgZ3VwX2ZsYWdzIHw9IEZPTExfV1JJVEU7Cj4+Pj4+PiArCj4+Pj4+PiArwqDCoMKgIHBp bm5lZCA9IHBpbl91c2VyX3BhZ2VzX2Zhc3QocmVnaW9uLT51c2Vyc3BhY2VfYWRkciwgCj4+Pj4+ PiBtYXBwaW5nLT5ucGFnZXMsCj4+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgZ3VwX2ZsYWdzLCBtYXBwaW5nLT5wYWdlcyk7Cj4+Pj4+PiArwqDCoMKgIGlmIChw aW5uZWQgPCAwKSB7Cj4+Pj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0ID0gcGlubmVkOwo+Pj4+Pj4g K8KgwqDCoMKgwqDCoMKgIGdvdG8gZnJlZV9wYWdlczsKPj4+Pj4+ICvCoMKgwqAgfSBlbHNlIGlm IChwaW5uZWQgIT0gbWFwcGluZy0+bnBhZ2VzKSB7Cj4+Pj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0 ID0gLUVGQVVMVDsKPj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCBtYXBwaW5nLT5ucGFnZXMgPSBwaW5u ZWQ7IC8qIHVwZGF0ZSBucGFnZXMgZm9yIHJlY2xhaW0gKi8KPj4+Pj4+ICvCoMKgwqDCoMKgwqDC oCBnb3RvIHVucGluX3BhZ2VzOwo+Pj4+Pj4gK8KgwqDCoCB9Cj4+Pj4+Cj4+Pj4+IFNvcnJ5IGlm IEkgbWlzc2VkIGl0LCBidXQgSSBzdGlsbCBkb24ndCBzZWUgd2hlcmUgeW91IHJlamVjdCBmaWxl IAo+Pj4+PiBtYXBwaW5ncwo+Pj4+PiBoZXJlLgo+Pj4+Pgo+Pj4+Cj4+Pj4gU3VyZSwgSSBjYW4g cmVqZWN0IGZpbGUgbWFwcGluZ3MuIEkgZGlkbid0IGNhdGNoIHRoYXQgd2FzIHRoZSBhc2sgCj4+ Pj4gcHJldmlvdXNseQo+Pj4+IGFuZCB0aG91Z2h0IGl0IHdhcyBvbmx5IGEgY29tbWVudCBhYm91 dCBiZWhhdmlvciBvZiBmaWxlIG1hcHBpbmdzLgo+Pj4KPj4+IEkgdGhvdWdodCB0aGUgbWVudGlv biBvZiBmaWxlc3lzdGVtIGNvcnJ1cHRpb24gd2FzIGNsZWFyIGVub3VnaCEgSXQncwo+Pj4gZGVm aW5pdGVseSBzb21ldGhpbmcgd2Ugc2hvdWxkbid0IGFsbG93Lgo+Pj4KPj4+Pj4gVGhpcyBpcyBh bHNvIHRoZSB3cm9uZyBpbnRlcmZhY2UgZm9yIHVwc3RyZWFtLiBQbGVhc2UgZ2V0IGludm9sdmVk IAo+Pj4+PiB3aXRoCj4+Pj4+IHRoZSBmZC1iYXNlZCBndWVzdCBtZW1vcnkgZGlzY3Vzc2lvbnMg WzFdIGFuZCBwb3J0IHlvdXIgc2VyaWVzIHRvIAo+Pj4+PiB0aGF0Lgo+Pj4+Pgo+Pj4+Cj4+Pj4g VGhlIHVzZXIgaW50ZXJmYWNlIGRlc2lnbiBmb3IgKnNoYXJlZCogbWVtb3J5IGFsaWducyB3aXRo Cj4+Pj4gS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04uCj4+Pgo+Pj4gSSBkb24ndCB0aGluayBp dCBkb2VzLiBGb3IgZXhhbXBsZSwgZmlsZSBtYXBwaW5ncyBkb24ndCB3b3JrIChhcyBhYm92ZSks Cj4+PiB5b3UncmUgcGxhY2luZyBhZGRpdGlvbmFsIHJsaW1pdCByZXF1aXJlbWVudHMgb24gdGhl IGNhbGxlciwgcmVhZC1vbmx5Cj4+PiBtZW1zbG90cyBhcmUgbm90IGZ1bmN0aW9uYWwsIHRoZSBt ZW1vcnkgY2Fubm90IGJlIHN3YXBwZWQgb3IgbWlncmF0ZWQsCj4+PiBkaXJ0eSBsb2dnaW5nIGRv ZXNuJ3Qgd29yayBldGMuIHBLVk0gaXMgaW4gdGhlIHNhbWUgYm9hdCwgYnV0IHRoYXQncyB3aHkK Pj4+IHdlJ3JlIG5vdCB1cHN0cmVhbWluZyB0aGlzIHBhcnQgaW4gaXRzIGN1cnJlbnQgZm9ybS4K Pj4+Cj4+Cj4+IEkgdGhvdWdodCBwS1ZNIHdhcyBvbmx5IGhvbGRpbmcgb2ZmIG9uIHVwc3RyZWFt aW5nIGNoYW5nZXMgcmVsYXRlZCB0byAKPj4gZ3Vlc3QtcHJpdmF0ZSBtZW1vcnk/Cj4+Cj4+Pj4g SSB1bmRlcnN0b29kIHdlIHdhbnQgdG8gdXNlIHJlc3RyaWN0ZWQgbWVtZmQgZm9yIGdpdmluZyAK Pj4+PiBndWVzdC1wcml2YXRlIG1lbW9yeQo+Pj4+IChHdW55YWggY2FsbHMgdGhpcyAibGVuZGlu ZyBtZW1vcnkiKS4gV2hlbiBJIHdlbnQgdGhyb3VnaCB0aGUgCj4+Pj4gY2hhbmdlcywgSQo+Pj4+ IGdhdGhlcmVkIEtWTSBpcyB1c2luZyByZXN0cmljdGVkIG1lbWZkIG9ubHkgZm9yIGd1ZXN0LXBy aXZhdGUgbWVtb3J5IAo+Pj4+IGFuZCBub3QKPj4+PiBmb3Igc2hhcmVkIG1lbW9yeS4gVGh1cywg SSBkcm9wcGVkIHN1cHBvcnQgZm9yIGxlbmRpbmcgbWVtb3J5IHRvIHRoZSAKPj4+PiBndWVzdAo+ Pj4+IFZNIGFuZCBvbmx5IHJldGFpbmVkIHRoZSBzaGFyZWQgbWVtb3J5IHN1cHBvcnQgaW4gdGhp cyBzZXJpZXMuIEknZCAKPj4+PiBsaWtlIHRvCj4+Pj4gbWVyZ2Ugd2hhdCB3ZSBjYW4gdG9kYXkg YW5kIGludHJvZHVjZSB0aGUgZ3Vlc3QtcHJpdmF0ZSBtZW1vcnkgCj4+Pj4gc3VwcG9ydCBpbgo+ Pj4+IHRhbmRlbSB3aXRoIHRoZSByZXN0cmljdGVkIG1lbWZkOyBJIGRvbid0IHNlZSBtdWNoIHJl YXNvbiB0byBkZWxheSB0aGUKPj4+PiBzZXJpZXMuCj4+Pgo+Pj4gUmlnaHQsIHByb3RlY3RlZCBn dWVzdHMgd2lsbCB1c2UgdGhlIG5ldyByZXN0cmljdGVkIG1lbWZkICgiZ3Vlc3QgbWVtIgo+Pj4g bm93LCBJIHRoaW5rPyksIGJ1dCBub24tcHJvdGVjdGVkIGd1ZXN0cyBzaG91bGQgaW1wbGVtZW50 IHRoZSBleGlzdGluZwo+Pj4gaW50ZXJmYWNlICp3aXRob3V0KiB0aGUgbmVlZCBmb3IgdGhlIEdV UCBwaW4gb24gZ3Vlc3QgbWVtb3J5IHBhZ2VzLiBZZXMsCj4+PiB0aGF0IG1lYW5zIGZ1bGwgc3Vw cG9ydCBmb3IgTU1VIG5vdGlmaWVycyBzbyB0aGF0IHRoZXNlIHBhZ2VzIGNhbiBiZQo+Pj4gbWFu YWdlZCBwcm9wZXJseSBieSB0aGUgaG9zdCBrZXJuZWwuIFdlJ3JlIHdvcmtpbmcgb24gdGhhdCBm b3IgcEtWTSwgYnV0Cj4+PiBpdCByZXF1aXJlcyBhIG1vcmUgZmxleGlibGUgZm9ybSBvZiBtZW1v cnkgc2hhcmluZyBvdmVyIHdoYXQgd2UgCj4+PiBjdXJyZW50bHkKPj4+IGhhdmUgc28gdGhhdCBl LmcuIHRoZSB6ZXJvIHBhZ2UgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIGVudGl0aWVz Lgo+Pgo+PiBHdW55YWggZG9lc24ndCBzdXBwb3J0IHN3YXBwaW5nIHBhZ2VzIG91dCB3aGlsZSB0 aGUgZ3Vlc3QgaXMgcnVubmluZyAKPj4gYW5kIHRoZSBkZXNpZ24gb2YgR3VueWFoIGlzbid0IG1h ZGUgdG8gZ2l2ZSBob3N0IGtlcm5lbCBmdWxsIGNvbnRyb2wgCj4+IG92ZXIgdGhlIFMyIHBhZ2Ug dGFibGUgZm9yIGl0cyBndWVzdHMuIEFzIGJlc3QgSSBjYW4gdGVsbCBmcm9tIHJlYWRpbmcgCj4+ IHRoZSByZXNwZWN0aXZlIGRyaXZlcnMsIEFDUk4gYW5kIE5pdHJvIEVuY2xhdmVzIGJvdGggR1VQ IHBpbiBndWVzdCAKPj4gbWVtb3J5IHBhZ2VzIHByaW9yIHRvIGdpdmluZyB0aGVtIHRvIHRoZSBn dWVzdCwgc28gSSBkb24ndCB0aGluayB0aGlzIAo+PiByZXF1aXJlbWVudCBmcm9tIEd1bnlhaCBp cyBwYXJ0aWN1bGFybHkgdW51c3VhbC4KPj4KPiAKPiBJIHJlYWQvZHVnIGludG8gbW11IG5vdGlm aWVycyBtb3JlIGFuZCBJIGRvbid0IHRoaW5rIGl0IG1hdGNoZXMgd2l0aCAKPiBHdW55YWgncyBm ZWF0dXJlcyB0b2RheS4gV2UgZG9uJ3QgYWxsb3cgdGhlIGhvc3QgdG8gZnJlZWx5IG1hbmFnZSBW TSdzIAo+IHBhZ2VzIGJlY2F1c2UgaXQgcmVxdWlyZXMgdGhlIGd1ZXN0IFZNIHRvIGhhdmUgYSBs ZXZlbCBvZiB0cnVzdCBvbiB0aGUgCj4gaG9zdC4gT25jZSBhIHBhZ2UgaXMgZ2l2ZW4gdG8gdGhl IGd1ZXN0LCBpdCdzIGRvbmUgZm9yIHRoZSBsaWZldGltZSBvZiAKPiB0aGUgVk0uIEFsbG93aW5n IHRoZSBob3N0IHRvIHJlcGxhY2UgcGFnZXMgaW4gdGhlIGd1ZXN0IG1lbW9yeSBtYXAgaXNuJ3Qg Cj4gcGFydCBvZiBhbnkgVk0ncyBzZWN1cml0eSBtb2RlbCB0aGF0IHdlIHJ1biBpbiBHdW55YWgu IFdpdGggdGhhdCAKPiByZXF1aXJlbWVudCwgbG9uZ3Rlcm0gcGlubmluZyBsb29rcyBsaWtlIHRo ZSBjb3JyZWN0IGFwcHJvYWNoIHRvIG1lLgoKSXMgbXkgYXBwcm9hY2ggb2YgbG9uZ3Rlcm0gcGlu bmluZyBjb3JyZWN0IGdpdmVuIHRoYXQgR3VueWFoIGRvZXNuJ3QgCmFsbG93IGhvc3QgdG8gZnJl ZWx5IHN3YXAgcGFnZXM/CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxp c3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0 aW5mby9saW51eC1hcm0ta2VybmVsCg==