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 98E6EC77B77 for ; Mon, 17 Apr 2023 13:23:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229548AbjDQNXj (ORCPT ); Mon, 17 Apr 2023 09:23:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51482 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229542AbjDQNXi (ORCPT ); Mon, 17 Apr 2023 09:23:38 -0400 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 71F1830DC; Mon, 17 Apr 2023 06:23:36 -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 33H8skMm024804; Mon, 17 Apr 2023 13:23:11 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=message-id : date : mime-version : subject : to : cc : references : from : in-reply-to : content-type : content-transfer-encoding; s=qcppdkim1; bh=XwpxomG3rWLUbB1XoGemSNYyJ/Toe7thPIH7pe9chAk=; b=S8FqyamOHb23BHlkjwJs5p3YHjKG7n+qkDhbcxKA5hVZ/bzWzAM46ueheZg2eU7pljTT 2AYLpWanpCzCRUkisn5h0bTZOvgFppSboeHIK2K8Bbn/XyVUdmDMbgt6LXOcLmgLbqUS O6e/pP1vZp+lbKlq0A89ujQ0rQkP3TDZBsIIg425x/dGpcGXnvPfo+MXLbrmQzz0bWw+ vPnCj6iUf+0nMfwCjYixXuV5O9BASf2o0yBYYBszXlJFi52fmsFkmfm/OkT/uJRSALWk UCccXUiSAMdJRnIvheMmZ916Qao3WL+PT6AxcwpPJ6dTQ+n7e49WM9Z1OGB4fuY47re1 6w== Received: from nasanppmta03.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3pymneuk0j-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 17 Apr 2023 13:23:11 +0000 Received: from nasanex01c.na.qualcomm.com (nasanex01c.na.qualcomm.com [10.45.79.139]) by NASANPPMTA03.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 33HDNA82020535 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 17 Apr 2023 13:23:10 GMT Received: from [10.216.21.23] (10.80.80.8) by nasanex01c.na.qualcomm.com (10.45.79.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.42; Mon, 17 Apr 2023 06:23:04 -0700 Message-ID: Date: Mon, 17 Apr 2023 18:52:17 +0530 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.8.0 Subject: Re: [PATCH v2 2/6] remoteproc: qcom: Move minidump specific data to qcom_minidump.h To: Srinivas Kandagatla , , , , , , , , , CC: , , , , , References: <1679491817-2498-1-git-send-email-quic_mojha@quicinc.com> <1679491817-2498-3-git-send-email-quic_mojha@quicinc.com> <3df1ec27-7e4d-1f84-ff20-94e8ea91c86f@quicinc.com> <040a1992-baff-c3e4-69a9-ff3110de62e7@linaro.org> Content-Language: en-US From: Mukesh Ojha In-Reply-To: <040a1992-baff-c3e4-69a9-ff3110de62e7@linaro.org> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nasanex01c.na.qualcomm.com (10.45.79.139) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-ORIG-GUID: Btf2zd7RS_BmGpJ7-xz9tMB6k9gpt69W X-Proofpoint-GUID: Btf2zd7RS_BmGpJ7-xz9tMB6k9gpt69W X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-04-17_08,2023-04-17_01,2023-02-09_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxlogscore=999 phishscore=0 lowpriorityscore=0 clxscore=1015 mlxscore=0 spamscore=0 impostorscore=0 malwarescore=0 bulkscore=0 priorityscore=1501 adultscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2303200000 definitions=main-2304170120 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org On 4/14/2023 4:10 PM, Srinivas Kandagatla wrote: > > > On 14/04/2023 08:05, Mukesh Ojha wrote: >> Thanks again for coming back on this. >> >> On 4/14/2023 4:02 AM, Srinivas Kandagatla wrote: >>> >>> >>> On 22/03/2023 13:30, Mukesh Ojha wrote: >>>> Move minidump specific data types and macros to a separate internal >>>> header(qcom_minidump.h) so that it can be shared among different >>> >>> minidump.h should be good as we are already in include/soc/qcom/ >> >> >> Initially, i wanted to protect the content of qcom_minidump.h between >> qcom_minidump.c and qcom_common.c >> >> Ideally, here qcom_minidump.h should be supplier/provider header and can > > Am not sure if I understand the supplier concept correctly. > AFAIU, we have a 2 sets of apis > > 1. get hold of minidump descriptor based on minidump_id fro gtoc using > qcom_minidump_subsystem_desc(). Am assuming which ever driver uses this > api will set there segments and regions in there respective drivers. > > 2. setting regions/segments in APSS minidump descriptors which are done > via qcom_minidump_region_register(). TBH this should be renamed to > qcom_apss_minidump_region_register(). > > mixing of thsee apis makes it bit confusing, specially we have these two > category of apis that deal with different things. > > Does it make sense to spit and abstract them properly by doing? > > > 1. minidump driver to deal with handling gtoc and providing descriptors > to the consumers like remoteproc or apss, This can probably live within > smem driver as loc for this support is very minimal and proabably rename > the api accordingly. > > 2. apss_minidump driver to allow other qcom drivers to > register/unregister regions within apss minidump descriptor. > > did I miss something? No, you are correct with your understanding. To your suggestion to split code and to keep qcom_minidump_subsystem_desc() live inside smem driver, And how about the header qcom_minidump.h, should we keep it separate than the apss minidump client header minidump.h ? Since, you kind of understand the driver now, do you think it is worth to create platform device for minidump from smem driver, and have a probe inside apss minidump driver to solve chicken and egg problem for the clients who comes before minidump and try to register itself without doing ready check and apss_minidump can note this client entry and only register this region once minidump probe success and then it can register all the noted clients in one go. The reason to do this would be apss_minidump driver has no meaning without smem, and for this reason checking qcom_minidump_ready() would not be ideal for at least qcom clients and for core kernel may be. --Mukesh > > thanks, > Srini > >> be shared among above qcom_minidump.c and qcom_common.c but since they >> are not in same directory, moved it inside include/soc/qcom/ as >> separate header than consumer header minidump.h . > >> -Mukesh >>> >>> --srini >>> >>>> Qualcomm drivers. >>>> >>>> There is no change in functional behavior after this. >>>> >>>> Signed-off-by: Mukesh Ojha >>>> --- >>>>   drivers/remoteproc/qcom_common.c | 56 >>>> +--------------------------------- >>>>   include/soc/qcom/qcom_minidump.h | 66 >>>> ++++++++++++++++++++++++++++++++++++++++ >>>>   2 files changed, 67 insertions(+), 55 deletions(-) >>>>   create mode 100644 include/soc/qcom/qcom_minidump.h >>>> >>>> diff --git a/drivers/remoteproc/qcom_common.c >>>> b/drivers/remoteproc/qcom_common.c >>>> index 805e525..88fc984 100644 >>>> --- a/drivers/remoteproc/qcom_common.c >>>> +++ b/drivers/remoteproc/qcom_common.c >>>> @@ -18,6 +18,7 @@ >>>>   #include >>>>   #include >>>>   #include >>>> +#include >>>>   #include "remoteproc_internal.h" >>>>   #include "qcom_common.h" >>>> @@ -26,61 +27,6 @@ >>>>   #define to_smd_subdev(d) container_of(d, struct qcom_rproc_subdev, >>>> subdev) >>>>   #define to_ssr_subdev(d) container_of(d, struct qcom_rproc_ssr, >>>> subdev) >>>> -#define MAX_NUM_OF_SS           10 >>>> -#define MAX_REGION_NAME_LENGTH  16 >>>> -#define SBL_MINIDUMP_SMEM_ID    602 >>>> -#define MINIDUMP_REGION_VALID        ('V' << 24 | 'A' << 16 | 'L' >>>> << 8 | 'I' << 0) >>>> -#define MINIDUMP_SS_ENCR_DONE        ('D' << 24 | 'O' << 16 | 'N' >>>> << 8 | 'E' << 0) >>>> -#define MINIDUMP_SS_ENABLED        ('E' << 24 | 'N' << 16 | 'B' << >>>> 8 | 'L' << 0) >>>> - >>>> -/** >>>> - * struct minidump_region - Minidump region >>>> - * @name        : Name of the region to be dumped >>>> - * @seq_num:        : Use to differentiate regions with same name. >>>> - * @valid        : This entry to be dumped (if set to 1) >>>> - * @address        : Physical address of region to be dumped >>>> - * @size        : Size of the region >>>> - */ >>>> -struct minidump_region { >>>> -    char    name[MAX_REGION_NAME_LENGTH]; >>>> -    __le32    seq_num; >>>> -    __le32    valid; >>>> -    __le64    address; >>>> -    __le64    size; >>>> -}; >>>> - >>>> -/** >>>> - * struct minidump_subsystem - Subsystem's SMEM Table of content >>>> - * @status : Subsystem toc init status >>>> - * @enabled : if set to 1, this region would be copied during coredump >>>> - * @encryption_status: Encryption status for this subsystem >>>> - * @encryption_required : Decides to encrypt the subsystem regions >>>> or not >>>> - * @region_count : Number of regions added in this subsystem toc >>>> - * @regions_baseptr : regions base pointer of the subsystem >>>> - */ >>>> -struct minidump_subsystem { >>>> -    __le32    status; >>>> -    __le32    enabled; >>>> -    __le32    encryption_status; >>>> -    __le32    encryption_required; >>>> -    __le32    region_count; >>>> -    __le64    regions_baseptr; >>>> -}; >>>> - >>>> -/** >>>> - * struct minidump_global_toc - Global Table of Content >>>> - * @status : Global Minidump init status >>>> - * @md_revision : Minidump revision >>>> - * @enabled : Minidump enable status >>>> - * @subsystems : Array of subsystems toc >>>> - */ >>>> -struct minidump_global_toc { >>>> -    __le32                status; >>>> -    __le32                md_revision; >>>> -    __le32                enabled; >>>> -    struct minidump_subsystem    subsystems[MAX_NUM_OF_SS]; >>>> -}; >>>> - >>>>   struct qcom_ssr_subsystem { >>>>       const char *name; >>>>       struct srcu_notifier_head notifier_list; >>>> diff --git a/include/soc/qcom/qcom_minidump.h >>>> b/include/soc/qcom/qcom_minidump.h >>>> new file mode 100644 >>>> index 0000000..84c8605 >>>> --- /dev/null >>>> +++ b/include/soc/qcom/qcom_minidump.h >>>> @@ -0,0 +1,66 @@ >>>> +/* SPDX-License-Identifier: GPL-2.0-only */ >>>> +/* >>>> + * Qualcomm minidump shared data structures and macros >>>> + * >>>> + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights >>>> reserved. >>>> + */ >>>> + >>>> +#ifndef _QCOM_MINIDUMP_H_ >>>> +#define _QCOM_MINIDUMP_H_ >>>> + >>>> +#define MAX_NUM_OF_SS           10 >>>> +#define MAX_REGION_NAME_LENGTH  16 >>>> +#define SBL_MINIDUMP_SMEM_ID    602 >>>> +#define MINIDUMP_REGION_VALID        ('V' << 24 | 'A' << 16 | 'L' >>>> << 8 | 'I' << 0) >>>> +#define MINIDUMP_SS_ENCR_DONE        ('D' << 24 | 'O' << 16 | 'N' >>>> << 8 | 'E' << 0) >>>> +#define MINIDUMP_SS_ENABLED        ('E' << 24 | 'N' << 16 | 'B' << >>>> 8 | 'L' << 0) >>>> + >>>> +/** >>>> + * struct minidump_region - Minidump region >>>> + * @name        : Name of the region to be dumped >>>> + * @seq_num:        : Use to differentiate regions with same name. >>>> + * @valid        : This entry to be dumped (if set to 1) >>>> + * @address        : Physical address of region to be dumped >>>> + * @size        : Size of the region >>>> + */ >>>> +struct minidump_region { >>>> +    char    name[MAX_REGION_NAME_LENGTH]; >>>> +    __le32    seq_num; >>>> +    __le32    valid; >>>> +    __le64    address; >>>> +    __le64    size; >>>> +}; >>>> + >>>> +/** >>>> + * struct minidump_subsystem - Subsystem's SMEM Table of content >>>> + * @status : Subsystem toc init status >>>> + * @enabled : if set to 1, this region would be copied during coredump >>>> + * @encryption_status: Encryption status for this subsystem >>>> + * @encryption_required : Decides to encrypt the subsystem regions >>>> or not >>>> + * @region_count : Number of regions added in this subsystem toc >>>> + * @regions_baseptr : regions base pointer of the subsystem >>>> + */ >>>> +struct minidump_subsystem { >>>> +    __le32    status; >>>> +    __le32    enabled; >>>> +    __le32    encryption_status; >>>> +    __le32    encryption_required; >>>> +    __le32    region_count; >>>> +    __le64    regions_baseptr; >>>> +}; >>>> + >>>> +/** >>>> + * struct minidump_global_toc - Global Table of Content >>>> + * @status : Global Minidump init status >>>> + * @md_revision : Minidump revision >>>> + * @enabled : Minidump enable status >>>> + * @subsystems : Array of subsystems toc >>>> + */ >>>> +struct minidump_global_toc { >>>> +    __le32                status; >>>> +    __le32                md_revision; >>>> +    __le32                enabled; >>>> +    struct minidump_subsystem    subsystems[MAX_NUM_OF_SS]; >>>> +}; >>>> + >>>> +#endif  /* _QCOM_MINIDUMP_H_ */ 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 1BFF7C77B70 for ; Mon, 17 Apr 2023 13:24:42 +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:From:References:CC:To: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=V7BG8lIbbGhyELS3WhCKjsy40SU7lxz3GbqEO63RqSQ=; b=jpRg6TvTocZTsP pYIFw1mkmS/IOotsHijTDx0kA0F8wv3GkRriqysGYg+mtvkzBq62dGVKVs96zgUg/oeSiLQjnPkSQ HlfRpgzb2Kr5xvGVgvhgeb0ojjsslDybRyXDQDNzDTu/hear/JHMjBMWhmaggjpwmuCj3k+prsjHP cKUKK2BIkZrXMVmEzaXaiqZw++EqTT2zYRuZcx0vkSSCgzq92UW3ZpTt4GZTOlNAQd7QSaRwlNjYT xQ95ZtG4NZQxJEBZGcF8x4kXCZ8Mjzi1YjR8HB3oE31tI8xKE2TUITRIP2v7gsaJr2q8VcWZ5PgLf rgnT9FIYWe+iWh79HdUg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1poOpW-00GNIX-0W; Mon, 17 Apr 2023 13:23:38 +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 1poOpR-00GNG0-2q for linux-arm-kernel@lists.infradead.org; Mon, 17 Apr 2023 13:23:36 +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 33H8skMm024804; Mon, 17 Apr 2023 13:23:11 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=message-id : date : mime-version : subject : to : cc : references : from : in-reply-to : content-type : content-transfer-encoding; s=qcppdkim1; bh=XwpxomG3rWLUbB1XoGemSNYyJ/Toe7thPIH7pe9chAk=; b=S8FqyamOHb23BHlkjwJs5p3YHjKG7n+qkDhbcxKA5hVZ/bzWzAM46ueheZg2eU7pljTT 2AYLpWanpCzCRUkisn5h0bTZOvgFppSboeHIK2K8Bbn/XyVUdmDMbgt6LXOcLmgLbqUS O6e/pP1vZp+lbKlq0A89ujQ0rQkP3TDZBsIIg425x/dGpcGXnvPfo+MXLbrmQzz0bWw+ vPnCj6iUf+0nMfwCjYixXuV5O9BASf2o0yBYYBszXlJFi52fmsFkmfm/OkT/uJRSALWk UCccXUiSAMdJRnIvheMmZ916Qao3WL+PT6AxcwpPJ6dTQ+n7e49WM9Z1OGB4fuY47re1 6w== Received: from nasanppmta03.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3pymneuk0j-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 17 Apr 2023 13:23:11 +0000 Received: from nasanex01c.na.qualcomm.com (nasanex01c.na.qualcomm.com [10.45.79.139]) by NASANPPMTA03.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 33HDNA82020535 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 17 Apr 2023 13:23:10 GMT Received: from [10.216.21.23] (10.80.80.8) by nasanex01c.na.qualcomm.com (10.45.79.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.42; Mon, 17 Apr 2023 06:23:04 -0700 Message-ID: Date: Mon, 17 Apr 2023 18:52:17 +0530 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.8.0 Subject: Re: [PATCH v2 2/6] remoteproc: qcom: Move minidump specific data to qcom_minidump.h To: Srinivas Kandagatla , , , , , , , , , CC: , , , , , References: <1679491817-2498-1-git-send-email-quic_mojha@quicinc.com> <1679491817-2498-3-git-send-email-quic_mojha@quicinc.com> <3df1ec27-7e4d-1f84-ff20-94e8ea91c86f@quicinc.com> <040a1992-baff-c3e4-69a9-ff3110de62e7@linaro.org> Content-Language: en-US From: Mukesh Ojha In-Reply-To: <040a1992-baff-c3e4-69a9-ff3110de62e7@linaro.org> X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nasanex01c.na.qualcomm.com (10.45.79.139) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-ORIG-GUID: Btf2zd7RS_BmGpJ7-xz9tMB6k9gpt69W X-Proofpoint-GUID: Btf2zd7RS_BmGpJ7-xz9tMB6k9gpt69W X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-04-17_08,2023-04-17_01,2023-02-09_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxlogscore=999 phishscore=0 lowpriorityscore=0 clxscore=1015 mlxscore=0 spamscore=0 impostorscore=0 malwarescore=0 bulkscore=0 priorityscore=1501 adultscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2303200000 definitions=main-2304170120 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230417_062333_927410_9964F062 X-CRM114-Status: GOOD ( 35.78 ) 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 CgpPbiA0LzE0LzIwMjMgNDoxMCBQTSwgU3Jpbml2YXMgS2FuZGFnYXRsYSB3cm90ZToKPiAKPiAK PiBPbiAxNC8wNC8yMDIzIDA4OjA1LCBNdWtlc2ggT2poYSB3cm90ZToKPj4gVGhhbmtzIGFnYWlu IGZvciBjb21pbmcgYmFjayBvbiB0aGlzLgo+Pgo+PiBPbiA0LzE0LzIwMjMgNDowMiBBTSwgU3Jp bml2YXMgS2FuZGFnYXRsYSB3cm90ZToKPj4+Cj4+Pgo+Pj4gT24gMjIvMDMvMjAyMyAxMzozMCwg TXVrZXNoIE9qaGEgd3JvdGU6Cj4+Pj4gTW92ZSBtaW5pZHVtcCBzcGVjaWZpYyBkYXRhIHR5cGVz IGFuZCBtYWNyb3MgdG8gYSBzZXBhcmF0ZSBpbnRlcm5hbAo+Pj4+IGhlYWRlcihxY29tX21pbmlk dW1wLmgpIHNvIHRoYXQgaXQgY2FuIGJlIHNoYXJlZCBhbW9uZyBkaWZmZXJlbnQKPj4+Cj4+PiBt aW5pZHVtcC5oIHNob3VsZCBiZSBnb29kIGFzIHdlIGFyZSBhbHJlYWR5IGluIGluY2x1ZGUvc29j L3Fjb20vCj4+Cj4+Cj4+IEluaXRpYWxseSwgaSB3YW50ZWQgdG8gcHJvdGVjdCB0aGUgY29udGVu dCBvZiBxY29tX21pbmlkdW1wLmggYmV0d2VlbiAKPj4gcWNvbV9taW5pZHVtcC5jIGFuZCBxY29t X2NvbW1vbi5jCj4+Cj4+IElkZWFsbHksIGhlcmUgcWNvbV9taW5pZHVtcC5oIHNob3VsZCBiZSBz dXBwbGllci9wcm92aWRlciBoZWFkZXIgYW5kIGNhbiAKPiAKPiBBbSBub3Qgc3VyZSBpZiBJIHVu ZGVyc3RhbmQgdGhlIHN1cHBsaWVyIGNvbmNlcHQgY29ycmVjdGx5Lgo+IEFGQUlVLCB3ZSBoYXZl IGEgMiBzZXRzIG9mIGFwaXMKPiAKPiAxLiBnZXQgaG9sZCBvZiBtaW5pZHVtcCBkZXNjcmlwdG9y IGJhc2VkIG9uIG1pbmlkdW1wX2lkIGZybyBndG9jIHVzaW5nIAo+IHFjb21fbWluaWR1bXBfc3Vi c3lzdGVtX2Rlc2MoKS4gQW0gYXNzdW1pbmcgd2hpY2ggZXZlciBkcml2ZXIgdXNlcyB0aGlzIAo+ IGFwaSB3aWxsIHNldCB0aGVyZSBzZWdtZW50cyBhbmQgcmVnaW9ucyBpbiB0aGVyZSByZXNwZWN0 aXZlIGRyaXZlcnMuCj4gCj4gMi4gc2V0dGluZyByZWdpb25zL3NlZ21lbnRzIGluIEFQU1MgbWlu aWR1bXAgZGVzY3JpcHRvcnMgd2hpY2ggYXJlIGRvbmUgCj4gdmlhIHFjb21fbWluaWR1bXBfcmVn aW9uX3JlZ2lzdGVyKCkuIFRCSCB0aGlzIHNob3VsZCBiZSByZW5hbWVkIHRvIAo+IHFjb21fYXBz c19taW5pZHVtcF9yZWdpb25fcmVnaXN0ZXIoKS4KPiAKPiBtaXhpbmcgb2YgdGhzZWUgYXBpcyBt YWtlcyBpdCBiaXQgY29uZnVzaW5nLCBzcGVjaWFsbHkgd2UgaGF2ZSB0aGVzZSB0d28gCj4gY2F0 ZWdvcnkgb2YgYXBpcyB0aGF0IGRlYWwgd2l0aCBkaWZmZXJlbnQgdGhpbmdzLgo+IAo+IERvZXMg aXQgbWFrZSBzZW5zZSB0byBzcGl0IGFuZCBhYnN0cmFjdCB0aGVtIHByb3Blcmx5IGJ5IGRvaW5n Pwo+IAo+IAo+IDEuIG1pbmlkdW1wIGRyaXZlciB0byBkZWFsIHdpdGggaGFuZGxpbmcgZ3RvYyBh bmQgcHJvdmlkaW5nIGRlc2NyaXB0b3JzIAo+IHRvIHRoZSBjb25zdW1lcnMgbGlrZSByZW1vdGVw cm9jIG9yIGFwc3MsIFRoaXMgY2FuIHByb2JhYmx5IGxpdmUgd2l0aGluIAo+IHNtZW0gZHJpdmVy IGFzIGxvYyBmb3IgdGhpcyBzdXBwb3J0IGlzIHZlcnkgbWluaW1hbCBhbmQgcHJvYWJhYmx5IHJl bmFtZSAKPiB0aGUgYXBpIGFjY29yZGluZ2x5Lgo+IAoKPiAyLiBhcHNzX21pbmlkdW1wIGRyaXZl ciB0byBhbGxvdyBvdGhlciBxY29tIGRyaXZlcnMgdG8gCj4gcmVnaXN0ZXIvdW5yZWdpc3RlciBy ZWdpb25zIHdpdGhpbiBhcHNzIG1pbmlkdW1wIGRlc2NyaXB0b3IuCj4gCj4gZGlkIEkgbWlzcyBz b21ldGhpbmc/CgpObywgeW91IGFyZSBjb3JyZWN0IHdpdGggeW91ciB1bmRlcnN0YW5kaW5nLgoK VG8geW91ciBzdWdnZXN0aW9uIHRvIHNwbGl0IGNvZGUgYW5kIHRvIGtlZXAgCnFjb21fbWluaWR1 bXBfc3Vic3lzdGVtX2Rlc2MoKSBsaXZlIGluc2lkZSBzbWVtIGRyaXZlciwKCkFuZCBob3cgYWJv dXQgdGhlIGhlYWRlciBxY29tX21pbmlkdW1wLmgsIHNob3VsZCB3ZSBrZWVwIGl0IHNlcGFyYXRl IAp0aGFuIHRoZSBhcHNzIG1pbmlkdW1wIGNsaWVudCBoZWFkZXIgbWluaWR1bXAuaCA/CgpTaW5j ZSwgeW91IGtpbmQgb2YgdW5kZXJzdGFuZCB0aGUgZHJpdmVyIG5vdywgZG8geW91IHRoaW5rIGl0 IGlzIHdvcnRoCnRvIGNyZWF0ZSBwbGF0Zm9ybSBkZXZpY2UgZm9yIG1pbmlkdW1wIGZyb20gc21l bSBkcml2ZXIsIGFuZApoYXZlIGEgcHJvYmUgaW5zaWRlIGFwc3MgbWluaWR1bXAgZHJpdmVyIHRv IHNvbHZlIGNoaWNrZW4gYW5kIGVnZyAKcHJvYmxlbSBmb3IgdGhlIGNsaWVudHMgd2hvIGNvbWVz IGJlZm9yZSBtaW5pZHVtcCBhbmQgdHJ5IHRvIHJlZ2lzdGVyIAppdHNlbGYgd2l0aG91dCBkb2lu ZyByZWFkeSBjaGVjayBhbmQgYXBzc19taW5pZHVtcCBjYW4gbm90ZSB0aGlzIGNsaWVudCAKZW50 cnkgYW5kIG9ubHkgcmVnaXN0ZXIgdGhpcyByZWdpb24gb25jZSBtaW5pZHVtcCBwcm9iZSBzdWNj ZXNzIGFuZCB0aGVuIAppdCBjYW4gcmVnaXN0ZXIgYWxsIHRoZSBub3RlZCBjbGllbnRzIGluIG9u ZSBnby4KClRoZSByZWFzb24gdG8gZG8gdGhpcyB3b3VsZCBiZSBhcHNzX21pbmlkdW1wIGRyaXZl ciBoYXMgbm8gbWVhbmluZyAKd2l0aG91dCBzbWVtLCBhbmQgZm9yIHRoaXMgcmVhc29uIGNoZWNr aW5nIHFjb21fbWluaWR1bXBfcmVhZHkoKSB3b3VsZCAKbm90IGJlIGlkZWFsIGZvciBhdCBsZWFz dCBxY29tIGNsaWVudHMgYW5kIGZvciBjb3JlIGtlcm5lbCBtYXkgYmUuCgotLU11a2VzaAo+IAo+ IHRoYW5rcywKPiBTcmluaQo+IAo+PiBiZSBzaGFyZWQgYW1vbmcgYWJvdmUgcWNvbV9taW5pZHVt cC5jIGFuZCBxY29tX2NvbW1vbi5jIGJ1dCBzaW5jZSB0aGV5IAo+PiBhcmUgbm90IGluIHNhbWUg ZGlyZWN0b3J5LCBtb3ZlZCBpdCBpbnNpZGUgaW5jbHVkZS9zb2MvcWNvbS8gYXMgCj4+IHNlcGFy YXRlIGhlYWRlciB0aGFuIGNvbnN1bWVyIGhlYWRlciBtaW5pZHVtcC5oIC4gPgo+PiAtTXVrZXNo Cj4+Pgo+Pj4gLS1zcmluaQo+Pj4KPj4+PiBRdWFsY29tbSBkcml2ZXJzLgo+Pj4+Cj4+Pj4gVGhl cmUgaXMgbm8gY2hhbmdlIGluIGZ1bmN0aW9uYWwgYmVoYXZpb3IgYWZ0ZXIgdGhpcy4KPj4+Pgo+ Pj4+IFNpZ25lZC1vZmYtYnk6IE11a2VzaCBPamhhIDxxdWljX21vamhhQHF1aWNpbmMuY29tPgo+ Pj4+IC0tLQo+Pj4+IMKgIGRyaXZlcnMvcmVtb3RlcHJvYy9xY29tX2NvbW1vbi5jIHwgNTYgCj4+ Pj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+Pj4+IMKgIGluY2x1ZGUvc29j L3Fjb20vcWNvbV9taW5pZHVtcC5oIHwgNjYgCj4+Pj4gKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKwo+Pj4+IMKgIDIgZmlsZXMgY2hhbmdlZCwgNjcgaW5zZXJ0aW9ucygr KSwgNTUgZGVsZXRpb25zKC0pCj4+Pj4gwqAgY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvc29j L3Fjb20vcWNvbV9taW5pZHVtcC5oCj4+Pj4KPj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZW1v dGVwcm9jL3Fjb21fY29tbW9uLmMgCj4+Pj4gYi9kcml2ZXJzL3JlbW90ZXByb2MvcWNvbV9jb21t b24uYwo+Pj4+IGluZGV4IDgwNWU1MjUuLjg4ZmM5ODQgMTAwNjQ0Cj4+Pj4gLS0tIGEvZHJpdmVy cy9yZW1vdGVwcm9jL3Fjb21fY29tbW9uLmMKPj4+PiArKysgYi9kcml2ZXJzL3JlbW90ZXByb2Mv cWNvbV9jb21tb24uYwo+Pj4+IEBAIC0xOCw2ICsxOCw3IEBACj4+Pj4gwqAgI2luY2x1ZGUgPGxp bnV4L3NsYWIuaD4KPj4+PiDCoCAjaW5jbHVkZSA8bGludXgvc29jL3Fjb20vbWR0X2xvYWRlci5o Pgo+Pj4+IMKgICNpbmNsdWRlIDxsaW51eC9zb2MvcWNvbS9zbWVtLmg+Cj4+Pj4gKyNpbmNsdWRl IDxzb2MvcWNvbS9xY29tX21pbmlkdW1wLmg+Cj4+Pj4gwqAgI2luY2x1ZGUgInJlbW90ZXByb2Nf aW50ZXJuYWwuaCIKPj4+PiDCoCAjaW5jbHVkZSAicWNvbV9jb21tb24uaCIKPj4+PiBAQCAtMjYs NjEgKzI3LDYgQEAKPj4+PiDCoCAjZGVmaW5lIHRvX3NtZF9zdWJkZXYoZCkgY29udGFpbmVyX29m KGQsIHN0cnVjdCBxY29tX3Jwcm9jX3N1YmRldiwgCj4+Pj4gc3ViZGV2KQo+Pj4+IMKgICNkZWZp bmUgdG9fc3NyX3N1YmRldihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHFjb21fcnByb2Nfc3Ny LCAKPj4+PiBzdWJkZXYpCj4+Pj4gLSNkZWZpbmUgTUFYX05VTV9PRl9TU8KgwqDCoMKgwqDCoMKg wqDCoMKgIDEwCj4+Pj4gLSNkZWZpbmUgTUFYX1JFR0lPTl9OQU1FX0xFTkdUSMKgIDE2Cj4+Pj4g LSNkZWZpbmUgU0JMX01JTklEVU1QX1NNRU1fSUTCoMKgwqAgNjAyCj4+Pj4gLSNkZWZpbmUgTUlO SURVTVBfUkVHSU9OX1ZBTElEwqDCoMKgwqDCoMKgwqAgKCdWJyA8PCAyNCB8ICdBJyA8PCAxNiB8 ICdMJyAKPj4+PiA8PCA4IHwgJ0knIDw8IDApCj4+Pj4gLSNkZWZpbmUgTUlOSURVTVBfU1NfRU5D Ul9ET05FwqDCoMKgwqDCoMKgwqAgKCdEJyA8PCAyNCB8ICdPJyA8PCAxNiB8ICdOJyAKPj4+PiA8 PCA4IHwgJ0UnIDw8IDApCj4+Pj4gLSNkZWZpbmUgTUlOSURVTVBfU1NfRU5BQkxFRMKgwqDCoMKg wqDCoMKgICgnRScgPDwgMjQgfCAnTicgPDwgMTYgfCAnQicgPDwgCj4+Pj4gOCB8ICdMJyA8PCAw KQo+Pj4+IC0KPj4+PiAtLyoqCj4+Pj4gLSAqIHN0cnVjdCBtaW5pZHVtcF9yZWdpb24gLSBNaW5p ZHVtcCByZWdpb24KPj4+PiAtICogQG5hbWXCoMKgwqDCoMKgwqDCoCA6IE5hbWUgb2YgdGhlIHJl Z2lvbiB0byBiZSBkdW1wZWQKPj4+PiAtICogQHNlcV9udW06wqDCoMKgwqDCoMKgwqAgOiBVc2Ug dG8gZGlmZmVyZW50aWF0ZSByZWdpb25zIHdpdGggc2FtZSBuYW1lLgo+Pj4+IC0gKiBAdmFsaWTC oMKgwqDCoMKgwqDCoCA6IFRoaXMgZW50cnkgdG8gYmUgZHVtcGVkIChpZiBzZXQgdG8gMSkKPj4+ PiAtICogQGFkZHJlc3PCoMKgwqDCoMKgwqDCoCA6IFBoeXNpY2FsIGFkZHJlc3Mgb2YgcmVnaW9u IHRvIGJlIGR1bXBlZAo+Pj4+IC0gKiBAc2l6ZcKgwqDCoMKgwqDCoMKgIDogU2l6ZSBvZiB0aGUg cmVnaW9uCj4+Pj4gLSAqLwo+Pj4+IC1zdHJ1Y3QgbWluaWR1bXBfcmVnaW9uIHsKPj4+PiAtwqDC oMKgIGNoYXLCoMKgwqAgbmFtZVtNQVhfUkVHSU9OX05BTUVfTEVOR1RIXTsKPj4+PiAtwqDCoMKg IF9fbGUzMsKgwqDCoCBzZXFfbnVtOwo+Pj4+IC3CoMKgwqAgX19sZTMywqDCoMKgIHZhbGlkOwo+ Pj4+IC3CoMKgwqAgX19sZTY0wqDCoMKgIGFkZHJlc3M7Cj4+Pj4gLcKgwqDCoCBfX2xlNjTCoMKg wqAgc2l6ZTsKPj4+PiAtfTsKPj4+PiAtCj4+Pj4gLS8qKgo+Pj4+IC0gKiBzdHJ1Y3QgbWluaWR1 bXBfc3Vic3lzdGVtIC0gU3Vic3lzdGVtJ3MgU01FTSBUYWJsZSBvZiBjb250ZW50Cj4+Pj4gLSAq IEBzdGF0dXMgOiBTdWJzeXN0ZW0gdG9jIGluaXQgc3RhdHVzCj4+Pj4gLSAqIEBlbmFibGVkIDog aWYgc2V0IHRvIDEsIHRoaXMgcmVnaW9uIHdvdWxkIGJlIGNvcGllZCBkdXJpbmcgY29yZWR1bXAK Pj4+PiAtICogQGVuY3J5cHRpb25fc3RhdHVzOiBFbmNyeXB0aW9uIHN0YXR1cyBmb3IgdGhpcyBz dWJzeXN0ZW0KPj4+PiAtICogQGVuY3J5cHRpb25fcmVxdWlyZWQgOiBEZWNpZGVzIHRvIGVuY3J5 cHQgdGhlIHN1YnN5c3RlbSByZWdpb25zIAo+Pj4+IG9yIG5vdAo+Pj4+IC0gKiBAcmVnaW9uX2Nv dW50IDogTnVtYmVyIG9mIHJlZ2lvbnMgYWRkZWQgaW4gdGhpcyBzdWJzeXN0ZW0gdG9jCj4+Pj4g LSAqIEByZWdpb25zX2Jhc2VwdHIgOiByZWdpb25zIGJhc2UgcG9pbnRlciBvZiB0aGUgc3Vic3lz dGVtCj4+Pj4gLSAqLwo+Pj4+IC1zdHJ1Y3QgbWluaWR1bXBfc3Vic3lzdGVtIHsKPj4+PiAtwqDC oMKgIF9fbGUzMsKgwqDCoCBzdGF0dXM7Cj4+Pj4gLcKgwqDCoCBfX2xlMzLCoMKgwqAgZW5hYmxl ZDsKPj4+PiAtwqDCoMKgIF9fbGUzMsKgwqDCoCBlbmNyeXB0aW9uX3N0YXR1czsKPj4+PiAtwqDC oMKgIF9fbGUzMsKgwqDCoCBlbmNyeXB0aW9uX3JlcXVpcmVkOwo+Pj4+IC3CoMKgwqAgX19sZTMy wqDCoMKgIHJlZ2lvbl9jb3VudDsKPj4+PiAtwqDCoMKgIF9fbGU2NMKgwqDCoCByZWdpb25zX2Jh c2VwdHI7Cj4+Pj4gLX07Cj4+Pj4gLQo+Pj4+IC0vKioKPj4+PiAtICogc3RydWN0IG1pbmlkdW1w X2dsb2JhbF90b2MgLSBHbG9iYWwgVGFibGUgb2YgQ29udGVudAo+Pj4+IC0gKiBAc3RhdHVzIDog R2xvYmFsIE1pbmlkdW1wIGluaXQgc3RhdHVzCj4+Pj4gLSAqIEBtZF9yZXZpc2lvbiA6IE1pbmlk dW1wIHJldmlzaW9uCj4+Pj4gLSAqIEBlbmFibGVkIDogTWluaWR1bXAgZW5hYmxlIHN0YXR1cwo+ Pj4+IC0gKiBAc3Vic3lzdGVtcyA6IEFycmF5IG9mIHN1YnN5c3RlbXMgdG9jCj4+Pj4gLSAqLwo+ Pj4+IC1zdHJ1Y3QgbWluaWR1bXBfZ2xvYmFsX3RvYyB7Cj4+Pj4gLcKgwqDCoCBfX2xlMzLCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RhdHVzOwo+Pj4+IC3CoMKgwqAgX19sZTMywqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1kX3JldmlzaW9uOwo+Pj4+IC3CoMKgwqAgX19s ZTMywqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVuYWJsZWQ7Cj4+Pj4gLcKgwqDCoCBz dHJ1Y3QgbWluaWR1bXBfc3Vic3lzdGVtwqDCoMKgIHN1YnN5c3RlbXNbTUFYX05VTV9PRl9TU107 Cj4+Pj4gLX07Cj4+Pj4gLQo+Pj4+IMKgIHN0cnVjdCBxY29tX3Nzcl9zdWJzeXN0ZW0gewo+Pj4+ IMKgwqDCoMKgwqAgY29uc3QgY2hhciAqbmFtZTsKPj4+PiDCoMKgwqDCoMKgIHN0cnVjdCBzcmN1 X25vdGlmaWVyX2hlYWQgbm90aWZpZXJfbGlzdDsKPj4+PiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9z b2MvcWNvbS9xY29tX21pbmlkdW1wLmggCj4+Pj4gYi9pbmNsdWRlL3NvYy9xY29tL3Fjb21fbWlu aWR1bXAuaAo+Pj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+Pj4gaW5kZXggMDAwMDAwMC4uODRj ODYwNQo+Pj4+IC0tLSAvZGV2L251bGwKPj4+PiArKysgYi9pbmNsdWRlL3NvYy9xY29tL3Fjb21f bWluaWR1bXAuaAo+Pj4+IEBAIC0wLDAgKzEsNjYgQEAKPj4+PiArLyogU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjAtb25seSAqLwo+Pj4+ICsvKgo+Pj4+ICsgKiBRdWFsY29tbSBtaW5p ZHVtcCBzaGFyZWQgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MKPj4+PiArICoKPj4+PiArICog Q29weXJpZ2h0IChjKSAyMDIzIFF1YWxjb21tIElubm92YXRpb24gQ2VudGVyLCBJbmMuIEFsbCBy aWdodHMgCj4+Pj4gcmVzZXJ2ZWQuCj4+Pj4gKyAqLwo+Pj4+ICsKPj4+PiArI2lmbmRlZiBfUUNP TV9NSU5JRFVNUF9IXwo+Pj4+ICsjZGVmaW5lIF9RQ09NX01JTklEVU1QX0hfCj4+Pj4gKwo+Pj4+ ICsjZGVmaW5lIE1BWF9OVU1fT0ZfU1PCoMKgwqDCoMKgwqDCoMKgwqDCoCAxMAo+Pj4+ICsjZGVm aW5lIE1BWF9SRUdJT05fTkFNRV9MRU5HVEjCoCAxNgo+Pj4+ICsjZGVmaW5lIFNCTF9NSU5JRFVN UF9TTUVNX0lEwqDCoMKgIDYwMgo+Pj4+ICsjZGVmaW5lIE1JTklEVU1QX1JFR0lPTl9WQUxJRMKg wqDCoMKgwqDCoMKgICgnVicgPDwgMjQgfCAnQScgPDwgMTYgfCAnTCcgCj4+Pj4gPDwgOCB8ICdJ JyA8PCAwKQo+Pj4+ICsjZGVmaW5lIE1JTklEVU1QX1NTX0VOQ1JfRE9ORcKgwqDCoMKgwqDCoMKg ICgnRCcgPDwgMjQgfCAnTycgPDwgMTYgfCAnTicgCj4+Pj4gPDwgOCB8ICdFJyA8PCAwKQo+Pj4+ ICsjZGVmaW5lIE1JTklEVU1QX1NTX0VOQUJMRUTCoMKgwqDCoMKgwqDCoCAoJ0UnIDw8IDI0IHwg J04nIDw8IDE2IHwgJ0InIDw8IAo+Pj4+IDggfCAnTCcgPDwgMCkKPj4+PiArCj4+Pj4gKy8qKgo+ Pj4+ICsgKiBzdHJ1Y3QgbWluaWR1bXBfcmVnaW9uIC0gTWluaWR1bXAgcmVnaW9uCj4+Pj4gKyAq IEBuYW1lwqDCoMKgwqDCoMKgwqAgOiBOYW1lIG9mIHRoZSByZWdpb24gdG8gYmUgZHVtcGVkCj4+ Pj4gKyAqIEBzZXFfbnVtOsKgwqDCoMKgwqDCoMKgIDogVXNlIHRvIGRpZmZlcmVudGlhdGUgcmVn aW9ucyB3aXRoIHNhbWUgbmFtZS4KPj4+PiArICogQHZhbGlkwqDCoMKgwqDCoMKgwqAgOiBUaGlz IGVudHJ5IHRvIGJlIGR1bXBlZCAoaWYgc2V0IHRvIDEpCj4+Pj4gKyAqIEBhZGRyZXNzwqDCoMKg wqDCoMKgwqAgOiBQaHlzaWNhbCBhZGRyZXNzIG9mIHJlZ2lvbiB0byBiZSBkdW1wZWQKPj4+PiAr ICogQHNpemXCoMKgwqDCoMKgwqDCoCA6IFNpemUgb2YgdGhlIHJlZ2lvbgo+Pj4+ICsgKi8KPj4+ PiArc3RydWN0IG1pbmlkdW1wX3JlZ2lvbiB7Cj4+Pj4gK8KgwqDCoCBjaGFywqDCoMKgIG5hbWVb TUFYX1JFR0lPTl9OQU1FX0xFTkdUSF07Cj4+Pj4gK8KgwqDCoCBfX2xlMzLCoMKgwqAgc2VxX251 bTsKPj4+PiArwqDCoMKgIF9fbGUzMsKgwqDCoCB2YWxpZDsKPj4+PiArwqDCoMKgIF9fbGU2NMKg wqDCoCBhZGRyZXNzOwo+Pj4+ICvCoMKgwqAgX19sZTY0wqDCoMKgIHNpemU7Cj4+Pj4gK307Cj4+ Pj4gKwo+Pj4+ICsvKioKPj4+PiArICogc3RydWN0IG1pbmlkdW1wX3N1YnN5c3RlbSAtIFN1YnN5 c3RlbSdzIFNNRU0gVGFibGUgb2YgY29udGVudAo+Pj4+ICsgKiBAc3RhdHVzIDogU3Vic3lzdGVt IHRvYyBpbml0IHN0YXR1cwo+Pj4+ICsgKiBAZW5hYmxlZCA6IGlmIHNldCB0byAxLCB0aGlzIHJl Z2lvbiB3b3VsZCBiZSBjb3BpZWQgZHVyaW5nIGNvcmVkdW1wCj4+Pj4gKyAqIEBlbmNyeXB0aW9u X3N0YXR1czogRW5jcnlwdGlvbiBzdGF0dXMgZm9yIHRoaXMgc3Vic3lzdGVtCj4+Pj4gKyAqIEBl bmNyeXB0aW9uX3JlcXVpcmVkIDogRGVjaWRlcyB0byBlbmNyeXB0IHRoZSBzdWJzeXN0ZW0gcmVn aW9ucyAKPj4+PiBvciBub3QKPj4+PiArICogQHJlZ2lvbl9jb3VudCA6IE51bWJlciBvZiByZWdp b25zIGFkZGVkIGluIHRoaXMgc3Vic3lzdGVtIHRvYwo+Pj4+ICsgKiBAcmVnaW9uc19iYXNlcHRy IDogcmVnaW9ucyBiYXNlIHBvaW50ZXIgb2YgdGhlIHN1YnN5c3RlbQo+Pj4+ICsgKi8KPj4+PiAr c3RydWN0IG1pbmlkdW1wX3N1YnN5c3RlbSB7Cj4+Pj4gK8KgwqDCoCBfX2xlMzLCoMKgwqAgc3Rh dHVzOwo+Pj4+ICvCoMKgwqAgX19sZTMywqDCoMKgIGVuYWJsZWQ7Cj4+Pj4gK8KgwqDCoCBfX2xl MzLCoMKgwqAgZW5jcnlwdGlvbl9zdGF0dXM7Cj4+Pj4gK8KgwqDCoCBfX2xlMzLCoMKgwqAgZW5j cnlwdGlvbl9yZXF1aXJlZDsKPj4+PiArwqDCoMKgIF9fbGUzMsKgwqDCoCByZWdpb25fY291bnQ7 Cj4+Pj4gK8KgwqDCoCBfX2xlNjTCoMKgwqAgcmVnaW9uc19iYXNlcHRyOwo+Pj4+ICt9Owo+Pj4+ ICsKPj4+PiArLyoqCj4+Pj4gKyAqIHN0cnVjdCBtaW5pZHVtcF9nbG9iYWxfdG9jIC0gR2xvYmFs IFRhYmxlIG9mIENvbnRlbnQKPj4+PiArICogQHN0YXR1cyA6IEdsb2JhbCBNaW5pZHVtcCBpbml0 IHN0YXR1cwo+Pj4+ICsgKiBAbWRfcmV2aXNpb24gOiBNaW5pZHVtcCByZXZpc2lvbgo+Pj4+ICsg KiBAZW5hYmxlZCA6IE1pbmlkdW1wIGVuYWJsZSBzdGF0dXMKPj4+PiArICogQHN1YnN5c3RlbXMg OiBBcnJheSBvZiBzdWJzeXN0ZW1zIHRvYwo+Pj4+ICsgKi8KPj4+PiArc3RydWN0IG1pbmlkdW1w X2dsb2JhbF90b2Mgewo+Pj4+ICvCoMKgwqAgX19sZTMywqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHN0YXR1czsKPj4+PiArwqDCoMKgIF9fbGUzMsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBtZF9yZXZpc2lvbjsKPj4+PiArwqDCoMKgIF9fbGUzMsKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBlbmFibGVkOwo+Pj4+ICvCoMKgwqAgc3RydWN0IG1pbmlkdW1wX3N1YnN5 c3RlbcKgwqDCoCBzdWJzeXN0ZW1zW01BWF9OVU1fT0ZfU1NdOwo+Pj4+ICt9Owo+Pj4+ICsKPj4+ PiArI2VuZGlmwqAgLyogX1FDT01fTUlOSURVTVBfSF8gKi8KCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0 CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFk ZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK