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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8D3CEC38145 for ; Tue, 6 Sep 2022 19:49:00 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C75A66B007B; Tue, 6 Sep 2022 15:48:59 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id BAEEB940007; Tue, 6 Sep 2022 15:48:59 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 807BB6B007E; Tue, 6 Sep 2022 15:48:59 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 500AB6B007B for ; Tue, 6 Sep 2022 15:48:59 -0400 (EDT) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 120DAAAEF3 for ; Tue, 6 Sep 2022 19:48:59 +0000 (UTC) X-FDA: 79882698798.07.C50D484 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by imf03.hostedemail.com (Postfix) with ESMTP id E33DD2006D for ; Tue, 6 Sep 2022 19:48:57 +0000 (UTC) Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 286IdAiZ024665; Tue, 6 Sep 2022 19:48:57 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : references : in-reply-to : content-type : content-id : content-transfer-encoding : mime-version; s=corp-2022-7-12; bh=awP+abwATY2PlhTYW08btZh/gCysv+hz6KUiv3rN0sI=; b=Dv9Z1iAQ7XVl8L+1TbHbNfLPwRkUiJRhvTuK4YQjaFeSonPkW0LqNBKINs3dtQwJ/mgs RgxJBjb4g/Iy9P6J/6GkJII8kZQZwO9We79q5QoZZn8sw+xkG6DVDpDZlUkdTholSL2B +KMv0wyyn8zTYCHIBmz+TwPhhLJr9XM55nBhNIPngR3B6qLMJtJVPHKpsBTvtt4m0xeY 6UK8ATP+RI1UZ30m72PrfDeG2LfOIN7PzhnUGkf3xw05Jdy2baE2UK6Xk3SW5QqmWde5 SlTRe/60TnjDyxe2XAEIDnCU7Mse7hx/Fe9Y4cz7KUafssqgrxXHWyRuOYYwM530BBiX EQ== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3jbxtaet5a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 06 Sep 2022 19:48:54 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 286JgQfI030599; Tue, 6 Sep 2022 19:48:53 GMT Received: from nam11-bn8-obe.outbound.protection.outlook.com (mail-bn8nam11lp2169.outbound.protection.outlook.com [104.47.58.169]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 3jbwc3bhxt-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 06 Sep 2022 19:48:52 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=R3E88VBv5qg2ObU4xBMtGRiV/9oeOGLd3xiuWudR7YHKOj8Fc923cFH5YULWJRoDORv5Swp4O8GLUCztknDnMBM8dGtHogTBFbdk847R/nAOOgSnhcm96jRQ4ThJ4aDpVFZk5WkKbUyELanGj/nWKYNwGUDmA0F0K/yCrpKtc4Z1u1sgyeNnapmuP/1Rhr0RTfxcSrIO89+MkWuABRj5Nk7fapUmtwo8/Cqgkp6yeZ7EgbHJMPKFx3jt8wgoySYtFc3yuPSDg6k2i4U/tN2XBrR4hYDoMhK5SVP7GZuNeukw6fwLvjvruGI+H5Dh5Fl1HBg+rUp/VP+H1ltsIaWUMA== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=awP+abwATY2PlhTYW08btZh/gCysv+hz6KUiv3rN0sI=; b=mQ5+/06WVxmSJNumzr0kUmg05WRUQSALScyUKKl+8B0ftZECxVCqBLTD8Y2GPykGAVqRjxsJPgqy3x7WEE2WQhqmI3drxjwLlYAByLwoJ6Qq4lxdcnowAp0ncxTyZSrhunOVHKUz8F66ZNA3wRYYAJczKXpeRYTvU92m75fvthpEhcUTHjwahcFCojm2ML/4F4lOCDWbcXTgcNbw+GwV0NC1wzDYxh1LfcWZRkpZuwLlt2uaLUNW8EdVuVXk8zHsKIjoQW9K+IVE+b/nuCAyRw0D2BWJLGs5/idA/E0FDLEofnlJ3x2/73IrjSHazvHo3NPvJ8uNUrlytXU8bDyKAw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=awP+abwATY2PlhTYW08btZh/gCysv+hz6KUiv3rN0sI=; b=VDqjWbiJwovUqj24b/O9vtqihItbKrEO6jIWw9dy768BPuRZ7RcPSuAYVJAF8knzAaVHe2paAoimGcAVuORNifi61lsOiJoU61wTHEcGQ7EoQ0IhVerOlLykcKKO7/546mdp62xVQJoSc/iugaoRkBNTLRfxfNTWdNKdHYgpmcU= Received: from SN6PR10MB3022.namprd10.prod.outlook.com (2603:10b6:805:d8::25) by DM4PR10MB6840.namprd10.prod.outlook.com (2603:10b6:8:104::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5588.10; Tue, 6 Sep 2022 19:48:39 +0000 Received: from SN6PR10MB3022.namprd10.prod.outlook.com ([fe80::a420:3107:436d:d223]) by SN6PR10MB3022.namprd10.prod.outlook.com ([fe80::a420:3107:436d:d223%5]) with mapi id 15.20.5588.018; Tue, 6 Sep 2022 19:48:39 +0000 From: Liam Howlett To: "maple-tree@lists.infradead.org" , "linux-mm@kvack.org" , "linux-kernel@vger.kernel.org" , Andrew Morton CC: Liam Howlett , Liam Howlett , Matthew Wilcox , David Howells , Sven Schnelle Subject: [PATCH v14 01/70] Maple Tree: add new data structure Thread-Topic: [PATCH v14 01/70] Maple Tree: add new data structure Thread-Index: AQHYwimpxJxzaH2u5EOTs01m2IvvKA== Date: Tue, 6 Sep 2022 19:48:39 +0000 Message-ID: <20220906194824.2110408-2-Liam.Howlett@oracle.com> References: <20220906194824.2110408-1-Liam.Howlett@oracle.com> In-Reply-To: <20220906194824.2110408-1-Liam.Howlett@oracle.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: git-send-email 2.35.1 x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 902e36ec-2996-45fb-73a2-08da9040cba2 x-ms-traffictypediagnostic: DM4PR10MB6840:EE_ x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 2dfcLaSJ5X8ufACvDlISUQPaXQIEdz/RTojwsCOOTpV8lzhreH6UlPGRd28L58pK2DYq0FNTo2Zwb6VYZ3W795RdBl8VrPFh8kJShP8vHARiEaXnWyNX1/5rVnCfDiHdRuzuxz1Qv1n1M7g7r6NBgIfl67X/3gGDcShlEDR8QVH3a+LOMznYg/ynnntVne9t+ik+TmsPOfUTfdOXjpzUqVUibCXNDkFTjvGc0LX4vYvKWh56yDcxrgF3r4/c/gGt/OJrd/UP92BiWBS1N5PjXzjWa/jKcvR2hFMX/ECuj32l8zVybOy+uRwRlZKCbp5C3ONG6RhmMdrCG4+wgdMperQHbvyjCOcZ4sHKpKJ1QPWTujye3Rm9Szcz+QCnQhXAM9zG0SSUv3P1q283LeGSVG8ivuLECadGBBTMfen1haxTIK8lSs6P0VxR7EKiZKrRYC0WCWfQNlb90GGwafmdZqXxst14SPbLLS87DiiuO5Z4Q/XAv7M0NmbeHMOl6eaBLdfaal8O38RyrXvHsezqynZZtavVkpCbV4QQR0Zse2RE4zLwzqUCuFnPDI0hDmyBfTJVOE03kQjsQztybCpJ1DW5wlMwnfRhsEC5WZM4hBE3EfglP+JI0E5zEAVnrR73SONJV5QlIPsiiKVSIU69VDVUYHgU4/nG6e+ws+r5aJ82UXC6KdqFzHeg+Az2bfDbNk8+tWTfEHKcXjdzjHxm/Yewe8se81hhj4vf4UT+0gtw50b/oMM87m4Dzm5SgFWp+xitQ4BlTg7GABUTZ/nEDJKn1zr8iHR2eqwfVPantI9mkLOVQVGeltAr0eobWjSI x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN6PR10MB3022.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(366004)(346002)(376002)(39860400002)(136003)(396003)(38070700005)(2906002)(83380400001)(2616005)(1076003)(186003)(71200400001)(64756008)(122000001)(36756003)(316002)(6486002)(54906003)(66946007)(66556008)(4326008)(66476007)(8676002)(76116006)(966005)(91956017)(478600001)(66446008)(110136005)(26005)(6506007)(6512007)(8936002)(5660300002)(44832011)(41300700001)(38100700002)(86362001)(30864003)(559001)(579004)(309714004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?dXcxcVh1b0xMRUZxbHlMdzgzVFlzcmxjdFFkVWZtQzdRb3BpTUl4SzdkOGNr?= =?utf-8?B?bFFhWjlqa3JVdGRHSkdnZ2VhUnFuY0F0OGQyeHZsTEtlbytwb1YzNVh2akds?= =?utf-8?B?dE5jYVVDV1hzMDk3Zkx0NEtLckJ0Y1dzL0ovSllCWjZoQm0vbFNNK3E2ajFi?= =?utf-8?B?OEtKQnR0WklqUk9PeGw5U3p5aklVRFVyTHVWTS9VbWQ3Wm13bGc4S0ZKWnFa?= =?utf-8?B?Wk9VWHFWZGlUOUw3MThhWXpMOU1UWXZUMHc4QkdJUk9QZGR0NEl6UDJJU0RU?= =?utf-8?B?cjdqMzN6c3ZMeDJwTVFxMmhXQVZhWFB5ZDNKcHZHNWh2QVA5cFBaRm5kQk5q?= =?utf-8?B?dXJ5MmVKalgxOXowVWNwdzJFWTh1T3NFNXV4eWlJTkJJdmRvSUY3MU9FRVYr?= =?utf-8?B?MUtMa01HSmtzbEs1RERmRFNtSkRhaHFPTUhRcEdFM2V3dk15YTZWaFhqYXNs?= =?utf-8?B?Mm53OUpwRXdPWDhaRllUS1RkQlM4THY5dDBXbEVyT2x3dHljT2JFdnY4Q1Nh?= =?utf-8?B?OW1TNzNXNjloMkI3RktBcTBicTZ4TFVzTkVWQ1lDcXcvK0M2bmtsNjNVU1la?= =?utf-8?B?ZEE3eGRXN3p2d0hIalFPY3UxYlNGQ2VuYzJCMGI0Z1YwT2pmME1ldXBFclJU?= =?utf-8?B?WWVJd1Q4VFF4UnNUaGtPRURreDdMOVV3bUFIVnN5aENxbmxVOUFrVUprbGg4?= =?utf-8?B?Z3NWN3l3V2RQN1JaNVErVVdGS3pFenZHNGZ0ZHNMcGF4Q24wcFBlL21hRlVL?= =?utf-8?B?Vi9VenhJUEVJTnRrenJkclhGR2JwbHFUSTNwOW9TRE5PcTlVeHorbjFQK2R6?= =?utf-8?B?dzlFcTg4Q1J3SGxSVWpPd3poNjhDcUJTVElVMVh3QzlzVVZTb1ZjWW9DQ1Vl?= =?utf-8?B?Yis5VzNjMERxTlZNL0FzelpZdnJhMytYRFFlbmN1c3ErbXRMSXRHbFlhMGRo?= =?utf-8?B?Y3JvYlNtaTBNS0JSZFRoS05ma2lJQ2hSVzNaQ2tUMGdCdk1weGNBdmFQd3A5?= =?utf-8?B?TzlIbldsc1hwQVgwUUtKUkxpZUR3U0s4bTduYlVRYktKU3RpYXZqRG5mRi9B?= =?utf-8?B?Z3E0RzhiKzNIY0xkVENWbUdpQmJoOHEzNWwyeTFTa0pLMnhNWDhkcEZuNHl3?= =?utf-8?B?UHhrREJxaUUwclVjNUFvTmgrNlU0SVBILzF3K1psWXFhQ1Q1Nllqc21OTCsv?= =?utf-8?B?Nm0vZ3MzUmRIZ1ZIZ2hiVHVxem50TkF6aUVpR0pqY0ZhWlNZYlhTMlVTR3Rx?= =?utf-8?B?aUlkbndWSjNpR0ZZc2J6QTZLUForNUZsL0ZHMjlORmxBaWtHU0VNNG9jMldj?= =?utf-8?B?bU9TaE52M1JVL3U3Nm5HTmNETDArM216d1B0RmowNGpDb2dZeTZ0SmhsQkpn?= =?utf-8?B?N29vbXlWVUpQdndaMGt1L1hIZDBEVTNVWDh5SXBjTmdlb092a0NMRG0vU1p1?= =?utf-8?B?d3hoVXhHZ2wrV0oxMmt0ZUtjK1RiN2F1QXV1SzRqSFZDbjJOUjVCYTNHME1S?= =?utf-8?B?K1BLS3EyMnIySm1GUlcwZlhFQTIyblIvcTB2cVl5RlVMOXFMVVJJS1p2c2Vo?= =?utf-8?B?NDBKcFlUNFhqRlZwR2RWNUsyZmRmNHh5YzZhQ3AxdHFidEcvaGw1VGxlOXUx?= =?utf-8?B?Y0NYTndSNWpOa0wwMHVYRHJRb2E2RkZGYkJURVVqZm9MQUQxSHI4RDBHN3oy?= =?utf-8?B?TmlTNnJ5dDZ6V3h4N0F6cWNyd1BUV0hCb21pRUI2WVVpbktoRlEyOEtRMU9C?= =?utf-8?B?VkMzem1EYTNqdHMvKzBFTUNJVEpYd1YrUnhvZUZZY0tYQzZFeDNBaS84RzhM?= =?utf-8?B?SVNZYnRDNEZVWVBLbFJSSHhuUWlGNEtMWEVqRjNYQ01MT1d6Q1BUOE9sMXAy?= =?utf-8?B?ZytoVmpsbkN1dzJEMUZiNEs5UG9LUVh5RXRmdWtIZzRKemxhem5seEE0TWp2?= =?utf-8?B?dGdpa1RLY1doYnNURk9QT0dRRUpMRitLVXczNXlyZlhiM0VPeWptSC9Xa2tl?= =?utf-8?B?N2JlK0N0azlhcDdsS2NXMGRsZXViNndVcGVOaFhqS3hYMFR0ZCtKM25mT1R4?= =?utf-8?B?Mm1qenBpQWZhVWdldzFhVGxkUUV4eDQ3MzkyZUxoN21IRGgrS05xaUlmOGhu?= =?utf-8?B?RXBJRUR1dW5qM1B0RFUzNkFLTHQzdVRTWlY0M0hsbGl4WitSWGdFcG52SjVY?= =?utf-8?B?NWc9PQ==?= Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SN6PR10MB3022.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 902e36ec-2996-45fb-73a2-08da9040cba2 X-MS-Exchange-CrossTenant-originalarrivaltime: 06 Sep 2022 19:48:39.4761 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: lujWWVeH981dbi/y2Ap/UOSjYL0iYdfPMCUNAIjw69K0TBt8EPVbPtqElsHJc9xu6Mvvz2l6FiFY+ouHakIJSg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR10MB6840 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.895,Hydra:6.0.528,FMLib:17.11.122.1 definitions=2022-09-06_09,2022-09-06_02,2022-06-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 adultscore=0 malwarescore=0 mlxscore=0 phishscore=0 mlxlogscore=999 suspectscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2207270000 definitions=main-2209060091 X-Proofpoint-ORIG-GUID: Is9URFW34yiEd_flMxlMThHk0eo2jfgC X-Proofpoint-GUID: Is9URFW34yiEd_flMxlMThHk0eo2jfgC ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1662493738; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=awP+abwATY2PlhTYW08btZh/gCysv+hz6KUiv3rN0sI=; b=zw21Lc2ZRaEhnG1IWizx3amqtdBtvB51qzrN1r+p3J1WUnpl95Ed1hXgbkwD506y83ZXkJ /gyXvJSgNbDu+LcK+Dhe9O3nWs1xXIabA+14WpcsY+6U6jw9Pct9b75YUAKjx4RpsGKM2X Dtm7KZERqDMSiLou1wrBP6pc389SF0s= ARC-Authentication-Results: i=2; imf03.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2022-7-12 header.b=Dv9Z1iAQ; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=VDqjWbiJ; spf=pass (imf03.hostedemail.com: domain of liam.howlett@oracle.com designates 205.220.165.32 as permitted sender) smtp.mailfrom=liam.howlett@oracle.com; arc=pass ("microsoft.com:s=arcselector9901:i=1"); dmarc=pass (policy=none) header.from=oracle.com ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1662493738; a=rsa-sha256; cv=pass; b=aNXM9m5PELwDhm/KfAs4WOVGlekL66e/BymJXIHFcMFHDy1UUZOzSi4mwRSH/A/DWeJPpJ ++Oxn5nM2PNL53vkeMMi5aUj8PPu1e3Zcg5DjmzJ04ThRTQ3TCMtLq2CBCwsDV387a7ZGk 4QHyQamZvA8llEHKn4+CCIzt0YdKBFs= X-Stat-Signature: 4xn7i56534eb13ioo8ubhh74a3d3ynbs X-Rspam-User: X-Rspamd-Queue-Id: E33DD2006D Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2022-7-12 header.b=Dv9Z1iAQ; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=VDqjWbiJ; spf=pass (imf03.hostedemail.com: domain of liam.howlett@oracle.com designates 205.220.165.32 as permitted sender) smtp.mailfrom=liam.howlett@oracle.com; arc=pass ("microsoft.com:s=arcselector9901:i=1"); dmarc=pass (policy=none) header.from=oracle.com X-Rspamd-Server: rspam01 X-HE-Tag: 1662493737-369160 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: RnJvbTogIkxpYW0gUi4gSG93bGV0dCIgPExpYW0uSG93bGV0dEBPcmFjbGUuY29tPg0KDQpQYXRj aCBzZXJpZXMgIkludHJvZHVjaW5nIHRoZSBNYXBsZSBUcmVlIg0KDQpUaGUgbWFwbGUgdHJlZSBp cyBhbiBSQ1Utc2FmZSByYW5nZSBiYXNlZCBCLXRyZWUgZGVzaWduZWQgdG8gdXNlIG1vZGVybg0K cHJvY2Vzc29yIGNhY2hlIGVmZmljaWVudGx5LiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHBsYWNl cyBpbiB0aGUga2VybmVsDQp0aGF0IGEgbm9uLW92ZXJsYXBwaW5nIHJhbmdlLWJhc2VkIHRyZWUg d291bGQgYmUgYmVuZWZpY2lhbCwgZXNwZWNpYWxseQ0Kb25lIHdpdGggYSBzaW1wbGUgaW50ZXJm YWNlLiAgSWYgeW91IHVzZSBhbiByYnRyZWUgd2l0aCBvdGhlciBkYXRhDQpzdHJ1Y3R1cmVzIHRv IGltcHJvdmUgcGVyZm9ybWFuY2Ugb3IgYW4gaW50ZXJ2YWwgdHJlZSB0byB0cmFjaw0Kbm9uLW92 ZXJsYXBwaW5nIHJhbmdlcywgdGhlbiB0aGlzIGlzIGZvciB5b3UuDQoNClRoZSB0cmVlIGhhcyBh IGJyYW5jaGluZyBmYWN0b3Igb2YgMTAgZm9yIG5vbi1sZWFmIG5vZGVzIGFuZCAxNiBmb3IgbGVh Zg0Kbm9kZXMuICBXaXRoIHRoZSBpbmNyZWFzZWQgYnJhbmNoaW5nIGZhY3RvciwgaXQgaXMgc2ln bmlmaWNhbnRseSBzaG9ydGVyDQp0aGFuIHRoZSByYnRyZWUgc28gaXQgaGFzIGZld2VyIGNhY2hl IG1pc3Nlcy4gIFRoZSByZW1vdmFsIG9mIHRoZSBsaW5rZWQNCmxpc3QgYmV0d2VlbiBzdWJzZXF1 ZW50IGVudHJpZXMgYWxzbyByZWR1Y2VzIHRoZSBjYWNoZSBtaXNzZXMgYW5kIHRoZSBuZWVkDQp0 byBwdWxsIGluIHRoZSBwcmV2aW91cyBhbmQgbmV4dCBWTUEgZHVyaW5nIG1hbnkgdHJlZSBhbHRl cmF0aW9ucy4NCg0KVGhlIGZpcnN0IHVzZXIgdGhhdCBpcyBjb3ZlcmVkIGluIHRoaXMgcGF0Y2gg c2V0IGlzIHRoZSB2bV9hcmVhX3N0cnVjdCwNCndoZXJlIHRocmVlIGRhdGEgc3RydWN0dXJlcyBh cmUgcmVwbGFjZWQgYnkgdGhlIG1hcGxlIHRyZWU6IHRoZSBhdWdtZW50ZWQNCnJidHJlZSwgdGhl IHZtYSBjYWNoZSwgYW5kIHRoZSBsaW5rZWQgbGlzdCBvZiBWTUFzIGluIHRoZSBtbV9zdHJ1Y3Qu ICBUaGUNCmxvbmcgdGVybSBnb2FsIGlzIHRvIHJlZHVjZSBvciByZW1vdmUgdGhlIG1tYXBfbG9j ayBjb250ZW50aW9uLg0KDQpUaGUgcGxhbiBpcyB0byBnZXQgdG8gdGhlIHBvaW50IHdoZXJlIHdl IHVzZSB0aGUgbWFwbGUgdHJlZSBpbiBSQ1UgbW9kZS4NClJlYWRlcnMgd2lsbCBub3QgYmxvY2sg Zm9yIHdyaXRlcnMuICBBIHNpbmdsZSB3cml0ZSBvcGVyYXRpb24gd2lsbCBiZQ0KYWxsb3dlZCBh dCBhIHRpbWUuICBBIHJlYWRlciByZS13YWxrcyBpZiBzdGFsZSBkYXRhIGlzIGVuY291bnRlcmVk LiAgVk1Bcw0Kd291bGQgYmUgUkNVIGVuYWJsZWQgYW5kIHRoaXMgbW9kZSB3b3VsZCBiZSBlbnRl cmVkIG9uY2UgbXVsdGlwbGUgdGFza3MNCmFyZSB1c2luZyB0aGUgbW1fc3RydWN0Lg0KDQpEYXZp ZGxvciBzYWlkDQoNCjogWWVzIEkgbGlrZSB0aGUgbWFwbGUgdHJlZSwgYW5kIGF0IHRoaXMgc3Rh Z2UgSSBkb24ndCB0aGluayB3ZSBjYW4gYXNrIGZvcg0KOiBtb3JlIGZyb20gdGhpcyBzZXJpZXMg d3J0IHRoZSBNTSAtIGFsYmVpdCB0aGVyZSBzZWVtcyB0byBzdGlsbCBiZSBzb21lDQo6IGZvbGtz IHJlcG9ydGluZyBicmVha2FnZS4gIEZ1bmRhbWVudGFsbHkgSSBzZWUgTGlhbSdzIHdvcmsgdG8g KHJlKW1vdmUNCjogY29tcGxleGl0eSBvdXQgb2YgdGhlIE1NIChub3QgdG8gc2F5IHRoYXQgdGhl IGFjdHVhbCBtYXBsZSB0cmVlIGlzIG5vdA0KOiBjb21wbGV4KSBieSBjb25zb2xpZGF0aW5nIHRo ZSB0aHJlZSBjb21wbGltZW50YXJ5IGRhdGEgc3RydWN0dXJlcyB2ZXJ5DQo6IG11Y2ggd29ydGgg aXQgY29uc2lkZXJpbmcgcGVyZm9ybWFuY2UgZG9lcyBub3QgdGFrZSBhIGhpdC4gIFRoaXMgd2Fz IHZlcnkNCjogbXVjaCBhIHR1cm4gb2ZmIHdpdGggdGhlIHJhbmdlIGxvY2tpbmcgYXBwcm9hY2gs IHdoaWNoIHdvcnN0IGNhc2Ugc2NlbmFyaW8NCjogaW5jdXJyZWQgaW4gcHJvaGliaXRpdmUgb3Zl cmhlYWQuICBBbHNvIGFzIExpYW0gYW5kIE1hdHRoZXcgaGF2ZQ0KOiBtZW50aW9uZWQsIFJDVSBv cGVucyB1cCBhIGxvdCBvZiBuaWNlIHBlcmZvcm1hbmNlIG9wcG9ydHVuaXRpZXMsIGFuZCBpbg0K OiBhZGRpdGlvbiBhY2FkZW1pYVsxXSBoYXMgc2hvd24gb3V0c3RhbmRpbmcgc2NhbGFiaWxpdHkg b2YgYWRkcmVzcyBzcGFjZXMNCjogd2l0aCB0aGUgZm91bmRhdGlvbiBvZiByZXBsYWNpbmcgdGhl IGxvY2tlZCByYnRyZWUgd2l0aCBSQ1UgYXdhcmUgdHJlZXMuDQoNCkEgc2ltaWxhciB3b3JrIGhh cyBiZWVuIGRpc2NvdmVyZWQgaW4gdGhlIGFjYWRlbWljIHByZXNzDQoNCglodHRwczovL3Bkb3Mu Y3NhaWwubWl0LmVkdS9wYXBlcnMvcmN1dm06YXNwbG9zMTIucGRmDQoNClNoZWVyIGNvaW5jaWRl bmNlLiAgV2UgZGVzaWduZWQgb3VyIHRyZWUgd2l0aCB0aGUgaW50ZW50aW9uIG9mIHNvbHZpbmcg dGhlDQpoYXJkZXN0IHByb2JsZW0gZmlyc3QuICBVcG9uIHNldHRsaW5nIG9uIGEgYi10cmVlIHZh cmlhbnQgYW5kIGEgcm91Z2gNCm91dGxpbmUsIHdlIHJlc2VhcmNoZWQgcmFuZ2VkIGJhc2VkIGIt dHJlZXMgYW5kIFJDVSBiLXRyZWVzIGFuZCBkaWQgZmluZA0KdGhhdCBhcnRpY2xlLiAgU28gaXQg d2FzIG5pY2UgdG8gZmluZCByZWFzc3VyYW5jZXMgdGhhdCB3ZSB3ZXJlIG9uIHRoZQ0KcmlnaHQg cGF0aCwgYnV0IG91ciBkZXNpZ24gY2hvaWNlIG9mIHVzaW5nIHJhbmdlcyBtYWRlIHRoYXQgcGFw ZXIgdW51c2FibGUNCmZvciB1cy4NCg0KVGhpcyBwYXRjaCAob2YgNzApOg0KDQpUaGUgbWFwbGUg dHJlZSBpcyBhbiBSQ1Utc2FmZSByYW5nZSBiYXNlZCBCLXRyZWUgZGVzaWduZWQgdG8gdXNlIG1v ZGVybg0KcHJvY2Vzc29yIGNhY2hlIGVmZmljaWVudGx5LiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9m IHBsYWNlcyBpbiB0aGUga2VybmVsDQp0aGF0IGEgbm9uLW92ZXJsYXBwaW5nIHJhbmdlLWJhc2Vk IHRyZWUgd291bGQgYmUgYmVuZWZpY2lhbCwgZXNwZWNpYWxseQ0Kb25lIHdpdGggYSBzaW1wbGUg aW50ZXJmYWNlLiAgSWYgeW91IHVzZSBhbiByYnRyZWUgd2l0aCBvdGhlciBkYXRhDQpzdHJ1Y3R1 cmVzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugb3IgYW4gaW50ZXJ2YWwgdHJlZSB0byB0cmFjaw0K bm9uLW92ZXJsYXBwaW5nIHJhbmdlcywgdGhlbiB0aGlzIGlzIGZvciB5b3UuDQoNClRoZSB0cmVl IGhhcyBhIGJyYW5jaGluZyBmYWN0b3Igb2YgMTAgZm9yIG5vbi1sZWFmIG5vZGVzIGFuZCAxNiBm b3IgbGVhZg0Kbm9kZXMuICBXaXRoIHRoZSBpbmNyZWFzZWQgYnJhbmNoaW5nIGZhY3RvciwgaXQg aXMgc2lnbmlmaWNhbnRseSBzaG9ydGVyDQp0aGFuIHRoZSByYnRyZWUgc28gaXQgaGFzIGZld2Vy IGNhY2hlIG1pc3Nlcy4gIFRoZSByZW1vdmFsIG9mIHRoZSBsaW5rZWQNCmxpc3QgYmV0d2VlbiBz dWJzZXF1ZW50IGVudHJpZXMgYWxzbyByZWR1Y2VzIHRoZSBjYWNoZSBtaXNzZXMgYW5kIHRoZSBu ZWVkDQp0byBwdWxsIGluIHRoZSBwcmV2aW91cyBhbmQgbmV4dCBWTUEgZHVyaW5nIG1hbnkgdHJl ZSBhbHRlcmF0aW9ucy4NCg0KVGhlIGZpcnN0IHVzZXIgdGhhdCBpcyBjb3ZlcmVkIGluIHRoaXMg cGF0Y2ggc2V0IGlzIHRoZSB2bV9hcmVhX3N0cnVjdCwNCndoZXJlIHRocmVlIGRhdGEgc3RydWN0 dXJlcyBhcmUgcmVwbGFjZWQgYnkgdGhlIG1hcGxlIHRyZWU6IHRoZSBhdWdtZW50ZWQNCnJidHJl ZSwgdGhlIHZtYSBjYWNoZSwgYW5kIHRoZSBsaW5rZWQgbGlzdCBvZiBWTUFzIGluIHRoZSBtbV9z dHJ1Y3QuICBUaGUNCmxvbmcgdGVybSBnb2FsIGlzIHRvIHJlZHVjZSBvciByZW1vdmUgdGhlIG1t YXBfbG9jayBjb250ZW50aW9uLg0KDQpUaGUgcGxhbiBpcyB0byBnZXQgdG8gdGhlIHBvaW50IHdo ZXJlIHdlIHVzZSB0aGUgbWFwbGUgdHJlZSBpbiBSQ1UgbW9kZS4NClJlYWRlcnMgd2lsbCBub3Qg YmxvY2sgZm9yIHdyaXRlcnMuICBBIHNpbmdsZSB3cml0ZSBvcGVyYXRpb24gd2lsbCBiZQ0KYWxs b3dlZCBhdCBhIHRpbWUuICBBIHJlYWRlciByZS13YWxrcyBpZiBzdGFsZSBkYXRhIGlzIGVuY291 bnRlcmVkLiAgVk1Bcw0Kd291bGQgYmUgUkNVIGVuYWJsZWQgYW5kIHRoaXMgbW9kZSB3b3VsZCBi ZSBlbnRlcmVkIG9uY2UgbXVsdGlwbGUgdGFza3MNCmFyZSB1c2luZyB0aGUgbW1fc3RydWN0Lg0K DQpUaGVyZSBpcyBhZGRpdGlvbmFsIEJVR19PTigpIGNhbGxzIGFkZGVkIHdpdGhpbiB0aGUgdHJl ZSwgbW9zdCBvZiB3aGljaA0KYXJlIGluIGRlYnVnIGNvZGUuICBUaGVzZSB3aWxsIGJlIHJlcGxh Y2VkIHdpdGggYSBXQVJOX09OKCkgY2FsbCBpbiB0aGUNCmZ1dHVyZS4gIFRoZXJlIGlzIGFsc28g YWRkaXRpb25hbCBCVUdfT04oKSBjYWxscyB3aXRoaW4gdGhlIGNvZGUgd2hpY2gNCndpbGwgYWxz byBiZSByZWR1Y2VkIGluIG51bWJlciBhdCBhIGxhdGVyIGRhdGUuICBUaGVzZSBleGlzdCB0byBj YXRjaA0KdGhpbmdzIHN1Y2ggYXMgb3V0LW9mLXJhbmdlIGFjY2Vzc2VzIHdoaWNoIHdvdWxkIGNy YXNoIGFueXdheXMuDQoNClNpZ25lZC1vZmYtYnk6IExpYW0gUi4gSG93bGV0dCA8TGlhbS5Ib3ds ZXR0QG9yYWNsZS5jb20+DQpTaWduZWQtb2ZmLWJ5OiBNYXR0aGV3IFdpbGNveCAoT3JhY2xlKSA8 d2lsbHlAaW5mcmFkZWFkLm9yZz4NClRlc3RlZC1ieTogRGF2aWQgSG93ZWxscyA8ZGhvd2VsbHNA cmVkaGF0LmNvbT4NClRlc3RlZC1ieTogU3ZlbiBTY2huZWxsZSA8c3ZlbnNAbGludXguaWJtLmNv bT4NCi0tLQ0KIERvY3VtZW50YXRpb24vY29yZS1hcGkvaW5kZXgucnN0ICAgICAgICAgICAgICB8 ICAgIDEgKw0KIERvY3VtZW50YXRpb24vY29yZS1hcGkvbWFwbGVfdHJlZS5yc3QgICAgICAgICB8 ICAyMTcgKw0KIE1BSU5UQUlORVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgMTIgKw0KIGluY2x1ZGUvbGludXgvbWFwbGVfdHJlZS5oICAgICAgICAgICAgICAgICAgICB8 ICA2ODUgKysNCiBpbmNsdWRlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmggICAgICAgICAgICAg fCAgMTIzICsNCiBpbml0L21haW4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICAyICsNCiBsaWIvS2NvbmZpZy5kZWJ1ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDE1ICsNCiBsaWIvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICAyICstDQogbGliL21hcGxlX3RyZWUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgNzEzMCArKysrKysrKysrKysrKysrKw0KIHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS8uZ2l0 aWdub3JlICAgICAgICAgICB8ICAgIDIgKw0KIHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9nZW5l cmF0ZWQvYXV0b2NvbmYuaCB8ICAgIDEgKw0KIHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51 eC9tYXBsZV90cmVlLmggICB8ICAgIDcgKw0KIHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9tYXBs ZS5jICAgICAgICAgICAgICB8ICAgNTkgKw0KIC4uLi9yYWRpeC10cmVlL3RyYWNlL2V2ZW50cy9t YXBsZV90cmVlLmggICAgICB8ICAgIDUgKw0KIDE0IGZpbGVzIGNoYW5nZWQsIDgyNjAgaW5zZXJ0 aW9ucygrKSwgMSBkZWxldGlvbigtKQ0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0aW9u L2NvcmUtYXBpL21hcGxlX3RyZWUucnN0DQogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvbGlu dXgvbWFwbGVfdHJlZS5oDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvdHJhY2UvZXZlbnRz L21hcGxlX3RyZWUuaA0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvbWFwbGVfdHJlZS5jDQogY3Jl YXRlIG1vZGUgMTAwNjQ0IHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9tYXBsZV90cmVl LmgNCiBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL21hcGxlLmMN CiBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL3RyYWNlL2V2ZW50 cy9tYXBsZV90cmVlLmgNCg0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29yZS1hcGkvaW5k ZXgucnN0IGIvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9pbmRleC5yc3QNCmluZGV4IGRjOTVkZjQ2 MmVlYS4uMWRhNmE0ZmFjNjY0IDEwMDY0NA0KLS0tIGEvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9p bmRleC5yc3QNCisrKyBiL0RvY3VtZW50YXRpb24vY29yZS1hcGkvaW5kZXgucnN0DQpAQCAtMzYs NiArMzYsNyBAQCBMaWJyYXJ5IGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyB1c2VkIHRocm91Z2hvdXQg dGhlIGtlcm5lbC4NCiAgICBrcmVmDQogICAgYXNzb2NfYXJyYXkNCiAgICB4YXJyYXkNCisgICBt YXBsZV90cmVlDQogICAgaWRyDQogICAgY2lyY3VsYXItYnVmZmVycw0KICAgIHJidHJlZQ0KZGlm ZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29yZS1hcGkvbWFwbGVfdHJlZS5yc3QgYi9Eb2N1bWVu dGF0aW9uL2NvcmUtYXBpL21hcGxlX3RyZWUucnN0DQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5k ZXggMDAwMDAwMDAwMDAwLi40NWRlZmNmMTVkYTcNCi0tLSAvZGV2L251bGwNCisrKyBiL0RvY3Vt ZW50YXRpb24vY29yZS1hcGkvbWFwbGVfdHJlZS5yc3QNCkBAIC0wLDAgKzEsMjE3IEBADQorLi4g U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArDQorDQorDQorPT09PT09PT09PQ0KK01h cGxlIFRyZWUNCis9PT09PT09PT09DQorDQorOkF1dGhvcjogTGlhbSBSLiBIb3dsZXR0DQorDQor T3ZlcnZpZXcNCis9PT09PT09PQ0KKw0KK1RoZSBNYXBsZSBUcmVlIGlzIGEgQi1UcmVlIGRhdGEg dHlwZSB3aGljaCBpcyBvcHRpbWl6ZWQgZm9yIHN0b3JpbmcNCitub24tb3ZlcmxhcHBpbmcgcmFu Z2VzLCBpbmNsdWRpbmcgcmFuZ2VzIG9mIHNpemUgMS4gIFRoZSB0cmVlIHdhcyBkZXNpZ25lZCB0 bw0KK2JlIHNpbXBsZSB0byB1c2UgYW5kIGRvZXMgbm90IHJlcXVpcmUgYSB1c2VyIHdyaXR0ZW4g c2VhcmNoIG1ldGhvZC4gIEl0DQorc3VwcG9ydHMgaXRlcmF0aW5nIG92ZXIgYSByYW5nZSBvZiBl bnRyaWVzIGFuZCBnb2luZyB0byB0aGUgcHJldmlvdXMgb3IgbmV4dA0KK2VudHJ5IGluIGEgY2Fj aGUtZWZmaWNpZW50IG1hbm5lci4gIFRoZSB0cmVlIGNhbiBhbHNvIGJlIHB1dCBpbnRvIGFuIFJD VS1zYWZlDQorbW9kZSBvZiBvcGVyYXRpb24gd2hpY2ggYWxsb3dzIHJlYWRpbmcgYW5kIHdyaXRp bmcgY29uY3VycmVudGx5LiAgV3JpdGVycyBtdXN0DQorc3luY2hyb25pemUgb24gYSBsb2NrLCB3 aGljaCBjYW4gYmUgdGhlIGRlZmF1bHQgc3BpbmxvY2ssIG9yIHRoZSB1c2VyIGNhbiBzZXQNCit0 aGUgbG9jayB0byBhbiBleHRlcm5hbCBsb2NrIG9mIGEgZGlmZmVyZW50IHR5cGUuDQorDQorVGhl IE1hcGxlIFRyZWUgbWFpbnRhaW5zIGEgc21hbGwgbWVtb3J5IGZvb3RwcmludCBhbmQgd2FzIGRl c2lnbmVkIHRvIHVzZQ0KK21vZGVybiBwcm9jZXNzb3IgY2FjaGUgZWZmaWNpZW50bHkuICBUaGUg bWFqb3JpdHkgb2YgdGhlIHVzZXJzIHdpbGwgYmUgYWJsZSB0bw0KK3VzZSB0aGUgbm9ybWFsIEFQ SS4gIEFuIDpyZWY6YG1hcGxlLXRyZWUtYWR2YW5jZWQtYXBpYCBleGlzdHMgZm9yIG1vcmUgY29t cGxleA0KK3NjZW5hcmlvcy4gIFRoZSBtb3N0IGltcG9ydGFudCB1c2FnZSBvZiB0aGUgTWFwbGUg VHJlZSBpcyB0aGUgdHJhY2tpbmcgb2YgdGhlDQordmlydHVhbCBtZW1vcnkgYXJlYXMuDQorDQor VGhlIE1hcGxlIFRyZWUgY2FuIHN0b3JlIHZhbHVlcyBiZXR3ZWVuIGBgMGBgIGFuZCBgYFVMT05H X01BWGBgLiAgVGhlIE1hcGxlDQorVHJlZSByZXNlcnZlcyB2YWx1ZXMgd2l0aCB0aGUgYm90dG9t IHR3byBiaXRzIHNldCB0byAnMTAnIHdoaWNoIGFyZSBiZWxvdyA0MDk2DQorKGllIDIsIDYsIDEw IC4uIDQwOTQpIGZvciBpbnRlcm5hbCB1c2UuICBJZiB0aGUgZW50cmllcyBtYXkgdXNlIHJlc2Vy dmVkDQorZW50cmllcyB0aGVuIHRoZSB1c2VycyBjYW4gY29udmVydCB0aGUgZW50cmllcyB1c2lu ZyB4YV9ta192YWx1ZSgpIGFuZCBjb252ZXJ0DQordGhlbSBiYWNrIGJ5IGNhbGxpbmcgeGFfdG9f dmFsdWUoKS4gIElmIHRoZSB1c2VyIG5lZWRzIHRvIHVzZSBhIHJlc2VydmVkDQordmFsdWUsIHRo ZW4gdGhlIHVzZXIgY2FuIGNvbnZlcnQgdGhlIHZhbHVlIHdoZW4gdXNpbmcgdGhlDQorOnJlZjpg bWFwbGUtdHJlZS1hZHZhbmNlZC1hcGlgLCBidXQgYXJlIGJsb2NrZWQgYnkgdGhlIG5vcm1hbCBB UEkuDQorDQorVGhlIE1hcGxlIFRyZWUgY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byBzdXBwb3J0 IHNlYXJjaGluZyBmb3IgYSBnYXAgb2YgYSBnaXZlbg0KK3NpemUgKG9yIGxhcmdlcikuDQorDQor UHJlLWFsbG9jYXRpbmcgb2Ygbm9kZXMgaXMgYWxzbyBzdXBwb3J0ZWQgdXNpbmcgdGhlDQorOnJl ZjpgbWFwbGUtdHJlZS1hZHZhbmNlZC1hcGlgLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHVzZXJzIHdo byBtdXN0IGd1YXJhbnRlZSBhDQorc3VjY2Vzc2Z1bCBzdG9yZSBvcGVyYXRpb24gd2l0aGluIGEg Z2l2ZW4NCitjb2RlIHNlZ21lbnQgd2hlbiBhbGxvY2F0aW5nIGNhbm5vdCBiZSBkb25lLiAgQWxs b2NhdGlvbnMgb2Ygbm9kZXMgYXJlDQorcmVsYXRpdmVseSBzbWFsbCBhdCBhcm91bmQgMjU2IGJ5 dGVzLg0KKw0KKy4uIF9tYXBsZS10cmVlLW5vcm1hbC1hcGk6DQorDQorTm9ybWFsIEFQSQ0KKz09 PT09PT09PT0NCisNCitTdGFydCBieSBpbml0aWFsaXNpbmcgYSBtYXBsZSB0cmVlLCBlaXRoZXIg d2l0aCBERUZJTkVfTVRSRUUoKSBmb3Igc3RhdGljYWxseQ0KK2FsbG9jYXRlZCBtYXBsZSB0cmVl cyBvciBtdF9pbml0KCkgZm9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBvbmVzLiAgQQ0KK2ZyZXNo bHktaW5pdGlhbGlzZWQgbWFwbGUgdHJlZSBjb250YWlucyBhIGBgTlVMTGBgIHBvaW50ZXIgZm9y IHRoZSByYW5nZSBgYDBgYA0KKy0gYGBVTE9OR19NQVhgYC4gIFRoZXJlIGFyZSBjdXJyZW50bHkg dHdvIHR5cGVzIG9mIG1hcGxlIHRyZWVzIHN1cHBvcnRlZDogdGhlDQorYWxsb2NhdGlvbiB0cmVl IGFuZCB0aGUgcmVndWxhciB0cmVlLiAgVGhlIHJlZ3VsYXIgdHJlZSBoYXMgYSBoaWdoZXIgYnJh bmNoaW5nDQorZmFjdG9yIGZvciBpbnRlcm5hbCBub2Rlcy4gIFRoZSBhbGxvY2F0aW9uIHRyZWUg aGFzIGEgbG93ZXIgYnJhbmNoaW5nIGZhY3Rvcg0KK2J1dCBhbGxvd3MgdGhlIHVzZXIgdG8gc2Vh cmNoIGZvciBhIGdhcCBvZiBhIGdpdmVuIHNpemUgb3IgbGFyZ2VyIGZyb20gZWl0aGVyDQorYGAw YGAgdXB3YXJkcyBvciBgYFVMT05HX01BWGBgIGRvd24uICBBbiBhbGxvY2F0aW9uIHRyZWUgY2Fu IGJlIHVzZWQgYnkNCitwYXNzaW5nIGluIHRoZSBgYE1UX0ZMQUdTX0FMTE9DX1JBTkdFYGAgZmxh ZyB3aGVuIGluaXRpYWxpc2luZyB0aGUgdHJlZS4NCisNCitZb3UgY2FuIHRoZW4gc2V0IGVudHJp ZXMgdXNpbmcgbXRyZWVfc3RvcmUoKSBvciBtdHJlZV9zdG9yZV9yYW5nZSgpLg0KK210cmVlX3N0 b3JlKCkgd2lsbCBvdmVyd3JpdGUgYW55IGVudHJ5IHdpdGggdGhlIG5ldyBlbnRyeSBhbmQgcmV0 dXJuIDAgb24NCitzdWNjZXNzIG9yIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlLiAgbXRyZWVfc3Rv cmVfcmFuZ2UoKSB3b3JrcyBpbiB0aGUgc2FtZSB3YXkNCitidXQgdGFrZXMgYSByYW5nZS4gIG10 cmVlX2xvYWQoKSBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBlbnRyeSBzdG9yZWQgYXQgYQ0KK2dp dmVuIGluZGV4LiAgWW91IGNhbiB1c2UgbXRyZWVfZXJhc2UoKSB0byBlcmFzZSBhbiBlbnRpcmUg cmFuZ2UgYnkgb25seQ0KK2tub3dpbmcgb25lIHZhbHVlIHdpdGhpbiB0aGF0IHJhbmdlLCBvciBt dHJlZV9zdG9yZSgpIGNhbGwgd2l0aCBhbiBlbnRyeSBvZg0KK05VTEwgbWF5IGJlIHVzZWQgdG8g cGFydGlhbGx5IGVyYXNlIGEgcmFuZ2Ugb3IgbWFueSByYW5nZXMgYXQgb25jZS4NCisNCitJZiB5 b3Ugd2FudCB0byBvbmx5IHN0b3JlIGEgbmV3IGVudHJ5IHRvIGEgcmFuZ2UgKG9yIGluZGV4KSBp ZiB0aGF0IHJhbmdlIGlzDQorY3VycmVudGx5IGBgTlVMTGBgLCB5b3UgY2FuIHVzZSBtdHJlZV9p bnNlcnRfcmFuZ2UoKSBvciBtdHJlZV9pbnNlcnQoKSB3aGljaA0KK3JldHVybiAtRUVYSVNUIGlm IHRoZSByYW5nZSBpcyBub3QgZW1wdHkuDQorDQorWW91IGNhbiBzZWFyY2ggZm9yIGFuIGVudHJ5 IGZyb20gYW4gaW5kZXggdXB3YXJkcyBieSB1c2luZyBtdF9maW5kKCkuDQorDQorWW91IGNhbiB3 YWxrIGVhY2ggZW50cnkgd2l0aGluIGEgcmFuZ2UgYnkgY2FsbGluZyBtdF9mb3JfZWFjaCgpLiAg WW91IG11c3QNCitwcm92aWRlIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHRvIHN0b3JlIGEgY3Vyc29y LiAgSWYgeW91IHdhbnQgdG8gd2FsayBlYWNoDQorZWxlbWVudCBvZiB0aGUgdHJlZSB0aGVuIGBg MGBgIGFuZCBgYFVMT05HX01BWGBgIG1heSBiZSB1c2VkIGFzIHRoZSByYW5nZS4gIElmDQordGhl IGNhbGxlciBpcyBnb2luZyB0byBob2xkIHRoZSBsb2NrIGZvciB0aGUgZHVyYXRpb24gb2YgdGhl IHdhbGsgdGhlbiBpdCBpcw0KK3dvcnRoIGxvb2tpbmcgYXQgdGhlIG1hc19mb3JfZWFjaCgpIEFQ SSBpbiB0aGUgOnJlZjpgbWFwbGUtdHJlZS1hZHZhbmNlZC1hcGlgDQorc2VjdGlvbi4NCisNCitT b21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgbmV4dCBjYWxsIHRvIHN0b3Jl IHRvIGEgbWFwbGUgdHJlZSBkb2VzDQorbm90IGFsbG9jYXRlIG1lbW9yeSwgcGxlYXNlIHNlZSA6 cmVmOmBtYXBsZS10cmVlLWFkdmFuY2VkLWFwaWAgZm9yIHRoaXMgdXNlIGNhc2UuDQorDQorRmlu YWxseSwgeW91IGNhbiByZW1vdmUgYWxsIGVudHJpZXMgZnJvbSBhIG1hcGxlIHRyZWUgYnkgY2Fs bGluZw0KK210cmVlX2Rlc3Ryb3koKS4gIElmIHRoZSBtYXBsZSB0cmVlIGVudHJpZXMgYXJlIHBv aW50ZXJzLCB5b3UgbWF5IHdpc2ggdG8gZnJlZQ0KK3RoZSBlbnRyaWVzIGZpcnN0Lg0KKw0KK0Fs bG9jYXRpbmcgTm9kZXMNCistLS0tLS0tLS0tLS0tLS0tDQorDQorVGhlIGFsbG9jYXRpb25zIGFy ZSBoYW5kbGVkIGJ5IHRoZSBpbnRlcm5hbCB0cmVlIGNvZGUuICBTZWUNCis6cmVmOmBtYXBsZS10 cmVlLWFkdmFuY2VkLWFsbG9jYCBmb3Igb3RoZXIgb3B0aW9ucy4NCisNCitMb2NraW5nDQorLS0t LS0tLQ0KKw0KK1lvdSBkbyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBsb2NraW5nLiAgU2VlIDpy ZWY6YG1hcGxlLXRyZWUtYWR2YW5jZWQtbG9ja3NgDQorZm9yIG90aGVyIG9wdGlvbnMuDQorDQor VGhlIE1hcGxlIFRyZWUgdXNlcyBSQ1UgYW5kIGFuIGludGVybmFsIHNwaW5sb2NrIHRvIHN5bmNo cm9uaXNlIGFjY2VzczoNCisNCitUYWtlcyBSQ1UgcmVhZCBsb2NrOg0KKyAqIG10cmVlX2xvYWQo KQ0KKyAqIG10X2ZpbmQoKQ0KKyAqIG10X2Zvcl9lYWNoKCkNCisgKiBtdF9uZXh0KCkNCisgKiBt dF9wcmV2KCkNCisNCitUYWtlcyBtYV9sb2NrIGludGVybmFsbHk6DQorICogbXRyZWVfc3RvcmUo KQ0KKyAqIG10cmVlX3N0b3JlX3JhbmdlKCkNCisgKiBtdHJlZV9pbnNlcnQoKQ0KKyAqIG10cmVl X2luc2VydF9yYW5nZSgpDQorICogbXRyZWVfZXJhc2UoKQ0KKyAqIG10cmVlX2Rlc3Ryb3koKQ0K KyAqIG10X3NldF9pbl9yY3UoKQ0KKyAqIG10X2NsZWFyX2luX3JjdSgpDQorDQorSWYgeW91IHdh bnQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGludGVybmFsIGxvY2sgdG8gcHJvdGVjdCB0aGUg ZGF0YQ0KK3N0cnVjdHVyZXMgdGhhdCB5b3UgYXJlIHN0b3JpbmcgaW4gdGhlIE1hcGxlIFRyZWUs IHlvdSBjYW4gY2FsbCBtdHJlZV9sb2NrKCkNCitiZWZvcmUgY2FsbGluZyBtdHJlZV9sb2FkKCks IHRoZW4gdGFrZSBhIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgb2JqZWN0IHlvdQ0KK2hhdmUgZm91 bmQgYmVmb3JlIGNhbGxpbmcgbXRyZWVfdW5sb2NrKCkuICBUaGlzIHdpbGwgcHJldmVudCBzdG9y ZXMgZnJvbQ0KK3JlbW92aW5nIHRoZSBvYmplY3QgZnJvbSB0aGUgdHJlZSBiZXR3ZWVuIGxvb2tp bmcgdXAgdGhlIG9iamVjdCBhbmQNCitpbmNyZW1lbnRpbmcgdGhlIHJlZmNvdW50LiAgWW91IGNh biBhbHNvIHVzZSBSQ1UgdG8gYXZvaWQgZGVyZWZlcmVuY2luZw0KK2ZyZWVkIG1lbW9yeSwgYnV0 IGFuIGV4cGxhbmF0aW9uIG9mIHRoYXQgaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzDQorZG9j dW1lbnQuDQorDQorLi4gX21hcGxlLXRyZWUtYWR2YW5jZWQtYXBpOg0KKw0KK0FkdmFuY2VkIEFQ SQ0KKz09PT09PT09PT09PQ0KKw0KK1RoZSBhZHZhbmNlZCBBUEkgb2ZmZXJzIG1vcmUgZmxleGli aWxpdHkgYW5kIGJldHRlciBwZXJmb3JtYW5jZSBhdCB0aGUNCitjb3N0IG9mIGFuIGludGVyZmFj ZSB3aGljaCBjYW4gYmUgaGFyZGVyIHRvIHVzZSBhbmQgaGFzIGZld2VyIHNhZmVndWFyZHMuDQor WW91IG11c3QgdGFrZSBjYXJlIG9mIHlvdXIgb3duIGxvY2tpbmcgd2hpbGUgdXNpbmcgdGhlIGFk dmFuY2VkIEFQSS4NCitZb3UgY2FuIHVzZSB0aGUgbWFfbG9jaywgUkNVIG9yIGFuIGV4dGVybmFs IGxvY2sgZm9yIHByb3RlY3Rpb24uDQorWW91IGNhbiBtaXggYWR2YW5jZWQgYW5kIG5vcm1hbCBv cGVyYXRpb25zIG9uIHRoZSBzYW1lIGFycmF5LCBhcyBsb25nDQorYXMgdGhlIGxvY2tpbmcgaXMg Y29tcGF0aWJsZS4gIFRoZSA6cmVmOmBtYXBsZS10cmVlLW5vcm1hbC1hcGlgIGlzIGltcGxlbWVu dGVkDQoraW4gdGVybXMgb2YgdGhlIGFkdmFuY2VkIEFQSS4NCisNCitUaGUgYWR2YW5jZWQgQVBJ IGlzIGJhc2VkIGFyb3VuZCB0aGUgbWFfc3RhdGUsIHRoaXMgaXMgd2hlcmUgdGhlICdtYXMnDQor cHJlZml4IG9yaWdpbmF0ZXMuICBUaGUgbWFfc3RhdGUgc3RydWN0IGtlZXBzIHRyYWNrIG9mIHRy ZWUgb3BlcmF0aW9ucyB0byBtYWtlDQorbGlmZSBlYXNpZXIgZm9yIGJvdGggaW50ZXJuYWwgYW5k IGV4dGVybmFsIHRyZWUgdXNlcnMuDQorDQorSW5pdGlhbGlzaW5nIHRoZSBtYXBsZSB0cmVlIGlz IHRoZSBzYW1lIGFzIGluIHRoZSA6cmVmOmBtYXBsZS10cmVlLW5vcm1hbC1hcGlgLg0KK1BsZWFz ZSBzZWUgYWJvdmUuDQorDQorVGhlIG1hcGxlIHN0YXRlIGtlZXBzIHRyYWNrIG9mIHRoZSByYW5n ZSBzdGFydCBhbmQgZW5kIGluIG1hcy0+aW5kZXggYW5kDQorbWFzLT5sYXN0LCByZXNwZWN0aXZl bHkuDQorDQorbWFzX3dhbGsoKSB3aWxsIHdhbGsgdGhlIHRyZWUgdG8gdGhlIGxvY2F0aW9uIG9m IG1hcy0+aW5kZXggYW5kIHNldCB0aGUNCittYXMtPmluZGV4IGFuZCBtYXMtPmxhc3QgYWNjb3Jk aW5nIHRvIHRoZSByYW5nZSBmb3IgdGhlIGVudHJ5Lg0KKw0KK1lvdSBjYW4gc2V0IGVudHJpZXMg dXNpbmcgbWFzX3N0b3JlKCkuICBtYXNfc3RvcmUoKSB3aWxsIG92ZXJ3cml0ZSBhbnkgZW50cnkN Cit3aXRoIHRoZSBuZXcgZW50cnkgYW5kIHJldHVybiB0aGUgZmlyc3QgZXhpc3RpbmcgZW50cnkg dGhhdCBpcyBvdmVyd3JpdHRlbi4NCitUaGUgcmFuZ2UgaXMgcGFzc2VkIGluIGFzIG1lbWJlcnMg b2YgdGhlIG1hcGxlIHN0YXRlOiBpbmRleCBhbmQgbGFzdC4NCisNCitZb3UgY2FuIHVzZSBtYXNf ZXJhc2UoKSB0byBlcmFzZSBhbiBlbnRpcmUgcmFuZ2UgYnkgc2V0dGluZyBpbmRleCBhbmQNCits YXN0IG9mIHRoZSBtYXBsZSBzdGF0ZSB0byB0aGUgZGVzaXJlZCByYW5nZSB0byBlcmFzZS4gIFRo aXMgd2lsbCBlcmFzZQ0KK3RoZSBmaXJzdCByYW5nZSB0aGF0IGlzIGZvdW5kIGluIHRoYXQgcmFu Z2UsIHNldCB0aGUgbWFwbGUgc3RhdGUgaW5kZXgNCithbmQgbGFzdCBhcyB0aGUgcmFuZ2UgdGhh dCB3YXMgZXJhc2VkIGFuZCByZXR1cm4gdGhlIGVudHJ5IHRoYXQgZXhpc3RlZA0KK2F0IHRoYXQg bG9jYXRpb24uDQorDQorWW91IGNhbiB3YWxrIGVhY2ggZW50cnkgd2l0aGluIGEgcmFuZ2UgYnkg dXNpbmcgbWFzX2Zvcl9lYWNoKCkuICBJZiB5b3Ugd2FudA0KK3RvIHdhbGsgZWFjaCBlbGVtZW50 IG9mIHRoZSB0cmVlIHRoZW4gYGAwYGAgYW5kIGBgVUxPTkdfTUFYYGAgbWF5IGJlIHVzZWQgYXMN Cit0aGUgcmFuZ2UuICBJZiB0aGUgbG9jayBuZWVkcyB0byBiZSBwZXJpb2RpY2FsbHkgZHJvcHBl ZCwgc2VlIHRoZSBsb2NraW5nDQorc2VjdGlvbiBtYXNfcGF1c2UoKS4NCisNCitVc2luZyBhIG1h cGxlIHN0YXRlIGFsbG93cyBtYXNfbmV4dCgpIGFuZCBtYXNfcHJldigpIHRvIGZ1bmN0aW9uIGFz IGlmIHRoZQ0KK3RyZWUgd2FzIGEgbGlua2VkIGxpc3QuICBXaXRoIHN1Y2ggYSBoaWdoIGJyYW5j aGluZyBmYWN0b3IgdGhlIGFtb3J0aXplZA0KK3BlcmZvcm1hbmNlIHBlbmFsdHkgaXMgb3V0d2Vp Z2hlZCBieSBjYWNoZSBvcHRpbWl6YXRpb24uICBtYXNfbmV4dCgpIHdpbGwNCityZXR1cm4gdGhl IG5leHQgZW50cnkgd2hpY2ggb2NjdXJzIGFmdGVyIHRoZSBlbnRyeSBhdCBpbmRleC4gIG1hc19w cmV2KCkNCit3aWxsIHJldHVybiB0aGUgcHJldmlvdXMgZW50cnkgd2hpY2ggb2NjdXJzIGJlZm9y ZSB0aGUgZW50cnkgYXQgaW5kZXguDQorDQorbWFzX2ZpbmQoKSB3aWxsIGZpbmQgdGhlIGZpcnN0 IGVudHJ5IHdoaWNoIGV4aXN0cyBhdCBvciBhYm92ZSBpbmRleCBvbg0KK3RoZSBmaXJzdCBjYWxs LCBhbmQgdGhlIG5leHQgZW50cnkgZnJvbSBldmVyeSBzdWJzZXF1ZW50IGNhbGxzLg0KKw0KK21h c19maW5kX3JldigpIHdpbGwgZmluZCB0aGUgZmlzdCBlbnRyeSB3aGljaCBleGlzdHMgYXQgb3Ig YmVsb3cgdGhlIGxhc3Qgb24NCit0aGUgZmlyc3QgY2FsbCwgYW5kIHRoZSBwcmV2aW91cyBlbnRy eSBmcm9tIGV2ZXJ5IHN1YnNlcXVlbnQgY2FsbHMuDQorDQorSWYgdGhlIHVzZXIgbmVlZHMgdG8g eWllbGQgdGhlIGxvY2sgZHVyaW5nIGFuIG9wZXJhdGlvbiwgdGhlbiB0aGUgbWFwbGUgc3RhdGUN CittdXN0IGJlIHBhdXNlZCB1c2luZyBtYXNfcGF1c2UoKS4NCisNCitUaGVyZSBhcmUgYSBmZXcg ZXh0cmEgaW50ZXJmYWNlcyBwcm92aWRlZCB3aGVuIHVzaW5nIGFuIGFsbG9jYXRpb24gdHJlZS4N CitJZiB5b3Ugd2lzaCB0byBzZWFyY2ggZm9yIGEgZ2FwIHdpdGhpbiBhIHJhbmdlLCB0aGVuIG1h c19lbXB0eV9hcmVhKCkNCitvciBtYXNfZW1wdHlfYXJlYV9yZXYoKSBjYW4gYmUgdXNlZC4gIG1h c19lbXB0eV9hcmVhKCkgc2VhcmNoZXMgZm9yIGEgZ2FwDQorc3RhcnRpbmcgYXQgdGhlIGxvd2Vz dCBpbmRleCBnaXZlbiB1cCB0byB0aGUgbWF4aW11bSBvZiB0aGUgcmFuZ2UuDQorbWFzX2VtcHR5 X2FyZWFfcmV2KCkgc2VhcmNoZXMgZm9yIGEgZ2FwIHN0YXJ0aW5nIGF0IHRoZSBoaWdoZXN0IGlu ZGV4IGdpdmVuDQorYW5kIGNvbnRpbnVlcyBkb3dud2FyZCB0byB0aGUgbG93ZXIgYm91bmQgb2Yg dGhlIHJhbmdlLg0KKw0KKy4uIF9tYXBsZS10cmVlLWFkdmFuY2VkLWFsbG9jOg0KKw0KK0FkdmFu Y2VkIEFsbG9jYXRpbmcgTm9kZXMNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorQWxs b2NhdGlvbnMgYXJlIHVzdWFsbHkgaGFuZGxlZCBpbnRlcm5hbGx5IHRvIHRoZSB0cmVlLCBob3dl dmVyIGlmIGFsbG9jYXRpb25zDQorbmVlZCB0byBvY2N1ciBiZWZvcmUgYSB3cml0ZSBvY2N1cnMg dGhlbiBjYWxsaW5nIG1hc19leHBlY3RlZF9lbnRyaWVzKCkgd2lsbA0KK2FsbG9jYXRlIHRoZSB3 b3JzdC1jYXNlIG51bWJlciBvZiBuZWVkZWQgbm9kZXMgdG8gaW5zZXJ0IHRoZSBwcm92aWRlZCBu dW1iZXIgb2YNCityYW5nZXMuICBUaGlzIGFsc28gY2F1c2VzIHRoZSB0cmVlIHRvIGVudGVyIG1h c3MgaW5zZXJ0aW9uIG1vZGUuICBPbmNlDQoraW5zZXJ0aW9ucyBhcmUgY29tcGxldGUgY2FsbGlu ZyBtYXNfZGVzdHJveSgpIG9uIHRoZSBtYXBsZSBzdGF0ZSB3aWxsIGZyZWUgdGhlDQordW51c2Vk IGFsbG9jYXRpb25zLg0KKw0KKy4uIF9tYXBsZS10cmVlLWFkdmFuY2VkLWxvY2tzOg0KKw0KK0Fk dmFuY2VkIExvY2tpbmcNCistLS0tLS0tLS0tLS0tLS0tDQorDQorVGhlIG1hcGxlIHRyZWUgdXNl cyBhIHNwaW5sb2NrIGJ5IGRlZmF1bHQsIGJ1dCBleHRlcm5hbCBsb2NrcyBjYW4gYmUgdXNlZCBm b3INCit0cmVlIHVwZGF0ZXMgYXMgd2VsbC4gIFRvIHVzZSBhbiBleHRlcm5hbCBsb2NrLCB0aGUg dHJlZSBtdXN0IGJlIGluaXRpYWxpemVkDQord2l0aCB0aGUgYGBNVF9GTEFHU19MT0NLX0VYVEVS TiBmbGFnYGAsIHRoaXMgaXMgdXN1YWxseSBkb25lIHdpdGggdGhlDQorTVRSRUVfSU5JVF9FWFQo KSAjZGVmaW5lLCB3aGljaCB0YWtlcyBhbiBleHRlcm5hbCBsb2NrIGFzIGFuIGFyZ3VtZW50Lg0K Kw0KK0Z1bmN0aW9ucyBhbmQgc3RydWN0dXJlcw0KKz09PT09PT09PT09PT09PT09PT09PT09PQ0K Kw0KKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L21hcGxlX3RyZWUuaA0KKy4uIGtlcm5l bC1kb2M6OiBsaWIvbWFwbGVfdHJlZS5jDQpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlO VEFJTkVSUw0KaW5kZXggOGE1MDEyYmE2ZmY5Li41NGNjMWU1MTNhZWMgMTAwNjQ0DQotLS0gYS9N QUlOVEFJTkVSUw0KKysrIGIvTUFJTlRBSU5FUlMNCkBAIC0xMjA4OCw2ICsxMjA4OCwxOCBAQCBM OglsaW51eC1tYW5Admdlci5rZXJuZWwub3JnDQogUzoJTWFpbnRhaW5lZA0KIFc6CWh0dHA6Ly93 d3cua2VybmVsLm9yZy9kb2MvbWFuLXBhZ2VzDQogDQorTUFQTEUgVFJFRQ0KK006CUxpYW0gUi4g SG93bGV0dCA8TGlhbS5Ib3dsZXR0QG9yYWNsZS5jb20+DQorTDoJbGludXgtbW1Aa3ZhY2sub3Jn DQorUzoJU3VwcG9ydGVkDQorRjoJRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9tYXBsZV90cmVlLnJz dA0KK0Y6CWluY2x1ZGUvbGludXgvbWFwbGVfdHJlZS5oDQorRjoJaW5jbHVkZS90cmFjZS9ldmVu dHMvbWFwbGVfdHJlZS5oDQorRjoJbGliL21hcGxlX3RyZWUuYw0KK0Y6CWxpYi90ZXN0X21hcGxl X3RyZWUuYw0KK0Y6CXRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9tYXBsZV90cmVlLmgN CitGOgl0b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KKw0KIE1BUkRVSyAoQ1JFQVRP UiBDSTQwKSBERVZJQ0UgVFJFRSBTVVBQT1JUDQogTToJUmFodWwgQmVkYXJrYXIgPHJhaHVsYmVk YXJrYXI4OUBnbWFpbC5jb20+DQogTDoJbGludXgtbWlwc0B2Z2VyLmtlcm5lbC5vcmcNCmRpZmYg LS1naXQgYS9pbmNsdWRlL2xpbnV4L21hcGxlX3RyZWUuaCBiL2luY2x1ZGUvbGludXgvbWFwbGVf dHJlZS5oDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAwLi4yZWZmYWI3 MmFkZDENCi0tLSAvZGV2L251bGwNCisrKyBiL2luY2x1ZGUvbGludXgvbWFwbGVfdHJlZS5oDQpA QCAtMCwwICsxLDY4NSBAQA0KKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKyAq Lw0KKyNpZm5kZWYgX0xJTlVYX01BUExFX1RSRUVfSA0KKyNkZWZpbmUgX0xJTlVYX01BUExFX1RS RUVfSA0KKy8qDQorICogTWFwbGUgVHJlZSAtIEFuIFJDVS1zYWZlIGFkYXB0aXZlIHRyZWUgZm9y IHN0b3JpbmcgcmFuZ2VzDQorICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgT3JhY2xlDQorICog QXV0aG9yczogICAgIExpYW0gUi4gSG93bGV0dCA8TGlhbS5Ib3dsZXR0QE9yYWNsZS5jb20+DQor ICogICAgICAgICAgICAgIE1hdHRoZXcgV2lsY294IDx3aWxseUBpbmZyYWRlYWQub3JnPg0KKyAq Lw0KKw0KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4NCisjaW5jbHVkZSA8bGludXgvcmN1cGRh dGUuaD4NCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4NCisvKiAjZGVmaW5lIENPTkZJR19N QVBMRV9SQ1VfRElTQUJMRUQgKi8NCisvKiAjZGVmaW5lIENPTkZJR19ERUJVR19NQVBMRV9UUkVF X1ZFUkJPU0UgKi8NCisNCisvKg0KKyAqIEFsbG9jYXRlZCBub2RlcyBhcmUgbXV0YWJsZSB1bnRp bCB0aGV5IGhhdmUgYmVlbiBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlLA0KKyAqIGF0IHdoaWNoIHRp bWUgdGhleSBjYW5ub3QgY2hhbmdlIHRoZWlyIHR5cGUgdW50aWwgdGhleSBoYXZlIGJlZW4gcmVt b3ZlZA0KKyAqIGZyb20gdGhlIHRyZWUgYW5kIGFuIFJDVSBncmFjZSBwZXJpb2QgaGFzIHBhc3Nl ZC4NCisgKg0KKyAqIFJlbW92ZWQgbm9kZXMgaGF2ZSB0aGVpciAtPnBhcmVudCBzZXQgdG8gcG9p bnQgdG8gdGhlbXNlbHZlcy4gIFJDVSByZWFkZXJzDQorICogY2hlY2sgLT5wYXJlbnQgYmVmb3Jl IHJlbHlpbmcgb24gdGhlIHZhbHVlIHRoYXQgdGhleSBsb2FkZWQgZnJvbSB0aGUNCisgKiBzbG90 cyBhcnJheS4gIFRoaXMgbGV0cyB1cyByZXVzZSB0aGUgc2xvdHMgYXJyYXkgZm9yIHRoZSBSQ1Ug aGVhZC4NCisgKg0KKyAqIE5vZGVzIGluIHRoZSB0cmVlIHBvaW50IHRvIHRoZWlyIHBhcmVudCB1 bmxlc3MgYml0IDAgaXMgc2V0Lg0KKyAqLw0KKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgfHwg ZGVmaW5lZChCVUlMRF9WRFNPMzJfNjQpDQorLyogNjRiaXQgc2l6ZXMgKi8NCisjZGVmaW5lIE1B UExFX05PREVfU0xPVFMJMzEJLyogMjU2IGJ5dGVzIGluY2x1ZGluZyAtPnBhcmVudCAqLw0KKyNk ZWZpbmUgTUFQTEVfUkFOR0U2NF9TTE9UUwkxNgkvKiAyNTYgYnl0ZXMgKi8NCisjZGVmaW5lIE1B UExFX0FSQU5HRTY0X1NMT1RTCTEwCS8qIDI0MCBieXRlcyAqLw0KKyNkZWZpbmUgTUFQTEVfQVJB TkdFNjRfTUVUQV9NQVgJMTUJLyogT3V0IG9mIHJhbmdlIGZvciBtZXRhZGF0YSAqLw0KKyNkZWZp bmUgTUFQTEVfQUxMT0NfU0xPVFMJKE1BUExFX05PREVfU0xPVFMgLSAxKQ0KKyNlbHNlDQorLyog MzJiaXQgc2l6ZXMgKi8NCisjZGVmaW5lIE1BUExFX05PREVfU0xPVFMJNjMJLyogMjU2IGJ5dGVz IGluY2x1ZGluZyAtPnBhcmVudCAqLw0KKyNkZWZpbmUgTUFQTEVfUkFOR0U2NF9TTE9UUwkzMgkv KiAyNTYgYnl0ZXMgKi8NCisjZGVmaW5lIE1BUExFX0FSQU5HRTY0X1NMT1RTCTIxCS8qIDI0MCBi eXRlcyAqLw0KKyNkZWZpbmUgTUFQTEVfQVJBTkdFNjRfTUVUQV9NQVgJMzEJLyogT3V0IG9mIHJh bmdlIGZvciBtZXRhZGF0YSAqLw0KKyNkZWZpbmUgTUFQTEVfQUxMT0NfU0xPVFMJKE1BUExFX05P REVfU0xPVFMgLSAyKQ0KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR182NEJJVCkgfHwgZGVmaW5l ZChCVUlMRF9WRFNPMzJfNjQpICovDQorDQorI2RlZmluZSBNQVBMRV9OT0RFX01BU0sJCTI1NVVM DQorDQorLyoNCisgKiBUaGUgbm9kZS0+cGFyZW50IG9mIHRoZSByb290IG5vZGUgaGFzIGJpdCAw IHNldCBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBvaW50ZXINCisgKiBpcyBhIHBvaW50ZXIgdG8gdGhl IHRyZWUgaXRzZWxmLiAgTm8gbW9yZSBiaXRzIGFyZSBhdmFpbGFibGUgaW4gdGhpcyBwb2ludGVy DQorICogKG9uIG02OGssIHRoZSBkYXRhIHN0cnVjdHVyZSBtYXkgb25seSBiZSAyLWJ5dGUgYWxp Z25lZCkuDQorICoNCisgKiBJbnRlcm5hbCBub24tcm9vdCBub2RlcyBjYW4gb25seSBoYXZlIG1h cGxlX3JhbmdlXyogbm9kZXMgYXMgcGFyZW50cy4gIFRoZQ0KKyAqIHBhcmVudCBwb2ludGVyIGlz IDI1NkIgYWxpZ25lZCBsaWtlIGFsbCBvdGhlciB0cmVlIG5vZGVzLiAgV2hlbiBzdG9yaW5nIGEg MzINCisgKiBvciA2NCBiaXQgdmFsdWVzLCB0aGUgb2Zmc2V0IGNhbiBmaXQgaW50byA0IGJpdHMu ICBUaGUgMTYgYml0IHZhbHVlcyBuZWVkIGFuDQorICogZXh0cmEgYml0IHRvIHN0b3JlIHRoZSBv ZmZzZXQuICBUaGlzIGV4dHJhIGJpdCBjb21lcyBmcm9tIGEgcmV1c2Ugb2YgdGhlIGxhc3QNCisg KiBiaXQgaW4gdGhlIG5vZGUgdHlwZS4gIFRoaXMgaXMgcG9zc2libGUgYnkgdXNpbmcgYml0IDEg dG8gaW5kaWNhdGUgaWYgYml0IDINCisgKiBpcyBwYXJ0IG9mIHRoZSB0eXBlIG9yIHRoZSBzbG90 Lg0KKyAqDQorICogT25jZSB0aGUgdHlwZSBpcyBkZWNpZGVkLCB0aGUgZGVjaXNpb24gb2YgYW4g YWxsb2NhdGlvbiByYW5nZSB0eXBlIG9yIGEgcmFuZ2UNCisgKiB0eXBlIGlzIGRvbmUgYnkgZXhh bWluaW5nIHRoZSBpbW11dGFibGUgdHJlZSBmbGFnIGZvciB0aGUgTUFQTEVfQUxMT0NfUkFOR0UN CisgKiBmbGFnLg0KKyAqDQorICogIE5vZGUgdHlwZXM6DQorICogICAweD8/MSA9IFJvb3QNCisg KiAgIDB4PzAwID0gMTYgYml0IG5vZGVzDQorICogICAweDAxMCA9IDMyIGJpdCBub2Rlcw0KKyAq ICAgMHgxMTAgPSA2NCBiaXQgbm9kZXMNCisgKg0KKyAqICBTbG90IHNpemUgYW5kIGxvY2F0aW9u IGluIHRoZSBwYXJlbnQgcG9pbnRlcjoNCisgKiAgIHR5cGUgIDogc2xvdCBsb2NhdGlvbg0KKyAq ICAgMHg/PzEgOiBSb290DQorICogICAweD8wMCA6IDE2IGJpdCB2YWx1ZXMsIHR5cGUgaW4gMC0x LCBzbG90IGluIDItNg0KKyAqICAgMHgwMTAgOiAzMiBiaXQgdmFsdWVzLCB0eXBlIGluIDAtMiwg c2xvdCBpbiAzLTYNCisgKiAgIDB4MTEwIDogNjQgYml0IHZhbHVlcywgdHlwZSBpbiAwLTIsIHNs b3QgaW4gMy02DQorICovDQorDQorLyoNCisgKiBUaGlzIG1ldGFkYXRhIGlzIHVzZWQgdG8gb3B0 aW1pemUgdGhlIGdhcCB1cGRhdGluZyBjb2RlIGFuZCBpbiByZXZlcnNlDQorICogc2VhcmNoaW5n IGZvciBnYXBzIG9yIGFueSBvdGhlciBjb2RlIHRoYXQgbmVlZHMgdG8gZmluZCB0aGUgZW5kIG9m IHRoZSBkYXRhLg0KKyAqLw0KK3N0cnVjdCBtYXBsZV9tZXRhZGF0YSB7DQorCXVuc2lnbmVkIGNo YXIgZW5kOw0KKwl1bnNpZ25lZCBjaGFyIGdhcDsNCit9Ow0KKw0KKy8qDQorICogTGVhZiBub2Rl cyBkbyBub3Qgc3RvcmUgcG9pbnRlcnMgdG8gbm9kZXMsIHRoZXkgc3RvcmUgdXNlciBkYXRhLiAg VXNlcnMgbWF5DQorICogc3RvcmUgYWxtb3N0IGFueSBiaXQgcGF0dGVybi4gIEFzIG5vdGVkIGFi b3ZlLCB0aGUgb3B0aW1pc2F0aW9uIG9mIHN0b3JpbmcgYW4NCisgKiBlbnRyeSBhdCAwIGluIHRo ZSByb290IHBvaW50ZXIgY2Fubm90IGJlIGRvbmUgZm9yIGRhdGEgd2hpY2ggaGF2ZSB0aGUgYm90 dG9tDQorICogdHdvIGJpdHMgc2V0IHRvICcxMCcuICBXZSBhbHNvIHJlc2VydmUgdmFsdWVzIHdp dGggdGhlIGJvdHRvbSB0d28gYml0cyBzZXQgdG8NCisgKiAnMTAnIHdoaWNoIGFyZSBiZWxvdyA0 MDk2IChpZSAyLCA2LCAxMCAuLiA0MDk0KSBmb3IgaW50ZXJuYWwgdXNlLiAgU29tZSBBUElzDQor ICogcmV0dXJuIGVycm5vcyBhcyBhIG5lZ2F0aXZlIGVycm5vIHNoaWZ0ZWQgcmlnaHQgYnkgdHdv IGJpdHMgYW5kIHRoZSBib3R0b20NCisgKiB0d28gYml0cyBzZXQgdG8gJzEwJywgYW5kIHdoaWxl IGNob29zaW5nIHRvIHN0b3JlIHRoZXNlIHZhbHVlcyBpbiB0aGUgYXJyYXkNCisgKiBpcyBub3Qg YW4gZXJyb3IsIGl0IG1heSBsZWFkIHRvIGNvbmZ1c2lvbiBpZiB5b3UncmUgdGVzdGluZyBmb3Ig YW4gZXJyb3Igd2l0aA0KKyAqIG1hc19pc19lcnIoKS4NCisgKg0KKyAqIE5vbi1sZWFmIG5vZGVz IHN0b3JlIHRoZSB0eXBlIG9mIHRoZSBub2RlIHBvaW50ZWQgdG8gKGVudW0gbWFwbGVfdHlwZSBp biBiaXRzDQorICogMy02KSwgYml0IDIgaXMgcmVzZXJ2ZWQuICBUaGF0IGxlYXZlcyBiaXRzIDAt MSB1bnVzZWQgZm9yIG5vdy4NCisgKg0KKyAqIEluIHJlZ3VsYXIgQi1UcmVlIHRlcm1zLCBwaXZv dHMgYXJlIGNhbGxlZCBrZXlzLiAgVGhlIHRlcm0gcGl2b3QgaXMgdXNlZCB0bw0KKyAqIGluZGlj YXRlIHRoYXQgdGhlIHRyZWUgaXMgc3BlY2lmeWluZyByYW5nZXMsICBQaXZvdHMgbWF5IGFwcGVh ciBpbiB0aGUNCisgKiBzdWJ0cmVlIHdpdGggYW4gZW50cnkgYXR0YWNoZWQgdG8gdGhlIHZhbHVl IHdoZXJlYXMga2V5cyBhcmUgdW5pcXVlIHRvIGENCisgKiBzcGVjaWZpYyBwb3NpdGlvbiBvZiBh IEItdHJlZS4gIFBpdm90IHZhbHVlcyBhcmUgaW5jbHVzaXZlIG9mIHRoZSBzbG90IHdpdGgNCisg KiB0aGUgc2FtZSBpbmRleC4NCisgKi8NCisNCitzdHJ1Y3QgbWFwbGVfcmFuZ2VfNjQgew0KKwlz dHJ1Y3QgbWFwbGVfcG5vZGUgKnBhcmVudDsNCisJdW5zaWduZWQgbG9uZyBwaXZvdFtNQVBMRV9S QU5HRTY0X1NMT1RTIC0gMV07DQorCXVuaW9uIHsNCisJCXZvaWQgX19yY3UgKnNsb3RbTUFQTEVf UkFOR0U2NF9TTE9UU107DQorCQlzdHJ1Y3Qgew0KKwkJCXZvaWQgX19yY3UgKnBhZFtNQVBMRV9S QU5HRTY0X1NMT1RTIC0gMV07DQorCQkJc3RydWN0IG1hcGxlX21ldGFkYXRhIG1ldGE7DQorCQl9 Ow0KKwl9Ow0KK307DQorDQorLyoNCisgKiBBdCB0cmVlIGNyZWF0aW9uIHRpbWUsIHRoZSB1c2Vy IGNhbiBzcGVjaWZ5IHRoYXQgdGhleSdyZSB3aWxsaW5nIHRvIHRyYWRlIG9mZg0KKyAqIHN0b3Jp bmcgZmV3ZXIgZW50cmllcyBpbiBhIHRyZWUgaW4gcmV0dXJuIGZvciBzdG9yaW5nIG1vcmUgaW5m b3JtYXRpb24gaW4NCisgKiBlYWNoIG5vZGUuDQorICoNCisgKiBUaGUgbWFwbGUgdHJlZSBzdXBw b3J0cyByZWNvcmRpbmcgdGhlIGxhcmdlc3QgcmFuZ2Ugb2YgTlVMTCBlbnRyaWVzIGF2YWlsYWJs ZQ0KKyAqIGluIHRoaXMgbm9kZSwgYWxzbyBjYWxsZWQgZ2Fwcy4gIFRoaXMgb3B0aW1pc2VzIHRo ZSB0cmVlIGZvciBhbGxvY2F0aW5nIGENCisgKiByYW5nZS4NCisgKi8NCitzdHJ1Y3QgbWFwbGVf YXJhbmdlXzY0IHsNCisJc3RydWN0IG1hcGxlX3Bub2RlICpwYXJlbnQ7DQorCXVuc2lnbmVkIGxv bmcgcGl2b3RbTUFQTEVfQVJBTkdFNjRfU0xPVFMgLSAxXTsNCisJdm9pZCBfX3JjdSAqc2xvdFtN QVBMRV9BUkFOR0U2NF9TTE9UU107DQorCXVuc2lnbmVkIGxvbmcgZ2FwW01BUExFX0FSQU5HRTY0 X1NMT1RTXTsNCisJc3RydWN0IG1hcGxlX21ldGFkYXRhIG1ldGE7DQorfTsNCisNCitzdHJ1Y3Qg bWFwbGVfYWxsb2Mgew0KKwl1bnNpZ25lZCBsb25nIHRvdGFsOw0KKwl1bnNpZ25lZCBjaGFyIG5v ZGVfY291bnQ7DQorCXVuc2lnbmVkIGludCByZXF1ZXN0X2NvdW50Ow0KKwlzdHJ1Y3QgbWFwbGVf YWxsb2MgKnNsb3RbTUFQTEVfQUxMT0NfU0xPVFNdOw0KK307DQorDQorc3RydWN0IG1hcGxlX3Rv cGlhcnkgew0KKwlzdHJ1Y3QgbWFwbGVfcG5vZGUgKnBhcmVudDsNCisJc3RydWN0IG1hcGxlX2Vu b2RlICpuZXh0OyAvKiBPdmVybGFwcyB0aGUgcGl2b3QgKi8NCit9Ow0KKw0KK2VudW0gbWFwbGVf dHlwZSB7DQorCW1hcGxlX2RlbnNlLA0KKwltYXBsZV9sZWFmXzY0LA0KKwltYXBsZV9yYW5nZV82 NCwNCisJbWFwbGVfYXJhbmdlXzY0LA0KK307DQorDQorDQorLyoqDQorICogRE9DOiBNYXBsZSB0 cmVlIGZsYWdzDQorICoNCisgKiAqIE1UX0ZMQUdTX0FMTE9DX1JBTkdFCS0gVHJhY2sgZ2FwcyBp biB0aGlzIHRyZWUNCisgKiAqIE1UX0ZMQUdTX1VTRV9SQ1UJCS0gT3BlcmF0ZSBpbiBSQ1UgbW9k ZQ0KKyAqICogTVRfRkxBR1NfSEVJR0hUX09GRlNFVAktIFRoZSBwb3NpdGlvbiBvZiB0aGUgdHJl ZSBoZWlnaHQgaW4gdGhlIGZsYWdzDQorICogKiBNVF9GTEFHU19IRUlHSFRfTUFTSwktIFRoZSBt YXNrIGZvciB0aGUgbWFwbGUgdHJlZSBoZWlnaHQgdmFsdWUNCisgKiAqIE1UX0ZMQUdTX0xPQ0tf TUFTSwkJLSBIb3cgdGhlIG10X2xvY2sgaXMgdXNlZA0KKyAqICogTVRfRkxBR1NfTE9DS19JUlEJ CS0gQWNxdWlyZWQgaXJxLXNhZmUNCisgKiAqIE1UX0ZMQUdTX0xPQ0tfQkgJCS0gQWNxdWlyZWQg Ymgtc2FmZQ0KKyAqICogTVRfRkxBR1NfTE9DS19FWFRFUk4JLSBtdF9sb2NrIGlzIG5vdCB1c2Vk DQorICoNCisgKiBNQVBMRV9IRUlHSFRfTUFYCVRoZSBsYXJnZXN0IGhlaWdodCB0aGF0IGNhbiBi ZSBzdG9yZWQNCisgKi8NCisjZGVmaW5lIE1UX0ZMQUdTX0FMTE9DX1JBTkdFCTB4MDENCisjZGVm aW5lIE1UX0ZMQUdTX1VTRV9SQ1UJMHgwMg0KKyNkZWZpbmUgTVRfRkxBR1NfSEVJR0hUX09GRlNF VAkweDAyDQorI2RlZmluZSBNVF9GTEFHU19IRUlHSFRfTUFTSwkweDdDDQorI2RlZmluZSBNVF9G TEFHU19MT0NLX01BU0sJMHgzMDANCisjZGVmaW5lIE1UX0ZMQUdTX0xPQ0tfSVJRCTB4MTAwDQor I2RlZmluZSBNVF9GTEFHU19MT0NLX0JICTB4MjAwDQorI2RlZmluZSBNVF9GTEFHU19MT0NLX0VY VEVSTgkweDMwMA0KKw0KKyNkZWZpbmUgTUFQTEVfSEVJR0hUX01BWAkzMQ0KKw0KKw0KKyNkZWZp bmUgTUFQTEVfTk9ERV9UWVBFX01BU0sJMHgwRg0KKyNkZWZpbmUgTUFQTEVfTk9ERV9UWVBFX1NI SUZUCTB4MDMNCisNCisjZGVmaW5lIE1BUExFX1JFU0VSVkVEX1JBTkdFCTQwOTYNCisNCisjaWZk ZWYgQ09ORklHX0xPQ0tERVANCit0eXBlZGVmIHN0cnVjdCBsb2NrZGVwX21hcCAqbG9ja2RlcF9t YXBfcDsNCisjZGVmaW5lIG10X2xvY2tfaXNfaGVsZChtdCkJbG9ja19pc19oZWxkKG10LT5tYV9l eHRlcm5hbF9sb2NrKQ0KKyNkZWZpbmUgbXRfc2V0X2V4dGVybmFsX2xvY2sobXQsIGxvY2spCQkJ CQlcDQorCShtdCktPm1hX2V4dGVybmFsX2xvY2sgPSAmKGxvY2spLT5kZXBfbWFwDQorI2Vsc2UN Cit0eXBlZGVmIHN0cnVjdCB7IC8qIG5vdGhpbmcgKi8gfSBsb2NrZGVwX21hcF9wOw0KKyNkZWZp bmUgbXRfbG9ja19pc19oZWxkKG10KQkxDQorI2RlZmluZSBtdF9zZXRfZXh0ZXJuYWxfbG9jayht dCwgbG9jaykJZG8geyB9IHdoaWxlICgwKQ0KKyNlbmRpZg0KKw0KKy8qDQorICogSWYgdGhlIHRy ZWUgY29udGFpbnMgYSBzaW5nbGUgZW50cnkgYXQgaW5kZXggMCwgaXQgaXMgdXN1YWxseSBzdG9y ZWQgaW4NCisgKiB0cmVlLT5tYV9yb290LiAgVG8gb3B0aW1pc2UgZm9yIHRoZSBwYWdlIGNhY2hl LCBhbiBlbnRyeSB3aGljaCBlbmRzIGluICcwMCcsDQorICogJzAxJyBvciAnMTEnIGlzIHN0b3Jl ZCBpbiB0aGUgcm9vdCwgYnV0IGFuIGVudHJ5IHdoaWNoIGVuZHMgaW4gJzEwJyB3aWxsIGJlDQor ICogc3RvcmVkIGluIGEgbm9kZS4gIEJpdHMgMy02IGFyZSB1c2VkIHRvIHN0b3JlIGVudW0gbWFw bGVfdHlwZS4NCisgKg0KKyAqIFRoZSBmbGFncyBhcmUgdXNlZCBib3RoIHRvIHN0b3JlIHNvbWUg aW1tdXRhYmxlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdHJlZQ0KKyAqIChzZXQgYXQgdHJlZSBj cmVhdGlvbiB0aW1lKSBhbmQgZHluYW1pYyBpbmZvcm1hdGlvbiBzZXQgdW5kZXIgdGhlIHNwaW5s b2NrLg0KKyAqDQorICogQW5vdGhlciB1c2Ugb2YgZmxhZ3MgYXJlIHRvIGluZGljYXRlIGdsb2Jh bCBzdGF0ZXMgb2YgdGhlIHRyZWUuICBUaGlzIGlzIHRoZQ0KKyAqIGNhc2Ugd2l0aCB0aGUgTUFQ TEVfVVNFX1JDVSBmbGFnLCB3aGljaCBpbmRpY2F0ZXMgdGhlIHRyZWUgaXMgY3VycmVudGx5IGlu DQorICogUkNVIG1vZGUuICBUaGlzIG1vZGUgd2FzIGFkZGVkIHRvIGFsbG93IHRoZSB0cmVlIHRv IHJldXNlIG5vZGVzIGluc3RlYWQgb2YNCisgKiByZS1hbGxvY2F0aW5nIGFuZCBSQ1UgZnJlZWlu ZyBub2RlcyB3aGVuIHRoZXJlIGlzIGEgc2luZ2xlIHVzZXIuDQorICovDQorc3RydWN0IG1hcGxl X3RyZWUgew0KKwl1bmlvbiB7DQorCQlzcGlubG9ja190CW1hX2xvY2s7DQorCQlsb2NrZGVwX21h cF9wCW1hX2V4dGVybmFsX2xvY2s7DQorCX07DQorCXZvaWQgX19yY3UgICAgICAqbWFfcm9vdDsN CisJdW5zaWduZWQgaW50CW1hX2ZsYWdzOw0KK307DQorDQorLyoqDQorICogTVRSRUVfSU5JVCgp IC0gSW5pdGlhbGl6ZSBhIG1hcGxlIHRyZWUNCisgKiBAbmFtZTogVGhlIG1hcGxlIHRyZWUgbmFt ZQ0KKyAqIEBfX2ZsYWdzOiBUaGUgbWFwbGUgdHJlZSBmbGFncw0KKyAqDQorICovDQorI2RlZmlu ZSBNVFJFRV9JTklUKG5hbWUsIF9fZmxhZ3MpIHsJCQkJCVwNCisJLm1hX2xvY2sgPSBfX1NQSU5f TE9DS19VTkxPQ0tFRCgobmFtZSkubWFfbG9jayksCQlcDQorCS5tYV9mbGFncyA9IF9fZmxhZ3Ms CQkJCQkJXA0KKwkubWFfcm9vdCA9IE5VTEwsCQkJCQkJXA0KK30NCisNCisvKioNCisgKiBNVFJF RV9JTklUX0VYVCgpIC0gSW5pdGlhbGl6ZSBhIG1hcGxlIHRyZWUgd2l0aCBhbiBleHRlcm5hbCBs b2NrLg0KKyAqIEBuYW1lOiBUaGUgdHJlZSBuYW1lDQorICogQF9fZmxhZ3M6IFRoZSBtYXBsZSB0 cmVlIGZsYWdzDQorICogQF9fbG9jazogVGhlIGV4dGVybmFsIGxvY2sNCisgKi8NCisjaWZkZWYg Q09ORklHX0xPQ0tERVANCisjZGVmaW5lIE1UUkVFX0lOSVRfRVhUKG5hbWUsIF9fZmxhZ3MsIF9f bG9jaykgewkJCQlcDQorCS5tYV9leHRlcm5hbF9sb2NrID0gJihfX2xvY2spLmRlcF9tYXAsCQkJ CVwNCisJLm1hX2ZsYWdzID0gKF9fZmxhZ3MpLAkJCQkJCVwNCisJLm1hX3Jvb3QgPSBOVUxMLAkJ CQkJCVwNCit9DQorI2Vsc2UNCisjZGVmaW5lIE1UUkVFX0lOSVRfRVhUKG5hbWUsIF9fZmxhZ3Ms IF9fbG9jaykJTVRSRUVfSU5JVChuYW1lLCBfX2ZsYWdzKQ0KKyNlbmRpZg0KKw0KKyNkZWZpbmUg REVGSU5FX01UUkVFKG5hbWUpCQkJCQkJXA0KKwlzdHJ1Y3QgbWFwbGVfdHJlZSBuYW1lID0gTVRS RUVfSU5JVChuYW1lLCAwKQ0KKw0KKyNkZWZpbmUgbXRyZWVfbG9jayhtdCkJCXNwaW5fbG9jaygo JihtdCktPm1hX2xvY2spKQ0KKyNkZWZpbmUgbXRyZWVfdW5sb2NrKG10KQlzcGluX3VubG9jaygo JihtdCktPm1hX2xvY2spKQ0KKw0KKy8qDQorICogVGhlIE1hcGxlIFRyZWUgc3F1ZWV6ZXMgdmFy aW91cyBiaXRzIGluIGF0IHZhcmlvdXMgcG9pbnRzIHdoaWNoIGFyZW4ndA0KKyAqIG5lY2Vzc2Fy aWx5IG9idmlvdXMuICBVc3VhbGx5LCB0aGlzIGlzIGRvbmUgYnkgb2JzZXJ2aW5nIHRoYXQgcG9p bnRlcnMgYXJlDQorICogTi1ieXRlIGFsaWduZWQgYW5kIHRodXMgdGhlIGJvdHRvbSBsb2dfMihO KSBiaXRzIGFyZSBhdmFpbGFibGUgZm9yIHVzZS4gIFdlDQorICogZG9uJ3QgdXNlIHRoZSBoaWdo IGJpdHMgb2YgcG9pbnRlcnMgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBiZWNhdXNl DQorICogd2UgZG9uJ3Qga25vdyB3aGF0IGJpdHMgYXJlIHVudXNlZCBvbiBhbnkgZ2l2ZW4gYXJj aGl0ZWN0dXJlLg0KKyAqDQorICogTm9kZXMgYXJlIDI1NiBieXRlcyBpbiBzaXplIGFuZCBhcmUg YWxzbyBhbGlnbmVkIHRvIDI1NiBieXRlcywgZ2l2aW5nIHVzIDgNCisgKiBsb3cgYml0cyBmb3Ig b3VyIG93biBwdXJwb3Nlcy4gIE5vZGVzIGFyZSBjdXJyZW50bHkgb2YgNCB0eXBlczoNCisgKiAx LiBTaW5nbGUgcG9pbnRlciAoUmFuZ2UgaXMgMC0wKQ0KKyAqIDIuIE5vbi1sZWFmIEFsbG9jYXRp b24gUmFuZ2Ugbm9kZXMNCisgKiAzLiBOb24tbGVhZiBSYW5nZSBub2Rlcw0KKyAqIDQuIExlYWYg UmFuZ2Ugbm9kZXMgQWxsIG5vZGVzIGNvbnNpc3Qgb2YgYSBudW1iZXIgb2Ygbm9kZSBzbG90cywN CisgKiAgICBwaXZvdHMsIGFuZCBhIHBhcmVudCBwb2ludGVyLg0KKyAqLw0KKw0KK3N0cnVjdCBt YXBsZV9ub2RlIHsNCisJdW5pb24gew0KKwkJc3RydWN0IHsNCisJCQlzdHJ1Y3QgbWFwbGVfcG5v ZGUgKnBhcmVudDsNCisJCQl2b2lkIF9fcmN1ICpzbG90W01BUExFX05PREVfU0xPVFNdOw0KKwkJ fTsNCisJCXN0cnVjdCB7DQorCQkJdm9pZCAqcGFkOw0KKwkJCXN0cnVjdCByY3VfaGVhZCByY3U7 DQorCQkJc3RydWN0IG1hcGxlX2Vub2RlICpwaXZfcGFyZW50Ow0KKwkJCXVuc2lnbmVkIGNoYXIg cGFyZW50X3Nsb3Q7DQorCQkJZW51bSBtYXBsZV90eXBlIHR5cGU7DQorCQkJdW5zaWduZWQgY2hh ciBzbG90X2xlbjsNCisJCQl1bnNpZ25lZCBpbnQgbWFfZmxhZ3M7DQorCQl9Ow0KKwkJc3RydWN0 IG1hcGxlX3JhbmdlXzY0IG1yNjQ7DQorCQlzdHJ1Y3QgbWFwbGVfYXJhbmdlXzY0IG1hNjQ7DQor CQlzdHJ1Y3QgbWFwbGVfYWxsb2MgYWxsb2M7DQorCX07DQorfTsNCisNCisvKg0KKyAqIE1vcmUg Y29tcGxpY2F0ZWQgc3RvcmVzIGNhbiBjYXVzZSB0d28gbm9kZXMgdG8gYmVjb21lIG9uZSBvciB0 aHJlZSBhbmQNCisgKiBwb3RlbnRpYWxseSBhbHRlciB0aGUgaGVpZ2h0IG9mIHRoZSB0cmVlLiAg RWl0aGVyIGhhbGYgb2YgdGhlIHRyZWUgbWF5IG5lZWQNCisgKiB0byBiZSByZWJhbGFuY2VkIGFn YWluc3QgdGhlIG90aGVyLiAgVGhlIG1hX3RvcGlhcnkgc3RydWN0IGlzIHVzZWQgdG8gdHJhY2sN CisgKiB3aGljaCBub2RlcyBoYXZlIGJlZW4gJ2N1dCcgZnJvbSB0aGUgdHJlZSBzbyB0aGF0IHRo ZSBjaGFuZ2UgY2FuIGJlIGRvbmUNCisgKiBzYWZlbHkgYXQgYSBsYXRlciBkYXRlLiAgVGhpcyBp cyBkb25lIHRvIHN1cHBvcnQgUkNVLg0KKyAqLw0KK3N0cnVjdCBtYV90b3BpYXJ5IHsNCisJc3Ry dWN0IG1hcGxlX2Vub2RlICpoZWFkOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnRhaWw7DQorCXN0 cnVjdCBtYXBsZV90cmVlICptdHJlZTsNCit9Ow0KKw0KK3ZvaWQgKm10cmVlX2xvYWQoc3RydWN0 IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4KTsNCisNCitpbnQgbXRyZWVfaW5z ZXJ0KHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRleCwNCisJCXZvaWQg KmVudHJ5LCBnZnBfdCBnZnApOw0KK2ludCBtdHJlZV9pbnNlcnRfcmFuZ2Uoc3RydWN0IG1hcGxl X3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGZpcnN0LA0KKwkJdW5zaWduZWQgbG9uZyBsYXN0LCB2 b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKTsNCitpbnQgbXRyZWVfYWxsb2NfcmFuZ2Uoc3RydWN0IG1h cGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nICpzdGFydHAsDQorCQl2b2lkICplbnRyeSwgdW5z aWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIG1pbiwNCisJCXVuc2lnbmVkIGxvbmcgbWF4 LCBnZnBfdCBnZnApOw0KK2ludCBtdHJlZV9hbGxvY19ycmFuZ2Uoc3RydWN0IG1hcGxlX3RyZWUg Km10LCB1bnNpZ25lZCBsb25nICpzdGFydHAsDQorCQl2b2lkICplbnRyeSwgdW5zaWduZWQgbG9u ZyBzaXplLCB1bnNpZ25lZCBsb25nIG1pbiwNCisJCXVuc2lnbmVkIGxvbmcgbWF4LCBnZnBfdCBn ZnApOw0KKw0KK2ludCBtdHJlZV9zdG9yZV9yYW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVu c2lnbmVkIGxvbmcgZmlyc3QsDQorCQkgICAgICB1bnNpZ25lZCBsb25nIGxhc3QsIHZvaWQgKmVu dHJ5LCBnZnBfdCBnZnApOw0KK2ludCBtdHJlZV9zdG9yZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQs IHVuc2lnbmVkIGxvbmcgaW5kZXgsDQorCQl2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKTsNCit2b2lk ICptdHJlZV9lcmFzZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgaW5kZXgp Ow0KKw0KK3ZvaWQgbXRyZWVfZGVzdHJveShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpOw0KK3ZvaWQg X19tdF9kZXN0cm95KHN0cnVjdCBtYXBsZV90cmVlICptdCk7DQorDQorLyoqDQorICogbXRyZWVf ZW1wdHkoKSAtIERldGVybWluZSBpZiBhIHRyZWUgaGFzIGFueSBwcmVzZW50IGVudHJpZXMuDQor ICogQG10OiBNYXBsZSBUcmVlLg0KKyAqDQorICogQ29udGV4dDogQW55IGNvbnRleHQuDQorICog UmV0dXJuOiAldHJ1ZSBpZiB0aGUgdHJlZSBjb250YWlucyBvbmx5IE5VTEwgcG9pbnRlcnMuDQor ICovDQorc3RhdGljIGlubGluZSBib29sIG10cmVlX2VtcHR5KGNvbnN0IHN0cnVjdCBtYXBsZV90 cmVlICptdCkNCit7DQorCXJldHVybiBtdC0+bWFfcm9vdCA9PSBOVUxMOw0KK30NCisNCisvKiBB ZHZhbmNlZCBBUEkgKi8NCisNCisvKg0KKyAqIFRoZSBtYXBsZSBzdGF0ZSBpcyBkZWZpbmVkIGlu IHRoZSBzdHJ1Y3QgbWFfc3RhdGUgYW5kIGlzIHVzZWQgdG8ga2VlcCB0cmFjaw0KKyAqIG9mIGlu Zm9ybWF0aW9uIGR1cmluZyBvcGVyYXRpb25zLCBhbmQgZXZlbiBiZXR3ZWVuIG9wZXJhdGlvbnMg d2hlbiB1c2luZyB0aGUNCisgKiBhZHZhbmNlZCBBUEkuDQorICoNCisgKiBJZiBzdGF0ZS0+bm9k ZSBoYXMgYml0IDAgc2V0IHRoZW4gaXQgcmVmZXJlbmNlcyBhIHRyZWUgbG9jYXRpb24gd2hpY2gg aXMgbm90DQorICogYSBub2RlIChlZyB0aGUgcm9vdCkuICBJZiBiaXQgMSBpcyBzZXQsIHRoZSBy ZXN0IG9mIHRoZSBiaXRzIGFyZSBhIG5lZ2F0aXZlDQorICogZXJybm8uICBCaXQgMiAodGhlICd1 bmFsbG9jYXRlZCBzbG90cycgYml0KSBpcyBjbGVhci4gIEJpdHMgMy02IGluZGljYXRlIHRoZQ0K KyAqIG5vZGUgdHlwZS4NCisgKg0KKyAqIHN0YXRlLT5hbGxvYyBlaXRoZXIgaGFzIGEgcmVxdWVz dCBudW1iZXIgb2Ygbm9kZXMgb3IgYW4gYWxsb2NhdGVkIG5vZGUuICBJZg0KKyAqIHN0YXQtPmFs bG9jIGhhcyBhIHJlcXVlc3RlZCBudW1iZXIgb2Ygbm9kZXMsIHRoZSBmaXJzdCBiaXQgd2lsbCBi ZSBzZXQgKDB4MSkNCisgKiBhbmQgdGhlIHJlbWFpbmluZyBiaXRzIGFyZSB0aGUgdmFsdWUuICBJ ZiBzdGF0ZS0+YWxsb2MgaXMgYSBub2RlLCB0aGVuIHRoZQ0KKyAqIG5vZGUgd2lsbCBiZSBvZiB0 eXBlIG1hcGxlX2FsbG9jLiAgbWFwbGVfYWxsb2MgaGFzIE1BUExFX05PREVfU0xPVFMgLSAxIGZv cg0KKyAqIHN0b3JpbmcgbW9yZSBhbGxvY2F0ZWQgbm9kZXMsIGEgdG90YWwgbnVtYmVyIG9mIG5v ZGVzIGFsbG9jYXRlZCwgYW5kIHRoZQ0KKyAqIG5vZGVfY291bnQgaW4gdGhpcyBub2RlLiAgbm9k ZV9jb3VudCBpcyB0aGUgbnVtYmVyIG9mIGFsbG9jYXRlZCBub2RlcyBpbiB0aGlzDQorICogbm9k ZS4gIFRoZSBzY2FsaW5nIGJleW9uZCBNQVBMRV9OT0RFX1NMT1RTIC0gMSBpcyBoYW5kbGVkIGJ5 IHN0b3JpbmcgZnVydGhlcg0KKyAqIG5vZGVzIGludG8gc3RhdGUtPmFsbG9jLT5zbG90WzBdJ3Mg bm9kZS4gIE5vZGVzIGFyZSB0YWtlbiBmcm9tIHN0YXRlLT5hbGxvYw0KKyAqIGJ5IHJlbW92aW5n IGEgbm9kZSBmcm9tIHRoZSBzdGF0ZS0+YWxsb2Mgbm9kZSB1bnRpbCBzdGF0ZS0+YWxsb2MtPm5v ZGVfY291bnQNCisgKiBpcyAxLCB3aGVuIHN0YXRlLT5hbGxvYyBpcyByZXR1cm5lZCBhbmQgdGhl IHN0YXRlLT5hbGxvYy0+c2xvdFswXSBpcyBwcm9tb3RlZA0KKyAqIHRvIHN0YXRlLT5hbGxvYy4g IE5vZGVzIGFyZSBwdXNoZWQgb250byBzdGF0ZS0+YWxsb2MgYnkgcHV0dGluZyB0aGUgY3VycmVu dA0KKyAqIHN0YXRlLT5hbGxvYyBpbnRvIHRoZSBwdXNoZWQgbm9kZSdzIHNsb3RbMF0uDQorICoN CisgKiBUaGUgc3RhdGUgYWxzbyBjb250YWlucyB0aGUgaW1wbGllZCBtaW4vbWF4IG9mIHRoZSBz dGF0ZS0+bm9kZSwgdGhlIGRlcHRoIG9mDQorICogdGhpcyBzZWFyY2gsIGFuZCB0aGUgb2Zmc2V0 LiBUaGUgaW1wbGllZCBtaW4vbWF4IGFyZSBlaXRoZXIgZnJvbSB0aGUgcGFyZW50DQorICogbm9k ZSBvciBhcmUgMC1vbyBmb3IgdGhlIHJvb3Qgbm9kZS4gIFRoZSBkZXB0aCBpcyBpbmNyZW1lbnRl ZCBvciBkZWNyZW1lbnRlZA0KKyAqIGV2ZXJ5IHRpbWUgYSBub2RlIGlzIHdhbGtlZCBkb3duIG9y IHVwLiAgVGhlIG9mZnNldCBpcyB0aGUgc2xvdC9waXZvdCBvZg0KKyAqIGludGVyZXN0IGluIHRo ZSBub2RlIC0gZWl0aGVyIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuDQorICoNCisgKiBXaGVuIHJl dHVybmluZyBhIHZhbHVlIHRoZSBtYXBsZSBzdGF0ZSBpbmRleCBhbmQgbGFzdCByZXNwZWN0aXZl bHkgY29udGFpbg0KKyAqIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSByYW5nZSBmb3IgdGhlIGVu dHJ5LiAgUmFuZ2VzIGFyZSBpbmNsdXNpdmUgaW4gdGhlDQorICogTWFwbGUgVHJlZS4NCisgKi8N CitzdHJ1Y3QgbWFfc3RhdGUgew0KKwlzdHJ1Y3QgbWFwbGVfdHJlZSAqdHJlZTsJLyogVGhlIHRy ZWUgd2UncmUgb3BlcmF0aW5nIGluICovDQorCXVuc2lnbmVkIGxvbmcgaW5kZXg7CQkvKiBUaGUg aW5kZXggd2UncmUgb3BlcmF0aW5nIG9uIC0gcmFuZ2Ugc3RhcnQgKi8NCisJdW5zaWduZWQgbG9u ZyBsYXN0OwkJLyogVGhlIGxhc3QgaW5kZXggd2UncmUgb3BlcmF0aW5nIG9uIC0gcmFuZ2UgZW5k ICovDQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbm9kZTsJLyogVGhlIG5vZGUgY29udGFpbmluZyB0 aGlzIGVudHJ5ICovDQorCXVuc2lnbmVkIGxvbmcgbWluOwkJLyogVGhlIG1pbmltdW0gaW5kZXgg b2YgdGhpcyBub2RlIC0gaW1wbGllZCBwaXZvdCBtaW4gKi8NCisJdW5zaWduZWQgbG9uZyBtYXg7 CQkvKiBUaGUgbWF4aW11bSBpbmRleCBvZiB0aGlzIG5vZGUgLSBpbXBsaWVkIHBpdm90IG1heCAq Lw0KKwlzdHJ1Y3QgbWFwbGVfYWxsb2MgKmFsbG9jOwkvKiBBbGxvY2F0ZWQgbm9kZXMgZm9yIHRo aXMgb3BlcmF0aW9uICovDQorCXVuc2lnbmVkIGNoYXIgZGVwdGg7CQkvKiBkZXB0aCBvZiB0cmVl IGRlc2NlbnQgZHVyaW5nIHdyaXRlICovDQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwl1bnNp Z25lZCBjaGFyIG1hc19mbGFnczsNCit9Ow0KKw0KK3N0cnVjdCBtYV93cl9zdGF0ZSB7DQorCXN0 cnVjdCBtYV9zdGF0ZSAqbWFzOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsJLyogRGVjb2Rl ZCBtYXMtPm5vZGUgKi8NCisJdW5zaWduZWQgbG9uZyByX21pbjsJCS8qIHJhbmdlIG1pbiAqLw0K Kwl1bnNpZ25lZCBsb25nIHJfbWF4OwkJLyogcmFuZ2UgbWF4ICovDQorCWVudW0gbWFwbGVfdHlw ZSB0eXBlOwkJLyogbWFzLT5ub2RlIHR5cGUgKi8NCisJdW5zaWduZWQgY2hhciBvZmZzZXRfZW5k OwkvKiBUaGUgb2Zmc2V0IHdoZXJlIHRoZSB3cml0ZSBlbmRzICovDQorCXVuc2lnbmVkIGNoYXIg bm9kZV9lbmQ7CQkvKiBtYXMtPm5vZGUgZW5kICovDQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsJ CS8qIG1hcy0+bm9kZS0+cGl2b3RzIHBvaW50ZXIgKi8NCisJdW5zaWduZWQgbG9uZyBlbmRfcGl2 OwkJLyogVGhlIHBpdm90IGF0IHRoZSBvZmZzZXQgZW5kICovDQorCXZvaWQgX19yY3UgKipzbG90 czsJCS8qIG1hcy0+bm9kZS0+c2xvdHMgcG9pbnRlciAqLw0KKwl2b2lkICplbnRyeTsJCQkvKiBU aGUgZW50cnkgdG8gd3JpdGUgKi8NCisJdm9pZCAqY29udGVudDsJCQkvKiBUaGUgZXhpc3Rpbmcg ZW50cnkgdGhhdCBpcyBiZWluZyBvdmVyd3JpdHRlbiAqLw0KK307DQorDQorI2RlZmluZSBtYXNf bG9jayhtYXMpICAgICAgICAgICBzcGluX2xvY2soJigobWFzKS0+dHJlZS0+bWFfbG9jaykpDQor I2RlZmluZSBtYXNfdW5sb2NrKG1hcykgICAgICAgICBzcGluX3VubG9jaygmKChtYXMpLT50cmVl LT5tYV9sb2NrKSkNCisNCisNCisvKg0KKyAqIFNwZWNpYWwgdmFsdWVzIGZvciBtYV9zdGF0ZS5u b2RlLg0KKyAqIE1BU19TVEFSVCBtZWFucyB3ZSBoYXZlIG5vdCBzZWFyY2hlZCB0aGUgdHJlZS4N CisgKiBNQVNfUk9PVCBtZWFucyB3ZSBoYXZlIHNlYXJjaGVkIHRoZSB0cmVlIGFuZCB0aGUgZW50 cnkgd2UgZm91bmQgbGl2ZXMgaW4NCisgKiB0aGUgcm9vdCBvZiB0aGUgdHJlZSAoaWUgaXQgaGFz IGluZGV4IDAsIGxlbmd0aCAxIGFuZCBpcyB0aGUgb25seSBlbnRyeSBpbg0KKyAqIHRoZSB0cmVl KS4NCisgKiBNQVNfTk9ORSBtZWFucyB3ZSBoYXZlIHNlYXJjaGVkIHRoZSB0cmVlIGFuZCB0aGVy ZSBpcyBubyBub2RlIGluIHRoZQ0KKyAqIHRyZWUgZm9yIHRoaXMgZW50cnkuICBGb3IgZXhhbXBs ZSwgd2Ugc2VhcmNoZWQgZm9yIGluZGV4IDEgaW4gYW4gZW1wdHkNCisgKiB0cmVlLiAgT3Igd2Ug aGF2ZSBhIHRyZWUgd2hpY2ggcG9pbnRzIHRvIGEgZnVsbCBsZWFmIG5vZGUgYW5kIHdlDQorICog c2VhcmNoZWQgZm9yIGFuIGVudHJ5IHdoaWNoIGlzIGxhcmdlciB0aGFuIGNhbiBiZSBjb250YWlu ZWQgaW4gdGhhdA0KKyAqIGxlYWYgbm9kZS4NCisgKiBNQV9FUlJPUiByZXByZXNlbnRzIGFuIGVy cm5vLiAgQWZ0ZXIgZHJvcHBpbmcgdGhlIGxvY2sgYW5kIGF0dGVtcHRpbmcNCisgKiB0byByZXNv bHZlIHRoZSBlcnJvciwgdGhlIHdhbGsgd291bGQgaGF2ZSB0byBiZSByZXN0YXJ0ZWQgZnJvbSB0 aGUNCisgKiB0b3Agb2YgdGhlIHRyZWUgYXMgdGhlIHRyZWUgbWF5IGhhdmUgYmVlbiBtb2RpZmll ZC4NCisgKi8NCisjZGVmaW5lIE1BU19TVEFSVAkoKHN0cnVjdCBtYXBsZV9lbm9kZSAqKTFVTCkN CisjZGVmaW5lIE1BU19ST09UCSgoc3RydWN0IG1hcGxlX2Vub2RlICopNVVMKQ0KKyNkZWZpbmUg TUFTX05PTkUJKChzdHJ1Y3QgbWFwbGVfZW5vZGUgKik5VUwpDQorI2RlZmluZSBNQVNfUEFVU0UJ KChzdHJ1Y3QgbWFwbGVfZW5vZGUgKikxN1VMKQ0KKyNkZWZpbmUgTUFfRVJST1IoZXJyKSBcDQor CQkoKHN0cnVjdCBtYXBsZV9lbm9kZSAqKSgoKHVuc2lnbmVkIGxvbmcpZXJyIDw8IDIpIHwgMlVM KSkNCisNCisjZGVmaW5lIE1BX1NUQVRFKG5hbWUsIG10LCBmaXJzdCwgZW5kKQkJCQkJXA0KKwlz dHJ1Y3QgbWFfc3RhdGUgbmFtZSA9IHsJCQkJCVwNCisJCS50cmVlID0gbXQsCQkJCQkJXA0KKwkJ LmluZGV4ID0gZmlyc3QsCQkJCQkJXA0KKwkJLmxhc3QgPSBlbmQsCQkJCQkJXA0KKwkJLm5vZGUg PSBNQVNfU1RBUlQsCQkJCQlcDQorCQkubWluID0gMCwJCQkJCQlcDQorCQkubWF4ID0gVUxPTkdf TUFYLAkJCQkJXA0KKwkJLmFsbG9jID0gTlVMTCwJCQkJCQlcDQorCX0NCisNCisjZGVmaW5lIE1B X1dSX1NUQVRFKG5hbWUsIG1hX3N0YXRlLCB3cl9lbnRyeSkJCQkJXA0KKwlzdHJ1Y3QgbWFfd3Jf c3RhdGUgbmFtZSA9IHsJCQkJCVwNCisJCS5tYXMgPSBtYV9zdGF0ZSwJCQkJCVwNCisJCS5jb250 ZW50ID0gTlVMTCwJCQkJCVwNCisJCS5lbnRyeSA9IHdyX2VudHJ5LAkJCQkJXA0KKwl9DQorDQor I2RlZmluZSBNQV9UT1BJQVJZKG5hbWUsIHRyZWUpCQkJCQkJXA0KKwlzdHJ1Y3QgbWFfdG9waWFy eSBuYW1lID0gewkJCQkJXA0KKwkJLmhlYWQgPSBOVUxMLAkJCQkJCVwNCisJCS50YWlsID0gTlVM TCwJCQkJCQlcDQorCQkubXRyZWUgPSB0cmVlLAkJCQkJCVwNCisJfQ0KKw0KK3ZvaWQgKm1hc193 YWxrKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKTsNCit2b2lkICptYXNfc3RvcmUoc3RydWN0IG1hX3N0 YXRlICptYXMsIHZvaWQgKmVudHJ5KTsNCit2b2lkICptYXNfZXJhc2Uoc3RydWN0IG1hX3N0YXRl ICptYXMpOw0KK2ludCBtYXNfc3RvcmVfZ2ZwKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICpl bnRyeSwgZ2ZwX3QgZ2ZwKTsNCit2b2lkIG1hc19zdG9yZV9wcmVhbGxvYyhzdHJ1Y3QgbWFfc3Rh dGUgKm1hcywgdm9pZCAqZW50cnkpOw0KK3ZvaWQgKm1hc19maW5kKHN0cnVjdCBtYV9zdGF0ZSAq bWFzLCB1bnNpZ25lZCBsb25nIG1heCk7DQordm9pZCAqbWFzX2ZpbmRfcmV2KHN0cnVjdCBtYV9z dGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbik7DQoraW50IG1hc19wcmVhbGxvY2F0ZShzdHJ1 Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnksIGdmcF90IGdmcCk7DQorYm9vbCBtYXNfaXNf ZXJyKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKTsNCisNCitib29sIG1hc19ub21lbShzdHJ1Y3QgbWFf c3RhdGUgKm1hcywgZ2ZwX3QgZ2ZwKTsNCit2b2lkIG1hc19wYXVzZShzdHJ1Y3QgbWFfc3RhdGUg Km1hcyk7DQordm9pZCBtYXBsZV90cmVlX2luaXQodm9pZCk7DQordm9pZCBtYXNfZGVzdHJveShz dHJ1Y3QgbWFfc3RhdGUgKm1hcyk7DQoraW50IG1hc19leHBlY3RlZF9lbnRyaWVzKHN0cnVjdCBt YV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG5yX2VudHJpZXMpOw0KKw0KK3ZvaWQgKm1hc19w cmV2KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbik7DQordm9pZCAqbWFz X25leHQoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWF4KTsNCisNCitpbnQg bWFzX2VtcHR5X2FyZWEoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluLCB1 bnNpZ25lZCBsb25nIG1heCwNCisJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7DQorDQorLyogQ2hl Y2tzIGlmIGEgbWFzIGhhcyBub3QgZm91bmQgYW55dGhpbmcgKi8NCitzdGF0aWMgaW5saW5lIGJv b2wgbWFzX2lzX25vbmUoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gbWFzLT5u b2RlID09IE1BU19OT05FOw0KK30NCisNCisvKiBDaGVja3MgaWYgYSBtYXMgaGFzIGJlZW4gcGF1 c2VkICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19pc19wYXVzZWQoc3RydWN0IG1hX3N0YXRl ICptYXMpDQorew0KKwlyZXR1cm4gbWFzLT5ub2RlID09IE1BU19QQVVTRTsNCit9DQorDQordm9p ZCBtYXNfZHVwX3RyZWUoc3RydWN0IG1hX3N0YXRlICpvbGRtYXMsIHN0cnVjdCBtYV9zdGF0ZSAq bWFzKTsNCit2b2lkIG1hc19kdXBfc3RvcmUoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVu dHJ5KTsNCisNCisvKg0KKyAqIFRoaXMgZmluZHMgYW4gZW1wdHkgYXJlYSBmcm9tIHRoZSBoaWdo ZXN0IGFkZHJlc3MgdG8gdGhlIGxvd2VzdC4NCisgKiBBS0EgIlRvcGRvd24iIHZlcnNpb24sDQor ICovDQoraW50IG1hc19lbXB0eV9hcmVhX3JldihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWdu ZWQgbG9uZyBtaW4sDQorCQkgICAgICAgdW5zaWduZWQgbG9uZyBtYXgsIHVuc2lnbmVkIGxvbmcg c2l6ZSk7DQorLyoqDQorICogbWFzX3Jlc2V0KCkgLSBSZXNldCBhIE1hcGxlIFRyZWUgb3BlcmF0 aW9uIHN0YXRlLg0KKyAqIEBtYXM6IE1hcGxlIFRyZWUgb3BlcmF0aW9uIHN0YXRlLg0KKyAqDQor ICogUmVzZXRzIHRoZSBlcnJvciBvciB3YWxrIHN0YXRlIG9mIHRoZSBAbWFzIHNvIGZ1dHVyZSB3 YWxrcyBvZiB0aGUNCisgKiBhcnJheSB3aWxsIHN0YXJ0IGZyb20gdGhlIHJvb3QuICBVc2UgdGhp cyBpZiB5b3UgaGF2ZSBkcm9wcGVkIHRoZQ0KKyAqIGxvY2sgYW5kIHdhbnQgdG8gcmV1c2UgdGhl IG1hX3N0YXRlLg0KKyAqDQorICogQ29udGV4dDogQW55IGNvbnRleHQuDQorICovDQorc3RhdGlj IGlubGluZSB2b2lkIG1hc19yZXNldChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCW1hcy0+ bm9kZSA9IE1BU19TVEFSVDsNCit9DQorDQorLyoqDQorICogbWFzX2Zvcl9lYWNoKCkgLSBJdGVy YXRlIG92ZXIgYSByYW5nZSBvZiB0aGUgbWFwbGUgdHJlZS4NCisgKiBAX19tYXM6IE1hcGxlIFRy ZWUgb3BlcmF0aW9uIHN0YXRlIChtYXBsZV9zdGF0ZSkNCisgKiBAX19lbnRyeTogRW50cnkgcmV0 cmlldmVkIGZyb20gdGhlIHRyZWUNCisgKiBAX19tYXg6IG1heGltdW0gaW5kZXggdG8gcmV0cmll dmUgZnJvbSB0aGUgdHJlZQ0KKyAqDQorICogV2hlbiByZXR1cm5lZCwgbWFzLT5pbmRleCBhbmQg bWFzLT5sYXN0IHdpbGwgaG9sZCB0aGUgZW50aXJlIHJhbmdlIGZvciB0aGUNCisgKiBlbnRyeS4N CisgKg0KKyAqIE5vdGU6IG1heSByZXR1cm4gdGhlIHplcm8gZW50cnkuDQorICoNCisgKi8NCisj ZGVmaW5lIG1hc19mb3JfZWFjaChfX21hcywgX19lbnRyeSwgX19tYXgpIFwNCisJd2hpbGUgKCgo X19lbnRyeSkgPSBtYXNfZmluZCgoX19tYXMpLCAoX19tYXgpKSkgIT0gTlVMTCkNCisNCisNCisv KioNCisgKiBtYXNfc2V0X3JhbmdlKCkgLSBTZXQgdXAgTWFwbGUgVHJlZSBvcGVyYXRpb24gc3Rh dGUgZm9yIGEgZGlmZmVyZW50IGluZGV4Lg0KKyAqIEBtYXM6IE1hcGxlIFRyZWUgb3BlcmF0aW9u IHN0YXRlLg0KKyAqIEBzdGFydDogTmV3IHN0YXJ0IG9mIHJhbmdlIGluIHRoZSBNYXBsZSBUcmVl Lg0KKyAqIEBsYXN0OiBOZXcgZW5kIG9mIHJhbmdlIGluIHRoZSBNYXBsZSBUcmVlLg0KKyAqDQor ICogTW92ZSB0aGUgb3BlcmF0aW9uIHN0YXRlIHRvIHJlZmVyIHRvIGEgZGlmZmVyZW50IHJhbmdl LiAgVGhpcyB3aWxsDQorICogaGF2ZSB0aGUgZWZmZWN0IG9mIHN0YXJ0aW5nIGEgd2FsayBmcm9t IHRoZSB0b3A7IHNlZSBtYXNfbmV4dCgpDQorICogdG8gbW92ZSB0byBhbiBhZGphY2VudCBpbmRl eC4NCisgKi8NCitzdGF0aWMgaW5saW5lDQordm9pZCBtYXNfc2V0X3JhbmdlKHN0cnVjdCBtYV9z dGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxhc3QpDQorew0K KwkgICAgICAgbWFzLT5pbmRleCA9IHN0YXJ0Ow0KKwkgICAgICAgbWFzLT5sYXN0ID0gbGFzdDsN CisJICAgICAgIG1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCit9DQorDQorLyoqDQorICogbWFzX3Nl dCgpIC0gU2V0IHVwIE1hcGxlIFRyZWUgb3BlcmF0aW9uIHN0YXRlIGZvciBhIGRpZmZlcmVudCBp bmRleC4NCisgKiBAbWFzOiBNYXBsZSBUcmVlIG9wZXJhdGlvbiBzdGF0ZS4NCisgKiBAaW5kZXg6 IE5ldyBpbmRleCBpbnRvIHRoZSBNYXBsZSBUcmVlLg0KKyAqDQorICogTW92ZSB0aGUgb3BlcmF0 aW9uIHN0YXRlIHRvIHJlZmVyIHRvIGEgZGlmZmVyZW50IGluZGV4LiAgVGhpcyB3aWxsDQorICog aGF2ZSB0aGUgZWZmZWN0IG9mIHN0YXJ0aW5nIGEgd2FsayBmcm9tIHRoZSB0b3A7IHNlZSBtYXNf bmV4dCgpDQorICogdG8gbW92ZSB0byBhbiBhZGphY2VudCBpbmRleC4NCisgKi8NCitzdGF0aWMg aW5saW5lIHZvaWQgbWFzX3NldChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBp bmRleCkNCit7DQorDQorCW1hc19zZXRfcmFuZ2UobWFzLCBpbmRleCwgaW5kZXgpOw0KK30NCisN CitzdGF0aWMgaW5saW5lIGJvb2wgbXRfZXh0ZXJuYWxfbG9jayhjb25zdCBzdHJ1Y3QgbWFwbGVf dHJlZSAqbXQpDQorew0KKwlyZXR1cm4gKG10LT5tYV9mbGFncyAmIE1UX0ZMQUdTX0xPQ0tfTUFT SykgPT0gTVRfRkxBR1NfTE9DS19FWFRFUk47DQorfQ0KKw0KKy8qKg0KKyAqIG10X2luaXRfZmxh Z3MoKSAtIEluaXRpYWxpc2UgYW4gZW1wdHkgbWFwbGUgdHJlZSB3aXRoIGZsYWdzLg0KKyAqIEBt dDogTWFwbGUgVHJlZQ0KKyAqIEBmbGFnczogbWFwbGUgdHJlZSBmbGFncy4NCisgKg0KKyAqIElm IHlvdSBuZWVkIHRvIGluaXRpYWxpc2UgYSBNYXBsZSBUcmVlIHdpdGggc3BlY2lhbCBmbGFncyAo ZWcsIGFuDQorICogYWxsb2NhdGlvbiB0cmVlKSwgdXNlIHRoaXMgZnVuY3Rpb24uDQorICoNCisg KiBDb250ZXh0OiBBbnkgY29udGV4dC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRfaW5p dF9mbGFncyhzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGludCBmbGFncykNCit7DQor CW10LT5tYV9mbGFncyA9IGZsYWdzOw0KKwlpZiAoIW10X2V4dGVybmFsX2xvY2sobXQpKQ0KKwkJ c3Bpbl9sb2NrX2luaXQoJm10LT5tYV9sb2NrKTsNCisJcmN1X2Fzc2lnbl9wb2ludGVyKG10LT5t YV9yb290LCBOVUxMKTsNCit9DQorDQorLyoqDQorICogbXRfaW5pdCgpIC0gSW5pdGlhbGlzZSBh biBlbXB0eSBtYXBsZSB0cmVlLg0KKyAqIEBtdDogTWFwbGUgVHJlZQ0KKyAqDQorICogQW4gZW1w dHkgTWFwbGUgVHJlZS4NCisgKg0KKyAqIENvbnRleHQ6IEFueSBjb250ZXh0Lg0KKyAqLw0KK3N0 YXRpYyBpbmxpbmUgdm9pZCBtdF9pbml0KHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCW10 X2luaXRfZmxhZ3MobXQsIDApOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbXRfaW5fcmN1 KHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorI2lmZGVmIENPTkZJR19NQVBMRV9SQ1VfRElT QUJMRUQNCisJcmV0dXJuIGZhbHNlOw0KKyNlbmRpZg0KKwlyZXR1cm4gbXQtPm1hX2ZsYWdzICYg TVRfRkxBR1NfVVNFX1JDVTsNCit9DQorDQorLyoqDQorICogbXRfY2xlYXJfaW5fcmN1KCkgLSBT d2l0Y2ggdGhlIHRyZWUgdG8gbm9uLVJDVSBtb2RlLg0KKyAqIEBtdDogVGhlIE1hcGxlIFRyZWUN CisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRfY2xlYXJfaW5fcmN1KHN0cnVjdCBtYXBsZV90 cmVlICptdCkNCit7DQorCWlmICghbXRfaW5fcmN1KG10KSkNCisJCXJldHVybjsNCisNCisJaWYg KG10X2V4dGVybmFsX2xvY2sobXQpKSB7DQorCQlCVUdfT04oIW10X2xvY2tfaXNfaGVsZChtdCkp Ow0KKwkJbXQtPm1hX2ZsYWdzICY9IH5NVF9GTEFHU19VU0VfUkNVOw0KKwl9IGVsc2Ugew0KKwkJ bXRyZWVfbG9jayhtdCk7DQorCQltdC0+bWFfZmxhZ3MgJj0gfk1UX0ZMQUdTX1VTRV9SQ1U7DQor CQltdHJlZV91bmxvY2sobXQpOw0KKwl9DQorfQ0KKw0KKy8qKg0KKyAqIG10X3NldF9pbl9yY3Uo KSAtIFN3aXRjaCB0aGUgdHJlZSB0byBSQ1Ugc2FmZSBtb2RlLg0KKyAqIEBtdDogVGhlIE1hcGxl IFRyZWUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRfc2V0X2luX3JjdShzdHJ1Y3QgbWFw bGVfdHJlZSAqbXQpDQorew0KKwlpZiAobXRfaW5fcmN1KG10KSkNCisJCXJldHVybjsNCisNCisJ aWYgKG10X2V4dGVybmFsX2xvY2sobXQpKSB7DQorCQlCVUdfT04oIW10X2xvY2tfaXNfaGVsZCht dCkpOw0KKwkJbXQtPm1hX2ZsYWdzIHw9IE1UX0ZMQUdTX1VTRV9SQ1U7DQorCX0gZWxzZSB7DQor CQltdHJlZV9sb2NrKG10KTsNCisJCW10LT5tYV9mbGFncyB8PSBNVF9GTEFHU19VU0VfUkNVOw0K KwkJbXRyZWVfdW5sb2NrKG10KTsNCisJfQ0KK30NCisNCit2b2lkICptdF9maW5kKHN0cnVjdCBt YXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyAqaW5kZXgsIHVuc2lnbmVkIGxvbmcgbWF4KTsN Cit2b2lkICptdF9maW5kX2FmdGVyKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9u ZyAqaW5kZXgsDQorCQkgICAgdW5zaWduZWQgbG9uZyBtYXgpOw0KK3ZvaWQgKm10X3ByZXYoc3Ry dWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4LCAgdW5zaWduZWQgbG9uZyBt aW4pOw0KK3ZvaWQgKm10X25leHQoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25n IGluZGV4LCB1bnNpZ25lZCBsb25nIG1heCk7DQorDQorLyoqDQorICogbXRfZm9yX2VhY2ggLSBJ dGVyYXRlIG92ZXIgZWFjaCBlbnRyeSBzdGFydGluZyBhdCBpbmRleCB1bnRpbCBtYXguDQorICog QF9fdHJlZTogVGhlIE1hcGxlIFRyZWUNCisgKiBAX19lbnRyeTogVGhlIGN1cnJlbnQgZW50cnkN CisgKiBAX19pbmRleDogVGhlIGluZGV4IHRvIHVwZGF0ZSB0byB0cmFjayB0aGUgbG9jYXRpb24g aW4gdGhlIHRyZWUNCisgKiBAX19tYXg6IFRoZSBtYXhpbXVtIGxpbWl0IGZvciBAaW5kZXgNCisg Kg0KKyAqIE5vdGU6IFdpbGwgbm90IHJldHVybiB0aGUgemVybyBlbnRyeS4NCisgKi8NCisjZGVm aW5lIG10X2Zvcl9lYWNoKF9fdHJlZSwgX19lbnRyeSwgX19pbmRleCwgX19tYXgpIFwNCisJZm9y IChfX2VudHJ5ID0gbXRfZmluZChfX3RyZWUsICYoX19pbmRleCksIF9fbWF4KTsgXA0KKwkJX19l bnRyeTsgX19lbnRyeSA9IG10X2ZpbmRfYWZ0ZXIoX190cmVlLCAmKF9faW5kZXgpLCBfX21heCkp DQorDQorDQorI2lmZGVmIENPTkZJR19ERUJVR19NQVBMRV9UUkVFDQorZXh0ZXJuIGF0b21pY190 IG1hcGxlX3RyZWVfdGVzdHNfcnVuOw0KK2V4dGVybiBhdG9taWNfdCBtYXBsZV90cmVlX3Rlc3Rz X3Bhc3NlZDsNCisNCit2b2lkIG10X2R1bXAoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10KTsN Cit2b2lkIG10X3ZhbGlkYXRlKHN0cnVjdCBtYXBsZV90cmVlICptdCk7DQorI2RlZmluZSBNVF9C VUdfT04oX190cmVlLCBfX3gpIGRvIHsJCQkJCVwNCisJYXRvbWljX2luYygmbWFwbGVfdHJlZV90 ZXN0c19ydW4pOwkJCQlcDQorCWlmIChfX3gpIHsJCQkJCQkJXA0KKwkJcHJfaW5mbygiQlVHIGF0 ICVzOiVkICgldSlcbiIsCQkJCVwNCisJCV9fZnVuY19fLCBfX0xJTkVfXywgX194KTsJCQkJXA0K KwkJbXRfZHVtcChfX3RyZWUpOwkJCQkJXA0KKwkJcHJfaW5mbygiUGFzczogJXUgUnVuOiV1XG4i LAkJCQlcDQorCQkJYXRvbWljX3JlYWQoJm1hcGxlX3RyZWVfdGVzdHNfcGFzc2VkKSwJCVwNCisJ CQlhdG9taWNfcmVhZCgmbWFwbGVfdHJlZV90ZXN0c19ydW4pKTsJCVwNCisJCWR1bXBfc3RhY2so KTsJCQkJCQlcDQorCX0gZWxzZSB7CQkJCQkJCVwNCisJCWF0b21pY19pbmMoJm1hcGxlX3RyZWVf dGVzdHNfcGFzc2VkKTsJCQlcDQorCX0JCQkJCQkJCVwNCit9IHdoaWxlICgwKQ0KKyNlbHNlDQor I2RlZmluZSBNVF9CVUdfT04oX190cmVlLCBfX3gpIEJVR19PTihfX3gpDQorI2VuZGlmIC8qIENP TkZJR19ERUJVR19NQVBMRV9UUkVFICovDQorDQorI2VuZGlmIC8qX0xJTlVYX01BUExFX1RSRUVf SCAqLw0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaCBiL2lu Y2x1ZGUvdHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaA0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmlu ZGV4IDAwMDAwMDAwMDAwMC4uMmJlNDAzYmRjMmJkDQotLS0gL2Rldi9udWxsDQorKysgYi9pbmNs dWRlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmgNCkBAIC0wLDAgKzEsMTIzIEBADQorLyogU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8NCisjdW5kZWYgVFJBQ0VfU1lTVEVNDQor I2RlZmluZSBUUkFDRV9TWVNURU0gbWFwbGVfdHJlZQ0KKw0KKyNpZiAhZGVmaW5lZChfVFJBQ0Vf TU1fSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkNCisjZGVmaW5lIF9UUkFD RV9NTV9IDQorDQorDQorI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4NCisNCitzdHJ1Y3Qg bWFfc3RhdGU7DQorDQorVFJBQ0VfRVZFTlQobWFfb3AsDQorDQorCVRQX1BST1RPKGNvbnN0IGNo YXIgKmZuLCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcyksDQorDQorCVRQX0FSR1MoZm4sIG1hcyksDQor DQorCVRQX1NUUlVDVF9fZW50cnkoDQorCQkJX19maWVsZChjb25zdCBjaGFyICosIGZuKQ0KKwkJ CV9fZmllbGQodW5zaWduZWQgbG9uZywgbWluKQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9uZywg bWF4KQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9uZywgaW5kZXgpDQorCQkJX19maWVsZCh1bnNp Z25lZCBsb25nLCBsYXN0KQ0KKwkJCV9fZmllbGQodm9pZCAqLCBub2RlKQ0KKwkpLA0KKw0KKwlU UF9mYXN0X2Fzc2lnbigNCisJCQlfX2VudHJ5LT5mbgkJPSBmbjsNCisJCQlfX2VudHJ5LT5taW4J CT0gbWFzLT5taW47DQorCQkJX19lbnRyeS0+bWF4CQk9IG1hcy0+bWF4Ow0KKwkJCV9fZW50cnkt PmluZGV4CQk9IG1hcy0+aW5kZXg7DQorCQkJX19lbnRyeS0+bGFzdAkJPSBtYXMtPmxhc3Q7DQor CQkJX19lbnRyeS0+bm9kZQkJPSBtYXMtPm5vZGU7DQorCSksDQorDQorCVRQX3ByaW50aygiJXNc dE5vZGU6ICVwICglbHUgJWx1KSByYW5nZTogJWx1LSVsdSIsDQorCQkgIF9fZW50cnktPmZuLA0K KwkJICAodm9pZCAqKSBfX2VudHJ5LT5ub2RlLA0KKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRy eS0+bWluLA0KKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+bWF4LA0KKwkJICAodW5zaWdu ZWQgbG9uZykgX19lbnRyeS0+aW5kZXgsDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5s YXN0DQorCSkNCispDQorVFJBQ0VfRVZFTlQobWFfcmVhZCwNCisNCisJVFBfUFJPVE8oY29uc3Qg Y2hhciAqZm4sIHN0cnVjdCBtYV9zdGF0ZSAqbWFzKSwNCisNCisJVFBfQVJHUyhmbiwgbWFzKSwN CisNCisJVFBfU1RSVUNUX19lbnRyeSgNCisJCQlfX2ZpZWxkKGNvbnN0IGNoYXIgKiwgZm4pDQor CQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBtaW4pDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25n LCBtYXgpDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBpbmRleCkNCisJCQlfX2ZpZWxkKHVu c2lnbmVkIGxvbmcsIGxhc3QpDQorCQkJX19maWVsZCh2b2lkICosIG5vZGUpDQorCSksDQorDQor CVRQX2Zhc3RfYXNzaWduKA0KKwkJCV9fZW50cnktPmZuCQk9IGZuOw0KKwkJCV9fZW50cnktPm1p bgkJPSBtYXMtPm1pbjsNCisJCQlfX2VudHJ5LT5tYXgJCT0gbWFzLT5tYXg7DQorCQkJX19lbnRy eS0+aW5kZXgJCT0gbWFzLT5pbmRleDsNCisJCQlfX2VudHJ5LT5sYXN0CQk9IG1hcy0+bGFzdDsN CisJCQlfX2VudHJ5LT5ub2RlCQk9IG1hcy0+bm9kZTsNCisJKSwNCisNCisJVFBfcHJpbnRrKCIl c1x0Tm9kZTogJXAgKCVsdSAlbHUpIHJhbmdlOiAlbHUtJWx1IiwNCisJCSAgX19lbnRyeS0+Zm4s DQorCQkgICh2b2lkICopIF9fZW50cnktPm5vZGUsDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2Vu dHJ5LT5taW4sDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5tYXgsDQorCQkgICh1bnNp Z25lZCBsb25nKSBfX2VudHJ5LT5pbmRleCwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnkt Pmxhc3QNCisJKQ0KKykNCisNCitUUkFDRV9FVkVOVChtYV93cml0ZSwNCisNCisJVFBfUFJPVE8o Y29uc3QgY2hhciAqZm4sIHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIHBpdiwN CisJCSB2b2lkICp2YWwpLA0KKw0KKwlUUF9BUkdTKGZuLCBtYXMsIHBpdiwgdmFsKSwNCisNCisJ VFBfU1RSVUNUX19lbnRyeSgNCisJCQlfX2ZpZWxkKGNvbnN0IGNoYXIgKiwgZm4pDQorCQkJX19m aWVsZCh1bnNpZ25lZCBsb25nLCBtaW4pDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBtYXgp DQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBpbmRleCkNCisJCQlfX2ZpZWxkKHVuc2lnbmVk IGxvbmcsIGxhc3QpDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBwaXYpDQorCQkJX19maWVs ZCh2b2lkICosIHZhbCkNCisJCQlfX2ZpZWxkKHZvaWQgKiwgbm9kZSkNCisJKSwNCisNCisJVFBf ZmFzdF9hc3NpZ24oDQorCQkJX19lbnRyeS0+Zm4JCT0gZm47DQorCQkJX19lbnRyeS0+bWluCQk9 IG1hcy0+bWluOw0KKwkJCV9fZW50cnktPm1heAkJPSBtYXMtPm1heDsNCisJCQlfX2VudHJ5LT5p bmRleAkJPSBtYXMtPmluZGV4Ow0KKwkJCV9fZW50cnktPmxhc3QJCT0gbWFzLT5sYXN0Ow0KKwkJ CV9fZW50cnktPnBpdgkJPSBwaXY7DQorCQkJX19lbnRyeS0+dmFsCQk9IHZhbDsNCisJCQlfX2Vu dHJ5LT5ub2RlCQk9IG1hcy0+bm9kZTsNCisJKSwNCisNCisJVFBfcHJpbnRrKCIlc1x0Tm9kZSAl cCAoJWx1ICVsdSkgcmFuZ2U6JWx1LSVsdSBwaXYgKCVsdSkgdmFsICVwIiwNCisJCSAgX19lbnRy eS0+Zm4sDQorCQkgICh2b2lkICopIF9fZW50cnktPm5vZGUsDQorCQkgICh1bnNpZ25lZCBsb25n KSBfX2VudHJ5LT5taW4sDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5tYXgsDQorCQkg ICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbmRleCwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9f ZW50cnktPmxhc3QsDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5waXYsDQorCQkgICh2 b2lkICopIF9fZW50cnktPnZhbA0KKwkpDQorKQ0KKyNlbmRpZiAvKiBfVFJBQ0VfTU1fSCAqLw0K Kw0KKy8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLw0KKyNpbmNsdWRl IDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4NCmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQv bWFpbi5jDQppbmRleCA5MTY0MmE0ZTY5YmUuLmZhMjYyMzQwMWFlMSAxMDA2NDQNCi0tLSBhL2lu aXQvbWFpbi5jDQorKysgYi9pbml0L21haW4uYw0KQEAgLTExNyw2ICsxMTcsNyBAQCBzdGF0aWMg aW50IGtlcm5lbF9pbml0KHZvaWQgKik7DQogDQogZXh0ZXJuIHZvaWQgaW5pdF9JUlEodm9pZCk7 DQogZXh0ZXJuIHZvaWQgcmFkaXhfdHJlZV9pbml0KHZvaWQpOw0KK2V4dGVybiB2b2lkIG1hcGxl X3RyZWVfaW5pdCh2b2lkKTsNCiANCiAvKg0KICAqIERlYnVnIGhlbHBlcjogdmlhIHRoaXMgZmxh ZyB3ZSBrbm93IHRoYXQgd2UgYXJlIGluICdlYXJseSBib290dXAgY29kZScNCkBAIC0xMDAyLDYg KzEwMDMsNyBAQCBhc21saW5rYWdlIF9fdmlzaWJsZSB2b2lkIF9faW5pdCBfX25vX3Nhbml0aXpl X2FkZHJlc3Mgc3RhcnRfa2VybmVsKHZvaWQpDQogCQkgIkludGVycnVwdHMgd2VyZSBlbmFibGVk ICp2ZXJ5KiBlYXJseSwgZml4aW5nIGl0XG4iKSkNCiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7DQog CXJhZGl4X3RyZWVfaW5pdCgpOw0KKwltYXBsZV90cmVlX2luaXQoKTsNCiANCiAJLyoNCiAJICog U2V0IHVwIGhvdXNla2VlcGluZyBiZWZvcmUgc2V0dGluZyB1cCB3b3JrcXVldWVzIHRvIGFsbG93 IHRoZSB1bmJvdW5kDQpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZp Zy5kZWJ1Zw0KaW5kZXggMDcyZTRiMjg5YzEzLi4zZTliZTI0NzMxNjMgMTAwNjQ0DQotLS0gYS9s aWIvS2NvbmZpZy5kZWJ1Zw0KKysrIGIvbGliL0tjb25maWcuZGVidWcNCkBAIC04MjAsNiArODIw LDEzIEBAIGNvbmZpZyBERUJVR19WTV9WTUFDQUNIRQ0KIAkgIGNhbiBjYXVzZSBzaWduaWZpY2Fu dCBvdmVyaGVhZCwgc28gb25seSBlbmFibGUgaXQgaW4gbm9uLXByb2R1Y3Rpb24NCiAJICBlbnZp cm9ubWVudHMuDQogDQorY29uZmlnIERFQlVHX1ZNX01BUExFX1RSRUUNCisJYm9vbCAiRGVidWcg Vk0gbWFwbGUgdHJlZXMiDQorCWRlcGVuZHMgb24gREVCVUdfVk0NCisJc2VsZWN0IERFQlVHX01B UExFX1RSRUUNCisJaGVscA0KKwkgIEVuYWJsZSBWTSBtYXBsZSB0cmVlIGRlYnVnZ2luZyBpbmZv cm1hdGlvbiBhbmQgZXh0cmEgdmFsaWRhdGlvbnMuDQorDQogCSAgSWYgdW5zdXJlLCBzYXkgTi4N CiANCiBjb25maWcgREVCVUdfVk1fUkINCkBAIC0xNjM1LDYgKzE2NDIsMTQgQEAgY29uZmlnIEJV R19PTl9EQVRBX0NPUlJVUFRJT04NCiANCiAJICBJZiB1bnN1cmUsIHNheSBOLg0KIA0KK2NvbmZp ZyBERUJVR19NQVBMRV9UUkVFDQorCWJvb2wgIkRlYnVnIG1hcGxlIHRyZWVzIg0KKwlkZXBlbmRz IG9uIERFQlVHX0tFUk5FTA0KKwloZWxwDQorCSAgRW5hYmxlIG1hcGxlIHRyZWUgZGVidWdnaW5n IGluZm9ybWF0aW9uIGFuZCBleHRyYSB2YWxpZGF0aW9ucy4NCisNCisJICBJZiB1bnN1cmUsIHNh eSBOLg0KKw0KIGVuZG1lbnUNCiANCiBjb25maWcgREVCVUdfQ1JFREVOVElBTFMNCmRpZmYgLS1n aXQgYS9saWIvTWFrZWZpbGUgYi9saWIvTWFrZWZpbGUNCmluZGV4IGM5NTIxMjE0MTkyOC4uZmEw OWRiOTg4OWEyIDEwMDY0NA0KLS0tIGEvbGliL01ha2VmaWxlDQorKysgYi9saWIvTWFrZWZpbGUN CkBAIC0yOSw3ICsyOSw3IEBAIGVuZGlmDQogDQogbGliLXkgOj0gY3R5cGUubyBzdHJpbmcubyB2 c3ByaW50Zi5vIGNtZGxpbmUubyBcDQogCSByYnRyZWUubyByYWRpeC10cmVlLm8gdGltZXJxdWV1 ZS5vIHhhcnJheS5vIFwNCi0JIGlkci5vIGV4dGFibGUubyBpcnFfcmVncy5vIGFyZ3Zfc3BsaXQu byBcDQorCSBtYXBsZV90cmVlLm8gaWRyLm8gZXh0YWJsZS5vIGlycV9yZWdzLm8gYXJndl9zcGxp dC5vIFwNCiAJIGZsZXhfcHJvcG9ydGlvbnMubyByYXRlbGltaXQubyBzaG93X21lbS5vIFwNCiAJ IGlzX3NpbmdsZV90aHJlYWRlZC5vIHBsaXN0Lm8gZGVjb21wcmVzcy5vIGtvYmplY3RfdWV2ZW50 Lm8gXA0KIAkgZWFybHljcGlvLm8gc2VxX2J1Zi5vIHNpcGhhc2gubyBkZWNfYW5kX2xvY2subyBc DQpkaWZmIC0tZ2l0IGEvbGliL21hcGxlX3RyZWUuYyBiL2xpYi9tYXBsZV90cmVlLmMNCm5ldyBm aWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLmUxNzQzODAzYzg1MQ0KLS0tIC9k ZXYvbnVsbA0KKysrIGIvbGliL21hcGxlX3RyZWUuYw0KQEAgLTAsMCArMSw3MTMwIEBADQorLy8g U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArDQorLyoNCisgKiBNYXBsZSBUcmVlIGlt cGxlbWVudGF0aW9uDQorICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgT3JhY2xlIENvcnBvcmF0 aW9uDQorICogQXV0aG9yczogTGlhbSBSLiBIb3dsZXR0IDxMaWFtLkhvd2xldHRAb3JhY2xlLmNv bT4NCisgKgkgICAgTWF0dGhldyBXaWxjb3ggPHdpbGx5QGluZnJhZGVhZC5vcmc+DQorICovDQor DQorLyoNCisgKiBET0M6IEludGVyZXN0aW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgdGhl IE1hcGxlIFRyZWUNCisgKg0KKyAqIEVhY2ggbm9kZSB0eXBlIGhhcyBhIG51bWJlciBvZiBzbG90 cyBmb3IgZW50cmllcyBhbmQgYSBudW1iZXIgb2Ygc2xvdHMgZm9yDQorICogcGl2b3RzLiAgSW4g dGhlIGNhc2Ugb2YgZGVuc2Ugbm9kZXMsIHRoZSBwaXZvdHMgYXJlIGltcGxpZWQgYnkgdGhlIHBv c2l0aW9uDQorICogYW5kIGFyZSBzaW1wbHkgdGhlIHNsb3QgaW5kZXggKyB0aGUgbWluaW11bSBv ZiB0aGUgbm9kZS4NCisgKg0KKyAqIEluIHJlZ3VsYXIgQi1UcmVlIHRlcm1zLCBwaXZvdHMgYXJl IGNhbGxlZCBrZXlzLiAgVGhlIHRlcm0gcGl2b3QgaXMgdXNlZCB0bw0KKyAqIGluZGljYXRlIHRo YXQgdGhlIHRyZWUgaXMgc3BlY2lmeWluZyByYW5nZXMsICBQaXZvdHMgbWF5IGFwcGVhciBpbiB0 aGUNCisgKiBzdWJ0cmVlIHdpdGggYW4gZW50cnkgYXR0YWNoZWQgdG8gdGhlIHZhbHVlIHdoZXJl IGFzIGtleXMgYXJlIHVuaXF1ZSB0byBhDQorICogc3BlY2lmaWMgcG9zaXRpb24gb2YgYSBCLXRy ZWUuICBQaXZvdCB2YWx1ZXMgYXJlIGluY2x1c2l2ZSBvZiB0aGUgc2xvdCB3aXRoDQorICogdGhl IHNhbWUgaW5kZXguDQorICoNCisgKg0KKyAqIFRoZSBmb2xsb3dpbmcgaWxsdXN0cmF0ZXMgdGhl IGxheW91dCBvZiBhIHJhbmdlNjQgbm9kZXMgc2xvdHMgYW5kIHBpdm90cy4NCisgKg0KKyAqDQor ICogIFNsb3RzIC0+IHwgMCB8IDEgfCAyIHwgLi4uIHwgMTIgfCAxMyB8IDE0IHwgMTUgfA0KKyAq ICAgICAgICAgICDilKwgICDilKwgICDilKwgICDilKwgICAgIOKUrCAgICDilKwgICAg4pSsICAg IOKUrCAgICDilKwNCisgKiAgICAgICAgICAg4pSCICAg4pSCICAg4pSCICAg4pSCICAgICDilIIg ICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSU4pSAIEltcGxpZWQgbWF4aW11bQ0KKyAqICAgICAg ICAgICDilIIgICDilIIgICDilIIgICDilIIgICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUlOKU gCBQaXZvdCAxNA0KKyAqICAgICAgICAgICDilIIgICDilIIgICDilIIgICDilIIgICAgIOKUgiAg ICDilIIgICAg4pSU4pSAIFBpdm90IDEzDQorICogICAgICAgICAgIOKUgiAgIOKUgiAgIOKUgiAg IOKUgiAgICAg4pSCICAgIOKUlOKUgCBQaXZvdCAxMg0KKyAqICAgICAgICAgICDilIIgICDilIIg ICDilIIgICDilIIgICAgIOKUlOKUgCBQaXZvdCAxMQ0KKyAqICAgICAgICAgICDilIIgICDilIIg ICDilIIgICDilJTilIAgUGl2b3QgMg0KKyAqICAgICAgICAgICDilIIgICDilIIgICDilJTilIAg UGl2b3QgMQ0KKyAqICAgICAgICAgICDilIIgICDilJTilIAgUGl2b3QgMA0KKyAqICAgICAgICAg ICDilJTilIAgIEltcGxpZWQgbWluaW11bQ0KKyAqDQorICogU2xvdCBjb250ZW50czoNCisgKiAg SW50ZXJuYWwgKG5vbi1sZWFmKSBub2RlcyBjb250YWluIHBvaW50ZXJzIHRvIG90aGVyIG5vZGVz Lg0KKyAqICBMZWFmIG5vZGVzIGNvbnRhaW4gZW50cmllcy4NCisgKg0KKyAqIFRoZSBsb2NhdGlv biBvZiBpbnRlcmVzdCBpcyBvZnRlbiByZWZlcnJlZCB0byBhcyBhbiBvZmZzZXQuICBBbGwgb2Zm c2V0cyBoYXZlDQorICogYSBzbG90LCBidXQgdGhlIGxhc3Qgb2Zmc2V0IGhhcyBhbiBpbXBsaWVk IHBpdm90IGZyb20gdGhlIG5vZGUgYWJvdmUgKG9yDQorICogVUlOVF9NQVggZm9yIHRoZSByb290 IG5vZGUuDQorICoNCisgKiBSYW5nZXMgY29tcGxpY2F0ZSBjZXJ0YWluIHdyaXRlIGFjdGl2aXRp ZXMuICBXaGVuIG1vZGlmeWluZyBhbnkgb2YNCisgKiB0aGUgQi10cmVlIHZhcmlhbnRzLCBpdCBp cyBrbm93biB0aGF0IG9uZSBlbnRyeSB3aWxsIGVpdGhlciBiZSBhZGRlZCBvcg0KKyAqIGRlbGV0 ZWQuICBXaGVuIG1vZGlmeWluZyB0aGUgTWFwbGUgVHJlZSwgb25lIHN0b3JlIG9wZXJhdGlvbiBt YXkgb3ZlcndyaXRlDQorICogdGhlIGVudGlyZSBkYXRhIHNldCwgb3Igb25lIGhhbGYgb2YgdGhl IHRyZWUsIG9yIHRoZSBtaWRkbGUgaGFsZiBvZiB0aGUgdHJlZS4NCisgKg0KKyAqLw0KKw0KKw0K KyNpbmNsdWRlIDxsaW51eC9tYXBsZV90cmVlLmg+DQorI2luY2x1ZGUgPGxpbnV4L3hhcnJheS5o Pg0KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPg0KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4N CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPg0KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4NCisj aW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4NCisNCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMN CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaD4NCisNCisjZGVmaW5lIE1BX1JP T1RfUEFSRU5UIDENCisNCisvKg0KKyAqIE1hcGxlIHN0YXRlIGZsYWdzDQorICogKiBNQV9TVEFU RV9CVUxLCQktIEJ1bGsgaW5zZXJ0IG1vZGUNCisgKiAqIE1BX1NUQVRFX1JFQkFMQU5DRQkJLSBJ bmRpY2F0ZSBhIHJlYmFsYW5jZSBkdXJpbmcgYnVsayBpbnNlcnQNCisgKiAqIE1BX1NUQVRFX1BS RUFMTE9DCQktIFByZWFsbG9jYXRlZCBub2RlcywgV0FSTl9PTiBhbGxvY2F0aW9uDQorICovDQor I2RlZmluZSBNQV9TVEFURV9CVUxLCQkxDQorI2RlZmluZSBNQV9TVEFURV9SRUJBTEFOQ0UJMg0K KyNkZWZpbmUgTUFfU1RBVEVfUFJFQUxMT0MJNA0KKw0KKyNkZWZpbmUgbWFfcGFyZW50X3B0cih4 KSAoKHN0cnVjdCBtYXBsZV9wbm9kZSAqKSh4KSkNCisjZGVmaW5lIG1hX21ub2RlX3B0cih4KSAo KHN0cnVjdCBtYXBsZV9ub2RlICopKHgpKQ0KKyNkZWZpbmUgbWFfZW5vZGVfcHRyKHgpICgoc3Ry dWN0IG1hcGxlX2Vub2RlICopKHgpKQ0KK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqbWFwbGVf bm9kZV9jYWNoZTsNCisNCisjaWZkZWYgQ09ORklHX0RFQlVHX01BUExFX1RSRUUNCitzdGF0aWMg Y29uc3QgdW5zaWduZWQgbG9uZyBtdF9tYXhbXSA9IHsNCisJW21hcGxlX2RlbnNlXQkJPSBNQVBM RV9OT0RFX1NMT1RTLA0KKwlbbWFwbGVfbGVhZl82NF0JCT0gVUxPTkdfTUFYLA0KKwlbbWFwbGVf cmFuZ2VfNjRdCT0gVUxPTkdfTUFYLA0KKwlbbWFwbGVfYXJhbmdlXzY0XQk9IFVMT05HX01BWCwN Cit9Ow0KKyNkZWZpbmUgbXRfbm9kZV9tYXgoeCkgbXRfbWF4W210ZV9ub2RlX3R5cGUoeCldDQor I2VuZGlmDQorDQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbXRfc2xvdHNbXSA9IHsNCisJ W21hcGxlX2RlbnNlXQkJPSBNQVBMRV9OT0RFX1NMT1RTLA0KKwlbbWFwbGVfbGVhZl82NF0JCT0g TUFQTEVfUkFOR0U2NF9TTE9UUywNCisJW21hcGxlX3JhbmdlXzY0XQk9IE1BUExFX1JBTkdFNjRf U0xPVFMsDQorCVttYXBsZV9hcmFuZ2VfNjRdCT0gTUFQTEVfQVJBTkdFNjRfU0xPVFMsDQorfTsN CisjZGVmaW5lIG10X3Nsb3RfY291bnQoeCkgbXRfc2xvdHNbbXRlX25vZGVfdHlwZSh4KV0NCisN CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtdF9waXZvdHNbXSA9IHsNCisJW21hcGxlX2Rl bnNlXQkJPSAwLA0KKwlbbWFwbGVfbGVhZl82NF0JCT0gTUFQTEVfUkFOR0U2NF9TTE9UUyAtIDEs DQorCVttYXBsZV9yYW5nZV82NF0JPSBNQVBMRV9SQU5HRTY0X1NMT1RTIC0gMSwNCisJW21hcGxl X2FyYW5nZV82NF0JPSBNQVBMRV9BUkFOR0U2NF9TTE9UUyAtIDEsDQorfTsNCisjZGVmaW5lIG10 X3Bpdm90X2NvdW50KHgpIG10X3Bpdm90c1ttdGVfbm9kZV90eXBlKHgpXQ0KKw0KK3N0YXRpYyBj b25zdCB1bnNpZ25lZCBjaGFyIG10X21pbl9zbG90c1tdID0gew0KKwlbbWFwbGVfZGVuc2VdCQk9 IE1BUExFX05PREVfU0xPVFMgLyAyLA0KKwlbbWFwbGVfbGVhZl82NF0JCT0gKE1BUExFX1JBTkdF NjRfU0xPVFMgLyAyKSAtIDIsDQorCVttYXBsZV9yYW5nZV82NF0JPSAoTUFQTEVfUkFOR0U2NF9T TE9UUyAvIDIpIC0gMiwNCisJW21hcGxlX2FyYW5nZV82NF0JPSAoTUFQTEVfQVJBTkdFNjRfU0xP VFMgLyAyKSAtIDEsDQorfTsNCisjZGVmaW5lIG10X21pbl9zbG90X2NvdW50KHgpIG10X21pbl9z bG90c1ttdGVfbm9kZV90eXBlKHgpXQ0KKw0KKyNkZWZpbmUgTUFQTEVfQklHX05PREVfU0xPVFMJ KE1BUExFX1JBTkdFNjRfU0xPVFMgKiAyICsgMikNCisjZGVmaW5lIE1BUExFX0JJR19OT0RFX0dB UFMJKE1BUExFX0FSQU5HRTY0X1NMT1RTICogMiArIDEpDQorDQorc3RydWN0IG1hcGxlX2JpZ19u b2RlIHsNCisJc3RydWN0IG1hcGxlX3Bub2RlICpwYXJlbnQ7DQorCXVuc2lnbmVkIGxvbmcgcGl2 b3RbTUFQTEVfQklHX05PREVfU0xPVFMgLSAxXTsNCisJdW5pb24gew0KKwkJc3RydWN0IG1hcGxl X2Vub2RlICpzbG90W01BUExFX0JJR19OT0RFX1NMT1RTXTsNCisJCXN0cnVjdCB7DQorCQkJdW5z aWduZWQgbG9uZyBwYWRkaW5nW01BUExFX0JJR19OT0RFX0dBUFNdOw0KKwkJCXVuc2lnbmVkIGxv bmcgZ2FwW01BUExFX0JJR19OT0RFX0dBUFNdOw0KKwkJfTsNCisJfTsNCisJdW5zaWduZWQgY2hh ciBiX2VuZDsNCisJZW51bSBtYXBsZV90eXBlIHR5cGU7DQorfTsNCisNCisvKg0KKyAqIFRoZSBt YXBsZV9zdWJ0cmVlX3N0YXRlIGlzIHVzZWQgdG8gYnVpbGQgYSB0cmVlIHRvIHJlcGxhY2UgYSBz ZWdtZW50IG9mIGFuDQorICogZXhpc3RpbmcgdHJlZSBpbiBhIG1vcmUgYXRvbWljIHdheS4gIEFu eSB3YWxrZXJzIG9mIHRoZSBvbGRlciB0cmVlIHdpbGwgaGl0IGENCisgKiBkZWFkIG5vZGUgYW5k IHJlc3RhcnQgb24gdXBkYXRlcy4NCisgKi8NCitzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSB7 DQorCXN0cnVjdCBtYV9zdGF0ZSAqb3JpZ19sOwkvKiBPcmlnaW5hbCBsZWZ0IHNpZGUgb2Ygc3Vi dHJlZSAqLw0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm9yaWdfcjsJLyogT3JpZ2luYWwgcmlnaHQgc2lk ZSBvZiBzdWJ0cmVlICovDQorCXN0cnVjdCBtYV9zdGF0ZSAqbDsJCS8qIE5ldyBsZWZ0IHNpZGUg b2Ygc3VidHJlZSAqLw0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm07CQkvKiBOZXcgbWlkZGxlIG9mIHN1 YnRyZWUgKHJhcmUpICovDQorCXN0cnVjdCBtYV9zdGF0ZSAqcjsJCS8qIE5ldyByaWdodCBzaWRl IG9mIHN1YnRyZWUgKi8NCisJc3RydWN0IG1hX3RvcGlhcnkgKmZyZWU7CS8qIG5vZGVzIHRvIGJl IGZyZWVkICovDQorCXN0cnVjdCBtYV90b3BpYXJ5ICpkZXN0cm95OwkvKiBOb2RlcyB0byBiZSBk ZXN0cm95ZWQgKHdhbGtlZCBhbmQgZnJlZWQpICovDQorCXN0cnVjdCBtYXBsZV9iaWdfbm9kZSAq Ym47DQorfTsNCisNCisvKiBGdW5jdGlvbnMgKi8NCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBs ZV9ub2RlICptdF9hbGxvY19vbmUoZ2ZwX3QgZ2ZwKQ0KK3sNCisJcmV0dXJuIGttZW1fY2FjaGVf YWxsb2MobWFwbGVfbm9kZV9jYWNoZSwgZ2ZwIHwgX19HRlBfWkVSTyk7DQorfQ0KKw0KK3N0YXRp YyBpbmxpbmUgaW50IG10X2FsbG9jX2J1bGsoZ2ZwX3QgZ2ZwLCBzaXplX3Qgc2l6ZSwgdm9pZCAq Km5vZGVzKQ0KK3sNCisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2NfYnVsayhtYXBsZV9ub2RlX2Nh Y2hlLCBnZnAgfCBfX0dGUF9aRVJPLCBzaXplLA0KKwkJCQkgICAgIG5vZGVzKTsNCit9DQorDQor c3RhdGljIGlubGluZSB2b2lkIG10X2ZyZWVfYnVsayhzaXplX3Qgc2l6ZSwgdm9pZCBfX3JjdSAq Km5vZGVzKQ0KK3sNCisJa21lbV9jYWNoZV9mcmVlX2J1bGsobWFwbGVfbm9kZV9jYWNoZSwgc2l6 ZSwgKHZvaWQgKiopbm9kZXMpOw0KK30NCisNCitzdGF0aWMgdm9pZCBtdF9mcmVlX3JjdShzdHJ1 Y3QgcmN1X2hlYWQgKmhlYWQpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSA9IGNvbnRh aW5lcl9vZihoZWFkLCBzdHJ1Y3QgbWFwbGVfbm9kZSwgcmN1KTsNCisNCisJa21lbV9jYWNoZV9m cmVlKG1hcGxlX25vZGVfY2FjaGUsIG5vZGUpOw0KK30NCisNCisvKg0KKyAqIG1hX2ZyZWVfcmN1 KCkgLSBVc2UgcmN1IGNhbGxiYWNrIHRvIGZyZWUgYSBtYXBsZSBub2RlDQorICogQG5vZGU6IFRo ZSBub2RlIHRvIGZyZWUNCisgKg0KKyAqIFRoZSBtYXBsZSB0cmVlIHVzZXMgdGhlIHBhcmVudCBw b2ludGVyIHRvIGluZGljYXRlIHRoaXMgbm9kZSBpcyBubyBsb25nZXIgaW4NCisgKiB1c2UgYW5k IHdpbGwgYmUgZnJlZWQuDQorICovDQorc3RhdGljIHZvaWQgbWFfZnJlZV9yY3Uoc3RydWN0IG1h cGxlX25vZGUgKm5vZGUpDQorew0KKwlub2RlLT5wYXJlbnQgPSBtYV9wYXJlbnRfcHRyKG5vZGUp Ow0KKwljYWxsX3JjdSgmbm9kZS0+cmN1LCBtdF9mcmVlX3JjdSk7DQorfQ0KKw0KK3N0YXRpYyB1 bnNpZ25lZCBpbnQgbXRfaGVpZ2h0KGNvbnN0IHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQor CXJldHVybiAobXQtPm1hX2ZsYWdzICYgTVRfRkxBR1NfSEVJR0hUX01BU0spID4+IE1UX0ZMQUdT X0hFSUdIVF9PRkZTRVQ7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG1hc19zZXRfaGVpZ2h0KHN0cnVj dCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJdW5zaWduZWQgaW50IG5ld19mbGFncyA9IG1hcy0+dHJl ZS0+bWFfZmxhZ3M7DQorDQorCW5ld19mbGFncyAmPSB+TVRfRkxBR1NfSEVJR0hUX01BU0s7DQor CUJVR19PTihtYXMtPmRlcHRoID4gTUFQTEVfSEVJR0hUX01BWCk7DQorCW5ld19mbGFncyB8PSBt YXMtPmRlcHRoIDw8IE1UX0ZMQUdTX0hFSUdIVF9PRkZTRVQ7DQorCW1hcy0+dHJlZS0+bWFfZmxh Z3MgPSBuZXdfZmxhZ3M7DQorfQ0KKw0KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWFzX210X2hlaWdo dChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXJldHVybiBtdF9oZWlnaHQobWFzLT50cmVl KTsNCit9DQorDQorc3RhdGljIGlubGluZSBlbnVtIG1hcGxlX3R5cGUgbXRlX25vZGVfdHlwZShj b25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVudHJ5KQ0KK3sNCisJcmV0dXJuICgodW5zaWduZWQg bG9uZyllbnRyeSA+PiBNQVBMRV9OT0RFX1RZUEVfU0hJRlQpICYNCisJCU1BUExFX05PREVfVFlQ RV9NQVNLOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbWFfaXNfZGVuc2UoY29uc3QgZW51 bSBtYXBsZV90eXBlIHR5cGUpDQorew0KKwlyZXR1cm4gdHlwZSA8IG1hcGxlX2xlYWZfNjQ7DQor fQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYV9pc19sZWFmKGNvbnN0IGVudW0gbWFwbGVfdHlw ZSB0eXBlKQ0KK3sNCisJcmV0dXJuIHR5cGUgPCBtYXBsZV9yYW5nZV82NDsNCit9DQorDQorc3Rh dGljIGlubGluZSBib29sIG10ZV9pc19sZWFmKGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqZW50 cnkpDQorew0KKwlyZXR1cm4gbWFfaXNfbGVhZihtdGVfbm9kZV90eXBlKGVudHJ5KSk7DQorfQ0K Kw0KKy8qDQorICogV2UgYWxzbyByZXNlcnZlIHZhbHVlcyB3aXRoIHRoZSBib3R0b20gdHdvIGJp dHMgc2V0IHRvICcxMCcgd2hpY2ggYXJlDQorICogYmVsb3cgNDA5Ng0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgYm9vbCBtdF9pc19yZXNlcnZlZChjb25zdCB2b2lkICplbnRyeSkNCit7DQorCXJldHVy biAoKHVuc2lnbmVkIGxvbmcpZW50cnkgPCBNQVBMRV9SRVNFUlZFRF9SQU5HRSkgJiYNCisJCXhh X2lzX2ludGVybmFsKGVudHJ5KTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19zZXRf ZXJyKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBsb25nIGVycikNCit7DQorCW1hcy0+bm9kZSA9IE1B X0VSUk9SKGVycik7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfaXNfcHRyKHN0cnVj dCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIG1hcy0+bm9kZSA9PSBNQVNfUk9PVDsNCit9 DQorDQorc3RhdGljIGlubGluZSBib29sIG1hc19pc19zdGFydChzdHJ1Y3QgbWFfc3RhdGUgKm1h cykNCit7DQorCXJldHVybiBtYXMtPm5vZGUgPT0gTUFTX1NUQVJUOw0KK30NCisNCitib29sIG1h c19pc19lcnIoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4geGFfaXNfZXJyKG1h cy0+bm9kZSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfc2VhcmNoYWJsZShzdHJ1 Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWlmIChtYXNfaXNfbm9uZShtYXMpKQ0KKwkJcmV0dXJu IGZhbHNlOw0KKw0KKwlpZiAobWFzX2lzX3B0cihtYXMpKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0K KwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfbm9kZSAq bXRlX3RvX25vZGUoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICplbnRyeSkNCit7DQorCXJldHVy biAoc3RydWN0IG1hcGxlX25vZGUgKikoKHVuc2lnbmVkIGxvbmcpZW50cnkgJiB+TUFQTEVfTk9E RV9NQVNLKTsNCit9DQorDQorLyoNCisgKiBtdGVfdG9fbWF0KCkgLSBDb252ZXJ0IGEgbWFwbGUg ZW5jb2RlZCBub2RlIHRvIGEgbWFwbGUgdG9waWFyeSBub2RlLg0KKyAqIEBlbnRyeTogVGhlIG1h cGxlIGVuY29kZWQgbm9kZQ0KKyAqDQorICogUmV0dXJuOiBhIG1hcGxlIHRvcGlhcnkgcG9pbnRl cg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX3RvcGlhcnkgKm10ZV90b19tYXQo Y29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICplbnRyeSkNCit7DQorCXJldHVybiAoc3RydWN0IG1h cGxlX3RvcGlhcnkgKikNCisJCSgodW5zaWduZWQgbG9uZyllbnRyeSAmIH5NQVBMRV9OT0RFX01B U0spOw0KK30NCisNCisvKg0KKyAqIG1hc19tbigpIC0gR2V0IHRoZSBtYXBsZSBzdGF0ZSBub2Rl Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogUmV0dXJuOiB0aGUgbWFwbGUg bm9kZSAobm90IGVuY29kZWQgLSBiYXJlIHBvaW50ZXIpLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUg c3RydWN0IG1hcGxlX25vZGUgKm1hc19tbihjb25zdCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7 DQorCXJldHVybiBtdGVfdG9fbm9kZShtYXMtPm5vZGUpOw0KK30NCisNCisvKg0KKyAqIG10ZV9z ZXRfbm9kZV9kZWFkKCkgLSBTZXQgYSBtYXBsZSBlbmNvZGVkIG5vZGUgYXMgZGVhZC4NCisgKiBA bW46IFRoZSBtYXBsZSBlbmNvZGVkIG5vZGUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG10 ZV9zZXRfbm9kZV9kZWFkKHN0cnVjdCBtYXBsZV9lbm9kZSAqbW4pDQorew0KKwltdGVfdG9fbm9k ZShtbiktPnBhcmVudCA9IG1hX3BhcmVudF9wdHIobXRlX3RvX25vZGUobW4pKTsNCisJc21wX3dt YigpOyAvKiBOZWVkZWQgZm9yIFJDVSAqLw0KK30NCisNCisvKiBCaXQgMSBpbmRpY2F0ZXMgdGhl IHJvb3QgaXMgYSBub2RlICovDQorI2RlZmluZSBNQVBMRV9ST09UX05PREUJCQkweDAyDQorLyog bWFwbGVfdHlwZSBzdG9yZWQgYml0IDMtNiAqLw0KKyNkZWZpbmUgTUFQTEVfRU5PREVfVFlQRV9T SElGVAkJMHgwMw0KKy8qIEJpdCAyIG1lYW5zIGEgTlVMTCBzb21ld2hlcmUgYmVsb3cgKi8NCisj ZGVmaW5lIE1BUExFX0VOT0RFX05VTEwJCTB4MDQNCisNCitzdGF0aWMgaW5saW5lIHN0cnVjdCBt YXBsZV9lbm9kZSAqbXRfbWtfbm9kZShjb25zdCBzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwNCisJ CQkJCSAgICAgZW51bSBtYXBsZV90eXBlIHR5cGUpDQorew0KKwlyZXR1cm4gKHZvaWQgKikoKHVu c2lnbmVkIGxvbmcpbm9kZSB8DQorCQkJKHR5cGUgPDwgTUFQTEVfRU5PREVfVFlQRV9TSElGVCkg fCBNQVBMRV9FTk9ERV9OVUxMKTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkICptdGVfbWtf cm9vdChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5vZGUpDQorew0KKwlyZXR1cm4gKHZvaWQg KikoKHVuc2lnbmVkIGxvbmcpbm9kZSB8IE1BUExFX1JPT1RfTk9ERSk7DQorfQ0KKw0KK3N0YXRp YyBpbmxpbmUgdm9pZCAqbXRlX3NhZmVfcm9vdChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5v ZGUpDQorew0KKwlyZXR1cm4gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpbm9kZSAmIH5NQVBMRV9S T09UX05PREUpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbXRlX3NldF9mdWxsKGNvbnN0 IHN0cnVjdCBtYXBsZV9lbm9kZSAqbm9kZSkNCit7DQorCW5vZGUgPSAodm9pZCAqKSgodW5zaWdu ZWQgbG9uZylub2RlICYgfk1BUExFX0VOT0RFX05VTEwpOw0KK30NCisNCitzdGF0aWMgaW5saW5l IHZvaWQgbXRlX2NsZWFyX2Z1bGwoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICpub2RlKQ0KK3sN CisJbm9kZSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW5vZGUgfCBNQVBMRV9FTk9ERV9OVUxM KTsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hX2lzX3Jvb3Qoc3RydWN0IG1hcGxlX25v ZGUgKm5vZGUpDQorew0KKwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKW5vZGUtPnBhcmVudCAmIE1B X1JPT1RfUEFSRU5UKTsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG10ZV9pc19yb290KGNv bnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqbm9kZSkNCit7DQorCXJldHVybiBtYV9pc19yb290KG10 ZV90b19ub2RlKG5vZGUpKTsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hc19pc19yb290 X2xpbWl0cyhjb25zdCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXJldHVybiAhbWFzLT5t aW4gJiYgbWFzLT5tYXggPT0gVUxPTkdfTUFYOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wg bXRfaXNfYWxsb2Moc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJcmV0dXJuIChtdC0+bWFf ZmxhZ3MgJiBNVF9GTEFHU19BTExPQ19SQU5HRSk7DQorfQ0KKw0KKy8qDQorICogVGhlIFBhcmVu dCBQb2ludGVyDQorICogRXhjbHVkaW5nIHJvb3QsIHRoZSBwYXJlbnQgcG9pbnRlciBpcyAyNTZC IGFsaWduZWQgbGlrZSBhbGwgb3RoZXIgdHJlZSBub2Rlcy4NCisgKiBXaGVuIHN0b3JpbmcgYSAz MiBvciA2NCBiaXQgdmFsdWVzLCB0aGUgb2Zmc2V0IGNhbiBmaXQgaW50byA1IGJpdHMuICBUaGUg MTYNCisgKiBiaXQgdmFsdWVzIG5lZWQgYW4gZXh0cmEgYml0IHRvIHN0b3JlIHRoZSBvZmZzZXQu ICBUaGlzIGV4dHJhIGJpdCBjb21lcyBmcm9tDQorICogYSByZXVzZSBvZiB0aGUgbGFzdCBiaXQg aW4gdGhlIG5vZGUgdHlwZS4gIFRoaXMgaXMgcG9zc2libGUgYnkgdXNpbmcgYml0IDEgdG8NCisg KiBpbmRpY2F0ZSBpZiBiaXQgMiBpcyBwYXJ0IG9mIHRoZSB0eXBlIG9yIHRoZSBzbG90Lg0KKyAq DQorICogTm90ZSB0eXBlczoNCisgKiAgMHg/PzEgPSBSb290DQorICogIDB4PzAwID0gMTYgYml0 IG5vZGVzDQorICogIDB4MDEwID0gMzIgYml0IG5vZGVzDQorICogIDB4MTEwID0gNjQgYml0IG5v ZGVzDQorICoNCisgKiBTbG90IHNpemUgYW5kIGFsaWdubWVudA0KKyAqICAwYj8/MSA6IFJvb3QN CisgKiAgMGI/MDAgOiAxNiBiaXQgdmFsdWVzLCB0eXBlIGluIDAtMSwgc2xvdCBpbiAyLTcNCisg KiAgMGIwMTAgOiAzMiBiaXQgdmFsdWVzLCB0eXBlIGluIDAtMiwgc2xvdCBpbiAzLTcNCisgKiAg MGIxMTAgOiA2NCBiaXQgdmFsdWVzLCB0eXBlIGluIDAtMiwgc2xvdCBpbiAzLTcNCisgKi8NCisN CisjZGVmaW5lIE1BUExFX1BBUkVOVF9ST09UCQkweDAxDQorDQorI2RlZmluZSBNQVBMRV9QQVJF TlRfU0xPVF9TSElGVAkJMHgwMw0KKyNkZWZpbmUgTUFQTEVfUEFSRU5UX1NMT1RfTUFTSwkJMHhG OA0KKw0KKyNkZWZpbmUgTUFQTEVfUEFSRU5UXzE2Ql9TTE9UX1NISUZUCTB4MDINCisjZGVmaW5l IE1BUExFX1BBUkVOVF8xNkJfU0xPVF9NQVNLCTB4RkMNCisNCisjZGVmaW5lIE1BUExFX1BBUkVO VF9SQU5HRTY0CQkweDA2DQorI2RlZmluZSBNQVBMRV9QQVJFTlRfUkFOR0UzMgkJMHgwNA0KKyNk ZWZpbmUgTUFQTEVfUEFSRU5UX05PVF9SQU5HRTE2CTB4MDINCisNCisvKg0KKyAqIG10ZV9wYXJl bnRfc2hpZnQoKSAtIEdldCB0aGUgcGFyZW50IHNoaWZ0IGZvciB0aGUgc2xvdCBzdG9yYWdlLg0K KyAqIEBwYXJlbnQ6IFRoZSBwYXJlbnQgcG9pbnRlciBjYXN0IGFzIGFuIHVuc2lnbmVkIGxvbmcN CisgKiBSZXR1cm46IFRoZSBzaGlmdCBpbnRvIHRoYXQgcG9pbnRlciB0byB0aGUgc3RhciB0byBv ZiB0aGUgc2xvdA0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtdGVfcGFyZW50 X3NoaWZ0KHVuc2lnbmVkIGxvbmcgcGFyZW50KQ0KK3sNCisJLyogTm90ZSBiaXQgMSA9PSAwIG1l YW5zIDE2QiAqLw0KKwlpZiAobGlrZWx5KHBhcmVudCAmIE1BUExFX1BBUkVOVF9OT1RfUkFOR0Ux NikpDQorCQlyZXR1cm4gTUFQTEVfUEFSRU5UX1NMT1RfU0hJRlQ7DQorDQorCXJldHVybiBNQVBM RV9QQVJFTlRfMTZCX1NMT1RfU0hJRlQ7DQorfQ0KKw0KKy8qDQorICogbXRlX3BhcmVudF9zbG90 X21hc2soKSAtIEdldCB0aGUgc2xvdCBtYXNrIGZvciB0aGUgcGFyZW50Lg0KKyAqIEBwYXJlbnQ6 IFRoZSBwYXJlbnQgcG9pbnRlciBjYXN0IGFzIGFuIHVuc2lnbmVkIGxvbmcuDQorICogUmV0dXJu OiBUaGUgc2xvdCBtYXNrIGZvciB0aGF0IHBhcmVudC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVu c2lnbmVkIGxvbmcgbXRlX3BhcmVudF9zbG90X21hc2sodW5zaWduZWQgbG9uZyBwYXJlbnQpDQor ew0KKwkvKiBOb3RlIGJpdCAxID09IDAgbWVhbnMgMTZCICovDQorCWlmIChsaWtlbHkocGFyZW50 ICYgTUFQTEVfUEFSRU5UX05PVF9SQU5HRTE2KSkNCisJCXJldHVybiBNQVBMRV9QQVJFTlRfU0xP VF9NQVNLOw0KKw0KKwlyZXR1cm4gTUFQTEVfUEFSRU5UXzE2Ql9TTE9UX01BU0s7DQorfQ0KKw0K Ky8qDQorICogbWFzX3BhcmVudF9lbnVtKCkgLSBSZXR1cm4gdGhlIG1hcGxlX3R5cGUgb2YgdGhl IHBhcmVudCBmcm9tIHRoZSBzdG9yZWQNCisgKiBwYXJlbnQgdHlwZS4NCisgKiBAbWFzOiBUaGUg bWFwbGUgc3RhdGUNCisgKiBAbm9kZTogVGhlIG1hcGxlX2Vub2RlIHRvIGV4dHJhY3QgdGhlIHBh cmVudCdzIGVudW0NCisgKiBSZXR1cm46IFRoZSBub2RlLT5wYXJlbnQgbWFwbGVfdHlwZQ0KKyAq Lw0KK3N0YXRpYyBpbmxpbmUNCitlbnVtIG1hcGxlX3R5cGUgbXRlX3BhcmVudF9lbnVtKHN0cnVj dCBtYXBsZV9lbm9kZSAqcF9lbm9kZSwNCisJCQkJc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sN CisJdW5zaWduZWQgbG9uZyBwX3R5cGU7DQorDQorCXBfdHlwZSA9ICh1bnNpZ25lZCBsb25nKXBf ZW5vZGU7DQorCWlmIChwX3R5cGUgJiBNQVBMRV9QQVJFTlRfUk9PVCkNCisJCXJldHVybiAwOyAv KiBWYWxpZGF0ZWQgaW4gdGhlIGNhbGxlci4gKi8NCisNCisJcF90eXBlICY9IE1BUExFX05PREVf TUFTSzsNCisJcF90eXBlID0gcF90eXBlICYgfihNQVBMRV9QQVJFTlRfUk9PVCB8IG10ZV9wYXJl bnRfc2xvdF9tYXNrKHBfdHlwZSkpOw0KKw0KKwlzd2l0Y2ggKHBfdHlwZSkgew0KKwljYXNlIE1B UExFX1BBUkVOVF9SQU5HRTY0OiAvKiBvciBNQVBMRV9QQVJFTlRfQVJBTkdFNjQgKi8NCisJCWlm IChtdF9pc19hbGxvYyhtdCkpDQorCQkJcmV0dXJuIG1hcGxlX2FyYW5nZV82NDsNCisJCXJldHVy biBtYXBsZV9yYW5nZV82NDsNCisJfQ0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIGlu bGluZQ0KK2VudW0gbWFwbGVfdHlwZSBtYXNfcGFyZW50X2VudW0oc3RydWN0IG1hX3N0YXRlICpt YXMsIHN0cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGUpDQorew0KKwlyZXR1cm4gbXRlX3BhcmVudF9l bnVtKG1hX2Vub2RlX3B0cihtdGVfdG9fbm9kZShlbm9kZSktPnBhcmVudCksIG1hcy0+dHJlZSk7 DQorfQ0KKw0KKy8qDQorICogbXRlX3NldF9wYXJlbnQoKSAtIFNldCB0aGUgcGFyZW50IG5vZGUg YW5kIGVuY29kZSB0aGUgc2xvdA0KKyAqIEBlbm9kZTogVGhlIGVuY29kZWQgbWFwbGUgbm9kZS4N CisgKiBAcGFyZW50OiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlIHRoYXQgaXMgdGhlIHBhcmVudCBv ZiBAZW5vZGUuDQorICogQHNsb3Q6IFRoZSBzbG90IHRoYXQgQGVub2RlIHJlc2lkZXMgaW4gQHBh cmVudC4NCisgKg0KKyAqIFNsb3QgbnVtYmVyIGlzIGVuY29kZWQgaW4gdGhlIGVub2RlLT5wYXJl bnQgYml0IDMtNiBvciAyLTYsIGRlcGVuZGluZyBvbiB0aGUNCisgKiBwYXJlbnQgdHlwZS4NCisg Ki8NCitzdGF0aWMgaW5saW5lDQordm9pZCBtdGVfc2V0X3BhcmVudChzdHJ1Y3QgbWFwbGVfZW5v ZGUgKmVub2RlLCBjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKnBhcmVudCwNCisJCSAgICB1bnNp Z25lZCBjaGFyIHNsb3QpDQorew0KKwl1bnNpZ25lZCBsb25nIHZhbCA9ICh1bnNpZ25lZCBsb25n KSBwYXJlbnQ7DQorCXVuc2lnbmVkIGxvbmcgc2hpZnQ7DQorCXVuc2lnbmVkIGxvbmcgdHlwZTsN CisJZW51bSBtYXBsZV90eXBlIHBfdHlwZSA9IG10ZV9ub2RlX3R5cGUocGFyZW50KTsNCisNCisJ QlVHX09OKHBfdHlwZSA9PSBtYXBsZV9kZW5zZSk7DQorCUJVR19PTihwX3R5cGUgPT0gbWFwbGVf bGVhZl82NCk7DQorDQorCXN3aXRjaCAocF90eXBlKSB7DQorCWNhc2UgbWFwbGVfcmFuZ2VfNjQ6 DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJc2hpZnQgPSBNQVBMRV9QQVJFTlRfU0xPVF9T SElGVDsNCisJCXR5cGUgPSBNQVBMRV9QQVJFTlRfUkFOR0U2NDsNCisJCWJyZWFrOw0KKwlkZWZh dWx0Og0KKwljYXNlIG1hcGxlX2RlbnNlOg0KKwljYXNlIG1hcGxlX2xlYWZfNjQ6DQorCQlzaGlm dCA9IHR5cGUgPSAwOw0KKwkJYnJlYWs7DQorCX0NCisNCisJdmFsICY9IH5NQVBMRV9OT0RFX01B U0s7IC8qIENsZWFyIGFsbCBub2RlIG1ldGFkYXRhIGluIHBhcmVudCAqLw0KKwl2YWwgfD0gKHNs b3QgPDwgc2hpZnQpIHwgdHlwZTsNCisJbXRlX3RvX25vZGUoZW5vZGUpLT5wYXJlbnQgPSBtYV9w YXJlbnRfcHRyKHZhbCk7DQorfQ0KKw0KKy8qDQorICogbXRlX3BhcmVudF9zbG90KCkgLSBnZXQg dGhlIHBhcmVudCBzbG90IG9mIEBlbm9kZS4NCisgKiBAZW5vZGU6IFRoZSBlbmNvZGVkIG1hcGxl IG5vZGUuDQorICoNCisgKiBSZXR1cm46IFRoZSBzbG90IGluIHRoZSBwYXJlbnQgbm9kZSB3aGVy ZSBAZW5vZGUgcmVzaWRlcy4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtdGVf cGFyZW50X3Nsb3QoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSkNCit7DQorCXVuc2ln bmVkIGxvbmcgdmFsID0gKHVuc2lnbmVkIGxvbmcpIG10ZV90b19ub2RlKGVub2RlKS0+cGFyZW50 Ow0KKw0KKwkvKiBSb290LiAqLw0KKwlpZiAodmFsICYgMSkNCisJCXJldHVybiAwOw0KKw0KKwkv Kg0KKwkgKiBPa2F5IHRvIHVzZSBNQVBMRV9QQVJFTlRfMTZCX1NMT1RfTUFTSyBhcyB0aGUgbGFz dCBiaXQgd2lsbCBiZSBsb3N0DQorCSAqIGJ5IHNoaWZ0IGlmIHRoZSBwYXJlbnQgc2hpZnQgaXMg TUFQTEVfUEFSRU5UX1NMT1RfU0hJRlQNCisJICovDQorCXJldHVybiAodmFsICYgTUFQTEVfUEFS RU5UXzE2Ql9TTE9UX01BU0spID4+IG10ZV9wYXJlbnRfc2hpZnQodmFsKTsNCit9DQorDQorLyoN CisgKiBtdGVfcGFyZW50KCkgLSBHZXQgdGhlIHBhcmVudCBvZiBAbm9kZS4NCisgKiBAbm9kZTog VGhlIGVuY29kZWQgbWFwbGUgbm9kZS4NCisgKg0KKyAqIFJldHVybjogVGhlIHBhcmVudCBtYXBs ZSBub2RlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX25vZGUgKm10ZV9wYXJl bnQoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSkNCit7DQorCXJldHVybiAodm9pZCAq KSgodW5zaWduZWQgbG9uZykNCisJCQkobXRlX3RvX25vZGUoZW5vZGUpLT5wYXJlbnQpICYgfk1B UExFX05PREVfTUFTSyk7DQorfQ0KKw0KKy8qDQorICogbWFfZGVhZF9ub2RlKCkgLSBjaGVjayBp ZiB0aGUgQGVub2RlIGlzIGRlYWQuDQorICogQGVub2RlOiBUaGUgZW5jb2RlZCBtYXBsZSBub2Rl DQorICoNCisgKiBSZXR1cm46IHRydWUgaWYgZGVhZCwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0K K3N0YXRpYyBpbmxpbmUgYm9vbCBtYV9kZWFkX25vZGUoY29uc3Qgc3RydWN0IG1hcGxlX25vZGUg Km5vZGUpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcGFyZW50ID0gKHZvaWQgKikoKHVuc2ln bmVkIGxvbmcpDQorCQkJCQkgICAgIG5vZGUtPnBhcmVudCAmIH5NQVBMRV9OT0RFX01BU0spOw0K Kw0KKwlyZXR1cm4gKHBhcmVudCA9PSBub2RlKTsNCit9DQorLyoNCisgKiBtdGVfZGVhZF9ub2Rl KCkgLSBjaGVjayBpZiB0aGUgQGVub2RlIGlzIGRlYWQuDQorICogQGVub2RlOiBUaGUgZW5jb2Rl ZCBtYXBsZSBub2RlDQorICoNCisgKiBSZXR1cm46IHRydWUgaWYgZGVhZCwgZmFsc2Ugb3RoZXJ3 aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtdGVfZGVhZF9ub2RlKGNvbnN0IHN0cnVj dCBtYXBsZV9lbm9kZSAqZW5vZGUpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcGFyZW50LCAq bm9kZTsNCisNCisJbm9kZSA9IG10ZV90b19ub2RlKGVub2RlKTsNCisJcGFyZW50ID0gbXRlX3Bh cmVudChlbm9kZSk7DQorCXJldHVybiAocGFyZW50ID09IG5vZGUpOw0KK30NCisNCisvKg0KKyAq IG1hc19hbGxvY2F0ZWQoKSAtIEdldCB0aGUgbnVtYmVyIG9mIG5vZGVzIGFsbG9jYXRlZCBpbiBh IG1hcGxlIHN0YXRlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogVGhlIG1h X3N0YXRlIGFsbG9jIG1lbWJlciBpcyBvdmVybG9hZGVkIHRvIGhvbGQgYSBwb2ludGVyIHRvIHRo ZSBmaXJzdA0KKyAqIGFsbG9jYXRlZCBub2RlIG9yIHRvIHRoZSBudW1iZXIgb2YgcmVxdWVzdGVk IG5vZGVzIHRvIGFsbG9jYXRlLiAgSWYgYml0IDAgaXMNCisgKiBzZXQsIHRoZW4gdGhlIGFsbG9j IGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgcmVxdWVzdGVkIG5vZGVzLiAgSWYgdGhlcmUgaXMgYW4N CisgKiBhbGxvY2F0ZWQgbm9kZSwgdGhlbiB0aGUgdG90YWwgYWxsb2NhdGVkIG5vZGVzIGlzIGlu IHRoYXQgbm9kZS4NCisgKg0KKyAqIFJldHVybjogVGhlIHRvdGFsIG51bWJlciBvZiBub2RlcyBh bGxvY2F0ZWQNCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWFzX2FsbG9jYXRl ZChjb25zdCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWlmICghbWFzLT5hbGxvYyB8fCAo KHVuc2lnbmVkIGxvbmcpbWFzLT5hbGxvYyAmIDB4MSkpDQorCQlyZXR1cm4gMDsNCisNCisJcmV0 dXJuIG1hcy0+YWxsb2MtPnRvdGFsOw0KK30NCisNCisvKg0KKyAqIG1hc19zZXRfYWxsb2NfcmVx KCkgLSBTZXQgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYWxsb2NhdGlvbnMuDQorICogQG1hczog dGhlIG1hcGxlIHN0YXRlDQorICogQGNvdW50OiB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb25zLg0K KyAqDQorICogVGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYWxsb2NhdGlvbnMgaXMgZWl0aGVyIGlu IHRoZSBmaXJzdCBhbGxvY2F0ZWQgbm9kZSwNCisgKiBsb2NhdGVkIGluIEBtYXMtPmFsbG9jLT5y ZXF1ZXN0X2NvdW50LCBvciBkaXJlY3RseSBpbiBAbWFzLT5hbGxvYyBpZiB0aGVyZSBpcw0KKyAq IG5vIGFsbG9jYXRlZCBub2RlLiAgU2V0IHRoZSByZXF1ZXN0IGVpdGhlciBpbiB0aGUgbm9kZSBv ciBkbyB0aGUgbmVjZXNzYXJ5DQorICogZW5jb2RpbmcgdG8gc3RvcmUgaW4gQG1hcy0+YWxsb2Mg ZGlyZWN0bHkuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19zZXRfYWxsb2NfcmVxKHN0 cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIGNvdW50KQ0KK3sNCisJaWYgKCFtYXMt PmFsbG9jIHx8ICgodW5zaWduZWQgbG9uZyltYXMtPmFsbG9jICYgMHgxKSkgew0KKwkJaWYgKCFj b3VudCkNCisJCQltYXMtPmFsbG9jID0gTlVMTDsNCisJCWVsc2UNCisJCQltYXMtPmFsbG9jID0g KHN0cnVjdCBtYXBsZV9hbGxvYyAqKSgoKGNvdW50KSA8PCAxVSkgfCAxVSk7DQorCQlyZXR1cm47 DQorCX0NCisNCisJbWFzLT5hbGxvYy0+cmVxdWVzdF9jb3VudCA9IGNvdW50Ow0KK30NCisNCisv Kg0KKyAqIG1hc19hbGxvY19yZXEoKSAtIGdldCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBhbGxv Y2F0aW9ucy4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKg0KKyAqIFRoZSBhbGxvYyBj b3VudCBpcyBlaXRoZXIgc3RvcmVkIGRpcmVjdGx5IGluIEBtYXMsIG9yIGluDQorICogQG1hcy0+ YWxsb2MtPnJlcXVlc3RfY291bnQgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG5vZGUgYWxsb2Nh dGVkLiAgRGVjb2RlDQorICogdGhlIHJlcXVlc3QgY291bnQgaWYgaXQncyBzdG9yZWQgZGlyZWN0 bHkgaW4gQG1hcy0+YWxsb2MuDQorICoNCisgKiBSZXR1cm46IFRoZSBhbGxvY2F0aW9uIHJlcXVl c3QgY291bnQuDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWFzX2FsbG9jX3Jl cShjb25zdCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWlmICgodW5zaWduZWQgbG9uZylt YXMtPmFsbG9jICYgMHgxKQ0KKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nKShtYXMtPmFsbG9jKSA+ PiAxOw0KKwllbHNlIGlmIChtYXMtPmFsbG9jKQ0KKwkJcmV0dXJuIG1hcy0+YWxsb2MtPnJlcXVl c3RfY291bnQ7DQorCXJldHVybiAwOw0KK30NCisNCisvKg0KKyAqIG1hX3Bpdm90cygpIC0gR2V0 IGEgcG9pbnRlciB0byB0aGUgbWFwbGUgbm9kZSBwaXZvdHMuDQorICogQG5vZGUgLSB0aGUgbWFw bGUgbm9kZQ0KKyAqIEB0eXBlIC0gdGhlIG5vZGUgdHlwZQ0KKyAqDQorICogUmV0dXJuOiBBIHBv aW50ZXIgdG8gdGhlIG1hcGxlIG5vZGUgcGl2b3RzDQorICovDQorc3RhdGljIGlubGluZSB1bnNp Z25lZCBsb25nICptYV9waXZvdHMoc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsDQorCQkJCQkgICBl bnVtIG1hcGxlX3R5cGUgdHlwZSkNCit7DQorCXN3aXRjaCAodHlwZSkgew0KKwljYXNlIG1hcGxl X2FyYW5nZV82NDoNCisJCXJldHVybiBub2RlLT5tYTY0LnBpdm90Ow0KKwljYXNlIG1hcGxlX3Jh bmdlXzY0Og0KKwljYXNlIG1hcGxlX2xlYWZfNjQ6DQorCQlyZXR1cm4gbm9kZS0+bXI2NC5waXZv dDsNCisJY2FzZSBtYXBsZV9kZW5zZToNCisJCXJldHVybiBOVUxMOw0KKwl9DQorCXJldHVybiBO VUxMOw0KK30NCisNCisvKg0KKyAqIG1hX2dhcHMoKSAtIEdldCBhIHBvaW50ZXIgdG8gdGhlIG1h cGxlIG5vZGUgZ2Fwcy4NCisgKiBAbm9kZSAtIHRoZSBtYXBsZSBub2RlDQorICogQHR5cGUgLSB0 aGUgbm9kZSB0eXBlDQorICoNCisgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgbWFwbGUgbm9k ZSBnYXBzDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICptYV9nYXBzKHN0cnVj dCBtYXBsZV9ub2RlICpub2RlLA0KKwkJCQkgICAgIGVudW0gbWFwbGVfdHlwZSB0eXBlKQ0KK3sN CisJc3dpdGNoICh0eXBlKSB7DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJcmV0dXJuIG5v ZGUtPm1hNjQuZ2FwOw0KKwljYXNlIG1hcGxlX3JhbmdlXzY0Og0KKwljYXNlIG1hcGxlX2xlYWZf NjQ6DQorCWNhc2UgbWFwbGVfZGVuc2U6DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKwlyZXR1cm4g TlVMTDsNCit9DQorDQorLyoNCisgKiBtdGVfcGl2b3QoKSAtIEdldCB0aGUgcGl2b3QgYXQgQHBp diBvZiB0aGUgbWFwbGUgZW5jb2RlZCBub2RlLg0KKyAqIEBtbjogVGhlIG1hcGxlIGVuY29kZWQg bm9kZS4NCisgKiBAcGl2OiBUaGUgcGl2b3QuDQorICoNCisgKiBSZXR1cm46IHRoZSBwaXZvdCBh dCBAcGl2IG9mIEBtbi4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXRlX3Bp dm90KGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqbW4sDQorCQkJCSB1bnNpZ25lZCBjaGFyIHBp dikNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlID0gbXRlX3RvX25vZGUobW4pOw0KKw0K KwlpZiAocGl2ID49IG10X3Bpdm90c1twaXZdKSB7DQorCQlXQVJOX09OKDEpOw0KKwkJcmV0dXJu IDA7DQorCX0NCisJc3dpdGNoIChtdGVfbm9kZV90eXBlKG1uKSkgew0KKwljYXNlIG1hcGxlX2Fy YW5nZV82NDoNCisJCXJldHVybiBub2RlLT5tYTY0LnBpdm90W3Bpdl07DQorCWNhc2UgbWFwbGVf cmFuZ2VfNjQ6DQorCWNhc2UgbWFwbGVfbGVhZl82NDoNCisJCXJldHVybiBub2RlLT5tcjY0LnBp dm90W3Bpdl07DQorCWNhc2UgbWFwbGVfZGVuc2U6DQorCQlyZXR1cm4gMDsNCisJfQ0KKwlyZXR1 cm4gMDsNCit9DQorDQorLyoNCisgKiBtYXNfc2FmZV9waXZvdCgpIC0gZ2V0IHRoZSBwaXZvdCBh dCBAcGl2IG9yIG1hcy0+bWF4Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBwaXZv dHM6IFRoZSBwb2ludGVyIHRvIHRoZSBtYXBsZSBub2RlIHBpdm90cw0KKyAqIEBwaXY6IFRoZSBw aXZvdCB0byBmZXRjaA0KKyAqIEB0eXBlOiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICoNCisgKiBS ZXR1cm46IFRoZSBwaXZvdCBhdCBAcGl2IHdpdGhpbiB0aGUgbGltaXQgb2YgdGhlIEBwaXZvdHMg YXJyYXksIEBtYXMtPm1heA0KKyAqIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVu c2lnbmVkIGxvbmcNCittYXNfc2FmZV9waXZvdChjb25zdCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcywg dW5zaWduZWQgbG9uZyAqcGl2b3RzLA0KKwkgICAgICAgdW5zaWduZWQgY2hhciBwaXYsIGVudW0g bWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJaWYgKHBpdiA+PSBtdF9waXZvdHNbdHlwZV0pDQorCQly ZXR1cm4gbWFzLT5tYXg7DQorDQorCXJldHVybiBwaXZvdHNbcGl2XTsNCit9DQorDQorLyoNCisg KiBtYXNfc2FmZV9taW4oKSAtIFJldHVybiB0aGUgbWluaW11bSBmb3IgYSBnaXZlbiBvZmZzZXQu DQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQHBpdm90czogVGhlIHBvaW50ZXIgdG8g dGhlIG1hcGxlIG5vZGUgcGl2b3RzDQorICogQG9mZnNldDogVGhlIG9mZnNldCBpbnRvIHRoZSBw aXZvdCBhcnJheQ0KKyAqDQorICogUmV0dXJuOiBUaGUgbWluaW11bSByYW5nZSB2YWx1ZSB0aGF0 IGlzIGNvbnRhaW5lZCBpbiBAb2Zmc2V0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQg bG9uZw0KK21hc19zYWZlX21pbihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyAq cGl2b3RzLCB1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorCWlmIChsaWtlbHkob2Zmc2V0KSkN CisJCXJldHVybiBwaXZvdHNbb2Zmc2V0IC0gMV0gKyAxOw0KKw0KKwlyZXR1cm4gbWFzLT5taW47 DQorfQ0KKw0KKy8qDQorICogbWFzX2xvZ2ljYWxfcGl2b3QoKSAtIEdldCB0aGUgbG9naWNhbCBw aXZvdCBvZiBhIGdpdmVuIG9mZnNldC4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBA cGl2b3RzOiBUaGUgcG9pbnRlciB0byB0aGUgbWFwbGUgbm9kZSBwaXZvdHMNCisgKiBAb2Zmc2V0 OiBUaGUgb2Zmc2V0IGludG8gdGhlIHBpdm90IGFycmF5DQorICogQHR5cGU6IFRoZSBtYXBsZSBu b2RlIHR5cGUNCisgKg0KKyAqIFdoZW4gdGhlcmUgaXMgbm8gdmFsdWUgYXQgYSBwaXZvdCAoYmV5 b25kIHRoZSBlbmQgb2YgdGhlIGRhdGEpLCB0aGVuIHRoZQ0KKyAqIHBpdm90IGlzIGFjdHVhbGx5 IEBtYXMtPm1heC4NCisgKg0KKyAqIFJldHVybjogdGhlIGxvZ2ljYWwgcGl2b3Qgb2YgYSBnaXZl biBAb2Zmc2V0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZw0KK21hc19sb2dp Y2FsX3Bpdm90KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nICpwaXZvdHMsDQor CQkgIHVuc2lnbmVkIGNoYXIgb2Zmc2V0LCBlbnVtIG1hcGxlX3R5cGUgdHlwZSkNCit7DQorCXVu c2lnbmVkIGxvbmcgbHBpdiA9IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2b3RzLCBvZmZzZXQsIHR5 cGUpOw0KKw0KKwlpZiAobGlrZWx5KGxwaXYpKQ0KKwkJcmV0dXJuIGxwaXY7DQorDQorCWlmIChs aWtlbHkob2Zmc2V0KSkNCisJCXJldHVybiBtYXMtPm1heDsNCisNCisJcmV0dXJuIGxwaXY7DQor fQ0KKw0KKy8qDQorICogbXRlX3NldF9waXZvdCgpIC0gU2V0IGEgcGl2b3QgdG8gYSB2YWx1ZSBp biBhbiBlbmNvZGVkIG1hcGxlIG5vZGUuDQorICogQG1uOiBUaGUgZW5jb2RlZCBtYXBsZSBub2Rl DQorICogQHBpdjogVGhlIHBpdm90IG9mZnNldA0KKyAqIEB2YWw6IFRoZSB2YWx1ZSBvZiB0aGUg cGl2b3QNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRlX3NldF9waXZvdChzdHJ1Y3QgbWFw bGVfZW5vZGUgKm1uLCB1bnNpZ25lZCBjaGFyIHBpdiwNCisJCQkJdW5zaWduZWQgbG9uZyB2YWwp DQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSA9IG10ZV90b19ub2RlKG1uKTsNCisJZW51 bSBtYXBsZV90eXBlIHR5cGUgPSBtdGVfbm9kZV90eXBlKG1uKTsNCisNCisJQlVHX09OKHBpdiA+ PSBtdF9waXZvdHNbdHlwZV0pOw0KKwlzd2l0Y2ggKHR5cGUpIHsNCisJZGVmYXVsdDoNCisJY2Fz ZSBtYXBsZV9yYW5nZV82NDoNCisJY2FzZSBtYXBsZV9sZWFmXzY0Og0KKwkJbm9kZS0+bXI2NC5w aXZvdFtwaXZdID0gdmFsOw0KKwkJYnJlYWs7DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJ bm9kZS0+bWE2NC5waXZvdFtwaXZdID0gdmFsOw0KKwkJYnJlYWs7DQorCWNhc2UgbWFwbGVfZGVu c2U6DQorCQlicmVhazsNCisJfQ0KKw0KK30NCisNCisvKg0KKyAqIG1hX3Nsb3RzKCkgLSBHZXQg YSBwb2ludGVyIHRvIHRoZSBtYXBsZSBub2RlIHNsb3RzLg0KKyAqIEBtbjogVGhlIG1hcGxlIG5v ZGUNCisgKiBAbXQ6IFRoZSBtYXBsZSBub2RlIHR5cGUNCisgKg0KKyAqIFJldHVybjogQSBwb2lu dGVyIHRvIHRoZSBtYXBsZSBub2RlIHNsb3RzDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIF9f cmN1ICoqbWFfc2xvdHMoc3RydWN0IG1hcGxlX25vZGUgKm1uLCBlbnVtIG1hcGxlX3R5cGUgbXQp DQorew0KKwlzd2l0Y2ggKG10KSB7DQorCWRlZmF1bHQ6DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0 Og0KKwkJcmV0dXJuIG1uLT5tYTY0LnNsb3Q7DQorCWNhc2UgbWFwbGVfcmFuZ2VfNjQ6DQorCWNh c2UgbWFwbGVfbGVhZl82NDoNCisJCXJldHVybiBtbi0+bXI2NC5zbG90Ow0KKwljYXNlIG1hcGxl X2RlbnNlOg0KKwkJcmV0dXJuIG1uLT5zbG90Ow0KKwl9DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUg Ym9vbCBtdF9sb2NrZWQoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJcmV0dXJu IG10X2V4dGVybmFsX2xvY2sobXQpID8gbXRfbG9ja19pc19oZWxkKG10KSA6DQorCQlsb2NrZGVw X2lzX2hlbGQoJm10LT5tYV9sb2NrKTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkICptdF9z bG90KGNvbnN0IHN0cnVjdCBtYXBsZV90cmVlICptdCwNCisJCXZvaWQgX19yY3UgKipzbG90cywg dW5zaWduZWQgY2hhciBvZmZzZXQpDQorew0KKwlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX2NoZWNr KHNsb3RzW29mZnNldF0sIG10X2xvY2tlZChtdCkpOw0KK30NCisNCisvKg0KKyAqIG1hc19zbG90 X2xvY2tlZCgpIC0gR2V0IHRoZSBzbG90IHZhbHVlIHdoZW4gaG9sZGluZyB0aGUgbWFwbGUgdHJl ZSBsb2NrLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBzbG90czogVGhlIHBvaW50 ZXIgdG8gdGhlIHNsb3RzDQorICogQG9mZnNldDogVGhlIG9mZnNldCBpbnRvIHRoZSBzbG90cyBh cnJheSB0byBmZXRjaA0KKyAqDQorICogUmV0dXJuOiBUaGUgZW50cnkgc3RvcmVkIGluIEBzbG90 cyBhdCB0aGUgQG9mZnNldC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19zbG90X2xv Y2tlZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCBfX3JjdSAqKnNsb3RzLA0KKwkJCQkgICAg ICAgdW5zaWduZWQgY2hhciBvZmZzZXQpDQorew0KKwlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX3By b3RlY3RlZChzbG90c1tvZmZzZXRdLCBtdF9sb2NrZWQobWFzLT50cmVlKSk7DQorfQ0KKw0KKy8q DQorICogbWFzX3Nsb3QoKSAtIEdldCB0aGUgc2xvdCB2YWx1ZSB3aGVuIG5vdCBob2xkaW5nIHRo ZSBtYXBsZSB0cmVlIGxvY2suDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQHNsb3Rz OiBUaGUgcG9pbnRlciB0byB0aGUgc2xvdHMNCisgKiBAb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8g dGhlIHNsb3RzIGFycmF5IHRvIGZldGNoDQorICoNCisgKiBSZXR1cm46IFRoZSBlbnRyeSBzdG9y ZWQgaW4gQHNsb3RzIGF0IHRoZSBAb2Zmc2V0DQorICovDQorc3RhdGljIGlubGluZSB2b2lkICpt YXNfc2xvdChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCBfX3JjdSAqKnNsb3RzLA0KKwkJCSAg ICAgdW5zaWduZWQgY2hhciBvZmZzZXQpDQorew0KKwlyZXR1cm4gbXRfc2xvdChtYXMtPnRyZWUs IHNsb3RzLCBvZmZzZXQpOw0KK30NCisNCisvKg0KKyAqIG1hc19yb290KCkgLSBHZXQgdGhlIG1h cGxlIHRyZWUgcm9vdC4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUuDQorICoNCisgKiBSZXR1 cm46IFRoZSBwb2ludGVyIHRvIHRoZSByb290IG9mIHRoZSB0cmVlDQorICovDQorc3RhdGljIGlu bGluZSB2b2lkICptYXNfcm9vdChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXJldHVybiBy Y3VfZGVyZWZlcmVuY2VfY2hlY2sobWFzLT50cmVlLT5tYV9yb290LCBtdF9sb2NrZWQobWFzLT50 cmVlKSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbXRfcm9vdF9sb2NrZWQoc3RydWN0 IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQo bXQtPm1hX3Jvb3QsIG10X2xvY2tlZChtdCkpOw0KK30NCisNCisvKg0KKyAqIG1hc19yb290X2xv Y2tlZCgpIC0gR2V0IHRoZSBtYXBsZSB0cmVlIHJvb3Qgd2hlbiBob2xkaW5nIHRoZSBtYXBsZSB0 cmVlIGxvY2suDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0KKyAqDQorICogUmV0dXJuOiBU aGUgcG9pbnRlciB0byB0aGUgcm9vdCBvZiB0aGUgdHJlZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUg dm9pZCAqbWFzX3Jvb3RfbG9ja2VkKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJu IG10X3Jvb3RfbG9ja2VkKG1hcy0+dHJlZSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0 IG1hcGxlX21ldGFkYXRhICptYV9tZXRhKHN0cnVjdCBtYXBsZV9ub2RlICptbiwNCisJCQkJCSAg ICAgZW51bSBtYXBsZV90eXBlIG10KQ0KK3sNCisJc3dpdGNoIChtdCkgew0KKwljYXNlIG1hcGxl X2FyYW5nZV82NDoNCisJCXJldHVybiAmbW4tPm1hNjQubWV0YTsNCisJZGVmYXVsdDoNCisJCXJl dHVybiAmbW4tPm1yNjQubWV0YTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hX3NldF9tZXRhKCkg LSBTZXQgdGhlIG1ldGFkYXRhIGluZm9ybWF0aW9uIG9mIGEgbm9kZS4NCisgKiBAbW46IFRoZSBt YXBsZSBub2RlDQorICogQG10OiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICogQG9mZnNldDogVGhl IG9mZnNldCBvZiB0aGUgaGlnaGVzdCBzdWItZ2FwIGluIHRoaXMgbm9kZS4NCisgKiBAZW5kOiBU aGUgZW5kIG9mIHRoZSBkYXRhIGluIHRoaXMgbm9kZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZv aWQgbWFfc2V0X21ldGEoc3RydWN0IG1hcGxlX25vZGUgKm1uLCBlbnVtIG1hcGxlX3R5cGUgbXQs DQorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyIGVuZCkNCit7 DQorCXN0cnVjdCBtYXBsZV9tZXRhZGF0YSAqbWV0YSA9IG1hX21ldGEobW4sIG10KTsNCisNCisJ bWV0YS0+Z2FwID0gb2Zmc2V0Ow0KKwltZXRhLT5lbmQgPSBlbmQ7DQorfQ0KKw0KKy8qDQorICog bWFfbWV0YV9lbmQoKSAtIEdldCB0aGUgZGF0YSBlbmQgb2YgYSBub2RlIGZyb20gdGhlIG1ldGFk YXRhDQorICogQG1uOiBUaGUgbWFwbGUgbm9kZQ0KKyAqIEBtdDogVGhlIG1hcGxlIG5vZGUgdHlw ZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBtYV9tZXRhX2VuZChzdHJ1Y3Qg bWFwbGVfbm9kZSAqbW4sDQorCQkJCQllbnVtIG1hcGxlX3R5cGUgbXQpDQorew0KKwlzdHJ1Y3Qg bWFwbGVfbWV0YWRhdGEgKm1ldGEgPSBtYV9tZXRhKG1uLCBtdCk7DQorDQorCXJldHVybiBtZXRh LT5lbmQ7DQorfQ0KKw0KKy8qDQorICogbWFfbWV0YV9nYXAoKSAtIEdldCB0aGUgbGFyZ2VzdCBn YXAgbG9jYXRpb24gb2YgYSBub2RlIGZyb20gdGhlIG1ldGFkYXRhDQorICogQG1uOiBUaGUgbWFw bGUgbm9kZQ0KKyAqIEBtdDogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqLw0KK3N0YXRpYyBpbmxp bmUgdW5zaWduZWQgY2hhciBtYV9tZXRhX2dhcChzdHJ1Y3QgbWFwbGVfbm9kZSAqbW4sDQorCQkJ CQllbnVtIG1hcGxlX3R5cGUgbXQpDQorew0KKwlCVUdfT04obXQgIT0gbWFwbGVfYXJhbmdlXzY0 KTsNCisNCisJcmV0dXJuIG1uLT5tYTY0Lm1ldGEuZ2FwOw0KK30NCisNCisvKg0KKyAqIG1hX3Nl dF9tZXRhX2dhcCgpIC0gU2V0IHRoZSBsYXJnZXN0IGdhcCBsb2NhdGlvbiBpbiBhIG5vZGVzIG1l dGFkYXRhDQorICogQG1uOiBUaGUgbWFwbGUgbm9kZQ0KKyAqIEBtbjogVGhlIG1hcGxlIG5vZGUg dHlwZQ0KKyAqIEBvZmZzZXQ6IFRoZSBsb2NhdGlvbiBvZiB0aGUgbGFyZ2VzdCBnYXAuDQorICov DQorc3RhdGljIGlubGluZSB2b2lkIG1hX3NldF9tZXRhX2dhcChzdHJ1Y3QgbWFwbGVfbm9kZSAq bW4sIGVudW0gbWFwbGVfdHlwZSBtdCwNCisJCQkJICAgdW5zaWduZWQgY2hhciBvZmZzZXQpDQor ew0KKw0KKwlzdHJ1Y3QgbWFwbGVfbWV0YWRhdGEgKm1ldGEgPSBtYV9tZXRhKG1uLCBtdCk7DQor DQorCW1ldGEtPmdhcCA9IG9mZnNldDsNCit9DQorDQorLyoNCisgKiBtYXRfYWRkKCkgLSBBZGQg YSBAZGVhZF9lbm9kZSB0byB0aGUgbWFfdG9waWFyeSBvZiBhIGxpc3Qgb2YgZGVhZCBub2Rlcy4N CisgKiBAbWF0IC0gdGhlIG1hX3RvcGlhcnksIGEgbGlua2VkIGxpc3Qgb2YgZGVhZCBub2Rlcy4N CisgKiBAZGVhZF9lbm9kZSAtIHRoZSBub2RlIHRvIGJlIG1hcmtlZCBhcyBkZWFkIGFuZCBhZGRl ZCB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdA0KKyAqDQorICogQWRkIHRoZSBAZGVhZF9lbm9kZSB0 byB0aGUgbGlua2VkIGxpc3QgaW4gQG1hdC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWF0 X2FkZChzdHJ1Y3QgbWFfdG9waWFyeSAqbWF0LA0KKwkJCSAgIHN0cnVjdCBtYXBsZV9lbm9kZSAq ZGVhZF9lbm9kZSkNCit7DQorCW10ZV9zZXRfbm9kZV9kZWFkKGRlYWRfZW5vZGUpOw0KKwltdGVf dG9fbWF0KGRlYWRfZW5vZGUpLT5uZXh0ID0gTlVMTDsNCisJaWYgKCFtYXQtPnRhaWwpIHsNCisJ CW1hdC0+dGFpbCA9IG1hdC0+aGVhZCA9IGRlYWRfZW5vZGU7DQorCQlyZXR1cm47DQorCX0NCisN CisJbXRlX3RvX21hdChtYXQtPnRhaWwpLT5uZXh0ID0gZGVhZF9lbm9kZTsNCisJbWF0LT50YWls ID0gZGVhZF9lbm9kZTsNCit9DQorDQorc3RhdGljIHZvaWQgbXRlX2Rlc3Ryb3lfd2FsayhzdHJ1 Y3QgbWFwbGVfZW5vZGUgKiwgc3RydWN0IG1hcGxlX3RyZWUgKik7DQorc3RhdGljIGlubGluZSB2 b2lkIG1hc19mcmVlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKnVz ZWQpOw0KKw0KKy8qDQorICogbWFzX21hdF9mcmVlKCkgLSBGcmVlIGFsbCBub2RlcyBpbiBhIGRl YWQgbGlzdC4NCisgKiBAbWFzIC0gdGhlIG1hcGxlIHN0YXRlDQorICogQG1hdCAtIHRoZSBtYV90 b3BpYXJ5IGxpbmtlZCBsaXN0IG9mIGRlYWQgbm9kZXMgdG8gZnJlZS4NCisgKg0KKyAqIEZyZWUg d2FsayBhIGRlYWQgbGlzdC4NCisgKi8NCitzdGF0aWMgdm9pZCBtYXNfbWF0X2ZyZWUoc3RydWN0 IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYV90b3BpYXJ5ICptYXQpDQorew0KKwlzdHJ1Y3QgbWFw bGVfZW5vZGUgKm5leHQ7DQorDQorCXdoaWxlIChtYXQtPmhlYWQpIHsNCisJCW5leHQgPSBtdGVf dG9fbWF0KG1hdC0+aGVhZCktPm5leHQ7DQorCQltYXNfZnJlZShtYXMsIG1hdC0+aGVhZCk7DQor CQltYXQtPmhlYWQgPSBuZXh0Ow0KKwl9DQorfQ0KKw0KKy8qDQorICogbWFzX21hdF9kZXN0cm95 KCkgLSBGcmVlIGFsbCBub2RlcyBhbmQgc3VidHJlZXMgaW4gYSBkZWFkIGxpc3QuDQorICogQG1h cyAtIHRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtYXQgLSB0aGUgbWFfdG9waWFyeSBsaW5rZWQgbGlz dCBvZiBkZWFkIG5vZGVzIHRvIGZyZWUuDQorICoNCisgKiBEZXN0cm95IHdhbGsgYSBkZWFkIGxp c3QuDQorICovDQorc3RhdGljIHZvaWQgbWFzX21hdF9kZXN0cm95KHN0cnVjdCBtYV9zdGF0ZSAq bWFzLCBzdHJ1Y3QgbWFfdG9waWFyeSAqbWF0KQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2RlICpu ZXh0Ow0KKw0KKwl3aGlsZSAobWF0LT5oZWFkKSB7DQorCQluZXh0ID0gbXRlX3RvX21hdChtYXQt PmhlYWQpLT5uZXh0Ow0KKwkJbXRlX2Rlc3Ryb3lfd2FsayhtYXQtPmhlYWQsIG1hdC0+bXRyZWUp Ow0KKwkJbWF0LT5oZWFkID0gbmV4dDsNCisJfQ0KK30NCisvKg0KKyAqIG1hc19kZXNjZW5kKCkg LSBEZXNjZW5kIGludG8gdGhlIHNsb3Qgc3RvcmVkIGluIHRoZSBtYV9zdGF0ZS4NCisgKiBAbWFz IC0gdGhlIG1hcGxlIHN0YXRlLg0KKyAqDQorICogTm90ZTogTm90IFJDVSBzYWZlLCBvbmx5IHVz ZSBpbiB3cml0ZSBzaWRlIG9yIGRlYnVnIGNvZGUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lk IG1hc19kZXNjZW5kKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJZW51bSBtYXBsZV90eXBl IHR5cGU7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5v ZGU7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisNCisJbm9kZSA9IG1hc19tbihtYXMpOw0KKwl0 eXBlID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9k ZSwgdHlwZSk7DQorCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgdHlwZSk7DQorDQorCWlmIChtYXMt Pm9mZnNldCkNCisJCW1hcy0+bWluID0gcGl2b3RzW21hcy0+b2Zmc2V0IC0gMV0gKyAxOw0KKwlt YXMtPm1heCA9IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2b3RzLCBtYXMtPm9mZnNldCwgdHlwZSk7 DQorCW1hcy0+bm9kZSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG1hcy0+b2Zmc2V0KTsNCit9DQor DQorLyoNCisgKiBtdGVfc2V0X2dhcCgpIC0gU2V0IGEgbWFwbGUgbm9kZSBnYXAuDQorICogQG1u OiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlDQorICogQGdhcDogVGhlIG9mZnNldCBvZiB0aGUgZ2Fw IHRvIHNldA0KKyAqIEB2YWw6IFRoZSBnYXAgdmFsdWUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZv aWQgbXRlX3NldF9nYXAoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICptbiwNCisJCQkJIHVuc2ln bmVkIGNoYXIgZ2FwLCB1bnNpZ25lZCBsb25nIHZhbCkNCit7DQorCXN3aXRjaCAobXRlX25vZGVf dHlwZShtbikpIHsNCisJZGVmYXVsdDoNCisJCWJyZWFrOw0KKwljYXNlIG1hcGxlX2FyYW5nZV82 NDoNCisJCW10ZV90b19ub2RlKG1uKS0+bWE2NC5nYXBbZ2FwXSA9IHZhbDsNCisJCWJyZWFrOw0K Kwl9DQorfQ0KKw0KKy8qDQorICogbWFzX2FzY2VuZCgpIC0gV2FsayB1cCBhIGxldmVsIG9mIHRo ZSB0cmVlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogU2V0cyB0aGUgQG1h cy0+bWF4IGFuZCBAbWFzLT5taW4gdG8gdGhlIGNvcnJlY3QgdmFsdWVzIHdoZW4gd2Fsa2luZyB1 cC4gIFRoaXMNCisgKiBtYXkgY2F1c2Ugc2V2ZXJhbCBsZXZlbHMgb2Ygd2Fsa2luZyB1cCB0byBm aW5kIHRoZSBjb3JyZWN0IG1pbiBhbmQgbWF4Lg0KKyAqIE1heSBmaW5kIGEgZGVhZCBub2RlIHdo aWNoIHdpbGwgY2F1c2UgYSBwcmVtYXR1cmUgcmV0dXJuLg0KKyAqIFJldHVybjogMSBvbiBkZWFk IG5vZGUsIDAgb3RoZXJ3aXNlDQorICovDQorc3RhdGljIGludCBtYXNfYXNjZW5kKHN0cnVjdCBt YV9zdGF0ZSAqbWFzKQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2RlICpwX2Vub2RlOyAvKiBwYXJl bnQgZW5vZGUuICovDQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqYV9lbm9kZTsgLyogYW5jZXN0b3Ig ZW5vZGUuICovDQorCXN0cnVjdCBtYXBsZV9ub2RlICphX25vZGU7IC8qIGFuY2VzdG9yIG5vZGUu ICovDQorCXN0cnVjdCBtYXBsZV9ub2RlICpwX25vZGU7IC8qIHBhcmVudCBub2RlLiAqLw0KKwl1 bnNpZ25lZCBjaGFyIGFfc2xvdDsNCisJZW51bSBtYXBsZV90eXBlIGFfdHlwZTsNCisJdW5zaWdu ZWQgbG9uZyBtaW4sIG1heDsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKwl1bnNpZ25lZCBj aGFyIG9mZnNldDsNCisJYm9vbCBzZXRfbWF4ID0gZmFsc2UsIHNldF9taW4gPSBmYWxzZTsNCisN CisJYV9ub2RlID0gbWFzX21uKG1hcyk7DQorCWlmIChtYV9pc19yb290KGFfbm9kZSkpIHsNCisJ CW1hcy0+b2Zmc2V0ID0gMDsNCisJCXJldHVybiAwOw0KKwl9DQorDQorCXBfbm9kZSA9IG10ZV9w YXJlbnQobWFzLT5ub2RlKTsNCisJaWYgKHVubGlrZWx5KGFfbm9kZSA9PSBwX25vZGUpKQ0KKwkJ cmV0dXJuIDE7DQorCWFfdHlwZSA9IG1hc19wYXJlbnRfZW51bShtYXMsIG1hcy0+bm9kZSk7DQor CW9mZnNldCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpOw0KKwlhX2Vub2RlID0gbXRfbWtf bm9kZShwX25vZGUsIGFfdHlwZSk7DQorDQorCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSBhbGwgcGFy ZW50IGluZm9ybWF0aW9uIGlzIHN0aWxsIGFjY3VyYXRlICovDQorCWlmIChwX25vZGUgIT0gbXRl X3BhcmVudChtYXMtPm5vZGUpKQ0KKwkJcmV0dXJuIDE7DQorDQorCW1hcy0+bm9kZSA9IGFfZW5v ZGU7DQorCW1hcy0+b2Zmc2V0ID0gb2Zmc2V0Ow0KKw0KKwlpZiAobXRlX2lzX3Jvb3QoYV9lbm9k ZSkpIHsNCisJCW1hcy0+bWF4ID0gVUxPTkdfTUFYOw0KKwkJbWFzLT5taW4gPSAwOw0KKwkJcmV0 dXJuIDA7DQorCX0NCisNCisJbWluID0gMDsNCisJbWF4ID0gVUxPTkdfTUFYOw0KKwlkbyB7DQor CQlwX2Vub2RlID0gYV9lbm9kZTsNCisJCWFfdHlwZSA9IG1hc19wYXJlbnRfZW51bShtYXMsIHBf ZW5vZGUpOw0KKwkJYV9ub2RlID0gbXRlX3BhcmVudChwX2Vub2RlKTsNCisJCWFfc2xvdCA9IG10 ZV9wYXJlbnRfc2xvdChwX2Vub2RlKTsNCisJCXBpdm90cyA9IG1hX3Bpdm90cyhhX25vZGUsIGFf dHlwZSk7DQorCQlhX2Vub2RlID0gbXRfbWtfbm9kZShhX25vZGUsIGFfdHlwZSk7DQorDQorCQlp ZiAoIXNldF9taW4gJiYgYV9zbG90KSB7DQorCQkJc2V0X21pbiA9IHRydWU7DQorCQkJbWluID0g cGl2b3RzW2Ffc2xvdCAtIDFdICsgMTsNCisJCX0NCisNCisJCWlmICghc2V0X21heCAmJiBhX3Ns b3QgPCBtdF9waXZvdHNbYV90eXBlXSkgew0KKwkJCXNldF9tYXggPSB0cnVlOw0KKwkJCW1heCA9 IHBpdm90c1thX3Nsb3RdOw0KKwkJfQ0KKw0KKwkJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShh X25vZGUpKSkNCisJCQlyZXR1cm4gMTsNCisNCisJCWlmICh1bmxpa2VseShtYV9pc19yb290KGFf bm9kZSkpKQ0KKwkJCWJyZWFrOw0KKw0KKwl9IHdoaWxlICghc2V0X21pbiB8fCAhc2V0X21heCk7 DQorDQorCW1hcy0+bWF4ID0gbWF4Ow0KKwltYXMtPm1pbiA9IG1pbjsNCisJcmV0dXJuIDA7DQor fQ0KKw0KKy8qDQorICogbWFzX3BvcF9ub2RlKCkgLSBHZXQgYSBwcmV2aW91c2x5IGFsbG9jYXRl ZCBtYXBsZSBub2RlIGZyb20gdGhlIG1hcGxlIHN0YXRlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBz dGF0ZQ0KKyAqDQorICogUmV0dXJuOiBBIHBvaW50ZXIgdG8gYSBtYXBsZSBub2RlLg0KKyAqLw0K K3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX25vZGUgKm1hc19wb3Bfbm9kZShzdHJ1Y3QgbWFf c3RhdGUgKm1hcykNCit7DQorCXN0cnVjdCBtYXBsZV9hbGxvYyAqcmV0LCAqbm9kZSA9IG1hcy0+ YWxsb2M7DQorCXVuc2lnbmVkIGxvbmcgdG90YWwgPSBtYXNfYWxsb2NhdGVkKG1hcyk7DQorDQor CS8qIG5vdGhpbmcgb3IgYSByZXF1ZXN0IHBlbmRpbmcuICovDQorCWlmICh1bmxpa2VseSghdG90 YWwpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWlmICh0b3RhbCA9PSAxKSB7DQorCQkvKiBzaW5n bGUgYWxsb2NhdGlvbiBpbiB0aGlzIG1hX3N0YXRlICovDQorCQltYXMtPmFsbG9jID0gTlVMTDsN CisJCXJldCA9IG5vZGU7DQorCQlnb3RvIHNpbmdsZV9ub2RlOw0KKwl9DQorDQorCWlmICghbm9k ZS0+bm9kZV9jb3VudCkgew0KKwkJLyogU2luZ2xlIGFsbG9jYXRpb24gaW4gdGhpcyBub2RlLiAq Lw0KKwkJbWFzLT5hbGxvYyA9IG5vZGUtPnNsb3RbMF07DQorCQlub2RlLT5zbG90WzBdID0gTlVM TDsNCisJCW1hcy0+YWxsb2MtPnRvdGFsID0gbm9kZS0+dG90YWwgLSAxOw0KKwkJcmV0ID0gbm9k ZTsNCisJCWdvdG8gbmV3X2hlYWQ7DQorCX0NCisNCisJbm9kZS0+dG90YWwtLTsNCisJcmV0ID0g bm9kZS0+c2xvdFtub2RlLT5ub2RlX2NvdW50XTsNCisJbm9kZS0+c2xvdFtub2RlLT5ub2RlX2Nv dW50LS1dID0gTlVMTDsNCisNCitzaW5nbGVfbm9kZToNCituZXdfaGVhZDoNCisJcmV0LT50b3Rh bCA9IDA7DQorCXJldC0+bm9kZV9jb3VudCA9IDA7DQorCWlmIChyZXQtPnJlcXVlc3RfY291bnQp IHsNCisJCW1hc19zZXRfYWxsb2NfcmVxKG1hcywgcmV0LT5yZXF1ZXN0X2NvdW50ICsgMSk7DQor CQlyZXQtPnJlcXVlc3RfY291bnQgPSAwOw0KKwl9DQorCXJldHVybiAoc3RydWN0IG1hcGxlX25v ZGUgKilyZXQ7DQorfQ0KKw0KKy8qDQorICogbWFzX3B1c2hfbm9kZSgpIC0gUHVzaCBhIG5vZGUg YmFjayBvbiB0aGUgbWFwbGUgc3RhdGUgYWxsb2NhdGlvbi4NCisgKiBAbWFzOiBUaGUgbWFwbGUg c3RhdGUNCisgKiBAdXNlZDogVGhlIHVzZWQgbWFwbGUgbm9kZQ0KKyAqDQorICogU3RvcmVzIHRo ZSBtYXBsZSBub2RlIGJhY2sgaW50byBAbWFzLT5hbGxvYyBmb3IgcmV1c2UuICBVcGRhdGVzIGFs bG9jYXRlZCBhbmQNCisgKiByZXF1ZXN0ZWQgbm9kZSBjb3VudCBhcyBuZWNlc3NhcnkuDQorICov DQorc3RhdGljIGlubGluZSB2b2lkIG1hc19wdXNoX25vZGUoc3RydWN0IG1hX3N0YXRlICptYXMs IHN0cnVjdCBtYXBsZV9ub2RlICp1c2VkKQ0KK3sNCisJc3RydWN0IG1hcGxlX2FsbG9jICpyZXVz ZSA9IChzdHJ1Y3QgbWFwbGVfYWxsb2MgKil1c2VkOw0KKwlzdHJ1Y3QgbWFwbGVfYWxsb2MgKmhl YWQgPSBtYXMtPmFsbG9jOw0KKwl1bnNpZ25lZCBsb25nIGNvdW50Ow0KKwl1bnNpZ25lZCBpbnQg cmVxdWVzdGVkID0gbWFzX2FsbG9jX3JlcShtYXMpOw0KKw0KKwltZW1zZXQocmV1c2UsIDAsIHNp emVvZigqcmV1c2UpKTsNCisJY291bnQgPSBtYXNfYWxsb2NhdGVkKG1hcyk7DQorDQorCWlmIChj b3VudCAmJiAoaGVhZC0+bm9kZV9jb3VudCA8IE1BUExFX0FMTE9DX1NMT1RTIC0gMSkpIHsNCisJ CWlmIChoZWFkLT5zbG90WzBdKQ0KKwkJCWhlYWQtPm5vZGVfY291bnQrKzsNCisJCWhlYWQtPnNs b3RbaGVhZC0+bm9kZV9jb3VudF0gPSByZXVzZTsNCisJCWhlYWQtPnRvdGFsKys7DQorCQlnb3Rv IGRvbmU7DQorCX0NCisNCisJcmV1c2UtPnRvdGFsID0gMTsNCisJaWYgKChoZWFkKSAmJiAhKCh1 bnNpZ25lZCBsb25nKWhlYWQgJiAweDEpKSB7DQorCQloZWFkLT5yZXF1ZXN0X2NvdW50ID0gMDsN CisJCXJldXNlLT5zbG90WzBdID0gaGVhZDsNCisJCXJldXNlLT50b3RhbCArPSBoZWFkLT50b3Rh bDsNCisJfQ0KKw0KKwltYXMtPmFsbG9jID0gcmV1c2U7DQorZG9uZToNCisJaWYgKHJlcXVlc3Rl ZCA+IDEpDQorCQltYXNfc2V0X2FsbG9jX3JlcShtYXMsIHJlcXVlc3RlZCAtIDEpOw0KK30NCisN CisvKg0KKyAqIG1hc19hbGxvY19ub2RlcygpIC0gQWxsb2NhdGUgbm9kZXMgaW50byBhIG1hcGxl IHN0YXRlDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGdmcDogVGhlIEdGUCBGbGFn cw0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfYWxsb2Nfbm9kZXMoc3RydWN0IG1hX3N0 YXRlICptYXMsIGdmcF90IGdmcCkNCit7DQorCXN0cnVjdCBtYXBsZV9hbGxvYyAqbm9kZTsNCisJ c3RydWN0IG1hcGxlX2FsbG9jICoqbm9kZXAgPSAmbWFzLT5hbGxvYzsNCisJdW5zaWduZWQgbG9u ZyBhbGxvY2F0ZWQgPSBtYXNfYWxsb2NhdGVkKG1hcyk7DQorCXVuc2lnbmVkIGxvbmcgc3VjY2Vz cyA9IGFsbG9jYXRlZDsNCisJdW5zaWduZWQgaW50IHJlcXVlc3RlZCA9IG1hc19hbGxvY19yZXEo bWFzKTsNCisJdW5zaWduZWQgaW50IGNvdW50Ow0KKwl2b2lkICoqc2xvdHMgPSBOVUxMOw0KKwl1 bnNpZ25lZCBpbnQgbWF4X3JlcSA9IDA7DQorDQorCWlmICghcmVxdWVzdGVkKQ0KKwkJcmV0dXJu Ow0KKw0KKwltYXNfc2V0X2FsbG9jX3JlcShtYXMsIDApOw0KKwlpZiAobWFzLT5tYXNfZmxhZ3Mg JiBNQV9TVEFURV9QUkVBTExPQykgew0KKwkJaWYgKGFsbG9jYXRlZCkNCisJCQlyZXR1cm47DQor CQlXQVJOX09OKCFhbGxvY2F0ZWQpOw0KKwl9DQorDQorCWlmICghYWxsb2NhdGVkIHx8IG1hcy0+ YWxsb2MtPm5vZGVfY291bnQgPT0gTUFQTEVfQUxMT0NfU0xPVFMgLSAxKSB7DQorCQlub2RlID0g KHN0cnVjdCBtYXBsZV9hbGxvYyAqKW10X2FsbG9jX29uZShnZnApOw0KKwkJaWYgKCFub2RlKQ0K KwkJCWdvdG8gbm9tZW1fb25lOw0KKw0KKwkJaWYgKGFsbG9jYXRlZCkNCisJCQlub2RlLT5zbG90 WzBdID0gbWFzLT5hbGxvYzsNCisNCisJCXN1Y2Nlc3MrKzsNCisJCW1hcy0+YWxsb2MgPSBub2Rl Ow0KKwkJcmVxdWVzdGVkLS07DQorCX0NCisNCisJbm9kZSA9IG1hcy0+YWxsb2M7DQorCXdoaWxl IChyZXF1ZXN0ZWQpIHsNCisJCW1heF9yZXEgPSBNQVBMRV9BTExPQ19TTE9UUzsNCisJCWlmIChu b2RlLT5zbG90WzBdKSB7DQorCQkJdW5zaWduZWQgaW50IG9mZnNldCA9IG5vZGUtPm5vZGVfY291 bnQgKyAxOw0KKw0KKwkJCXNsb3RzID0gKHZvaWQgKiopJm5vZGUtPnNsb3Rbb2Zmc2V0XTsNCisJ CQltYXhfcmVxIC09IG9mZnNldDsNCisJCX0gZWxzZSB7DQorCQkJc2xvdHMgPSAodm9pZCAqKikm bm9kZS0+c2xvdDsNCisJCX0NCisNCisJCW1heF9yZXEgPSBtaW4ocmVxdWVzdGVkLCBtYXhfcmVx KTsNCisJCWNvdW50ID0gbXRfYWxsb2NfYnVsayhnZnAsIG1heF9yZXEsIHNsb3RzKTsNCisJCWlm ICghY291bnQpDQorCQkJZ290byBub21lbV9idWxrOw0KKw0KKwkJbm9kZS0+bm9kZV9jb3VudCAr PSBjb3VudDsNCisJCS8qIHplcm8gaW5kZXhlZC4gKi8NCisJCWlmIChzbG90cyA9PSAodm9pZCAq Kikmbm9kZS0+c2xvdCkNCisJCQlub2RlLT5ub2RlX2NvdW50LS07DQorDQorCQlzdWNjZXNzICs9 IGNvdW50Ow0KKwkJbm9kZXAgPSAmbm9kZS0+c2xvdFswXTsNCisJCW5vZGUgPSAqbm9kZXA7DQor CQlyZXF1ZXN0ZWQgLT0gY291bnQ7DQorCX0NCisJbWFzLT5hbGxvYy0+dG90YWwgPSBzdWNjZXNz Ow0KKwlyZXR1cm47DQorDQorbm9tZW1fYnVsazoNCisJLyogQ2xlYW4gdXAgcG90ZW50aWFsIGZy ZWVkIGFsbG9jYXRpb25zIG9uIGJ1bGsgZmFpbHVyZSAqLw0KKwltZW1zZXQoc2xvdHMsIDAsIG1h eF9yZXEgKiBzaXplb2YodW5zaWduZWQgbG9uZykpOw0KK25vbWVtX29uZToNCisJbWFzX3NldF9h bGxvY19yZXEobWFzLCByZXF1ZXN0ZWQpOw0KKwlpZiAobWFzLT5hbGxvYyAmJiAhKCgodW5zaWdu ZWQgbG9uZyltYXMtPmFsbG9jICYgMHgxKSkpDQorCQltYXMtPmFsbG9jLT50b3RhbCA9IHN1Y2Nl c3M7DQorCW1hc19zZXRfZXJyKG1hcywgLUVOT01FTSk7DQorCXJldHVybjsNCisNCit9DQorDQor LyoNCisgKiBtYXNfZnJlZSgpIC0gRnJlZSBhbiBlbmNvZGVkIG1hcGxlIG5vZGUNCisgKiBAbWFz OiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAdXNlZDogVGhlIGVuY29kZWQgbWFwbGUgbm9kZSB0byBm cmVlLg0KKyAqDQorICogVXNlcyByY3UgZnJlZSBpZiBuZWNlc3NhcnksIHB1c2hlcyBAdXNlZCBi YWNrIG9uIHRoZSBtYXBsZSBzdGF0ZSBhbGxvY2F0aW9ucw0KKyAqIG90aGVyd2lzZS4NCisgKi8N CitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2ZyZWUoc3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVj dCBtYXBsZV9lbm9kZSAqdXNlZCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICp0bXAgPSBtdGVf dG9fbm9kZSh1c2VkKTsNCisNCisJaWYgKG10X2luX3JjdShtYXMtPnRyZWUpKQ0KKwkJbWFfZnJl ZV9yY3UodG1wKTsNCisJZWxzZQ0KKwkJbWFzX3B1c2hfbm9kZShtYXMsIHRtcCk7DQorfQ0KKw0K Ky8qDQorICogbWFzX25vZGVfY291bnQoKSAtIENoZWNrIGlmIGVub3VnaCBub2RlcyBhcmUgYWxs b2NhdGVkIGFuZCByZXF1ZXN0IG1vcmUgaWYNCisgKiB0aGVyZSBpcyBub3QgZW5vdWdoIG5vZGVz Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBjb3VudDogVGhlIG51bWJlciBvZiBu b2RlcyBuZWVkZWQNCisgKiBAZ2ZwOiB0aGUgZ2ZwIGZsYWdzDQorICovDQorc3RhdGljIHZvaWQg bWFzX25vZGVfY291bnRfZ2ZwKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBpbnQgY291bnQsIGdmcF90 IGdmcCkNCit7DQorCXVuc2lnbmVkIGxvbmcgYWxsb2NhdGVkID0gbWFzX2FsbG9jYXRlZChtYXMp Ow0KKw0KKwlpZiAoYWxsb2NhdGVkIDwgY291bnQpIHsNCisJCW1hc19zZXRfYWxsb2NfcmVxKG1h cywgY291bnQgLSBhbGxvY2F0ZWQpOw0KKwkJbWFzX2FsbG9jX25vZGVzKG1hcywgZ2ZwKTsNCisJ fQ0KK30NCisNCisvKg0KKyAqIG1hc19ub2RlX2NvdW50KCkgLSBDaGVjayBpZiBlbm91Z2ggbm9k ZXMgYXJlIGFsbG9jYXRlZCBhbmQgcmVxdWVzdCBtb3JlIGlmDQorICogdGhlcmUgaXMgbm90IGVu b3VnaCBub2Rlcy4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAY291bnQ6IFRoZSBu dW1iZXIgb2Ygbm9kZXMgbmVlZGVkDQorICoNCisgKiBOb3RlOiBVc2VzIEdGUF9OT1dBSVQgfCBf X0dGUF9OT1dBUk4gZm9yIGdmcCBmbGFncy4NCisgKi8NCitzdGF0aWMgdm9pZCBtYXNfbm9kZV9j b3VudChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgaW50IGNvdW50KQ0KK3sNCisJcmV0dXJuIG1hc19u b2RlX2NvdW50X2dmcChtYXMsIGNvdW50LCBHRlBfTk9XQUlUIHwgX19HRlBfTk9XQVJOKTsNCit9 DQorDQorLyoNCisgKiBtYXNfc3RhcnQoKSAtIFNldHMgdXAgbWFwbGUgc3RhdGUgZm9yIG9wZXJh dGlvbnMuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0KKyAqDQorICogSWYgbWFzLT5ub2Rl ID09IE1BU19TVEFSVCwgdGhlbiBzZXQgdGhlIG1pbiwgbWF4LCBkZXB0aCwgYW5kIG9mZnNldCB0 bw0KKyAqIGRlZmF1bHRzLg0KKyAqDQorICogUmV0dXJuOg0KKyAqIC0gSWYgbWFzLT5ub2RlIGlz IGFuIGVycm9yIG9yIG5vdCBNQVNfU1RBUlQsIHJldHVybiBOVUxMLg0KKyAqIC0gSWYgaXQncyBh biBlbXB0eSB0cmVlOiAgICAgTlVMTCAmIG1hcy0+bm9kZSA9PSBNQVNfTk9ORQ0KKyAqIC0gSWYg aXQncyBhIHNpbmdsZSBlbnRyeTogICAgVGhlIGVudHJ5ICYgbWFzLT5ub2RlID09IE1BU19ST09U DQorICogLSBJZiBpdCdzIGEgdHJlZTogICAgICAgICAgICBOVUxMICYgbWFzLT5ub2RlID09IHNh ZmUgcm9vdCBub2RlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX2Vub2RlICpt YXNfc3RhcnQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlpZiAobGlrZWx5KG1hc19pc19z dGFydChtYXMpKSkgew0KKwkJc3RydWN0IG1hcGxlX2Vub2RlICpyb290Ow0KKw0KKwkJbWFzLT5u b2RlID0gTUFTX05PTkU7DQorCQltYXMtPm1pbiA9IDA7DQorCQltYXMtPm1heCA9IFVMT05HX01B WDsNCisJCW1hcy0+ZGVwdGggPSAwOw0KKwkJbWFzLT5vZmZzZXQgPSAwOw0KKw0KKwkJcm9vdCA9 IG1hc19yb290KG1hcyk7DQorCQkvKiBUcmVlIHdpdGggbm9kZXMgKi8NCisJCWlmIChsaWtlbHko eGFfaXNfbm9kZShyb290KSkpIHsNCisJCQltYXMtPm5vZGUgPSBtdGVfc2FmZV9yb290KHJvb3Qp Ow0KKwkJCXJldHVybiBOVUxMOw0KKwkJfQ0KKw0KKwkJLyogZW1wdHkgdHJlZSAqLw0KKwkJaWYg KHVubGlrZWx5KCFyb290KSkgew0KKwkJCW1hcy0+b2Zmc2V0ID0gTUFQTEVfTk9ERV9TTE9UUzsN CisJCQlyZXR1cm4gTlVMTDsNCisJCX0NCisNCisJCS8qIFNpbmdsZSBlbnRyeSB0cmVlICovDQor CQltYXMtPm5vZGUgPSBNQVNfUk9PVDsNCisJCW1hcy0+b2Zmc2V0ID0gTUFQTEVfTk9ERV9TTE9U UzsNCisNCisJCS8qIFNpbmdsZSBlbnRyeSB0cmVlLiAqLw0KKwkJaWYgKG1hcy0+aW5kZXggPiAw KQ0KKwkJCXJldHVybiBOVUxMOw0KKw0KKwkJcmV0dXJuIHJvb3Q7DQorCX0NCisNCisJcmV0dXJu IE5VTEw7DQorfQ0KKw0KKy8qDQorICogbWFfZGF0YV9lbmQoKSAtIEZpbmQgdGhlIGVuZCBvZiB0 aGUgZGF0YSBpbiBhIG5vZGUuDQorICogQG5vZGU6IFRoZSBtYXBsZSBub2RlDQorICogQHR5cGU6 IFRoZSBtYXBsZSBub2RlIHR5cGUNCisgKiBAcGl2b3RzOiBUaGUgYXJyYXkgb2YgcGl2b3RzIGlu IHRoZSBub2RlDQorICogQG1heDogVGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIG5vZGUNCisgKg0K KyAqIFVzZXMgbWV0YWRhdGEgdG8gZmluZCB0aGUgZW5kIG9mIHRoZSBkYXRhIHdoZW4gcG9zc2li bGUuDQorICogUmV0dXJuOiBUaGUgemVybyBpbmRleGVkIGxhc3Qgc2xvdCB3aXRoIGRhdGEgKG1h eSBiZSBudWxsKS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgbWFfZGF0YV9l bmQoc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsDQorCQkJCQllbnVtIG1hcGxlX3R5cGUgdHlwZSwN CisJCQkJCXVuc2lnbmVkIGxvbmcgKnBpdm90cywNCisJCQkJCXVuc2lnbmVkIGxvbmcgbWF4KQ0K K3sNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorDQorCWlmICh0eXBlID09IG1hcGxlX2FyYW5n ZV82NCkNCisJCXJldHVybiBtYV9tZXRhX2VuZChub2RlLCB0eXBlKTsNCisNCisJb2Zmc2V0ID0g bXRfcGl2b3RzW3R5cGVdIC0gMTsNCisJaWYgKGxpa2VseSghcGl2b3RzW29mZnNldF0pKQ0KKwkJ cmV0dXJuIG1hX21ldGFfZW5kKG5vZGUsIHR5cGUpOw0KKw0KKwlpZiAobGlrZWx5KHBpdm90c1tv ZmZzZXRdID09IG1heCkpDQorCQlyZXR1cm4gb2Zmc2V0Ow0KKw0KKwlyZXR1cm4gbXRfcGl2b3Rz W3R5cGVdOw0KK30NCisNCisvKg0KKyAqIG1hc19kYXRhX2VuZCgpIC0gRmluZCB0aGUgZW5kIG9m IHRoZSBkYXRhIChzbG90KS4NCisgKiBAbWFzOiB0aGUgbWFwbGUgc3RhdGUNCisgKg0KKyAqIFRo aXMgbWV0aG9kIGlzIG9wdGltaXplZCB0byBjaGVjayB0aGUgbWV0YWRhdGEgb2YgYSBub2RlIGlm IHRoZSBub2RlIHR5cGUNCisgKiBzdXBwb3J0cyBkYXRhIGVuZCBtZXRhZGF0YS4NCisgKg0KKyAq IFJldHVybjogVGhlIHplcm8gaW5kZXhlZCBsYXN0IHNsb3Qgd2l0aCBkYXRhIChtYXkgYmUgbnVs bCkuDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG1hc19kYXRhX2VuZChzdHJ1 Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlOw0KKwlzdHJ1Y3Qg bWFwbGVfbm9kZSAqbm9kZTsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCXVuc2lnbmVkIGxv bmcgKnBpdm90czsNCisNCisJdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJbm9k ZSA9IG1hc19tbihtYXMpOw0KKwlpZiAodHlwZSA9PSBtYXBsZV9hcmFuZ2VfNjQpDQorCQlyZXR1 cm4gbWFfbWV0YV9lbmQobm9kZSwgdHlwZSk7DQorDQorCXBpdm90cyA9IG1hX3Bpdm90cyhub2Rl LCB0eXBlKTsNCisJb2Zmc2V0ID0gbXRfcGl2b3RzW3R5cGVdIC0gMTsNCisJaWYgKGxpa2VseSgh cGl2b3RzW29mZnNldF0pKQ0KKwkJcmV0dXJuIG1hX21ldGFfZW5kKG5vZGUsIHR5cGUpOw0KKw0K KwlpZiAobGlrZWx5KHBpdm90c1tvZmZzZXRdID09IG1hcy0+bWF4KSkNCisJCXJldHVybiBvZmZz ZXQ7DQorDQorCXJldHVybiBtdF9waXZvdHNbdHlwZV07DQorfQ0KKw0KKy8qDQorICogbWFzX2xl YWZfbWF4X2dhcCgpIC0gUmV0dXJucyB0aGUgbGFyZ2VzdCBnYXAgaW4gYSBsZWFmIG5vZGUNCisg KiBAbWFzIC0gdGhlIG1hcGxlIHN0YXRlDQorICoNCisgKiBSZXR1cm46IFRoZSBtYXhpbXVtIGdh cCBpbiB0aGUgbGVhZi4NCisgKi8NCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYXNfbGVhZl9tYXhf Z2FwKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJZW51bSBtYXBsZV90eXBlIG10Ow0KKwl1 bnNpZ25lZCBsb25nIHBzdGFydCwgZ2FwLCBtYXhfZ2FwOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAq bW47DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwl1 bnNpZ25lZCBjaGFyIGk7DQorCXVuc2lnbmVkIGNoYXIgbWF4X3BpdjsNCisNCisJbXQgPSBtdGVf bm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCW1uID0gbWFzX21uKG1hcyk7DQorCXNsb3RzID0gbWFf c2xvdHMobW4sIG10KTsNCisJbWF4X2dhcCA9IDA7DQorCWlmICh1bmxpa2VseShtYV9pc19kZW5z ZShtdCkpKSB7DQorCQlnYXAgPSAwOw0KKwkJZm9yIChpID0gMDsgaSA8IG10X3Nsb3RzW210XTsg aSsrKSB7DQorCQkJaWYgKHNsb3RzW2ldKSB7DQorCQkJCWlmIChnYXAgPiBtYXhfZ2FwKQ0KKwkJ CQkJbWF4X2dhcCA9IGdhcDsNCisJCQkJZ2FwID0gMDsNCisJCQl9IGVsc2Ugew0KKwkJCQlnYXAr KzsNCisJCQl9DQorCQl9DQorCQlpZiAoZ2FwID4gbWF4X2dhcCkNCisJCQltYXhfZ2FwID0gZ2Fw Ow0KKwkJcmV0dXJuIG1heF9nYXA7DQorCX0NCisNCisJLyoNCisJICogQ2hlY2sgdGhlIGZpcnN0 IGltcGxpZWQgcGl2b3Qgb3B0aW1pemVzIHRoZSBsb29wIGJlbG93IGFuZCBzbG90IDEgbWF5DQor CSAqIGJlIHNraXBwZWQgaWYgdGhlcmUgaXMgYSBnYXAgaW4gc2xvdCAwLg0KKwkgKi8NCisJcGl2 b3RzID0gbWFfcGl2b3RzKG1uLCBtdCk7DQorCWlmIChsaWtlbHkoIXNsb3RzWzBdKSkgew0KKwkJ bWF4X2dhcCA9IHBpdm90c1swXSAtIG1hcy0+bWluICsgMTsNCisJCWkgPSAyOw0KKwl9IGVsc2Ug ew0KKwkJaSA9IDE7DQorCX0NCisNCisJLyogcmVkdWNlIG1heF9waXYgYXMgdGhlIHNwZWNpYWwg Y2FzZSBpcyBjaGVja2VkIGJlZm9yZSB0aGUgbG9vcCAqLw0KKwltYXhfcGl2ID0gbWFfZGF0YV9l bmQobW4sIG10LCBwaXZvdHMsIG1hcy0+bWF4KSAtIDE7DQorCS8qDQorCSAqIENoZWNrIGVuZCBp bXBsaWVkIHBpdm90IHdoaWNoIGNhbiBvbmx5IGJlIGEgZ2FwIG9uIHRoZSByaWdodCBtb3N0DQor CSAqIG5vZGUuDQorCSAqLw0KKwlpZiAodW5saWtlbHkobWFzLT5tYXggPT0gVUxPTkdfTUFYKSAm JiAhc2xvdHNbbWF4X3BpdiArIDFdKSB7DQorCQlnYXAgPSBVTE9OR19NQVggLSBwaXZvdHNbbWF4 X3Bpdl07DQorCQlpZiAoZ2FwID4gbWF4X2dhcCkNCisJCQltYXhfZ2FwID0gZ2FwOw0KKwl9DQor DQorCWZvciAoOyBpIDw9IG1heF9waXY7IGkrKykgew0KKwkJLyogZGF0YSA9PSBubyBnYXAuICov DQorCQlpZiAobGlrZWx5KHNsb3RzW2ldKSkNCisJCQljb250aW51ZTsNCisNCisJCXBzdGFydCA9 IHBpdm90c1tpIC0gMV07DQorCQlnYXAgPSBwaXZvdHNbaV0gLSBwc3RhcnQ7DQorCQlpZiAoZ2Fw ID4gbWF4X2dhcCkNCisJCQltYXhfZ2FwID0gZ2FwOw0KKw0KKwkJLyogVGhlcmUgY2Fubm90IGJl IHR3byBnYXBzIGluIGEgcm93LiAqLw0KKwkJaSsrOw0KKwl9DQorCXJldHVybiBtYXhfZ2FwOw0K K30NCisNCisvKg0KKyAqIG1hX21heF9nYXAoKSAtIEdldCB0aGUgbWF4aW11bSBnYXAgaW4gYSBt YXBsZSBub2RlIChub24tbGVhZikNCisgKiBAbm9kZTogVGhlIG1hcGxlIG5vZGUNCisgKiBAZ2Fw czogVGhlIHBvaW50ZXIgdG8gdGhlIGdhcHMNCisgKiBAbXQ6IFRoZSBtYXBsZSBub2RlIHR5cGUN CisgKiBAKm9mZjogUG9pbnRlciB0byBzdG9yZSB0aGUgb2Zmc2V0IGxvY2F0aW9uIG9mIHRoZSBn YXAuDQorICoNCisgKiBVc2VzIHRoZSBtZXRhZGF0YSBkYXRhIGVuZCB0byBzY2FuIGJhY2t3YXJk cyBhY3Jvc3Mgc2V0IGdhcHMuDQorICoNCisgKiBSZXR1cm46IFRoZSBtYXhpbXVtIGdhcCB2YWx1 ZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZw0KK21hX21heF9nYXAoc3RydWN0 IG1hcGxlX25vZGUgKm5vZGUsIHVuc2lnbmVkIGxvbmcgKmdhcHMsIGVudW0gbWFwbGVfdHlwZSBt dCwNCisJICAgIHVuc2lnbmVkIGNoYXIgKm9mZikNCit7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0 LCBpOw0KKwl1bnNpZ25lZCBsb25nIG1heF9nYXAgPSAwOw0KKw0KKwlpID0gb2Zmc2V0ID0gbWFf bWV0YV9lbmQobm9kZSwgbXQpOw0KKwlkbyB7DQorCQlpZiAoZ2Fwc1tpXSA+IG1heF9nYXApIHsN CisJCQltYXhfZ2FwID0gZ2Fwc1tpXTsNCisJCQlvZmZzZXQgPSBpOw0KKwkJfQ0KKwl9IHdoaWxl IChpLS0pOw0KKw0KKwkqb2ZmID0gb2Zmc2V0Ow0KKwlyZXR1cm4gbWF4X2dhcDsNCit9DQorDQor LyoNCisgKiBtYXNfbWF4X2dhcCgpIC0gZmluZCB0aGUgbGFyZ2VzdCBnYXAgaW4gYSBub24tbGVh ZiBub2RlIGFuZCBzZXQgdGhlIHNsb3QuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0KKyAq DQorICogSWYgdGhlIG1ldGFkYXRhIGdhcCBpcyBzZXQgdG8gTUFQTEVfQVJBTkdFNjRfTUVUQV9N QVgsIHRoZXJlIGlzIG5vIGdhcC4NCisgKg0KKyAqIFJldHVybjogVGhlIGdhcCB2YWx1ZS4NCisg Ki8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWFzX21heF9nYXAoc3RydWN0IG1hX3N0 YXRlICptYXMpDQorew0KKwl1bnNpZ25lZCBsb25nICpnYXBzOw0KKwl1bnNpZ25lZCBjaGFyIG9m ZnNldDsNCisJZW51bSBtYXBsZV90eXBlIG10Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsN CisNCisJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCWlmIChtYV9pc19sZWFmKG10 KSkNCisJCXJldHVybiBtYXNfbGVhZl9tYXhfZ2FwKG1hcyk7DQorDQorCW5vZGUgPSBtYXNfbW4o bWFzKTsNCisJb2Zmc2V0ID0gbWFfbWV0YV9nYXAobm9kZSwgbXQpOw0KKwlpZiAob2Zmc2V0ID09 IE1BUExFX0FSQU5HRTY0X01FVEFfTUFYKQ0KKwkJcmV0dXJuIDA7DQorDQorCWdhcHMgPSBtYV9n YXBzKG5vZGUsIG10KTsNCisJcmV0dXJuIGdhcHNbb2Zmc2V0XTsNCit9DQorDQorLyoNCisgKiBt YXNfcGFyZW50X2dhcCgpIC0gU2V0IHRoZSBwYXJlbnQgZ2FwIGFuZCBhbnkgZ2FwcyBhYm92ZSwg YXMgbmVlZGVkDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG9mZnNldDogVGhlIGdh cCBvZmZzZXQgaW4gdGhlIHBhcmVudCB0byBzZXQNCisgKiBAbmV3OiBUaGUgbmV3IGdhcCB2YWx1 ZS4NCisgKg0KKyAqIFNldCB0aGUgcGFyZW50IGdhcCB0aGVuIGNvbnRpbnVlIHRvIHNldCB0aGUg Z2FwIHVwd2FyZHMsIHVzaW5nIHRoZSBtZXRhZGF0YQ0KKyAqIG9mIHRoZSBwYXJlbnQgdG8gc2Vl IGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBjaGVjayB0aGUgbm9kZSBhYm92ZS4NCisgKi8NCitzdGF0 aWMgaW5saW5lIHZvaWQgbWFzX3BhcmVudF9nYXAoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2ln bmVkIGNoYXIgb2Zmc2V0LA0KKwkJdW5zaWduZWQgbG9uZyBuZXcpDQorew0KKwl1bnNpZ25lZCBs b25nIG1ldGFfZ2FwID0gMDsNCisJc3RydWN0IG1hcGxlX25vZGUgKnBub2RlOw0KKwlzdHJ1Y3Qg bWFwbGVfZW5vZGUgKnBlbm9kZTsNCisJdW5zaWduZWQgbG9uZyAqcGdhcHM7DQorCXVuc2lnbmVk IGNoYXIgbWV0YV9vZmZzZXQ7DQorCWVudW0gbWFwbGVfdHlwZSBwbXQ7DQorDQorCXBub2RlID0g bXRlX3BhcmVudChtYXMtPm5vZGUpOw0KKwlwbXQgPSBtYXNfcGFyZW50X2VudW0obWFzLCBtYXMt Pm5vZGUpOw0KKwlwZW5vZGUgPSBtdF9ta19ub2RlKHBub2RlLCBwbXQpOw0KKwlwZ2FwcyA9IG1h X2dhcHMocG5vZGUsIHBtdCk7DQorDQorYXNjZW5kOg0KKwltZXRhX29mZnNldCA9IG1hX21ldGFf Z2FwKHBub2RlLCBwbXQpOw0KKwlpZiAobWV0YV9vZmZzZXQgPT0gTUFQTEVfQVJBTkdFNjRfTUVU QV9NQVgpDQorCQltZXRhX2dhcCA9IDA7DQorCWVsc2UNCisJCW1ldGFfZ2FwID0gcGdhcHNbbWV0 YV9vZmZzZXRdOw0KKw0KKwlwZ2Fwc1tvZmZzZXRdID0gbmV3Ow0KKw0KKwlpZiAobWV0YV9nYXAg PT0gbmV3KQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAob2Zmc2V0ICE9IG1ldGFfb2Zmc2V0KSB7DQor CQlpZiAobWV0YV9nYXAgPiBuZXcpDQorCQkJcmV0dXJuOw0KKw0KKwkJbWFfc2V0X21ldGFfZ2Fw KHBub2RlLCBwbXQsIG9mZnNldCk7DQorCX0gZWxzZSBpZiAobmV3IDwgbWV0YV9nYXApIHsNCisJ CW1ldGFfb2Zmc2V0ID0gMTU7DQorCQluZXcgPSBtYV9tYXhfZ2FwKHBub2RlLCBwZ2FwcywgcG10 LCAmbWV0YV9vZmZzZXQpOw0KKwkJbWFfc2V0X21ldGFfZ2FwKHBub2RlLCBwbXQsIG1ldGFfb2Zm c2V0KTsNCisJfQ0KKw0KKwlpZiAobWFfaXNfcm9vdChwbm9kZSkpDQorCQlyZXR1cm47DQorDQor CS8qIEdvIHRvIHRoZSBwYXJlbnQgbm9kZS4gKi8NCisJcG5vZGUgPSBtdGVfcGFyZW50KHBlbm9k ZSk7DQorCXBtdCA9IG1hc19wYXJlbnRfZW51bShtYXMsIHBlbm9kZSk7DQorCXBnYXBzID0gbWFf Z2Fwcyhwbm9kZSwgcG10KTsNCisJb2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KHBlbm9kZSk7DQor CXBlbm9kZSA9IG10X21rX25vZGUocG5vZGUsIHBtdCk7DQorCWdvdG8gYXNjZW5kOw0KK30NCisN CisvKg0KKyAqIG1hc191cGRhdGVfZ2FwKCkgLSBVcGRhdGUgYSBub2RlcyBnYXBzIGFuZCBwcm9w YWdhdGUgdXAgaWYgbmVjZXNzYXJ5Lg0KKyAqIEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUuDQorICov DQorc3RhdGljIGlubGluZSB2b2lkIG1hc191cGRhdGVfZ2FwKHN0cnVjdCBtYV9zdGF0ZSAqbWFz KQ0KK3sNCisJdW5zaWduZWQgY2hhciBwc2xvdDsNCisJdW5zaWduZWQgbG9uZyBwX2dhcDsNCisJ dW5zaWduZWQgbG9uZyBtYXhfZ2FwOw0KKw0KKwlpZiAoIW10X2lzX2FsbG9jKG1hcy0+dHJlZSkp DQorCQlyZXR1cm47DQorDQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKQ0KKwkJcmV0dXJu Ow0KKw0KKwltYXhfZ2FwID0gbWFzX21heF9nYXAobWFzKTsNCisNCisJcHNsb3QgPSBtdGVfcGFy ZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJcF9nYXAgPSBtYV9nYXBzKG10ZV9wYXJlbnQobWFzLT5u b2RlKSwNCisJCQltYXNfcGFyZW50X2VudW0obWFzLCBtYXMtPm5vZGUpKVtwc2xvdF07DQorDQor CWlmIChwX2dhcCAhPSBtYXhfZ2FwKQ0KKwkJbWFzX3BhcmVudF9nYXAobWFzLCBwc2xvdCwgbWF4 X2dhcCk7DQorfQ0KKw0KKy8qDQorICogbWFzX2Fkb3B0X2NoaWxkcmVuKCkgLSBTZXQgdGhlIHBh cmVudCBwb2ludGVyIG9mIGFsbCBub2RlcyBpbiBAcGFyZW50IHRvDQorICogQHBhcmVudCB3aXRo IHRoZSBzbG90IGVuY29kZWQuDQorICogQG1hcyAtIHRoZSBtYXBsZSBzdGF0ZSAoZm9yIHRoZSB0 cmVlKQ0KKyAqIEBwYXJlbnQgLSB0aGUgbWFwbGUgZW5jb2RlZCBub2RlIGNvbnRhaW5pbmcgdGhl IGNoaWxkcmVuLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfYWRvcHRfY2hpbGRyZW4o c3RydWN0IG1hX3N0YXRlICptYXMsDQorCQlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnBhcmVudCkNCit7 DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlID0gbXRlX25vZGVfdHlwZShwYXJlbnQpOw0KKwlzdHJ1 Y3QgbWFwbGVfbm9kZSAqbm9kZSA9IG1hc19tbihtYXMpOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHMg PSBtYV9zbG90cyhub2RlLCB0eXBlKTsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzID0gbWFfcGl2 b3RzKG5vZGUsIHR5cGUpOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmNoaWxkOw0KKwl1bnNpZ25l ZCBjaGFyIG9mZnNldDsNCisNCisJb2Zmc2V0ID0gbWFfZGF0YV9lbmQobm9kZSwgdHlwZSwgcGl2 b3RzLCBtYXMtPm1heCk7DQorCWRvIHsNCisJCWNoaWxkID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywg c2xvdHMsIG9mZnNldCk7DQorCQltdGVfc2V0X3BhcmVudChjaGlsZCwgcGFyZW50LCBvZmZzZXQp Ow0KKwl9IHdoaWxlIChvZmZzZXQtLSk7DQorfQ0KKw0KKy8qDQorICogbWFzX3JlcGxhY2UoKSAt IFJlcGxhY2UgYSBtYXBsZSBub2RlIGluIHRoZSB0cmVlIHdpdGggbWFzLT5ub2RlLiAgVXNlcyB0 aGUNCisgKiBwYXJlbnQgZW5jb2RpbmcgdG8gbG9jYXRlIHRoZSBtYXBsZSBub2RlIGluIHRoZSB0 cmVlLg0KKyAqIEBtYXMgLSB0aGUgbWFfc3RhdGUgdG8gdXNlIGZvciBvcGVyYXRpb25zLg0KKyAq IEBhZHZhbmNlZCAtIGJvb2xlYW4gdG8gYWRvcHQgdGhlIGNoaWxkIG5vZGVzIGFuZCBmcmVlIHRo ZSBvbGQgbm9kZSAoZmFsc2UpIG9yDQorICogbGVhdmUgdGhlIG5vZGUgKHRydWUpIGFuZCBoYW5k bGUgdGhlIGFkb3B0aW9uIGFuZCBmcmVlIGVsc2V3aGVyZS4NCisgKi8NCitzdGF0aWMgaW5saW5l IHZvaWQgbWFzX3JlcGxhY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsIGJvb2wgYWR2YW5jZWQpDQor CV9fbXVzdF9ob2xkKG1hcy0+dHJlZS0+bG9jaykNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpt biA9IG1hc19tbihtYXMpOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm9sZF9lbm9kZTsNCisJdW5z aWduZWQgY2hhciBvZmZzZXQgPSAwOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHMgPSBOVUxMOw0KKw0K KwlpZiAobWFfaXNfcm9vdChtbikpIHsNCisJCW9sZF9lbm9kZSA9IG1hc19yb290X2xvY2tlZCht YXMpOw0KKwl9IGVsc2Ugew0KKwkJb2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7 DQorCQlzbG90cyA9IG1hX3Nsb3RzKG10ZV9wYXJlbnQobWFzLT5ub2RlKSwNCisJCQkJIG1hc19w YXJlbnRfZW51bShtYXMsIG1hcy0+bm9kZSkpOw0KKwkJb2xkX2Vub2RlID0gbWFzX3Nsb3RfbG9j a2VkKG1hcywgc2xvdHMsIG9mZnNldCk7DQorCX0NCisNCisJaWYgKCFhZHZhbmNlZCAmJiAhbXRl X2lzX2xlYWYobWFzLT5ub2RlKSkNCisJCW1hc19hZG9wdF9jaGlsZHJlbihtYXMsIG1hcy0+bm9k ZSk7DQorDQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKSB7DQorCQltbi0+cGFyZW50ID0g bWFfcGFyZW50X3B0cigNCisJCQkgICAgICAoKHVuc2lnbmVkIGxvbmcpbWFzLT50cmVlIHwgTUFf Uk9PVF9QQVJFTlQpKTsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcihtYXMtPnRyZWUtPm1hX3Jvb3Qs IG10ZV9ta19yb290KG1hcy0+bm9kZSkpOw0KKwkJbWFzX3NldF9oZWlnaHQobWFzKTsNCisJfSBl bHNlIHsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcihzbG90c1tvZmZzZXRdLCBtYXMtPm5vZGUpOw0K Kwl9DQorDQorCWlmICghYWR2YW5jZWQpDQorCQltYXNfZnJlZShtYXMsIG9sZF9lbm9kZSk7DQor fQ0KKw0KKy8qDQorICogbWFzX25ld19jaGlsZCgpIC0gRmluZCB0aGUgbmV3IGNoaWxkIG9mIGEg bm9kZS4NCisgKiBAbWFzOiB0aGUgbWFwbGUgc3RhdGUNCisgKiBAY2hpbGQ6IHRoZSBtYXBsZSBz dGF0ZSB0byBzdG9yZSB0aGUgY2hpbGQuDQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19u ZXdfY2hpbGQoc3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYV9zdGF0ZSAqY2hpbGQpDQor CV9fbXVzdF9ob2xkKG1hcy0+dHJlZS0+bG9jaykNCit7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsN CisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCXVuc2lnbmVkIGNoYXIgZW5kOw0KKwl1bnNpZ25l ZCBsb25nICpwaXZvdHM7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqZW50cnk7DQorCXN0cnVjdCBt YXBsZV9ub2RlICpub2RlOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorDQorCW10ID0gbXRlX25v ZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCXNsb3RzID0gbWFf c2xvdHMobm9kZSwgbXQpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQpOw0KKwllbmQg PSBtYV9kYXRhX2VuZChub2RlLCBtdCwgcGl2b3RzLCBtYXMtPm1heCk7DQorCWZvciAob2Zmc2V0 ID0gbWFzLT5vZmZzZXQ7IG9mZnNldCA8PSBlbmQ7IG9mZnNldCsrKSB7DQorCQllbnRyeSA9IG1h c19zbG90X2xvY2tlZChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwkJaWYgKG10ZV9wYXJlbnQoZW50 cnkpID09IG5vZGUpIHsNCisJCQkqY2hpbGQgPSAqbWFzOw0KKwkJCW1hcy0+b2Zmc2V0ID0gb2Zm c2V0ICsgMTsNCisJCQljaGlsZC0+b2Zmc2V0ID0gb2Zmc2V0Ow0KKwkJCW1hc19kZXNjZW5kKGNo aWxkKTsNCisJCQljaGlsZC0+b2Zmc2V0ID0gMDsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJ fQ0KKwlyZXR1cm4gZmFsc2U7DQorfQ0KKw0KKy8qDQorICogbWFiX3NoaWZ0X3JpZ2h0KCkgLSBT aGlmdCB0aGUgZGF0YSBpbiBtYWIgcmlnaHQuIE5vdGUsIGRvZXMgbm90IGNsZWFuIG91dCB0aGUN CisgKiBvbGQgZGF0YSBvciBzZXQgYl9ub2RlLT5iX2VuZC4NCisgKiBAYl9ub2RlOiB0aGUgbWFw bGVfYmlnX25vZGUNCisgKiBAc2hpZnQ6IHRoZSBzaGlmdCBjb3VudA0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdm9pZCBtYWJfc2hpZnRfcmlnaHQoc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUs DQorCQkJCSB1bnNpZ25lZCBjaGFyIHNoaWZ0KQ0KK3sNCisJdW5zaWduZWQgbG9uZyBzaXplID0g Yl9ub2RlLT5iX2VuZCAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsNCisNCisJbWVtbW92ZShiX25v ZGUtPnBpdm90ICsgc2hpZnQsIGJfbm9kZS0+cGl2b3QsIHNpemUpOw0KKwltZW1tb3ZlKGJfbm9k ZS0+c2xvdCArIHNoaWZ0LCBiX25vZGUtPnNsb3QsIHNpemUpOw0KKwlpZiAoYl9ub2RlLT50eXBl ID09IG1hcGxlX2FyYW5nZV82NCkNCisJCW1lbW1vdmUoYl9ub2RlLT5nYXAgKyBzaGlmdCwgYl9u b2RlLT5nYXAsIHNpemUpOw0KK30NCisNCisvKg0KKyAqIG1hYl9taWRkbGVfbm9kZSgpIC0gQ2hl Y2sgaWYgYSBtaWRkbGUgbm9kZSBpcyBuZWVkZWQgKHVubGlrZWx5KQ0KKyAqIEBiX25vZGU6IHRo ZSBtYXBsZV9iaWdfbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhLg0KKyAqIEBzaXplOiB0aGUg YW1vdW50IG9mIGRhdGEgaW4gdGhlIGJfbm9kZQ0KKyAqIEBzcGxpdDogdGhlIHBvdGVudGlhbCBz cGxpdCBsb2NhdGlvbg0KKyAqIEBzbG90X2NvdW50OiB0aGUgc2l6ZSB0aGF0IGNhbiBiZSBzdG9y ZWQgaW4gYSBzaW5nbGUgbm9kZSBiZWluZyBjb25zaWRlcmVkLg0KKyAqDQorICogUmV0dXJuOiB0 cnVlIGlmIGEgbWlkZGxlIG5vZGUgaXMgcmVxdWlyZWQuDQorICovDQorc3RhdGljIGlubGluZSBi b29sIG1hYl9taWRkbGVfbm9kZShzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJfbm9kZSwgaW50IHNw bGl0LA0KKwkJCQkgICB1bnNpZ25lZCBjaGFyIHNsb3RfY291bnQpDQorew0KKwl1bnNpZ25lZCBj aGFyIHNpemUgPSBiX25vZGUtPmJfZW5kOw0KKw0KKwlpZiAoc2l6ZSA+PSAyICogc2xvdF9jb3Vu dCkNCisJCXJldHVybiB0cnVlOw0KKw0KKwlpZiAoIWJfbm9kZS0+c2xvdFtzcGxpdF0gJiYgKHNp emUgPj0gMiAqIHNsb3RfY291bnQgLSAxKSkNCisJCXJldHVybiB0cnVlOw0KKw0KKwlyZXR1cm4g ZmFsc2U7DQorfQ0KKw0KKy8qDQorICogbWFiX25vX251bGxfc3BsaXQoKSAtIGVuc3VyZSB0aGUg c3BsaXQgZG9lc24ndCBmYWxsIG9uIGEgTlVMTA0KKyAqIEBiX25vZGU6IHRoZSBtYXBsZV9iaWdf bm9kZSB3aXRoIHRoZSBkYXRhDQorICogQHNwbGl0OiB0aGUgc3VnZ2VzdGVkIHNwbGl0IGxvY2F0 aW9uDQorICogQHNsb3RfY291bnQ6IHRoZSBudW1iZXIgb2Ygc2xvdHMgaW4gdGhlIG5vZGUgYmVp bmcgY29uc2lkZXJlZC4NCisgKg0KKyAqIFJldHVybjogdGhlIHNwbGl0IGxvY2F0aW9uLg0KKyAq Lw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hYl9ub19udWxsX3NwbGl0KHN0cnVjdCBtYXBsZV9iaWdf bm9kZSAqYl9ub2RlLA0KKwkJCQkgICAgdW5zaWduZWQgY2hhciBzcGxpdCwgdW5zaWduZWQgY2hh ciBzbG90X2NvdW50KQ0KK3sNCisJaWYgKCFiX25vZGUtPnNsb3Rbc3BsaXRdKSB7DQorCQkvKg0K KwkJICogSWYgdGhlIHNwbGl0IGlzIGxlc3MgdGhhbiB0aGUgbWF4IHNsb3QgJiYgdGhlIHJpZ2h0 IHNpZGUgd2lsbA0KKwkJICogc3RpbGwgYmUgc3VmZmljaWVudCwgdGhlbiBpbmNyZW1lbnQgdGhl IHNwbGl0IG9uIE5VTEwuDQorCQkgKi8NCisJCWlmICgoc3BsaXQgPCBzbG90X2NvdW50IC0gMSkg JiYNCisJCSAgICAoYl9ub2RlLT5iX2VuZCAtIHNwbGl0KSA+IChtdF9taW5fc2xvdHNbYl9ub2Rl LT50eXBlXSkpDQorCQkJc3BsaXQrKzsNCisJCWVsc2UNCisJCQlzcGxpdC0tOw0KKwl9DQorCXJl dHVybiBzcGxpdDsNCit9DQorDQorLyoNCisgKiBtYWJfY2FsY19zcGxpdCgpIC0gQ2FsY3VsYXRl IHRoZSBzcGxpdCBsb2NhdGlvbiBhbmQgaWYgdGhlcmUgbmVlZHMgdG8gYmUgdHdvDQorICogc3Bs aXRzLg0KKyAqIEBibjogVGhlIG1hcGxlX2JpZ19ub2RlIHdpdGggdGhlIGRhdGENCisgKiBAbWlk X3NwbGl0OiBUaGUgc2Vjb25kIHNwbGl0LCBpZiByZXF1aXJlZC4gIDAgb3RoZXJ3aXNlLg0KKyAq DQorICogUmV0dXJuOiBUaGUgZmlyc3Qgc3BsaXQgbG9jYXRpb24uICBUaGUgbWlkZGxlIHNwbGl0 IGlzIHNldCBpbiBAbWlkX3NwbGl0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hYl9jYWxj X3NwbGl0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkgc3RydWN0IG1hcGxlX2JpZ19ub2RlICpi biwgdW5zaWduZWQgY2hhciAqbWlkX3NwbGl0LCB1bnNpZ25lZCBsb25nIG1pbikNCit7DQorCXVu c2lnbmVkIGNoYXIgYl9lbmQgPSBibi0+Yl9lbmQ7DQorCWludCBzcGxpdCA9IGJfZW5kIC8gMjsg LyogQXNzdW1lIGVxdWFsIHNwbGl0LiAqLw0KKwl1bnNpZ25lZCBjaGFyIHNsb3RfbWluLCBzbG90 X2NvdW50ID0gbXRfc2xvdHNbYm4tPnR5cGVdOw0KKw0KKwkvKg0KKwkgKiBUbyBzdXBwb3J0IGdh cCB0cmFja2luZywgYWxsIE5VTEwgZW50cmllcyBhcmUga2VwdCB0b2dldGhlciBhbmQgYSBub2Rl IGNhbm5vdA0KKwkgKiBlbmQgb24gYSBOVUxMIGVudHJ5LCB3aXRoIHRoZSBleGNlcHRpb24gb2Yg dGhlIGxlZnQtbW9zdCBsZWFmLiAgVGhlDQorCSAqIGxpbWl0YXRpb24gbWVhbnMgdGhhdCB0aGUg c3BsaXQgb2YgYSBub2RlIG11c3QgYmUgY2hlY2tlZCBmb3IgdGhpcyBjb25kaXRpb24NCisJICog YW5kIGJlIGFibGUgdG8gcHV0IG1vcmUgZGF0YSBpbiBvbmUgZGlyZWN0aW9uIG9yIHRoZSBvdGhl ci4NCisJICovDQorCWlmICh1bmxpa2VseSgobWFzLT5tYXNfZmxhZ3MgJiBNQV9TVEFURV9CVUxL KSkpIHsNCisJCSptaWRfc3BsaXQgPSAwOw0KKwkJc3BsaXQgPSBiX2VuZCAtIG10X21pbl9zbG90 c1tibi0+dHlwZV07DQorDQorCQlpZiAoIW1hX2lzX2xlYWYoYm4tPnR5cGUpKQ0KKwkJCXJldHVy biBzcGxpdDsNCisNCisJCW1hcy0+bWFzX2ZsYWdzIHw9IE1BX1NUQVRFX1JFQkFMQU5DRTsNCisJ CWlmICghYm4tPnNsb3Rbc3BsaXRdKQ0KKwkJCXNwbGl0LS07DQorCQlyZXR1cm4gc3BsaXQ7DQor CX0NCisNCisJLyoNCisJICogQWx0aG91Z2ggZXh0cmVtZWx5IHJhcmUsIGl0IGlzIHBvc3NpYmxl IHRvIGVudGVyIHdoYXQgaXMga25vd24gYXMgdGhlIDMtd2F5DQorCSAqIHNwbGl0IHNjZW5hcmlv LiAgVGhlIDMtd2F5IHNwbGl0IGNvbWVzIGFib3V0IGJ5IG1lYW5zIG9mIGEgc3RvcmUgb2YgYSBy YW5nZQ0KKwkgKiB0aGF0IG92ZXJ3cml0ZXMgdGhlIGVuZCBhbmQgYmVnaW5uaW5nIG9mIHR3byBm dWxsIG5vZGVzLiAgVGhlIHJlc3VsdCBpcyBhIHNldA0KKwkgKiBvZiBlbnRyaWVzIHRoYXQgY2Fu bm90IGJlIHN0b3JlZCBpbiAyIG5vZGVzLiAgU29tZXRpbWVzLCB0aGVzZSB0d28gbm9kZXMgY2Fu DQorCSAqIGFsc28gYmUgbG9jYXRlZCBpbiBkaWZmZXJlbnQgcGFyZW50IG5vZGVzIHdoaWNoIGFy ZSBhbHNvIGZ1bGwuICBUaGlzIGNhbg0KKwkgKiBjYXJyeSB1cHdhcmRzIGFsbCB0aGUgd2F5IHRv IHRoZSByb290IGluIHRoZSB3b3JzdCBjYXNlLg0KKwkgKi8NCisJaWYgKHVubGlrZWx5KG1hYl9t aWRkbGVfbm9kZShibiwgc3BsaXQsIHNsb3RfY291bnQpKSkgew0KKwkJc3BsaXQgPSBiX2VuZCAv IDM7DQorCQkqbWlkX3NwbGl0ID0gc3BsaXQgKiAyOw0KKwl9IGVsc2Ugew0KKwkJc2xvdF9taW4g PSBtdF9taW5fc2xvdHNbYm4tPnR5cGVdOw0KKw0KKwkJKm1pZF9zcGxpdCA9IDA7DQorCQkvKg0K KwkJICogQXZvaWQgaGF2aW5nIGEgcmFuZ2UgbGVzcyB0aGFuIHRoZSBzbG90IGNvdW50IHVubGVz cyBpdA0KKwkJICogY2F1c2VzIG9uZSBub2RlIHRvIGJlIGRlZmljaWVudC4NCisJCSAqIE5PVEU6 IG10X21pbl9zbG90cyBpcyAxIGJhc2VkLCBiX2VuZCBhbmQgc3BsaXQgYXJlIHplcm8uDQorCQkg Ki8NCisJCXdoaWxlICgoKGJuLT5waXZvdFtzcGxpdF0gLSBtaW4pIDwgc2xvdF9jb3VudCAtIDEp ICYmDQorCQkgICAgICAgKHNwbGl0IDwgc2xvdF9jb3VudCAtIDEpICYmIChiX2VuZCAtIHNwbGl0 ID4gc2xvdF9taW4pKQ0KKwkJCXNwbGl0Kys7DQorCX0NCisNCisJLyogQXZvaWQgZW5kaW5nIGEg bm9kZSBvbiBhIE5VTEwgZW50cnkgKi8NCisJc3BsaXQgPSBtYWJfbm9fbnVsbF9zcGxpdChibiwg c3BsaXQsIHNsb3RfY291bnQpOw0KKwlpZiAoISgqbWlkX3NwbGl0KSkNCisJCXJldHVybiBzcGxp dDsNCisNCisJKm1pZF9zcGxpdCA9IG1hYl9ub19udWxsX3NwbGl0KGJuLCAqbWlkX3NwbGl0LCBz bG90X2NvdW50KTsNCisNCisJcmV0dXJuIHNwbGl0Ow0KK30NCisNCisvKg0KKyAqIG1hc19tYWJf Y3AoKSAtIENvcHkgZGF0YSBmcm9tIGEgbWFwbGUgc3RhdGUgaW5jbHVzaXZlbHkgdG8gYSBtYXBs ZV9iaWdfbm9kZQ0KKyAqIGFuZCBzZXQgQGJfbm9kZS0+Yl9lbmQgdG8gdGhlIG5leHQgZnJlZSBz bG90Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtYXNfc3RhcnQ6IFRoZSBzdGFy dGluZyBzbG90IHRvIGNvcHkNCisgKiBAbWFzX2VuZDogVGhlIGVuZCBzbG90IHRvIGNvcHkgKGlu Y2x1c2l2ZWx5KQ0KKyAqIEBiX25vZGU6IFRoZSBtYXBsZV9iaWdfbm9kZSB0byBwbGFjZSB0aGUg ZGF0YQ0KKyAqIEBtYWJfc3RhcnQ6IFRoZSBzdGFydGluZyBsb2NhdGlvbiBpbiBtYXBsZV9iaWdf bm9kZSB0byBzdG9yZSB0aGUgZGF0YS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX21h Yl9jcChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgY2hhciBtYXNfc3RhcnQsDQorCQkJ dW5zaWduZWQgY2hhciBtYXNfZW5kLCBzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJfbm9kZSwNCisJ CQl1bnNpZ25lZCBjaGFyIG1hYl9zdGFydCkNCit7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisJ c3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdW5zaWdu ZWQgbG9uZyAqcGl2b3RzLCAqZ2FwczsNCisJaW50IGkgPSBtYXNfc3RhcnQsIGogPSBtYWJfc3Rh cnQ7DQorCXVuc2lnbmVkIGNoYXIgcGl2X2VuZDsNCisNCisJbm9kZSA9IG1hc19tbihtYXMpOw0K KwltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJcGl2b3RzID0gbWFfcGl2b3RzKG5v ZGUsIG10KTsNCisJaWYgKCFpKSB7DQorCQliX25vZGUtPnBpdm90W2pdID0gcGl2b3RzW2krK107 DQorCQlpZiAodW5saWtlbHkoaSA+IG1hc19lbmQpKQ0KKwkJCWdvdG8gY29tcGxldGU7DQorCQlq Kys7DQorCX0NCisNCisJcGl2X2VuZCA9IG1pbihtYXNfZW5kLCBtdF9waXZvdHNbbXRdKTsNCisJ Zm9yICg7IGkgPCBwaXZfZW5kOyBpKyssIGorKykgew0KKwkJYl9ub2RlLT5waXZvdFtqXSA9IHBp dm90c1tpXTsNCisJCWlmICh1bmxpa2VseSghYl9ub2RlLT5waXZvdFtqXSkpDQorCQkJYnJlYWs7 DQorDQorCQlpZiAodW5saWtlbHkobWFzLT5tYXggPT0gYl9ub2RlLT5waXZvdFtqXSkpDQorCQkJ Z290byBjb21wbGV0ZTsNCisJfQ0KKw0KKwlpZiAobGlrZWx5KGkgPD0gbWFzX2VuZCkpDQorCQli X25vZGUtPnBpdm90W2pdID0gbWFzX3NhZmVfcGl2b3QobWFzLCBwaXZvdHMsIGksIG10KTsNCisN Citjb21wbGV0ZToNCisJYl9ub2RlLT5iX2VuZCA9ICsrajsNCisJaiAtPSBtYWJfc3RhcnQ7DQor CXNsb3RzID0gbWFfc2xvdHMobm9kZSwgbXQpOw0KKwltZW1jcHkoYl9ub2RlLT5zbG90ICsgbWFi X3N0YXJ0LCBzbG90cyArIG1hc19zdGFydCwgc2l6ZW9mKHZvaWQgKikgKiBqKTsNCisJaWYgKCFt YV9pc19sZWFmKG10KSAmJiBtdF9pc19hbGxvYyhtYXMtPnRyZWUpKSB7DQorCQlnYXBzID0gbWFf Z2Fwcyhub2RlLCBtdCk7DQorCQltZW1jcHkoYl9ub2RlLT5nYXAgKyBtYWJfc3RhcnQsIGdhcHMg KyBtYXNfc3RhcnQsDQorCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogaik7DQorCX0N Cit9DQorDQorLyoNCisgKiBtYXNfbGVhZl9zZXRfbWV0YSgpIC0gU2V0IHRoZSBtZXRhZGF0YSBv ZiBhIGxlYWYgaWYgcG9zc2libGUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG5v ZGU6IFRoZSBtYXBsZSBub2RlDQorICogQHBpdm90czogcG9pbnRlciB0byB0aGUgbWFwbGUgbm9k ZSBwaXZvdHMNCisgKiBAbXQ6IFRoZSBtYXBsZSB0eXBlDQorICogQGVuZDogVGhlIGFzc3VtZWQg ZW5kDQorICoNCisgKiBOb3RlLCBlbmQgbWF5IGJlIGluY3JlbWVudGVkIHdpdGhpbiB0aGlzIGZ1 bmN0aW9uIGJ1dCBub3QgbW9kaWZpZWQgYXQgdGhlDQorICogc291cmNlLiAgVGhpcyBpcyBmaW5l IHNpbmNlIHRoZSBtZXRhZGF0YSBpcyB0aGUgbGFzdCB0aGluZyB0byBiZSBzdG9yZWQgaW4gYQ0K KyAqIG5vZGUgZHVyaW5nIGEgd3JpdGUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19s ZWFmX3NldF9tZXRhKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkJc3RydWN0IG1hcGxlX25vZGUg Km5vZGUsIHVuc2lnbmVkIGxvbmcgKnBpdm90cywNCisJCWVudW0gbWFwbGVfdHlwZSBtdCwgdW5z aWduZWQgY2hhciBlbmQpDQorew0KKwkvKiBUaGVyZSBpcyBubyByb29tIGZvciBtZXRhZGF0YSBh bHJlYWR5ICovDQorCWlmIChtdF9waXZvdHNbbXRdIDw9IGVuZCkNCisJCXJldHVybjsNCisNCisJ aWYgKHBpdm90c1tlbmRdICYmIHBpdm90c1tlbmRdIDwgbWFzLT5tYXgpDQorCQllbmQrKzsNCisN CisJaWYgKGVuZCA8IG10X3Nsb3RzW210XSAtIDEpDQorCQltYV9zZXRfbWV0YShub2RlLCBtdCwg MCwgZW5kKTsNCit9DQorDQorLyoNCisgKiBtYWJfbWFzX2NwKCkgLSBDb3B5IGRhdGEgZnJvbSBt YXBsZV9iaWdfbm9kZSB0byBhIG1hcGxlIGVuY29kZWQgbm9kZS4NCisgKiBAYl9ub2RlOiB0aGUg bWFwbGVfYmlnX25vZGUgdGhhdCBoYXMgdGhlIGRhdGENCisgKiBAbWFiX3N0YXJ0OiB0aGUgc3Rh cnQgbG9jYXRpb24gaW4gQGJfbm9kZS4NCisgKiBAbWFiX2VuZDogVGhlIGVuZCBsb2NhdGlvbiBp biBAYl9ub2RlIChpbmNsdXNpdmVseSkNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUgd2l0aCB0 aGUgbWFwbGUgZW5jb2RlZCBub2RlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWJfbWFz X2NwKHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlLA0KKwkJCSAgICAgIHVuc2lnbmVkIGNo YXIgbWFiX3N0YXJ0LCB1bnNpZ25lZCBjaGFyIG1hYl9lbmQsDQorCQkJICAgICAgc3RydWN0IG1h X3N0YXRlICptYXMsIGJvb2wgbmV3X21heCkNCit7DQorCWludCBpLCBqID0gMDsNCisJZW51bSBt YXBsZV90eXBlIG10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlzdHJ1Y3QgbWFwbGVf bm9kZSAqbm9kZSA9IG10ZV90b19ub2RlKG1hcy0+bm9kZSk7DQorCXZvaWQgX19yY3UgKipzbG90 cyA9IG1hX3Nsb3RzKG5vZGUsIG10KTsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzID0gbWFfcGl2 b3RzKG5vZGUsIG10KTsNCisJdW5zaWduZWQgbG9uZyAqZ2FwcyA9IE5VTEw7DQorCXVuc2lnbmVk IGNoYXIgZW5kOw0KKw0KKwlpZiAobWFiX2VuZCAtIG1hYl9zdGFydCA+IG10X3Bpdm90c1ttdF0p DQorCQltYWJfZW5kLS07DQorDQorCWlmICghcGl2b3RzW210X3Bpdm90c1ttdF0gLSAxXSkNCisJ CXNsb3RzW210X3Bpdm90c1ttdF1dID0gTlVMTDsNCisNCisJaSA9IG1hYl9zdGFydDsNCisJZG8g ew0KKwkJcGl2b3RzW2orK10gPSBiX25vZGUtPnBpdm90W2krK107DQorCX0gd2hpbGUgKGkgPD0g bWFiX2VuZCAmJiBsaWtlbHkoYl9ub2RlLT5waXZvdFtpXSkpOw0KKw0KKwltZW1jcHkoc2xvdHMs IGJfbm9kZS0+c2xvdCArIG1hYl9zdGFydCwNCisJICAgICAgIHNpemVvZih2b2lkICopICogKGkg LSBtYWJfc3RhcnQpKTsNCisNCisJaWYgKG5ld19tYXgpDQorCQltYXMtPm1heCA9IGJfbm9kZS0+ cGl2b3RbaSAtIDFdOw0KKw0KKwllbmQgPSBqIC0gMTsNCisJaWYgKGxpa2VseSghbWFfaXNfbGVh ZihtdCkgJiYgbXRfaXNfYWxsb2MobWFzLT50cmVlKSkpIHsNCisJCXVuc2lnbmVkIGxvbmcgbWF4 X2dhcCA9IDA7DQorCQl1bnNpZ25lZCBjaGFyIG9mZnNldCA9IDE1Ow0KKw0KKwkJZ2FwcyA9IG1h X2dhcHMobm9kZSwgbXQpOw0KKwkJZG8gew0KKwkJCWdhcHNbLS1qXSA9IGJfbm9kZS0+Z2FwWy0t aV07DQorCQkJaWYgKGdhcHNbal0gPiBtYXhfZ2FwKSB7DQorCQkJCW9mZnNldCA9IGo7DQorCQkJ CW1heF9nYXAgPSBnYXBzW2pdOw0KKwkJCX0NCisJCX0gd2hpbGUgKGopOw0KKw0KKwkJbWFfc2V0 X21ldGEobm9kZSwgbXQsIG9mZnNldCwgZW5kKTsNCisJfSBlbHNlIHsNCisJCW1hc19sZWFmX3Nl dF9tZXRhKG1hcywgbm9kZSwgcGl2b3RzLCBtdCwgZW5kKTsNCisJfQ0KK30NCisNCisvKg0KKyAq IG1hc19kZXNjZW5kX2Fkb3B0KCkgLSBEZXNjZW5kIHRocm91Z2ggYSBzdWItdHJlZSBhbmQgYWRv cHQgY2hpbGRyZW4uDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlIHdpdGggdGhlIG1hcGxlIGVu Y29kZWQgbm9kZSBvZiB0aGUgc3ViLXRyZWUuDQorICoNCisgKiBEZXNjZW5kIHRocm91Z2ggYSBz dWItdHJlZSBhbmQgYWRvcHQgY2hpbGRyZW4gd2hvIGRvIG5vdCBoYXZlIHRoZSBjb3JyZWN0DQor ICogcGFyZW50cyBzZXQuICBGb2xsb3cgdGhlIHBhcmVudHMgd2hpY2ggaGF2ZSB0aGUgY29ycmVj dCBwYXJlbnRzIGFzIHRoZXkgYXJlDQorICogdGhlIG5ldyBlbnRyaWVzIHdoaWNoIG5lZWQgdG8g YmUgZm9sbG93ZWQgdG8gZmluZCBvdGhlciBpbmNvcnJlY3RseSBzZXQNCisgKiBwYXJlbnRzLg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfZGVzY2VuZF9hZG9wdChzdHJ1Y3QgbWFfc3Rh dGUgKm1hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSBsaXN0WzNdLCBuZXh0WzNdOw0KKwlpbnQg aSwgbjsNCisNCisJLyoNCisJICogQXQgZWFjaCBsZXZlbCB0aGVyZSBtYXkgYmUgdXAgdG8gMyBj b3JyZWN0IHBhcmVudCBwb2ludGVycyB3aGljaCBpbmRpY2F0ZXMNCisJICogdGhlIG5ldyBub2Rl cyB3aGljaCBuZWVkIHRvIGJlIHdhbGtlZCB0byBmaW5kIGFueSBuZXcgbm9kZXMgYXQgYSBsb3dl ciBsZXZlbC4NCisJICovDQorDQorCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsNCisJCWxpc3Rb aV0gPSAqbWFzOw0KKwkJbGlzdFtpXS5vZmZzZXQgPSAwOw0KKwkJbmV4dFtpXS5vZmZzZXQgPSAw Ow0KKwl9DQorCW5leHRbMF0gPSAqbWFzOw0KKw0KKwl3aGlsZSAoIW10ZV9pc19sZWFmKGxpc3Rb MF0ubm9kZSkpIHsNCisJCW4gPSAwOw0KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgew0KKwkJ CWlmIChtYXNfaXNfbm9uZSgmbGlzdFtpXSkpDQorCQkJCWNvbnRpbnVlOw0KKw0KKwkJCWlmIChp ICYmIGxpc3RbaS0xXS5ub2RlID09IGxpc3RbaV0ubm9kZSkNCisJCQkJY29udGludWU7DQorDQor CQkJd2hpbGUgKChuIDwgMykgJiYgKG1hc19uZXdfY2hpbGQoJmxpc3RbaV0sICZuZXh0W25dKSkp DQorCQkJCW4rKzsNCisNCisJCQltYXNfYWRvcHRfY2hpbGRyZW4oJmxpc3RbaV0sIGxpc3RbaV0u bm9kZSk7DQorCQl9DQorDQorCQl3aGlsZSAobiA8IDMpDQorCQkJbmV4dFtuKytdLm5vZGUgPSBN QVNfTk9ORTsNCisNCisJCS8qIGRlc2NlbmQgYnkgc2V0dGluZyB0aGUgbGlzdCB0byB0aGUgY2hp bGRyZW4gKi8NCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspDQorCQkJbGlzdFtpXSA9IG5leHRb aV07DQorCX0NCit9DQorDQorLyoNCisgKiBtYXNfYnVsa19yZWJhbGFuY2UoKSAtIFJlYmFsYW5j ZSB0aGUgZW5kIG9mIGEgdHJlZSBhZnRlciBhIGJ1bGsgaW5zZXJ0Lg0KKyAqIEBtYXM6IFRoZSBt YXBsZSBzdGF0ZQ0KKyAqIEBlbmQ6IFRoZSBtYXBsZSBub2RlIGVuZA0KKyAqIEBtdDogVGhlIG1h cGxlIG5vZGUgdHlwZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfYnVsa19yZWJhbGFu Y2Uoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGNoYXIgZW5kLA0KKwkJCQkgICAgICBl bnVtIG1hcGxlX3R5cGUgbXQpDQorew0KKwlpZiAoIShtYXMtPm1hc19mbGFncyAmIE1BX1NUQVRF X0JVTEspKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJ CXJldHVybjsNCisNCisJaWYgKGVuZCA+IG10X21pbl9zbG90c1ttdF0pIHsNCisJCW1hcy0+bWFz X2ZsYWdzICY9IH5NQV9TVEFURV9SRUJBTEFOQ0U7DQorCQlyZXR1cm47DQorCX0NCit9DQorDQor LyoNCisgKiBtYXNfc3RvcmVfYl9ub2RlKCkgLSBTdG9yZSBhbiBAZW50cnkgaW50byB0aGUgYl9u b2RlIHdoaWxlIGFsc28gY29weWluZyB0aGUNCisgKiBkYXRhIGZyb20gYSBtYXBsZSBlbmNvZGVk IG5vZGUuDQorICogQHdyX21hczogdGhlIG1hcGxlIHdyaXRlIHN0YXRlDQorICogQGJfbm9kZTog dGhlIG1hcGxlX2JpZ19ub2RlIHRvIGZpbGwgd2l0aCBkYXRhDQorICogQG9mZnNldF9lbmQ6IHRo ZSBvZmZzZXQgdG8gZW5kIGNvcHlpbmcNCisgKg0KKyAqIFJldHVybjogVGhlIGFjdHVhbCBlbmQg b2YgdGhlIGRhdGEgc3RvcmVkIGluIEBiX25vZGUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQg bWFzX3N0b3JlX2Jfbm9kZShzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcywNCisJCXN0cnVjdCBt YXBsZV9iaWdfbm9kZSAqYl9ub2RlLCB1bnNpZ25lZCBjaGFyIG9mZnNldF9lbmQpDQorew0KKwl1 bnNpZ25lZCBjaGFyIHNsb3Q7DQorCXVuc2lnbmVkIGNoYXIgYl9lbmQ7DQorCS8qIFBvc3NpYmxl IHVuZGVyZmxvdyBvZiBwaXYgd2lsbCB3cmFwIGJhY2sgdG8gMCBiZWZvcmUgdXNlLiAqLw0KKwl1 bnNpZ25lZCBsb25nIHBpdjsNCisJc3RydWN0IG1hX3N0YXRlICptYXMgPSB3cl9tYXMtPm1hczsN CisNCisJYl9ub2RlLT50eXBlID0gd3JfbWFzLT50eXBlOw0KKwliX2VuZCA9IDA7DQorCXNsb3Qg PSBtYXMtPm9mZnNldDsNCisJaWYgKHNsb3QpIHsNCisJCS8qIENvcHkgc3RhcnQgZGF0YSB1cCB0 byBpbnNlcnQuICovDQorCQltYXNfbWFiX2NwKG1hcywgMCwgc2xvdCAtIDEsIGJfbm9kZSwgMCk7 DQorCQliX2VuZCA9IGJfbm9kZS0+Yl9lbmQ7DQorCQlwaXYgPSBiX25vZGUtPnBpdm90W2JfZW5k IC0gMV07DQorCX0gZWxzZQ0KKwkJcGl2ID0gbWFzLT5taW4gLSAxOw0KKw0KKwlpZiAocGl2ICsg MSA8IG1hcy0+aW5kZXgpIHsNCisJCS8qIEhhbmRsZSByYW5nZSBzdGFydGluZyBhZnRlciBvbGQg cmFuZ2UgKi8NCisJCWJfbm9kZS0+c2xvdFtiX2VuZF0gPSB3cl9tYXMtPmNvbnRlbnQ7DQorCQlp ZiAoIXdyX21hcy0+Y29udGVudCkNCisJCQliX25vZGUtPmdhcFtiX2VuZF0gPSBtYXMtPmluZGV4 IC0gMSAtIHBpdjsNCisJCWJfbm9kZS0+cGl2b3RbYl9lbmQrK10gPSBtYXMtPmluZGV4IC0gMTsN CisJfQ0KKw0KKwkvKiBTdG9yZSB0aGUgbmV3IGVudHJ5LiAqLw0KKwltYXMtPm9mZnNldCA9IGJf ZW5kOw0KKwliX25vZGUtPnNsb3RbYl9lbmRdID0gd3JfbWFzLT5lbnRyeTsNCisJYl9ub2RlLT5w aXZvdFtiX2VuZF0gPSBtYXMtPmxhc3Q7DQorDQorCS8qIEFwcGVuZGVkLiAqLw0KKwlpZiAobWFz LT5sYXN0ID49IG1hcy0+bWF4KQ0KKwkJZ290byBiX2VuZDsNCisNCisJLyogSGFuZGxlIG5ldyBy YW5nZSBlbmRpbmcgYmVmb3JlIG9sZCByYW5nZSBlbmRzICovDQorCXBpdiA9IG1hc19sb2dpY2Fs X3Bpdm90KG1hcywgd3JfbWFzLT5waXZvdHMsIG9mZnNldF9lbmQsIHdyX21hcy0+dHlwZSk7DQor CWlmIChwaXYgPiBtYXMtPmxhc3QpIHsNCisJCWlmIChwaXYgPT0gVUxPTkdfTUFYKQ0KKwkJCW1h c19idWxrX3JlYmFsYW5jZShtYXMsIGJfbm9kZS0+Yl9lbmQsIHdyX21hcy0+dHlwZSk7DQorDQor CQlpZiAob2Zmc2V0X2VuZCAhPSBzbG90KQ0KKwkJCXdyX21hcy0+Y29udGVudCA9IG1hc19zbG90 X2xvY2tlZChtYXMsIHdyX21hcy0+c2xvdHMsDQorCQkJCQkJCSAgb2Zmc2V0X2VuZCk7DQorDQor CQliX25vZGUtPnNsb3RbKytiX2VuZF0gPSB3cl9tYXMtPmNvbnRlbnQ7DQorCQlpZiAoIXdyX21h cy0+Y29udGVudCkNCisJCQliX25vZGUtPmdhcFtiX2VuZF0gPSBwaXYgLSBtYXMtPmxhc3QgKyAx Ow0KKwkJYl9ub2RlLT5waXZvdFtiX2VuZF0gPSBwaXY7DQorCX0NCisNCisJc2xvdCA9IG9mZnNl dF9lbmQgKyAxOw0KKwlpZiAoc2xvdCA+IHdyX21hcy0+bm9kZV9lbmQpDQorCQlnb3RvIGJfZW5k Ow0KKw0KKwkvKiBDb3B5IGVuZCBkYXRhIHRvIHRoZSBlbmQgb2YgdGhlIG5vZGUuICovDQorCW1h c19tYWJfY3AobWFzLCBzbG90LCB3cl9tYXMtPm5vZGVfZW5kICsgMSwgYl9ub2RlLCArK2JfZW5k KTsNCisJYl9ub2RlLT5iX2VuZC0tOw0KKwlyZXR1cm47DQorDQorYl9lbmQ6DQorCWJfbm9kZS0+ Yl9lbmQgPSBiX2VuZDsNCit9DQorDQorLyoNCisgKiBtYXNfcHJldl9zaWJsaW5nKCkgLSBGaW5k IHRoZSBwcmV2aW91cyBub2RlIHdpdGggdGhlIHNhbWUgcGFyZW50Lg0KKyAqIEBtYXM6IHRoZSBt YXBsZSBzdGF0ZQ0KKyAqDQorICogUmV0dXJuOiBUcnVlIGlmIHRoZXJlIGlzIGEgcHJldmlvdXMg c2libGluZywgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNf cHJldl9zaWJsaW5nKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJdW5zaWduZWQgaW50IHBf c2xvdCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpOw0KKw0KKwlpZiAobXRlX2lzX3Jvb3Qo bWFzLT5ub2RlKSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJaWYgKCFwX3Nsb3QpDQorCQlyZXR1 cm4gZmFsc2U7DQorDQorCW1hc19hc2NlbmQobWFzKTsNCisJbWFzLT5vZmZzZXQgPSBwX3Nsb3Qg LSAxOw0KKwltYXNfZGVzY2VuZChtYXMpOw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorLyoNCisg KiBtYXNfbmV4dF9zaWJsaW5nKCkgLSBGaW5kIHRoZSBuZXh0IG5vZGUgd2l0aCB0aGUgc2FtZSBw YXJlbnQuDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlDQorICoNCisgKiBSZXR1cm46IHRydWUg aWYgdGhlcmUgaXMgYSBuZXh0IHNpYmxpbmcsIGZhbHNlIG90aGVyd2lzZS4NCisgKi8NCitzdGF0 aWMgaW5saW5lIGJvb2wgbWFzX25leHRfc2libGluZyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7 DQorCU1BX1NUQVRFKHBhcmVudCwgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmxhc3QpOw0K Kw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJ cGFyZW50ID0gKm1hczsNCisJbWFzX2FzY2VuZCgmcGFyZW50KTsNCisJcGFyZW50Lm9mZnNldCA9 IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpICsgMTsNCisJaWYgKHBhcmVudC5vZmZzZXQgPiBt YXNfZGF0YV9lbmQoJnBhcmVudCkpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCSptYXMgPSBwYXJl bnQ7DQorCW1hc19kZXNjZW5kKG1hcyk7DQorCXJldHVybiB0cnVlOw0KK30NCisNCisvKg0KKyAq IG10ZV9ub2RlX29yX25vZGUoKSAtIFJldHVybiB0aGUgZW5jb2RlZCBub2RlIG9yIE1BU19OT05F Lg0KKyAqIEBlbm9kZTogVGhlIGVuY29kZWQgbWFwbGUgbm9kZS4NCisgKg0KKyAqIFNob3J0aGFu ZCB0byBhdm9pZCBzZXR0aW5nICVOVUxMcyBpbiB0aGUgdHJlZSBvciBtYXBsZV9zdWJ0cmVlX3N0 YXRlLg0KKyAqDQorICogUmV0dXJuOiBAZW5vZGUgb3IgTUFTX05PTkUNCisgKi8NCitzdGF0aWMg aW5saW5lIHN0cnVjdCBtYXBsZV9lbm9kZSAqbXRlX25vZGVfb3Jfbm9uZShzdHJ1Y3QgbWFwbGVf ZW5vZGUgKmVub2RlKQ0KK3sNCisJaWYgKGVub2RlKQ0KKwkJcmV0dXJuIGVub2RlOw0KKw0KKwly ZXR1cm4gbWFfZW5vZGVfcHRyKE1BU19OT05FKTsNCit9DQorDQorLyoNCisgKiBtYXNfd3Jfbm9k ZV93YWxrKCkgLSBGaW5kIHRoZSBjb3JyZWN0IG9mZnNldCBmb3IgdGhlIGluZGV4IGluIHRoZSBA bWFzLg0KKyAqIEB3cl9tYXM6IFRoZSBtYXBsZSB3cml0ZSBzdGF0ZQ0KKyAqDQorICogVXNlcyBt YXNfc2xvdF9sb2NrZWQoKSBhbmQgZG9lcyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCBkZWFkIG5v ZGVzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfd3Jfbm9kZV93YWxrKHN0cnVjdCBt YV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0YXRlICptYXMgPSB3cl9tYXMt Pm1hczsNCisJdW5zaWduZWQgY2hhciBjb3VudDsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQor CXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1pbiwgbWF4Ow0KKw0KKwlpZiAodW5saWtlbHkobWFfaXNf ZGVuc2Uod3JfbWFzLT50eXBlKSkpIHsNCisJCXdyX21hcy0+cl9tYXggPSB3cl9tYXMtPnJfbWlu ID0gbWFzLT5pbmRleDsNCisJCW1hcy0+b2Zmc2V0ID0gbWFzLT5pbmRleCA9IG1hcy0+bWluOw0K KwkJcmV0dXJuOw0KKwl9DQorDQorCXdyX21hcy0+bm9kZSA9IG1hc19tbih3cl9tYXMtPm1hcyk7 DQorCXdyX21hcy0+cGl2b3RzID0gbWFfcGl2b3RzKHdyX21hcy0+bm9kZSwgd3JfbWFzLT50eXBl KTsNCisJY291bnQgPSB3cl9tYXMtPm5vZGVfZW5kID0gbWFfZGF0YV9lbmQod3JfbWFzLT5ub2Rl LCB3cl9tYXMtPnR5cGUsDQorCQkJCQkgICAgICAgd3JfbWFzLT5waXZvdHMsIG1hcy0+bWF4KTsN CisJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCW1pbiA9IG1hc19zYWZlX21pbihtYXMsIHdyX21h cy0+cGl2b3RzLCBvZmZzZXQpOw0KKwlpZiAodW5saWtlbHkob2Zmc2V0ID09IGNvdW50KSkNCisJ CWdvdG8gbWF4Ow0KKw0KKwltYXggPSB3cl9tYXMtPnBpdm90c1tvZmZzZXRdOw0KKwlpbmRleCA9 IG1hcy0+aW5kZXg7DQorCWlmICh1bmxpa2VseShpbmRleCA8PSBtYXgpKQ0KKwkJZ290byBkb25l Ow0KKw0KKwlpZiAodW5saWtlbHkoIW1heCAmJiBvZmZzZXQpKQ0KKwkJZ290byBtYXg7DQorDQor CW1pbiA9IG1heCArIDE7DQorCXdoaWxlICgrK29mZnNldCA8IGNvdW50KSB7DQorCQltYXggPSB3 cl9tYXMtPnBpdm90c1tvZmZzZXRdOw0KKwkJaWYgKGluZGV4IDw9IG1heCkNCisJCQlnb3RvIGRv bmU7DQorCQllbHNlIGlmICh1bmxpa2VseSghbWF4KSkNCisJCQlicmVhazsNCisNCisJCW1pbiA9 IG1heCArIDE7DQorCX0NCisNCittYXg6DQorCW1heCA9IG1hcy0+bWF4Ow0KK2RvbmU6DQorCXdy X21hcy0+cl9tYXggPSBtYXg7DQorCXdyX21hcy0+cl9taW4gPSBtaW47DQorCXdyX21hcy0+b2Zm c2V0X2VuZCA9IG1hcy0+b2Zmc2V0ID0gb2Zmc2V0Ow0KK30NCisNCisvKg0KKyAqIG1hc190b3Bp YXJ5X3JhbmdlKCkgLSBBZGQgYSByYW5nZSBvZiBzbG90cyB0byB0aGUgdG9waWFyeS4NCisgKiBA bWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZGVzdHJveTogVGhlIHRvcGlhcnkgdG8gYWRkIHRo ZSBzbG90cyAodXN1YWxseSBkZXN0cm95KQ0KKyAqIEBzdGFydDogVGhlIHN0YXJ0aW5nIHNsb3Qg aW5jbHVzaXZlbHkNCisgKiBAZW5kOiBUaGUgZW5kIHNsb3QgaW5jbHVzaXZlbHkNCisgKi8NCitz dGF0aWMgaW5saW5lIHZvaWQgbWFzX3RvcGlhcnlfcmFuZ2Uoc3RydWN0IG1hX3N0YXRlICptYXMs DQorCXN0cnVjdCBtYV90b3BpYXJ5ICpkZXN0cm95LCB1bnNpZ25lZCBjaGFyIHN0YXJ0LCB1bnNp Z25lZCBjaGFyIGVuZCkNCit7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdW5zaWduZWQgY2hh ciBvZmZzZXQ7DQorDQorCU1UX0JVR19PTihtYXMtPnRyZWUsIG10ZV9pc19sZWFmKG1hcy0+bm9k ZSkpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG1hc19tbihtYXMpLCBtdGVfbm9kZV90eXBlKG1hcy0+ bm9kZSkpOw0KKwlmb3IgKG9mZnNldCA9IHN0YXJ0OyBvZmZzZXQgPD0gZW5kOyBvZmZzZXQrKykg ew0KKwkJc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSA9IG1hc19zbG90X2xvY2tlZChtYXMsIHNs b3RzLCBvZmZzZXQpOw0KKw0KKwkJaWYgKG10ZV9kZWFkX25vZGUoZW5vZGUpKQ0KKwkJCWNvbnRp bnVlOw0KKw0KKwkJbWF0X2FkZChkZXN0cm95LCBlbm9kZSk7DQorCX0NCit9DQorDQorLyoNCisg KiBtYXN0X3RvcGlhcnkoKSAtIEFkZCB0aGUgcG9ydGlvbnMgb2YgdGhlIHRyZWUgdG8gdGhlIHJl bW92YWwgbGlzdDsgZWl0aGVyIHRvDQorICogYmUgZnJlZWQgb3IgZGlzY2FyZGVkIChkZXN0cm95 IHdhbGspLg0KKyAqIEBtYXN0OiBUaGUgbWFwbGVfc3VidHJlZV9zdGF0ZS4NCisgKi8NCitzdGF0 aWMgaW5saW5lIHZvaWQgbWFzdF90b3BpYXJ5KHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICpt YXN0KQ0KK3sNCisJTUFfV1JfU1RBVEUod3JfbWFzLCBtYXN0LT5vcmlnX2wsIE5VTEwpOw0KKwl1 bnNpZ25lZCBjaGFyIHJfc3RhcnQsIHJfZW5kOw0KKwl1bnNpZ25lZCBjaGFyIGxfc3RhcnQsIGxf ZW5kOw0KKwl2b2lkIF9fcmN1ICoqbF9zbG90cywgKipyX3Nsb3RzOw0KKw0KKwl3cl9tYXMudHlw ZSA9IG10ZV9ub2RlX3R5cGUobWFzdC0+b3JpZ19sLT5ub2RlKTsNCisJbWFzdC0+b3JpZ19sLT5p bmRleCA9IG1hc3QtPm9yaWdfbC0+bGFzdDsNCisJbWFzX3dyX25vZGVfd2Fsaygmd3JfbWFzKTsN CisJbF9zdGFydCA9IG1hc3QtPm9yaWdfbC0+b2Zmc2V0ICsgMTsNCisJbF9lbmQgPSBtYXNfZGF0 YV9lbmQobWFzdC0+b3JpZ19sKTsNCisJcl9zdGFydCA9IDA7DQorCXJfZW5kID0gbWFzdC0+b3Jp Z19yLT5vZmZzZXQ7DQorDQorCWlmIChyX2VuZCkNCisJCXJfZW5kLS07DQorDQorCWxfc2xvdHMg PSBtYV9zbG90cyhtYXNfbW4obWFzdC0+b3JpZ19sKSwNCisJCQkgICBtdGVfbm9kZV90eXBlKG1h c3QtPm9yaWdfbC0+bm9kZSkpOw0KKw0KKwlyX3Nsb3RzID0gbWFfc2xvdHMobWFzX21uKG1hc3Qt Pm9yaWdfciksDQorCQkJICAgbXRlX25vZGVfdHlwZShtYXN0LT5vcmlnX3ItPm5vZGUpKTsNCisN CisJaWYgKChsX3N0YXJ0IDwgbF9lbmQpICYmDQorCSAgICBtdGVfZGVhZF9ub2RlKG1hc19zbG90 X2xvY2tlZChtYXN0LT5vcmlnX2wsIGxfc2xvdHMsIGxfc3RhcnQpKSkgew0KKwkJbF9zdGFydCsr Ow0KKwl9DQorDQorCWlmIChtdGVfZGVhZF9ub2RlKG1hc19zbG90X2xvY2tlZChtYXN0LT5vcmln X3IsIHJfc2xvdHMsIHJfZW5kKSkpIHsNCisJCWlmIChyX2VuZCkNCisJCQlyX2VuZC0tOw0KKwl9 DQorDQorCWlmICgobF9zdGFydCA+IHJfZW5kKSAmJiAobWFzdC0+b3JpZ19sLT5ub2RlID09IG1h c3QtPm9yaWdfci0+bm9kZSkpDQorCQlyZXR1cm47DQorDQorCS8qIEF0IHRoZSBub2RlIHdoZXJl IGxlZnQgYW5kIHJpZ2h0IHNpZGVzIG1lZXQsIGFkZCB0aGUgcGFydHMgYmV0d2VlbiAqLw0KKwlp ZiAobWFzdC0+b3JpZ19sLT5ub2RlID09IG1hc3QtPm9yaWdfci0+bm9kZSkgew0KKwkJcmV0dXJu IG1hc190b3BpYXJ5X3JhbmdlKG1hc3QtPm9yaWdfbCwgbWFzdC0+ZGVzdHJveSwNCisJCQkJCSAg ICAgbF9zdGFydCwgcl9lbmQpOw0KKwl9DQorDQorCS8qIG1hc3QtPm9yaWdfciBpcyBkaWZmZXJl bnQgYW5kIGNvbnN1bWVkLiAqLw0KKwlpZiAobXRlX2lzX2xlYWYobWFzdC0+b3JpZ19yLT5ub2Rl KSkNCisJCXJldHVybjsNCisNCisJaWYgKG10ZV9kZWFkX25vZGUobWFzX3Nsb3RfbG9ja2VkKG1h c3QtPm9yaWdfbCwgbF9zbG90cywgbF9lbmQpKSkNCisJCWxfZW5kLS07DQorDQorDQorCWlmIChs X3N0YXJ0IDw9IGxfZW5kKQ0KKwkJbWFzX3RvcGlhcnlfcmFuZ2UobWFzdC0+b3JpZ19sLCBtYXN0 LT5kZXN0cm95LCBsX3N0YXJ0LCBsX2VuZCk7DQorDQorCWlmIChtdGVfZGVhZF9ub2RlKG1hc19z bG90X2xvY2tlZChtYXN0LT5vcmlnX3IsIHJfc2xvdHMsIHJfc3RhcnQpKSkNCisJCXJfc3RhcnQr KzsNCisNCisJaWYgKHJfc3RhcnQgPD0gcl9lbmQpDQorCQltYXNfdG9waWFyeV9yYW5nZShtYXN0 LT5vcmlnX3IsIG1hc3QtPmRlc3Ryb3ksIDAsIHJfZW5kKTsNCit9DQorDQorLyoNCisgKiBtYXN0 X3JlYmFsYW5jZV9uZXh0KCkgLSBSZWJhbGFuY2UgYWdhaW5zdCB0aGUgbmV4dCBub2RlDQorICog QG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICogQG9sZF9yOiBUaGUgZW5jb2RlZCBt YXBsZSBub2RlIHRvIHRoZSByaWdodCAobmV4dCBub2RlKS4NCisgKi8NCitzdGF0aWMgaW5saW5l IHZvaWQgbWFzdF9yZWJhbGFuY2VfbmV4dChzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFz dCkNCit7DQorCXVuc2lnbmVkIGNoYXIgYl9lbmQgPSBtYXN0LT5ibi0+Yl9lbmQ7DQorDQorCW1h c19tYWJfY3AobWFzdC0+b3JpZ19yLCAwLCBtdF9zbG90X2NvdW50KG1hc3QtPm9yaWdfci0+bm9k ZSksDQorCQkgICBtYXN0LT5ibiwgYl9lbmQpOw0KKwltYXN0LT5vcmlnX3ItPmxhc3QgPSBtYXN0 LT5vcmlnX3ItPm1heDsNCit9DQorDQorLyoNCisgKiBtYXN0X3JlYmFsYW5jZV9wcmV2KCkgLSBS ZWJhbGFuY2UgYWdhaW5zdCB0aGUgcHJldmlvdXMgbm9kZQ0KKyAqIEBtYXN0OiBUaGUgbWFwbGUg c3VidHJlZSBzdGF0ZQ0KKyAqIEBvbGRfbDogVGhlIGVuY29kZWQgbWFwbGUgbm9kZSB0byB0aGUg bGVmdCAocHJldmlvdXMgbm9kZSkNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9yZWJh bGFuY2VfcHJldihzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCkNCit7DQorCXVuc2ln bmVkIGNoYXIgZW5kID0gbWFzX2RhdGFfZW5kKG1hc3QtPm9yaWdfbCkgKyAxOw0KKwl1bnNpZ25l ZCBjaGFyIGJfZW5kID0gbWFzdC0+Ym4tPmJfZW5kOw0KKw0KKwltYWJfc2hpZnRfcmlnaHQobWFz dC0+Ym4sIGVuZCk7DQorCW1hc19tYWJfY3AobWFzdC0+b3JpZ19sLCAwLCBlbmQgLSAxLCBtYXN0 LT5ibiwgMCk7DQorCW1hc3QtPmwtPm1pbiA9IG1hc3QtPm9yaWdfbC0+bWluOw0KKwltYXN0LT5v cmlnX2wtPmluZGV4ID0gbWFzdC0+b3JpZ19sLT5taW47DQorCW1hc3QtPmJuLT5iX2VuZCA9IGVu ZCArIGJfZW5kOw0KKwltYXN0LT5sLT5vZmZzZXQgKz0gZW5kOw0KK30NCisNCisvKg0KKyAqIG1h c3Rfc3Bhbm5pbmdfcmViYWxhbmNlKCkgLSBSZWJhbGFuY2Ugbm9kZXMgd2l0aCBuZWFyZXN0IG5l aWdoYm91ciBmYXZvdXJpbmcNCisgKiB0aGUgbm9kZSB0byB0aGUgcmlnaHQuICBDaGVja2luZyB0 aGUgbm9kZXMgdG8gdGhlIHJpZ2h0IHRoZW4gdGhlIGxlZnQgYXQgZWFjaA0KKyAqIGxldmVsIHVw d2FyZHMgdW50aWwgcm9vdCBpcyByZWFjaGVkLiAgRnJlZSBhbmQgZGVzdHJveSBhcyBuZWVkZWQu DQorICogRGF0YSBpcyBjb3BpZWQgaW50byB0aGUgQG1hc3QtPmJuLg0KKyAqIEBtYXN0OiBUaGUg bWFwbGVfc3VidHJlZV9zdGF0ZS4NCisgKi8NCitzdGF0aWMgaW5saW5lDQorYm9vbCBtYXN0X3Nw YW5uaW5nX3JlYmFsYW5jZShzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCkNCit7DQor CXN0cnVjdCBtYV9zdGF0ZSByX3RtcCA9ICptYXN0LT5vcmlnX3I7DQorCXN0cnVjdCBtYV9zdGF0 ZSBsX3RtcCA9ICptYXN0LT5vcmlnX2w7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqYW5jZXN0b3Ig PSBOVUxMOw0KKwl1bnNpZ25lZCBjaGFyIHN0YXJ0LCBlbmQ7DQorCXVuc2lnbmVkIGNoYXIgZGVw dGggPSAwOw0KKw0KKwlyX3RtcCA9ICptYXN0LT5vcmlnX3I7DQorCWxfdG1wID0gKm1hc3QtPm9y aWdfbDsNCisJZG8gew0KKwkJbWFzX2FzY2VuZChtYXN0LT5vcmlnX3IpOw0KKwkJbWFzX2FzY2Vu ZChtYXN0LT5vcmlnX2wpOw0KKwkJZGVwdGgrKzsNCisJCWlmICghYW5jZXN0b3IgJiYNCisJCSAg ICAobWFzdC0+b3JpZ19yLT5ub2RlID09IG1hc3QtPm9yaWdfbC0+bm9kZSkpIHsNCisJCQlhbmNl c3RvciA9IG1hc3QtPm9yaWdfci0+bm9kZTsNCisJCQllbmQgPSBtYXN0LT5vcmlnX3ItPm9mZnNl dCAtIDE7DQorCQkJc3RhcnQgPSBtYXN0LT5vcmlnX2wtPm9mZnNldCArIDE7DQorCQl9DQorDQor CQlpZiAobWFzdC0+b3JpZ19yLT5vZmZzZXQgPCBtYXNfZGF0YV9lbmQobWFzdC0+b3JpZ19yKSkg ew0KKwkJCWlmICghYW5jZXN0b3IpIHsNCisJCQkJYW5jZXN0b3IgPSBtYXN0LT5vcmlnX3ItPm5v ZGU7DQorCQkJCXN0YXJ0ID0gMDsNCisJCQl9DQorDQorCQkJbWFzdC0+b3JpZ19yLT5vZmZzZXQr KzsNCisJCQlkbyB7DQorCQkJCW1hc19kZXNjZW5kKG1hc3QtPm9yaWdfcik7DQorCQkJCW1hc3Qt Pm9yaWdfci0+b2Zmc2V0ID0gMDsNCisJCQkJZGVwdGgtLTsNCisJCQl9IHdoaWxlIChkZXB0aCk7 DQorDQorCQkJbWFzdF9yZWJhbGFuY2VfbmV4dChtYXN0KTsNCisJCQlkbyB7DQorCQkJCXVuc2ln bmVkIGNoYXIgbF9vZmYgPSAwOw0KKwkJCQlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmNoaWxkID0gcl90 bXAubm9kZTsNCisNCisJCQkJbWFzX2FzY2VuZCgmcl90bXApOw0KKwkJCQlpZiAoYW5jZXN0b3Ig PT0gcl90bXAubm9kZSkNCisJCQkJCWxfb2ZmID0gc3RhcnQ7DQorDQorCQkJCWlmIChyX3RtcC5v ZmZzZXQpDQorCQkJCQlyX3RtcC5vZmZzZXQtLTsNCisNCisJCQkJaWYgKGxfb2ZmIDwgcl90bXAu b2Zmc2V0KQ0KKwkJCQkJbWFzX3RvcGlhcnlfcmFuZ2UoJnJfdG1wLCBtYXN0LT5kZXN0cm95LA0K KwkJCQkJCQkgIGxfb2ZmLCByX3RtcC5vZmZzZXQpOw0KKw0KKwkJCQlpZiAobF90bXAubm9kZSAh PSBjaGlsZCkNCisJCQkJCW1hdF9hZGQobWFzdC0+ZnJlZSwgY2hpbGQpOw0KKw0KKwkJCX0gd2hp bGUgKHJfdG1wLm5vZGUgIT0gYW5jZXN0b3IpOw0KKw0KKwkJCSptYXN0LT5vcmlnX2wgPSBsX3Rt cDsNCisJCQlyZXR1cm4gdHJ1ZTsNCisNCisJCX0gZWxzZSBpZiAobWFzdC0+b3JpZ19sLT5vZmZz ZXQgIT0gMCkgew0KKwkJCWlmICghYW5jZXN0b3IpIHsNCisJCQkJYW5jZXN0b3IgPSBtYXN0LT5v cmlnX2wtPm5vZGU7DQorCQkJCWVuZCA9IG1hc19kYXRhX2VuZChtYXN0LT5vcmlnX2wpOw0KKwkJ CX0NCisNCisJCQltYXN0LT5vcmlnX2wtPm9mZnNldC0tOw0KKwkJCWRvIHsNCisJCQkJbWFzX2Rl c2NlbmQobWFzdC0+b3JpZ19sKTsNCisJCQkJbWFzdC0+b3JpZ19sLT5vZmZzZXQgPQ0KKwkJCQkJ bWFzX2RhdGFfZW5kKG1hc3QtPm9yaWdfbCk7DQorCQkJCWRlcHRoLS07DQorCQkJfSB3aGlsZSAo ZGVwdGgpOw0KKw0KKwkJCW1hc3RfcmViYWxhbmNlX3ByZXYobWFzdCk7DQorCQkJZG8gew0KKwkJ CQl1bnNpZ25lZCBjaGFyIHJfb2ZmOw0KKwkJCQlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmNoaWxkID0g bF90bXAubm9kZTsNCisNCisJCQkJbWFzX2FzY2VuZCgmbF90bXApOw0KKwkJCQlpZiAoYW5jZXN0 b3IgPT0gbF90bXAubm9kZSkNCisJCQkJCXJfb2ZmID0gZW5kOw0KKwkJCQllbHNlDQorCQkJCQly X29mZiA9IG1hc19kYXRhX2VuZCgmbF90bXApOw0KKw0KKwkJCQlpZiAobF90bXAub2Zmc2V0IDwg cl9vZmYpDQorCQkJCQlsX3RtcC5vZmZzZXQrKzsNCisNCisJCQkJaWYgKGxfdG1wLm9mZnNldCA8 IHJfb2ZmKQ0KKwkJCQkJbWFzX3RvcGlhcnlfcmFuZ2UoJmxfdG1wLCBtYXN0LT5kZXN0cm95LA0K KwkJCQkJCQkgIGxfdG1wLm9mZnNldCwgcl9vZmYpOw0KKw0KKwkJCQlpZiAocl90bXAubm9kZSAh PSBjaGlsZCkNCisJCQkJCW1hdF9hZGQobWFzdC0+ZnJlZSwgY2hpbGQpOw0KKw0KKwkJCX0gd2hp bGUgKGxfdG1wLm5vZGUgIT0gYW5jZXN0b3IpOw0KKw0KKwkJCSptYXN0LT5vcmlnX3IgPSByX3Rt cDsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJfSB3aGlsZSAoIW10ZV9pc19yb290KG1hc3Qt Pm9yaWdfci0+bm9kZSkpOw0KKw0KKwkqbWFzdC0+b3JpZ19yID0gcl90bXA7DQorCSptYXN0LT5v cmlnX2wgPSBsX3RtcDsNCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCisvKg0KKyAqIG1hc3RfYXNj ZW5kX2ZyZWUoKSAtIEFkZCBjdXJyZW50IG9yaWdpbmFsIG1hcGxlIHN0YXRlIG5vZGVzIHRvIHRo ZSBmcmVlIGxpc3QNCisgKiBhbmQgYXNjZW5kLg0KKyAqIEBtYXN0OiB0aGUgbWFwbGUgc3VidHJl ZSBzdGF0ZS4NCisgKg0KKyAqIEFzY2VuZCB0aGUgb3JpZ2luYWwgbGVmdCBhbmQgcmlnaHQgc2lk ZXMgYW5kIGFkZCB0aGUgcHJldmlvdXMgbm9kZXMgdG8gdGhlDQorICogZnJlZSBsaXN0LiAgU2V0 IHRoZSBzbG90cyB0byBwb2ludCB0byB0aGUgY29ycmVjdCBsb2NhdGlvbiBpbiB0aGUgbmV3IG5v ZGVzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZA0KK21hc3RfYXNjZW5kX2ZyZWUoc3RydWN0 IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QpDQorew0KKwlNQV9XUl9TVEFURSh3cl9tYXMsIG1h c3QtPm9yaWdfciwgIE5VTEwpOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmxlZnQgPSBtYXN0LT5v cmlnX2wtPm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqcmlnaHQgPSBtYXN0LT5vcmlnX3It Pm5vZGU7DQorDQorCW1hc19hc2NlbmQobWFzdC0+b3JpZ19sKTsNCisJbWFzX2FzY2VuZChtYXN0 LT5vcmlnX3IpOw0KKwltYXRfYWRkKG1hc3QtPmZyZWUsIGxlZnQpOw0KKw0KKwlpZiAobGVmdCAh PSByaWdodCkNCisJCW1hdF9hZGQobWFzdC0+ZnJlZSwgcmlnaHQpOw0KKw0KKwltYXN0LT5vcmln X3ItPm9mZnNldCA9IDA7DQorCW1hc3QtPm9yaWdfci0+aW5kZXggPSBtYXN0LT5yLT5tYXg7DQor CS8qIGxhc3Qgc2hvdWxkIGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIGluZGV4ICovDQorCWlm IChtYXN0LT5vcmlnX3ItPmxhc3QgPCBtYXN0LT5vcmlnX3ItPmluZGV4KQ0KKwkJbWFzdC0+b3Jp Z19yLT5sYXN0ID0gbWFzdC0+b3JpZ19yLT5pbmRleDsNCisJLyoNCisJICogVGhlIG5vZGUgbWF5 IG5vdCBjb250YWluIHRoZSB2YWx1ZSBzbyBzZXQgc2xvdCB0byBlbnN1cmUgYWxsDQorCSAqIG9m IHRoZSBub2RlcyBjb250ZW50cyBhcmUgZnJlZWQgb3IgZGVzdHJveWVkLg0KKwkgKi8NCisJd3Jf bWFzLnR5cGUgPSBtdGVfbm9kZV90eXBlKG1hc3QtPm9yaWdfci0+bm9kZSk7DQorCW1hc193cl9u b2RlX3dhbGsoJndyX21hcyk7DQorCS8qIFNldCB1cCB0aGUgbGVmdCBzaWRlIG9mIHRoaW5ncyAq Lw0KKwltYXN0LT5vcmlnX2wtPm9mZnNldCA9IDA7DQorCW1hc3QtPm9yaWdfbC0+aW5kZXggPSBt YXN0LT5sLT5taW47DQorCXdyX21hcy5tYXMgPSBtYXN0LT5vcmlnX2w7DQorCXdyX21hcy50eXBl ID0gbXRlX25vZGVfdHlwZShtYXN0LT5vcmlnX2wtPm5vZGUpOw0KKwltYXNfd3Jfbm9kZV93YWxr KCZ3cl9tYXMpOw0KKw0KKwltYXN0LT5ibi0+dHlwZSA9IHdyX21hcy50eXBlOw0KK30NCisNCisv Kg0KKyAqIG1hc19uZXdfbWFfbm9kZSgpIC0gQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgbWFwbGUg bm9kZS4gIEhlbHBlciBmdW5jdGlvbi4NCisgKiBAbWFzOiB0aGUgbWFwbGUgc3RhdGUgd2l0aCB0 aGUgYWxsb2NhdGlvbnMuDQorICogQGJfbm9kZTogdGhlIG1hcGxlX2JpZ19ub2RlIHdpdGggdGhl IHR5cGUgZW5jb2RpbmcuDQorICoNCisgKiBVc2UgdGhlIG5vZGUgdHlwZSBmcm9tIHRoZSBtYXBs ZV9iaWdfbm9kZSB0byBhbGxvY2F0ZSBhIG5ldyBub2RlIGZyb20gdGhlDQorICogbWFfc3RhdGUu ICBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBtYWlubHkgZm9yIGNvZGUgcmVhZGFiaWxpdHkuDQorICoN CisgKiBSZXR1cm46IEEgbmV3IG1hcGxlIGVuY29kZWQgbm9kZQ0KKyAqLw0KK3N0YXRpYyBpbmxp bmUgc3RydWN0IG1hcGxlX2Vub2RlDQorKm1hc19uZXdfbWFfbm9kZShzdHJ1Y3QgbWFfc3RhdGUg Km1hcywgc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUpDQorew0KKwlyZXR1cm4gbXRfbWtf bm9kZShtYV9tbm9kZV9wdHIobWFzX3BvcF9ub2RlKG1hcykpLCBiX25vZGUtPnR5cGUpOw0KK30N CisNCisvKg0KKyAqIG1hc19tYWJfdG9fbm9kZSgpIC0gU2V0IHVwIHJpZ2h0IGFuZCBtaWRkbGUg bm9kZXMNCisgKg0KKyAqIEBtYXM6IHRoZSBtYXBsZSBzdGF0ZSB0aGF0IGNvbnRhaW5zIHRoZSBh bGxvY2F0aW9ucy4NCisgKiBAYl9ub2RlOiB0aGUgbm9kZSB3aGljaCBjb250YWlucyB0aGUgZGF0 YS4NCisgKiBAbGVmdDogVGhlIHBvaW50ZXIgd2hpY2ggd2lsbCBoYXZlIHRoZSBsZWZ0IG5vZGUN CisgKiBAcmlnaHQ6IFRoZSBwb2ludGVyIHdoaWNoIG1heSBoYXZlIHRoZSByaWdodCBub2RlDQor ICogQG1pZGRsZTogdGhlIHBvaW50ZXIgd2hpY2ggbWF5IGhhdmUgdGhlIG1pZGRsZSBub2RlIChy YXJlKQ0KKyAqIEBtaWRfc3BsaXQ6IHRoZSBzcGxpdCBsb2NhdGlvbiBmb3IgdGhlIG1pZGRsZSBu b2RlDQorICoNCisgKiBSZXR1cm46IHRoZSBzcGxpdCBvZiBsZWZ0Lg0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdW5zaWduZWQgY2hhciBtYXNfbWFiX3RvX25vZGUoc3RydWN0IG1hX3N0YXRlICptYXMs DQorCXN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlLCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKips ZWZ0LA0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKipyaWdodCwgc3RydWN0IG1hcGxlX2Vub2RlICoq bWlkZGxlLA0KKwl1bnNpZ25lZCBjaGFyICptaWRfc3BsaXQsIHVuc2lnbmVkIGxvbmcgbWluKQ0K K3sNCisJdW5zaWduZWQgY2hhciBzcGxpdCA9IDA7DQorCXVuc2lnbmVkIGNoYXIgc2xvdF9jb3Vu dCA9IG10X3Nsb3RzW2Jfbm9kZS0+dHlwZV07DQorDQorCSpsZWZ0ID0gbWFzX25ld19tYV9ub2Rl KG1hcywgYl9ub2RlKTsNCisJKnJpZ2h0ID0gTlVMTDsNCisJKm1pZGRsZSA9IE5VTEw7DQorCSpt aWRfc3BsaXQgPSAwOw0KKw0KKwlpZiAoYl9ub2RlLT5iX2VuZCA8IHNsb3RfY291bnQpIHsNCisJ CXNwbGl0ID0gYl9ub2RlLT5iX2VuZDsNCisJfSBlbHNlIHsNCisJCXNwbGl0ID0gbWFiX2NhbGNf c3BsaXQobWFzLCBiX25vZGUsIG1pZF9zcGxpdCwgbWluKTsNCisJCSpyaWdodCA9IG1hc19uZXdf bWFfbm9kZShtYXMsIGJfbm9kZSk7DQorCX0NCisNCisJaWYgKCptaWRfc3BsaXQpDQorCQkqbWlk ZGxlID0gbWFzX25ld19tYV9ub2RlKG1hcywgYl9ub2RlKTsNCisNCisJcmV0dXJuIHNwbGl0Ow0K Kw0KK30NCisNCisvKg0KKyAqIG1hYl9zZXRfYl9lbmQoKSAtIEFkZCBlbnRyeSB0byBiX25vZGUg YXQgYl9ub2RlLT5iX2VuZCBhbmQgaW5jcmVtZW50IHRoZSBlbmQNCisgKiBwb2ludGVyLg0KKyAq IEBiX25vZGUgLSB0aGUgYmlnIG5vZGUgdG8gYWRkIHRoZSBlbnRyeQ0KKyAqIEBtYXMgLSB0aGUg bWFwbGUgc3RhdGUgdG8gZ2V0IHRoZSBwaXZvdCAobWFzLT5tYXgpDQorICogQGVudHJ5IC0gdGhl IGVudHJ5IHRvIGFkZCwgaWYgTlVMTCBub3RoaW5nIGhhcHBlbnMuDQorICovDQorc3RhdGljIGlu bGluZSB2b2lkIG1hYl9zZXRfYl9lbmQoc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUsDQor CQkJCSBzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCQkJIHZvaWQgKmVudHJ5KQ0KK3sNCisJaWYg KCFlbnRyeSkNCisJCXJldHVybjsNCisNCisJYl9ub2RlLT5zbG90W2Jfbm9kZS0+Yl9lbmRdID0g ZW50cnk7DQorCWlmIChtdF9pc19hbGxvYyhtYXMtPnRyZWUpKQ0KKwkJYl9ub2RlLT5nYXBbYl9u b2RlLT5iX2VuZF0gPSBtYXNfbWF4X2dhcChtYXMpOw0KKwliX25vZGUtPnBpdm90W2Jfbm9kZS0+ Yl9lbmQrK10gPSBtYXMtPm1heDsNCit9DQorDQorLyoNCisgKiBtYXNfc2V0X3NwbGl0X3BhcmVu dCgpIC0gY29tYmluZV90aGVuX3NlcGFyYXRlIGhlbHBlciBmdW5jdGlvbi4gIFNldHMgdGhlIHBh cmVudA0KKyAqIG9mIEBtYXMtPm5vZGUgdG8gZWl0aGVyIEBsZWZ0IG9yIEByaWdodCwgZGVwZW5k aW5nIG9uIEBzbG90IGFuZCBAc3BsaXQNCisgKg0KKyAqIEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUg d2l0aCB0aGUgbm9kZSB0aGF0IG5lZWRzIGEgcGFyZW50DQorICogQGxlZnQgLSBwb3NzaWJsZSBw YXJlbnQgMQ0KKyAqIEByaWdodCAtIHBvc3NpYmxlIHBhcmVudCAyDQorICogQHNsb3QgLSB0aGUg c2xvdCB0aGUgbWFzLT5ub2RlIHdhcyBwbGFjZWQNCisgKiBAc3BsaXQgLSB0aGUgc3BsaXQgbG9j YXRpb24gYmV0d2VlbiBAbGVmdCBhbmQgQHJpZ2h0DQorICovDQorc3RhdGljIGlubGluZSB2b2lk IG1hc19zZXRfc3BsaXRfcGFyZW50KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkJCQkJc3RydWN0 IG1hcGxlX2Vub2RlICpsZWZ0LA0KKwkJCQkJc3RydWN0IG1hcGxlX2Vub2RlICpyaWdodCwNCisJ CQkJCXVuc2lnbmVkIGNoYXIgKnNsb3QsIHVuc2lnbmVkIGNoYXIgc3BsaXQpDQorew0KKwlpZiAo bWFzX2lzX25vbmUobWFzKSkNCisJCXJldHVybjsNCisNCisJaWYgKCgqc2xvdCkgPD0gc3BsaXQp DQorCQltdGVfc2V0X3BhcmVudChtYXMtPm5vZGUsIGxlZnQsICpzbG90KTsNCisJZWxzZSBpZiAo cmlnaHQpDQorCQltdGVfc2V0X3BhcmVudChtYXMtPm5vZGUsIHJpZ2h0LCAoKnNsb3QpIC0gc3Bs aXQgLSAxKTsNCisNCisJKCpzbG90KSsrOw0KK30NCisNCisvKg0KKyAqIG10ZV9taWRfc3BsaXRf Y2hlY2soKSAtIENoZWNrIGlmIHRoZSBuZXh0IG5vZGUgcGFzc2VzIHRoZSBtaWQtc3BsaXQNCisg KiBAKipsOiBQb2ludGVyIHRvIGxlZnQgZW5jb2RlZCBtYXBsZSBub2RlLg0KKyAqIEAqKm06IFBv aW50ZXIgdG8gbWlkZGxlIGVuY29kZWQgbWFwbGUgbm9kZS4NCisgKiBAKipyOiBQb2ludGVyIHRv IHJpZ2h0IGVuY29kZWQgbWFwbGUgbm9kZS4NCisgKiBAc2xvdDogVGhlIG9mZnNldA0KKyAqIEAq c3BsaXQ6IFRoZSBzcGxpdCBsb2NhdGlvbi4NCisgKiBAbWlkX3NwbGl0OiBUaGUgbWlkZGxlIHNw bGl0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdGVfbWlkX3NwbGl0X2NoZWNrKHN0cnVj dCBtYXBsZV9lbm9kZSAqKmwsDQorCQkJCSAgICAgICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKipyLA0K KwkJCQkgICAgICAgc3RydWN0IG1hcGxlX2Vub2RlICpyaWdodCwNCisJCQkJICAgICAgIHVuc2ln bmVkIGNoYXIgc2xvdCwNCisJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnNwbGl0LA0KKwkJCQkg ICAgICAgdW5zaWduZWQgY2hhciBtaWRfc3BsaXQpDQorew0KKwlpZiAoKnIgPT0gcmlnaHQpDQor CQlyZXR1cm47DQorDQorCWlmIChzbG90IDwgbWlkX3NwbGl0KQ0KKwkJcmV0dXJuOw0KKw0KKwkq bCA9ICpyOw0KKwkqciA9IHJpZ2h0Ow0KKwkqc3BsaXQgPSBtaWRfc3BsaXQ7DQorfQ0KKw0KKy8q DQorICogbWFzdF9zZXRfc3BsaXRfcGFyZW50cygpIC0gSGVscGVyIGZ1bmN0aW9uIHRvIHNldCB0 aHJlZSBub2RlcyBwYXJlbnRzLiAgU2xvdA0KKyAqIGlzIHRha2VuIGZyb20gQG1hc3QtPmwuDQor ICogQG1hc3QgLSB0aGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBsZWZ0IC0gdGhlIGxlZnQg bm9kZQ0KKyAqIEByaWdodCAtIHRoZSByaWdodCBub2RlDQorICogQHNwbGl0IC0gdGhlIHNwbGl0 IGxvY2F0aW9uLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXN0X3NldF9zcGxpdF9wYXJl bnRzKHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0LA0KKwkJCQkJICBzdHJ1Y3QgbWFw bGVfZW5vZGUgKmxlZnQsDQorCQkJCQkgIHN0cnVjdCBtYXBsZV9lbm9kZSAqbWlkZGxlLA0KKwkJ CQkJICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKnJpZ2h0LA0KKwkJCQkJICB1bnNpZ25lZCBjaGFyIHNw bGl0LA0KKwkJCQkJICB1bnNpZ25lZCBjaGFyIG1pZF9zcGxpdCkNCit7DQorCXVuc2lnbmVkIGNo YXIgc2xvdDsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpsID0gbGVmdDsNCisJc3RydWN0IG1hcGxl X2Vub2RlICpyID0gcmlnaHQ7DQorDQorCWlmIChtYXNfaXNfbm9uZShtYXN0LT5sKSkNCisJCXJl dHVybjsNCisNCisJaWYgKG1pZGRsZSkNCisJCXIgPSBtaWRkbGU7DQorDQorCXNsb3QgPSBtYXN0 LT5sLT5vZmZzZXQ7DQorDQorCW10ZV9taWRfc3BsaXRfY2hlY2soJmwsICZyLCByaWdodCwgc2xv dCwgJnNwbGl0LCBtaWRfc3BsaXQpOw0KKwltYXNfc2V0X3NwbGl0X3BhcmVudChtYXN0LT5sLCBs LCByLCAmc2xvdCwgc3BsaXQpOw0KKw0KKwltdGVfbWlkX3NwbGl0X2NoZWNrKCZsLCAmciwgcmln aHQsIHNsb3QsICZzcGxpdCwgbWlkX3NwbGl0KTsNCisJbWFzX3NldF9zcGxpdF9wYXJlbnQobWFz dC0+bSwgbCwgciwgJnNsb3QsIHNwbGl0KTsNCisNCisJbXRlX21pZF9zcGxpdF9jaGVjaygmbCwg JnIsIHJpZ2h0LCBzbG90LCAmc3BsaXQsIG1pZF9zcGxpdCk7DQorCW1hc19zZXRfc3BsaXRfcGFy ZW50KG1hc3QtPnIsIGwsIHIsICZzbG90LCBzcGxpdCk7DQorfQ0KKw0KKy8qDQorICogbWFzX3dt Yl9yZXBsYWNlKCkgLSBXcml0ZSBtZW1vcnkgYmFycmllciBhbmQgcmVwbGFjZQ0KKyAqIEBtYXM6 IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBmcmVlOiB0aGUgbWFwbGUgdG9waWFyeSBsaXN0IG9mIG5v ZGVzIHRvIGZyZWUNCisgKiBAZGVzdHJveTogVGhlIG1hcGxlIHRvcGlhcnkgbGlzdCBvZiBub2Rl cyB0byBkZXN0cm95ICh3YWxrIGFuZCBmcmVlKQ0KKyAqDQorICogVXBkYXRlcyBnYXAgYXMgbmVj ZXNzYXJ5Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfd21iX3JlcGxhY2Uoc3RydWN0 IG1hX3N0YXRlICptYXMsDQorCQkJCSAgIHN0cnVjdCBtYV90b3BpYXJ5ICpmcmVlLA0KKwkJCQkg ICBzdHJ1Y3QgbWFfdG9waWFyeSAqZGVzdHJveSkNCit7DQorCS8qIEFsbCBub2RlcyBtdXN0IHNl ZSBvbGQgZGF0YSBhcyBkZWFkIHByaW9yIHRvIHJlcGxhY2luZyB0aGF0IGRhdGEgKi8NCisJc21w X3dtYigpOyAvKiBOZWVkZWQgZm9yIFJDVSAqLw0KKw0KKwkvKiBJbnNlcnQgdGhlIG5ldyBkYXRh IGluIHRoZSB0cmVlICovDQorCW1hc19yZXBsYWNlKG1hcywgdHJ1ZSk7DQorDQorCWlmICghbXRl X2lzX2xlYWYobWFzLT5ub2RlKSkNCisJCW1hc19kZXNjZW5kX2Fkb3B0KG1hcyk7DQorDQorCW1h c19tYXRfZnJlZShtYXMsIGZyZWUpOw0KKw0KKwlpZiAoZGVzdHJveSkNCisJCW1hc19tYXRfZGVz dHJveShtYXMsIGRlc3Ryb3kpOw0KKw0KKwlpZiAobXRlX2lzX2xlYWYobWFzLT5ub2RlKSkNCisJ CXJldHVybjsNCisNCisJbWFzX3VwZGF0ZV9nYXAobWFzKTsNCit9DQorDQorLyoNCisgKiBtYXN0 X25ld19yb290KCkgLSBTZXQgYSBuZXcgdHJlZSByb290IGR1cmluZyBzdWJ0cmVlIGNyZWF0aW9u DQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICogQG1hczogVGhlIG1hcGxl IHN0YXRlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc3RfbmV3X3Jvb3Qoc3RydWN0IG1h cGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QsDQorCQkJCSBzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7 DQorCW1hc19tbihtYXN0LT5sKS0+cGFyZW50ID0NCisJCW1hX3BhcmVudF9wdHIoKCh1bnNpZ25l ZCBsb25nKW1hcy0+dHJlZSB8IE1BX1JPT1RfUEFSRU5UKSk7DQorCWlmICghbXRlX2RlYWRfbm9k ZShtYXN0LT5vcmlnX2wtPm5vZGUpICYmDQorCSAgICAhbXRlX2lzX3Jvb3QobWFzdC0+b3JpZ19s LT5ub2RlKSkgew0KKwkJZG8gew0KKwkJCW1hc3RfYXNjZW5kX2ZyZWUobWFzdCk7DQorCQkJbWFz dF90b3BpYXJ5KG1hc3QpOw0KKwkJfSB3aGlsZSAoIW10ZV9pc19yb290KG1hc3QtPm9yaWdfbC0+ bm9kZSkpOw0KKwl9DQorCWlmICgobWFzdC0+b3JpZ19sLT5ub2RlICE9IG1hcy0+bm9kZSkgJiYN CisJCSAgIChtYXN0LT5sLT5kZXB0aCA+IG1hc19tdF9oZWlnaHQobWFzKSkpIHsNCisJCW1hdF9h ZGQobWFzdC0+ZnJlZSwgbWFzLT5ub2RlKTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc3RfY3Bf dG9fbm9kZXMoKSAtIENvcHkgZGF0YSBvdXQgdG8gbm9kZXMuDQorICogQG1hc3Q6IFRoZSBtYXBs ZSBzdWJ0cmVlIHN0YXRlDQorICogQGxlZnQ6IFRoZSBsZWZ0IGVuY29kZWQgbWFwbGUgbm9kZQ0K KyAqIEBtaWRkbGU6IFRoZSBtaWRkbGUgZW5jb2RlZCBtYXBsZSBub2RlDQorICogQHJpZ2h0OiBU aGUgcmlnaHQgZW5jb2RlZCBtYXBsZSBub2RlDQorICogQHNwbGl0OiBUaGUgbG9jYXRpb24gdG8g c3BsaXQgYmV0d2VlbiBsZWZ0IGFuZCAobWlkZGxlID8gbWlkZGxlIDogcmlnaHQpDQorICogQG1p ZF9zcGxpdDogVGhlIGxvY2F0aW9uIHRvIHNwbGl0IGJldHdlZW4gbWlkZGxlIGFuZCByaWdodC4N CisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9jcF90b19ub2RlcyhzdHJ1Y3QgbWFwbGVf c3VidHJlZV9zdGF0ZSAqbWFzdCwNCisJc3RydWN0IG1hcGxlX2Vub2RlICpsZWZ0LCBzdHJ1Y3Qg bWFwbGVfZW5vZGUgKm1pZGRsZSwNCisJc3RydWN0IG1hcGxlX2Vub2RlICpyaWdodCwgdW5zaWdu ZWQgY2hhciBzcGxpdCwgdW5zaWduZWQgY2hhciBtaWRfc3BsaXQpDQorew0KKwlib29sIG5ld19s bWF4ID0gdHJ1ZTsNCisNCisJbWFzdC0+bC0+bm9kZSA9IG10ZV9ub2RlX29yX25vbmUobGVmdCk7 DQorCW1hc3QtPm0tPm5vZGUgPSBtdGVfbm9kZV9vcl9ub25lKG1pZGRsZSk7DQorCW1hc3QtPnIt Pm5vZGUgPSBtdGVfbm9kZV9vcl9ub25lKHJpZ2h0KTsNCisNCisJbWFzdC0+bC0+bWluID0gbWFz dC0+b3JpZ19sLT5taW47DQorCWlmIChzcGxpdCA9PSBtYXN0LT5ibi0+Yl9lbmQpIHsNCisJCW1h c3QtPmwtPm1heCA9IG1hc3QtPm9yaWdfci0+bWF4Ow0KKwkJbmV3X2xtYXggPSBmYWxzZTsNCisJ fQ0KKw0KKwltYWJfbWFzX2NwKG1hc3QtPmJuLCAwLCBzcGxpdCwgbWFzdC0+bCwgbmV3X2xtYXgp Ow0KKw0KKwlpZiAobWlkZGxlKSB7DQorCQltYWJfbWFzX2NwKG1hc3QtPmJuLCAxICsgc3BsaXQs IG1pZF9zcGxpdCwgbWFzdC0+bSwgdHJ1ZSk7DQorCQltYXN0LT5tLT5taW4gPSBtYXN0LT5ibi0+ cGl2b3Rbc3BsaXRdICsgMTsNCisJCXNwbGl0ID0gbWlkX3NwbGl0Ow0KKwl9DQorDQorCW1hc3Qt PnItPm1heCA9IG1hc3QtPm9yaWdfci0+bWF4Ow0KKwlpZiAocmlnaHQpIHsNCisJCW1hYl9tYXNf Y3AobWFzdC0+Ym4sIDEgKyBzcGxpdCwgbWFzdC0+Ym4tPmJfZW5kLCBtYXN0LT5yLCBmYWxzZSk7 DQorCQltYXN0LT5yLT5taW4gPSBtYXN0LT5ibi0+cGl2b3Rbc3BsaXRdICsgMTsNCisJfQ0KK30N CisNCisvKg0KKyAqIG1hc3RfY29tYmluZV9jcF9sZWZ0IC0gQ29weSBpbiB0aGUgb3JpZ2luYWwg bGVmdCBzaWRlIG9mIHRoZSB0cmVlIGludG8gdGhlDQorICogY29tYmluZWQgZGF0YSBzZXQgaW4g dGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUgYmlnIG5vZGUuDQorICogQG1hc3Q6IFRoZSBtYXBsZSBz dWJ0cmVlIHN0YXRlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc3RfY29tYmluZV9jcF9s ZWZ0KHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0KQ0KK3sNCisJdW5zaWduZWQgY2hh ciBsX3Nsb3QgPSBtYXN0LT5vcmlnX2wtPm9mZnNldDsNCisNCisJaWYgKCFsX3Nsb3QpDQorCQly ZXR1cm47DQorDQorCW1hc19tYWJfY3AobWFzdC0+b3JpZ19sLCAwLCBsX3Nsb3QgLSAxLCBtYXN0 LT5ibiwgMCk7DQorfQ0KKw0KKy8qDQorICogbWFzdF9jb21iaW5lX2NwX3JpZ2h0OiBDb3B5IGlu IHRoZSBvcmlnaW5hbCByaWdodCBzaWRlIG9mIHRoZSB0cmVlIGludG8gdGhlDQorICogY29tYmlu ZWQgZGF0YSBzZXQgaW4gdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUgYmlnIG5vZGUuDQorICogQG1h c3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1h c3RfY29tYmluZV9jcF9yaWdodChzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCkNCit7 DQorCWlmIChtYXN0LT5ibi0+cGl2b3RbbWFzdC0+Ym4tPmJfZW5kIC0gMV0gPj0gbWFzdC0+b3Jp Z19yLT5tYXgpDQorCQlyZXR1cm47DQorDQorCW1hc19tYWJfY3AobWFzdC0+b3JpZ19yLCBtYXN0 LT5vcmlnX3ItPm9mZnNldCArIDEsDQorCQkgICBtdF9zbG90X2NvdW50KG1hc3QtPm9yaWdfci0+ bm9kZSksIG1hc3QtPmJuLA0KKwkJICAgbWFzdC0+Ym4tPmJfZW5kKTsNCisJbWFzdC0+b3JpZ19y LT5sYXN0ID0gbWFzdC0+b3JpZ19yLT5tYXg7DQorfQ0KKw0KKy8qDQorICogbWFzdF9zdWZmaWNp ZW50OiBDaGVjayBpZiB0aGUgbWFwbGUgc3VidHJlZSBzdGF0ZSBoYXMgZW5vdWdoIGRhdGEgaW4g dGhlIGJpZw0KKyAqIG5vZGUgdG8gY3JlYXRlIGF0IGxlYXN0IG9uZSBzdWZmaWNpZW50IG5vZGUN CisgKiBAbWFzdDogdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKi8NCitzdGF0aWMgaW5saW5l IGJvb2wgbWFzdF9zdWZmaWNpZW50KHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0KQ0K K3sNCisJaWYgKG1hc3QtPmJuLT5iX2VuZCA+IG10X21pbl9zbG90X2NvdW50KG1hc3QtPm9yaWdf bC0+bm9kZSkpDQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCisv Kg0KKyAqIG1hc3Rfb3ZlcmZsb3c6IENoZWNrIGlmIHRoZXJlIGlzIHRvbyBtdWNoIGRhdGEgaW4g dGhlIHN1YnRyZWUgc3RhdGUgZm9yIGENCisgKiBzaW5nbGUgbm9kZS4NCisgKiBAbWFzdDogVGhl IG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzdF9vdmVy ZmxvdyhzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCkNCit7DQorCWlmIChtYXN0LT5i bi0+Yl9lbmQgPj0gbXRfc2xvdF9jb3VudChtYXN0LT5vcmlnX2wtPm5vZGUpKQ0KKwkJcmV0dXJu IHRydWU7DQorDQorCXJldHVybiBmYWxzZTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkICpt dHJlZV9yYW5nZV93YWxrKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJdW5zaWduZWQgbG9u ZyAqcGl2b3RzOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJc3RydWN0IG1hcGxlX25vZGUg Km5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbmV4dCwgKmxhc3Q7DQorCWVudW0gbWFwbGVf dHlwZSB0eXBlOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCXVuc2lnbmVkIGNoYXIgZW5kOw0K Kwl1bnNpZ25lZCBsb25nIG1heCwgbWluOw0KKwl1bnNpZ25lZCBsb25nIHByZXZfbWF4LCBwcmV2 X21pbjsNCisNCisJbGFzdCA9IG5leHQgPSBtYXMtPm5vZGU7DQorCXByZXZfbWluID0gbWluID0g bWFzLT5taW47DQorCW1heCA9IG1hcy0+bWF4Ow0KKwlkbyB7DQorCQlvZmZzZXQgPSAwOw0KKwkJ bGFzdCA9IG5leHQ7DQorCQlub2RlID0gbXRlX3RvX25vZGUobmV4dCk7DQorCQl0eXBlID0gbXRl X25vZGVfdHlwZShuZXh0KTsNCisJCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJ CWVuZCA9IG1hX2RhdGFfZW5kKG5vZGUsIHR5cGUsIHBpdm90cywgbWF4KTsNCisJCWlmICh1bmxp a2VseShtYV9kZWFkX25vZGUobm9kZSkpKQ0KKwkJCWdvdG8gZGVhZF9ub2RlOw0KKw0KKwkJaWYg KHBpdm90c1tvZmZzZXRdID49IG1hcy0+aW5kZXgpIHsNCisJCQlwcmV2X21heCA9IG1heDsNCisJ CQlwcmV2X21pbiA9IG1pbjsNCisJCQltYXggPSBwaXZvdHNbb2Zmc2V0XTsNCisJCQlnb3RvIG5l eHQ7DQorCQl9DQorDQorCQlkbyB7DQorCQkJb2Zmc2V0Kys7DQorCQl9IHdoaWxlICgob2Zmc2V0 IDwgZW5kKSAmJiAocGl2b3RzW29mZnNldF0gPCBtYXMtPmluZGV4KSk7DQorDQorCQlwcmV2X21p biA9IG1pbjsNCisJCW1pbiA9IHBpdm90c1tvZmZzZXQgLSAxXSArIDE7DQorCQlwcmV2X21heCA9 IG1heDsNCisJCWlmIChsaWtlbHkob2Zmc2V0IDwgZW5kICYmIHBpdm90c1tvZmZzZXRdKSkNCisJ CQltYXggPSBwaXZvdHNbb2Zmc2V0XTsNCisNCituZXh0Og0KKwkJc2xvdHMgPSBtYV9zbG90cyhu b2RlLCB0eXBlKTsNCisJCW5leHQgPSBtdF9zbG90KG1hcy0+dHJlZSwgc2xvdHMsIG9mZnNldCk7 DQorCQlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCQlnb3RvIGRlYWRfbm9k ZTsNCisJfSB3aGlsZSAoIW1hX2lzX2xlYWYodHlwZSkpOw0KKw0KKwltYXMtPm9mZnNldCA9IG9m ZnNldDsNCisJbWFzLT5pbmRleCA9IG1pbjsNCisJbWFzLT5sYXN0ID0gbWF4Ow0KKwltYXMtPm1p biA9IHByZXZfbWluOw0KKwltYXMtPm1heCA9IHByZXZfbWF4Ow0KKwltYXMtPm5vZGUgPSBsYXN0 Ow0KKwlyZXR1cm4gKHZvaWQgKikgbmV4dDsNCisNCitkZWFkX25vZGU6DQorCW1hc19yZXNldCht YXMpOw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoNCisgKiBtYXNfc3Bhbm5pbmdfcmViYWxh bmNlKCkgLSBSZWJhbGFuY2UgYWNyb3NzIHR3byBub2RlcyB3aGljaCBtYXkgbm90IGJlIHBlZXJz Lg0KKyAqIEBtYXM6IFRoZSBzdGFydGluZyBtYXBsZSBzdGF0ZQ0KKyAqIEBtYXN0OiBUaGUgbWFw bGVfc3VidHJlZV9zdGF0ZSwga2VlcHMgdHJhY2sgb2YgNCBtYXBsZSBzdGF0ZXMuDQorICogQGNv dW50OiBUaGUgZXN0aW1hdGVkIGNvdW50IG9mIGl0ZXJhdGlvbnMgbmVlZGVkLg0KKyAqDQorICog Rm9sbG93IHRoZSB0cmVlIHVwd2FyZHMgZnJvbSBAbF9tYXMgYW5kIEByX21hcyBmb3IgQGNvdW50 LCBvciB1bnRpbCB0aGUgcm9vdA0KKyAqIGlzIGhpdC4gIEZpcnN0IEBiX25vZGUgaXMgc3BsaXQg aW50byB0d28gZW50cmllcyB3aGljaCBhcmUgaW5zZXJ0ZWQgaW50byB0aGUNCisgKiBuZXh0IGl0 ZXJhdGlvbiBvZiB0aGUgbG9vcC4gIEBiX25vZGUgaXMgcmV0dXJuZWQgcG9wdWxhdGVkIHdpdGgg dGhlIGZpbmFsDQorICogaXRlcmF0aW9uLiBAbWFzIGlzIHVzZWQgdG8gb2J0YWluIGFsbG9jYXRp b25zLiAgb3JpZ19sX21hcyBrZWVwcyB0cmFjayBvZiB0aGUNCisgKiBub2RlcyB0aGF0IHdpbGwg cmVtYWluIGFjdGl2ZSBieSB1c2luZyBvcmlnX2xfbWFzLT5pbmRleCBhbmQgb3JpZ19sX21hcy0+ bGFzdA0KKyAqIHRvIGFjY291bnQgb2Ygd2hhdCBoYXMgYmVlbiBjb3BpZWQgaW50byB0aGUgbmV3 IHN1Yi10cmVlLiAgVGhlIHVwZGF0ZSBvZg0KKyAqIG9yaWdfbF9tYXMtPmxhc3QgaXMgdXNlZCBp biBtYXNfY29uc3VtZSB0byBmaW5kIHRoZSBzbG90cyB0aGF0IHdpbGwgbmVlZCB0bw0KKyAqIGJl IGVpdGhlciBmcmVlZCBvciBkZXN0cm95ZWQuICBvcmlnX2xfbWFzLT5kZXB0aCBrZWVwcyB0cmFj ayBvZiB0aGUgaGVpZ2h0IG9mDQorICogdGhlIG5ldyBzdWItdHJlZSBpbiBjYXNlIHRoZSBzdWIt dHJlZSBiZWNvbWVzIHRoZSBmdWxsIHRyZWUuDQorICoNCisgKiBSZXR1cm46IHRoZSBudW1iZXIg b2YgZWxlbWVudHMgaW4gYl9ub2RlIGR1cmluZyB0aGUgbGFzdCBsb29wLg0KKyAqLw0KK3N0YXRp YyBpbnQgbWFzX3NwYW5uaW5nX3JlYmFsYW5jZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCXN0 cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0LCB1bnNpZ25lZCBjaGFyIGNvdW50KQ0KK3sN CisJdW5zaWduZWQgY2hhciBzcGxpdCwgbWlkX3NwbGl0Ow0KKwl1bnNpZ25lZCBjaGFyIHNsb3Qg PSAwOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmxlZnQgPSBOVUxMLCAqbWlkZGxlID0gTlVMTCwg KnJpZ2h0ID0gTlVMTDsNCisNCisJTUFfU1RBVEUobF9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRl eCwgbWFzLT5pbmRleCk7DQorCU1BX1NUQVRFKHJfbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgs IG1hcy0+bGFzdCk7DQorCU1BX1NUQVRFKG1fbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1h cy0+aW5kZXgpOw0KKwlNQV9UT1BJQVJZKGZyZWUsIG1hcy0+dHJlZSk7DQorCU1BX1RPUElBUlko ZGVzdHJveSwgbWFzLT50cmVlKTsNCisNCisJLyoNCisJICogVGhlIHRyZWUgbmVlZHMgdG8gYmUg cmViYWxhbmNlZCBhbmQgbGVhdmVzIG5lZWQgdG8gYmUga2VwdCBhdCB0aGUgc2FtZSBsZXZlbC4N CisJICogUmViYWxhbmNpbmcgaXMgZG9uZSBieSB1c2Ugb2YgdGhlIGBgc3RydWN0IG1hcGxlX3Rv cGlhcnlgYC4NCisJICovDQorCW1hc3QtPmwgPSAmbF9tYXM7DQorCW1hc3QtPm0gPSAmbV9tYXM7 DQorCW1hc3QtPnIgPSAmcl9tYXM7DQorCW1hc3QtPmZyZWUgPSAmZnJlZTsNCisJbWFzdC0+ZGVz dHJveSA9ICZkZXN0cm95Ow0KKwlsX21hcy5ub2RlID0gcl9tYXMubm9kZSA9IG1fbWFzLm5vZGUg PSBNQVNfTk9ORTsNCisJaWYgKCEobWFzdC0+b3JpZ19sLT5taW4gJiYgbWFzdC0+b3JpZ19yLT5t YXggPT0gVUxPTkdfTUFYKSAmJg0KKwkgICAgdW5saWtlbHkobWFzdC0+Ym4tPmJfZW5kIDw9IG10 X21pbl9zbG90c1ttYXN0LT5ibi0+dHlwZV0pKQ0KKwkJbWFzdF9zcGFubmluZ19yZWJhbGFuY2Uo bWFzdCk7DQorDQorCW1hc3QtPm9yaWdfbC0+ZGVwdGggPSAwOw0KKw0KKwkvKg0KKwkgKiBFYWNo IGxldmVsIG9mIHRoZSB0cmVlIGlzIGV4YW1pbmVkIGFuZCBiYWxhbmNlZCwgcHVzaGluZyBkYXRh IHRvIHRoZSBsZWZ0IG9yDQorCSAqIHJpZ2h0LCBvciByZWJhbGFuY2luZyBhZ2FpbnN0IGxlZnQg b3IgcmlnaHQgbm9kZXMgaXMgZW1wbG95ZWQgdG8gYXZvaWQNCisJICogcmlwcGxpbmcgdXAgdGhl IHRyZWUgdG8gbGltaXQgdGhlIGFtb3VudCBvZiBjaHVybi4gIE9uY2UgYSBuZXcgc3ViLXNlY3Rp b24gb2YNCisJICogdGhlIHRyZWUgaXMgY3JlYXRlZCwgdGhlcmUgbWF5IGJlIGEgbWl4IG9mIG5l dyBhbmQgb2xkIG5vZGVzLiAgVGhlIG9sZCBub2Rlcw0KKwkgKiB3aWxsIGhhdmUgdGhlIGluY29y cmVjdCBwYXJlbnQgcG9pbnRlcnMgYW5kIGN1cnJlbnRseSBiZSBpbiB0d28gdHJlZXM6IHRoZQ0K KwkgKiBvcmlnaW5hbCB0cmVlIGFuZCB0aGUgcGFydGlhbGx5IG5ldyB0cmVlLiAgVG8gcmVtZWR5 IHRoZSBwYXJlbnQgcG9pbnRlcnMgaW4NCisJICogdGhlIG9sZCB0cmVlLCB0aGUgbmV3IGRhdGEg aXMgc3dhcHBlZCBpbnRvIHRoZSBhY3RpdmUgdHJlZSBhbmQgYSB3YWxrIGRvd24NCisJICogdGhl IHRyZWUgaXMgcGVyZm9ybWVkIGFuZCB0aGUgcGFyZW50IHBvaW50ZXJzIGFyZSB1cGRhdGVkLg0K KwkgKiBTZWUgbWFzX2Rlc2NlbmRfYWRvcHQoKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4uDQorCSAq Lw0KKwl3aGlsZSAoY291bnQtLSkgew0KKwkJbWFzdC0+Ym4tPmJfZW5kLS07DQorCQltYXN0LT5i bi0+dHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzdC0+b3JpZ19sLT5ub2RlKTsNCisJCXNwbGl0ID0g bWFzX21hYl90b19ub2RlKG1hcywgbWFzdC0+Ym4sICZsZWZ0LCAmcmlnaHQsICZtaWRkbGUsDQor CQkJCQkmbWlkX3NwbGl0LCBtYXN0LT5vcmlnX2wtPm1pbik7DQorCQltYXN0X3NldF9zcGxpdF9w YXJlbnRzKG1hc3QsIGxlZnQsIG1pZGRsZSwgcmlnaHQsIHNwbGl0LA0KKwkJCQkgICAgICAgbWlk X3NwbGl0KTsNCisJCW1hc3RfY3BfdG9fbm9kZXMobWFzdCwgbGVmdCwgbWlkZGxlLCByaWdodCwg c3BsaXQsIG1pZF9zcGxpdCk7DQorDQorCQkvKg0KKwkJICogQ29weSBkYXRhIGZyb20gbmV4dCBs ZXZlbCBpbiB0aGUgdHJlZSB0byBtYXN0LT5ibiBmcm9tIG5leHQNCisJCSAqIGl0ZXJhdGlvbg0K KwkJICovDQorCQltZW1zZXQobWFzdC0+Ym4sIDAsIHNpemVvZihzdHJ1Y3QgbWFwbGVfYmlnX25v ZGUpKTsNCisJCW1hc3QtPmJuLT50eXBlID0gbXRlX25vZGVfdHlwZShsZWZ0KTsNCisJCW1hc3Qt Pm9yaWdfbC0+ZGVwdGgrKzsNCisNCisJCS8qIFJvb3QgYWxyZWFkeSBzdG9yZWQgaW4gbC0+bm9k ZS4gKi8NCisJCWlmIChtYXNfaXNfcm9vdF9saW1pdHMobWFzdC0+bCkpDQorCQkJZ290byBuZXdf cm9vdDsNCisNCisJCW1hc3RfYXNjZW5kX2ZyZWUobWFzdCk7DQorCQltYXN0X2NvbWJpbmVfY3Bf bGVmdChtYXN0KTsNCisJCWxfbWFzLm9mZnNldCA9IG1hc3QtPmJuLT5iX2VuZDsNCisJCW1hYl9z ZXRfYl9lbmQobWFzdC0+Ym4sICZsX21hcywgbGVmdCk7DQorCQltYWJfc2V0X2JfZW5kKG1hc3Qt PmJuLCAmbV9tYXMsIG1pZGRsZSk7DQorCQltYWJfc2V0X2JfZW5kKG1hc3QtPmJuLCAmcl9tYXMs IHJpZ2h0KTsNCisNCisJCS8qIENvcHkgYW55dGhpbmcgbmVjZXNzYXJ5IG91dCBvZiB0aGUgcmln aHQgbm9kZS4gKi8NCisJCW1hc3RfY29tYmluZV9jcF9yaWdodChtYXN0KTsNCisJCW1hc3RfdG9w aWFyeShtYXN0KTsNCisJCW1hc3QtPm9yaWdfbC0+bGFzdCA9IG1hc3QtPm9yaWdfbC0+bWF4Ow0K Kw0KKwkJaWYgKG1hc3Rfc3VmZmljaWVudChtYXN0KSkNCisJCQljb250aW51ZTsNCisNCisJCWlm IChtYXN0X292ZXJmbG93KG1hc3QpKQ0KKwkJCWNvbnRpbnVlOw0KKw0KKwkJLyogTWF5IGJlIGEg bmV3IHJvb3Qgc3RvcmVkIGluIG1hc3QtPmJuICovDQorCQlpZiAobWFzX2lzX3Jvb3RfbGltaXRz KG1hc3QtPm9yaWdfbCkpDQorCQkJYnJlYWs7DQorDQorCQltYXN0X3NwYW5uaW5nX3JlYmFsYW5j ZShtYXN0KTsNCisNCisJCS8qIHJlYmFsYW5jaW5nIGZyb20gb3RoZXIgbm9kZXMgbWF5IHJlcXVp cmUgYW5vdGhlciBsb29wLiAqLw0KKwkJaWYgKCFjb3VudCkNCisJCQljb3VudCsrOw0KKwl9DQor DQorCWxfbWFzLm5vZGUgPSBtdF9ta19ub2RlKG1hX21ub2RlX3B0cihtYXNfcG9wX25vZGUobWFz KSksDQorCQkJCW10ZV9ub2RlX3R5cGUobWFzdC0+b3JpZ19sLT5ub2RlKSk7DQorCW1hc3QtPm9y aWdfbC0+ZGVwdGgrKzsNCisJbWFiX21hc19jcChtYXN0LT5ibiwgMCwgbXRfc2xvdHNbbWFzdC0+ Ym4tPnR5cGVdIC0gMSwgJmxfbWFzLCB0cnVlKTsNCisJbXRlX3NldF9wYXJlbnQobGVmdCwgbF9t YXMubm9kZSwgc2xvdCk7DQorCWlmIChtaWRkbGUpDQorCQltdGVfc2V0X3BhcmVudChtaWRkbGUs IGxfbWFzLm5vZGUsICsrc2xvdCk7DQorDQorCWlmIChyaWdodCkNCisJCW10ZV9zZXRfcGFyZW50 KHJpZ2h0LCBsX21hcy5ub2RlLCArK3Nsb3QpOw0KKw0KKwlpZiAobWFzX2lzX3Jvb3RfbGltaXRz KG1hc3QtPmwpKSB7DQorbmV3X3Jvb3Q6DQorCQltYXN0X25ld19yb290KG1hc3QsIG1hcyk7DQor CX0gZWxzZSB7DQorCQltYXNfbW4oJmxfbWFzKS0+cGFyZW50ID0gbWFzX21uKG1hc3QtPm9yaWdf bCktPnBhcmVudDsNCisJfQ0KKw0KKwlpZiAoIW10ZV9kZWFkX25vZGUobWFzdC0+b3JpZ19sLT5u b2RlKSkNCisJCW1hdF9hZGQoJmZyZWUsIG1hc3QtPm9yaWdfbC0+bm9kZSk7DQorDQorCW1hcy0+ ZGVwdGggPSBtYXN0LT5vcmlnX2wtPmRlcHRoOw0KKwkqbWFzdC0+b3JpZ19sID0gbF9tYXM7DQor CW10ZV9zZXRfbm9kZV9kZWFkKG1hcy0+bm9kZSk7DQorDQorCS8qIFNldCB1cCBtYXMgZm9yIGlu c2VydGlvbi4gKi8NCisJbWFzdC0+b3JpZ19sLT5kZXB0aCA9IG1hcy0+ZGVwdGg7DQorCW1hc3Qt Pm9yaWdfbC0+YWxsb2MgPSBtYXMtPmFsbG9jOw0KKwkqbWFzID0gKm1hc3QtPm9yaWdfbDsNCisJ bWFzX3dtYl9yZXBsYWNlKG1hcywgJmZyZWUsICZkZXN0cm95KTsNCisJbXRyZWVfcmFuZ2Vfd2Fs ayhtYXMpOw0KKwlyZXR1cm4gbWFzdC0+Ym4tPmJfZW5kOw0KK30NCisNCisvKg0KKyAqIG1hc19y ZWJhbGFuY2UoKSAtIFJlYmFsYW5jZSBhIGdpdmVuIG5vZGUuDQorICogQG1hczogVGhlIG1hcGxl IHN0YXRlDQorICogQGJfbm9kZTogVGhlIGJpZyBtYXBsZSBub2RlLg0KKyAqDQorICogUmViYWxh bmNlIHR3byBub2RlcyBpbnRvIGEgc2luZ2xlIG5vZGUgb3IgdHdvIG5ldyBub2RlcyB0aGF0IGFy ZSBzdWZmaWNpZW50Lg0KKyAqIENvbnRpbnVlIHVwd2FyZHMgdW50aWwgdHJlZSBpcyBzdWZmaWNp ZW50Lg0KKyAqDQorICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGJfbm9kZSBk dXJpbmcgdGhlIGxhc3QgbG9vcC4NCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYXNfcmViYWxh bmNlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkJCQlzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJf bm9kZSkNCit7DQorCWNoYXIgZW1wdHlfY291bnQgPSBtYXNfbXRfaGVpZ2h0KG1hcyk7DQorCXN0 cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlIG1hc3Q7DQorCXVuc2lnbmVkIGNoYXIgc2hpZnQsIGJf ZW5kID0gKytiX25vZGUtPmJfZW5kOw0KKw0KKwlNQV9TVEFURShsX21hcywgbWFzLT50cmVlLCBt YXMtPmluZGV4LCBtYXMtPmxhc3QpOw0KKwlNQV9TVEFURShyX21hcywgbWFzLT50cmVlLCBtYXMt PmluZGV4LCBtYXMtPmxhc3QpOw0KKw0KKwl0cmFjZV9tYV9vcChfX2Z1bmNfXywgbWFzKTsNCisN CisJLyoNCisJICogUmViYWxhbmNpbmcgb2NjdXJzIGlmIGEgbm9kZSBpcyBpbnN1ZmZpY2llbnQu ICBEYXRhIGlzIHJlYmFsYW5jZWQNCisJICogYWdhaW5zdCB0aGUgbm9kZSB0byB0aGUgcmlnaHQg aWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgdGhlIG5vZGUgdG8gdGhlDQorCSAqIGxlZnQgb2YgdGhp cyBub2RlIGlzIHJlYmFsYW5jZWQgYWdhaW5zdCB0aGlzIG5vZGUuICBJZiByZWJhbGFuY2luZw0K KwkgKiBjYXVzZXMganVzdCBvbmUgbm9kZSB0byBiZSBwcm9kdWNlZCBpbnN0ZWFkIG9mIHR3bywg dGhlbiB0aGUgcGFyZW50DQorCSAqIGlzIGFsc28gZXhhbWluZWQgYW5kIHJlYmFsYW5jZWQgaWYg aXQgaXMgaW5zdWZmaWNpZW50LiAgRXZlcnkgbGV2ZWwNCisJICogdHJpZXMgdG8gY29tYmluZSB0 aGUgZGF0YSBpbiB0aGUgc2FtZSB3YXkuICBJZiBvbmUgbm9kZSBjb250YWlucyB0aGUNCisJICog ZW50aXJlIHJhbmdlIG9mIHRoZSB0cmVlLCB0aGVuIHRoYXQgbm9kZSBpcyB1c2VkIGFzIGEgbmV3 IHJvb3Qgbm9kZS4NCisJICovDQorCW1hc19ub2RlX2NvdW50KG1hcywgMSArIGVtcHR5X2NvdW50 ICogMyk7DQorCWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm4gMDsNCisNCisJbWFzdC5v cmlnX2wgPSAmbF9tYXM7DQorCW1hc3Qub3JpZ19yID0gJnJfbWFzOw0KKwltYXN0LmJuID0gYl9u b2RlOw0KKwltYXN0LmJuLT50eXBlID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKw0KKwls X21hcyA9IHJfbWFzID0gKm1hczsNCisNCisJaWYgKG1hc19uZXh0X3NpYmxpbmcoJnJfbWFzKSkg ew0KKwkJbWFzX21hYl9jcCgmcl9tYXMsIDAsIG10X3Nsb3RfY291bnQocl9tYXMubm9kZSksIGJf bm9kZSwgYl9lbmQpOw0KKwkJcl9tYXMubGFzdCA9IHJfbWFzLmluZGV4ID0gcl9tYXMubWF4Ow0K Kwl9IGVsc2Ugew0KKwkJbWFzX3ByZXZfc2libGluZygmbF9tYXMpOw0KKwkJc2hpZnQgPSBtYXNf ZGF0YV9lbmQoJmxfbWFzKSArIDE7DQorCQltYWJfc2hpZnRfcmlnaHQoYl9ub2RlLCBzaGlmdCk7 DQorCQltYXMtPm9mZnNldCArPSBzaGlmdDsNCisJCW1hc19tYWJfY3AoJmxfbWFzLCAwLCBzaGlm dCAtIDEsIGJfbm9kZSwgMCk7DQorCQliX25vZGUtPmJfZW5kID0gc2hpZnQgKyBiX2VuZDsNCisJ CWxfbWFzLmluZGV4ID0gbF9tYXMubGFzdCA9IGxfbWFzLm1pbjsNCisJfQ0KKw0KKwlyZXR1cm4g bWFzX3NwYW5uaW5nX3JlYmFsYW5jZShtYXMsICZtYXN0LCBlbXB0eV9jb3VudCk7DQorfQ0KKw0K Ky8qDQorICogbWFzX2Rlc3Ryb3lfcmViYWxhbmNlKCkgLSBSZWJhbGFuY2UgbGVmdC1tb3N0IG5v ZGUgd2hpbGUgZGVzdHJveWluZyB0aGUgbWFwbGUNCisgKiBzdGF0ZS4NCisgKiBAbWFzOiBUaGUg bWFwbGUgc3RhdGUNCisgKiBAZW5kOiBUaGUgZW5kIG9mIHRoZSBsZWZ0LW1vc3Qgbm9kZS4NCisg Kg0KKyAqIER1cmluZyBhIG1hc3MtaW5zZXJ0IGV2ZW50IChzdWNoIGFzIGZvcmtpbmcpLCBpdCBt YXkgYmUgbmVjZXNzYXJ5IHRvDQorICogcmViYWxhbmNlIHRoZSBsZWZ0LW1vc3Qgbm9kZSB3aGVu IGl0IGlzIG5vdCBzdWZmaWNpZW50Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfZGVz dHJveV9yZWJhbGFuY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGNoYXIgZW5kKQ0K K3sNCisJZW51bSBtYXBsZV90eXBlIG10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlz dHJ1Y3QgbWFwbGVfbm9kZSByZXVzZSwgKm5ld25vZGUsICpwYXJlbnQsICpuZXdfbGVmdCwgKmxl ZnQsICpub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVwYXJlbnQ7DQorCXVuc2lnbmVkIGNo YXIgb2Zmc2V0LCB0bXAsIHNwbGl0ID0gbXRfc2xvdHNbbXRdIC8gMjsNCisJdm9pZCBfX3JjdSAq Kmxfc2xvdHMsICoqc2xvdHM7DQorCXVuc2lnbmVkIGxvbmcgKmxfcGl2cywgKnBpdnMsIGdhcDsN CisJYm9vbCBpbl9yY3UgPSBtdF9pbl9yY3UobWFzLT50cmVlKTsNCisNCisJTUFfU1RBVEUobF9t YXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0KTsNCisNCisJbF9tYXMgPSAqbWFz Ow0KKwltYXNfcHJldl9zaWJsaW5nKCZsX21hcyk7DQorDQorCS8qIHNldCB1cCBub2RlLiAqLw0K KwlpZiAoaW5fcmN1KSB7DQorCQkvKiBBbGxvY2F0ZSBmb3IgYm90aCBsZWZ0IGFuZCByaWdodCBh cyB3ZWxsIGFzIHBhcmVudC4gKi8NCisJCW1hc19ub2RlX2NvdW50KG1hcywgMyk7DQorCQlpZiAo bWFzX2lzX2VycihtYXMpKQ0KKwkJCXJldHVybjsNCisNCisJCW5ld25vZGUgPSBtYXNfcG9wX25v ZGUobWFzKTsNCisJfSBlbHNlIHsNCisJCW5ld25vZGUgPSAmcmV1c2U7DQorCX0NCisNCisJbm9k ZSA9IG1hc19tbihtYXMpOw0KKwluZXdub2RlLT5wYXJlbnQgPSBub2RlLT5wYXJlbnQ7DQorCXNs b3RzID0gbWFfc2xvdHMobmV3bm9kZSwgbXQpOw0KKwlwaXZzID0gbWFfcGl2b3RzKG5ld25vZGUs IG10KTsNCisJbGVmdCA9IG1hc19tbigmbF9tYXMpOw0KKwlsX3Nsb3RzID0gbWFfc2xvdHMobGVm dCwgbXQpOw0KKwlsX3BpdnMgPSBtYV9waXZvdHMobGVmdCwgbXQpOw0KKwlpZiAoIWxfc2xvdHNb c3BsaXRdKQ0KKwkJc3BsaXQrKzsNCisJdG1wID0gbWFzX2RhdGFfZW5kKCZsX21hcykgLSBzcGxp dDsNCisNCisJbWVtY3B5KHNsb3RzLCBsX3Nsb3RzICsgc3BsaXQgKyAxLCBzaXplb2Yodm9pZCAq KSAqIHRtcCk7DQorCW1lbWNweShwaXZzLCBsX3BpdnMgKyBzcGxpdCArIDEsIHNpemVvZih1bnNp Z25lZCBsb25nKSAqIHRtcCk7DQorCXBpdnNbdG1wXSA9IGxfbWFzLm1heDsNCisJbWVtY3B5KHNs b3RzICsgdG1wLCBtYV9zbG90cyhub2RlLCBtdCksIHNpemVvZih2b2lkICopICogZW5kKTsNCisJ bWVtY3B5KHBpdnMgKyB0bXAsIG1hX3Bpdm90cyhub2RlLCBtdCksIHNpemVvZih1bnNpZ25lZCBs b25nKSAqIGVuZCk7DQorDQorCWxfbWFzLm1heCA9IGxfcGl2c1tzcGxpdF07DQorCW1hcy0+bWlu ID0gbF9tYXMubWF4ICsgMTsNCisJZXBhcmVudCA9IG10X21rX25vZGUobXRlX3BhcmVudChsX21h cy5ub2RlKSwNCisJCQkgICAgIG1hc19wYXJlbnRfZW51bSgmbF9tYXMsIGxfbWFzLm5vZGUpKTsN CisJdG1wICs9IGVuZDsNCisJaWYgKCFpbl9yY3UpIHsNCisJCXVuc2lnbmVkIGNoYXIgbWF4X3Ag PSBtdF9waXZvdHNbbXRdOw0KKwkJdW5zaWduZWQgY2hhciBtYXhfcyA9IG10X3Nsb3RzW210XTsN CisNCisJCWlmICh0bXAgPCBtYXhfcCkNCisJCQltZW1zZXQocGl2cyArIHRtcCwgMCwNCisJCQkg ICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgKikgKiAobWF4X3AgLSB0bXApKTsNCisNCisJCWlm ICh0bXAgPCBtdF9zbG90c1ttdF0pDQorCQkJbWVtc2V0KHNsb3RzICsgdG1wLCAwLCBzaXplb2Yo dm9pZCAqKSAqIChtYXhfcyAtIHRtcCkpOw0KKw0KKwkJbWVtY3B5KG5vZGUsIG5ld25vZGUsIHNp emVvZihzdHJ1Y3QgbWFwbGVfbm9kZSkpOw0KKwkJbWFfc2V0X21ldGEobm9kZSwgbXQsIDAsIHRt cCAtIDEpOw0KKwkJbXRlX3NldF9waXZvdChlcGFyZW50LCBtdGVfcGFyZW50X3Nsb3QobF9tYXMu bm9kZSksDQorCQkJICAgICAgbF9waXZzW3NwbGl0XSk7DQorDQorCQkvKiBSZW1vdmUgZGF0YSBm cm9tIGxfcGl2cy4gKi8NCisJCXRtcCA9IHNwbGl0ICsgMTsNCisJCW1lbXNldChsX3BpdnMgKyB0 bXAsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIChtYXhfcCAtIHRtcCkpOw0KKwkJbWVtc2V0 KGxfc2xvdHMgKyB0bXAsIDAsIHNpemVvZih2b2lkICopICogKG1heF9zIC0gdG1wKSk7DQorCQlt YV9zZXRfbWV0YShsZWZ0LCBtdCwgMCwgc3BsaXQpOw0KKw0KKwkJZ290byBkb25lOw0KKwl9DQor DQorCS8qIFJDVSByZXF1aXJlcyByZXBsYWNpbmcgYm90aCBsX21hcywgbWFzLCBhbmQgcGFyZW50 LiAqLw0KKwltYXMtPm5vZGUgPSBtdF9ta19ub2RlKG5ld25vZGUsIG10KTsNCisJbWFfc2V0X21l dGEobmV3bm9kZSwgbXQsIDAsIHRtcCk7DQorDQorCW5ld19sZWZ0ID0gbWFzX3BvcF9ub2RlKG1h cyk7DQorCW5ld19sZWZ0LT5wYXJlbnQgPSBsZWZ0LT5wYXJlbnQ7DQorCW10ID0gbXRlX25vZGVf dHlwZShsX21hcy5ub2RlKTsNCisJc2xvdHMgPSBtYV9zbG90cyhuZXdfbGVmdCwgbXQpOw0KKwlw aXZzID0gbWFfcGl2b3RzKG5ld19sZWZ0LCBtdCk7DQorCW1lbWNweShzbG90cywgbF9zbG90cywg c2l6ZW9mKHZvaWQgKikgKiBzcGxpdCk7DQorCW1lbWNweShwaXZzLCBsX3BpdnMsIHNpemVvZih1 bnNpZ25lZCBsb25nKSAqIHNwbGl0KTsNCisJbWFfc2V0X21ldGEobmV3X2xlZnQsIG10LCAwLCBz cGxpdCk7DQorCWxfbWFzLm5vZGUgPSBtdF9ta19ub2RlKG5ld19sZWZ0LCBtdCk7DQorDQorCS8q IHJlcGxhY2UgcGFyZW50LiAqLw0KKwlvZmZzZXQgPSBtdGVfcGFyZW50X3Nsb3QobWFzLT5ub2Rl KTsNCisJbXQgPSBtYXNfcGFyZW50X2VudW0oJmxfbWFzLCBsX21hcy5ub2RlKTsNCisJcGFyZW50 ID0gbWFzX3BvcF9ub2RlKG1hcyk7DQorCXNsb3RzID0gbWFfc2xvdHMocGFyZW50LCBtdCk7DQor CXBpdnMgPSBtYV9waXZvdHMocGFyZW50LCBtdCk7DQorCW1lbWNweShwYXJlbnQsIG10ZV90b19u b2RlKGVwYXJlbnQpLCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUpKTsNCisJcmN1X2Fzc2lnbl9w b2ludGVyKHNsb3RzW29mZnNldF0sIG1hcy0+bm9kZSk7DQorCXJjdV9hc3NpZ25fcG9pbnRlcihz bG90c1tvZmZzZXQgLSAxXSwgbF9tYXMubm9kZSk7DQorCXBpdnNbb2Zmc2V0IC0gMV0gPSBsX21h cy5tYXg7DQorCWVwYXJlbnQgPSBtdF9ta19ub2RlKHBhcmVudCwgbXQpOw0KK2RvbmU6DQorCWdh cCA9IG1hc19sZWFmX21heF9nYXAobWFzKTsNCisJbXRlX3NldF9nYXAoZXBhcmVudCwgbXRlX3Bh cmVudF9zbG90KG1hcy0+bm9kZSksIGdhcCk7DQorCWdhcCA9IG1hc19sZWFmX21heF9nYXAoJmxf bWFzKTsNCisJbXRlX3NldF9nYXAoZXBhcmVudCwgbXRlX3BhcmVudF9zbG90KGxfbWFzLm5vZGUp LCBnYXApOw0KKwltYXNfYXNjZW5kKG1hcyk7DQorDQorCWlmIChpbl9yY3UpDQorCQltYXNfcmVw bGFjZShtYXMsIGZhbHNlKTsNCisNCisJbWFzX3VwZGF0ZV9nYXAobWFzKTsNCit9DQorDQorLyoN CisgKiBtYXNfc3BsaXRfZmluYWxfbm9kZSgpIC0gU3BsaXQgdGhlIGZpbmFsIG5vZGUgaW4gYSBz dWJ0cmVlIG9wZXJhdGlvbi4NCisgKiBAbWFzdDogdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisg KiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAaGVpZ2h0OiBUaGUgaGVpZ2h0IG9mIHRoZSB0 cmVlIGluIGNhc2UgaXQncyBhIG5ldyByb290Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBt YXNfc3BsaXRfZmluYWxfbm9kZShzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwNCisJ CQkJCXN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBpbnQgaGVpZ2h0KQ0KK3sNCisJc3RydWN0IG1hcGxl X2Vub2RlICphbmNlc3RvcjsNCisNCisJaWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkpIHsNCisJ CWlmIChtdF9pc19hbGxvYyhtYXMtPnRyZWUpKQ0KKwkJCW1hc3QtPmJuLT50eXBlID0gbWFwbGVf YXJhbmdlXzY0Ow0KKwkJZWxzZQ0KKwkJCW1hc3QtPmJuLT50eXBlID0gbWFwbGVfcmFuZ2VfNjQ7 DQorCQltYXMtPmRlcHRoID0gaGVpZ2h0Ow0KKwl9DQorCS8qDQorCSAqIE9ubHkgYSBzaW5nbGUg bm9kZSBpcyB1c2VkIGhlcmUsIGNvdWxkIGJlIHJvb3QuDQorCSAqIFRoZSBCaWdfbm9kZSBkYXRh IHNob3VsZCBqdXN0IGZpdCBpbiBhIHNpbmdsZSBub2RlLg0KKwkgKi8NCisJYW5jZXN0b3IgPSBt YXNfbmV3X21hX25vZGUobWFzLCBtYXN0LT5ibik7DQorCW10ZV9zZXRfcGFyZW50KG1hc3QtPmwt Pm5vZGUsIGFuY2VzdG9yLCBtYXN0LT5sLT5vZmZzZXQpOw0KKwltdGVfc2V0X3BhcmVudChtYXN0 LT5yLT5ub2RlLCBhbmNlc3RvciwgbWFzdC0+ci0+b2Zmc2V0KTsNCisJbXRlX3RvX25vZGUoYW5j ZXN0b3IpLT5wYXJlbnQgPSBtYXNfbW4obWFzKS0+cGFyZW50Ow0KKw0KKwltYXN0LT5sLT5ub2Rl ID0gYW5jZXN0b3I7DQorCW1hYl9tYXNfY3AobWFzdC0+Ym4sIDAsIG10X3Nsb3RzW21hc3QtPmJu LT50eXBlXSAtIDEsIG1hc3QtPmwsIHRydWUpOw0KKwltYXMtPm9mZnNldCA9IG1hc3QtPmJuLT5i X2VuZCAtIDE7DQorCXJldHVybiB0cnVlOw0KK30NCisNCisvKg0KKyAqIG1hc3RfZmlsbF9ibm9k ZSgpIC0gQ29weSBkYXRhIGludG8gdGhlIGJpZyBub2RlIGluIHRoZSBzdWJ0cmVlIHN0YXRlDQor ICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICogQG1hczogdGhlIG1hcGxlIHN0 YXRlDQorICogQHNraXA6IFRoZSBudW1iZXIgb2YgZW50cmllcyB0byBza2lwIGZvciBuZXcgbm9k ZXMgaW5zZXJ0aW9uLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXN0X2ZpbGxfYm5vZGUo c3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QsDQorCQkJCQkgc3RydWN0IG1hX3N0YXRl ICptYXMsDQorCQkJCQkgdW5zaWduZWQgY2hhciBza2lwKQ0KK3sNCisJYm9vbCBjcCA9IHRydWU7 DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqb2xkID0gbWFzLT5ub2RlOw0KKwl1bnNpZ25lZCBjaGFy IHNwbGl0Ow0KKw0KKwltZW1zZXQobWFzdC0+Ym4tPmdhcCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGxv bmcpICogQVJSQVlfU0laRShtYXN0LT5ibi0+Z2FwKSk7DQorCW1lbXNldChtYXN0LT5ibi0+c2xv dCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogQVJSQVlfU0laRShtYXN0LT5ibi0+c2xvdCkp Ow0KKwltZW1zZXQobWFzdC0+Ym4tPnBpdm90LCAwLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiBB UlJBWV9TSVpFKG1hc3QtPmJuLT5waXZvdCkpOw0KKwltYXN0LT5ibi0+Yl9lbmQgPSAwOw0KKw0K KwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkgew0KKwkJY3AgPSBmYWxzZTsNCisJfSBlbHNl IHsNCisJCW1hc19hc2NlbmQobWFzKTsNCisJCW1hdF9hZGQobWFzdC0+ZnJlZSwgb2xkKTsNCisJ CW1hcy0+b2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7DQorCX0NCisNCisJaWYg KGNwICYmIG1hc3QtPmwtPm9mZnNldCkNCisJCW1hc19tYWJfY3AobWFzLCAwLCBtYXN0LT5sLT5v ZmZzZXQgLSAxLCBtYXN0LT5ibiwgMCk7DQorDQorCXNwbGl0ID0gbWFzdC0+Ym4tPmJfZW5kOw0K KwltYWJfc2V0X2JfZW5kKG1hc3QtPmJuLCBtYXN0LT5sLCBtYXN0LT5sLT5ub2RlKTsNCisJbWFz dC0+ci0+b2Zmc2V0ID0gbWFzdC0+Ym4tPmJfZW5kOw0KKwltYWJfc2V0X2JfZW5kKG1hc3QtPmJu LCBtYXN0LT5yLCBtYXN0LT5yLT5ub2RlKTsNCisJaWYgKG1hc3QtPmJuLT5waXZvdFttYXN0LT5i bi0+Yl9lbmQgLSAxXSA9PSBtYXMtPm1heCkNCisJCWNwID0gZmFsc2U7DQorDQorCWlmIChjcCkN CisJCW1hc19tYWJfY3AobWFzLCBzcGxpdCArIHNraXAsIG10X3Nsb3RfY291bnQobWFzLT5ub2Rl KSAtIDEsDQorCQkJICAgbWFzdC0+Ym4sIG1hc3QtPmJuLT5iX2VuZCk7DQorDQorCW1hc3QtPmJu LT5iX2VuZC0tOw0KKwltYXN0LT5ibi0+dHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsN Cit9DQorDQorLyoNCisgKiBtYXN0X3NwbGl0X2RhdGEoKSAtIFNwbGl0IHRoZSBkYXRhIGluIHRo ZSBzdWJ0cmVlIHN0YXRlIGJpZyBub2RlIGludG8gcmVndWxhcg0KKyAqIG5vZGVzLg0KKyAqIEBt YXN0OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0K KyAqIEBzcGxpdDogVGhlIGxvY2F0aW9uIHRvIHNwbGl0IHRoZSBiaWcgbm9kZQ0KKyAqLw0KK3N0 YXRpYyBpbmxpbmUgdm9pZCBtYXN0X3NwbGl0X2RhdGEoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3Rh dGUgKm1hc3QsDQorCSAgIHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBjaGFyIHNwbGl0 KQ0KK3sNCisJdW5zaWduZWQgY2hhciBwX3Nsb3Q7DQorDQorCW1hYl9tYXNfY3AobWFzdC0+Ym4s IDAsIHNwbGl0LCBtYXN0LT5sLCB0cnVlKTsNCisJbXRlX3NldF9waXZvdChtYXN0LT5yLT5ub2Rl LCAwLCBtYXN0LT5yLT5tYXgpOw0KKwltYWJfbWFzX2NwKG1hc3QtPmJuLCBzcGxpdCArIDEsIG1h c3QtPmJuLT5iX2VuZCwgbWFzdC0+ciwgZmFsc2UpOw0KKwltYXN0LT5sLT5vZmZzZXQgPSBtdGVf cGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJbWFzdC0+bC0+bWF4ID0gbWFzdC0+Ym4tPnBpdm90 W3NwbGl0XTsNCisJbWFzdC0+ci0+bWluID0gbWFzdC0+bC0+bWF4ICsgMTsNCisJaWYgKG10ZV9p c19sZWFmKG1hcy0+bm9kZSkpDQorCQlyZXR1cm47DQorDQorCXBfc2xvdCA9IG1hc3QtPm9yaWdf bC0+b2Zmc2V0Ow0KKwltYXNfc2V0X3NwbGl0X3BhcmVudChtYXN0LT5vcmlnX2wsIG1hc3QtPmwt Pm5vZGUsIG1hc3QtPnItPm5vZGUsDQorCQkJICAgICAmcF9zbG90LCBzcGxpdCk7DQorCW1hc19z ZXRfc3BsaXRfcGFyZW50KG1hc3QtPm9yaWdfciwgbWFzdC0+bC0+bm9kZSwgbWFzdC0+ci0+bm9k ZSwNCisJCQkgICAgICZwX3Nsb3QsIHNwbGl0KTsNCit9DQorDQorLyoNCisgKiBtYXNfcHVzaF9k YXRhKCkgLSBJbnN0ZWFkIG9mIHNwbGl0dGluZyBhIG5vZGUsIGl0IGlzIGJlbmVmaWNpYWwgdG8g cHVzaCB0aGUNCisgKiBkYXRhIHRvIHRoZSByaWdodCBvciBsZWZ0IG5vZGUgaWYgdGhlcmUgaXMg cm9vbS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAaGVpZ2h0OiBUaGUgY3VycmVu dCBoZWlnaHQgb2YgdGhlIG1hcGxlIHN0YXRlDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVl IHN0YXRlDQorICogQGxlZnQ6IFB1c2ggbGVmdCBvciBub3QuDQorICoNCisgKiBLZWVwaW5nIHRo ZSBoZWlnaHQgb2YgdGhlIHRyZWUgbG93IG1lYW5zIGZhc3RlciBsb29rdXBzLg0KKyAqDQorICog UmV0dXJuOiBUcnVlIGlmIHB1c2hlZCwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgYm9vbCBtYXNfcHVzaF9kYXRhKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBpbnQgaGVpZ2h0 LA0KKwkJCQkgc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QsIGJvb2wgbGVmdCkNCit7 DQorCXVuc2lnbmVkIGNoYXIgc2xvdF90b3RhbCA9IG1hc3QtPmJuLT5iX2VuZDsNCisJdW5zaWdu ZWQgY2hhciBlbmQsIHNwYWNlLCBzcGxpdDsNCisNCisJTUFfU1RBVEUodG1wX21hcywgbWFzLT50 cmVlLCBtYXMtPmluZGV4LCBtYXMtPmxhc3QpOw0KKwl0bXBfbWFzID0gKm1hczsNCisJdG1wX21h cy5kZXB0aCA9IG1hc3QtPmwtPmRlcHRoOw0KKw0KKwlpZiAobGVmdCAmJiAhbWFzX3ByZXZfc2li bGluZygmdG1wX21hcykpDQorCQlyZXR1cm4gZmFsc2U7DQorCWVsc2UgaWYgKCFsZWZ0ICYmICFt YXNfbmV4dF9zaWJsaW5nKCZ0bXBfbWFzKSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJZW5kID0g bWFzX2RhdGFfZW5kKCZ0bXBfbWFzKTsNCisJc2xvdF90b3RhbCArPSBlbmQ7DQorCXNwYWNlID0g MiAqIG10X3Nsb3RfY291bnQobWFzLT5ub2RlKSAtIDI7DQorCS8qIC0yIGluc3RlYWQgb2YgLTEg dG8gZW5zdXJlIHRoZXJlIGlzbid0IGEgdHJpcGxlIHNwbGl0ICovDQorCWlmIChtYV9pc19sZWFm KG1hc3QtPmJuLT50eXBlKSkNCisJCXNwYWNlLS07DQorDQorCWlmIChtYXMtPm1heCA9PSBVTE9O R19NQVgpDQorCQlzcGFjZS0tOw0KKw0KKwlpZiAoc2xvdF90b3RhbCA+PSBzcGFjZSkNCisJCXJl dHVybiBmYWxzZTsNCisNCisJLyogR2V0IHRoZSBkYXRhOyBGaWxsIG1hc3QtPmJuICovDQorCW1h c3QtPmJuLT5iX2VuZCsrOw0KKwlpZiAobGVmdCkgew0KKwkJbWFiX3NoaWZ0X3JpZ2h0KG1hc3Qt PmJuLCBlbmQgKyAxKTsNCisJCW1hc19tYWJfY3AoJnRtcF9tYXMsIDAsIGVuZCwgbWFzdC0+Ym4s IDApOw0KKwkJbWFzdC0+Ym4tPmJfZW5kID0gc2xvdF90b3RhbCArIDE7DQorCX0gZWxzZSB7DQor CQltYXNfbWFiX2NwKCZ0bXBfbWFzLCAwLCBlbmQsIG1hc3QtPmJuLCBtYXN0LT5ibi0+Yl9lbmQp Ow0KKwl9DQorDQorCS8qIENvbmZpZ3VyZSBtYXN0IGZvciBzcGxpdHRpbmcgb2YgbWFzdC0+Ym4g Ki8NCisJc3BsaXQgPSBtdF9zbG90c1ttYXN0LT5ibi0+dHlwZV0gLSAyOw0KKwlpZiAobGVmdCkg ew0KKwkJLyogIFN3aXRjaCBtYXMgdG8gcHJldiBub2RlICAqLw0KKwkJbWF0X2FkZChtYXN0LT5m cmVlLCBtYXMtPm5vZGUpOw0KKwkJKm1hcyA9IHRtcF9tYXM7DQorCQkvKiBTdGFydCB1c2luZyBt YXN0LT5sIGZvciB0aGUgbGVmdCBzaWRlLiAqLw0KKwkJdG1wX21hcy5ub2RlID0gbWFzdC0+bC0+ bm9kZTsNCisJCSptYXN0LT5sID0gdG1wX21hczsNCisJfSBlbHNlIHsNCisJCW1hdF9hZGQobWFz dC0+ZnJlZSwgdG1wX21hcy5ub2RlKTsNCisJCXRtcF9tYXMubm9kZSA9IG1hc3QtPnItPm5vZGU7 DQorCQkqbWFzdC0+ciA9IHRtcF9tYXM7DQorCQlzcGxpdCA9IHNsb3RfdG90YWwgLSBzcGxpdDsN CisJfQ0KKwlzcGxpdCA9IG1hYl9ub19udWxsX3NwbGl0KG1hc3QtPmJuLCBzcGxpdCwgbXRfc2xv dHNbbWFzdC0+Ym4tPnR5cGVdKTsNCisJLyogVXBkYXRlIHBhcmVudCBzbG90IGZvciBzcGxpdCBj YWxjdWxhdGlvbi4gKi8NCisJaWYgKGxlZnQpDQorCQltYXN0LT5vcmlnX2wtPm9mZnNldCArPSBl bmQgKyAxOw0KKw0KKwltYXN0X3NwbGl0X2RhdGEobWFzdCwgbWFzLCBzcGxpdCk7DQorCW1hc3Rf ZmlsbF9ibm9kZShtYXN0LCBtYXMsIDIpOw0KKwltYXNfc3BsaXRfZmluYWxfbm9kZShtYXN0LCBt YXMsIGhlaWdodCArIDEpOw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorLyoNCisgKiBtYXNfc3Bs aXQoKSAtIFNwbGl0IGRhdGEgdGhhdCBpcyB0b28gYmlnIGZvciBvbmUgbm9kZSBpbnRvIHR3by4N CisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAYl9ub2RlOiBUaGUgbWFwbGUgYmlnIG5v ZGUNCisgKiBSZXR1cm46IDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlLg0KKyAqLw0KK3N0YXRp YyBpbnQgbWFzX3NwbGl0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1Y3QgbWFwbGVfYmlnX25v ZGUgKmJfbm9kZSkNCit7DQorDQorCXN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlIG1hc3Q7DQor CWludCBoZWlnaHQgPSAwOw0KKwl1bnNpZ25lZCBjaGFyIG1pZF9zcGxpdCwgc3BsaXQgPSAwOw0K Kw0KKwkvKg0KKwkgKiBTcGxpdHRpbmcgaXMgaGFuZGxlZCBkaWZmZXJlbnRseSBmcm9tIGFueSBv dGhlciBCLXRyZWU7IHRoZSBNYXBsZQ0KKwkgKiBUcmVlIHNwbGl0cyB1cHdhcmRzLiAgU3BsaXR0 aW5nIHVwIG1lYW5zIHRoYXQgdGhlIHNwbGl0IG9wZXJhdGlvbg0KKwkgKiBvY2N1cnMgd2hlbiB0 aGUgd2FsayBvZiB0aGUgdHJlZSBoaXRzIHRoZSBsZWF2ZXMgYW5kIG5vdCBvbiB0aGUgd2F5DQor CSAqIGRvd24uICBUaGUgcmVhc29uIGZvciBzcGxpdHRpbmcgdXAgaXMgdGhhdCBpdCBpcyBpbXBv c3NpYmxlIHRvIGtub3cNCisJICogaG93IG11Y2ggc3BhY2Ugd2lsbCBiZSBuZWVkZWQgdW50aWwg dGhlIGxlYWYgaXMgKG9yIGxlYXZlcyBhcmUpDQorCSAqIHJlYWNoZWQuICBTaW5jZSBvdmVyd3Jp dGluZyBkYXRhIGlzIGFsbG93ZWQgYW5kIGEgcmFuZ2UgY291bGQNCisJICogb3ZlcndyaXRlIG1v cmUgdGhhbiBvbmUgcmFuZ2Ugb3IgcmVzdWx0IGluIGNoYW5naW5nIG9uZSBlbnRyeSBpbnRvIDMN CisJICogZW50cmllcywgaXQgaXMgaW1wb3NzaWJsZSB0byBrbm93IGlmIGEgc3BsaXQgaXMgcmVx dWlyZWQgdW50aWwgdGhlDQorCSAqIGRhdGEgaXMgZXhhbWluZWQuDQorCSAqDQorCSAqIFNwbGl0 dGluZyBpcyBhIGJhbGFuY2luZyBhY3QgYmV0d2VlbiBrZWVwaW5nIGFsbG9jYXRpb25zIHRvIGEg bWluaW11bQ0KKwkgKiBhbmQgYXZvaWRpbmcgYSAnaml0dGVyJyBldmVudCB3aGVyZSBhIHRyZWUg aXMgZXhwYW5kZWQgdG8gbWFrZSByb29tDQorCSAqIGZvciBhbiBlbnRyeSBmb2xsb3dlZCBieSBh IGNvbnRyYWN0aW9uIHdoZW4gdGhlIGVudHJ5IGlzIHJlbW92ZWQuICBUbw0KKwkgKiBhY2NvbXBs aXNoIHRoZSBiYWxhbmNlLCB0aGVyZSBhcmUgZW1wdHkgc2xvdHMgcmVtYWluaW5nIGluIGJvdGgg bGVmdA0KKwkgKiBhbmQgcmlnaHQgbm9kZXMgYWZ0ZXIgYSBzcGxpdC4NCisJICovDQorCU1BX1NU QVRFKGxfbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFzdCk7DQorCU1BX1NUQVRF KHJfbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFzdCk7DQorCU1BX1NUQVRFKHBy ZXZfbF9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0KTsNCisJTUFfU1RBVEUo cHJldl9yX21hcywgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmxhc3QpOw0KKwlNQV9UT1BJ QVJZKG1hdCwgbWFzLT50cmVlKTsNCisNCisJdHJhY2VfbWFfb3AoX19mdW5jX18sIG1hcyk7DQor CW1hcy0+ZGVwdGggPSBtYXNfbXRfaGVpZ2h0KG1hcyk7DQorCS8qIEFsbG9jYXRpb24gZmFpbHVy ZXMgd2lsbCBoYXBwZW4gZWFybHkuICovDQorCW1hc19ub2RlX2NvdW50KG1hcywgMSArIG1hcy0+ ZGVwdGggKiAyKTsNCisJaWYgKG1hc19pc19lcnIobWFzKSkNCisJCXJldHVybiAwOw0KKw0KKwlt YXN0LmwgPSAmbF9tYXM7DQorCW1hc3QuciA9ICZyX21hczsNCisJbWFzdC5vcmlnX2wgPSAmcHJl dl9sX21hczsNCisJbWFzdC5vcmlnX3IgPSAmcHJldl9yX21hczsNCisJbWFzdC5mcmVlID0gJm1h dDsNCisJbWFzdC5ibiA9IGJfbm9kZTsNCisNCisJd2hpbGUgKGhlaWdodCsrIDw9IG1hcy0+ZGVw dGgpIHsNCisJCWlmIChtdF9zbG90c1tiX25vZGUtPnR5cGVdID4gYl9ub2RlLT5iX2VuZCkgew0K KwkJCW1hc19zcGxpdF9maW5hbF9ub2RlKCZtYXN0LCBtYXMsIGhlaWdodCk7DQorCQkJYnJlYWs7 DQorCQl9DQorDQorCQlsX21hcyA9IHJfbWFzID0gKm1hczsNCisJCWxfbWFzLm5vZGUgPSBtYXNf bmV3X21hX25vZGUobWFzLCBiX25vZGUpOw0KKwkJcl9tYXMubm9kZSA9IG1hc19uZXdfbWFfbm9k ZShtYXMsIGJfbm9kZSk7DQorCQkvKg0KKwkJICogQW5vdGhlciB3YXkgdGhhdCAnaml0dGVyJyBp cyBhdm9pZGVkIGlzIHRvIHRlcm1pbmF0ZSBhIHNwbGl0IHVwIGVhcmx5IGlmIHRoZQ0KKwkJICog bGVmdCBvciByaWdodCBub2RlIGhhcyBzcGFjZSB0byBzcGFyZS4gIFRoaXMgaXMgcmVmZXJyZWQg dG8gYXMgInB1c2hpbmcgbGVmdCINCisJCSAqIG9yICJwdXNoaW5nIHJpZ2h0IiBhbmQgaXMgc2lt aWxhciB0byB0aGUgQiogdHJlZSwgZXhjZXB0IHRoZSBub2RlcyBsZWZ0IG9yDQorCQkgKiByaWdo dCBjYW4gcmFyZWx5IGJlIHJldXNlZCBkdWUgdG8gUkNVLCBidXQgdGhlIHJpcHBsZSB1cHdhcmRz IGlzIGhhbHRlZCB3aGljaA0KKwkJICogaXMgYSBzaWduaWZpY2FudCBzYXZpbmdzLg0KKwkJICov DQorCQkvKiBUcnkgdG8gcHVzaCBsZWZ0LiAqLw0KKwkJaWYgKG1hc19wdXNoX2RhdGEobWFzLCBo ZWlnaHQsICZtYXN0LCB0cnVlKSkNCisJCQlicmVhazsNCisNCisJCS8qIFRyeSB0byBwdXNoIHJp Z2h0LiAqLw0KKwkJaWYgKG1hc19wdXNoX2RhdGEobWFzLCBoZWlnaHQsICZtYXN0LCBmYWxzZSkp DQorCQkJYnJlYWs7DQorDQorCQlzcGxpdCA9IG1hYl9jYWxjX3NwbGl0KG1hcywgYl9ub2RlLCAm bWlkX3NwbGl0LCBwcmV2X2xfbWFzLm1pbik7DQorCQltYXN0X3NwbGl0X2RhdGEoJm1hc3QsIG1h cywgc3BsaXQpOw0KKwkJLyoNCisJCSAqIFVzdWFsbHkgY29ycmVjdCwgbWFiX21hc19jcCBpbiB0 aGUgYWJvdmUgY2FsbCBvdmVyd3JpdGVzDQorCQkgKiByLT5tYXguDQorCQkgKi8NCisJCW1hc3Qu ci0+bWF4ID0gbWFzLT5tYXg7DQorCQltYXN0X2ZpbGxfYm5vZGUoJm1hc3QsIG1hcywgMSk7DQor CQlwcmV2X2xfbWFzID0gKm1hc3QubDsNCisJCXByZXZfcl9tYXMgPSAqbWFzdC5yOw0KKwl9DQor DQorCS8qIFNldCB0aGUgb3JpZ2luYWwgbm9kZSBhcyBkZWFkICovDQorCW1hdF9hZGQobWFzdC5m cmVlLCBtYXMtPm5vZGUpOw0KKwltYXMtPm5vZGUgPSBsX21hcy5ub2RlOw0KKwltYXNfd21iX3Jl cGxhY2UobWFzLCBtYXN0LmZyZWUsIE5VTEwpOw0KKwltdHJlZV9yYW5nZV93YWxrKG1hcyk7DQor CXJldHVybiAxOw0KK30NCisNCisvKg0KKyAqIG1hc19yZXVzZV9ub2RlKCkgLSBSZXVzZSB0aGUg bm9kZSB0byBzdG9yZSB0aGUgZGF0YS4NCisgKiBAd3JfbWFzOiBUaGUgbWFwbGUgd3JpdGUgc3Rh dGUNCisgKiBAYm46IFRoZSBtYXBsZSBiaWcgbm9kZQ0KKyAqIEBlbmQ6IFRoZSBlbmQgb2YgdGhl IGRhdGEuDQorICoNCisgKiBXaWxsIGFsd2F5cyByZXR1cm4gZmFsc2UgaW4gUkNVIG1vZGUuDQor ICoNCisgKiBSZXR1cm46IFRydWUgaWYgbm9kZSB3YXMgcmV1c2VkLCBmYWxzZSBvdGhlcndpc2Uu DQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19yZXVzZV9ub2RlKHN0cnVjdCBtYV93cl9z dGF0ZSAqd3JfbWFzLA0KKwkJCSAgc3RydWN0IG1hcGxlX2JpZ19ub2RlICpibiwgdW5zaWduZWQg Y2hhciBlbmQpDQorew0KKwkvKiBOZWVkIHRvIGJlIHJjdSBzYWZlLiAqLw0KKwlpZiAobXRfaW5f cmN1KHdyX21hcy0+bWFzLT50cmVlKSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJaWYgKGVuZCA+ IGJuLT5iX2VuZCkgew0KKwkJaW50IGNsZWFyID0gbXRfc2xvdHNbd3JfbWFzLT50eXBlXSAtIGJu LT5iX2VuZDsNCisNCisJCW1lbXNldCh3cl9tYXMtPnNsb3RzICsgYm4tPmJfZW5kLCAwLCBzaXpl b2Yodm9pZCAqKSAqIGNsZWFyLS0pOw0KKwkJbWVtc2V0KHdyX21hcy0+cGl2b3RzICsgYm4tPmJf ZW5kLCAwLCBzaXplb2Yodm9pZCAqKSAqIGNsZWFyKTsNCisJfQ0KKwltYWJfbWFzX2NwKGJuLCAw LCBibi0+Yl9lbmQsIHdyX21hcy0+bWFzLCBmYWxzZSk7DQorCXJldHVybiB0cnVlOw0KK30NCisN CisvKg0KKyAqIG1hc19jb21taXRfYl9ub2RlKCkgLSBDb21taXQgdGhlIGJpZyBub2RlIGludG8g dGhlIHRyZWUuDQorICogQHdyX21hczogVGhlIG1hcGxlIHdyaXRlIHN0YXRlDQorICogQGJfbm9k ZTogVGhlIG1hcGxlIGJpZyBub2RlDQorICogQGVuZDogVGhlIGVuZCBvZiB0aGUgZGF0YS4NCisg Ki8NCitzdGF0aWMgaW5saW5lIGludCBtYXNfY29tbWl0X2Jfbm9kZShzdHJ1Y3QgbWFfd3Jfc3Rh dGUgKndyX21hcywNCisJCQkgICAgc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUsIHVuc2ln bmVkIGNoYXIgZW5kKQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXVuc2lnbmVk IGNoYXIgYl9lbmQgPSBiX25vZGUtPmJfZW5kOw0KKwllbnVtIG1hcGxlX3R5cGUgYl90eXBlID0g Yl9ub2RlLT50eXBlOw0KKw0KKwlpZiAoKGJfZW5kIDwgbXRfbWluX3Nsb3RzW2JfdHlwZV0pICYm DQorCSAgICAoIW10ZV9pc19yb290KHdyX21hcy0+bWFzLT5ub2RlKSkgJiYNCisJICAgIChtYXNf bXRfaGVpZ2h0KHdyX21hcy0+bWFzKSA+IDEpKQ0KKwkJcmV0dXJuIG1hc19yZWJhbGFuY2Uod3Jf bWFzLT5tYXMsIGJfbm9kZSk7DQorDQorCWlmIChiX2VuZCA+PSBtdF9zbG90c1tiX3R5cGVdKQ0K KwkJcmV0dXJuIG1hc19zcGxpdCh3cl9tYXMtPm1hcywgYl9ub2RlKTsNCisNCisJaWYgKG1hc19y ZXVzZV9ub2RlKHdyX21hcywgYl9ub2RlLCBlbmQpKQ0KKwkJZ290byByZXVzZV9ub2RlOw0KKw0K KwltYXNfbm9kZV9jb3VudCh3cl9tYXMtPm1hcywgMSk7DQorCWlmIChtYXNfaXNfZXJyKHdyX21h cy0+bWFzKSkNCisJCXJldHVybiAwOw0KKw0KKwlub2RlID0gbWFzX3BvcF9ub2RlKHdyX21hcy0+ bWFzKTsNCisJbm9kZS0+cGFyZW50ID0gbWFzX21uKHdyX21hcy0+bWFzKS0+cGFyZW50Ow0KKwl3 cl9tYXMtPm1hcy0+bm9kZSA9IG10X21rX25vZGUobm9kZSwgYl90eXBlKTsNCisJbWFiX21hc19j cChiX25vZGUsIDAsIGJfZW5kLCB3cl9tYXMtPm1hcywgdHJ1ZSk7DQorDQorCW1hc19yZXBsYWNl KHdyX21hcy0+bWFzLCBmYWxzZSk7DQorcmV1c2Vfbm9kZToNCisJbWFzX3VwZGF0ZV9nYXAod3Jf bWFzLT5tYXMpOw0KKwlyZXR1cm4gMTsNCit9DQorDQorLyoNCisgKiBtYXNfcm9vdF9leHBhbmQo KSAtIEV4cGFuZCBhIHJvb3QgdG8gYSBub2RlDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQor ICogQGVudHJ5OiBUaGUgZW50cnkgdG8gc3RvcmUgaW50byB0aGUgdHJlZQ0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgaW50IG1hc19yb290X2V4cGFuZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAq ZW50cnkpDQorew0KKwl2b2lkICpjb250ZW50cyA9IG1hc19yb290X2xvY2tlZChtYXMpOw0KKwll bnVtIG1hcGxlX3R5cGUgdHlwZSA9IG1hcGxlX2xlYWZfNjQ7DQorCXN0cnVjdCBtYXBsZV9ub2Rl ICpub2RlOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsN CisJaW50IHNsb3QgPSAwOw0KKw0KKwltYXNfbm9kZV9jb3VudChtYXMsIDEpOw0KKwlpZiAodW5s aWtlbHkobWFzX2lzX2VycihtYXMpKSkNCisJCXJldHVybiAwOw0KKw0KKwlub2RlID0gbWFzX3Bv cF9ub2RlKG1hcyk7DQorCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJc2xvdHMg PSBtYV9zbG90cyhub2RlLCB0eXBlKTsNCisJbm9kZS0+cGFyZW50ID0gbWFfcGFyZW50X3B0cigN CisJCSAgICAgICgodW5zaWduZWQgbG9uZyltYXMtPnRyZWUgfCBNQV9ST09UX1BBUkVOVCkpOw0K KwltYXMtPm5vZGUgPSBtdF9ta19ub2RlKG5vZGUsIHR5cGUpOw0KKw0KKwlpZiAobWFzLT5pbmRl eCkgew0KKwkJaWYgKGNvbnRlbnRzKSB7DQorCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHNsb3RzW3Ns b3RdLCBjb250ZW50cyk7DQorCQkJaWYgKGxpa2VseShtYXMtPmluZGV4ID4gMSkpDQorCQkJCXNs b3QrKzsNCisJCX0NCisJCXBpdm90c1tzbG90KytdID0gbWFzLT5pbmRleCAtIDE7DQorCX0NCisN CisJcmN1X2Fzc2lnbl9wb2ludGVyKHNsb3RzW3Nsb3RdLCBlbnRyeSk7DQorCW1hcy0+b2Zmc2V0 ID0gc2xvdDsNCisJcGl2b3RzW3Nsb3RdID0gbWFzLT5sYXN0Ow0KKwlpZiAobWFzLT5sYXN0ICE9 IFVMT05HX01BWCkNCisJCXNsb3QrKzsNCisJbWFzLT5kZXB0aCA9IDE7DQorCW1hc19zZXRfaGVp Z2h0KG1hcyk7DQorDQorCS8qIHN3YXAgdGhlIG5ldyByb290IGludG8gdGhlIHRyZWUgKi8NCisJ cmN1X2Fzc2lnbl9wb2ludGVyKG1hcy0+dHJlZS0+bWFfcm9vdCwgbXRlX21rX3Jvb3QobWFzLT5u b2RlKSk7DQorCW1hX3NldF9tZXRhKG5vZGUsIG1hcGxlX2xlYWZfNjQsIDAsIHNsb3QpOw0KKwly ZXR1cm4gc2xvdDsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19zdG9yZV9yb290KHN0 cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSkNCit7DQorCWlmIChsaWtlbHkoKG1hcy0+ bGFzdCAhPSAwKSB8fCAobWFzLT5pbmRleCAhPSAwKSkpDQorCQltYXNfcm9vdF9leHBhbmQobWFz LCBlbnRyeSk7DQorCWVsc2UgaWYgKCgodW5zaWduZWQgbG9uZykgKGVudHJ5KSAmIDMpID09IDIp DQorCQltYXNfcm9vdF9leHBhbmQobWFzLCBlbnRyeSk7DQorCWVsc2Ugew0KKwkJcmN1X2Fzc2ln bl9wb2ludGVyKG1hcy0+dHJlZS0+bWFfcm9vdCwgZW50cnkpOw0KKwkJbWFzLT5ub2RlID0gTUFT X1NUQVJUOw0KKwl9DQorfQ0KKw0KKy8qDQorICogbWFzX2lzX3NwYW5fd3IoKSAtIENoZWNrIGlm IHRoZSB3cml0ZSBuZWVkcyB0byBiZSB0cmVhdGVkIGFzIGEgd3JpdGUgdGhhdA0KKyAqIHNwYW5z IHRoZSBub2RlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBwaXY6IFRoZSBwaXZv dCB2YWx1ZSBiZWluZyB3cml0dGVuDQorICogQHR5cGU6IFRoZSBtYXBsZSBub2RlIHR5cGUNCisg KiBAZW50cnk6IFRoZSBkYXRhIHRvIHdyaXRlDQorICoNCisgKiBTcGFubmluZyB3cml0ZXMgYXJl IHdyaXRlcyB0aGF0IHN0YXJ0IGluIG9uZSBub2RlIGFuZCBlbmQgaW4gYW5vdGhlciBPUiBpZg0K KyAqIHRoZSB3cml0ZSBvZiBhICVOVUxMIHdpbGwgY2F1c2UgdGhlIG5vZGUgdG8gZW5kIHdpdGgg YSAlTlVMTC4NCisgKg0KKyAqIFJldHVybjogVHJ1ZSBpZiB0aGlzIGlzIGEgc3Bhbm5pbmcgd3Jp dGUsIGZhbHNlIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgYm9vbCBtYXNfaXNfc3Bhbl93cihz dHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCXVuc2lnbmVkIGxvbmcgbWF4Ow0KKwl1 bnNpZ25lZCBsb25nIGxhc3QgPSB3cl9tYXMtPm1hcy0+bGFzdDsNCisJdW5zaWduZWQgbG9uZyBw aXYgPSB3cl9tYXMtPnJfbWF4Ow0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZSA9IHdyX21hcy0+dHlw ZTsNCisJdm9pZCAqZW50cnkgPSB3cl9tYXMtPmVudHJ5Ow0KKw0KKwkvKiBDb250YWluZWQgaW4g dGhpcyBwaXZvdCAqLw0KKwlpZiAocGl2ID4gbGFzdCkNCisJCXJldHVybiBmYWxzZTsNCisNCisJ bWF4ID0gd3JfbWFzLT5tYXMtPm1heDsNCisJaWYgKHVubGlrZWx5KG1hX2lzX2xlYWYodHlwZSkp KSB7DQorCQkvKiBGaXRzIGluIHRoZSBub2RlLCBidXQgbWF5IHNwYW4gc2xvdHMuICovDQorCQlp ZiAobGFzdCA8IG1heCkNCisJCQlyZXR1cm4gZmFsc2U7DQorDQorCQkvKiBXcml0ZXMgdG8gdGhl IGVuZCBvZiB0aGUgbm9kZSBidXQgbm90IG51bGwuICovDQorCQlpZiAoKGxhc3QgPT0gbWF4KSAm JiBlbnRyeSkNCisJCQlyZXR1cm4gZmFsc2U7DQorDQorCQkvKg0KKwkJICogV3JpdGluZyBVTE9O R19NQVggaXMgbm90IGEgc3Bhbm5pbmcgd3JpdGUgcmVnYXJkbGVzcyBvZiB0aGUNCisJCSAqIHZh bHVlIGJlaW5nIHdyaXR0ZW4gYXMgbG9uZyBhcyB0aGUgcmFuZ2UgZml0cyBpbiB0aGUgbm9kZS4N CisJCSAqLw0KKwkJaWYgKChsYXN0ID09IFVMT05HX01BWCkgJiYgKGxhc3QgPT0gbWF4KSkNCisJ CQlyZXR1cm4gZmFsc2U7DQorCX0gZWxzZSBpZiAocGl2ID09IGxhc3QpIHsNCisJCWlmIChlbnRy eSkNCisJCQlyZXR1cm4gZmFsc2U7DQorDQorCQkvKiBEZXRlY3Qgc3Bhbm5pbmcgc3RvcmUgd3Ig d2FsayAqLw0KKwkJaWYgKGxhc3QgPT0gVUxPTkdfTUFYKQ0KKwkJCXJldHVybiBmYWxzZTsNCisJ fQ0KKw0KKwl0cmFjZV9tYV93cml0ZShfX2Z1bmNfXywgd3JfbWFzLT5tYXMsIHBpdiwgZW50cnkp Ow0KKw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG1hc193cl93 YWxrX2Rlc2NlbmQoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwl3cl9tYXMtPm1h cy0+ZGVwdGgrKzsNCisJd3JfbWFzLT50eXBlID0gbXRlX25vZGVfdHlwZSh3cl9tYXMtPm1hcy0+ bm9kZSk7DQorCW1hc193cl9ub2RlX3dhbGsod3JfbWFzKTsNCisJd3JfbWFzLT5zbG90cyA9IG1h X3Nsb3RzKHdyX21hcy0+bm9kZSwgd3JfbWFzLT50eXBlKTsNCit9DQorDQorc3RhdGljIGlubGlu ZSB2b2lkIG1hc193cl93YWxrX3RyYXZlcnNlKHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0K K3sNCisJd3JfbWFzLT5tYXMtPm1heCA9IHdyX21hcy0+cl9tYXg7DQorCXdyX21hcy0+bWFzLT5t aW4gPSB3cl9tYXMtPnJfbWluOw0KKwl3cl9tYXMtPm1hcy0+bm9kZSA9IHdyX21hcy0+Y29udGVu dDsNCisJd3JfbWFzLT5tYXMtPm9mZnNldCA9IDA7DQorfQ0KKy8qDQorICogbWFzX3dyX3dhbGso KSAtIFdhbGsgdGhlIHRyZWUgZm9yIGEgd3JpdGUuDQorICogQHdyX21hczogVGhlIG1hcGxlIHdy aXRlIHN0YXRlDQorICoNCisgKiBVc2VzIG1hc19zbG90X2xvY2tlZCgpIGFuZCBkb2VzIG5vdCBu ZWVkIHRvIHdvcnJ5IGFib3V0IGRlYWQgbm9kZXMuDQorICoNCisgKiBSZXR1cm46IFRydWUgaWYg aXQncyBjb250YWluZWQgaW4gYSBub2RlLCBmYWxzZSBvbiBzcGFubmluZyB3cml0ZS4NCisgKi8N CitzdGF0aWMgYm9vbCBtYXNfd3Jfd2FsayhzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7 DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQorDQorCXdoaWxlICh0cnVl KSB7DQorCQltYXNfd3Jfd2Fsa19kZXNjZW5kKHdyX21hcyk7DQorCQlpZiAodW5saWtlbHkobWFz X2lzX3NwYW5fd3Iod3JfbWFzKSkpDQorCQkJcmV0dXJuIGZhbHNlOw0KKw0KKwkJd3JfbWFzLT5j b250ZW50ID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywgd3JfbWFzLT5zbG90cywNCisJCQkJCQkgIG1h cy0+b2Zmc2V0KTsNCisJCWlmIChtYV9pc19sZWFmKHdyX21hcy0+dHlwZSkpDQorCQkJcmV0dXJu IHRydWU7DQorDQorCQltYXNfd3Jfd2Fsa190cmF2ZXJzZSh3cl9tYXMpOw0KKwl9DQorDQorCXJl dHVybiB0cnVlOw0KK30NCisNCitzdGF0aWMgYm9vbCBtYXNfd3Jfd2Fsa19pbmRleChzdHJ1Y3Qg bWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFz LT5tYXM7DQorDQorCXdoaWxlICh0cnVlKSB7DQorCQltYXNfd3Jfd2Fsa19kZXNjZW5kKHdyX21h cyk7DQorCQl3cl9tYXMtPmNvbnRlbnQgPSBtYXNfc2xvdF9sb2NrZWQobWFzLCB3cl9tYXMtPnNs b3RzLA0KKwkJCQkJCSAgbWFzLT5vZmZzZXQpOw0KKwkJaWYgKG1hX2lzX2xlYWYod3JfbWFzLT50 eXBlKSkNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCW1hc193cl93YWxrX3RyYXZlcnNlKHdyX21hcyk7 DQorDQorCX0NCisJcmV0dXJuIHRydWU7DQorfQ0KKy8qDQorICogbWFzX2V4dGVuZF9zcGFubmlu Z19udWxsKCkgLSBFeHRlbmQgYSBzdG9yZSBvZiBhICVOVUxMIHRvIGluY2x1ZGUgc3Vycm91bmRp bmcgJU5VTExzLg0KKyAqIEBsX3dyX21hczogVGhlIGxlZnQgbWFwbGUgd3JpdGUgc3RhdGUNCisg KiBAcl93cl9tYXM6IFRoZSByaWdodCBtYXBsZSB3cml0ZSBzdGF0ZQ0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdm9pZCBtYXNfZXh0ZW5kX3NwYW5uaW5nX251bGwoc3RydWN0IG1hX3dyX3N0YXRlICps X3dyX21hcywNCisJCQkJCSAgICBzdHJ1Y3QgbWFfd3Jfc3RhdGUgKnJfd3JfbWFzKQ0KK3sNCisJ c3RydWN0IG1hX3N0YXRlICpyX21hcyA9IHJfd3JfbWFzLT5tYXM7DQorCXN0cnVjdCBtYV9zdGF0 ZSAqbF9tYXMgPSBsX3dyX21hcy0+bWFzOw0KKwl1bnNpZ25lZCBjaGFyIGxfc2xvdDsNCisNCisJ bF9zbG90ID0gbF9tYXMtPm9mZnNldDsNCisJaWYgKCFsX3dyX21hcy0+Y29udGVudCkNCisJCWxf bWFzLT5pbmRleCA9IGxfd3JfbWFzLT5yX21pbjsNCisNCisJaWYgKChsX21hcy0+aW5kZXggPT0g bF93cl9tYXMtPnJfbWluKSAmJg0KKwkJIChsX3Nsb3QgJiYNCisJCSAgIW1hc19zbG90X2xvY2tl ZChsX21hcywgbF93cl9tYXMtPnNsb3RzLCBsX3Nsb3QgLSAxKSkpIHsNCisJCWlmIChsX3Nsb3Qg PiAxKQ0KKwkJCWxfbWFzLT5pbmRleCA9IGxfd3JfbWFzLT5waXZvdHNbbF9zbG90IC0gMl0gKyAx Ow0KKwkJZWxzZQ0KKwkJCWxfbWFzLT5pbmRleCA9IGxfbWFzLT5taW47DQorDQorCQlsX21hcy0+ b2Zmc2V0ID0gbF9zbG90IC0gMTsNCisJfQ0KKw0KKwlpZiAoIXJfd3JfbWFzLT5jb250ZW50KSB7 DQorCQlpZiAocl9tYXMtPmxhc3QgPCByX3dyX21hcy0+cl9tYXgpDQorCQkJcl9tYXMtPmxhc3Qg PSByX3dyX21hcy0+cl9tYXg7DQorCQlyX21hcy0+b2Zmc2V0Kys7DQorCX0gZWxzZSBpZiAoKHJf bWFzLT5sYXN0ID09IHJfd3JfbWFzLT5yX21heCkgJiYNCisJICAgIChyX21hcy0+bGFzdCA8IHJf bWFzLT5tYXgpICYmDQorCSAgICAhbWFzX3Nsb3RfbG9ja2VkKHJfbWFzLCByX3dyX21hcy0+c2xv dHMsIHJfbWFzLT5vZmZzZXQgKyAxKSkgew0KKwkJcl9tYXMtPmxhc3QgPSBtYXNfc2FmZV9waXZv dChyX21hcywgcl93cl9tYXMtPnBpdm90cywNCisJCQkJCSAgICAgcl93cl9tYXMtPnR5cGUsIHJf bWFzLT5vZmZzZXQgKyAxKTsNCisJCXJfbWFzLT5vZmZzZXQrKzsNCisJfQ0KK30NCisNCitzdGF0 aWMgaW5saW5lIHZvaWQgKm1hc19zdGF0ZV93YWxrKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sN CisJdm9pZCAqZW50cnk7DQorDQorCWVudHJ5ID0gbWFzX3N0YXJ0KG1hcyk7DQorCWlmIChtYXNf aXNfbm9uZShtYXMpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWlmIChtYXNfaXNfcHRyKG1hcykp DQorCQlyZXR1cm4gZW50cnk7DQorDQorCXJldHVybiBtdHJlZV9yYW5nZV93YWxrKG1hcyk7DQor fQ0KKw0KKy8qDQorICogbXRyZWVfbG9va3VwX3dhbGsoKSAtIEludGVybmFsIHF1aWNrIGxvb2t1 cCB0aGF0IGRvZXMgbm90IGtlZXAgbWFwbGUgc3RhdGUgdXANCisgKiB0byBkYXRlLg0KKyAqDQor ICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0KKyAqDQorICogTm90ZTogTGVhdmVzIG1hcyBpbiB1 bmRlc2lyYWJsZSBzdGF0ZS4NCisgKiBSZXR1cm46IFRoZSBlbnRyeSBmb3IgQG1hcy0+aW5kZXgg b3IgJU5VTEwgb24gZGVhZCBub2RlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbXRyZWVf bG9va3VwX3dhbGsoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl1bnNpZ25lZCBsb25nICpw aXZvdHM7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9k ZTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpuZXh0Ow0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsN CisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwl1bnNpZ25lZCBjaGFyIGVuZDsNCisJdW5zaWduZWQg bG9uZyBtYXg7DQorDQorCW5leHQgPSBtYXMtPm5vZGU7DQorCW1heCA9IFVMT05HX01BWDsNCisJ ZG8gew0KKwkJb2Zmc2V0ID0gMDsNCisJCW5vZGUgPSBtdGVfdG9fbm9kZShuZXh0KTsNCisJCXR5 cGUgPSBtdGVfbm9kZV90eXBlKG5leHQpOw0KKwkJcGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIHR5 cGUpOw0KKwkJZW5kID0gbWFfZGF0YV9lbmQobm9kZSwgdHlwZSwgcGl2b3RzLCBtYXgpOw0KKwkJ aWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQkJZ290byBkZWFkX25vZGU7DQor DQorCQlpZiAocGl2b3RzW29mZnNldF0gPj0gbWFzLT5pbmRleCkNCisJCQlnb3RvIG5leHQ7DQor DQorCQlkbyB7DQorCQkJb2Zmc2V0Kys7DQorCQl9IHdoaWxlICgob2Zmc2V0IDwgZW5kKSAmJiAo cGl2b3RzW29mZnNldF0gPCBtYXMtPmluZGV4KSk7DQorDQorCQlpZiAobGlrZWx5KG9mZnNldCA+ IGVuZCkpDQorCQkJbWF4ID0gcGl2b3RzW29mZnNldF07DQorDQorbmV4dDoNCisJCXNsb3RzID0g bWFfc2xvdHMobm9kZSwgdHlwZSk7DQorCQluZXh0ID0gbXRfc2xvdChtYXMtPnRyZWUsIHNsb3Rz LCBvZmZzZXQpOw0KKwkJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQkJZ290 byBkZWFkX25vZGU7DQorCX0gd2hpbGUgKCFtYV9pc19sZWFmKHR5cGUpKTsNCisNCisJcmV0dXJu ICh2b2lkICopIG5leHQ7DQorDQorZGVhZF9ub2RlOg0KKwltYXNfcmVzZXQobWFzKTsNCisJcmV0 dXJuIE5VTEw7DQorfQ0KKw0KKy8qDQorICogbWFzX25ld19yb290KCkgLSBDcmVhdGUgYSBuZXcg cm9vdCBub2RlIHRoYXQgb25seSBjb250YWlucyB0aGUgZW50cnkgcGFzc2VkDQorICogaW4uDQor ICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGVudHJ5OiBUaGUgZW50cnkgdG8gc3RvcmUu DQorICoNCisgKiBPbmx5IHZhbGlkIHdoZW4gdGhlIGluZGV4ID09IDAgYW5kIHRoZSBsYXN0ID09 IFVMT05HX01BWA0KKyAqDQorICogUmV0dXJuIDAgb24gZXJyb3IsIDEgb24gc3VjY2Vzcy4NCisg Ki8NCitzdGF0aWMgaW5saW5lIGludCBtYXNfbmV3X3Jvb3Qoc3RydWN0IG1hX3N0YXRlICptYXMs IHZvaWQgKmVudHJ5KQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2RlICpyb290ID0gbWFzX3Jvb3Rf bG9ja2VkKG1hcyk7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlID0gbWFwbGVfbGVhZl82NDsNCisJ c3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdW5zaWdu ZWQgbG9uZyAqcGl2b3RzOw0KKw0KKwlpZiAoIWVudHJ5ICYmICFtYXMtPmluZGV4ICYmIG1hcy0+ bGFzdCA9PSBVTE9OR19NQVgpIHsNCisJCW1hcy0+ZGVwdGggPSAwOw0KKwkJbWFzX3NldF9oZWln aHQobWFzKTsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcihtYXMtPnRyZWUtPm1hX3Jvb3QsIGVudHJ5 KTsNCisJCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwlt YXNfbm9kZV9jb3VudChtYXMsIDEpOw0KKwlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJcmV0dXJu IDA7DQorDQorCW5vZGUgPSBtYXNfcG9wX25vZGUobWFzKTsNCisJcGl2b3RzID0gbWFfcGl2b3Rz KG5vZGUsIHR5cGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIHR5cGUpOw0KKwlub2RlLT5w YXJlbnQgPSBtYV9wYXJlbnRfcHRyKA0KKwkJICAgICAgKCh1bnNpZ25lZCBsb25nKW1hcy0+dHJl ZSB8IE1BX1JPT1RfUEFSRU5UKSk7DQorCW1hcy0+bm9kZSA9IG10X21rX25vZGUobm9kZSwgdHlw ZSk7DQorCXJjdV9hc3NpZ25fcG9pbnRlcihzbG90c1swXSwgZW50cnkpOw0KKwlwaXZvdHNbMF0g PSBtYXMtPmxhc3Q7DQorCW1hcy0+ZGVwdGggPSAxOw0KKwltYXNfc2V0X2hlaWdodChtYXMpOw0K KwlyY3VfYXNzaWduX3BvaW50ZXIobWFzLT50cmVlLT5tYV9yb290LCBtdGVfbWtfcm9vdChtYXMt Pm5vZGUpKTsNCisNCitkb25lOg0KKwlpZiAoeGFfaXNfbm9kZShyb290KSkNCisJCW10ZV9kZXN0 cm95X3dhbGsocm9vdCwgbWFzLT50cmVlKTsNCisNCisJcmV0dXJuIDE7DQorfQ0KKy8qDQorICog bWFzX3dyX3NwYW5uaW5nX3N0b3JlKCkgLSBDcmVhdGUgYSBzdWJ0cmVlIHdpdGggdGhlIHN0b3Jl IG9wZXJhdGlvbiBjb21wbGV0ZWQNCisgKiBhbmQgbmV3IG5vZGVzIHdoZXJlIG5lY2Vzc2FyeSwg dGhlbiBwbGFjZSB0aGUgc3ViLXRyZWUgaW4gdGhlIGFjdHVhbCB0cmVlLg0KKyAqIE5vdGUgdGhh dCBtYXMgaXMgZXhwZWN0ZWQgdG8gcG9pbnQgdG8gdGhlIG5vZGUgd2hpY2ggY2F1c2VkIHRoZSBz dG9yZSB0bw0KKyAqIHNwYW4uDQorICogQHdyX21hczogVGhlIG1hcGxlIHdyaXRlIHN0YXRlDQor ICoNCisgKiBSZXR1cm46IDAgb24gZXJyb3IsIHBvc2l0aXZlIG9uIHN1Y2Nlc3MuDQorICovDQor c3RhdGljIGlubGluZSBpbnQgbWFzX3dyX3NwYW5uaW5nX3N0b3JlKHN0cnVjdCBtYV93cl9zdGF0 ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgbWFzdDsNCisJc3Ry dWN0IG1hcGxlX2JpZ19ub2RlIGJfbm9kZTsNCisJc3RydWN0IG1hX3N0YXRlICptYXM7DQorCXVu c2lnbmVkIGNoYXIgaGVpZ2h0Ow0KKw0KKwkvKiBMZWZ0IGFuZCBSaWdodCBzaWRlIG9mIHNwYW5u aW5nIHN0b3JlICovDQorCU1BX1NUQVRFKGxfbWFzLCBOVUxMLCAwLCAwKTsNCisJTUFfU1RBVEUo cl9tYXMsIE5VTEwsIDAsIDApOw0KKw0KKwlNQV9XUl9TVEFURShyX3dyX21hcywgJnJfbWFzLCB3 cl9tYXMtPmVudHJ5KTsNCisJTUFfV1JfU1RBVEUobF93cl9tYXMsICZsX21hcywgd3JfbWFzLT5l bnRyeSk7DQorDQorCS8qDQorCSAqIEEgc3RvcmUgb3BlcmF0aW9uIHRoYXQgc3BhbnMgbXVsdGlw bGUgbm9kZXMgaXMgY2FsbGVkIGEgc3Bhbm5pbmcNCisJICogc3RvcmUgYW5kIGlzIGhhbmRsZWQg ZWFybHkgaW4gdGhlIHN0b3JlIGNhbGwgc3RhY2sgYnkgdGhlIGZ1bmN0aW9uDQorCSAqIG1hc19p c19zcGFuX3dyKCkuICBXaGVuIGEgc3Bhbm5pbmcgc3RvcmUgaXMgaWRlbnRpZmllZCwgdGhlIG1h cGxlDQorCSAqIHN0YXRlIGlzIGR1cGxpY2F0ZWQuICBUaGUgZmlyc3QgbWFwbGUgc3RhdGUgd2Fs a3MgdGhlIGxlZnQgdHJlZSBwYXRoDQorCSAqIHRvIGBgaW5kZXhgYCwgdGhlIGR1cGxpY2F0ZSB3 YWxrcyB0aGUgcmlnaHQgdHJlZSBwYXRoIHRvIGBgbGFzdGBgLg0KKwkgKiBUaGUgZGF0YSBpbiB0 aGUgdHdvIG5vZGVzIGFyZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIG5vZGUsIHR3byBub2RlcywN CisJICogb3IgcG9zc2libHkgdGhyZWUgbm9kZXMgKHNlZSB0aGUgMy13YXkgc3BsaXQgYWJvdmUp LiAgQSBgYE5VTExgYA0KKwkgKiB3cml0dGVuIHRvIHRoZSBsYXN0IGVudHJ5IG9mIGEgbm9kZSBp cyBjb25zaWRlcmVkIGEgc3Bhbm5pbmcgc3RvcmUgYXMNCisJICogYSByZWJhbGFuY2UgaXMgcmVx dWlyZWQgZm9yIHRoZSBvcGVyYXRpb24gdG8gY29tcGxldGUgYW5kIGFuIG92ZXJmbG93DQorCSAq IG9mIGRhdGEgbWF5IGhhcHBlbi4NCisJICovDQorCW1hcyA9IHdyX21hcy0+bWFzOw0KKwl0cmFj ZV9tYV9vcChfX2Z1bmNfXywgbWFzKTsNCisNCisJaWYgKHVubGlrZWx5KCFtYXMtPmluZGV4ICYm IG1hcy0+bGFzdCA9PSBVTE9OR19NQVgpKQ0KKwkJcmV0dXJuIG1hc19uZXdfcm9vdChtYXMsIHdy X21hcy0+ZW50cnkpOw0KKwkvKg0KKwkgKiBOb2RlIHJlYmFsYW5jaW5nIG1heSBvY2N1ciBkdWUg dG8gdGhpcyBzdG9yZSwgc28gdGhlcmUgbWF5IGJlIHRocmVlIG5ldw0KKwkgKiBlbnRyaWVzIHBl ciBsZXZlbCBwbHVzIGEgbmV3IHJvb3QuDQorCSAqLw0KKwloZWlnaHQgPSBtYXNfbXRfaGVpZ2h0 KG1hcyk7DQorCW1hc19ub2RlX2NvdW50KG1hcywgMSArIGhlaWdodCAqIDMpOw0KKwlpZiAobWFz X2lzX2VycihtYXMpKQ0KKwkJcmV0dXJuIDA7DQorDQorCS8qDQorCSAqIFNldCB1cCByaWdodCBz aWRlLiAgTmVlZCB0byBnZXQgdG8gdGhlIG5leHQgb2Zmc2V0IGFmdGVyIHRoZSBzcGFubmluZw0K KwkgKiBzdG9yZSB0byBlbnN1cmUgaXQncyBub3QgTlVMTCBhbmQgdG8gY29tYmluZSBib3RoIHRo ZSBuZXh0IG5vZGUgYW5kDQorCSAqIHRoZSBub2RlIHdpdGggdGhlIHN0YXJ0IHRvZ2V0aGVyLg0K KwkgKi8NCisJcl9tYXMgPSAqbWFzOw0KKwkvKiBBdm9pZCBvdmVyZmxvdywgd2FsayB0byBuZXh0 IHNsb3QgaW4gdGhlIHRyZWUuICovDQorCWlmIChyX21hcy5sYXN0ICsgMSkNCisJCXJfbWFzLmxh c3QrKzsNCisNCisJcl9tYXMuaW5kZXggPSByX21hcy5sYXN0Ow0KKwltYXNfd3Jfd2Fsa19pbmRl eCgmcl93cl9tYXMpOw0KKwlyX21hcy5sYXN0ID0gcl9tYXMuaW5kZXggPSBtYXMtPmxhc3Q7DQor DQorCS8qIFNldCB1cCBsZWZ0IHNpZGUuICovDQorCWxfbWFzID0gKm1hczsNCisJbWFzX3dyX3dh bGtfaW5kZXgoJmxfd3JfbWFzKTsNCisNCisJaWYgKCF3cl9tYXMtPmVudHJ5KSB7DQorCQltYXNf ZXh0ZW5kX3NwYW5uaW5nX251bGwoJmxfd3JfbWFzLCAmcl93cl9tYXMpOw0KKwkJbWFzLT5vZmZz ZXQgPSBsX21hcy5vZmZzZXQ7DQorCQltYXMtPmluZGV4ID0gbF9tYXMuaW5kZXg7DQorCQltYXMt Pmxhc3QgPSBsX21hcy5sYXN0ID0gcl9tYXMubGFzdDsNCisJfQ0KKw0KKwkvKiBleHBhbmRpbmcg TlVMTHMgbWF5IG1ha2UgdGhpcyBjb3ZlciB0aGUgZW50aXJlIHJhbmdlICovDQorCWlmICghbF9t YXMuaW5kZXggJiYgcl9tYXMubGFzdCA9PSBVTE9OR19NQVgpIHsNCisJCW1hc19zZXRfcmFuZ2Uo bWFzLCAwLCBVTE9OR19NQVgpOw0KKwkJcmV0dXJuIG1hc19uZXdfcm9vdChtYXMsIHdyX21hcy0+ ZW50cnkpOw0KKwl9DQorDQorCW1lbXNldCgmYl9ub2RlLCAwLCBzaXplb2Yoc3RydWN0IG1hcGxl X2JpZ19ub2RlKSk7DQorCS8qIENvcHkgbF9tYXMgYW5kIHN0b3JlIHRoZSB2YWx1ZSBpbiBiX25v ZGUuICovDQorCW1hc19zdG9yZV9iX25vZGUoJmxfd3JfbWFzLCAmYl9ub2RlLCBsX3dyX21hcy5u b2RlX2VuZCk7DQorCS8qIENvcHkgcl9tYXMgaW50byBiX25vZGUuICovDQorCWlmIChyX21hcy5v ZmZzZXQgPD0gcl93cl9tYXMubm9kZV9lbmQpDQorCQltYXNfbWFiX2NwKCZyX21hcywgcl9tYXMu b2Zmc2V0LCByX3dyX21hcy5ub2RlX2VuZCwNCisJCQkgICAmYl9ub2RlLCBiX25vZGUuYl9lbmQg KyAxKTsNCisJZWxzZQ0KKwkJYl9ub2RlLmJfZW5kKys7DQorDQorCS8qIFN0b3Agc3Bhbm5pbmcg c2VhcmNoZXMgYnkgc2VhcmNoaW5nIGZvciBqdXN0IGluZGV4LiAqLw0KKwlsX21hcy5pbmRleCA9 IGxfbWFzLmxhc3QgPSBtYXMtPmluZGV4Ow0KKw0KKwltYXN0LmJuID0gJmJfbm9kZTsNCisJbWFz dC5vcmlnX2wgPSAmbF9tYXM7DQorCW1hc3Qub3JpZ19yID0gJnJfbWFzOw0KKwkvKiBDb21iaW5l IGxfbWFzIGFuZCByX21hcyBhbmQgc3BsaXQgdGhlbSB1cCBldmVubHkgYWdhaW4uICovDQorCXJl dHVybiBtYXNfc3Bhbm5pbmdfcmViYWxhbmNlKG1hcywgJm1hc3QsIGhlaWdodCArIDEpOw0KK30N CisNCisvKg0KKyAqIG1hc193cl9ub2RlX3N0b3JlKCkgLSBBdHRlbXB0IHRvIHN0b3JlIHRoZSB2 YWx1ZSBpbiBhIG5vZGUNCisgKiBAd3JfbWFzOiBUaGUgbWFwbGUgd3JpdGUgc3RhdGUNCisgKg0K KyAqIEF0dGVtcHRzIHRvIHJldXNlIHRoZSBub2RlLCBidXQgbWF5IGFsbG9jYXRlLg0KKyAqDQor ICogUmV0dXJuOiBUcnVlIGlmIHN0b3JlZCwgZmFsc2Ugb3RoZXJ3aXNlDQorICovDQorc3RhdGlj IGlubGluZSBib29sIG1hc193cl9ub2RlX3N0b3JlKHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFz KQ0KK3sNCisJc3RydWN0IG1hX3N0YXRlICptYXMgPSB3cl9tYXMtPm1hczsNCisJdm9pZCBfX3Jj dSAqKmRzdF9zbG90czsNCisJdW5zaWduZWQgbG9uZyAqZHN0X3Bpdm90czsNCisJdW5zaWduZWQg Y2hhciBkc3Rfb2Zmc2V0Ow0KKwl1bnNpZ25lZCBjaGFyIG5ld19lbmQgPSB3cl9tYXMtPm5vZGVf ZW5kOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJdW5zaWduZWQgY2hhciBub2RlX3Nsb3Rz ID0gbXRfc2xvdHNbd3JfbWFzLT50eXBlXTsNCisJc3RydWN0IG1hcGxlX25vZGUgcmV1c2UsICpu ZXdub2RlOw0KKwl1bnNpZ25lZCBjaGFyIGNvcHlfc2l6ZSwgbWF4X3BpdiA9IG10X3Bpdm90c1t3 cl9tYXMtPnR5cGVdOw0KKwlib29sIGluX3JjdSA9IG10X2luX3JjdShtYXMtPnRyZWUpOw0KKw0K KwlvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisJaWYgKG1hcy0+bGFzdCA9PSB3cl9tYXMtPnJfbWF4 KSB7DQorCQkvKiBydW5zIHJpZ2h0IHRvIHRoZSBlbmQgb2YgdGhlIG5vZGUgKi8NCisJCWlmICht YXMtPmxhc3QgPT0gbWFzLT5tYXgpDQorCQkJbmV3X2VuZCA9IG9mZnNldDsNCisJCS8qIGRvbid0 IGNvcHkgdGhpcyBvZmZzZXQgKi8NCisJCXdyX21hcy0+b2Zmc2V0X2VuZCsrOw0KKwl9IGVsc2Ug aWYgKG1hcy0+bGFzdCA8IHdyX21hcy0+cl9tYXgpIHsNCisJCS8qIG5ldyByYW5nZSBlbmRzIGlu IHRoaXMgcmFuZ2UgKi8NCisJCWlmICh1bmxpa2VseSh3cl9tYXMtPnJfbWF4ID09IFVMT05HX01B WCkpDQorCQkJbWFzX2J1bGtfcmViYWxhbmNlKG1hcywgd3JfbWFzLT5ub2RlX2VuZCwgd3JfbWFz LT50eXBlKTsNCisNCisJCW5ld19lbmQrKzsNCisJfSBlbHNlIHsNCisJCWlmICh3cl9tYXMtPmVu ZF9waXYgPT0gbWFzLT5sYXN0KQ0KKwkJCXdyX21hcy0+b2Zmc2V0X2VuZCsrOw0KKw0KKwkJbmV3 X2VuZCAtPSB3cl9tYXMtPm9mZnNldF9lbmQgLSBvZmZzZXQgLSAxOw0KKwl9DQorDQorCS8qIG5l dyByYW5nZSBzdGFydHMgd2l0aGluIGEgcmFuZ2UgKi8NCisJaWYgKHdyX21hcy0+cl9taW4gPCBt YXMtPmluZGV4KQ0KKwkJbmV3X2VuZCsrOw0KKw0KKwkvKiBOb3QgZW5vdWdoIHJvb20gKi8NCisJ aWYgKG5ld19lbmQgPj0gbm9kZV9zbG90cykNCisJCXJldHVybiBmYWxzZTsNCisNCisJLyogTm90 IGVub3VnaCBkYXRhLiAqLw0KKwlpZiAoIW10ZV9pc19yb290KG1hcy0+bm9kZSkgJiYgKG5ld19l bmQgPD0gbXRfbWluX3Nsb3RzW3dyX21hcy0+dHlwZV0pICYmDQorCSAgICAhKG1hcy0+bWFzX2Zs YWdzICYgTUFfU1RBVEVfQlVMSykpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCS8qIHNldCB1cCBu b2RlLiAqLw0KKwlpZiAoaW5fcmN1KSB7DQorCQltYXNfbm9kZV9jb3VudChtYXMsIDEpOw0KKwkJ aWYgKG1hc19pc19lcnIobWFzKSkNCisJCQlyZXR1cm4gZmFsc2U7DQorDQorCQluZXdub2RlID0g bWFzX3BvcF9ub2RlKG1hcyk7DQorCX0gZWxzZSB7DQorCQltZW1zZXQoJnJldXNlLCAwLCBzaXpl b2Yoc3RydWN0IG1hcGxlX25vZGUpKTsNCisJCW5ld25vZGUgPSAmcmV1c2U7DQorCX0NCisNCisJ bmV3bm9kZS0+cGFyZW50ID0gbWFzX21uKG1hcyktPnBhcmVudDsNCisJZHN0X3Bpdm90cyA9IG1h X3Bpdm90cyhuZXdub2RlLCB3cl9tYXMtPnR5cGUpOw0KKwlkc3Rfc2xvdHMgPSBtYV9zbG90cyhu ZXdub2RlLCB3cl9tYXMtPnR5cGUpOw0KKwkvKiBDb3B5IGZyb20gc3RhcnQgdG8gaW5zZXJ0IHBv aW50ICovDQorCW1lbWNweShkc3RfcGl2b3RzLCB3cl9tYXMtPnBpdm90cywgc2l6ZW9mKHVuc2ln bmVkIGxvbmcpICogKG9mZnNldCArIDEpKTsNCisJbWVtY3B5KGRzdF9zbG90cywgd3JfbWFzLT5z bG90cywgc2l6ZW9mKHZvaWQgKikgKiAob2Zmc2V0ICsgMSkpOw0KKwlkc3Rfb2Zmc2V0ID0gb2Zm c2V0Ow0KKw0KKwkvKiBIYW5kbGUgaW5zZXJ0IG9mIG5ldyByYW5nZSBzdGFydGluZyBhZnRlciBv bGQgcmFuZ2UgKi8NCisJaWYgKHdyX21hcy0+cl9taW4gPCBtYXMtPmluZGV4KSB7DQorCQltYXMt Pm9mZnNldCsrOw0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGRzdF9zbG90c1tkc3Rfb2Zmc2V0XSwg d3JfbWFzLT5jb250ZW50KTsNCisJCWRzdF9waXZvdHNbZHN0X29mZnNldCsrXSA9IG1hcy0+aW5k ZXggLSAxOw0KKwl9DQorDQorCS8qIFN0b3JlIHRoZSBuZXcgZW50cnkgYW5kIHJhbmdlIGVuZC4g Ki8NCisJaWYgKGRzdF9vZmZzZXQgPCBtYXhfcGl2KQ0KKwkJZHN0X3Bpdm90c1tkc3Rfb2Zmc2V0 XSA9IG1hcy0+bGFzdDsNCisJbWFzLT5vZmZzZXQgPSBkc3Rfb2Zmc2V0Ow0KKwlyY3VfYXNzaWdu X3BvaW50ZXIoZHN0X3Nsb3RzW2RzdF9vZmZzZXRdLCB3cl9tYXMtPmVudHJ5KTsNCisNCisJLyoN CisJICogdGhpcyByYW5nZSB3cm90ZSB0byB0aGUgZW5kIG9mIHRoZSBub2RlIG9yIGl0IG92ZXJ3 cm90ZSB0aGUgcmVzdCBvZg0KKwkgKiB0aGUgZGF0YQ0KKwkgKi8NCisJaWYgKHdyX21hcy0+b2Zm c2V0X2VuZCA+IHdyX21hcy0+bm9kZV9lbmQgfHwgbWFzLT5sYXN0ID49IG1hcy0+bWF4KSB7DQor CQluZXdfZW5kID0gZHN0X29mZnNldDsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwlkc3Rfb2Zm c2V0Kys7DQorCS8qIENvcHkgdG8gdGhlIGVuZCBvZiBub2RlIGlmIG5lY2Vzc2FyeS4gKi8NCisJ Y29weV9zaXplID0gd3JfbWFzLT5ub2RlX2VuZCAtIHdyX21hcy0+b2Zmc2V0X2VuZCArIDE7DQor CW1lbWNweShkc3Rfc2xvdHMgKyBkc3Rfb2Zmc2V0LCB3cl9tYXMtPnNsb3RzICsgd3JfbWFzLT5v ZmZzZXRfZW5kLA0KKwkgICAgICAgc2l6ZW9mKHZvaWQgKikgKiBjb3B5X3NpemUpOw0KKwlpZiAo ZHN0X29mZnNldCA8IG1heF9waXYpIHsNCisJCWlmIChjb3B5X3NpemUgPiBtYXhfcGl2IC0gZHN0 X29mZnNldCkNCisJCQljb3B5X3NpemUgPSBtYXhfcGl2IC0gZHN0X29mZnNldDsNCisNCisJCW1l bWNweShkc3RfcGl2b3RzICsgZHN0X29mZnNldCwNCisJCSAgICAgICB3cl9tYXMtPnBpdm90cyAr IHdyX21hcy0+b2Zmc2V0X2VuZCwNCisJCSAgICAgICBzaXplb2YodW5zaWduZWQgbG9uZykgKiBj b3B5X3NpemUpOw0KKwl9DQorDQorCWlmICgod3JfbWFzLT5ub2RlX2VuZCA9PSBub2RlX3Nsb3Rz IC0gMSkgJiYgKG5ld19lbmQgPCBub2RlX3Nsb3RzIC0gMSkpDQorCQlkc3RfcGl2b3RzW25ld19l bmRdID0gbWFzLT5tYXg7DQorDQorZG9uZToNCisJbWFzX2xlYWZfc2V0X21ldGEobWFzLCBuZXdu b2RlLCBkc3RfcGl2b3RzLCBtYXBsZV9sZWFmXzY0LCBuZXdfZW5kKTsNCisJaWYgKGluX3JjdSkg ew0KKwkJbWFzLT5ub2RlID0gbXRfbWtfbm9kZShuZXdub2RlLCB3cl9tYXMtPnR5cGUpOw0KKwkJ bWFzX3JlcGxhY2UobWFzLCBmYWxzZSk7DQorCX0gZWxzZSB7DQorCQltZW1jcHkod3JfbWFzLT5u b2RlLCBuZXdub2RlLCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUpKTsNCisJfQ0KKwl0cmFjZV9t YV93cml0ZShfX2Z1bmNfXywgbWFzLCAwLCB3cl9tYXMtPmVudHJ5KTsNCisJbWFzX3VwZGF0ZV9n YXAobWFzKTsNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qDQorICogbWFzX3dyX3Nsb3Rfc3Rv cmU6IEF0dGVtcHQgdG8gc3RvcmUgYSB2YWx1ZSBpbiBhIHNsb3QuDQorICogQHdyX21hczogdGhl IG1hcGxlIHdyaXRlIHN0YXRlDQorICoNCisgKiBSZXR1cm46IFRydWUgaWYgc3RvcmVkLCBmYWxz ZSBvdGhlcndpc2UNCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3dyX3Nsb3Rfc3RvcmUo c3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm1hcyA9 IHdyX21hcy0+bWFzOw0KKwl1bnNpZ25lZCBsb25nIGxtYXg7IC8qIExvZ2ljYWwgbWF4LiAqLw0K Kwl1bnNpZ25lZCBjaGFyIG9mZnNldCA9IG1hcy0+b2Zmc2V0Ow0KKw0KKwlpZiAoKHdyX21hcy0+ cl9tYXggPiBtYXMtPmxhc3QpICYmICgod3JfbWFzLT5yX21pbiAhPSBtYXMtPmluZGV4KSB8fA0K KwkJCQkgIChvZmZzZXQgIT0gd3JfbWFzLT5ub2RlX2VuZCkpKQ0KKwkJcmV0dXJuIGZhbHNlOw0K Kw0KKwlpZiAob2Zmc2V0ID09IHdyX21hcy0+bm9kZV9lbmQgLSAxKQ0KKwkJbG1heCA9IG1hcy0+ bWF4Ow0KKwllbHNlDQorCQlsbWF4ID0gd3JfbWFzLT5waXZvdHNbb2Zmc2V0ICsgMV07DQorDQor CS8qIGdvaW5nIHRvIG92ZXJ3cml0ZSB0b28gbWFueSBzbG90cy4gKi8NCisJaWYgKGxtYXggPCBt YXMtPmxhc3QpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCWlmICh3cl9tYXMtPnJfbWluID09IG1h cy0+aW5kZXgpIHsNCisJCS8qIG92ZXJ3cml0aW5nIHR3byBvciBtb3JlIHJhbmdlcyB3aXRoIG9u ZS4gKi8NCisJCWlmIChsbWF4ID09IG1hcy0+bGFzdCkNCisJCQlyZXR1cm4gZmFsc2U7DQorDQor CQkvKiBPdmVyd3JpdGluZyBhbGwgb2Ygb2Zmc2V0IGFuZCBhIHBvcnRpb24gb2Ygb2Zmc2V0ICsg MS4gKi8NCisJCXJjdV9hc3NpZ25fcG9pbnRlcih3cl9tYXMtPnNsb3RzW29mZnNldF0sIHdyX21h cy0+ZW50cnkpOw0KKwkJd3JfbWFzLT5waXZvdHNbb2Zmc2V0XSA9IG1hcy0+bGFzdDsNCisJCWdv dG8gZG9uZTsNCisJfQ0KKw0KKwkvKiBEb2Vzbid0IGVuZCBvbiB0aGUgbmV4dCByYW5nZSBlbmQu ICovDQorCWlmIChsbWF4ICE9IG1hcy0+bGFzdCkNCisJCXJldHVybiBmYWxzZTsNCisNCisJLyog T3ZlcndyaXRpbmcgYSBwb3J0aW9uIG9mIG9mZnNldCBhbmQgYWxsIG9mIG9mZnNldCArIDEgKi8N CisJaWYgKChvZmZzZXQgKyAxIDwgbXRfcGl2b3RzW3dyX21hcy0+dHlwZV0pICYmDQorCSAgICAo d3JfbWFzLT5lbnRyeSB8fCB3cl9tYXMtPnBpdm90c1tvZmZzZXQgKyAxXSkpDQorCQl3cl9tYXMt PnBpdm90c1tvZmZzZXQgKyAxXSA9IG1hcy0+bGFzdDsNCisNCisJcmN1X2Fzc2lnbl9wb2ludGVy KHdyX21hcy0+c2xvdHNbb2Zmc2V0ICsgMV0sIHdyX21hcy0+ZW50cnkpOw0KKwl3cl9tYXMtPnBp dm90c1tvZmZzZXRdID0gbWFzLT5pbmRleCAtIDE7DQorCW1hcy0+b2Zmc2V0Kys7IC8qIEtlZXAg bWFzIGFjY3VyYXRlLiAqLw0KKw0KK2RvbmU6DQorCXRyYWNlX21hX3dyaXRlKF9fZnVuY19fLCBt YXMsIDAsIHdyX21hcy0+ZW50cnkpOw0KKwltYXNfdXBkYXRlX2dhcChtYXMpOw0KKwlyZXR1cm4g dHJ1ZTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG1hc193cl9lbmRfcGl2KHN0cnVjdCBt YV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJd2hpbGUgKCh3cl9tYXMtPm1hcy0+bGFzdCA+IHdy X21hcy0+ZW5kX3BpdikgJiYNCisJICAgICAgICh3cl9tYXMtPm9mZnNldF9lbmQgPCB3cl9tYXMt Pm5vZGVfZW5kKSkNCisJCXdyX21hcy0+ZW5kX3BpdiA9IHdyX21hcy0+cGl2b3RzWysrd3JfbWFz LT5vZmZzZXRfZW5kXTsNCisNCisJaWYgKHdyX21hcy0+bWFzLT5sYXN0ID4gd3JfbWFzLT5lbmRf cGl2KQ0KKwkJd3JfbWFzLT5lbmRfcGl2ID0gd3JfbWFzLT5tYXMtPm1heDsNCit9DQorDQorc3Rh dGljIGlubGluZSB2b2lkIG1hc193cl9leHRlbmRfbnVsbChzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndy X21hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQorDQorCWlm IChtYXMtPmxhc3QgPCB3cl9tYXMtPmVuZF9waXYgJiYgIXdyX21hcy0+c2xvdHNbd3JfbWFzLT5v ZmZzZXRfZW5kXSkNCisJCW1hcy0+bGFzdCA9IHdyX21hcy0+ZW5kX3BpdjsNCisNCisJLyogQ2hl Y2sgbmV4dCBzbG90KHMpIGlmIHdlIGFyZSBvdmVyd3JpdGluZyB0aGUgZW5kICovDQorCWlmICgo bWFzLT5sYXN0ID09IHdyX21hcy0+ZW5kX3BpdikgJiYNCisJICAgICh3cl9tYXMtPm5vZGVfZW5k ICE9IHdyX21hcy0+b2Zmc2V0X2VuZCkgJiYNCisJICAgICF3cl9tYXMtPnNsb3RzW3dyX21hcy0+ b2Zmc2V0X2VuZCArIDFdKSB7DQorCQl3cl9tYXMtPm9mZnNldF9lbmQrKzsNCisJCWlmICh3cl9t YXMtPm9mZnNldF9lbmQgPT0gd3JfbWFzLT5ub2RlX2VuZCkNCisJCQltYXMtPmxhc3QgPSBtYXMt Pm1heDsNCisJCWVsc2UNCisJCQltYXMtPmxhc3QgPSB3cl9tYXMtPnBpdm90c1t3cl9tYXMtPm9m ZnNldF9lbmRdOw0KKwkJd3JfbWFzLT5lbmRfcGl2ID0gbWFzLT5sYXN0Ow0KKwl9DQorDQorCWlm ICghd3JfbWFzLT5jb250ZW50KSB7DQorCQkvKiBJZiB0aGlzIG9uZSBpcyBudWxsLCB0aGUgbmV4 dCBhbmQgcHJldiBhcmUgbm90ICovDQorCQltYXMtPmluZGV4ID0gd3JfbWFzLT5yX21pbjsNCisJ fSBlbHNlIHsNCisJCS8qIENoZWNrIHByZXYgc2xvdCBpZiB3ZSBhcmUgb3ZlcndyaXRpbmcgdGhl IHN0YXJ0ICovDQorCQlpZiAobWFzLT5pbmRleCA9PSB3cl9tYXMtPnJfbWluICYmIG1hcy0+b2Zm c2V0ICYmDQorCQkgICAgIXdyX21hcy0+c2xvdHNbbWFzLT5vZmZzZXQgLSAxXSkgew0KKwkJCW1h cy0+b2Zmc2V0LS07DQorCQkJd3JfbWFzLT5yX21pbiA9IG1hcy0+aW5kZXggPQ0KKwkJCQltYXNf c2FmZV9taW4obWFzLCB3cl9tYXMtPnBpdm90cywgbWFzLT5vZmZzZXQpOw0KKwkJCXdyX21hcy0+ cl9tYXggPSB3cl9tYXMtPnBpdm90c1ttYXMtPm9mZnNldF07DQorCQl9DQorCX0NCit9DQorDQor c3RhdGljIGlubGluZSBib29sIG1hc193cl9hcHBlbmQoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9t YXMpDQorew0KKwl1bnNpZ25lZCBjaGFyIGVuZCA9IHdyX21hcy0+bm9kZV9lbmQ7DQorCXVuc2ln bmVkIGNoYXIgbmV3X2VuZCA9IGVuZCArIDE7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3Jf bWFzLT5tYXM7DQorCXVuc2lnbmVkIGNoYXIgbm9kZV9waXZvdHMgPSBtdF9waXZvdHNbd3JfbWFz LT50eXBlXTsNCisNCisJaWYgKChtYXMtPmluZGV4ICE9IHdyX21hcy0+cl9taW4pICYmIChtYXMt Pmxhc3QgPT0gd3JfbWFzLT5yX21heCkpIHsNCisJCWlmIChuZXdfZW5kIDwgbm9kZV9waXZvdHMp DQorCQkJd3JfbWFzLT5waXZvdHNbbmV3X2VuZF0gPSB3cl9tYXMtPnBpdm90c1tlbmRdOw0KKw0K KwkJaWYgKG5ld19lbmQgPCBub2RlX3Bpdm90cykNCisJCQltYV9zZXRfbWV0YSh3cl9tYXMtPm5v ZGUsIG1hcGxlX2xlYWZfNjQsIDAsIG5ld19lbmQpOw0KKw0KKwkJcmN1X2Fzc2lnbl9wb2ludGVy KHdyX21hcy0+c2xvdHNbbmV3X2VuZF0sIHdyX21hcy0+ZW50cnkpOw0KKwkJbWFzLT5vZmZzZXQg PSBuZXdfZW5kOw0KKwkJd3JfbWFzLT5waXZvdHNbZW5kXSA9IG1hcy0+aW5kZXggLSAxOw0KKw0K KwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJaWYgKChtYXMtPmluZGV4ID09IHdyX21hcy0+cl9t aW4pICYmIChtYXMtPmxhc3QgPCB3cl9tYXMtPnJfbWF4KSkgew0KKwkJaWYgKG5ld19lbmQgPCBu b2RlX3Bpdm90cykNCisJCQl3cl9tYXMtPnBpdm90c1tuZXdfZW5kXSA9IHdyX21hcy0+cGl2b3Rz W2VuZF07DQorDQorCQlyY3VfYXNzaWduX3BvaW50ZXIod3JfbWFzLT5zbG90c1tuZXdfZW5kXSwg d3JfbWFzLT5jb250ZW50KTsNCisJCWlmIChuZXdfZW5kIDwgbm9kZV9waXZvdHMpDQorCQkJbWFf c2V0X21ldGEod3JfbWFzLT5ub2RlLCBtYXBsZV9sZWFmXzY0LCAwLCBuZXdfZW5kKTsNCisNCisJ CXdyX21hcy0+cGl2b3RzW2VuZF0gPSBtYXMtPmxhc3Q7DQorCQlyY3VfYXNzaWduX3BvaW50ZXIo d3JfbWFzLT5zbG90c1tlbmRdLCB3cl9tYXMtPmVudHJ5KTsNCisJCXJldHVybiB0cnVlOw0KKwl9 DQorDQorCXJldHVybiBmYWxzZTsNCit9DQorDQorLyoNCisgKiBtYXNfd3JfYm5vZGUoKSAtIFNs b3cgcGF0aCBmb3IgYSBtb2RpZmljYXRpb24uDQorICogQHdyX21hczogVGhlIHdyaXRlIG1hcGxl IHN0YXRlDQorICoNCisgKiBUaGlzIGlzIHdoZXJlIHNwbGl0LCByZWJhbGFuY2UgZW5kIHVwLg0K KyAqLw0KK3N0YXRpYyB2b2lkIG1hc193cl9ibm9kZShzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21h cykNCit7DQorCXN0cnVjdCBtYXBsZV9iaWdfbm9kZSBiX25vZGU7DQorDQorCXRyYWNlX21hX3dy aXRlKF9fZnVuY19fLCB3cl9tYXMtPm1hcywgMCwgd3JfbWFzLT5lbnRyeSk7DQorCW1lbXNldCgm Yl9ub2RlLCAwLCBzaXplb2Yoc3RydWN0IG1hcGxlX2JpZ19ub2RlKSk7DQorCW1hc19zdG9yZV9i X25vZGUod3JfbWFzLCAmYl9ub2RlLCB3cl9tYXMtPm9mZnNldF9lbmQpOw0KKwltYXNfY29tbWl0 X2Jfbm9kZSh3cl9tYXMsICZiX25vZGUsIHdyX21hcy0+bm9kZV9lbmQpOw0KK30NCisNCitzdGF0 aWMgaW5saW5lIHZvaWQgbWFzX3dyX21vZGlmeShzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykN Cit7DQorCXVuc2lnbmVkIGNoYXIgbm9kZV9zbG90czsNCisJdW5zaWduZWQgY2hhciBub2RlX3Np emU7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQorDQorCS8qIERpcmVj dCByZXBsYWNlbWVudCAqLw0KKwlpZiAod3JfbWFzLT5yX21pbiA9PSBtYXMtPmluZGV4ICYmIHdy X21hcy0+cl9tYXggPT0gbWFzLT5sYXN0KSB7DQorCQlyY3VfYXNzaWduX3BvaW50ZXIod3JfbWFz LT5zbG90c1ttYXMtPm9mZnNldF0sIHdyX21hcy0+ZW50cnkpOw0KKwkJaWYgKCEhd3JfbWFzLT5l bnRyeSBeICEhd3JfbWFzLT5jb250ZW50KQ0KKwkJCW1hc191cGRhdGVfZ2FwKG1hcyk7DQorCQly ZXR1cm47DQorCX0NCisNCisJLyogQXR0ZW1wdCB0byBhcHBlbmQgKi8NCisJbm9kZV9zbG90cyA9 IG10X3Nsb3RzW3dyX21hcy0+dHlwZV07DQorCW5vZGVfc2l6ZSA9IHdyX21hcy0+bm9kZV9lbmQg LSB3cl9tYXMtPm9mZnNldF9lbmQgKyBtYXMtPm9mZnNldCArIDI7DQorCWlmIChtYXMtPm1heCA9 PSBVTE9OR19NQVgpDQorCQlub2RlX3NpemUrKzsNCisNCisJLyogc2xvdCBhbmQgbm9kZSBzdG9y ZSB3aWxsIG5vdCBmaXQsIGdvIHRvIHRoZSBzbG93IHBhdGggKi8NCisJaWYgKHVubGlrZWx5KG5v ZGVfc2l6ZSA+PSBub2RlX3Nsb3RzKSkNCisJCWdvdG8gc2xvd19wYXRoOw0KKw0KKwlpZiAod3Jf bWFzLT5lbnRyeSAmJiAod3JfbWFzLT5ub2RlX2VuZCA8IG5vZGVfc2xvdHMgLSAxKSAmJg0KKwkg ICAgKG1hcy0+b2Zmc2V0ID09IHdyX21hcy0+bm9kZV9lbmQpICYmIG1hc193cl9hcHBlbmQod3Jf bWFzKSkgew0KKwkJaWYgKCF3cl9tYXMtPmNvbnRlbnQgfHwgIXdyX21hcy0+ZW50cnkpDQorCQkJ bWFzX3VwZGF0ZV9nYXAobWFzKTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwlpZiAoKHdyX21hcy0+ b2Zmc2V0X2VuZCAtIG1hcy0+b2Zmc2V0IDw9IDEpICYmIG1hc193cl9zbG90X3N0b3JlKHdyX21h cykpDQorCQlyZXR1cm47DQorCWVsc2UgaWYgKG1hc193cl9ub2RlX3N0b3JlKHdyX21hcykpDQor CQlyZXR1cm47DQorDQorCWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm47DQorDQorc2xv d19wYXRoOg0KKwltYXNfd3JfYm5vZGUod3JfbWFzKTsNCit9DQorDQorLyoNCisgKiBtYXNfd3Jf c3RvcmVfZW50cnkoKSAtIEludGVybmFsIGNhbGwgdG8gc3RvcmUgYSB2YWx1ZQ0KKyAqIEBtYXM6 IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlLg0KKyAqDQor ICogUmV0dXJuOiBUaGUgY29udGVudHMgdGhhdCB3YXMgc3RvcmVkIGF0IHRoZSBpbmRleC4NCisg Ki8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc193cl9zdG9yZV9lbnRyeShzdHJ1Y3QgbWFfd3Jf c3RhdGUgKndyX21hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7 DQorDQorCXdyX21hcy0+Y29udGVudCA9IG1hc19zdGFydChtYXMpOw0KKwlpZiAobWFzX2lzX25v bmUobWFzKSB8fCBtYXNfaXNfcHRyKG1hcykpIHsNCisJCW1hc19zdG9yZV9yb290KG1hcywgd3Jf bWFzLT5lbnRyeSk7DQorCQlyZXR1cm4gd3JfbWFzLT5jb250ZW50Ow0KKwl9DQorDQorCWlmICh1 bmxpa2VseSghbWFzX3dyX3dhbGsod3JfbWFzKSkpIHsNCisJCW1hc193cl9zcGFubmluZ19zdG9y ZSh3cl9tYXMpOw0KKwkJcmV0dXJuIHdyX21hcy0+Y29udGVudDsNCisJfQ0KKw0KKwkvKiBBdCB0 aGlzIHBvaW50LCB3ZSBhcmUgYXQgdGhlIGxlYWYgbm9kZSB0aGF0IG5lZWRzIHRvIGJlIGFsdGVy ZWQuICovDQorCXdyX21hcy0+ZW5kX3BpdiA9IHdyX21hcy0+cl9tYXg7DQorCW1hc193cl9lbmRf cGl2KHdyX21hcyk7DQorDQorCWlmICghd3JfbWFzLT5lbnRyeSkNCisJCW1hc193cl9leHRlbmRf bnVsbCh3cl9tYXMpOw0KKw0KKwkvKiBOZXcgcm9vdCBmb3IgYSBzaW5nbGUgcG9pbnRlciAqLw0K KwlpZiAodW5saWtlbHkoIW1hcy0+aW5kZXggJiYgbWFzLT5sYXN0ID09IFVMT05HX01BWCkpIHsN CisJCW1hc19uZXdfcm9vdChtYXMsIHdyX21hcy0+ZW50cnkpOw0KKwkJcmV0dXJuIHdyX21hcy0+ Y29udGVudDsNCisJfQ0KKw0KKwltYXNfd3JfbW9kaWZ5KHdyX21hcyk7DQorCXJldHVybiB3cl9t YXMtPmNvbnRlbnQ7DQorfQ0KKw0KKy8qKg0KKyAqIG1hc19pbnNlcnQoKSAtIEludGVybmFsIGNh bGwgdG8gaW5zZXJ0IGEgdmFsdWUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZW50 cnk6IFRoZSBlbnRyeSB0byBzdG9yZQ0KKyAqDQorICogUmV0dXJuOiAlTlVMTCBvciB0aGUgY29u dGVudHMgdGhhdCBhbHJlYWR5IGV4aXN0cyBhdCB0aGUgcmVxdWVzdGVkIGluZGV4DQorICogb3Ro ZXJ3aXNlLiAgVGhlIG1hcGxlIHN0YXRlIG5lZWRzIHRvIGJlIGNoZWNrZWQgZm9yIGVycm9yIGNv bmRpdGlvbnMuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkICptYXNfaW5zZXJ0KHN0cnVjdCBt YV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSkNCit7DQorCU1BX1dSX1NUQVRFKHdyX21hcywgbWFz LCBlbnRyeSk7DQorDQorCS8qDQorCSAqIEluc2VydGluZyBhIG5ldyByYW5nZSBpbnNlcnRzIGVp dGhlciAwLCAxLCBvciAyIHBpdm90cyB3aXRoaW4gdGhlDQorCSAqIHRyZWUuICBJZiB0aGUgaW5z ZXJ0IGZpdHMgZXhhY3RseSBpbnRvIGFuIGV4aXN0aW5nIGdhcCB3aXRoIGEgdmFsdWUNCisJICog b2YgTlVMTCwgdGhlbiB0aGUgc2xvdCBvbmx5IG5lZWRzIHRvIGJlIHdyaXR0ZW4gd2l0aCB0aGUg bmV3IHZhbHVlLg0KKwkgKiBJZiB0aGUgcmFuZ2UgYmVpbmcgaW5zZXJ0ZWQgaXMgYWRqYWNlbnQg dG8gYW5vdGhlciByYW5nZSwgdGhlbiBvbmx5IGENCisJICogc2luZ2xlIHBpdm90IG5lZWRzIHRv IGJlIGluc2VydGVkIChhcyB3ZWxsIGFzIHdyaXRpbmcgdGhlIGVudHJ5KS4gIElmDQorCSAqIHRo ZSBuZXcgcmFuZ2UgaXMgd2l0aGluIGEgZ2FwIGJ1dCBkb2VzIG5vdCB0b3VjaCBhbnkgb3RoZXIg cmFuZ2VzLA0KKwkgKiB0aGVuIHR3byBwaXZvdHMgbmVlZCB0byBiZSBpbnNlcnRlZDogdGhlIHN0 YXJ0IC0gMSwgYW5kIHRoZSBlbmQuICBBcw0KKwkgKiB1c3VhbCwgdGhlIGVudHJ5IG11c3QgYmUg d3JpdHRlbi4gIE1vc3Qgb3BlcmF0aW9ucyByZXF1aXJlIGEgbmV3IG5vZGUNCisJICogdG8gYmUg YWxsb2NhdGVkIGFuZCByZXBsYWNlIGFuIGV4aXN0aW5nIG5vZGUgdG8gZW5zdXJlIFJDVSBzYWZl dHksDQorCSAqIHdoZW4gaW4gUkNVIG1vZGUuICBUaGUgZXhjZXB0aW9uIHRvIHJlcXVpcmluZyBh IG5ld2x5IGFsbG9jYXRlZCBub2RlDQorCSAqIGlzIHdoZW4gaW5zZXJ0aW5nIGF0IHRoZSBlbmQg b2YgYSBub2RlIChhcHBlbmRpbmcpLiAgV2hlbiBkb25lDQorCSAqIGNhcmVmdWxseSwgYXBwZW5k aW5nIGNhbiByZXVzZSB0aGUgbm9kZSBpbiBwbGFjZS4NCisJICovDQorCXdyX21hcy5jb250ZW50 ID0gbWFzX3N0YXJ0KG1hcyk7DQorCWlmICh3cl9tYXMuY29udGVudCkNCisJCWdvdG8gZXhpc3Rz Ow0KKw0KKwlpZiAobWFzX2lzX25vbmUobWFzKSB8fCBtYXNfaXNfcHRyKG1hcykpIHsNCisJCW1h c19zdG9yZV9yb290KG1hcywgZW50cnkpOw0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJLyog c3Bhbm5pbmcgd3JpdGVzIGFsd2F5cyBvdmVyd3JpdGUgc29tZXRoaW5nICovDQorCWlmICghbWFz X3dyX3dhbGsoJndyX21hcykpDQorCQlnb3RvIGV4aXN0czsNCisNCisJLyogQXQgdGhpcyBwb2lu dCwgd2UgYXJlIGF0IHRoZSBsZWFmIG5vZGUgdGhhdCBuZWVkcyB0byBiZSBhbHRlcmVkLiAqLw0K Kwl3cl9tYXMub2Zmc2V0X2VuZCA9IG1hcy0+b2Zmc2V0Ow0KKwl3cl9tYXMuZW5kX3BpdiA9IHdy X21hcy5yX21heDsNCisNCisJaWYgKHdyX21hcy5jb250ZW50IHx8IChtYXMtPmxhc3QgPiB3cl9t YXMucl9tYXgpKQ0KKwkJZ290byBleGlzdHM7DQorDQorCWlmICghZW50cnkpDQorCQlyZXR1cm4g TlVMTDsNCisNCisJbWFzX3dyX21vZGlmeSgmd3JfbWFzKTsNCisJcmV0dXJuIHdyX21hcy5jb250 ZW50Ow0KKw0KK2V4aXN0czoNCisJbWFzX3NldF9lcnIobWFzLCAtRUVYSVNUKTsNCisJcmV0dXJu IHdyX21hcy5jb250ZW50Ow0KKw0KK30NCisNCisvKg0KKyAqIG1hc19wcmV2X25vZGUoKSAtIEZp bmQgdGhlIHByZXYgbm9uLW51bGwgZW50cnkgYXQgdGhlIHNhbWUgbGV2ZWwgaW4gdGhlDQorICog dHJlZS4gIFRoZSBwcmV2IHZhbHVlIHdpbGwgYmUgbWFzLT5ub2RlW21hcy0+b2Zmc2V0XSBvciBN QVNfTk9ORS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWluOiBUaGUgbG93ZXIg bGltaXQgdG8gc2VhcmNoDQorICoNCisgKiBUaGUgcHJldiBub2RlIHZhbHVlIHdpbGwgYmUgbWFz LT5ub2RlW21hcy0+b2Zmc2V0XSBvciBNQVNfTk9ORS4NCisgKiBSZXR1cm46IDEgaWYgdGhlIG5v ZGUgaXMgZGVhZCwgMCBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFzX3By ZXZfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4pDQorew0KKwll bnVtIG1hcGxlX3R5cGUgbXQ7DQorCWludCBvZmZzZXQsIGxldmVsOw0KKwl2b2lkIF9fcmN1ICoq c2xvdHM7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUg KmVub2RlOw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorDQorCWlmIChtYXNfaXNfbm9uZSht YXMpKQ0KKwkJcmV0dXJuIDA7DQorDQorCWxldmVsID0gMDsNCisJZG8gew0KKwkJbm9kZSA9IG1h c19tbihtYXMpOw0KKwkJaWYgKG1hX2lzX3Jvb3Qobm9kZSkpDQorCQkJZ290byBub19lbnRyeTsN CisNCisJCS8qIFdhbGsgdXAuICovDQorCQlpZiAodW5saWtlbHkobWFzX2FzY2VuZChtYXMpKSkN CisJCQlyZXR1cm4gMTsNCisJCW9mZnNldCA9IG1hcy0+b2Zmc2V0Ow0KKwkJbGV2ZWwrKzsNCisJ fSB3aGlsZSAoIW9mZnNldCk7DQorDQorCW9mZnNldC0tOw0KKwltdCA9IG10ZV9ub2RlX3R5cGUo bWFzLT5ub2RlKTsNCisJbm9kZSA9IG1hc19tbihtYXMpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5v ZGUsIG10KTsNCisJcGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIG10KTsNCisJbWFzLT5tYXggPSBw aXZvdHNbb2Zmc2V0XTsNCisJaWYgKG9mZnNldCkNCisJCW1hcy0+bWluID0gcGl2b3RzW29mZnNl dCAtIDFdICsgMTsNCisJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQlyZXR1 cm4gMTsNCisNCisJaWYgKG1hcy0+bWF4IDwgbWluKQ0KKwkJZ290byBub19lbnRyeV9taW47DQor DQorCXdoaWxlIChsZXZlbCA+IDEpIHsNCisJCWxldmVsLS07DQorCQllbm9kZSA9IG1hc19zbG90 KG1hcywgc2xvdHMsIG9mZnNldCk7DQorCQlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUp KSkNCisJCQlyZXR1cm4gMTsNCisNCisJCW1hcy0+bm9kZSA9IGVub2RlOw0KKwkJbXQgPSBtdGVf bm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQlub2RlID0gbWFzX21uKG1hcyk7DQorCQlzbG90cyA9 IG1hX3Nsb3RzKG5vZGUsIG10KTsNCisJCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCBtdCk7DQor CQlvZmZzZXQgPSBtYV9kYXRhX2VuZChub2RlLCBtdCwgcGl2b3RzLCBtYXMtPm1heCk7DQorCQlp ZiAob2Zmc2V0KQ0KKwkJCW1hcy0+bWluID0gcGl2b3RzW29mZnNldCAtIDFdICsgMTsNCisNCisJ CWlmIChvZmZzZXQgPCBtdF9waXZvdHNbbXRdKQ0KKwkJCW1hcy0+bWF4ID0gcGl2b3RzW29mZnNl dF07DQorDQorCQlpZiAobWFzLT5tYXggPCBtaW4pDQorCQkJZ290byBub19lbnRyeTsNCisJfQ0K Kw0KKwltYXMtPm5vZGUgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwlpZiAodW5s aWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCXJldHVybiAxOw0KKw0KKwltYXMtPm9mZnNl dCA9IG1hc19kYXRhX2VuZChtYXMpOw0KKwlpZiAodW5saWtlbHkobXRlX2RlYWRfbm9kZShtYXMt Pm5vZGUpKSkNCisJCXJldHVybiAxOw0KKw0KKwlyZXR1cm4gMDsNCisNCitub19lbnRyeV9taW46 DQorCW1hcy0+b2Zmc2V0ID0gb2Zmc2V0Ow0KKwlpZiAob2Zmc2V0KQ0KKwkJbWFzLT5taW4gPSBw aXZvdHNbb2Zmc2V0IC0gMV0gKyAxOw0KK25vX2VudHJ5Og0KKwlpZiAodW5saWtlbHkobWFfZGVh ZF9ub2RlKG5vZGUpKSkNCisJCXJldHVybiAxOw0KKw0KKwltYXMtPm5vZGUgPSBNQVNfTk9ORTsN CisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qDQorICogbWFzX25leHRfbm9kZSgpIC0gR2V0IHRoZSBu ZXh0IG5vZGUgYXQgdGhlIHNhbWUgbGV2ZWwgaW4gdGhlIHRyZWUuDQorICogQG1hczogVGhlIG1h cGxlIHN0YXRlDQorICogQG1heDogVGhlIG1heGltdW0gcGl2b3QgdmFsdWUgdG8gY2hlY2suDQor ICoNCisgKiBUaGUgbmV4dCB2YWx1ZSB3aWxsIGJlIG1hcy0+bm9kZVttYXMtPm9mZnNldF0gb3Ig TUFTX05PTkUuDQorICogUmV0dXJuOiAxIG9uIGRlYWQgbm9kZSwgMCBvdGhlcndpc2UuDQorICov DQorc3RhdGljIGlubGluZSBpbnQgbWFzX25leHRfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywg c3RydWN0IG1hcGxlX25vZGUgKm5vZGUsDQorCQkJCXVuc2lnbmVkIGxvbmcgbWF4KQ0KK3sNCisJ dW5zaWduZWQgbG9uZyBtaW4sIHBpdm90Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXN0 cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGU7DQorCWludCBsZXZlbCA9IDA7DQorCXVuc2lnbmVkIGNo YXIgb2Zmc2V0Ow0KKwllbnVtIG1hcGxlX3R5cGUgbXQ7DQorCXZvaWQgX19yY3UgKipzbG90czsN CisNCisJaWYgKG1hcy0+bWF4ID49IG1heCkNCisJCWdvdG8gbm9fZW50cnk7DQorDQorCWxldmVs ID0gMDsNCisJZG8gew0KKwkJaWYgKG1hX2lzX3Jvb3Qobm9kZSkpDQorCQkJZ290byBub19lbnRy eTsNCisNCisJCW1pbiA9IG1hcy0+bWF4ICsgMTsNCisJCWlmIChtaW4gPiBtYXgpDQorCQkJZ290 byBub19lbnRyeTsNCisNCisJCWlmICh1bmxpa2VseShtYXNfYXNjZW5kKG1hcykpKQ0KKwkJCXJl dHVybiAxOw0KKw0KKwkJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCQlsZXZlbCsrOw0KKwkJbm9k ZSA9IG1hc19tbihtYXMpOw0KKwkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQlw aXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQpOw0KKwl9IHdoaWxlICh1bmxpa2VseShvZmZzZXQg PT0gbWFfZGF0YV9lbmQobm9kZSwgbXQsIHBpdm90cywgbWFzLT5tYXgpKSk7DQorDQorCXNsb3Rz ID0gbWFfc2xvdHMobm9kZSwgbXQpOw0KKwlwaXZvdCA9IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2 b3RzLCArK29mZnNldCwgbXQpOw0KKwl3aGlsZSAodW5saWtlbHkobGV2ZWwgPiAxKSkgew0KKwkJ LyogRGVzY2VuZCwgaWYgbmVjZXNzYXJ5ICovDQorCQllbm9kZSA9IG1hc19zbG90KG1hcywgc2xv dHMsIG9mZnNldCk7DQorCQlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCQly ZXR1cm4gMTsNCisNCisJCW1hcy0+bm9kZSA9IGVub2RlOw0KKwkJbGV2ZWwtLTsNCisJCW5vZGUg PSBtYXNfbW4obWFzKTsNCisJCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwkJc2xv dHMgPSBtYV9zbG90cyhub2RlLCBtdCk7DQorCQlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQp Ow0KKwkJb2Zmc2V0ID0gMDsNCisJCXBpdm90ID0gcGl2b3RzWzBdOw0KKwl9DQorDQorCWVub2Rl ID0gbWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJaWYgKHVubGlrZWx5KG1hX2RlYWRf bm9kZShub2RlKSkpDQorCQlyZXR1cm4gMTsNCisNCisJbWFzLT5ub2RlID0gZW5vZGU7DQorCW1h cy0+bWluID0gbWluOw0KKwltYXMtPm1heCA9IHBpdm90Ow0KKwlyZXR1cm4gMDsNCisNCitub19l bnRyeToNCisJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQlyZXR1cm4gMTsN CisNCisJbWFzLT5ub2RlID0gTUFTX05PTkU7DQorCXJldHVybiAwOw0KK30NCisNCisvKg0KKyAq IG1hc19uZXh0X25lbnRyeSgpIC0gR2V0IHRoZSBuZXh0IG5vZGUgZW50cnkNCisgKiBAbWFzOiBU aGUgbWFwbGUgc3RhdGUNCisgKiBAbWF4OiBUaGUgbWF4aW11bSB2YWx1ZSB0byBjaGVjaw0KKyAq IEAqcmFuZ2Vfc3RhcnQ6IFBvaW50ZXIgdG8gc3RvcmUgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZS4N CisgKg0KKyAqIFNldHMgQG1hcy0+b2Zmc2V0IHRvIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgbm9k ZSBlbnRyeSwgQG1hcy0+bGFzdCB0byB0aGUNCisgKiBwaXZvdCBvZiB0aGUgZW50cnkuDQorICoN CisgKiBSZXR1cm46IFRoZSBuZXh0IGVudHJ5LCAlTlVMTCBvdGhlcndpc2UNCisgKi8NCitzdGF0 aWMgaW5saW5lIHZvaWQgKm1hc19uZXh0X25lbnRyeShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJ ICAgIHN0cnVjdCBtYXBsZV9ub2RlICpub2RlLCB1bnNpZ25lZCBsb25nIG1heCwgZW51bSBtYXBs ZV90eXBlIHR5cGUpDQorew0KKwl1bnNpZ25lZCBjaGFyIGNvdW50Ow0KKwl1bnNpZ25lZCBsb25n IHBpdm90Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXZvaWQgX19yY3UgKipzbG90czsN CisJdm9pZCAqZW50cnk7DQorDQorCWlmIChtYXMtPmxhc3QgPT0gbWFzLT5tYXgpIHsNCisJCW1h cy0+aW5kZXggPSBtYXMtPm1heDsNCisJCXJldHVybiBOVUxMOw0KKwl9DQorDQorCXBpdm90cyA9 IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJc2xvdHMgPSBtYV9zbG90cyhub2RlLCB0eXBlKTsN CisJbWFzLT5pbmRleCA9IG1hc19zYWZlX21pbihtYXMsIHBpdm90cywgbWFzLT5vZmZzZXQpOw0K KwlpZiAobWFfZGVhZF9ub2RlKG5vZGUpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWlmIChtYXMt PmluZGV4ID4gbWF4KQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWNvdW50ID0gbWFfZGF0YV9lbmQo bm9kZSwgdHlwZSwgcGl2b3RzLCBtYXMtPm1heCk7DQorCWlmIChtYXMtPm9mZnNldCA+IGNvdW50 KQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCXdoaWxlIChtYXMtPm9mZnNldCA8IGNvdW50KSB7DQor CQlwaXZvdCA9IHBpdm90c1ttYXMtPm9mZnNldF07DQorCQllbnRyeSA9IG1hc19zbG90KG1hcywg c2xvdHMsIG1hcy0+b2Zmc2V0KTsNCisJCWlmIChtYV9kZWFkX25vZGUobm9kZSkpDQorCQkJcmV0 dXJuIE5VTEw7DQorDQorCQlpZiAoZW50cnkpDQorCQkJZ290byBmb3VuZDsNCisNCisJCWlmIChw aXZvdCA+PSBtYXgpDQorCQkJcmV0dXJuIE5VTEw7DQorDQorCQltYXMtPmluZGV4ID0gcGl2b3Qg KyAxOw0KKwkJbWFzLT5vZmZzZXQrKzsNCisJfQ0KKw0KKwlpZiAobWFzLT5pbmRleCA+IG1hcy0+ bWF4KSB7DQorCQltYXMtPmluZGV4ID0gbWFzLT5sYXN0Ow0KKwkJcmV0dXJuIE5VTEw7DQorCX0N CisNCisJcGl2b3QgPSBtYXNfc2FmZV9waXZvdChtYXMsIHBpdm90cywgbWFzLT5vZmZzZXQsIHR5 cGUpOw0KKwllbnRyeSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG1hcy0+b2Zmc2V0KTsNCisJaWYg KG1hX2RlYWRfbm9kZShub2RlKSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlpZiAoIXBpdm90KQ0K KwkJcmV0dXJuIE5VTEw7DQorDQorCWlmICghZW50cnkpDQorCQlyZXR1cm4gTlVMTDsNCisNCitm b3VuZDoNCisJbWFzLT5sYXN0ID0gcGl2b3Q7DQorCXJldHVybiBlbnRyeTsNCit9DQorDQorc3Rh dGljIGlubGluZSB2b2lkIG1hc19yZXdhbGsoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVk IGxvbmcgaW5kZXgpDQorew0KKw0KK3JldHJ5Og0KKwltYXNfc2V0KG1hcywgaW5kZXgpOw0KKwlt YXNfc3RhdGVfd2FsayhtYXMpOw0KKwlpZiAobWFzX2lzX3N0YXJ0KG1hcykpDQorCQlnb3RvIHJl dHJ5Ow0KKw0KKwlyZXR1cm47DQorDQorfQ0KKw0KKy8qDQorICogbWFzX25leHRfZW50cnkoKSAt IEludGVybmFsIGZ1bmN0aW9uIHRvIGdldCB0aGUgbmV4dCBlbnRyeS4NCisgKiBAbWFzOiBUaGUg bWFwbGUgc3RhdGUNCisgKiBAbGltaXQ6IFRoZSBtYXhpbXVtIHJhbmdlIHN0YXJ0Lg0KKyAqDQor ICogU2V0IHRoZSBAbWFzLT5ub2RlIHRvIHRoZSBuZXh0IGVudHJ5IGFuZCB0aGUgcmFuZ2Vfc3Rh cnQgdG8NCisgKiB0aGUgYmVnaW5uaW5nIHZhbHVlIGZvciB0aGUgZW50cnkuICBEb2VzIG5vdCBj aGVjayBiZXlvbmQgQGxpbWl0Lg0KKyAqIFNldHMgQG1hcy0+aW5kZXggYW5kIEBtYXMtPmxhc3Qg dG8gdGhlIGxpbWl0IGlmIGl0IGlzIGhpdC4NCisgKiBSZXN0YXJ0cyBvbiBkZWFkIG5vZGVzLg0K KyAqDQorICogUmV0dXJuOiB0aGUgbmV4dCBlbnRyeSBvciAlTlVMTC4NCisgKi8NCitzdGF0aWMg aW5saW5lIHZvaWQgKm1hc19uZXh0X2VudHJ5KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25l ZCBsb25nIGxpbWl0KQ0KK3sNCisJdm9pZCAqZW50cnkgPSBOVUxMOw0KKwlzdHJ1Y3QgbWFwbGVf ZW5vZGUgKnByZXZfbm9kZTsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXVuc2lnbmVk IGNoYXIgb2Zmc2V0Ow0KKwl1bnNpZ25lZCBsb25nIGxhc3Q7DQorCWVudW0gbWFwbGVfdHlwZSBt dDsNCisNCisJbGFzdCA9IG1hcy0+bGFzdDsNCityZXRyeToNCisJb2Zmc2V0ID0gbWFzLT5vZmZz ZXQ7DQorCXByZXZfbm9kZSA9IG1hcy0+bm9kZTsNCisJbm9kZSA9IG1hc19tbihtYXMpOw0KKwlt dCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJbWFzLT5vZmZzZXQrKzsNCisJaWYgKHVu bGlrZWx5KG1hcy0+b2Zmc2V0ID49IG10X3Nsb3RzW210XSkpIHsNCisJCW1hcy0+b2Zmc2V0ID0g bXRfc2xvdHNbbXRdIC0gMTsNCisJCWdvdG8gbmV4dF9ub2RlOw0KKwl9DQorDQorCXdoaWxlICgh bWFzX2lzX25vbmUobWFzKSkgew0KKwkJZW50cnkgPSBtYXNfbmV4dF9uZW50cnkobWFzLCBub2Rl LCBsaW1pdCwgbXQpOw0KKwkJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpIHsNCisJ CQltYXNfcmV3YWxrKG1hcywgbGFzdCk7DQorCQkJZ290byByZXRyeTsNCisJCX0NCisNCisJCWlm IChsaWtlbHkoZW50cnkpKQ0KKwkJCXJldHVybiBlbnRyeTsNCisNCisJCWlmICh1bmxpa2VseSgo bWFzLT5pbmRleCA+IGxpbWl0KSkpDQorCQkJYnJlYWs7DQorDQorbmV4dF9ub2RlOg0KKwkJcHJl dl9ub2RlID0gbWFzLT5ub2RlOw0KKwkJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCQlpZiAodW5s aWtlbHkobWFzX25leHRfbm9kZShtYXMsIG5vZGUsIGxpbWl0KSkpIHsNCisJCQltYXNfcmV3YWxr KG1hcywgbGFzdCk7DQorCQkJZ290byByZXRyeTsNCisJCX0NCisJCW1hcy0+b2Zmc2V0ID0gMDsN CisJCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUp Ow0KKwl9DQorDQorCW1hcy0+aW5kZXggPSBtYXMtPmxhc3QgPSBsaW1pdDsNCisJbWFzLT5vZmZz ZXQgPSBvZmZzZXQ7DQorCW1hcy0+bm9kZSA9IHByZXZfbm9kZTsNCisJcmV0dXJuIE5VTEw7DQor fQ0KKw0KKy8qDQorICogbWFzX3ByZXZfbmVudHJ5KCkgLSBHZXQgdGhlIHByZXZpb3VzIG5vZGUg ZW50cnkuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0KKyAqIEBsaW1pdDogVGhlIGxvd2Vy IGxpbWl0IHRvIGNoZWNrIGZvciBhIHZhbHVlLg0KKyAqDQorICogUmV0dXJuOiB0aGUgZW50cnks ICVOVUxMIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19wcmV2X25l bnRyeShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBsaW1pdCwNCisJCQkJICAg IHVuc2lnbmVkIGxvbmcgaW5kZXgpDQorew0KKwl1bnNpZ25lZCBsb25nIHBpdm90LCBtaW47DQor CXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbW47DQorCWVudW0g bWFwbGVfdHlwZSBtdDsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKwl2b2lkIF9fcmN1ICoq c2xvdHM7DQorCXZvaWQgKmVudHJ5Ow0KKw0KK3JldHJ5Og0KKwlpZiAoIW1hcy0+b2Zmc2V0KQ0K KwkJcmV0dXJuIE5VTEw7DQorDQorCW1uID0gbWFzX21uKG1hcyk7DQorCW10ID0gbXRlX25vZGVf dHlwZShtYXMtPm5vZGUpOw0KKwlvZmZzZXQgPSBtYXMtPm9mZnNldCAtIDE7DQorCWlmIChvZmZz ZXQgPj0gbXRfc2xvdHNbbXRdKQ0KKwkJb2Zmc2V0ID0gbXRfc2xvdHNbbXRdIC0gMTsNCisNCisJ c2xvdHMgPSBtYV9zbG90cyhtbiwgbXQpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobW4sIG10KTsN CisJaWYgKG9mZnNldCA9PSBtdF9waXZvdHNbbXRdKQ0KKwkJcGl2b3QgPSBtYXMtPm1heDsNCisJ ZWxzZQ0KKwkJcGl2b3QgPSBwaXZvdHNbb2Zmc2V0XTsNCisNCisJaWYgKHVubGlrZWx5KG1hX2Rl YWRfbm9kZShtbikpKSB7DQorCQltYXNfcmV3YWxrKG1hcywgaW5kZXgpOw0KKwkJZ290byByZXRy eTsNCisJfQ0KKw0KKwl3aGlsZSAob2Zmc2V0ICYmICgoIW1hc19zbG90KG1hcywgc2xvdHMsIG9m ZnNldCkgJiYgcGl2b3QgPj0gbGltaXQpIHx8DQorCSAgICAgICAhcGl2b3QpKQ0KKwkJcGl2b3Qg PSBwaXZvdHNbLS1vZmZzZXRdOw0KKw0KKwltaW4gPSBtYXNfc2FmZV9taW4obWFzLCBwaXZvdHMs IG9mZnNldCk7DQorCWVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJaWYg KHVubGlrZWx5KG1hX2RlYWRfbm9kZShtbikpKSB7DQorCQltYXNfcmV3YWxrKG1hcywgaW5kZXgp Ow0KKwkJZ290byByZXRyeTsNCisJfQ0KKw0KKwlpZiAobGlrZWx5KGVudHJ5KSkgew0KKwkJbWFz LT5vZmZzZXQgPSBvZmZzZXQ7DQorCQltYXMtPmxhc3QgPSBwaXZvdDsNCisJCW1hcy0+aW5kZXgg PSBtaW47DQorCX0NCisJcmV0dXJuIGVudHJ5Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQg Km1hc19wcmV2X2VudHJ5KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbikN Cit7DQorCXZvaWQgKmVudHJ5Ow0KKw0KK3JldHJ5Og0KKwl3aGlsZSAobGlrZWx5KCFtYXNfaXNf bm9uZShtYXMpKSkgew0KKwkJZW50cnkgPSBtYXNfcHJldl9uZW50cnkobWFzLCBtaW4sIG1hcy0+ aW5kZXgpOw0KKwkJaWYgKHVubGlrZWx5KG1hcy0+bGFzdCA8IG1pbikpDQorCQkJZ290byBub3Rf Zm91bmQ7DQorDQorCQlpZiAobGlrZWx5KGVudHJ5KSkNCisJCQlyZXR1cm4gZW50cnk7DQorDQor CQlpZiAodW5saWtlbHkobWFzX3ByZXZfbm9kZShtYXMsIG1pbikpKSB7DQorCQkJbWFzX3Jld2Fs ayhtYXMsIG1hcy0+aW5kZXgpOw0KKwkJCWdvdG8gcmV0cnk7DQorCQl9DQorDQorCQltYXMtPm9m ZnNldCsrOw0KKwl9DQorDQorCW1hcy0+b2Zmc2V0LS07DQorbm90X2ZvdW5kOg0KKwltYXMtPmlu ZGV4ID0gbWFzLT5sYXN0ID0gbWluOw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoNCisgKiBt YXNfcmV2X2F3YWxrKCkgLSBJbnRlcm5hbCBmdW5jdGlvbi4gIFJldmVyc2UgYWxsb2NhdGlvbiB3 YWxrLiAgRmluZCB0aGUNCisgKiBoaWdoZXN0IGdhcCBhZGRyZXNzIG9mIGEgZ2l2ZW4gc2l6ZSBp biBhIGdpdmVuIG5vZGUgYW5kIGRlc2NlbmQuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQor ICogQHNpemU6IFRoZSBuZWVkZWQgc2l6ZS4NCisgKg0KKyAqIFJldHVybjogVHJ1ZSBpZiBmb3Vu ZCBpbiBhIGxlYWYsIGZhbHNlIG90aGVyd2lzZS4NCisgKg0KKyAqLw0KK3N0YXRpYyBib29sIG1h c19yZXZfYXdhbGsoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkNCit7 DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlz dHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSA9IG1hc19tbihtYXMpOw0KKwl1bnNpZ25lZCBsb25nICpw aXZvdHMsICpnYXBzOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCXVuc2lnbmVkIGxvbmcgZ2Fw ID0gMDsNCisJdW5zaWduZWQgbG9uZyBtYXgsIG1pbiwgaW5kZXg7DQorCXVuc2lnbmVkIGNoYXIg b2Zmc2V0Ow0KKw0KKwlpZiAodW5saWtlbHkobWFzX2lzX2VycihtYXMpKSkNCisJCXJldHVybiB0 cnVlOw0KKw0KKwlpZiAobWFfaXNfZGVuc2UodHlwZSkpIHsNCisJCS8qIGRlbnNlIG5vZGVzLiAq Lw0KKwkJbWFzLT5vZmZzZXQgPSAodW5zaWduZWQgY2hhcikobWFzLT5pbmRleCAtIG1hcy0+bWlu KTsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0 eXBlKTsNCisJc2xvdHMgPSBtYV9zbG90cyhub2RlLCB0eXBlKTsNCisJZ2FwcyA9IG1hX2dhcHMo bm9kZSwgdHlwZSk7DQorCW9mZnNldCA9IG1hcy0+b2Zmc2V0Ow0KKwltaW4gPSBtYXNfc2FmZV9t aW4obWFzLCBwaXZvdHMsIG9mZnNldCk7DQorCS8qIFNraXAgb3V0IG9mIGJvdW5kcy4gKi8NCisJ d2hpbGUgKG1hcy0+bGFzdCA8IG1pbikNCisJCW1pbiA9IG1hc19zYWZlX21pbihtYXMsIHBpdm90 cywgLS1vZmZzZXQpOw0KKw0KKwltYXggPSBtYXNfc2FmZV9waXZvdChtYXMsIHBpdm90cywgb2Zm c2V0LCB0eXBlKTsNCisJaW5kZXggPSBtYXMtPmluZGV4Ow0KKwl3aGlsZSAoaW5kZXggPD0gbWF4 KSB7DQorCQlnYXAgPSAwOw0KKwkJaWYgKGdhcHMpDQorCQkJZ2FwID0gZ2Fwc1tvZmZzZXRdOw0K KwkJZWxzZSBpZiAoIW1hc19zbG90KG1hcywgc2xvdHMsIG9mZnNldCkpDQorCQkJZ2FwID0gbWF4 IC0gbWluICsgMTsNCisNCisJCWlmIChnYXApIHsNCisJCQlpZiAoKHNpemUgPD0gZ2FwKSAmJiAo c2l6ZSA8PSBtYXMtPmxhc3QgLSBtaW4gKyAxKSkNCisJCQkJYnJlYWs7DQorDQorCQkJaWYgKCFn YXBzKSB7DQorCQkJCS8qIFNraXAgdGhlIG5leHQgc2xvdCwgaXQgY2Fubm90IGJlIGEgZ2FwLiAq Lw0KKwkJCQlpZiAob2Zmc2V0IDwgMikNCisJCQkJCWdvdG8gYXNjZW5kOw0KKw0KKwkJCQlvZmZz ZXQgLT0gMjsNCisJCQkJbWF4ID0gcGl2b3RzW29mZnNldF07DQorCQkJCW1pbiA9IG1hc19zYWZl X21pbihtYXMsIHBpdm90cywgb2Zmc2V0KTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0K Kw0KKwkJaWYgKCFvZmZzZXQpDQorCQkJZ290byBhc2NlbmQ7DQorDQorCQlvZmZzZXQtLTsNCisJ CW1heCA9IG1pbiAtIDE7DQorCQltaW4gPSBtYXNfc2FmZV9taW4obWFzLCBwaXZvdHMsIG9mZnNl dCk7DQorCX0NCisNCisJaWYgKHVubGlrZWx5KGluZGV4ID4gbWF4KSkgew0KKwkJbWFzX3NldF9l cnIobWFzLCAtRUJVU1kpOw0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCWlmICh1bmxpa2Vs eShtYV9pc19sZWFmKHR5cGUpKSkgew0KKwkJbWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQorCQltYXMt Pm1pbiA9IG1pbjsNCisJCW1hcy0+bWF4ID0gbWluICsgZ2FwIC0gMTsNCisJCXJldHVybiB0cnVl Ow0KKwl9DQorDQorCS8qIGRlc2NlbmQsIG9ubHkgaGFwcGVucyB1bmRlciBsb2NrLiAqLw0KKwlt YXMtPm5vZGUgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwltYXMtPm1pbiA9IG1p bjsNCisJbWFzLT5tYXggPSBtYXg7DQorCW1hcy0+b2Zmc2V0ID0gbWFzX2RhdGFfZW5kKG1hcyk7 DQorCXJldHVybiBmYWxzZTsNCisNCithc2NlbmQ6DQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5v ZGUpKQ0KKwkJbWFzX3NldF9lcnIobWFzLCAtRUJVU1kpOw0KKw0KKwlyZXR1cm4gZmFsc2U7DQor fQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfYW5vZGVfZGVzY2VuZChzdHJ1Y3QgbWFfc3Rh dGUgKm1hcywgdW5zaWduZWQgbG9uZyBzaXplKQ0KK3sNCisJZW51bSBtYXBsZV90eXBlIHR5cGUg PSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCXVuc2lnbmVkIGxvbmcgcGl2b3QsIG1pbiwg Z2FwID0gMDsNCisJdW5zaWduZWQgY2hhciBjb3VudCwgb2Zmc2V0Ow0KKwl1bnNpZ25lZCBsb25n ICpnYXBzID0gTlVMTCwgKnBpdm90cyA9IG1hX3Bpdm90cyhtYXNfbW4obWFzKSwgdHlwZSk7DQor CXZvaWQgX19yY3UgKipzbG90cyA9IG1hX3Nsb3RzKG1hc19tbihtYXMpLCB0eXBlKTsNCisJYm9v bCBmb3VuZCA9IGZhbHNlOw0KKw0KKwlpZiAobWFfaXNfZGVuc2UodHlwZSkpIHsNCisJCW1hcy0+ b2Zmc2V0ID0gKHVuc2lnbmVkIGNoYXIpKG1hcy0+aW5kZXggLSBtYXMtPm1pbik7DQorCQlyZXR1 cm4gdHJ1ZTsNCisJfQ0KKw0KKwlnYXBzID0gbWFfZ2FwcyhtdGVfdG9fbm9kZShtYXMtPm5vZGUp LCB0eXBlKTsNCisJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCWNvdW50ID0gbXRfc2xvdHNbdHlw ZV07DQorCW1pbiA9IG1hc19zYWZlX21pbihtYXMsIHBpdm90cywgb2Zmc2V0KTsNCisJZm9yICg7 IG9mZnNldCA8IGNvdW50OyBvZmZzZXQrKykgew0KKwkJcGl2b3QgPSBtYXNfc2FmZV9waXZvdCht YXMsIHBpdm90cywgb2Zmc2V0LCB0eXBlKTsNCisJCWlmIChvZmZzZXQgJiYgIXBpdm90KQ0KKwkJ CWJyZWFrOw0KKw0KKwkJLyogTm90IHdpdGhpbiBsb3dlciBib3VuZHMgKi8NCisJCWlmIChtYXMt PmluZGV4ID4gcGl2b3QpDQorCQkJZ290byBuZXh0X3Nsb3Q7DQorDQorCQlpZiAoZ2FwcykNCisJ CQlnYXAgPSBnYXBzW29mZnNldF07DQorCQllbHNlIGlmICghbWFzX3Nsb3QobWFzLCBzbG90cywg b2Zmc2V0KSkNCisJCQlnYXAgPSBtaW4ocGl2b3QsIG1hcy0+bGFzdCkgLSBtYXgobWFzLT5pbmRl eCwgbWluKSArIDE7DQorCQllbHNlDQorCQkJZ290byBuZXh0X3Nsb3Q7DQorDQorCQlpZiAoZ2Fw ID49IHNpemUpIHsNCisJCQlpZiAobWFfaXNfbGVhZih0eXBlKSkgew0KKwkJCQlmb3VuZCA9IHRy dWU7DQorCQkJCWdvdG8gZG9uZTsNCisJCQl9DQorCQkJaWYgKG1hcy0+aW5kZXggPD0gcGl2b3Qp IHsNCisJCQkJbWFzLT5ub2RlID0gbWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJCQkJ bWFzLT5taW4gPSBtaW47DQorCQkJCW1hcy0+bWF4ID0gcGl2b3Q7DQorCQkJCW9mZnNldCA9IDA7 DQorCQkJCXR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQkJCWNvdW50ID0gbXRf c2xvdHNbdHlwZV07DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCituZXh0X3Nsb3Q6DQorCQlt aW4gPSBwaXZvdCArIDE7DQorCQlpZiAobWFzLT5sYXN0IDw9IHBpdm90KSB7DQorCQkJbWFzX3Nl dF9lcnIobWFzLCAtRUJVU1kpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwl9DQorDQorCWlm IChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKQ0KKwkJZm91bmQgPSB0cnVlOw0KK2RvbmU6DQorCW1h cy0+b2Zmc2V0ID0gb2Zmc2V0Ow0KKwlyZXR1cm4gZm91bmQ7DQorfQ0KKw0KKy8qKg0KKyAqIG1h c193YWxrKCkgLSBTZWFyY2ggZm9yIEBtYXMtPmluZGV4IGluIHRoZSB0cmVlLg0KKyAqIEBtYXM6 IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIG1hcy0+aW5kZXggYW5kIG1hcy0+bGFzdCB3aWxs IGJlIHNldCB0byB0aGUgcmFuZ2UgaWYgdGhlcmUgaXMgYSB2YWx1ZS4gIElmDQorICogbWFzLT5u b2RlIGlzIE1BU19OT05FLCByZXNldCB0byBNQVNfU1RBUlQuDQorICoNCisgKiBSZXR1cm46IHRo ZSBlbnRyeSBhdCB0aGUgbG9jYXRpb24gb3IgJU5VTEwuDQorICovDQordm9pZCAqbWFzX3dhbGso c3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl2b2lkICplbnRyeTsNCisNCityZXRyeToNCisJ ZW50cnkgPSBtYXNfc3RhdGVfd2FsayhtYXMpOw0KKwlpZiAobWFzX2lzX3N0YXJ0KG1hcykpDQor CQlnb3RvIHJldHJ5Ow0KKw0KKwlpZiAobWFzX2lzX3B0cihtYXMpKSB7DQorCQlpZiAoIW1hcy0+ aW5kZXgpIHsNCisJCQltYXMtPmxhc3QgPSAwOw0KKwkJfSBlbHNlIHsNCisJCQltYXMtPmluZGV4 ID0gMTsNCisJCQltYXMtPmxhc3QgPSBVTE9OR19NQVg7DQorCQl9DQorCQlyZXR1cm4gZW50cnk7 DQorCX0NCisNCisJaWYgKG1hc19pc19ub25lKG1hcykpIHsNCisJCW1hcy0+aW5kZXggPSAwOw0K KwkJbWFzLT5sYXN0ID0gVUxPTkdfTUFYOw0KKwl9DQorDQorCXJldHVybiBlbnRyeTsNCit9DQor DQorc3RhdGljIGlubGluZSBib29sIG1hc19yZXdpbmRfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1h cykNCit7DQorCXVuc2lnbmVkIGNoYXIgc2xvdDsNCisNCisJZG8gew0KKwkJaWYgKG10ZV9pc19y b290KG1hcy0+bm9kZSkpIHsNCisJCQlzbG90ID0gbWFzLT5vZmZzZXQ7DQorCQkJaWYgKCFzbG90 KQ0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQl9IGVsc2Ugew0KKwkJCW1hc19hc2NlbmQobWFzKTsN CisJCQlzbG90ID0gbWFzLT5vZmZzZXQ7DQorCQl9DQorCX0gd2hpbGUgKCFzbG90KTsNCisNCisJ bWFzLT5vZmZzZXQgPSAtLXNsb3Q7DQorCXJldHVybiB0cnVlOw0KK30NCisNCisvKg0KKyAqIG1h c19za2lwX25vZGUoKSAtIEludGVybmFsIGZ1bmN0aW9uLiAgU2tpcCBvdmVyIGEgbm9kZS4NCisg KiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUuDQorICoNCisgKiBSZXR1cm46IHRydWUgaWYgdGhlcmUg aXMgYW5vdGhlciBub2RlLCBmYWxzZSBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBi b29sIG1hc19za2lwX25vZGUoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl1bnNpZ25lZCBj aGFyIHNsb3QsIHNsb3RfY291bnQ7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJZW51bSBt YXBsZV90eXBlIG10Ow0KKw0KKwltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJc2xv dF9jb3VudCA9IG10X3Nsb3RzW210XSAtIDE7DQorCWRvIHsNCisJCWlmIChtdGVfaXNfcm9vdCht YXMtPm5vZGUpKSB7DQorCQkJc2xvdCA9IG1hcy0+b2Zmc2V0Ow0KKwkJCWlmIChzbG90ID4gc2xv dF9jb3VudCkgew0KKwkJCQltYXNfc2V0X2VycihtYXMsIC1FQlVTWSk7DQorCQkJCXJldHVybiBm YWxzZTsNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCW1hc19hc2NlbmQobWFzKTsNCisJCQlzbG90 ID0gbWFzLT5vZmZzZXQ7DQorCQkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQkJ c2xvdF9jb3VudCA9IG10X3Nsb3RzW210XSAtIDE7DQorCQl9DQorCX0gd2hpbGUgKHNsb3QgPiBz bG90X2NvdW50KTsNCisNCisJbWFzLT5vZmZzZXQgPSArK3Nsb3Q7DQorCXBpdm90cyA9IG1hX3Bp dm90cyhtYXNfbW4obWFzKSwgbXQpOw0KKwlpZiAoc2xvdCA+IDApDQorCQltYXMtPm1pbiA9IHBp dm90c1tzbG90IC0gMV0gKyAxOw0KKw0KKwlpZiAoc2xvdCA8PSBzbG90X2NvdW50KQ0KKwkJbWFz LT5tYXggPSBwaXZvdHNbc2xvdF07DQorDQorCXJldHVybiB0cnVlOw0KK30NCisNCisvKg0KKyAq IG1hc19hd2FsaygpIC0gQWxsb2NhdGlvbiB3YWxrLiAgU2VhcmNoIGZyb20gbG93IGFkZHJlc3Mg dG8gaGlnaCwgZm9yIGEgZ2FwIG9mDQorICogQHNpemUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3Rh dGUNCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIGdhcCByZXF1aXJlZA0KKyAqDQorICogU2Vh cmNoIGJldHdlZW4gQG1hcy0+aW5kZXggYW5kIEBtYXMtPmxhc3QgZm9yIGEgZ2FwIG9mIEBzaXpl Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfYXdhbGsoc3RydWN0IG1hX3N0YXRlICpt YXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbGFzdCA9 IE5VTEw7DQorDQorCS8qDQorCSAqIFRoZXJlIGFyZSA0IG9wdGlvbnM6DQorCSAqIGdvIHRvIGNo aWxkIChkZXNjZW5kKQ0KKwkgKiBnbyBiYWNrIHRvIHBhcmVudCAoYXNjZW5kKQ0KKwkgKiBubyBn YXAgZm91bmQuIChyZXR1cm4sIHNsb3QgPT0gTUFQTEVfTk9ERV9TTE9UUykNCisJICogZm91bmQg dGhlIGdhcC4gKHJldHVybiwgc2xvdCAhPSBNQVBMRV9OT0RFX1NMT1RTKQ0KKwkgKi8NCisJd2hp bGUgKCFtYXNfaXNfZXJyKG1hcykgJiYgIW1hc19hbm9kZV9kZXNjZW5kKG1hcywgc2l6ZSkpIHsN CisJCWlmIChsYXN0ID09IG1hcy0+bm9kZSkNCisJCQltYXNfc2tpcF9ub2RlKG1hcyk7DQorCQll bHNlDQorCQkJbGFzdCA9IG1hcy0+bm9kZTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc19maWxs X2dhcCgpIC0gRmlsbCBhIGxvY2F0ZWQgZ2FwIHdpdGggQGVudHJ5Lg0KKyAqIEBtYXM6IFRoZSBt YXBsZSBzdGF0ZQ0KKyAqIEBlbnRyeTogVGhlIHZhbHVlIHRvIHN0b3JlDQorICogQHNsb3Q6IFRo ZSBvZmZzZXQgaW50byB0aGUgbm9kZSB0byBzdG9yZSB0aGUgQGVudHJ5DQorICogQHNpemU6IFRo ZSBzaXplIG9mIHRoZSBlbnRyeQ0KKyAqIEBpbmRleDogVGhlIHN0YXJ0IGxvY2F0aW9uDQorICov DQorc3RhdGljIGlubGluZSB2b2lkIG1hc19maWxsX2dhcChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywg dm9pZCAqZW50cnksDQorCQl1bnNpZ25lZCBjaGFyIHNsb3QsIHVuc2lnbmVkIGxvbmcgc2l6ZSwg dW5zaWduZWQgbG9uZyAqaW5kZXgpDQorew0KKwlNQV9XUl9TVEFURSh3cl9tYXMsIG1hcywgZW50 cnkpOw0KKwl1bnNpZ25lZCBjaGFyIHBzbG90ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7 DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbW4gPSBtYXMtPm5vZGU7DQorCXVuc2lnbmVkIGxvbmcg KnBpdm90czsNCisJZW51bSBtYXBsZV90eXBlIHB0eXBlOw0KKwkvKg0KKwkgKiBtYXMtPmluZGV4 IGlzIHRoZSBzdGFydCBhZGRyZXNzIGZvciB0aGUgc2VhcmNoDQorCSAqICB3aGljaCBtYXkgbm8g bG9uZ2VyIGJlIG5lZWRlZC4NCisJICogbWFzLT5sYXN0IGlzIHRoZSBlbmQgYWRkcmVzcyBmb3Ig dGhlIHNlYXJjaA0KKwkgKi8NCisNCisJKmluZGV4ID0gbWFzLT5pbmRleDsNCisJbWFzLT5sYXN0 ID0gbWFzLT5pbmRleCArIHNpemUgLSAxOw0KKw0KKwkvKg0KKwkgKiBJdCBpcyBwb3NzaWJsZSB0 aGF0IHVzaW5nIG1hcy0+bWF4IGFuZCBtYXMtPm1pbiB0byBjb3JyZWN0bHkNCisJICogY2FsY3Vs YXRlIHRoZSBpbmRleCBhbmQgbGFzdCB3aWxsIGNhdXNlIGFuIGlzc3VlIGluIHRoZSBnYXANCisJ ICogY2FsY3VsYXRpb24sIHNvIGZpeCB0aGUgbWFfc3RhdGUgaGVyZQ0KKwkgKi8NCisJbWFzX2Fz Y2VuZChtYXMpOw0KKwlwdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJcGl2b3Rz ID0gbWFfcGl2b3RzKG1hc19tbihtYXMpLCBwdHlwZSk7DQorCW1hcy0+bWF4ID0gbWFzX3NhZmVf cGl2b3QobWFzLCBwaXZvdHMsIHBzbG90LCBwdHlwZSk7DQorCW1hcy0+bWluID0gbWFzX3NhZmVf bWluKG1hcywgcGl2b3RzLCBwc2xvdCk7DQorCW1hcy0+bm9kZSA9IG1uOw0KKwltYXMtPm9mZnNl dCA9IHNsb3Q7DQorCW1hc193cl9zdG9yZV9lbnRyeSgmd3JfbWFzKTsNCit9DQorDQorLyoNCisg KiBtYXNfc3BhcnNlX2FyZWEoKSAtIEludGVybmFsIGZ1bmN0aW9uLiAgUmV0dXJuIHVwcGVyIG9y IGxvd2VyIGxpbWl0IHdoZW4NCisgKiBzZWFyY2hpbmcgZm9yIGEgZ2FwIGluIGFuIGVtcHR5IHRy ZWUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG1pbjogdGhlIG1pbmltdW0gcmFu Z2UNCisgKiBAbWF4OiBUaGUgbWF4aW11bSByYW5nZQ0KKyAqIEBzaXplOiBUaGUgc2l6ZSBvZiB0 aGUgZ2FwDQorICogQGZ3ZDogU2VhcmNoaW5nIGZvcndhcmQgb3IgYmFjaw0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgdm9pZCBtYXNfc3BhcnNlX2FyZWEoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2ln bmVkIGxvbmcgbWluLA0KKwkJCQl1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgbG9uZyBzaXpl LCBib29sIGZ3ZCkNCit7DQorCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSAwOw0KKw0KKwlpZiAoIXVu bGlrZWx5KG1hc19pc19ub25lKG1hcykpKQ0KKwkJc3RhcnQrKzsNCisJLyogbWFzX2lzX3B0ciAq Lw0KKw0KKwlpZiAoc3RhcnQgPCBtaW4pDQorCQlzdGFydCA9IG1pbjsNCisNCisJaWYgKGZ3ZCkg ew0KKwkJbWFzLT5pbmRleCA9IHN0YXJ0Ow0KKwkJbWFzLT5sYXN0ID0gc3RhcnQgKyBzaXplIC0g MTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwltYXMtPmluZGV4ID0gbWF4Ow0KK30NCisNCisvKg0K KyAqIG1hc19lbXB0eV9hcmVhKCkgLSBHZXQgdGhlIGxvd2VzdCBhZGRyZXNzIHdpdGhpbiB0aGUg cmFuZ2UgdGhhdCBpcw0KKyAqIHN1ZmZpY2llbnQgZm9yIHRoZSBzaXplIHJlcXVlc3RlZC4NCisg KiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWluOiBUaGUgbG93ZXN0IHZhbHVlIG9mIHRo ZSByYW5nZQ0KKyAqIEBtYXg6IFRoZSBoaWdoZXN0IHZhbHVlIG9mIHRoZSByYW5nZQ0KKyAqIEBz aXplOiBUaGUgc2l6ZSBuZWVkZWQNCisgKi8NCitpbnQgbWFzX2VtcHR5X2FyZWEoc3RydWN0IG1h X3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9uZyBtYXgsIHVu c2lnbmVkIGxvbmcgc2l6ZSkNCit7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwl1bnNpZ25l ZCBsb25nICpwaXZvdHM7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisNCisJaWYgKG1hc19pc19z dGFydChtYXMpKQ0KKwkJbWFzX3N0YXJ0KG1hcyk7DQorCWVsc2UgaWYgKG1hcy0+b2Zmc2V0ID49 IDIpDQorCQltYXMtPm9mZnNldCAtPSAyOw0KKwllbHNlIGlmICghbWFzX3NraXBfbm9kZShtYXMp KQ0KKwkJcmV0dXJuIC1FQlVTWTsNCisNCisJLyogRW1wdHkgc2V0ICovDQorCWlmIChtYXNfaXNf bm9uZShtYXMpIHx8IG1hc19pc19wdHIobWFzKSkgew0KKwkJbWFzX3NwYXJzZV9hcmVhKG1hcywg bWluLCBtYXgsIHNpemUsIHRydWUpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisNCisJLyogVGhlIHN0 YXJ0IG9mIHRoZSB3aW5kb3cgY2FuIG9ubHkgYmUgd2l0aGluIHRoZXNlIHZhbHVlcyAqLw0KKwlt YXMtPmluZGV4ID0gbWluOw0KKwltYXMtPmxhc3QgPSBtYXg7DQorCW1hc19hd2FsayhtYXMsIHNp emUpOw0KKw0KKwlpZiAodW5saWtlbHkobWFzX2lzX2VycihtYXMpKSkNCisJCXJldHVybiB4YV9l cnIobWFzLT5ub2RlKTsNCisNCisJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCWlmICh1bmxpa2Vs eShvZmZzZXQgPT0gTUFQTEVfTk9ERV9TTE9UUykpDQorCQlyZXR1cm4gLUVCVVNZOw0KKw0KKwlt dCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJcGl2b3RzID0gbWFfcGl2b3RzKG1hc19t bihtYXMpLCBtdCk7DQorCWlmIChvZmZzZXQpDQorCQltYXMtPm1pbiA9IHBpdm90c1tvZmZzZXQg LSAxXSArIDE7DQorDQorCWlmIChvZmZzZXQgPCBtdF9waXZvdHNbbXRdKQ0KKwkJbWFzLT5tYXgg PSBwaXZvdHNbb2Zmc2V0XTsNCisNCisJaWYgKG1hcy0+aW5kZXggPCBtYXMtPm1pbikNCisJCW1h cy0+aW5kZXggPSBtYXMtPm1pbjsNCisNCisJbWFzLT5sYXN0ID0gbWFzLT5pbmRleCArIHNpemUg LSAxOw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyoNCisgKiBtYXNfZW1wdHlfYXJlYV9yZXYoKSAt IEdldCB0aGUgaGlnaGVzdCBhZGRyZXNzIHdpdGhpbiB0aGUgcmFuZ2UgdGhhdCBpcw0KKyAqIHN1 ZmZpY2llbnQgZm9yIHRoZSBzaXplIHJlcXVlc3RlZC4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3Rh dGUNCisgKiBAbWluOiBUaGUgbG93ZXN0IHZhbHVlIG9mIHRoZSByYW5nZQ0KKyAqIEBtYXg6IFRo ZSBoaWdoZXN0IHZhbHVlIG9mIHRoZSByYW5nZQ0KKyAqIEBzaXplOiBUaGUgc2l6ZSBuZWVkZWQN CisgKi8NCitpbnQgbWFzX2VtcHR5X2FyZWFfcmV2KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNp Z25lZCBsb25nIG1pbiwNCisJCXVuc2lnbmVkIGxvbmcgbWF4LCB1bnNpZ25lZCBsb25nIHNpemUp DQorew0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmxhc3QgPSBtYXMtPm5vZGU7DQorDQorCWlmICht YXNfaXNfc3RhcnQobWFzKSkgew0KKwkJbWFzX3N0YXJ0KG1hcyk7DQorCQltYXMtPm9mZnNldCA9 IG1hc19kYXRhX2VuZChtYXMpOw0KKwl9IGVsc2UgaWYgKG1hcy0+b2Zmc2V0ID49IDIpIHsNCisJ CW1hcy0+b2Zmc2V0IC09IDI7DQorCX0gZWxzZSBpZiAoIW1hc19yZXdpbmRfbm9kZShtYXMpKSB7 DQorCQlyZXR1cm4gLUVCVVNZOw0KKwl9DQorDQorCS8qIEVtcHR5IHNldC4gKi8NCisJaWYgKG1h c19pc19ub25lKG1hcykgfHwgbWFzX2lzX3B0cihtYXMpKSB7DQorCQltYXNfc3BhcnNlX2FyZWEo bWFzLCBtaW4sIG1heCwgc2l6ZSwgZmFsc2UpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisNCisJLyog VGhlIHN0YXJ0IG9mIHRoZSB3aW5kb3cgY2FuIG9ubHkgYmUgd2l0aGluIHRoZXNlIHZhbHVlcy4g Ki8NCisJbWFzLT5pbmRleCA9IG1pbjsNCisJbWFzLT5sYXN0ID0gbWF4Ow0KKw0KKwl3aGlsZSAo IW1hc19yZXZfYXdhbGsobWFzLCBzaXplKSkgew0KKwkJaWYgKGxhc3QgPT0gbWFzLT5ub2RlKSB7 DQorCQkJaWYgKCFtYXNfcmV3aW5kX25vZGUobWFzKSkNCisJCQkJcmV0dXJuIC1FQlVTWTsNCisJ CX0gZWxzZSB7DQorCQkJbGFzdCA9IG1hcy0+bm9kZTsNCisJCX0NCisJfQ0KKw0KKwlpZiAobWFz X2lzX2VycihtYXMpKQ0KKwkJcmV0dXJuIHhhX2VycihtYXMtPm5vZGUpOw0KKw0KKwlpZiAodW5s aWtlbHkobWFzLT5vZmZzZXQgPT0gTUFQTEVfTk9ERV9TTE9UUykpDQorCQlyZXR1cm4gLUVCVVNZ Ow0KKw0KKwkvKg0KKwkgKiBtYXNfcmV2X2F3YWxrKCkgaGFzIHNldCBtYXMtPm1pbiBhbmQgbWFz LT5tYXggdG8gdGhlIGdhcCB2YWx1ZXMuICBJZg0KKwkgKiB0aGUgbWF4aW11bSBpcyBvdXRzaWRl IHRoZSB3aW5kb3cgd2UgYXJlIHNlYXJjaGluZywgdGhlbiB1c2UgdGhlIGxhc3QNCisJICogbG9j YXRpb24gaW4gdGhlIHNlYXJjaC4NCisJICogbWFzLT5tYXggYW5kIG1hcy0+bWluIGlzIHRoZSBy YW5nZSBvZiB0aGUgZ2FwLg0KKwkgKiBtYXMtPmluZGV4IGFuZCBtYXMtPmxhc3QgYXJlIGN1cnJl bnRseSBzZXQgdG8gdGhlIHNlYXJjaCByYW5nZS4NCisJICovDQorDQorCS8qIFRyaW0gdGhlIHVw cGVyIGxpbWl0IHRvIHRoZSBtYXguICovDQorCWlmIChtYXMtPm1heCA8PSBtYXMtPmxhc3QpDQor CQltYXMtPmxhc3QgPSBtYXMtPm1heDsNCisNCisJbWFzLT5pbmRleCA9IG1hcy0+bGFzdCAtIHNp emUgKyAxOw0KKwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIGlubGluZSBpbnQgbWFzX2FsbG9j KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSwNCisJCXVuc2lnbmVkIGxvbmcgc2l6 ZSwgdW5zaWduZWQgbG9uZyAqaW5kZXgpDQorew0KKwl1bnNpZ25lZCBsb25nIG1pbjsNCisNCisJ bWFzX3N0YXJ0KG1hcyk7DQorCWlmIChtYXNfaXNfbm9uZShtYXMpIHx8IG1hc19pc19wdHIobWFz KSkgew0KKwkJbWFzX3Jvb3RfZXhwYW5kKG1hcywgZW50cnkpOw0KKwkJaWYgKG1hc19pc19lcnIo bWFzKSkNCisJCQlyZXR1cm4geGFfZXJyKG1hcy0+bm9kZSk7DQorDQorCQlpZiAoIW1hcy0+aW5k ZXgpDQorCQkJcmV0dXJuIG10ZV9waXZvdChtYXMtPm5vZGUsIDApOw0KKwkJcmV0dXJuIG10ZV9w aXZvdChtYXMtPm5vZGUsIDEpOw0KKwl9DQorDQorCS8qIE11c3QgYmUgd2Fsa2luZyBhIHRyZWUu ICovDQorCW1hc19hd2FsayhtYXMsIHNpemUpOw0KKwlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJ cmV0dXJuIHhhX2VycihtYXMtPm5vZGUpOw0KKw0KKwlpZiAobWFzLT5vZmZzZXQgPT0gTUFQTEVf Tk9ERV9TTE9UUykNCisJCWdvdG8gbm9fZ2FwOw0KKw0KKwkvKg0KKwkgKiBBdCB0aGlzIHBvaW50 LCBtYXMtPm5vZGUgcG9pbnRzIHRvIHRoZSByaWdodCBub2RlIGFuZCB3ZSBoYXZlIGFuDQorCSAq IG9mZnNldCB0aGF0IGhhcyBhIHN1ZmZpY2llbnQgZ2FwLg0KKwkgKi8NCisJbWluID0gbWFzLT5t aW47DQorCWlmIChtYXMtPm9mZnNldCkNCisJCW1pbiA9IG10ZV9waXZvdChtYXMtPm5vZGUsIG1h cy0+b2Zmc2V0IC0gMSkgKyAxOw0KKw0KKwlpZiAobWFzLT5pbmRleCA8IG1pbikNCisJCW1hcy0+ aW5kZXggPSBtaW47DQorDQorCW1hc19maWxsX2dhcChtYXMsIGVudHJ5LCBtYXMtPm9mZnNldCwg c2l6ZSwgaW5kZXgpOw0KKwlyZXR1cm4gMDsNCisNCitub19nYXA6DQorCXJldHVybiAtRUJVU1k7 DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hc19yZXZfYWxsb2Moc3RydWN0IG1hX3N0YXRl ICptYXMsIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJCQl1bnNpZ25lZCBsb25nIG1heCwgdm9pZCAq ZW50cnksDQorCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyAqaW5kZXgpDQor ew0KKwlpbnQgcmV0ID0gMDsNCisNCisJcmV0ID0gbWFzX2VtcHR5X2FyZWFfcmV2KG1hcywgbWlu LCBtYXgsIHNpemUpOw0KKwlpZiAocmV0KQ0KKwkJcmV0dXJuIHJldDsNCisNCisJaWYgKG1hc19p c19lcnIobWFzKSkNCisJCXJldHVybiB4YV9lcnIobWFzLT5ub2RlKTsNCisNCisJaWYgKG1hcy0+ b2Zmc2V0ID09IE1BUExFX05PREVfU0xPVFMpDQorCQlnb3RvIG5vX2dhcDsNCisNCisJbWFzX2Zp bGxfZ2FwKG1hcywgZW50cnksIG1hcy0+b2Zmc2V0LCBzaXplLCBpbmRleCk7DQorCXJldHVybiAw Ow0KKw0KK25vX2dhcDoNCisJcmV0dXJuIC1FQlVTWTsNCit9DQorDQorLyoNCisgKiBtYXNfZGVh ZF9sZWF2ZXMoKSAtIE1hcmsgYWxsIGxlYXZlcyBvZiBhIG5vZGUgYXMgZGVhZC4NCisgKiBAbWFz OiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAc2xvdHM6IFBvaW50ZXIgdG8gdGhlIHNsb3QgYXJyYXkN CisgKg0KKyAqIE11c3QgaG9sZCB0aGUgd3JpdGUgbG9jay4NCisgKg0KKyAqIFJldHVybjogVGhl IG51bWJlciBvZiBsZWF2ZXMgbWFya2VkIGFzIGRlYWQuDQorICovDQorc3RhdGljIGlubGluZQ0K K3Vuc2lnbmVkIGNoYXIgbWFzX2RlYWRfbGVhdmVzKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lk IF9fcmN1ICoqc2xvdHMpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJZW51bSBt YXBsZV90eXBlIHR5cGU7DQorCXZvaWQgKmVudHJ5Ow0KKwlpbnQgb2Zmc2V0Ow0KKw0KKwlmb3Ig KG9mZnNldCA9IDA7IG9mZnNldCA8IG10X3Nsb3RfY291bnQobWFzLT5ub2RlKTsgb2Zmc2V0Kysp IHsNCisJCWVudHJ5ID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywgc2xvdHMsIG9mZnNldCk7DQorCQl0 eXBlID0gbXRlX25vZGVfdHlwZShlbnRyeSk7DQorCQlub2RlID0gbXRlX3RvX25vZGUoZW50cnkp Ow0KKwkJLyogVXNlIGJvdGggbm9kZSBhbmQgdHlwZSB0byBjYXRjaCBMRSAmIEJFIG1ldGFkYXRh ICovDQorCQlpZiAoIW5vZGUgfHwgIXR5cGUpDQorCQkJYnJlYWs7DQorDQorCQltdGVfc2V0X25v ZGVfZGVhZChlbnRyeSk7DQorCQlzbXBfd21iKCk7IC8qIE5lZWRlZCBmb3IgUkNVICovDQorCQlu b2RlLT50eXBlID0gdHlwZTsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcihzbG90c1tvZmZzZXRdLCBu b2RlKTsNCisJfQ0KKw0KKwlyZXR1cm4gb2Zmc2V0Ow0KK30NCisNCitzdGF0aWMgdm9pZCBfX3Jj dSAqKm1hc19kZWFkX3dhbGsoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGNoYXIgb2Zm c2V0KQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsICpuZXh0Ow0KKwl2b2lkIF9fcmN1 ICoqc2xvdHMgPSBOVUxMOw0KKw0KKwluZXh0ID0gbWFzX21uKG1hcyk7DQorCWRvIHsNCisJCW1h cy0+bm9kZSA9IG1hX2Vub2RlX3B0cihuZXh0KTsNCisJCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJ CXNsb3RzID0gbWFfc2xvdHMobm9kZSwgbm9kZS0+dHlwZSk7DQorCQluZXh0ID0gbWFzX3Nsb3Rf bG9ja2VkKG1hcywgc2xvdHMsIG9mZnNldCk7DQorCQlvZmZzZXQgPSAwOw0KKwl9IHdoaWxlICgh bWFfaXNfbGVhZihuZXh0LT50eXBlKSk7DQorDQorCXJldHVybiBzbG90czsNCit9DQorDQorc3Rh dGljIHZvaWQgbXRfZnJlZV93YWxrKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkNCit7DQorCXZvaWQg X19yY3UgKipzbG90czsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsICpzdGFydDsNCisJc3Ry dWN0IG1hcGxlX3RyZWUgbXQ7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwllbnVtIG1hcGxl X3R5cGUgdHlwZTsNCisJTUFfU1RBVEUobWFzLCAmbXQsIDAsIDApOw0KKw0KKwlub2RlID0gY29u dGFpbmVyX29mKGhlYWQsIHN0cnVjdCBtYXBsZV9ub2RlLCByY3UpOw0KKw0KKwlpZiAobWFfaXNf bGVhZihub2RlLT50eXBlKSkNCisJCWdvdG8gZnJlZV9sZWFmOw0KKw0KKwltdF9pbml0X2ZsYWdz KCZtdCwgbm9kZS0+bWFfZmxhZ3MpOw0KKwltYXNfbG9jaygmbWFzKTsNCisJc3RhcnQgPSBub2Rl Ow0KKwltYXMubm9kZSA9IG10X21rX25vZGUobm9kZSwgbm9kZS0+dHlwZSk7DQorCXNsb3RzID0g bWFzX2RlYWRfd2FsaygmbWFzLCAwKTsNCisJbm9kZSA9IG1hc19tbigmbWFzKTsNCisJZG8gew0K KwkJbXRfZnJlZV9idWxrKG5vZGUtPnNsb3RfbGVuLCBzbG90cyk7DQorCQlvZmZzZXQgPSBub2Rl LT5wYXJlbnRfc2xvdCArIDE7DQorCQltYXMubm9kZSA9IG5vZGUtPnBpdl9wYXJlbnQ7DQorCQlp ZiAobWFzX21uKCZtYXMpID09IG5vZGUpDQorCQkJZ290byBzdGFydF9zbG90c19mcmVlOw0KKw0K KwkJdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLm5vZGUpOw0KKwkJc2xvdHMgPSBtYV9zbG90cyht dGVfdG9fbm9kZShtYXMubm9kZSksIHR5cGUpOw0KKwkJaWYgKChvZmZzZXQgPCBtdF9zbG90c1t0 eXBlXSkgJiYgKHNsb3RzW29mZnNldF0pKQ0KKwkJCXNsb3RzID0gbWFzX2RlYWRfd2FsaygmbWFz LCBvZmZzZXQpOw0KKw0KKwkJbm9kZSA9IG1hc19tbigmbWFzKTsNCisJfSB3aGlsZSAoKG5vZGUg IT0gc3RhcnQpIHx8IChub2RlLT5zbG90X2xlbiA8IG9mZnNldCkpOw0KKw0KKwlzbG90cyA9IG1h X3Nsb3RzKG5vZGUsIG5vZGUtPnR5cGUpOw0KKwltdF9mcmVlX2J1bGsobm9kZS0+c2xvdF9sZW4s IHNsb3RzKTsNCisNCitzdGFydF9zbG90c19mcmVlOg0KKwltYXNfdW5sb2NrKCZtYXMpOw0KK2Zy ZWVfbGVhZjoNCisJbXRfZnJlZV9yY3UoJm5vZGUtPnJjdSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxp bmUgdm9pZCBfX3JjdSAqKm1hc19kZXN0cm95X2Rlc2NlbmQoc3RydWN0IG1hX3N0YXRlICptYXMs DQorCQkJc3RydWN0IG1hcGxlX2Vub2RlICpwcmV2LCB1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7 DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5leHQg PSBtYXMtPm5vZGU7DQorCXZvaWQgX19yY3UgKipzbG90cyA9IE5VTEw7DQorDQorCWRvIHsNCisJ CW1hcy0+bm9kZSA9IG5leHQ7DQorCQlub2RlID0gbWFzX21uKG1hcyk7DQorCQlzbG90cyA9IG1h X3Nsb3RzKG5vZGUsIG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKSk7DQorCQluZXh0ID0gbWFzX3Ns b3RfbG9ja2VkKG1hcywgc2xvdHMsIDApOw0KKwkJaWYgKChtdGVfZGVhZF9ub2RlKG5leHQpKSkN CisJCQluZXh0ID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywgc2xvdHMsIDEpOw0KKw0KKwkJbXRlX3Nl dF9ub2RlX2RlYWQobWFzLT5ub2RlKTsNCisJCW5vZGUtPnR5cGUgPSBtdGVfbm9kZV90eXBlKG1h cy0+bm9kZSk7DQorCQlub2RlLT5waXZfcGFyZW50ID0gcHJldjsNCisJCW5vZGUtPnBhcmVudF9z bG90ID0gb2Zmc2V0Ow0KKwkJb2Zmc2V0ID0gMDsNCisJCXByZXYgPSBtYXMtPm5vZGU7DQorCX0g d2hpbGUgKCFtdGVfaXNfbGVhZihuZXh0KSk7DQorDQorCXJldHVybiBzbG90czsNCit9DQorDQor c3RhdGljIHZvaWQgbXRfZGVzdHJveV93YWxrKHN0cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGUsIHVu c2lnbmVkIGNoYXIgbWFfZmxhZ3MsDQorCQkJICAgIGJvb2wgZnJlZSkNCit7DQorCXZvaWQgX19y Y3UgKipzbG90czsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUgPSBtdGVfdG9fbm9kZShlbm9k ZSk7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqc3RhcnQ7DQorCXN0cnVjdCBtYXBsZV90cmVlIG10 Ow0KKw0KKwlNQV9TVEFURShtYXMsICZtdCwgMCwgMCk7DQorDQorCWlmIChtdGVfaXNfbGVhZihl bm9kZSkpDQorCQlnb3RvIGZyZWVfbGVhZjsNCisNCisJbXRfaW5pdF9mbGFncygmbXQsIG1hX2Zs YWdzKTsNCisJbWFzX2xvY2soJm1hcyk7DQorDQorCW1hcy5ub2RlID0gc3RhcnQgPSBlbm9kZTsN CisJc2xvdHMgPSBtYXNfZGVzdHJveV9kZXNjZW5kKCZtYXMsIHN0YXJ0LCAwKTsNCisJbm9kZSA9 IG1hc19tbigmbWFzKTsNCisJZG8gew0KKwkJZW51bSBtYXBsZV90eXBlIHR5cGU7DQorCQl1bnNp Z25lZCBjaGFyIG9mZnNldDsNCisJCXN0cnVjdCBtYXBsZV9lbm9kZSAqcGFyZW50LCAqdG1wOw0K Kw0KKwkJbm9kZS0+c2xvdF9sZW4gPSBtYXNfZGVhZF9sZWF2ZXMoJm1hcywgc2xvdHMpOw0KKwkJ aWYgKGZyZWUpDQorCQkJbXRfZnJlZV9idWxrKG5vZGUtPnNsb3RfbGVuLCBzbG90cyk7DQorCQlv ZmZzZXQgPSBub2RlLT5wYXJlbnRfc2xvdCArIDE7DQorCQltYXMubm9kZSA9IG5vZGUtPnBpdl9w YXJlbnQ7DQorCQlpZiAobWFzX21uKCZtYXMpID09IG5vZGUpDQorCQkJZ290byBzdGFydF9zbG90 c19mcmVlOw0KKw0KKwkJdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLm5vZGUpOw0KKwkJc2xvdHMg PSBtYV9zbG90cyhtdGVfdG9fbm9kZShtYXMubm9kZSksIHR5cGUpOw0KKwkJaWYgKG9mZnNldCA+ PSBtdF9zbG90c1t0eXBlXSkNCisJCQlnb3RvIG5leHQ7DQorDQorCQl0bXAgPSBtYXNfc2xvdF9s b2NrZWQoJm1hcywgc2xvdHMsIG9mZnNldCk7DQorCQlpZiAobXRlX25vZGVfdHlwZSh0bXApICYm IG10ZV90b19ub2RlKHRtcCkpIHsNCisJCQlwYXJlbnQgPSBtYXMubm9kZTsNCisJCQltYXMubm9k ZSA9IHRtcDsNCisJCQlzbG90cyA9IG1hc19kZXN0cm95X2Rlc2NlbmQoJm1hcywgcGFyZW50LCBv ZmZzZXQpOw0KKwkJfQ0KK25leHQ6DQorCQlub2RlID0gbWFzX21uKCZtYXMpOw0KKwl9IHdoaWxl IChzdGFydCAhPSBtYXMubm9kZSk7DQorDQorCW5vZGUgPSBtYXNfbW4oJm1hcyk7DQorCW5vZGUt PnNsb3RfbGVuID0gbWFzX2RlYWRfbGVhdmVzKCZtYXMsIHNsb3RzKTsNCisJaWYgKGZyZWUpDQor CQltdF9mcmVlX2J1bGsobm9kZS0+c2xvdF9sZW4sIHNsb3RzKTsNCisNCitzdGFydF9zbG90c19m cmVlOg0KKwltYXNfdW5sb2NrKCZtYXMpOw0KKw0KK2ZyZWVfbGVhZjoNCisJaWYgKGZyZWUpDQor CQltdF9mcmVlX3JjdSgmbm9kZS0+cmN1KTsNCit9DQorDQorLyoNCisgKiBtdGVfZGVzdHJveV93 YWxrKCkgLSBGcmVlIGEgdHJlZSBvciBzdWItdHJlZS4NCisgKiBAZW5vZGUgLSB0aGUgZW5jb2Rl ZCBtYXBsZSBub2RlIChtYXBsZV9lbm9kZSkgdG8gc3RhcnQNCisgKiBAbW4gLSB0aGUgdHJlZSB0 byBmcmVlIC0gbmVlZGVkIGZvciBub2RlIHR5cGVzLg0KKyAqDQorICogTXVzdCBob2xkIHRoZSB3 cml0ZSBsb2NrLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdGVfZGVzdHJveV93YWxrKHN0 cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGUsDQorCQkJCSAgICBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQp DQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSA9IG10ZV90b19ub2RlKGVub2RlKTsNCisN CisJaWYgKG10X2luX3JjdShtdCkpIHsNCisJCW10X2Rlc3Ryb3lfd2Fsayhlbm9kZSwgbXQtPm1h X2ZsYWdzLCBmYWxzZSk7DQorCQljYWxsX3JjdSgmbm9kZS0+cmN1LCBtdF9mcmVlX3dhbGspOw0K Kwl9IGVsc2Ugew0KKwkJbXRfZGVzdHJveV93YWxrKGVub2RlLCBtdC0+bWFfZmxhZ3MsIHRydWUp Ow0KKwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG1hc193cl9zdG9yZV9zZXR1cChzdHJ1Y3QgbWFf d3Jfc3RhdGUgKndyX21hcykNCit7DQorCWlmICghbWFzX2lzX3N0YXJ0KHdyX21hcy0+bWFzKSkg ew0KKwkJaWYgKG1hc19pc19ub25lKHdyX21hcy0+bWFzKSkgew0KKwkJCW1hc19yZXNldCh3cl9t YXMtPm1hcyk7DQorCQl9IGVsc2Ugew0KKwkJCXdyX21hcy0+cl9tYXggPSB3cl9tYXMtPm1hcy0+ bWF4Ow0KKwkJCXdyX21hcy0+dHlwZSA9IG10ZV9ub2RlX3R5cGUod3JfbWFzLT5tYXMtPm5vZGUp Ow0KKwkJCWlmIChtYXNfaXNfc3Bhbl93cih3cl9tYXMpKQ0KKwkJCQltYXNfcmVzZXQod3JfbWFz LT5tYXMpOw0KKwkJfQ0KKwl9DQorDQorfQ0KKw0KKy8qIEludGVyZmFjZSAqLw0KKw0KKy8qKg0K KyAqIG1hc19zdG9yZSgpIC0gU3RvcmUgYW4gQGVudHJ5Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBz dGF0ZS4NCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBzdG9yZS4NCisgKg0KKyAqIFRoZSBAbWFz LT5pbmRleCBhbmQgQG1hcy0+bGFzdCBpcyB1c2VkIHRvIHNldCB0aGUgcmFuZ2UgZm9yIHRoZSBA ZW50cnkuDQorICogTm90ZTogVGhlIEBtYXMgc2hvdWxkIGhhdmUgcHJlLWFsbG9jYXRlZCBlbnRy aWVzIHRvIGVuc3VyZSB0aGVyZSBpcyBtZW1vcnkgdG8NCisgKiBzdG9yZSB0aGUgZW50cnkuICBQ bGVhc2Ugc2VlIG1hc19leHBlY3RlZF9lbnRyaWVzKCkvbWFzX2Rlc3Ryb3koKSBmb3IgbW9yZSBk ZXRhaWxzLg0KKyAqDQorICogUmV0dXJuOiB0aGUgZmlyc3QgZW50cnkgYmV0d2VlbiBtYXMtPmlu ZGV4IGFuZCBtYXMtPmxhc3Qgb3IgJU5VTEwuDQorICovDQordm9pZCAqbWFzX3N0b3JlKHN0cnVj dCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSkNCit7DQorCU1BX1dSX1NUQVRFKHdyX21hcywg bWFzLCBlbnRyeSk7DQorDQorCXRyYWNlX21hX3dyaXRlKF9fZnVuY19fLCBtYXMsIDAsIGVudHJ5 KTsNCisjaWZkZWYgQ09ORklHX0RFQlVHX01BUExFX1RSRUUNCisJaWYgKG1hcy0+aW5kZXggPiBt YXMtPmxhc3QpDQorCQlwcl9lcnIoIkVycm9yICVsdSA+ICVsdSAlcFxuIiwgbWFzLT5pbmRleCwg bWFzLT5sYXN0LCBlbnRyeSk7DQorCU1UX0JVR19PTihtYXMtPnRyZWUsIG1hcy0+aW5kZXggPiBt YXMtPmxhc3QpOw0KKwlpZiAobWFzLT5pbmRleCA+IG1hcy0+bGFzdCkgew0KKwkJbWFzX3NldF9l cnIobWFzLCAtRUlOVkFMKTsNCisJCXJldHVybiBOVUxMOw0KKwl9DQorDQorI2VuZGlmDQorDQor CS8qDQorCSAqIFN0b3JpbmcgaXMgdGhlIHNhbWUgb3BlcmF0aW9uIGFzIGluc2VydCB3aXRoIHRo ZSBhZGRlZCBjYXZlYXQgdGhhdCBpdA0KKwkgKiBjYW4gb3ZlcndyaXRlIGVudHJpZXMuICBBbHRo b3VnaCB0aGlzIHNlZW1zIHNpbXBsZSBlbm91Z2gsIG9uZSBtYXkNCisJICogd2FudCB0byBleGFt aW5lIHdoYXQgaGFwcGVucyBpZiBhIHNpbmdsZSBzdG9yZSBvcGVyYXRpb24gd2FzIHRvDQorCSAq IG92ZXJ3cml0ZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGhpbiBhIHNlbGYtYmFsYW5jaW5nIEItVHJl ZS4NCisJICovDQorCW1hc193cl9zdG9yZV9zZXR1cCgmd3JfbWFzKTsNCisJbWFzX3dyX3N0b3Jl X2VudHJ5KCZ3cl9tYXMpOw0KKwlyZXR1cm4gd3JfbWFzLmNvbnRlbnQ7DQorfQ0KKw0KKy8qKg0K KyAqIG1hc19zdG9yZV9nZnAoKSAtIFN0b3JlIGEgdmFsdWUgaW50byB0aGUgdHJlZS4NCisgKiBA bWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBzdG9yZQ0KKyAq IEBnZnA6IFRoZSBHRlBfRkxBR1MgdG8gdXNlIGZvciBhbGxvY2F0aW9ucyBpZiBuZWNlc3Nhcnku DQorICoNCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBvbiBpbnZhbGlkIHJlcXVl c3QsIC1FTk9NRU0gaWYgbWVtb3J5IGNvdWxkIG5vdA0KKyAqIGJlIGFsbG9jYXRlZC4NCisgKi8N CitpbnQgbWFzX3N0b3JlX2dmcChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnksIGdm cF90IGdmcCkNCit7DQorCU1BX1dSX1NUQVRFKHdyX21hcywgbWFzLCBlbnRyeSk7DQorDQorCW1h c193cl9zdG9yZV9zZXR1cCgmd3JfbWFzKTsNCisJdHJhY2VfbWFfd3JpdGUoX19mdW5jX18sIG1h cywgMCwgZW50cnkpOw0KK3JldHJ5Og0KKwltYXNfd3Jfc3RvcmVfZW50cnkoJndyX21hcyk7DQor CWlmICh1bmxpa2VseShtYXNfbm9tZW0obWFzLCBnZnApKSkNCisJCWdvdG8gcmV0cnk7DQorDQor CWlmICh1bmxpa2VseShtYXNfaXNfZXJyKG1hcykpKQ0KKwkJcmV0dXJuIHhhX2VycihtYXMtPm5v ZGUpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyoqDQorICogbWFzX3N0b3JlX3ByZWFsbG9j KCkgLSBTdG9yZSBhIHZhbHVlIGludG8gdGhlIHRyZWUgdXNpbmcgbWVtb3J5DQorICogcHJlYWxs b2NhdGVkIGluIHRoZSBtYXBsZSBzdGF0ZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisg KiBAZW50cnk6IFRoZSBlbnRyeSB0byBzdG9yZS4NCisgKi8NCit2b2lkIG1hc19zdG9yZV9wcmVh bGxvYyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnkpDQorew0KKwlNQV9XUl9TVEFU RSh3cl9tYXMsIG1hcywgZW50cnkpOw0KKw0KKwltYXNfd3Jfc3RvcmVfc2V0dXAoJndyX21hcyk7 DQorCXRyYWNlX21hX3dyaXRlKF9fZnVuY19fLCBtYXMsIDAsIGVudHJ5KTsNCisJbWFzX3dyX3N0 b3JlX2VudHJ5KCZ3cl9tYXMpOw0KKwlCVUdfT04obWFzX2lzX2VycihtYXMpKTsNCisJbWFzX2Rl c3Ryb3kobWFzKTsNCit9DQorDQorLyoqDQorICogbWFzX3ByZWFsbG9jYXRlKCkgLSBQcmVhbGxv Y2F0ZSBlbm91Z2ggbm9kZXMgZm9yIGEgc3RvcmUgb3BlcmF0aW9uDQorICogQG1hczogVGhlIG1h cGxlIHN0YXRlDQorICogQGVudHJ5OiBUaGUgZW50cnkgdGhhdCB3aWxsIGJlIHN0b3JlZA0KKyAq IEBnZnA6IFRoZSBHRlBfRkxBR1MgdG8gdXNlIGZvciBhbGxvY2F0aW9ucy4NCisgKg0KKyAqIFJl dHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIGlmIG1lbW9yeSBjb3VsZCBub3QgYmUgYWxsb2Nh dGVkLg0KKyAqLw0KK2ludCBtYXNfcHJlYWxsb2NhdGUoc3RydWN0IG1hX3N0YXRlICptYXMsIHZv aWQgKmVudHJ5LCBnZnBfdCBnZnApDQorew0KKwlpbnQgcmV0Ow0KKw0KKwltYXNfbm9kZV9jb3Vu dF9nZnAobWFzLCAxICsgbWFzX210X2hlaWdodChtYXMpICogMywgZ2ZwKTsNCisJbWFzLT5tYXNf ZmxhZ3MgfD0gTUFfU1RBVEVfUFJFQUxMT0M7DQorCWlmIChsaWtlbHkoIW1hc19pc19lcnIobWFz KSkpDQorCQlyZXR1cm4gMDsNCisNCisJbWFzX3NldF9hbGxvY19yZXEobWFzLCAwKTsNCisJcmV0 ID0geGFfZXJyKG1hcy0+bm9kZSk7DQorCW1hc19yZXNldChtYXMpOw0KKwltYXNfZGVzdHJveSht YXMpOw0KKwltYXNfcmVzZXQobWFzKTsNCisJcmV0dXJuIHJldDsNCit9DQorDQorLyoNCisgKiBt YXNfZGVzdHJveSgpIC0gZGVzdHJveSBhIG1hcGxlIHN0YXRlLg0KKyAqIEBtYXM6IFRoZSBtYXBs ZSBzdGF0ZQ0KKyAqDQorICogVXBvbiBjb21wbGV0aW9uLCBjaGVjayB0aGUgbGVmdC1tb3N0IG5v ZGUgYW5kIHJlYmFsYW5jZSBhZ2FpbnN0IHRoZSBub2RlIHRvDQorICogdGhlIHJpZ2h0IGlmIG5l Y2Vzc2FyeS4gIEZyZWVzIGFueSBhbGxvY2F0ZWQgbm9kZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMg bWFwbGUNCisgKiBzdGF0ZS4NCisgKi8NCit2b2lkIG1hc19kZXN0cm95KHN0cnVjdCBtYV9zdGF0 ZSAqbWFzKQ0KK3sNCisJc3RydWN0IG1hcGxlX2FsbG9jICpub2RlOw0KKw0KKwkvKg0KKwkgKiBX aGVuIHVzaW5nIG1hc19mb3JfZWFjaCgpIHRvIGluc2VydCBhbiBleHBlY3RlZCBudW1iZXIgb2Yg ZWxlbWVudHMsDQorCSAqIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIG51bWJlciBpbnNlcnRlZCBp cyBsZXNzIHRoYW4gdGhlIGV4cGVjdGVkDQorCSAqIG51bWJlci4gIFRvIGZpeCBhbiBpbnZhbGlk IGZpbmFsIG5vZGUsIGEgY2hlY2sgaXMgcGVyZm9ybWVkIGhlcmUgdG8NCisJICogcmViYWxhbmNl IHRoZSBwcmV2aW91cyBub2RlIHdpdGggdGhlIGZpbmFsIG5vZGUuDQorCSAqLw0KKwlpZiAobWFz LT5tYXNfZmxhZ3MgJiBNQV9TVEFURV9SRUJBTEFOQ0UpIHsNCisJCXVuc2lnbmVkIGNoYXIgZW5k Ow0KKw0KKwkJaWYgKG1hc19pc19zdGFydChtYXMpKQ0KKwkJCW1hc19zdGFydChtYXMpOw0KKw0K KwkJbXRyZWVfcmFuZ2Vfd2FsayhtYXMpOw0KKwkJZW5kID0gbWFzX2RhdGFfZW5kKG1hcykgKyAx Ow0KKwkJaWYgKGVuZCA8IG10X21pbl9zbG90X2NvdW50KG1hcy0+bm9kZSkgLSAxKQ0KKwkJCW1h c19kZXN0cm95X3JlYmFsYW5jZShtYXMsIGVuZCk7DQorDQorCQltYXMtPm1hc19mbGFncyAmPSB+ TUFfU1RBVEVfUkVCQUxBTkNFOw0KKwl9DQorCW1hcy0+bWFzX2ZsYWdzICY9IH4oTUFfU1RBVEVf QlVMS3xNQV9TVEFURV9QUkVBTExPQyk7DQorDQorCXdoaWxlIChtYXMtPmFsbG9jICYmICEoKHVu c2lnbmVkIGxvbmcpbWFzLT5hbGxvYyAmIDB4MSkpIHsNCisJCW5vZGUgPSBtYXMtPmFsbG9jOw0K KwkJbWFzLT5hbGxvYyA9IG5vZGUtPnNsb3RbMF07DQorCQlpZiAobm9kZS0+bm9kZV9jb3VudCA+ IDApDQorCQkJbXRfZnJlZV9idWxrKG5vZGUtPm5vZGVfY291bnQsDQorCQkJCSAgICAgKHZvaWQg X19yY3UgKiopJm5vZGUtPnNsb3RbMV0pOw0KKwkJa21lbV9jYWNoZV9mcmVlKG1hcGxlX25vZGVf Y2FjaGUsIG5vZGUpOw0KKwl9DQorCW1hcy0+YWxsb2MgPSBOVUxMOw0KK30NCisNCisvKg0KKyAq IG1hc19leHBlY3RlZF9lbnRyaWVzKCkgLSBTZXQgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBlbnRy aWVzIHRoYXQgd2lsbCBiZSBpbnNlcnRlZC4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisg KiBAbnJfZW50cmllczogVGhlIG51bWJlciBvZiBleHBlY3RlZCBlbnRyaWVzLg0KKyAqDQorICog VGhpcyB3aWxsIGF0dGVtcHQgdG8gcHJlLWFsbG9jYXRlIGVub3VnaCBub2RlcyB0byBzdG9yZSB0 aGUgZXhwZWN0ZWQgbnVtYmVyDQorICogb2YgZW50cmllcy4gIFRoZSBhbGxvY2F0aW9ucyB3aWxs IG9jY3VyIHVzaW5nIHRoZSBidWxrIGFsbG9jYXRvciBpbnRlcmZhY2UNCisgKiBmb3Igc3BlZWQu ICBQbGVhc2UgY2FsbCBtYXNfZGVzdHJveSgpIG9uIHRoZSBAbWFzIGFmdGVyIGluc2VydGluZyB0 aGUgZW50cmllcw0KKyAqIHRvIGVuc3VyZSBhbnkgdW51c2VkIG5vZGVzIGFyZSBmcmVlZC4NCisg Kg0KKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIGlmIG1lbW9yeSBjb3VsZCBub3Qg YmUgYWxsb2NhdGVkLg0KKyAqLw0KK2ludCBtYXNfZXhwZWN0ZWRfZW50cmllcyhzdHJ1Y3QgbWFf c3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBucl9lbnRyaWVzKQ0KK3sNCisJaW50IG5vbmxlYWZf Y2FwID0gTUFQTEVfQVJBTkdFNjRfU0xPVFMgLSAyOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVu b2RlID0gbWFzLT5ub2RlOw0KKwlpbnQgbnJfbm9kZXM7DQorCWludCByZXQ7DQorDQorCS8qDQor CSAqIFNvbWV0aW1lcyBpdCBpcyBuZWNlc3NhcnkgdG8gZHVwbGljYXRlIGEgdHJlZSB0byBhIG5l dyB0cmVlLCBzdWNoIGFzDQorCSAqIGZvcmtpbmcgYSBwcm9jZXNzIGFuZCBkdXBsaWNhdGluZyB0 aGUgVk1BcyBmcm9tIG9uZSB0cmVlIHRvIGEgbmV3DQorCSAqIHRyZWUuICBXaGVuIHN1Y2ggYSBz aXR1YXRpb24gYXJpc2VzLCBpdCBpcyBrbm93biB0aGF0IHRoZSBuZXcgdHJlZSBpcw0KKwkgKiBu b3QgZ29pbmcgdG8gYmUgdXNlZCB1bnRpbCB0aGUgZW50aXJlIHRyZWUgaXMgcG9wdWxhdGVkLiAg Rm9yDQorCSAqIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGl0IGlzIGJlc3QgdG8gdXNlIGEgYnVsayBs b2FkIHdpdGggUkNVIGRpc2FibGVkLg0KKwkgKiBUaGlzIGFsbG93cyBmb3Igb3B0aW1pc3RpYyBz cGxpdHRpbmcgdGhhdCBmYXZvdXJzIHRoZSBsZWZ0IGFuZCByZXVzZQ0KKwkgKiBvZiBub2RlcyBk dXJpbmcgdGhlIG9wZXJhdGlvbi4NCisJICovDQorDQorCS8qIE9wdGltaXplIHNwbGl0dGluZyBm b3IgYnVsayBpbnNlcnQgaW4tb3JkZXIgKi8NCisJbWFzLT5tYXNfZmxhZ3MgfD0gTUFfU1RBVEVf QlVMSzsNCisNCisJLyoNCisJICogQXZvaWQgb3ZlcmZsb3csIGFzc3VtZSBhIGdhcCBiZXR3ZWVu IGVhY2ggZW50cnkgYW5kIGEgdHJhaWxpbmcgbnVsbC4NCisJICogSWYgdGhpcyBpcyB3cm9uZywg aXQganVzdCBtZWFucyBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gZHVyaW5nDQorCSAqIGluc2VydGlv biBvZiBlbnRyaWVzLg0KKwkgKi8NCisJbnJfbm9kZXMgPSBtYXgobnJfZW50cmllcywgbnJfZW50 cmllcyAqIDIgKyAxKTsNCisJaWYgKCFtdF9pc19hbGxvYyhtYXMtPnRyZWUpKQ0KKwkJbm9ubGVh Zl9jYXAgPSBNQVBMRV9SQU5HRTY0X1NMT1RTIC0gMjsNCisNCisJLyogTGVhdmVzOyByZWR1Y2Ug c2xvdHMgdG8ga2VlcCBzcGFjZSBmb3IgZXhwYW5zaW9uICovDQorCW5yX25vZGVzID0gRElWX1JP VU5EX1VQKG5yX25vZGVzLCBNQVBMRV9SQU5HRTY0X1NMT1RTIC0gMik7DQorCS8qIEludGVybmFs IG5vZGVzICovDQorCW5yX25vZGVzICs9IERJVl9ST1VORF9VUChucl9ub2Rlcywgbm9ubGVhZl9j YXApOw0KKwkvKiBBZGQgd29ya2luZyByb29tIGZvciBzcGxpdCAoMiBub2RlcykgKyBuZXcgcGFy ZW50cyAqLw0KKwltYXNfbm9kZV9jb3VudChtYXMsIG5yX25vZGVzICsgMyk7DQorDQorCS8qIERl dGVjdCBpZiBhbGxvY2F0aW9ucyBydW4gb3V0ICovDQorCW1hcy0+bWFzX2ZsYWdzIHw9IE1BX1NU QVRFX1BSRUFMTE9DOw0KKw0KKwlpZiAoIW1hc19pc19lcnIobWFzKSkNCisJCXJldHVybiAwOw0K Kw0KKwlyZXQgPSB4YV9lcnIobWFzLT5ub2RlKTsNCisJbWFzLT5ub2RlID0gZW5vZGU7DQorCW1h c19kZXN0cm95KG1hcyk7DQorCXJldHVybiByZXQ7DQorDQorfQ0KKw0KKy8qKg0KKyAqIG1hc19u ZXh0KCkgLSBHZXQgdGhlIG5leHQgZW50cnkuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQor ICogQG1heDogVGhlIG1heGltdW0gaW5kZXggdG8gY2hlY2suDQorICoNCisgKiBSZXR1cm5zIHRo ZSBuZXh0IGVudHJ5IGFmdGVyIEBtYXMtPmluZGV4Lg0KKyAqIE11c3QgaG9sZCByY3VfcmVhZF9s b2NrIG9yIHRoZSB3cml0ZSBsb2NrLg0KKyAqIENhbiByZXR1cm4gdGhlIHplcm8gZW50cnkuDQor ICoNCisgKiBSZXR1cm46IFRoZSBuZXh0IGVudHJ5IG9yICVOVUxMDQorICovDQordm9pZCAqbWFz X25leHQoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWF4KQ0KK3sNCisJaWYg KG1hc19pc19ub25lKG1hcykgfHwgbWFzX2lzX3BhdXNlZChtYXMpKQ0KKwkJbWFzLT5ub2RlID0g TUFTX1NUQVJUOw0KKw0KKwlpZiAobWFzX2lzX3N0YXJ0KG1hcykpDQorCQltYXNfd2FsayhtYXMp OyAvKiBSZXRyaWVzIG9uIGRlYWQgbm9kZXMgaGFuZGxlZCBieSBtYXNfd2FsayAqLw0KKw0KKwlp ZiAobWFzX2lzX3B0cihtYXMpKSB7DQorCQlpZiAoIW1hcy0+aW5kZXgpIHsNCisJCQltYXMtPmlu ZGV4ID0gMTsNCisJCQltYXMtPmxhc3QgPSBVTE9OR19NQVg7DQorCQl9DQorCQlyZXR1cm4gTlVM TDsNCisJfQ0KKw0KKwlpZiAobWFzLT5sYXN0ID09IFVMT05HX01BWCkNCisJCXJldHVybiBOVUxM Ow0KKw0KKwkvKiBSZXRyaWVzIG9uIGRlYWQgbm9kZXMgaGFuZGxlZCBieSBtYXNfbmV4dF9lbnRy eSAqLw0KKwlyZXR1cm4gbWFzX25leHRfZW50cnkobWFzLCBtYXgpOw0KK30NCitFWFBPUlRfU1lN Qk9MX0dQTChtYXNfbmV4dCk7DQorDQorLyoqDQorICogbXRfbmV4dCgpIC0gZ2V0IHRoZSBuZXh0 IHZhbHVlIGluIHRoZSBtYXBsZSB0cmVlDQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqIEBp bmRleDogVGhlIHN0YXJ0IGluZGV4DQorICogQG1heDogVGhlIG1heGltdW0gaW5kZXggdG8gY2hl Y2sNCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IGF0IEBpbmRleCBvciBoaWdoZXIsIG9yICVO VUxMIGlmIG5vdGhpbmcgaXMgZm91bmQuDQorICovDQordm9pZCAqbXRfbmV4dChzdHJ1Y3QgbWFw bGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgbWF4KQ0KK3sN CisJdm9pZCAqZW50cnkgPSBOVUxMOw0KKwlNQV9TVEFURShtYXMsIG10LCBpbmRleCwgaW5kZXgp Ow0KKw0KKwlyY3VfcmVhZF9sb2NrKCk7DQorCWVudHJ5ID0gbWFzX25leHQoJm1hcywgbWF4KTsN CisJcmN1X3JlYWRfdW5sb2NrKCk7DQorCXJldHVybiBlbnRyeTsNCit9DQorRVhQT1JUX1NZTUJP TF9HUEwobXRfbmV4dCk7DQorDQorLyoqDQorICogbWFzX3ByZXYoKSAtIEdldCB0aGUgcHJldmlv dXMgZW50cnkNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWluOiBUaGUgbWluaW11 bSB2YWx1ZSB0byBjaGVjay4NCisgKg0KKyAqIE11c3QgaG9sZCByY3VfcmVhZF9sb2NrIG9yIHRo ZSB3cml0ZSBsb2NrLg0KKyAqIFdpbGwgcmVzZXQgbWFzIHRvIE1BU19TVEFSVCBpZiB0aGUgbm9k ZSBpcyBNQVNfTk9ORS4gIFdpbGwgc3RvcCBvbiBub3QNCisgKiBzZWFyY2hhYmxlIG5vZGVzLg0K KyAqDQorICogUmV0dXJuOiB0aGUgcHJldmlvdXMgdmFsdWUgb3IgJU5VTEwuDQorICovDQordm9p ZCAqbWFzX3ByZXYoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluKQ0KK3sN CisJaWYgKCFtYXMtPmluZGV4KSB7DQorCQkvKiBOb3RoaW5nIGNvbWVzIGJlZm9yZSAwICovDQor CQltYXMtPmxhc3QgPSAwOw0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJaWYgKHVubGlrZWx5 KG1hc19pc19wdHIobWFzKSkpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJaWYgKG1hc19pc19ub25l KG1hcykgfHwgbWFzX2lzX3BhdXNlZChtYXMpKQ0KKwkJbWFzLT5ub2RlID0gTUFTX1NUQVJUOw0K Kw0KKwlpZiAobWFzX2lzX3N0YXJ0KG1hcykpIHsNCisJCW1hc193YWxrKG1hcyk7DQorCQlpZiAo IW1hcy0+aW5kZXgpDQorCQkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJaWYgKG1hc19pc19wdHIo bWFzKSkgew0KKwkJaWYgKCFtYXMtPmluZGV4KSB7DQorCQkJbWFzLT5sYXN0ID0gMDsNCisJCQly ZXR1cm4gTlVMTDsNCisJCX0NCisNCisJCW1hcy0+aW5kZXggPSBtYXMtPmxhc3QgPSAwOw0KKwkJ cmV0dXJuIG1hc19yb290X2xvY2tlZChtYXMpOw0KKwl9DQorCXJldHVybiBtYXNfcHJldl9lbnRy eShtYXMsIG1pbik7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKG1hc19wcmV2KTsNCisNCisvKioN CisgKiBtdF9wcmV2KCkgLSBnZXQgdGhlIHByZXZpb3VzIHZhbHVlIGluIHRoZSBtYXBsZSB0cmVl DQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqIEBpbmRleDogVGhlIHN0YXJ0IGluZGV4DQor ICogQG1pbjogVGhlIG1pbmltdW0gaW5kZXggdG8gY2hlY2sNCisgKg0KKyAqIFJldHVybjogVGhl IGVudHJ5IGF0IEBpbmRleCBvciBsb3dlciwgb3IgJU5VTEwgaWYgbm90aGluZyBpcyBmb3VuZC4N CisgKi8NCit2b2lkICptdF9wcmV2KHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9u ZyBpbmRleCwgdW5zaWduZWQgbG9uZyBtaW4pDQorew0KKwl2b2lkICplbnRyeSA9IE5VTEw7DQor CU1BX1NUQVRFKG1hcywgbXQsIGluZGV4LCBpbmRleCk7DQorDQorCXJjdV9yZWFkX2xvY2soKTsN CisJZW50cnkgPSBtYXNfcHJldigmbWFzLCBtaW4pOw0KKwlyY3VfcmVhZF91bmxvY2soKTsNCisJ cmV0dXJuIGVudHJ5Ow0KK30NCitFWFBPUlRfU1lNQk9MX0dQTChtdF9wcmV2KTsNCisNCisvKioN CisgKiBtYXNfcGF1c2UoKSAtIFBhdXNlIGEgbWFzX2ZpbmQvbWFzX2Zvcl9lYWNoIHRvIGRyb3Ag dGhlIGxvY2suDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlIHRvIHBhdXNlDQorICoNCisgKiBT b21lIHVzZXJzIG5lZWQgdG8gcGF1c2UgYSB3YWxrIGFuZCBkcm9wIHRoZSBsb2NrIHRoZXkncmUg aG9sZGluZyBpbg0KKyAqIG9yZGVyIHRvIHlpZWxkIHRvIGEgaGlnaGVyIHByaW9yaXR5IHRocmVh ZCBvciBjYXJyeSBvdXQgYW4gb3BlcmF0aW9uDQorICogb24gYW4gZW50cnkuICBUaG9zZSB1c2Vy cyBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSB0aGV5IGRyb3ANCisgKiB0aGUgbG9j ay4gIEl0IHJlc2V0cyB0aGUgQG1hcyB0byBiZSBzdWl0YWJsZSBmb3IgdGhlIG5leHQgaXRlcmF0 aW9uDQorICogb2YgdGhlIGxvb3AgYWZ0ZXIgdGhlIHVzZXIgaGFzIHJlYWNxdWlyZWQgdGhlIGxv Y2suICBJZiBtb3N0IGVudHJpZXMNCisgKiBmb3VuZCBkdXJpbmcgYSB3YWxrIHJlcXVpcmUgeW91 IHRvIGNhbGwgbWFzX3BhdXNlKCksIHRoZSBtdF9mb3JfZWFjaCgpDQorICogaXRlcmF0b3IgbWF5 IGJlIG1vcmUgYXBwcm9wcmlhdGUuDQorICoNCisgKi8NCit2b2lkIG1hc19wYXVzZShzdHJ1Y3Qg bWFfc3RhdGUgKm1hcykNCit7DQorCW1hcy0+bm9kZSA9IE1BU19QQVVTRTsNCit9DQorRVhQT1JU X1NZTUJPTF9HUEwobWFzX3BhdXNlKTsNCisNCisvKioNCisgKiBtYXNfZmluZCgpIC0gT24gdGhl IGZpcnN0IGNhbGwsIGZpbmQgdGhlIGVudHJ5IGF0IG9yIGFmdGVyIG1hcy0+aW5kZXggdXAgdG8N CisgKiAlbWF4LiAgT3RoZXJ3aXNlLCBmaW5kIHRoZSBlbnRyeSBhZnRlciBtYXMtPmluZGV4Lg0K KyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtYXg6IFRoZSBtYXhpbXVtIHZhbHVlIHRv IGNoZWNrLg0KKyAqDQorICogTXVzdCBob2xkIHJjdV9yZWFkX2xvY2sgb3IgdGhlIHdyaXRlIGxv Y2suDQorICogSWYgYW4gZW50cnkgZXhpc3RzLCBsYXN0IGFuZCBpbmRleCBhcmUgdXBkYXRlZCBh Y2NvcmRpbmdseS4NCisgKiBNYXkgc2V0IEBtYXMtPm5vZGUgdG8gTUFTX05PTkUuDQorICoNCisg KiBSZXR1cm46IFRoZSBlbnRyeSBvciAlTlVMTC4NCisgKi8NCit2b2lkICptYXNfZmluZChzdHJ1 Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtYXgpDQorew0KKwlpZiAodW5saWtlbHko bWFzX2lzX3BhdXNlZChtYXMpKSkgew0KKwkJaWYgKHVubGlrZWx5KG1hcy0+bGFzdCA9PSBVTE9O R19NQVgpKSB7DQorCQkJbWFzLT5ub2RlID0gTUFTX05PTkU7DQorCQkJcmV0dXJuIE5VTEw7DQor CQl9DQorCQltYXMtPm5vZGUgPSBNQVNfU1RBUlQ7DQorCQltYXMtPmluZGV4ID0gKyttYXMtPmxh c3Q7DQorCX0NCisNCisJaWYgKHVubGlrZWx5KG1hc19pc19zdGFydChtYXMpKSkgew0KKwkJLyog Rmlyc3QgcnVuIG9yIGNvbnRpbnVlICovDQorCQl2b2lkICplbnRyeTsNCisNCisJCWlmIChtYXMt PmluZGV4ID4gbWF4KQ0KKwkJCXJldHVybiBOVUxMOw0KKw0KKwkJZW50cnkgPSBtYXNfd2Fsayht YXMpOw0KKwkJaWYgKGVudHJ5KQ0KKwkJCXJldHVybiBlbnRyeTsNCisJfQ0KKw0KKwlpZiAodW5s aWtlbHkoIW1hc19zZWFyY2hhYmxlKG1hcykpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCS8qIFJl dHJpZXMgb24gZGVhZCBub2RlcyBoYW5kbGVkIGJ5IG1hc19uZXh0X2VudHJ5ICovDQorCXJldHVy biBtYXNfbmV4dF9lbnRyeShtYXMsIG1heCk7DQorfQ0KKw0KKy8qKg0KKyAqIG1hc19maW5kX3Jl djogT24gdGhlIGZpcnN0IGNhbGwsIGZpbmQgdGhlIGZpcnN0IG5vbi1udWxsIGVudHJ5IGF0IG9y IGJlbG93DQorICogbWFzLT5pbmRleCBkb3duIHRvICVtaW4uICBPdGhlcndpc2UgZmluZCB0aGUg Zmlyc3Qgbm9uLW51bGwgZW50cnkgYmVsb3cNCisgKiBtYXMtPmluZGV4IGRvd24gdG8gJW1pbi4N CisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWluOiBUaGUgbWluaW11bSB2YWx1ZSB0 byBjaGVjay4NCisgKg0KKyAqIE11c3QgaG9sZCByY3VfcmVhZF9sb2NrIG9yIHRoZSB3cml0ZSBs b2NrLg0KKyAqIElmIGFuIGVudHJ5IGV4aXN0cywgbGFzdCBhbmQgaW5kZXggYXJlIHVwZGF0ZWQg YWNjb3JkaW5nbHkuDQorICogTWF5IHNldCBAbWFzLT5ub2RlIHRvIE1BU19OT05FLg0KKyAqDQor ICogUmV0dXJuOiBUaGUgZW50cnkgb3IgJU5VTEwuDQorICovDQordm9pZCAqbWFzX2ZpbmRfcmV2 KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbikNCit7DQorCWlmICh1bmxp a2VseShtYXNfaXNfcGF1c2VkKG1hcykpKSB7DQorCQlpZiAodW5saWtlbHkobWFzLT5sYXN0ID09 IFVMT05HX01BWCkpIHsNCisJCQltYXMtPm5vZGUgPSBNQVNfTk9ORTsNCisJCQlyZXR1cm4gTlVM TDsNCisJCX0NCisJCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisJCW1hcy0+bGFzdCA9IC0tbWFz LT5pbmRleDsNCisJfQ0KKw0KKwlpZiAodW5saWtlbHkobWFzX2lzX3N0YXJ0KG1hcykpKSB7DQor CQkvKiBGaXJzdCBydW4gb3IgY29udGludWUgKi8NCisJCXZvaWQgKmVudHJ5Ow0KKw0KKwkJaWYg KG1hcy0+aW5kZXggPCBtaW4pDQorCQkJcmV0dXJuIE5VTEw7DQorDQorCQllbnRyeSA9IG1hc193 YWxrKG1hcyk7DQorCQlpZiAoZW50cnkpDQorCQkJcmV0dXJuIGVudHJ5Ow0KKwl9DQorDQorCWlm ICh1bmxpa2VseSghbWFzX3NlYXJjaGFibGUobWFzKSkpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJ aWYgKG1hcy0+aW5kZXggPCBtaW4pDQorCQlyZXR1cm4gTlVMTDsNCisNCisJLyogUmV0cmllcyBv biBkZWFkIG5vZGVzIGhhbmRsZWQgYnkgbWFzX25leHRfZW50cnkgKi8NCisJcmV0dXJuIG1hc19w cmV2X2VudHJ5KG1hcywgbWluKTsNCit9DQorRVhQT1JUX1NZTUJPTF9HUEwobWFzX2ZpbmQpOw0K Kw0KKy8qKg0KKyAqIG1hc19lcmFzZSgpIC0gRmluZCB0aGUgcmFuZ2UgaW4gd2hpY2ggaW5kZXgg cmVzaWRlcyBhbmQgZXJhc2UgdGhlIGVudGlyZQ0KKyAqIHJhbmdlLg0KKyAqIEBtYXM6IFRoZSBt YXBsZSBzdGF0ZQ0KKyAqDQorICogTXVzdCBob2xkIHRoZSB3cml0ZSBsb2NrLg0KKyAqIFNlYXJj aGVzIGZvciBAbWFzLT5pbmRleCwgc2V0cyBAbWFzLT5pbmRleCBhbmQgQG1hcy0+bGFzdCB0byB0 aGUgcmFuZ2UgYW5kDQorICogZXJhc2VzIHRoYXQgcmFuZ2UuDQorICoNCisgKiBSZXR1cm46IHRo ZSBlbnRyeSB0aGF0IHdhcyBlcmFzZWQgb3IgJU5VTEwsIEBtYXMtPmluZGV4IGFuZCBAbWFzLT5s YXN0IGFyZSB1cGRhdGVkLg0KKyAqLw0KK3ZvaWQgKm1hc19lcmFzZShzdHJ1Y3QgbWFfc3RhdGUg Km1hcykNCit7DQorCXZvaWQgKmVudHJ5Ow0KKwlNQV9XUl9TVEFURSh3cl9tYXMsIG1hcywgTlVM TCk7DQorDQorCWlmIChtYXNfaXNfbm9uZShtYXMpIHx8IG1hc19pc19wYXVzZWQobWFzKSkNCisJ CW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisNCisJLyogUmV0cnkgdW5uZWNlc3Nhcnkgd2hlbiBo b2xkaW5nIHRoZSB3cml0ZSBsb2NrLiAqLw0KKwllbnRyeSA9IG1hc19zdGF0ZV93YWxrKG1hcyk7 DQorCWlmICghZW50cnkpDQorCQlyZXR1cm4gTlVMTDsNCisNCit3cml0ZV9yZXRyeToNCisJLyog TXVzdCByZXNldCB0byBlbnN1cmUgc3Bhbm5pbmcgd3JpdGVzIG9mIGxhc3Qgc2xvdCBhcmUgZGV0 ZWN0ZWQgKi8NCisJbWFzX3Jlc2V0KG1hcyk7DQorCW1hc193cl9zdG9yZV9zZXR1cCgmd3JfbWFz KTsNCisJbWFzX3dyX3N0b3JlX2VudHJ5KCZ3cl9tYXMpOw0KKwlpZiAobWFzX25vbWVtKG1hcywg R0ZQX0tFUk5FTCkpDQorCQlnb3RvIHdyaXRlX3JldHJ5Ow0KKw0KKwlyZXR1cm4gZW50cnk7DQor fQ0KK0VYUE9SVF9TWU1CT0xfR1BMKG1hc19lcmFzZSk7DQorDQorLyoqDQorICogbWFzX25vbWVt KCkgLSBDaGVjayBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgYWxsb2NhdGluZyBhbmQgZG8gdGhlIGFs bG9jYXRpb24NCisgKiBpZiBuZWNlc3NhcnkgSWYgdGhlcmUgYXJlIGFsbG9jYXRpb25zLCB0aGVu IGZyZWUgdGhlbS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZ2ZwOiBUaGUgR0ZQ X0ZMQUdTIHRvIHVzZSBmb3IgYWxsb2NhdGlvbnMNCisgKiBSZXR1cm46IHRydWUgb24gYWxsb2Nh dGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0KK2Jvb2wgbWFzX25vbWVtKHN0cnVjdCBtYV9z dGF0ZSAqbWFzLCBnZnBfdCBnZnApDQorCV9fbXVzdF9ob2xkKG1hcy0+dHJlZS0+bG9jaykNCit7 DQorCWlmIChsaWtlbHkobWFzLT5ub2RlICE9IE1BX0VSUk9SKC1FTk9NRU0pKSkgew0KKwkJbWFz X2Rlc3Ryb3kobWFzKTsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwlpZiAoZ2ZwZmxhZ3Nf YWxsb3dfYmxvY2tpbmcoZ2ZwKSAmJiAhbXRfZXh0ZXJuYWxfbG9jayhtYXMtPnRyZWUpKSB7DQor CQltdHJlZV91bmxvY2sobWFzLT50cmVlKTsNCisJCW1hc19hbGxvY19ub2RlcyhtYXMsIGdmcCk7 DQorCQltdHJlZV9sb2NrKG1hcy0+dHJlZSk7DQorCX0gZWxzZSB7DQorCQltYXNfYWxsb2Nfbm9k ZXMobWFzLCBnZnApOw0KKwl9DQorDQorCWlmICghbWFzX2FsbG9jYXRlZChtYXMpKQ0KKwkJcmV0 dXJuIGZhbHNlOw0KKw0KKwltYXMtPm5vZGUgPSBNQVNfU1RBUlQ7DQorCXJldHVybiB0cnVlOw0K K30NCisNCit2b2lkIF9faW5pdCBtYXBsZV90cmVlX2luaXQodm9pZCkNCit7DQorCW1hcGxlX25v ZGVfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibWFwbGVfbm9kZSIsDQorCQkJc2l6ZW9mKHN0 cnVjdCBtYXBsZV9ub2RlKSwgc2l6ZW9mKHN0cnVjdCBtYXBsZV9ub2RlKSwNCisJCQlTTEFCX1BB TklDLCBOVUxMKTsNCit9DQorDQorLyoqDQorICogbXRyZWVfbG9hZCgpIC0gTG9hZCBhIHZhbHVl IHN0b3JlZCBpbiBhIG1hcGxlIHRyZWUNCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGlu ZGV4OiBUaGUgaW5kZXggdG8gbG9hZA0KKyAqDQorICogUmV0dXJuOiB0aGUgZW50cnkgb3IgJU5V TEwNCisgKi8NCit2b2lkICptdHJlZV9sb2FkKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWdu ZWQgbG9uZyBpbmRleCkNCit7DQorCU1BX1NUQVRFKG1hcywgbXQsIGluZGV4LCBpbmRleCk7DQor CXZvaWQgKmVudHJ5Ow0KKw0KKwl0cmFjZV9tYV9yZWFkKF9fZnVuY19fLCAmbWFzKTsNCisJcmN1 X3JlYWRfbG9jaygpOw0KK3JldHJ5Og0KKwllbnRyeSA9IG1hc19zdGFydCgmbWFzKTsNCisJaWYg KHVubGlrZWx5KG1hc19pc19ub25lKCZtYXMpKSkNCisJCWdvdG8gdW5sb2NrOw0KKw0KKwlpZiAo dW5saWtlbHkobWFzX2lzX3B0cigmbWFzKSkpIHsNCisJCWlmIChpbmRleCkNCisJCQllbnRyeSA9 IE5VTEw7DQorDQorCQlnb3RvIHVubG9jazsNCisJfQ0KKw0KKwllbnRyeSA9IG10cmVlX2xvb2t1 cF93YWxrKCZtYXMpOw0KKwlpZiAoIWVudHJ5ICYmIHVubGlrZWx5KG1hc19pc19zdGFydCgmbWFz KSkpDQorCQlnb3RvIHJldHJ5Ow0KK3VubG9jazoNCisJcmN1X3JlYWRfdW5sb2NrKCk7DQorCWlm ICh4YV9pc196ZXJvKGVudHJ5KSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlyZXR1cm4gZW50cnk7 DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfbG9hZCk7DQorDQorLyoqDQorICogbXRyZWVfc3Rv cmVfcmFuZ2UoKSAtIFN0b3JlIGFuIGVudHJ5IGF0IGEgZ2l2ZW4gcmFuZ2UuDQorICogQG10OiBU aGUgbWFwbGUgdHJlZQ0KKyAqIEBpbmRleDogVGhlIHN0YXJ0IG9mIHRoZSByYW5nZQ0KKyAqIEBs YXN0OiBUaGUgZW5kIG9mIHRoZSByYW5nZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3Jl DQorICogQGdmcDogVGhlIEdGUF9GTEFHUyB0byB1c2UgZm9yIGFsbG9jYXRpb25zDQorICoNCisg KiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBvbiBpbnZhbGlkIHJlcXVlc3QsIC1FTk9N RU0gaWYgbWVtb3J5IGNvdWxkIG5vdA0KKyAqIGJlIGFsbG9jYXRlZC4NCisgKi8NCitpbnQgbXRy ZWVfc3RvcmVfcmFuZ2Uoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4 LA0KKwkJdW5zaWduZWQgbG9uZyBsYXN0LCB2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKQ0KK3sNCisJ TUFfU1RBVEUobWFzLCBtdCwgaW5kZXgsIGxhc3QpOw0KKwlNQV9XUl9TVEFURSh3cl9tYXMsICZt YXMsIGVudHJ5KTsNCisNCisJdHJhY2VfbWFfd3JpdGUoX19mdW5jX18sICZtYXMsIDAsIGVudHJ5 KTsNCisJaWYgKFdBUk5fT05fT05DRSh4YV9pc19hZHZhbmNlZChlbnRyeSkpKQ0KKwkJcmV0dXJu IC1FSU5WQUw7DQorDQorCWlmIChpbmRleCA+IGxhc3QpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisN CisJbXRyZWVfbG9jayhtdCk7DQorcmV0cnk6DQorCW1hc193cl9zdG9yZV9lbnRyeSgmd3JfbWFz KTsNCisJaWYgKG1hc19ub21lbSgmbWFzLCBnZnApKQ0KKwkJZ290byByZXRyeTsNCisNCisJbXRy ZWVfdW5sb2NrKG10KTsNCisJaWYgKG1hc19pc19lcnIoJm1hcykpDQorCQlyZXR1cm4geGFfZXJy KG1hcy5ub2RlKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfc3Rv cmVfcmFuZ2UpOw0KKw0KKy8qKg0KKyAqIG10cmVlX3N0b3JlKCkgLSBTdG9yZSBhbiBlbnRyeSBh dCBhIGdpdmVuIGluZGV4Lg0KKyAqIEBtdDogVGhlIG1hcGxlIHRyZWUNCisgKiBAaW5kZXg6IFRo ZSBpbmRleCB0byBzdG9yZSB0aGUgdmFsdWUNCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBzdG9y ZQ0KKyAqIEBnZnA6IFRoZSBHRlBfRkxBR1MgdG8gdXNlIGZvciBhbGxvY2F0aW9ucw0KKyAqDQor ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgb24gaW52YWxpZCByZXF1ZXN0LCAtRU5P TUVNIGlmIG1lbW9yeSBjb3VsZCBub3QNCisgKiBiZSBhbGxvY2F0ZWQuDQorICovDQoraW50IG10 cmVlX3N0b3JlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRleCwgdm9p ZCAqZW50cnksDQorCQkgZ2ZwX3QgZ2ZwKQ0KK3sNCisJcmV0dXJuIG10cmVlX3N0b3JlX3Jhbmdl KG10LCBpbmRleCwgaW5kZXgsIGVudHJ5LCBnZnApOw0KK30NCitFWFBPUlRfU1lNQk9MKG10cmVl X3N0b3JlKTsNCisNCisvKioNCisgKiBtdHJlZV9pbnNlcnRfcmFuZ2UoKSAtIEluc2VydCBhbiBl bnRyeSBhdCBhIGdpdmUgcmFuZ2UgaWYgdGhlcmUgaXMgbm8gdmFsdWUuDQorICogQG10OiBUaGUg bWFwbGUgdHJlZQ0KKyAqIEBmaXJzdDogVGhlIHN0YXJ0IG9mIHRoZSByYW5nZQ0KKyAqIEBsYXN0 OiBUaGUgZW5kIG9mIHRoZSByYW5nZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlDQor ICogQGdmcDogVGhlIEdGUF9GTEFHUyB0byB1c2UgZm9yIGFsbG9jYXRpb25zLg0KKyAqDQorICog UmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FRVhJU1RTIGlmIHRoZSByYW5nZSBpcyBvY2N1cGllZCwg LUVJTlZBTCBvbiBpbnZhbGlkDQorICogcmVxdWVzdCwgLUVOT01FTSBpZiBtZW1vcnkgY291bGQg bm90IGJlIGFsbG9jYXRlZC4NCisgKi8NCitpbnQgbXRyZWVfaW5zZXJ0X3JhbmdlKHN0cnVjdCBt YXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBmaXJzdCwNCisJCXVuc2lnbmVkIGxvbmcgbGFz dCwgdm9pZCAqZW50cnksIGdmcF90IGdmcCkNCit7DQorCU1BX1NUQVRFKG1zLCBtdCwgZmlyc3Qs IGxhc3QpOw0KKw0KKwlpZiAoV0FSTl9PTl9PTkNFKHhhX2lzX2FkdmFuY2VkKGVudHJ5KSkpDQor CQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKGZpcnN0ID4gbGFzdCkNCisJCXJldHVybiAtRUlO VkFMOw0KKw0KKwltdHJlZV9sb2NrKG10KTsNCityZXRyeToNCisJbWFzX2luc2VydCgmbXMsIGVu dHJ5KTsNCisJaWYgKG1hc19ub21lbSgmbXMsIGdmcCkpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwlt dHJlZV91bmxvY2sobXQpOw0KKwlpZiAobWFzX2lzX2VycigmbXMpKQ0KKwkJcmV0dXJuIHhhX2Vy cihtcy5ub2RlKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfaW5z ZXJ0X3JhbmdlKTsNCisNCisvKioNCisgKiBtdHJlZV9pbnNlcnQoKSAtIEluc2VydCBhbiBlbnRy eSBhdCBhIGdpdmUgaW5kZXggaWYgdGhlcmUgaXMgbm8gdmFsdWUuDQorICogQG10OiBUaGUgbWFw bGUgdHJlZQ0KKyAqIEBpbmRleCA6IFRoZSBpbmRleCB0byBzdG9yZSB0aGUgdmFsdWUNCisgKiBA ZW50cnk6IFRoZSBlbnRyeSB0byBzdG9yZQ0KKyAqIEBnZnA6IFRoZSBGR1BfRkxBR1MgdG8gdXNl IGZvciBhbGxvY2F0aW9ucy4NCisgKg0KKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUVYSVNU UyBpZiB0aGUgcmFuZ2UgaXMgb2NjdXBpZWQsIC1FSU5WQUwgb24gaW52YWxpZA0KKyAqIHJlcXVl c3QsIC1FTk9NRU0gaWYgbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuDQorICovDQoraW50 IG10cmVlX2luc2VydChzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgaW5kZXgs IHZvaWQgKmVudHJ5LA0KKwkJIGdmcF90IGdmcCkNCit7DQorCXJldHVybiBtdHJlZV9pbnNlcnRf cmFuZ2UobXQsIGluZGV4LCBpbmRleCwgZW50cnksIGdmcCk7DQorfQ0KK0VYUE9SVF9TWU1CT0wo bXRyZWVfaW5zZXJ0KTsNCisNCitpbnQgbXRyZWVfYWxsb2NfcmFuZ2Uoc3RydWN0IG1hcGxlX3Ry ZWUgKm10LCB1bnNpZ25lZCBsb25nICpzdGFydHAsDQorCQl2b2lkICplbnRyeSwgdW5zaWduZWQg bG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIG1pbiwNCisJCXVuc2lnbmVkIGxvbmcgbWF4LCBnZnBf dCBnZnApDQorew0KKwlpbnQgcmV0ID0gMDsNCisNCisJTUFfU1RBVEUobWFzLCBtdCwgbWluLCBt YXggLSBzaXplKTsNCisJaWYgKCFtdF9pc19hbGxvYyhtdCkpDQorCQlyZXR1cm4gLUVJTlZBTDsN CisNCisJaWYgKFdBUk5fT05fT05DRShtdF9pc19yZXNlcnZlZChlbnRyeSkpKQ0KKwkJcmV0dXJu IC1FSU5WQUw7DQorDQorCWlmIChtaW4gPiBtYXgpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJ aWYgKG1heCA8IHNpemUpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKCFzaXplKQ0KKwkJ cmV0dXJuIC1FSU5WQUw7DQorDQorCW10cmVlX2xvY2sobXQpOw0KK3JldHJ5Og0KKwltYXMub2Zm c2V0ID0gMDsNCisJbWFzLmluZGV4ID0gbWluOw0KKwltYXMubGFzdCA9IG1heCAtIHNpemU7DQor CXJldCA9IG1hc19hbGxvYygmbWFzLCBlbnRyeSwgc2l6ZSwgc3RhcnRwKTsNCisJaWYgKG1hc19u b21lbSgmbWFzLCBnZnApKQ0KKwkJZ290byByZXRyeTsNCisNCisJbXRyZWVfdW5sb2NrKG10KTsN CisJcmV0dXJuIHJldDsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9hbGxvY19yYW5nZSk7DQor DQoraW50IG10cmVlX2FsbG9jX3JyYW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVk IGxvbmcgKnN0YXJ0cCwNCisJCXZvaWQgKmVudHJ5LCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2ln bmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9uZyBtYXgsIGdmcF90IGdmcCkNCit7DQorCWlu dCByZXQgPSAwOw0KKw0KKwlNQV9TVEFURShtYXMsIG10LCBtaW4sIG1heCAtIHNpemUpOw0KKwlp ZiAoIW10X2lzX2FsbG9jKG10KSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAoV0FSTl9P Tl9PTkNFKG10X2lzX3Jlc2VydmVkKGVudHJ5KSkpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJ aWYgKG1pbiA+PSBtYXgpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKG1heCA8IHNpemUg LSAxKQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCWlmICghc2l6ZSkNCisJCXJldHVybiAtRUlO VkFMOw0KKw0KKwltdHJlZV9sb2NrKG10KTsNCityZXRyeToNCisJcmV0ID0gbWFzX3Jldl9hbGxv YygmbWFzLCBtaW4sIG1heCwgZW50cnksIHNpemUsIHN0YXJ0cCk7DQorCWlmIChtYXNfbm9tZW0o Jm1hcywgZ2ZwKSkNCisJCWdvdG8gcmV0cnk7DQorDQorCW10cmVlX3VubG9jayhtdCk7DQorCXJl dHVybiByZXQ7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfYWxsb2NfcnJhbmdlKTsNCisNCisv KioNCisgKiBtdHJlZV9lcmFzZSgpIC0gRmluZCBhbiBpbmRleCBhbmQgZXJhc2UgdGhlIGVudGly ZSByYW5nZS4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4OiBUaGUgaW5kZXgg dG8gZXJhc2UNCisgKg0KKyAqIEVyYXNpbmcgaXMgdGhlIHNhbWUgYXMgYSB3YWxrIHRvIGFuIGVu dHJ5IHRoZW4gYSBzdG9yZSBvZiBhIE5VTEwgdG8gdGhhdA0KKyAqIEVOVElSRSByYW5nZS4gIElu IGZhY3QsIGl0IGlzIGltcGxlbWVudGVkIGFzIHN1Y2ggdXNpbmcgdGhlIGFkdmFuY2VkIEFQSS4N CisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IHN0b3JlZCBhdCB0aGUgQGluZGV4IG9yICVOVUxM DQorICovDQordm9pZCAqbXRyZWVfZXJhc2Uoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25l ZCBsb25nIGluZGV4KQ0KK3sNCisJdm9pZCAqZW50cnkgPSBOVUxMOw0KKw0KKwlNQV9TVEFURSht YXMsIG10LCBpbmRleCwgaW5kZXgpOw0KKwl0cmFjZV9tYV9vcChfX2Z1bmNfXywgJm1hcyk7DQor DQorCW10cmVlX2xvY2sobXQpOw0KKwllbnRyeSA9IG1hc19lcmFzZSgmbWFzKTsNCisJbXRyZWVf dW5sb2NrKG10KTsNCisNCisJcmV0dXJuIGVudHJ5Ow0KK30NCitFWFBPUlRfU1lNQk9MKG10cmVl X2VyYXNlKTsNCisNCisvKioNCisgKiBfX210X2Rlc3Ryb3koKSAtIFdhbGsgYW5kIGZyZWUgYWxs IG5vZGVzIG9mIGEgbG9ja2VkIG1hcGxlIHRyZWUuDQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0K KyAqDQorICogTm90ZTogRG9lcyBub3QgaGFuZGxlIGxvY2tpbmcuDQorICovDQordm9pZCBfX210 X2Rlc3Ryb3koc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJdm9pZCAqcm9vdCA9IG10X3Jv b3RfbG9ja2VkKG10KTsNCisNCisJcmN1X2Fzc2lnbl9wb2ludGVyKG10LT5tYV9yb290LCBOVUxM KTsNCisJaWYgKHhhX2lzX25vZGUocm9vdCkpDQorCQltdGVfZGVzdHJveV93YWxrKHJvb3QsIG10 KTsNCisNCisJbXQtPm1hX2ZsYWdzID0gMDsNCit9DQorRVhQT1JUX1NZTUJPTF9HUEwoX19tdF9k ZXN0cm95KTsNCisNCisvKioNCisgKiBtdHJlZV9kZXN0cm95KCkgLSBEZXN0cm95IGEgbWFwbGUg dHJlZQ0KKyAqIEBtdDogVGhlIG1hcGxlIHRyZWUNCisgKg0KKyAqIEZyZWVzIGFsbCByZXNvdXJj ZXMgdXNlZCBieSB0aGUgdHJlZS4gIEhhbmRsZXMgbG9ja2luZy4NCisgKi8NCit2b2lkIG10cmVl X2Rlc3Ryb3koc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJbXRyZWVfbG9jayhtdCk7DQor CV9fbXRfZGVzdHJveShtdCk7DQorCW10cmVlX3VubG9jayhtdCk7DQorfQ0KK0VYUE9SVF9TWU1C T0wobXRyZWVfZGVzdHJveSk7DQorDQorLyoqDQorICogbXRfZmluZCgpIC0gU2VhcmNoIGZyb20g dGhlIHN0YXJ0IHVwIHVudGlsIGFuIGVudHJ5IGlzIGZvdW5kLg0KKyAqIEBtdDogVGhlIG1hcGxl IHRyZWUNCisgKiBAaW5kZXg6IFBvaW50ZXIgd2hpY2ggY29udGFpbnMgdGhlIHN0YXJ0IGxvY2F0 aW9uIG9mIHRoZSBzZWFyY2gNCisgKiBAbWF4OiBUaGUgbWF4aW11bSB2YWx1ZSB0byBjaGVjaw0K KyAqDQorICogSGFuZGxlcyBsb2NraW5nLiAgQGluZGV4IHdpbGwgYmUgaW5jcmVtZW50ZWQgdG8g b25lIGJleW9uZCB0aGUgcmFuZ2UuDQorICoNCisgKiBSZXR1cm46IFRoZSBlbnRyeSBhdCBvciBh ZnRlciB0aGUgQGluZGV4IG9yICVOVUxMDQorICovDQordm9pZCAqbXRfZmluZChzdHJ1Y3QgbWFw bGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgKmluZGV4LCB1bnNpZ25lZCBsb25nIG1heCkNCit7 DQorCU1BX1NUQVRFKG1hcywgbXQsICppbmRleCwgKmluZGV4KTsNCisJdm9pZCAqZW50cnk7DQor I2lmZGVmIENPTkZJR19ERUJVR19NQVBMRV9UUkVFDQorCXVuc2lnbmVkIGxvbmcgY29weSA9ICpp bmRleDsNCisjZW5kaWYNCisNCisJdHJhY2VfbWFfcmVhZChfX2Z1bmNfXywgJm1hcyk7DQorDQor CWlmICgoKmluZGV4KSA+IG1heCkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlyY3VfcmVhZF9sb2Nr KCk7DQorcmV0cnk6DQorCWVudHJ5ID0gbWFzX3N0YXRlX3dhbGsoJm1hcyk7DQorCWlmIChtYXNf aXNfc3RhcnQoJm1hcykpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwlpZiAodW5saWtlbHkoeGFfaXNf emVybyhlbnRyeSkpKQ0KKwkJZW50cnkgPSBOVUxMOw0KKw0KKwlpZiAoZW50cnkpDQorCQlnb3Rv IHVubG9jazsNCisNCisJd2hpbGUgKG1hc19zZWFyY2hhYmxlKCZtYXMpICYmIChtYXMuaW5kZXgg PCBtYXgpKSB7DQorCQllbnRyeSA9IG1hc19uZXh0X2VudHJ5KCZtYXMsIG1heCk7DQorCQlpZiAo bGlrZWx5KGVudHJ5ICYmICF4YV9pc196ZXJvKGVudHJ5KSkpDQorCQkJYnJlYWs7DQorCX0NCisN CisJaWYgKHVubGlrZWx5KHhhX2lzX3plcm8oZW50cnkpKSkNCisJCWVudHJ5ID0gTlVMTDsNCit1 bmxvY2s6DQorCXJjdV9yZWFkX3VubG9jaygpOw0KKwlpZiAobGlrZWx5KGVudHJ5KSkgew0KKwkJ KmluZGV4ID0gbWFzLmxhc3QgKyAxOw0KKyNpZmRlZiBDT05GSUdfREVCVUdfTUFQTEVfVFJFRQ0K KwkJaWYgKCgqaW5kZXgpICYmICgqaW5kZXgpIDw9IGNvcHkpDQorCQkJcHJfZXJyKCJpbmRleCBu b3QgaW5jcmVhc2VkISAlbHggPD0gJWx4XG4iLA0KKwkJCSAgICAgICAqaW5kZXgsIGNvcHkpOw0K KwkJTVRfQlVHX09OKG10LCAoKmluZGV4KSAmJiAoKCppbmRleCkgPD0gY29weSkpOw0KKyNlbmRp Zg0KKwl9DQorDQorCXJldHVybiBlbnRyeTsNCit9DQorRVhQT1JUX1NZTUJPTChtdF9maW5kKTsN CisNCisvKioNCisgKiBtdF9maW5kX2FmdGVyKCkgLSBTZWFyY2ggZnJvbSB0aGUgc3RhcnQgdXAg dW50aWwgYW4gZW50cnkgaXMgZm91bmQuDQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqIEBp bmRleDogUG9pbnRlciB3aGljaCBjb250YWlucyB0aGUgc3RhcnQgbG9jYXRpb24gb2YgdGhlIHNl YXJjaA0KKyAqIEBtYXg6IFRoZSBtYXhpbXVtIHZhbHVlIHRvIGNoZWNrDQorICoNCisgKiBIYW5k bGVzIGxvY2tpbmcsIGRldGVjdHMgd3JhcHBpbmcgb24gaW5kZXggPT0gMA0KKyAqDQorICogUmV0 dXJuOiBUaGUgZW50cnkgYXQgb3IgYWZ0ZXIgdGhlIEBpbmRleCBvciAlTlVMTA0KKyAqLw0KK3Zv aWQgKm10X2ZpbmRfYWZ0ZXIoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nICpp bmRleCwNCisJCSAgICB1bnNpZ25lZCBsb25nIG1heCkNCit7DQorCWlmICghKCppbmRleCkpDQor CQlyZXR1cm4gTlVMTDsNCisNCisJcmV0dXJuIG10X2ZpbmQobXQsIGluZGV4LCBtYXgpOw0KK30N CitFWFBPUlRfU1lNQk9MKG10X2ZpbmRfYWZ0ZXIpOw0KKw0KKyNpZmRlZiBDT05GSUdfREVCVUdf TUFQTEVfVFJFRQ0KK2F0b21pY190IG1hcGxlX3RyZWVfdGVzdHNfcnVuOw0KK0VYUE9SVF9TWU1C T0xfR1BMKG1hcGxlX3RyZWVfdGVzdHNfcnVuKTsNCithdG9taWNfdCBtYXBsZV90cmVlX3Rlc3Rz X3Bhc3NlZDsNCitFWFBPUlRfU1lNQk9MX0dQTChtYXBsZV90cmVlX3Rlc3RzX3Bhc3NlZCk7DQor DQorI2lmbmRlZiBfX0tFUk5FTF9fDQorZXh0ZXJuIHZvaWQga21lbV9jYWNoZV9zZXRfbm9uX2tl cm5lbChzdHJ1Y3Qga21lbV9jYWNoZSAqLCB1bnNpZ25lZCBpbnQpOw0KK3ZvaWQgbXRfc2V0X25v bl9rZXJuZWwodW5zaWduZWQgaW50IHZhbCkNCit7DQorCWttZW1fY2FjaGVfc2V0X25vbl9rZXJu ZWwobWFwbGVfbm9kZV9jYWNoZSwgdmFsKTsNCit9DQorDQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcg a21lbV9jYWNoZV9nZXRfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKik7DQordW5zaWduZWQgbG9u ZyBtdF9nZXRfYWxsb2Nfc2l6ZSh2b2lkKQ0KK3sNCisJcmV0dXJuIGttZW1fY2FjaGVfZ2V0X2Fs bG9jKG1hcGxlX25vZGVfY2FjaGUpOw0KK30NCisNCitleHRlcm4gdm9pZCBrbWVtX2NhY2hlX3pl cm9fbnJfdGFsbG9jYXRlZChzdHJ1Y3Qga21lbV9jYWNoZSAqKTsNCit2b2lkIG10X3plcm9fbnJf dGFsbG9jYXRlZCh2b2lkKQ0KK3sNCisJa21lbV9jYWNoZV96ZXJvX25yX3RhbGxvY2F0ZWQobWFw bGVfbm9kZV9jYWNoZSk7DQorfQ0KKw0KK2V4dGVybiB1bnNpZ25lZCBpbnQga21lbV9jYWNoZV9u cl90YWxsb2NhdGVkKHN0cnVjdCBrbWVtX2NhY2hlICopOw0KK3Vuc2lnbmVkIGludCBtdF9ucl90 YWxsb2NhdGVkKHZvaWQpDQorew0KKwlyZXR1cm4ga21lbV9jYWNoZV9ucl90YWxsb2NhdGVkKG1h cGxlX25vZGVfY2FjaGUpOw0KK30NCisNCitleHRlcm4gdW5zaWduZWQgaW50IGttZW1fY2FjaGVf bnJfYWxsb2NhdGVkKHN0cnVjdCBrbWVtX2NhY2hlICopOw0KK3Vuc2lnbmVkIGludCBtdF9ucl9h bGxvY2F0ZWQodm9pZCkNCit7DQorCXJldHVybiBrbWVtX2NhY2hlX25yX2FsbG9jYXRlZChtYXBs ZV9ub2RlX2NhY2hlKTsNCit9DQorDQorLyoNCisgKiBtYXNfZGVhZF9ub2RlKCkgLSBDaGVjayBp ZiB0aGUgbWFwbGUgc3RhdGUgaXMgcG9pbnRpbmcgdG8gYSBkZWFkIG5vZGUuDQorICogQG1hczog VGhlIG1hcGxlIHN0YXRlDQorICogQGluZGV4OiBUaGUgaW5kZXggdG8gcmVzdG9yZSBpbiBAbWFz Lg0KKyAqDQorICogVXNlZCBpbiB0ZXN0IGNvZGUuDQorICogUmV0dXJuOiAxIGlmIEBtYXMgaGFz IGJlZW4gcmVzZXQgdG8gTUFTX1NUQVJULCAwIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5s aW5lIGludCBtYXNfZGVhZF9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25n IGluZGV4KQ0KK3sNCisJaWYgKHVubGlrZWx5KCFtYXNfc2VhcmNoYWJsZShtYXMpIHx8IG1hc19p c19zdGFydChtYXMpKSkNCisJCXJldHVybiAwOw0KKw0KKwlpZiAobGlrZWx5KCFtdGVfZGVhZF9u b2RlKG1hcy0+bm9kZSkpKQ0KKwkJcmV0dXJuIDA7DQorDQorCW1hc19yZXdhbGsobWFzLCBpbmRl eCk7DQorCXJldHVybiAxOw0KK30NCisjZW5kaWYgLyogbm90IGRlZmluZWQgX19LRVJORUxfXyAq Lw0KKw0KKy8qDQorICogbWFzX2dldF9zbG90KCkgLSBHZXQgdGhlIGVudHJ5IGluIHRoZSBtYXBs ZSBzdGF0ZSBub2RlIHN0b3JlZCBhdCBAb2Zmc2V0Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0 ZQ0KKyAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUgc2xvdCBhcnJheSB0byBmZXRjaC4N CisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IHN0b3JlZCBhdCBAb2Zmc2V0Lg0KKyAqLw0KK3N0 YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX2Vub2RlICptYXNfZ2V0X3Nsb3Qoc3RydWN0IG1hX3N0 YXRlICptYXMsDQorCQl1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorCXJldHVybiBtYXNfc2xv dChtYXMsIG1hX3Nsb3RzKG1hc19tbihtYXMpLCBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSkpLA0K KwkJCW9mZnNldCk7DQorfQ0KKw0KKw0KKy8qDQorICogbWFzX2ZpcnN0X2VudHJ5KCkgLSBHbyB0 aGUgZmlyc3QgbGVhZiBhbmQgZmluZCB0aGUgZmlyc3QgZW50cnkuDQorICogQG1hczogdGhlIG1h cGxlIHN0YXRlLg0KKyAqIEBsaW1pdDogdGhlIG1heGltdW0gaW5kZXggdG8gY2hlY2suDQorICog QCpyX3N0YXJ0OiBQb2ludGVyIHRvIHNldCB0byB0aGUgcmFuZ2Ugc3RhcnQuDQorICoNCisgKiBT ZXRzIG1hcy0+b2Zmc2V0IHRvIHRoZSBvZmZzZXQgb2YgdGhlIGVudHJ5LCByX3N0YXJ0IHRvIHRo ZSByYW5nZSBtaW5pbXVtLg0KKyAqDQorICogUmV0dXJuOiBUaGUgZmlyc3QgZW50cnkgb3IgTUFT X05PTkUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkICptYXNfZmlyc3RfZW50cnkoc3RydWN0 IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYXBsZV9ub2RlICptbiwNCisJCXVuc2lnbmVkIGxvbmcg bGltaXQsIGVudW0gbWFwbGVfdHlwZSBtdCkNCisNCit7DQorCXVuc2lnbmVkIGxvbmcgbWF4Ow0K Kwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdm9pZCAq ZW50cnkgPSBOVUxMOw0KKw0KKwltYXMtPmluZGV4ID0gbWFzLT5taW47DQorCWlmIChtYXMtPmlu ZGV4ID4gbGltaXQpDQorCQlnb3RvIG5vbmU7DQorDQorCW1heCA9IG1hcy0+bWF4Ow0KKwltYXMt Pm9mZnNldCA9IDA7DQorCXdoaWxlIChsaWtlbHkoIW1hX2lzX2xlYWYobXQpKSkgew0KKwkJTVRf QlVHX09OKG1hcy0+dHJlZSwgbXRlX2RlYWRfbm9kZShtYXMtPm5vZGUpKTsNCisJCXNsb3RzID0g bWFfc2xvdHMobW4sIG10KTsNCisJCXBpdm90cyA9IG1hX3Bpdm90cyhtbiwgbXQpOw0KKwkJbWF4 ID0gcGl2b3RzWzBdOw0KKwkJZW50cnkgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCAwKTsNCisJCWlm ICh1bmxpa2VseShtYV9kZWFkX25vZGUobW4pKSkNCisJCQlyZXR1cm4gTlVMTDsNCisJCW1hcy0+ bm9kZSA9IGVudHJ5Ow0KKwkJbW4gPSBtYXNfbW4obWFzKTsNCisJCW10ID0gbXRlX25vZGVfdHlw ZShtYXMtPm5vZGUpOw0KKwl9DQorCU1UX0JVR19PTihtYXMtPnRyZWUsIG10ZV9kZWFkX25vZGUo bWFzLT5ub2RlKSk7DQorDQorCW1hcy0+bWF4ID0gbWF4Ow0KKwlzbG90cyA9IG1hX3Nsb3RzKG1u LCBtdCk7DQorCWVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywgMCk7DQorCWlmICh1bmxpa2Vs eShtYV9kZWFkX25vZGUobW4pKSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwkvKiBTbG90IDAgb3Ig MSBtdXN0IGJlIHNldCAqLw0KKwlpZiAobWFzLT5pbmRleCA+IGxpbWl0KQ0KKwkJZ290byBub25l Ow0KKw0KKwlpZiAobGlrZWx5KGVudHJ5KSkNCisJCXJldHVybiBlbnRyeTsNCisNCisJcGl2b3Rz ID0gbWFfcGl2b3RzKG1uLCBtdCk7DQorCW1hcy0+aW5kZXggPSBwaXZvdHNbMF0gKyAxOw0KKwlt YXMtPm9mZnNldCA9IDE7DQorCWVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywgMSk7DQorCWlm ICh1bmxpa2VseShtYV9kZWFkX25vZGUobW4pKSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlpZiAo bWFzLT5pbmRleCA+IGxpbWl0KQ0KKwkJZ290byBub25lOw0KKw0KKwlpZiAobGlrZWx5KGVudHJ5 KSkNCisJCXJldHVybiBlbnRyeTsNCisNCitub25lOg0KKwlpZiAobGlrZWx5KCFtYV9kZWFkX25v ZGUobW4pKSkNCisJCW1hcy0+bm9kZSA9IE1BU19OT05FOw0KKwlyZXR1cm4gTlVMTDsNCit9DQor DQorLyogRGVwdGggZmlyc3Qgc2VhcmNoLCBwb3N0LW9yZGVyICovDQorc3RhdGljIHZvaWQgbWFz X2Rmc19wb3N0b3JkZXIoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWF4KQ0K K3sNCisNCisJc3RydWN0IG1hcGxlX2Vub2RlICpwID0gTUFTX05PTkUsICptbiA9IG1hcy0+bm9k ZTsNCisJdW5zaWduZWQgbG9uZyBwX21pbiwgcF9tYXg7DQorDQorCW1hc19uZXh0X25vZGUobWFz LCBtYXNfbW4obWFzKSwgbWF4KTsNCisJaWYgKCFtYXNfaXNfbm9uZShtYXMpKQ0KKwkJcmV0dXJu Ow0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobW4pKQ0KKwkJcmV0dXJuOw0KKw0KKwltYXMtPm5vZGUg PSBtbjsNCisJbWFzX2FzY2VuZChtYXMpOw0KKwl3aGlsZSAobWFzLT5ub2RlICE9IE1BU19OT05F KSB7DQorCQlwID0gbWFzLT5ub2RlOw0KKwkJcF9taW4gPSBtYXMtPm1pbjsNCisJCXBfbWF4ID0g bWFzLT5tYXg7DQorCQltYXNfcHJldl9ub2RlKG1hcywgMCk7DQorCX0NCisNCisJaWYgKHAgPT0g TUFTX05PTkUpDQorCQlyZXR1cm47DQorDQorCW1hcy0+bm9kZSA9IHA7DQorCW1hcy0+bWF4ID0g cF9tYXg7DQorCW1hcy0+bWluID0gcF9taW47DQorfQ0KKw0KKy8qIFRyZWUgdmFsaWRhdGlvbnMg Ki8NCitzdGF0aWMgdm9pZCBtdF9kdW1wX25vZGUoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10 LCB2b2lkICplbnRyeSwNCisJCXVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCwg dW5zaWduZWQgaW50IGRlcHRoKTsNCitzdGF0aWMgdm9pZCBtdF9kdW1wX3JhbmdlKHVuc2lnbmVk IGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCwNCisJCQkgIHVuc2lnbmVkIGludCBkZXB0aCkN Cit7DQorCXN0YXRpYyBjb25zdCBjaGFyIHNwYWNlc1tdID0gIiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIjsNCisNCisJaWYgKG1pbiA9PSBtYXgpDQorCQlwcl9pbmZvKCIlLipzJWx1 OiAiLCBkZXB0aCAqIDIsIHNwYWNlcywgbWluKTsNCisJZWxzZQ0KKwkJcHJfaW5mbygiJS4qcyVs dS0lbHU6ICIsIGRlcHRoICogMiwgc3BhY2VzLCBtaW4sIG1heCk7DQorfQ0KKw0KK3N0YXRpYyB2 b2lkIG10X2R1bXBfZW50cnkodm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25l ZCBsb25nIG1heCwNCisJCQkgIHVuc2lnbmVkIGludCBkZXB0aCkNCit7DQorCW10X2R1bXBfcmFu Z2UobWluLCBtYXgsIGRlcHRoKTsNCisNCisJaWYgKHhhX2lzX3ZhbHVlKGVudHJ5KSkNCisJCXBy X2NvbnQoInZhbHVlICVsZCAoMHglbHgpIFslcF1cbiIsIHhhX3RvX3ZhbHVlKGVudHJ5KSwNCisJ CQkJeGFfdG9fdmFsdWUoZW50cnkpLCBlbnRyeSk7DQorCWVsc2UgaWYgKHhhX2lzX3plcm8oZW50 cnkpKQ0KKwkJcHJfY29udCgiemVybyAoJWxkKVxuIiwgeGFfdG9faW50ZXJuYWwoZW50cnkpKTsN CisJZWxzZSBpZiAobXRfaXNfcmVzZXJ2ZWQoZW50cnkpKQ0KKwkJcHJfY29udCgiVU5LTk9XTiBF TlRSWSAoJXApXG4iLCBlbnRyeSk7DQorCWVsc2UNCisJCXByX2NvbnQoIiVwXG4iLCBlbnRyeSk7 DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG10X2R1bXBfcmFuZ2U2NChjb25zdCBzdHJ1Y3QgbWFwbGVf dHJlZSAqbXQsIHZvaWQgKmVudHJ5LA0KKwkJCXVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBs b25nIG1heCwgdW5zaWduZWQgaW50IGRlcHRoKQ0KK3sNCisJc3RydWN0IG1hcGxlX3JhbmdlXzY0 ICpub2RlID0gJm10ZV90b19ub2RlKGVudHJ5KS0+bXI2NDsNCisJYm9vbCBsZWFmID0gbXRlX2lz X2xlYWYoZW50cnkpOw0KKwl1bnNpZ25lZCBsb25nIGZpcnN0ID0gbWluOw0KKwlpbnQgaTsNCisN CisJcHJfY29udCgiIGNvbnRlbnRzOiAiKTsNCisJZm9yIChpID0gMDsgaSA8IE1BUExFX1JBTkdF NjRfU0xPVFMgLSAxOyBpKyspDQorCQlwcl9jb250KCIlcCAlbHUgIiwgbm9kZS0+c2xvdFtpXSwg bm9kZS0+cGl2b3RbaV0pOw0KKwlwcl9jb250KCIlcFxuIiwgbm9kZS0+c2xvdFtpXSk7DQorCWZv ciAoaSA9IDA7IGkgPCBNQVBMRV9SQU5HRTY0X1NMT1RTOyBpKyspIHsNCisJCXVuc2lnbmVkIGxv bmcgbGFzdCA9IG1heDsNCisNCisJCWlmIChpIDwgKE1BUExFX1JBTkdFNjRfU0xPVFMgLSAxKSkN CisJCQlsYXN0ID0gbm9kZS0+cGl2b3RbaV07DQorCQllbHNlIGlmICghbm9kZS0+c2xvdFtpXSAm JiBtYXggIT0gbXRfbWF4W210ZV9ub2RlX3R5cGUoZW50cnkpXSkNCisJCQlicmVhazsNCisJCWlm IChsYXN0ID09IDAgJiYgaSA+IDApDQorCQkJYnJlYWs7DQorCQlpZiAobGVhZikNCisJCQltdF9k dW1wX2VudHJ5KG10X3Nsb3QobXQsIG5vZGUtPnNsb3QsIGkpLA0KKwkJCQkJZmlyc3QsIGxhc3Qs IGRlcHRoICsgMSk7DQorCQllbHNlIGlmIChub2RlLT5zbG90W2ldKQ0KKwkJCW10X2R1bXBfbm9k ZShtdCwgbXRfc2xvdChtdCwgbm9kZS0+c2xvdCwgaSksDQorCQkJCQlmaXJzdCwgbGFzdCwgZGVw dGggKyAxKTsNCisNCisJCWlmIChsYXN0ID09IG1heCkNCisJCQlicmVhazsNCisJCWlmIChsYXN0 ID4gbWF4KSB7DQorCQkJcHJfZXJyKCJub2RlICVwIGxhc3QgKCVsdSkgPiBtYXggKCVsdSkgYXQg cGl2b3QgJWQhXG4iLA0KKwkJCQkJbm9kZSwgbGFzdCwgbWF4LCBpKTsNCisJCQlicmVhazsNCisJ CX0NCisJCWZpcnN0ID0gbGFzdCArIDE7DQorCX0NCit9DQorDQorc3RhdGljIHZvaWQgbXRfZHVt cF9hcmFuZ2U2NChjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHZvaWQgKmVudHJ5LA0KKwkJ CXVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgaW50IGRlcHRo KQ0KK3sNCisJc3RydWN0IG1hcGxlX2FyYW5nZV82NCAqbm9kZSA9ICZtdGVfdG9fbm9kZShlbnRy eSktPm1hNjQ7DQorCWJvb2wgbGVhZiA9IG10ZV9pc19sZWFmKGVudHJ5KTsNCisJdW5zaWduZWQg bG9uZyBmaXJzdCA9IG1pbjsNCisJaW50IGk7DQorDQorCXByX2NvbnQoIiBjb250ZW50czogIik7 DQorCWZvciAoaSA9IDA7IGkgPCBNQVBMRV9BUkFOR0U2NF9TTE9UUzsgaSsrKQ0KKwkJcHJfY29u dCgiJWx1ICIsIG5vZGUtPmdhcFtpXSk7DQorCXByX2NvbnQoInwgJTAyWCAlMDJYfCAiLCBub2Rl LT5tZXRhLmVuZCwgbm9kZS0+bWV0YS5nYXApOw0KKwlmb3IgKGkgPSAwOyBpIDwgTUFQTEVfQVJB TkdFNjRfU0xPVFMgLSAxOyBpKyspDQorCQlwcl9jb250KCIlcCAlbHUgIiwgbm9kZS0+c2xvdFtp XSwgbm9kZS0+cGl2b3RbaV0pOw0KKwlwcl9jb250KCIlcFxuIiwgbm9kZS0+c2xvdFtpXSk7DQor CWZvciAoaSA9IDA7IGkgPCBNQVBMRV9BUkFOR0U2NF9TTE9UUzsgaSsrKSB7DQorCQl1bnNpZ25l ZCBsb25nIGxhc3QgPSBtYXg7DQorDQorCQlpZiAoaSA8IChNQVBMRV9BUkFOR0U2NF9TTE9UUyAt IDEpKQ0KKwkJCWxhc3QgPSBub2RlLT5waXZvdFtpXTsNCisJCWVsc2UgaWYgKCFub2RlLT5zbG90 W2ldKQ0KKwkJCWJyZWFrOw0KKwkJaWYgKGxhc3QgPT0gMCAmJiBpID4gMCkNCisJCQlicmVhazsN CisJCWlmIChsZWFmKQ0KKwkJCW10X2R1bXBfZW50cnkobXRfc2xvdChtdCwgbm9kZS0+c2xvdCwg aSksDQorCQkJCQlmaXJzdCwgbGFzdCwgZGVwdGggKyAxKTsNCisJCWVsc2UgaWYgKG5vZGUtPnNs b3RbaV0pDQorCQkJbXRfZHVtcF9ub2RlKG10LCBtdF9zbG90KG10LCBub2RlLT5zbG90LCBpKSwN CisJCQkJCWZpcnN0LCBsYXN0LCBkZXB0aCArIDEpOw0KKw0KKwkJaWYgKGxhc3QgPT0gbWF4KQ0K KwkJCWJyZWFrOw0KKwkJaWYgKGxhc3QgPiBtYXgpIHsNCisJCQlwcl9lcnIoIm5vZGUgJXAgbGFz dCAoJWx1KSA+IG1heCAoJWx1KSBhdCBwaXZvdCAlZCFcbiIsDQorCQkJCQlub2RlLCBsYXN0LCBt YXgsIGkpOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJZmlyc3QgPSBsYXN0ICsgMTsNCisJfQ0KK30N CisNCitzdGF0aWMgdm9pZCBtdF9kdW1wX25vZGUoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10 LCB2b2lkICplbnRyeSwNCisJCXVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCwg dW5zaWduZWQgaW50IGRlcHRoKQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUgPSBtdGVf dG9fbm9kZShlbnRyeSk7DQorCXVuc2lnbmVkIGludCB0eXBlID0gbXRlX25vZGVfdHlwZShlbnRy eSk7DQorCXVuc2lnbmVkIGludCBpOw0KKw0KKwltdF9kdW1wX3JhbmdlKG1pbiwgbWF4LCBkZXB0 aCk7DQorDQorCXByX2NvbnQoIm5vZGUgJXAgZGVwdGggJWQgdHlwZSAlZCBwYXJlbnQgJXAiLCBu b2RlLCBkZXB0aCwgdHlwZSwNCisJCQlub2RlID8gbm9kZS0+cGFyZW50IDogTlVMTCk7DQorCXN3 aXRjaCAodHlwZSkgew0KKwljYXNlIG1hcGxlX2RlbnNlOg0KKwkJcHJfY29udCgiXG4iKTsNCisJ CWZvciAoaSA9IDA7IGkgPCBNQVBMRV9OT0RFX1NMT1RTOyBpKyspIHsNCisJCQlpZiAobWluICsg aSA+IG1heCkNCisJCQkJcHJfY29udCgiT1VUIE9GIFJBTkdFOiAiKTsNCisJCQltdF9kdW1wX2Vu dHJ5KG10X3Nsb3QobXQsIG5vZGUtPnNsb3QsIGkpLA0KKwkJCQkJbWluICsgaSwgbWluICsgaSwg ZGVwdGgpOw0KKwkJfQ0KKwkJYnJlYWs7DQorCWNhc2UgbWFwbGVfbGVhZl82NDoNCisJY2FzZSBt YXBsZV9yYW5nZV82NDoNCisJCW10X2R1bXBfcmFuZ2U2NChtdCwgZW50cnksIG1pbiwgbWF4LCBk ZXB0aCk7DQorCQlicmVhazsNCisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQltdF9kdW1wX2Fy YW5nZTY0KG10LCBlbnRyeSwgbWluLCBtYXgsIGRlcHRoKTsNCisJCWJyZWFrOw0KKw0KKwlkZWZh dWx0Og0KKwkJcHJfY29udCgiIFVOS05PV04gVFlQRVxuIik7DQorCX0NCit9DQorDQordm9pZCBt dF9kdW1wKGNvbnN0IHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCXZvaWQgKmVudHJ5ID0g cmN1X2RlcmVmZXJlbmNlX2NoZWNrKG10LT5tYV9yb290LCBtdF9sb2NrZWQobXQpKTsNCisNCisJ cHJfaW5mbygibWFwbGVfdHJlZSglcCkgZmxhZ3MgJVgsIGhlaWdodCAldSByb290ICVwXG4iLA0K KwkJIG10LCBtdC0+bWFfZmxhZ3MsIG10X2hlaWdodChtdCksIGVudHJ5KTsNCisJaWYgKCF4YV9p c19ub2RlKGVudHJ5KSkNCisJCW10X2R1bXBfZW50cnkoZW50cnksIDAsIDAsIDApOw0KKwllbHNl IGlmIChlbnRyeSkNCisJCW10X2R1bXBfbm9kZShtdCwgZW50cnksIDAsIG10X21heFttdGVfbm9k ZV90eXBlKGVudHJ5KV0sIDApOw0KK30NCisNCisvKg0KKyAqIENhbGN1bGF0ZSB0aGUgbWF4aW11 bSBnYXAgaW4gYSBub2RlIGFuZCBjaGVjayBpZiB0aGF0J3Mgd2hhdCBpcyByZXBvcnRlZCBpbg0K KyAqIHRoZSBwYXJlbnQgKHVubGVzcyByb290KS4NCisgKi8NCitzdGF0aWMgdm9pZCBtYXNfdmFs aWRhdGVfZ2FwcyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9k ZSAqbXRlID0gbWFzLT5ub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcF9tbjsNCisJdW5zaWdu ZWQgbG9uZyBnYXAgPSAwLCBtYXhfZ2FwID0gMDsNCisJdW5zaWduZWQgbG9uZyBwX2VuZCwgcF9z dGFydCA9IG1hcy0+bWluOw0KKwl1bnNpZ25lZCBjaGFyIHBfc2xvdDsNCisJdW5zaWduZWQgbG9u ZyAqZ2FwcyA9IE5VTEw7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90cyA9IG1hX3Bpdm90cyhtdGVf dG9fbm9kZShtdGUpLCBtdGVfbm9kZV90eXBlKG10ZSkpOw0KKwlpbnQgaTsNCisNCisJaWYgKG1h X2lzX2RlbnNlKG10ZV9ub2RlX3R5cGUobXRlKSkpIHsNCisJCWZvciAoaSA9IDA7IGkgPCBtdF9z bG90X2NvdW50KG10ZSk7IGkrKykgew0KKwkJCWlmIChtYXNfZ2V0X3Nsb3QobWFzLCBpKSkgew0K KwkJCQlpZiAoZ2FwID4gbWF4X2dhcCkNCisJCQkJCW1heF9nYXAgPSBnYXA7DQorCQkJCWdhcCA9 IDA7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlnYXArKzsNCisJCX0NCisJCWdvdG8gY291 bnRlZDsNCisJfQ0KKw0KKwlnYXBzID0gbWFfZ2FwcyhtdGVfdG9fbm9kZShtdGUpLCBtdGVfbm9k ZV90eXBlKG10ZSkpOw0KKwlmb3IgKGkgPSAwOyBpIDwgbXRfc2xvdF9jb3VudChtdGUpOyBpKysp IHsNCisJCXBfZW5kID0gbWFzX2xvZ2ljYWxfcGl2b3QobWFzLCBwaXZvdHMsIGksIG10ZV9ub2Rl X3R5cGUobXRlKSk7DQorDQorCQlpZiAoIWdhcHMpIHsNCisJCQlpZiAobWFzX2dldF9zbG90KG1h cywgaSkpIHsNCisJCQkJZ2FwID0gMDsNCisJCQkJZ290byBub3RfZW1wdHk7DQorCQkJfQ0KKw0K KwkJCWdhcCArPSBwX2VuZCAtIHBfc3RhcnQgKyAxOw0KKwkJfSBlbHNlIHsNCisJCQl2b2lkICpl bnRyeSA9IG1hc19nZXRfc2xvdChtYXMsIGkpOw0KKw0KKwkJCWdhcCA9IGdhcHNbaV07DQorCQkJ aWYgKCFlbnRyeSkgew0KKwkJCQlpZiAoZ2FwICE9IHBfZW5kIC0gcF9zdGFydCArIDEpIHsNCisJ CQkJCXByX2VycigiJXBbJXVdIC0+ICVwICVsdSAhPSAlbHUgLSAlbHUgKyAxXG4iLA0KKwkJCQkJ CW1hc19tbihtYXMpLCBpLA0KKwkJCQkJCW1hc19nZXRfc2xvdChtYXMsIGkpLCBnYXAsDQorCQkJ CQkJcF9lbmQsIHBfc3RhcnQpOw0KKwkJCQkJbXRfZHVtcChtYXMtPnRyZWUpOw0KKw0KKwkJCQkJ TVRfQlVHX09OKG1hcy0+dHJlZSwNCisJCQkJCQlnYXAgIT0gcF9lbmQgLSBwX3N0YXJ0ICsgMSk7 DQorCQkJCX0NCisJCQl9IGVsc2Ugew0KKwkJCQlpZiAoZ2FwID4gcF9lbmQgLSBwX3N0YXJ0ICsg MSkgew0KKwkJCQkJcHJfZXJyKCIlcFsldV0gJWx1ID49ICVsdSAtICVsdSArIDEgKCVsdSlcbiIs DQorCQkJCQltYXNfbW4obWFzKSwgaSwgZ2FwLCBwX2VuZCwgcF9zdGFydCwNCisJCQkJCXBfZW5k IC0gcF9zdGFydCArIDEpOw0KKwkJCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwNCisJCQkJCQlnYXAg PiBwX2VuZCAtIHBfc3RhcnQgKyAxKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisNCisJCWlmIChn YXAgPiBtYXhfZ2FwKQ0KKwkJCW1heF9nYXAgPSBnYXA7DQorbm90X2VtcHR5Og0KKwkJcF9zdGFy dCA9IHBfZW5kICsgMTsNCisJCWlmIChwX2VuZCA+PSBtYXMtPm1heCkNCisJCQlicmVhazsNCisJ fQ0KKw0KK2NvdW50ZWQ6DQorCWlmIChtdGVfaXNfcm9vdChtdGUpKQ0KKwkJcmV0dXJuOw0KKw0K KwlwX3Nsb3QgPSBtdGVfcGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJcF9tbiA9IG10ZV9wYXJl bnQobXRlKTsNCisJTVRfQlVHX09OKG1hcy0+dHJlZSwgbWF4X2dhcCA+IG1hcy0+bWF4KTsNCisJ aWYgKG1hX2dhcHMocF9tbiwgbWFzX3BhcmVudF9lbnVtKG1hcywgbXRlKSlbcF9zbG90XSAhPSBt YXhfZ2FwKSB7DQorCQlwcl9lcnIoImdhcCAlcFsldV0gIT0gJWx1XG4iLCBwX21uLCBwX3Nsb3Qs IG1heF9nYXApOw0KKwkJbXRfZHVtcChtYXMtPnRyZWUpOw0KKwl9DQorDQorCU1UX0JVR19PTiht YXMtPnRyZWUsDQorCQkgIG1hX2dhcHMocF9tbiwgbWFzX3BhcmVudF9lbnVtKG1hcywgbXRlKSlb cF9zbG90XSAhPSBtYXhfZ2FwKTsNCit9DQorDQorc3RhdGljIHZvaWQgbWFzX3ZhbGlkYXRlX3Bh cmVudF9zbG90KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUg KnBhcmVudDsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpub2RlOw0KKwllbnVtIG1hcGxlX3R5cGUg cF90eXBlID0gbWFzX3BhcmVudF9lbnVtKG1hcywgbWFzLT5ub2RlKTsNCisJdW5zaWduZWQgY2hh ciBwX3Nsb3QgPSBtdGVfcGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJdm9pZCBfX3JjdSAqKnNs b3RzOw0KKwlpbnQgaTsNCisNCisJaWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkpDQorCQlyZXR1 cm47DQorDQorCXBhcmVudCA9IG10ZV9wYXJlbnQobWFzLT5ub2RlKTsNCisJc2xvdHMgPSBtYV9z bG90cyhwYXJlbnQsIHBfdHlwZSk7DQorCU1UX0JVR19PTihtYXMtPnRyZWUsIG1hc19tbihtYXMp ID09IHBhcmVudCk7DQorDQorCS8qIENoZWNrIHByZXYvbmV4dCBwYXJlbnQgc2xvdCBmb3IgZHVw bGljYXRlIG5vZGUgZW50cnkgKi8NCisNCisJZm9yIChpID0gMDsgaSA8IG10X3Nsb3RzW3BfdHlw ZV07IGkrKykgew0KKwkJbm9kZSA9IG1hc19zbG90KG1hcywgc2xvdHMsIGkpOw0KKwkJaWYgKGkg PT0gcF9zbG90KSB7DQorCQkJaWYgKG5vZGUgIT0gbWFzLT5ub2RlKQ0KKwkJCQlwcl9lcnIoInBh cmVudCAlcFsldV0gZG9lcyBub3QgaGF2ZSAlcFxuIiwNCisJCQkJCXBhcmVudCwgaSwgbWFzX21u KG1hcykpOw0KKwkJCU1UX0JVR19PTihtYXMtPnRyZWUsIG5vZGUgIT0gbWFzLT5ub2RlKTsNCisJ CX0gZWxzZSBpZiAobm9kZSA9PSBtYXMtPm5vZGUpIHsNCisJCQlwcl9lcnIoIkludmFsaWQgY2hp bGQgJXAgYXQgcGFyZW50ICVwWyV1XSBwX3Nsb3QgJXVcbiIsDQorCQkJICAgICAgIG1hc19tbiht YXMpLCBwYXJlbnQsIGksIHBfc2xvdCk7DQorCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwgbm9kZSA9 PSBtYXMtPm5vZGUpOw0KKwkJfQ0KKwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG1hc192YWxpZGF0 ZV9jaGlsZF9zbG90KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJZW51bSBtYXBsZV90eXBl IHR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCXZvaWQgX19yY3UgKipzbG90cyA9 IG1hX3Nsb3RzKG10ZV90b19ub2RlKG1hcy0+bm9kZSksIHR5cGUpOw0KKwl1bnNpZ25lZCBsb25n ICpwaXZvdHMgPSBtYV9waXZvdHMobXRlX3RvX25vZGUobWFzLT5ub2RlKSwgdHlwZSk7DQorCXN0 cnVjdCBtYXBsZV9lbm9kZSAqY2hpbGQ7DQorCXVuc2lnbmVkIGNoYXIgaTsNCisNCisJaWYgKG10 ZV9pc19sZWFmKG1hcy0+bm9kZSkpDQorCQlyZXR1cm47DQorDQorCWZvciAoaSA9IDA7IGkgPCBt dF9zbG90c1t0eXBlXTsgaSsrKSB7DQorCQljaGlsZCA9IG1hc19zbG90KG1hcywgc2xvdHMsIGkp Ow0KKwkJaWYgKCFwaXZvdHNbaV0gfHwgcGl2b3RzW2ldID09IG1hcy0+bWF4KQ0KKwkJCWJyZWFr Ow0KKw0KKwkJaWYgKCFjaGlsZCkNCisJCQlicmVhazsNCisNCisJCWlmIChtdGVfcGFyZW50X3Ns b3QoY2hpbGQpICE9IGkpIHsNCisJCQlwcl9lcnIoIlNsb3QgZXJyb3IgYXQgJXBbJXVdOiBjaGls ZCAlcCBoYXMgcHNsb3QgJXVcbiIsDQorCQkJICAgICAgIG1hc19tbihtYXMpLCBpLCBtdGVfdG9f bm9kZShjaGlsZCksDQorCQkJICAgICAgIG10ZV9wYXJlbnRfc2xvdChjaGlsZCkpOw0KKwkJCU1U X0JVR19PTihtYXMtPnRyZWUsIDEpOw0KKwkJfQ0KKw0KKwkJaWYgKG10ZV9wYXJlbnQoY2hpbGQp ICE9IG10ZV90b19ub2RlKG1hcy0+bm9kZSkpIHsNCisJCQlwcl9lcnIoImNoaWxkICVwIGhhcyBw YXJlbnQgJXAgbm90ICVwXG4iLA0KKwkJCSAgICAgICBtdGVfdG9fbm9kZShjaGlsZCksIG10ZV9w YXJlbnQoY2hpbGQpLA0KKwkJCSAgICAgICBtdGVfdG9fbm9kZShtYXMtPm5vZGUpKTsNCisJCQlN VF9CVUdfT04obWFzLT50cmVlLCAxKTsNCisJCX0NCisJfQ0KK30NCisNCisvKg0KKyAqIFZhbGlk YXRlIGFsbCBwaXZvdHMgYXJlIHdpdGhpbiBtYXMtPm1pbiBhbmQgbWFzLT5tYXguDQorICovDQor c3RhdGljIHZvaWQgbWFzX3ZhbGlkYXRlX2xpbWl0cyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7 DQorCWludCBpOw0KKwl1bnNpZ25lZCBsb25nIHByZXZfcGl2ID0gMDsNCisJZW51bSBtYXBsZV90 eXBlIHR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCXZvaWQgX19yY3UgKipzbG90 cyA9IG1hX3Nsb3RzKG10ZV90b19ub2RlKG1hcy0+bm9kZSksIHR5cGUpOw0KKwl1bnNpZ25lZCBs b25nICpwaXZvdHMgPSBtYV9waXZvdHMobWFzX21uKG1hcyksIHR5cGUpOw0KKw0KKwkvKiBhbGwg bGltaXRzIGFyZSBmaW5lIGhlcmUuICovDQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKQ0K KwkJcmV0dXJuOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgbXRfc2xvdHNbdHlwZV07IGkrKykgew0K KwkJdW5zaWduZWQgbG9uZyBwaXY7DQorDQorCQlwaXYgPSBtYXNfc2FmZV9waXZvdChtYXMsIHBp dm90cywgaSwgdHlwZSk7DQorDQorCQlpZiAoIXBpdiAmJiAoaSAhPSAwKSkNCisJCQlicmVhazsN CisNCisJCWlmICghbXRlX2lzX2xlYWYobWFzLT5ub2RlKSkgew0KKwkJCXZvaWQgKmVudHJ5ID0g bWFzX3Nsb3QobWFzLCBzbG90cywgaSk7DQorDQorCQkJaWYgKCFlbnRyeSkNCisJCQkJcHJfZXJy KCIlcFsldV0gY2Fubm90IGJlIG51bGxcbiIsDQorCQkJCSAgICAgICBtYXNfbW4obWFzKSwgaSk7 DQorDQorCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwgIWVudHJ5KTsNCisJCX0NCisNCisJCWlmIChw cmV2X3BpdiA+IHBpdikgew0KKwkJCXByX2VycigiJXBbJXVdIHBpdiAlbHUgPCBwcmV2X3BpdiAl bHVcbiIsDQorCQkJCW1hc19tbihtYXMpLCBpLCBwaXYsIHByZXZfcGl2KTsNCisJCQlNVF9CVUdf T04obWFzLT50cmVlLCBwaXYgPCBwcmV2X3Bpdik7DQorCQl9DQorDQorCQlpZiAocGl2IDwgbWFz LT5taW4pIHsNCisJCQlwcl9lcnIoIiVwWyV1XSAlbHUgPCAlbHVcbiIsIG1hc19tbihtYXMpLCBp LA0KKwkJCQlwaXYsIG1hcy0+bWluKTsNCisJCQlNVF9CVUdfT04obWFzLT50cmVlLCBwaXYgPCBt YXMtPm1pbik7DQorCQl9DQorCQlpZiAocGl2ID4gbWFzLT5tYXgpIHsNCisJCQlwcl9lcnIoIiVw WyV1XSAlbHUgPiAlbHVcbiIsIG1hc19tbihtYXMpLCBpLA0KKwkJCQlwaXYsIG1hcy0+bWF4KTsN CisJCQlNVF9CVUdfT04obWFzLT50cmVlLCBwaXYgPiBtYXMtPm1heCk7DQorCQl9DQorCQlwcmV2 X3BpdiA9IHBpdjsNCisJCWlmIChwaXYgPT0gbWFzLT5tYXgpDQorCQkJYnJlYWs7DQorCX0NCisJ Zm9yIChpICs9IDE7IGkgPCBtdF9zbG90c1t0eXBlXTsgaSsrKSB7DQorCQl2b2lkICplbnRyeSA9 IG1hc19zbG90KG1hcywgc2xvdHMsIGkpOw0KKw0KKwkJaWYgKGVudHJ5ICYmIChpICE9IG10X3Ns b3RzW3R5cGVdIC0gMSkpIHsNCisJCQlwcl9lcnIoIiVwWyV1XSBzaG91bGQgbm90IGhhdmUgZW50 cnkgJXBcbiIsIG1hc19tbihtYXMpLA0KKwkJCSAgICAgICBpLCBlbnRyeSk7DQorCQkJTVRfQlVH X09OKG1hcy0+dHJlZSwgZW50cnkgIT0gTlVMTCk7DQorCQl9DQorDQorCQlpZiAoaSA8IG10X3Bp dm90c1t0eXBlXSkgew0KKwkJCXVuc2lnbmVkIGxvbmcgcGl2ID0gcGl2b3RzW2ldOw0KKw0KKwkJ CWlmICghcGl2KQ0KKwkJCQljb250aW51ZTsNCisNCisJCQlwcl9lcnIoIiVwWyV1XSBzaG91bGQg bm90IGhhdmUgcGl2ICVsdVxuIiwNCisJCQkgICAgICAgbWFzX21uKG1hcyksIGksIHBpdik7DQor CQkJTVRfQlVHX09OKG1hcy0+dHJlZSwgaSA8IG10X3Bpdm90c1t0eXBlXSAtIDEpOw0KKwkJfQ0K Kwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG10X3ZhbGlkYXRlX251bGxzKHN0cnVjdCBtYXBsZV90 cmVlICptdCkNCit7DQorCXZvaWQgKmVudHJ5LCAqbGFzdCA9ICh2b2lkICopMTsNCisJdW5zaWdu ZWQgY2hhciBvZmZzZXQgPSAwOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCU1BX1NUQVRFKG1h cywgbXQsIDAsIDApOw0KKw0KKwltYXNfc3RhcnQoJm1hcyk7DQorCWlmIChtYXNfaXNfbm9uZSgm bWFzKSB8fCAobWFzLm5vZGUgPT0gTUFTX1JPT1QpKQ0KKwkJcmV0dXJuOw0KKw0KKwl3aGlsZSAo IW10ZV9pc19sZWFmKG1hcy5ub2RlKSkNCisJCW1hc19kZXNjZW5kKCZtYXMpOw0KKw0KKwlzbG90 cyA9IG1hX3Nsb3RzKG10ZV90b19ub2RlKG1hcy5ub2RlKSwgbXRlX25vZGVfdHlwZShtYXMubm9k ZSkpOw0KKwlkbyB7DQorCQllbnRyeSA9IG1hc19zbG90KCZtYXMsIHNsb3RzLCBvZmZzZXQpOw0K KwkJaWYgKCFsYXN0ICYmICFlbnRyeSkgew0KKwkJCXByX2VycigiU2VxdWVudGlhbCBudWxscyBl bmQgYXQgJXBbJXVdXG4iLA0KKwkJCQltYXNfbW4oJm1hcyksIG9mZnNldCk7DQorCQl9DQorCQlN VF9CVUdfT04obXQsICFsYXN0ICYmICFlbnRyeSk7DQorCQlsYXN0ID0gZW50cnk7DQorCQlpZiAo b2Zmc2V0ID09IG1hc19kYXRhX2VuZCgmbWFzKSkgew0KKwkJCW1hc19uZXh0X25vZGUoJm1hcywg bWFzX21uKCZtYXMpLCBVTE9OR19NQVgpOw0KKwkJCWlmIChtYXNfaXNfbm9uZSgmbWFzKSkNCisJ CQkJcmV0dXJuOw0KKwkJCW9mZnNldCA9IDA7DQorCQkJc2xvdHMgPSBtYV9zbG90cyhtdGVfdG9f bm9kZShtYXMubm9kZSksDQorCQkJCQkgbXRlX25vZGVfdHlwZShtYXMubm9kZSkpOw0KKwkJfSBl bHNlIHsNCisJCQlvZmZzZXQrKzsNCisJCX0NCisNCisJfSB3aGlsZSAoIW1hc19pc19ub25lKCZt YXMpKTsNCit9DQorDQorLyoNCisgKiB2YWxpZGF0ZSBhIG1hcGxlIHRyZWUgYnkgY2hlY2tpbmc6 DQorICogMS4gVGhlIGxpbWl0cyAocGl2b3RzIGFyZSB3aXRoaW4gbWFzLT5taW4gdG8gbWFzLT5t YXgpDQorICogMi4gVGhlIGdhcCBpcyBjb3JyZWN0bHkgc2V0IGluIHRoZSBwYXJlbnRzDQorICov DQordm9pZCBtdF92YWxpZGF0ZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwl1bnNpZ25l ZCBjaGFyIGVuZDsNCisNCisJTUFfU1RBVEUobWFzLCBtdCwgMCwgMCk7DQorCXJjdV9yZWFkX2xv Y2soKTsNCisJbWFzX3N0YXJ0KCZtYXMpOw0KKwlpZiAoIW1hc19zZWFyY2hhYmxlKCZtYXMpKQ0K KwkJZ290byBkb25lOw0KKw0KKwltYXNfZmlyc3RfZW50cnkoJm1hcywgbWFzX21uKCZtYXMpLCBV TE9OR19NQVgsIG10ZV9ub2RlX3R5cGUobWFzLm5vZGUpKTsNCisJd2hpbGUgKCFtYXNfaXNfbm9u ZSgmbWFzKSkgew0KKwkJTVRfQlVHX09OKG1hcy50cmVlLCBtdGVfZGVhZF9ub2RlKG1hcy5ub2Rl KSk7DQorCQlpZiAoIW10ZV9pc19yb290KG1hcy5ub2RlKSkgew0KKwkJCWVuZCA9IG1hc19kYXRh X2VuZCgmbWFzKTsNCisJCQlpZiAoKGVuZCA8IG10X21pbl9zbG90X2NvdW50KG1hcy5ub2RlKSkg JiYNCisJCQkgICAgKG1hcy5tYXggIT0gVUxPTkdfTUFYKSkgew0KKwkJCQlwcl9lcnIoIkludmFs aWQgc2l6ZSAldSBvZiAlcFxuIiwgZW5kLA0KKwkJCQltYXNfbW4oJm1hcykpOw0KKwkJCQlNVF9C VUdfT04obWFzLnRyZWUsIDEpOw0KKwkJCX0NCisNCisJCX0NCisJCW1hc192YWxpZGF0ZV9wYXJl bnRfc2xvdCgmbWFzKTsNCisJCW1hc192YWxpZGF0ZV9jaGlsZF9zbG90KCZtYXMpOw0KKwkJbWFz X3ZhbGlkYXRlX2xpbWl0cygmbWFzKTsNCisJCWlmIChtdF9pc19hbGxvYyhtdCkpDQorCQkJbWFz X3ZhbGlkYXRlX2dhcHMoJm1hcyk7DQorCQltYXNfZGZzX3Bvc3RvcmRlcigmbWFzLCBVTE9OR19N QVgpOw0KKwl9DQorCW10X3ZhbGlkYXRlX251bGxzKG10KTsNCitkb25lOg0KKwlyY3VfcmVhZF91 bmxvY2soKTsNCisNCit9DQorDQorI2VuZGlmIC8qIENPTkZJR19ERUJVR19NQVBMRV9UUkVFICov DQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlLy5naXRpZ25vcmUgYi90b29s cy90ZXN0aW5nL3JhZGl4LXRyZWUvLmdpdGlnbm9yZQ0KaW5kZXggZDk3MTUxNjQwMWU2Li5jOTAx ZDk2ZGQwMTMgMTAwNjQ0DQotLS0gYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvLmdpdGlnbm9y ZQ0KKysrIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlLy5naXRpZ25vcmUNCkBAIC02LDMgKzYs NSBAQCBtYWluDQogbXVsdGlvcmRlcg0KIHJhZGl4LXRyZWUuYw0KIHhhcnJheQ0KK21hcGxlDQor bWFfeGFfYmVuY2htYXJrDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2dl bmVyYXRlZC9hdXRvY29uZi5oIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2dlbmVyYXRlZC9h dXRvY29uZi5oDQppbmRleCAyMjE4YjNjYzE4NGUuLmU3ZGE4MDM1MDIzNiAxMDA2NDQNCi0tLSBh L3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9nZW5lcmF0ZWQvYXV0b2NvbmYuaA0KKysrIGIvdG9v bHMvdGVzdGluZy9yYWRpeC10cmVlL2dlbmVyYXRlZC9hdXRvY29uZi5oDQpAQCAtMSArMSwyIEBA DQogI2RlZmluZSBDT05GSUdfWEFSUkFZX01VTFRJIDENCisjZGVmaW5lIENPTkZJR182NEJJVCAx DQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L21hcGxlX3RyZWUu aCBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9tYXBsZV90cmVlLmgNCm5ldyBmaWxl IG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLjdkOGQxZjQ0NWI4OQ0KLS0tIC9kZXYv bnVsbA0KKysrIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L21hcGxlX3RyZWUuaA0K QEAgLTAsMCArMSw3IEBADQorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArICov DQorI2RlZmluZSBhdG9taWNfdCBpbnQzMl90DQorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2luY2x1 ZGUvbGludXgvbWFwbGVfdHJlZS5oIg0KKyNkZWZpbmUgYXRvbWljX2luYyh4KSB1YXRvbWljX2lu Yyh4KQ0KKyNkZWZpbmUgYXRvbWljX3JlYWQoeCkgdWF0b21pY19yZWFkKHgpDQorI2RlZmluZSBh dG9taWNfc2V0KHgsIHkpIGRvIHt9IHdoaWxlICgwKQ0KKyNkZWZpbmUgVThfTUFYIFVDSEFSX01B WA0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9tYXBsZS5jIGIvdG9vbHMv dGVzdGluZy9yYWRpeC10cmVlL21hcGxlLmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAw MDAwMDAwMDAwMDAuLjM1MDgyNjcxOTI4YQ0KLS0tIC9kZXYvbnVsbA0KKysrIGIvdG9vbHMvdGVz dGluZy9yYWRpeC10cmVlL21hcGxlLmMNCkBAIC0wLDAgKzEsNTkgQEANCisvLyBTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogR1BMLTIuMCsNCisvKg0KKyAqIG1hcGxlX3RyZWUuYzogVXNlcnNwYWNl IHNoaW0gZm9yIG1hcGxlIHRyZWUgdGVzdC1zdWl0ZQ0KKyAqIENvcHlyaWdodCAoYykgMjAxOCBM aWFtIFIuIEhvd2xldHQgPExpYW0uSG93bGV0dEBPcmFjbGUuY29tPg0KKyAqLw0KKw0KKyNkZWZp bmUgQ09ORklHX0RFQlVHX01BUExFX1RSRUUNCisjZGVmaW5lIENPTkZJR19NQVBMRV9TRUFSQ0gN CisjaW5jbHVkZSAidGVzdC5oIg0KKw0KKyNkZWZpbmUgbW9kdWxlX2luaXQoeCkNCisjZGVmaW5l IG1vZHVsZV9leGl0KHgpDQorI2RlZmluZSBNT0RVTEVfQVVUSE9SKHgpDQorI2RlZmluZSBNT0RV TEVfTElDRU5TRSh4KQ0KKyNkZWZpbmUgZHVtcF9zdGFjaygpCWFzc2VydCgwKQ0KKw0KKyNpbmNs dWRlICIuLi8uLi8uLi9saWIvbWFwbGVfdHJlZS5jIg0KKyN1bmRlZiBDT05GSUdfREVCVUdfTUFQ TEVfVFJFRQ0KKyNpbmNsdWRlICIuLi8uLi8uLi9saWIvdGVzdF9tYXBsZV90cmVlLmMiDQorDQor dm9pZCBmYXJtZXJfdGVzdHModm9pZCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0K KwlERUZJTkVfTVRSRUUodHJlZSk7DQorDQorCW10X2R1bXAoJnRyZWUpOw0KKw0KKwl0cmVlLm1h X3Jvb3QgPSB4YV9ta192YWx1ZSgwKTsNCisJbXRfZHVtcCgmdHJlZSk7DQorDQorCW5vZGUgPSBt dF9hbGxvY19vbmUoR0ZQX0tFUk5FTCk7DQorCW5vZGUtPnBhcmVudCA9ICh2b2lkICopKCh1bnNp Z25lZCBsb25nKSgmdHJlZSkgfCAxKTsNCisJbm9kZS0+c2xvdFswXSA9IHhhX21rX3ZhbHVlKDAp Ow0KKwlub2RlLT5zbG90WzFdID0geGFfbWtfdmFsdWUoMSk7DQorCW5vZGUtPm1yNjQucGl2b3Rb MF0gPSAwOw0KKwlub2RlLT5tcjY0LnBpdm90WzFdID0gMTsNCisJbm9kZS0+bXI2NC5waXZvdFsy XSA9IDA7DQorCXRyZWUubWFfcm9vdCA9IG10X21rX25vZGUobm9kZSwgbWFwbGVfbGVhZl82NCk7 DQorCW10X2R1bXAoJnRyZWUpOw0KKw0KKwltYV9mcmVlX3JjdShub2RlKTsNCit9DQorDQordm9p ZCBtYXBsZV90cmVlX3Rlc3RzKHZvaWQpDQorew0KKwlmYXJtZXJfdGVzdHMoKTsNCisJbWFwbGVf dHJlZV9zZWVkKCk7DQorCW1hcGxlX3RyZWVfaGFydmVzdCgpOw0KK30NCisNCitpbnQgX193ZWFr IG1haW4odm9pZCkNCit7DQorCW1hcGxlX3RyZWVfaW5pdCgpOw0KKwltYXBsZV90cmVlX3Rlc3Rz KCk7DQorCXJjdV9iYXJyaWVyKCk7DQorCWlmIChucl9hbGxvY2F0ZWQpDQorCQlwcmludGYoIm5y X2FsbG9jYXRlZCA9ICVkXG4iLCBucl9hbGxvY2F0ZWQpOw0KKwlyZXR1cm4gMDsNCit9DQpkaWZm IC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVl LmggYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvdHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaA0K bmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAwMDAwMC4uOTdkMGUxZGRjZjA4DQot LS0gL2Rldi9udWxsDQorKysgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvdHJhY2UvZXZlbnRz L21hcGxlX3RyZWUuaA0KQEAgLTAsMCArMSw1IEBADQorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZp ZXI6IEdQTC0yLjArICovDQorDQorI2RlZmluZSB0cmFjZV9tYV9vcChhLCBiKSBkbyB7fSB3aGls ZSAoMCkNCisjZGVmaW5lIHRyYWNlX21hX3JlYWQoYSwgYikgZG8ge30gd2hpbGUgKDApDQorI2Rl ZmluZSB0cmFjZV9tYV93cml0ZShhLCBiLCBjLCBkKSBkbyB7fSB3aGlsZSAoMCkNCi0tIA0KMi4z NS4xDQo=