From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 29DF146AE2 for ; Mon, 1 Jan 2024 14:15:17 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4FD0B68CE49; Mon, 1 Jan 2024 16:13:46 +0200 (EET) Received: from APC01-TYZ-obe.outbound.protection.outlook.com (mail-tyzapc01olkn2103.outbound.protection.outlook.com [40.92.107.103]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D855968CE20 for ; Mon, 1 Jan 2024 16:13:42 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=lJuf1kOpoeFX/rIjkwLPngsttQcqvfQZJ7bfgtXmuBmn3tizle85oO1LmKVc/Y6n9T9XrAkCmMiotSIgKeNdCFESLCmQ6IgqdF1UkNnv2iH5cfVhz1ZiLZOZPslOuoibQRrxYe3PRh0MeA6JnorkNNJMwUGL+hhPU8zElS8mEfvYBBnYYl6vLji6G4V+V6LTAAU4VgtrafMyZZlM3eAaly5UGCUzaHzmWkKlce7kLBa9bBsqu9gCQKSzk7Hupsm0jRvtl9xRSEK0dkm+SD7pfDyzD/1KDGdZBhLpxc2MvP5+W8ez+cXakur4PxiIkEz7vTVIM2PTVnkqiELMOq6gOQ== 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=mQ6syhW152I2gGqO1Gz7r+vlWcA/4o9r+g3F33ouVBk=; b=LaYUzjzqSH3BMxfUB+o82Qim5+andhnh/dAMhE0peNFqH5Fmc+MUWLbxzhp5Pu6qtDjEg6caCcC4j3C48hVJKZS4xWQf1abnfVCwNZdgtRTcjsmKSc5KY4FaGQaaHwycjzgsF7GVWdL7ft8EbeCMDz5ITLFN4/z7PUWr27x4C6a1uwM4XncfWleqGm1iDZXsIEib77AN5kl0tI7Yir9+XZ7GF+ExrM7k9v1Z7xXWz1Dg8XcUqsNPt1ccVoY9cxsbyZS4JN6zaZ5RPehUkB4EPSpdWToKIUmLegXjPWicVKYvijuW/G/o5yeOuHICI8fi5EowXkxzXER7CSdLHuPt2A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=mQ6syhW152I2gGqO1Gz7r+vlWcA/4o9r+g3F33ouVBk=; b=vP3BbAvefteqGhIWnSV9VEK72M1JkddHjjqzyhvbOg2A65xFoGigqno+5X2BNlHASjlICLHiEXt+bO8uR5eVPUFcdQhdgpBkrq9Zcr5tRKX3Xp03VxC25DLXX99g8/OadPoTcHCrY8Cl3knzGnJduOg0tLdL8rycOTCKDfWHY8DUYxXsQ3rBuoYaw6EJLSqZDwktFKqaeEqZzH04ltHloPD1y8jJTrE7f+162r/pX6k4GiEioVDxHFYuHKDw0WE77cI08rifIq4kSF6xj/SovUcd/P9UYKehGM8fsV5Oj5zgXicTw+NSgKk0F7+rqD3QuuWNR+wmmdUcjX/FWLP6Nw== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by TYZPR06MB3965.apcprd06.prod.outlook.com (2603:1096:400:23::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7135.25; Mon, 1 Jan 2024 14:13:27 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::e139:fd7a:1b66:a3f7]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::e139:fd7a:1b66:a3f7%6]) with mapi id 15.20.7135.023; Mon, 1 Jan 2024 14:13:27 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Mon, 1 Jan 2024 22:12:34 +0800 Message-ID: X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240101141239.6623-1-nuomi2021@gmail.com> References: <20240101141239.6623-1-nuomi2021@gmail.com> X-TMN: [6ErGptb/vBxgjRI4hq3xEJMQXiIQCNes] X-ClientProxiedBy: SI1PR02CA0012.apcprd02.prod.outlook.com (2603:1096:4:1f7::8) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240101141239.6623-9-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|TYZPR06MB3965:EE_ X-MS-Office365-Filtering-Correlation-Id: 129fcc3a-7e69-4acf-c8b6-08dc0ad3d2bb X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: b5mXhKMlMvXx+r09k6AoyLOEbqIZp4Gg2BoUTAlNbyYGRPBMWoOmHVjcU+XE0o+V3J51TfYISky9Ldxp8ct67nMMmRq3C+V+up3+c7Br7tPmLcM+Hy+yOb0Px9iU1/5VHmzTvH+X28QpAFm1JCRngFvMQlcPrPC37gmqLEOXShe96wd8wPq37doHW8wPXvN8dyL+SW2OTKbWFM86FZvYMlqy7S+v3L3XtfYvKnhgoQAkn07YQDAKVgbC0AY/35hzPuh0VlPcmzpjdlymKwZC656gxLjjEOrDpMANRStUGRiGzTLhgnEWlySkTJvsltOxf48grw4o2mVW/bmNbve55bCsMUv4LgQXochs3X5uXzjrRzhA5YtZ1myO0P/2gpkjovKqzV2EQNZv+5mByOIhvac08gbsgUwLso0BSdREAI8VjxcATPDGXtdx+VxLOYtzcUssvZNI+Os3wsQrv3QXy2newOmNfNz4WBeCx+PkqdL6Rf+b3bmNT7Ac94lZx2C1nN1nBW2uGnP/RgBpQPZae4oCO1m8bNZtJ3dyuBw8Hf1sYj5gp8EO6XDJKb+Xw2bSDuBxoEk41aUYvmAdhv1izfAlmBz0p7fi2LWEaJxYX80YWdmrYBotf7RYZXKWC5qh X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MlVWcEJSY3dYT28wZ0ZGRmQ5VVg5ZEpRUGhWK2pjYWdWdlp4MkhQKytrZjdR?= =?utf-8?B?YzBZUUliK01UaHBZczM3MUVFVXVDaUg1OWJJY0tDTTBocGllWGRXcU9hUHd6?= =?utf-8?B?UkxnN2VvMmgvYm9YbXdWaEZGZThLOGRYbnpvTUM5aXFKRzQ0MVlsY2hqU3p6?= =?utf-8?B?ZFU3N1RlVTIzSFc1Y09KZVdWK3dPNCtPUVhDZUtiSnhYTzBNekwvcERqNk1j?= =?utf-8?B?SVo0dUVDYm0vR3NRamU0V0dyQ2xwOFlMZmRIcnhiSmJ1Sm9nUEJicWpvc1Ro?= =?utf-8?B?TGtVYVE3azlnek9aQWpJOEhTbi90WWtqS3R6QmZyY2tXSTBiV3Y5aWowQndn?= =?utf-8?B?L1Btd0ZWREtMSzJEK2FNU253dUM4N0dzbjdJcnFMUUpZc0JDMGgvUTh3VlRE?= =?utf-8?B?czJvNFVpK1ZCMzcwblN2WVkvbmZLcnFvU2o5K3VPZmNHNFZKbmFldk5ZZjlO?= =?utf-8?B?Zzh6Q1BXV25ad2FiWGY1RjEyWm8zakcxQWhBTTEzK0dqUlYva01Xc0NJd2F4?= =?utf-8?B?cWJhUkhXdkwzOTFPUTFmNFFoOWZLb1haS3p1a0MrNkE3SmZGOVAvOWZVUjlL?= =?utf-8?B?czBsTDZJS0lNdGZtKzZzSUVJZWptOFFtWE1tSlFWV1pxbUJWOGNpNkhydVB1?= =?utf-8?B?MnFua0ZrUTZDckI5Y1lSclV0VGwyclhQTzJmRDlqa0dmdENaeGdweHg2dHR0?= =?utf-8?B?TDJXNW1mTHVWT3huS0prTFNDd3dyUCtJUWdrSDV4QTlVYXl5Uk1FVmJhUUpW?= =?utf-8?B?NEh3MlhNeDVtaHVCUXdTOGJldzc4SGFkcVRxZDlCTVEzckhqeG1PNmRqblpZ?= =?utf-8?B?c1VOMGFUeEwwZFcraFBGbGM3ZHIrSkZ1RXgyQ3R5djZRbWdXRTdNOGczRUJt?= =?utf-8?B?cTg4SmdKbHQyOVh1V0hDbnZIdFJIcDNMWFE0OHdhOU5ONmhBQ1hJTGdRTXBp?= =?utf-8?B?aFVZNHNieTBLK2dzNWh0RDR0UnBINFE4RTlCWFJhcUh4Z1Y0dWNSUzNTS3Rj?= =?utf-8?B?SmxXQWlNL1piWjZoWXA3NThNM2o1ekdkVUY1NTJGazJRVHN3ZEV3dkRQbS9y?= =?utf-8?B?bUYvZUpzR2tmdnZ2emQrUjQ5VHYwSkg1eUFCNGEyZVR2S1JQRktjeEVPdXFH?= =?utf-8?B?cFVUWG14RGU2UEllRDFHNTNjLzNUellVOFo4TXpXNFl3TlJHWlByT0FFL0xa?= =?utf-8?B?bVgxbUl2SmptQ3YySVlWZExyYnd6T1FLR1lCTkJybVg3WWNPT21wVjF4Q3Fn?= =?utf-8?B?dnhZb3NEY0RGb1d6b3hDYkJiQkJMRmpWZ2pvK2NETFBHbElxdnZ1eGljZUdF?= =?utf-8?B?MHkvTEl1U3BRdittbkNVTE96ckg3TjhGWHcvZkt6OUxkTTErVTVVOXpSTklR?= =?utf-8?B?ZEk5MGttVmJ6NnlROHMxVWEwUE56ZTR5ek1GVXNtTVJhTnVRSWtha1pVWTIy?= =?utf-8?B?MzZEdFpMS3FsUVhFV0p5WmZHNnN1RVZlbnI0MVlXcW8yemZoT2d3ZzZERmll?= =?utf-8?B?ZlJlMi9EYkZUWWxYbk5xWk5iNytGdjliSHB2UlJkM2t1a3JpV2FDOXlhSjR4?= =?utf-8?B?WWIwVmdoTlQwWHhaRG9mN1d3T0RkRVFnMEZRQ09ycjFFblRxVHhmZVd0d0VQ?= =?utf-8?B?TEFQN3JoQWpJM3N6TGdCOVJsb2ZqRXRaaVNjdmZsK0ltMURXb3BGeEN0WVJ5?= =?utf-8?Q?OpRljUJuw/w1QbM1Gww5?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 129fcc3a-7e69-4acf-c8b6-08dc0ad3d2bb X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jan 2024 14:13:27.2092 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR06MB3965 Subject: [FFmpeg-devel] [PATCH v9 08/13] vvcdec: add intra prediction X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Frank Plowman , Nuo Mi , Xu Mu , Shaun Loo , Wu Jianhua Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Q28tYXV0aG9yZWQtYnk6IFh1IE11IDx0b3h1bXVAb3V0bG9vay5jb20+CkNvLWF1dGhvcmVkLWJ5 OiBGcmFuayBQbG93bWFuIDxwb3N0QGZyYW5rcGxvd21hbi5jb20+CkNvLWF1dGhvcmVkLWJ5OiBT aGF1biBMb28gPHNoYXVubG9vMTBAZ21haWwuY29tPgpDby1hdXRob3JlZC1ieTogV3UgSmlhbmh1 YSA8dG9xc3h3QG91dGxvb2suY29tPgotLS0KIGxpYmF2Y29kZWMvdnZjL01ha2VmaWxlICAgICAg ICAgICAgIHwgICAgMSArCiBsaWJhdmNvZGVjL3Z2Yy92dmNfY3R1LmMgICAgICAgICAgICB8ICAg NTAgKysKIGxpYmF2Y29kZWMvdnZjL3Z2Y19jdHUuaCAgICAgICAgICAgIHwgICAgMiArCiBsaWJh dmNvZGVjL3Z2Yy92dmNfaW50cmEuYyAgICAgICAgICB8ICA3OTcgKysrKysrKysrKysrKysrKysr KysrCiBsaWJhdmNvZGVjL3Z2Yy92dmNfaW50cmEuaCAgICAgICAgICB8ICAgNDkgKysKIGxpYmF2 Y29kZWMvdnZjL3Z2Y19pbnRyYV90ZW1wbGF0ZS5jIHwgMTAxNSArKysrKysrKysrKysrKysrKysr KysrKysrKysKIDYgZmlsZXMgY2hhbmdlZCwgMTkxNCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9k ZSAxMDA2NDQgbGliYXZjb2RlYy92dmMvdnZjX2ludHJhLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBs aWJhdmNvZGVjL3Z2Yy92dmNfaW50cmEuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYmF2Y29kZWMv dnZjL3Z2Y19pbnRyYV90ZW1wbGF0ZS5jCgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92dmMvTWFr ZWZpbGUgYi9saWJhdmNvZGVjL3Z2Yy9NYWtlZmlsZQppbmRleCBmMjhhNDdiMGVlLi4zNWJiNTY1 NjgwIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3Z2Yy9NYWtlZmlsZQorKysgYi9saWJhdmNvZGVj L3Z2Yy9NYWtlZmlsZQpAQCAtNSw2ICs1LDcgQEAgT0JKUy0kKENPTkZJR19WVkNfREVDT0RFUikg ICAgICAgICAgKz0gIHZ2Yy92dmNfY2FiYWMubyAgICAgICAgIFwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB2dmMvdnZjX2N0dS5vICAgICAgICAgICBcCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnZjL3Z2Y19kYXRhLm8gICAgICAgICAg XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ2Yy92dmNfaW50ZXIu byAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dmMv dnZjX2ludHJhLm8gICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdnZjL3Z2Y19pdHhfMWQubyAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHZ2Yy92dmNfbXZzLm8gICAgICAgICAgIFwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB2dmMvdnZjX3BzLm8gICAgICAgICAgICBcCmRpZmYg LS1naXQgYS9saWJhdmNvZGVjL3Z2Yy92dmNfY3R1LmMgYi9saWJhdmNvZGVjL3Z2Yy92dmNfY3R1 LmMKaW5kZXggM2QzMWI4NjJhZS4uNjEzOGQyZmM5ZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92 dmMvdnZjX2N0dS5jCisrKyBiL2xpYmF2Y29kZWMvdnZjL3Z2Y19jdHUuYwpAQCAtMjAsMTAgKzIw LDQxIEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs b29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAorI2luY2x1ZGUgImxpYmF2Y29k ZWMvcmVmc3RydWN0LmgiCisKICNpbmNsdWRlICJ2dmNfY2FiYWMuaCIKICNpbmNsdWRlICJ2dmNf Y3R1LmgiCiAjaW5jbHVkZSAidnZjX212cy5oIgogCit2b2lkIGZmX3Z2Y19kZWNvZGVfbmVpZ2hi b3VyKFZWQ0xvY2FsQ29udGV4dCAqbGMsIGNvbnN0IGludCB4X2N0YiwgY29uc3QgaW50IHlfY3Ri LAorICAgIGNvbnN0IGludCByeCwgY29uc3QgaW50IHJ5LCBjb25zdCBpbnQgcnMpCit7CisgICAg VlZDRnJhbWVDb250ZXh0ICpmYyA9IGxjLT5mYzsKKyAgICBjb25zdCBpbnQgY3RiX3NpemUgICAg ICAgICA9IGZjLT5wcy5zcHMtPmN0Yl9zaXplX3k7CisKKyAgICBsYy0+ZW5kX29mX3RpbGVzX3gg PSBmYy0+cHMuc3BzLT53aWR0aDsKKyAgICBsYy0+ZW5kX29mX3RpbGVzX3kgPSBmYy0+cHMuc3Bz LT5oZWlnaHQ7CisgICAgaWYgKGZjLT5wcy5wcHMtPmN0Yl90b19jb2xfYmRbcnhdICE9IGZjLT5w cy5wcHMtPmN0Yl90b19jb2xfYmRbcnggKyAxXSkKKyAgICAgICAgbGMtPmVuZF9vZl90aWxlc194 ID0gRkZNSU4oeF9jdGIgKyBjdGJfc2l6ZSwgbGMtPmVuZF9vZl90aWxlc194KTsKKyAgICBpZiAo ZmMtPnBzLnBwcy0+Y3RiX3RvX3Jvd19iZFtyeV0gIT0gZmMtPnBzLnBwcy0+Y3RiX3RvX3Jvd19i ZFtyeSArIDFdKQorICAgICAgICBsYy0+ZW5kX29mX3RpbGVzX3kgPSBGRk1JTih5X2N0YiArIGN0 Yl9zaXplLCBsYy0+ZW5kX29mX3RpbGVzX3kpOworCisgICAgbGMtPmJvdW5kYXJ5X2ZsYWdzID0g MDsKKyAgICBpZiAocnggPiAwICYmIGZjLT5wcy5wcHMtPmN0Yl90b19jb2xfYmRbcnhdICE9IGZj LT5wcy5wcHMtPmN0Yl90b19jb2xfYmRbcnggLSAxXSkKKyAgICAgICAgbGMtPmJvdW5kYXJ5X2Zs YWdzIHw9IEJPVU5EQVJZX0xFRlRfVElMRTsKKyAgICBpZiAocnggPiAwICYmIGZjLT50YWIuc2xp Y2VfaWR4W3JzXSAhPSBmYy0+dGFiLnNsaWNlX2lkeFtycyAtIDFdKQorICAgICAgICBsYy0+Ym91 bmRhcnlfZmxhZ3MgfD0gQk9VTkRBUllfTEVGVF9TTElDRTsKKyAgICBpZiAocnkgPiAwICYmIGZj LT5wcy5wcHMtPmN0Yl90b19yb3dfYmRbcnldICE9IGZjLT5wcy5wcHMtPmN0Yl90b19yb3dfYmRb cnkgLSAxXSkKKyAgICAgICAgbGMtPmJvdW5kYXJ5X2ZsYWdzIHw9IEJPVU5EQVJZX1VQUEVSX1RJ TEU7CisgICAgaWYgKHJ5ID4gMCAmJiBmYy0+dGFiLnNsaWNlX2lkeFtyc10gIT0gZmMtPnRhYi5z bGljZV9pZHhbcnMgLSBmYy0+cHMucHBzLT5jdGJfd2lkdGhdKQorICAgICAgICBsYy0+Ym91bmRh cnlfZmxhZ3MgfD0gQk9VTkRBUllfVVBQRVJfU0xJQ0U7CisgICAgbGMtPmN0Yl9sZWZ0X2ZsYWcg PSByeCA+IDAgJiYgIShsYy0+Ym91bmRhcnlfZmxhZ3MgJiBCT1VOREFSWV9MRUZUX1RJTEUpOwor ICAgIGxjLT5jdGJfdXBfZmxhZyAgID0gcnkgPiAwICYmICEobGMtPmJvdW5kYXJ5X2ZsYWdzICYg Qk9VTkRBUllfVVBQRVJfVElMRSkgJiYgIShsYy0+Ym91bmRhcnlfZmxhZ3MgJiBCT1VOREFSWV9V UFBFUl9TTElDRSk7CisgICAgbGMtPmN0Yl91cF9yaWdodF9mbGFnID0gbGMtPmN0Yl91cF9mbGFn ICYmIChmYy0+cHMucHBzLT5jdGJfdG9fY29sX2JkW3J4XSA9PSBmYy0+cHMucHBzLT5jdGJfdG9f Y29sX2JkW3J4ICsgMV0pICYmCisgICAgICAgIChmYy0+cHMucHBzLT5jdGJfdG9fcm93X2JkW3J5 XSA9PSBmYy0+cHMucHBzLT5jdGJfdG9fcm93X2JkW3J5IC0gMV0pOworICAgIGxjLT5jdGJfdXBf bGVmdF9mbGFnID0gbGMtPmN0Yl9sZWZ0X2ZsYWcgJiYgbGMtPmN0Yl91cF9mbGFnOworfQorCiB2 b2lkIGZmX3Z2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShWVkNMb2NhbENvbnRleHQgKmxjLAog ICAgIGNvbnN0IGludCB4MCwgY29uc3QgaW50IHkwLCBjb25zdCBpbnQgdywgY29uc3QgaW50IGgp CiB7CkBAIC0zOSw2ICs3MCwyNSBAQCB2b2lkIGZmX3Z2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJs ZShWVkNMb2NhbENvbnRleHQgKmxjLAogICAgIGxjLT5uYS5jYW5kX3VwX3JpZ2h0ID0gbGMtPm5h LmNhbmRfdXBfcmlnaHRfc2FwICYmICh4MCArIHcpIDwgbGMtPmVuZF9vZl90aWxlc194OwogfQog Cit2b2lkIGZmX3Z2Y19jdHVfZnJlZV9jdXMoQ1RVICpjdHUpCit7CisgICAgQ29kaW5nVW5pdCAq KmN1cyAgPSAmY3R1LT5jdXM7CisgICAgd2hpbGUgKCpjdXMpIHsKKyAgICAgICAgQ29kaW5nVW5p dCAqY3UgICAgICAgICAgPSAqY3VzOworICAgICAgICBUcmFuc2Zvcm1Vbml0ICoqaGVhZCAgICA9 ICZjdS0+dHVzLmhlYWQ7CisKKyAgICAgICAgKmN1cyA9IGN1LT5uZXh0OworCisgICAgICAgIHdo aWxlICgqaGVhZCkgeworICAgICAgICAgICAgVHJhbnNmb3JtVW5pdCAqdHUgPSAqaGVhZDsKKyAg ICAgICAgICAgICpoZWFkID0gdHUtPm5leHQ7CisgICAgICAgICAgICBmZl9yZWZzdHJ1Y3RfdW5y ZWYoJnR1KTsKKyAgICAgICAgfQorICAgICAgICBjdS0+dHVzLnRhaWwgPSBOVUxMOworCisgICAg ICAgIGZmX3JlZnN0cnVjdF91bnJlZigmY3UpOworICAgIH0KK30KIAogdm9pZCBmZl92dmNfZXBf aW5pdF9zdGF0X2NvZWZmKEVudHJ5UG9pbnQgKmVwLAogCWNvbnN0IGludCBiaXRfZGVwdGgsIGNv bnN0IGludCBwZXJzaXN0ZW50X3JpY2VfYWRhcHRhdGlvbl9lbmFibGVkX2ZsYWcpCmRpZmYgLS1n aXQgYS9saWJhdmNvZGVjL3Z2Yy92dmNfY3R1LmggYi9saWJhdmNvZGVjL3Z2Yy92dmNfY3R1LmgK aW5kZXggZDM1YjY4MGFmZi4uNDdjOWYxODFiYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92dmMv dnZjX2N0dS5oCisrKyBiL2xpYmF2Y29kZWMvdnZjL3Z2Y19jdHUuaApAQCAtNDYxLDYgKzQ2MSw4 IEBAIHR5cGVkZWYgc3RydWN0IEFMRlBhcmFtcyB7CiAKIC8vdXRpbHMKIHZvaWQgZmZfdnZjX3Nl dF9uZWlnaGJvdXJfYXZhaWxhYmxlKFZWQ0xvY2FsQ29udGV4dCAqbGMsIGludCB4MCwgaW50IHkw LCBpbnQgdywgaW50IGgpOwordm9pZCBmZl92dmNfZGVjb2RlX25laWdoYm91cihWVkNMb2NhbENv bnRleHQgKmxjLCBpbnQgeF9jdGIsIGludCB5X2N0YiwgaW50IHJ4LCBpbnQgcnksIGludCBycyk7 Cit2b2lkIGZmX3Z2Y19jdHVfZnJlZV9jdXMoQ1RVICpjdHUpOwogdm9pZCBmZl92dmNfZXBfaW5p dF9zdGF0X2NvZWZmKEVudHJ5UG9pbnQgKmVwLCBpbnQgYml0X2RlcHRoLCBpbnQgcGVyc2lzdGVu dF9yaWNlX2FkYXB0YXRpb25fZW5hYmxlZF9mbGFnKTsKIAogI2VuZGlmIC8vIEFWQ09ERUNfVlZD X1ZWQ19DVFVfSApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92dmMvdnZjX2ludHJhLmMgYi9saWJh dmNvZGVjL3Z2Yy92dmNfaW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwLi40M2RlMzEyYTcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92dmMvdnZjX2lu dHJhLmMKQEAgLTAsMCArMSw3OTcgQEAKKy8qCisgKiBWVkMgaW50cmEgcHJlZGljdGlvbgorICoK KyAqIENvcHlyaWdodCAoQykgMjAyMSBOdW8gTWkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBv ZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGlj ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1w ZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZt cGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJ bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEz MDEgVVNBCisgKi8KKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKworI2luY2x1ZGUgInZ2 Y19kYXRhLmgiCisjaW5jbHVkZSAidnZjX2ludGVyLmgiCisjaW5jbHVkZSAidnZjX2ludHJhLmgi CisjaW5jbHVkZSAidnZjX2l0eF8xZC5oIgorCitzdGF0aWMgaW50IGlzX2NjbG0oZW51bSBJbnRy YVByZWRNb2RlIG1vZGUpCit7CisgICAgcmV0dXJuIG1vZGUgPT0gSU5UUkFfTFRfQ0NMTSB8fCBt b2RlID09IElOVFJBX0xfQ0NMTSB8fCBtb2RlID09IElOVFJBX1RfQ0NMTTsKK30KKworc3RhdGlj IGludCBkZXJpdmVfaWxmbnN0X3ByZWRfbW9kZV9pbnRyYShjb25zdCBWVkNMb2NhbENvbnRleHQg KmxjLCBjb25zdCBUcmFuc2Zvcm1CbG9jayAqdGIpCit7CisgICAgY29uc3QgVlZDRnJhbWVDb250 ZXh0ICpmYyA9IGxjLT5mYzsKKyAgICBjb25zdCBWVkNTUFMgKnNwcyA9IGZjLT5wcy5zcHM7Cisg ICAgY29uc3QgQ29kaW5nVW5pdCAqY3UgICAgICAgICAgPSBsYy0+Y3U7CisgICAgY29uc3QgaW50 IHhfdGIgICAgICAgICAgICAgICAgPSB0Yi0+eDAgPj4gZmMtPnBzLnNwcy0+bWluX2NiX2xvZzJf c2l6ZV95OworICAgIGNvbnN0IGludCB5X3RiICAgICAgICAgICAgICAgID0gdGItPnkwID4+IGZj LT5wcy5zcHMtPm1pbl9jYl9sb2cyX3NpemVfeTsKKyAgICBjb25zdCBpbnQgeF9jICAgICAgICAg ICAgICAgICA9ICh0Yi0+eDAgKyAodGItPnRiX3dpZHRoIDw8IHNwcy0+aHNoaWZ0WzFdID4+IDEp ICkgPj4gZmMtPnBzLnNwcy0+bWluX2NiX2xvZzJfc2l6ZV95OworICAgIGNvbnN0IGludCB5X2Mg ICAgICAgICAgICAgICAgID0gKHRiLT55MCArICh0Yi0+dGJfaGVpZ2h0IDw8IHNwcy0+dnNoaWZ0 WzFdID4+IDEpKSA+PiBmYy0+cHMuc3BzLT5taW5fY2JfbG9nMl9zaXplX3k7CisgICAgY29uc3Qg aW50IG1pbl9jYl93aWR0aCAgICAgICAgPSBmYy0+cHMucHBzLT5taW5fY2Jfd2lkdGg7CisgICAg Y29uc3QgaW50IGludHJhX21pcF9mbGFnICAgICAgPSBTQU1QTEVfQ1RCKGZjLT50YWIuaW1mLCB4 X3RiLCB5X3RiKTsKKyAgICBpbnQgcHJlZF9tb2RlX2ludHJhID0gdGItPmNfaWR4ID09IDAgPyBj dS0+aW50cmFfcHJlZF9tb2RlX3kgOiBjdS0+aW50cmFfcHJlZF9tb2RlX2M7CisgICAgaWYgKGlu dHJhX21pcF9mbGFnICYmICF0Yi0+Y19pZHgpIHsKKyAgICAgICAgcHJlZF9tb2RlX2ludHJhID0g SU5UUkFfUExBTkFSOworICAgIH0gZWxzZSBpZiAoaXNfY2NsbShwcmVkX21vZGVfaW50cmEpKSB7 CisgICAgICAgIGludCBpbnRyYV9taXBfZmxhZ19jID0gU0FNUExFX0NUQihmYy0+dGFiLmltZiwg eF9jLCB5X2MpOworICAgICAgICBpbnQgY3VfcHJlZF9tb2RlID0gU0FNUExFX0NUQihmYy0+dGFi LmNwbVswXSwgeF9jLCB5X2MpOworICAgICAgICBpZiAoaW50cmFfbWlwX2ZsYWdfYykgeworICAg ICAgICAgICAgcHJlZF9tb2RlX2ludHJhID0gSU5UUkFfUExBTkFSOworICAgICAgICB9IGVsc2Ug aWYgKGN1X3ByZWRfbW9kZSA9PSBNT0RFX0lCQyB8fCBjdV9wcmVkX21vZGUgPT0gTU9ERV9QTFQp IHsKKyAgICAgICAgICAgIHByZWRfbW9kZV9pbnRyYSA9IElOVFJBX0RDOworICAgICAgICB9IGVs c2UgeworICAgICAgICAgICAgcHJlZF9tb2RlX2ludHJhID0gU0FNUExFX0NUQihmYy0+dGFiLmlw bSwgeF9jLCB5X2MpOworICAgICAgICB9CisgICAgfQorICAgIHByZWRfbW9kZV9pbnRyYSA9IGZm X3Z2Y193aWRlX2FuZ2xlX21vZGVfbWFwcGluZyhjdSwgdGItPnRiX3dpZHRoLCB0Yi0+dGJfaGVp Z2h0LCB0Yi0+Y19pZHgsIHByZWRfbW9kZV9pbnRyYSk7CisKKyAgICByZXR1cm4gcHJlZF9tb2Rl X2ludHJhOworfQorCisvLzguNy40IFRyYW5zZm9ybWF0aW9uIHByb2Nlc3MgZm9yIHNjYWxlZCB0 cmFuc2Zvcm0gY29lZmZpY2llbnRzCitzdGF0aWMgdm9pZCBpbGZuc3RfdHJhbnNmb3JtKGNvbnN0 IFZWQ0xvY2FsQ29udGV4dCAqbGMsIFRyYW5zZm9ybUJsb2NrICp0YikKK3sKKyAgICBjb25zdCBW VkNTUFMgKnNwcyAgICAgICAgICAgPSBsYy0+ZmMtPnBzLnNwczsKKyAgICBjb25zdCBDb2RpbmdV bml0ICpjdSAgICAgICAgPSBsYy0+Y3U7CisgICAgY29uc3QgaW50IHcgICAgICAgICAgICAgICAg ID0gdGItPnRiX3dpZHRoOworICAgIGNvbnN0IGludCBoICAgICAgICAgICAgICAgICA9IHRiLT50 Yl9oZWlnaHQ7CisgICAgY29uc3QgaW50IG5fbGZuc3Rfb3V0X3NpemUgID0gKHcgPj0gOCAmJiBo ID49IDgpID8gNDggOiAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBuTGZuc3RPdXRT aXplCisgICAgY29uc3QgaW50IGxvZzJfbGZuc3Rfc2l6ZSAgID0gKHcgPj0gOCAmJiBoID49IDgp ID8gMyA6IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBsb2cyTGZuc3RTaXplCisg ICAgY29uc3QgaW50IG5fbGZuc3Rfc2l6ZSAgICAgID0gMSA8PCBsb2cyX2xmbnN0X3NpemU7ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBuTGZuc3RTaXplCisgICAgY29uc3Qg aW50IG5vbl96ZXJvX3NpemUgICAgID0gKCh3ID09IDggJiYgaCA9PSA4KSB8fCAodyA9PSA0ICYm IGggPT0gNCkpID8gOCA6IDE2OyAgLy8vPCBub25aZXJvU2l6ZQorICAgIGNvbnN0IGludCBwcmVk X21vZGVfaW50cmEgICA9IGRlcml2ZV9pbGZuc3RfcHJlZF9tb2RlX2ludHJhKGxjLCB0Yik7Cisg ICAgY29uc3QgaW50IHRyYW5zcG9zZSAgICAgICAgID0gcHJlZF9tb2RlX2ludHJhID4gMzQ7Cisg ICAgaW50IHVbMTZdLCB2WzQ4XTsKKworICAgIGZvciAoaW50IHggPSAwOyB4IDwgbm9uX3plcm9f c2l6ZTsgeCsrKSB7CisgICAgICAgIGludCB4YyA9IGZmX3Z2Y19kaWFnX3NjYW5feFsyXVsyXVt4 XTsKKyAgICAgICAgaW50IHljID0gZmZfdnZjX2RpYWdfc2Nhbl95WzJdWzJdW3hdOworICAgICAg ICB1W3hdID0gdGItPmNvZWZmc1t3ICogeWMgKyB4Y107CisgICAgfQorICAgIGZmX3Z2Y19pbnZf bGZuc3RfMWQodiwgdSwgbm9uX3plcm9fc2l6ZSwgbl9sZm5zdF9vdXRfc2l6ZSwgcHJlZF9tb2Rl X2ludHJhLAorICAgICAgICAgICAgICAgICAgICAgICAgY3UtPmxmbnN0X2lkeCwgc3BzLT5sb2cy X3RyYW5zZm9ybV9yYW5nZSk7CisgICAgaWYgKHRyYW5zcG9zZSkgeworICAgICAgICBpbnQgKmRz dCA9IHRiLT5jb2VmZnM7CisgICAgICAgIGNvbnN0IGludCAqc3JjID0gdjsKKyAgICAgICAgaWYg KG5fbGZuc3Rfc2l6ZSA9PSA0KSB7CisgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IDQ7 IHkrKykgeworICAgICAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKKyAgICAgICAgICAgICAg ICBkc3RbMV0gPSBzcmNbNF07CisgICAgICAgICAgICAgICAgZHN0WzJdID0gc3JjWzhdOworICAg ICAgICAgICAgICAgIGRzdFszXSA9IHNyY1sxMl07CisgICAgICAgICAgICAgICAgc3JjKys7Cisg ICAgICAgICAgICAgICAgZHN0ICs9IHc7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7 CisgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICAgICAg ICAgIGRzdFswXSA9IHNyY1swXTsKKyAgICAgICAgICAgICAgICBkc3RbMV0gPSBzcmNbOF07Cisg ICAgICAgICAgICAgICAgZHN0WzJdID0gc3JjWzE2XTsKKyAgICAgICAgICAgICAgICBkc3RbM10g PSBzcmNbMjRdOworICAgICAgICAgICAgICAgIGlmICh5IDwgNCkgeworICAgICAgICAgICAgICAg ICAgICBkc3RbNF0gPSBzcmNbMzJdOworICAgICAgICAgICAgICAgICAgICBkc3RbNV0gPSBzcmNb MzZdOworICAgICAgICAgICAgICAgICAgICBkc3RbNl0gPSBzcmNbNDBdOworICAgICAgICAgICAg ICAgICAgICBkc3RbN10gPSBzcmNbNDRdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg ICAgICBzcmMrKzsKKyAgICAgICAgICAgICAgICBkc3QgKz0gdzsKKyAgICAgICAgICAgIH0KKyAg ICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50ICpkc3QgPSB0Yi0+Y29lZmZzOwor ICAgICAgICBjb25zdCBpbnQgKnNyYyA9IHY7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwg bl9sZm5zdF9zaXplOyB5KyspIHsKKyAgICAgICAgICAgIGludCBzaXplID0gKHkgPCA0KSA/IG5f bGZuc3Rfc2l6ZSA6IDQ7CisgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHNpemUgKiBzaXpl b2YoaW50KSk7CisgICAgICAgICAgICBzcmMgKz0gc2l6ZTsKKyAgICAgICAgICAgIGRzdCArPSB3 OworICAgICAgICB9CisgICAgfQorICAgIHRiLT5tYXhfc2Nhbl94ID0gbl9sZm5zdF9zaXplIC0g MTsKKyAgICB0Yi0+bWF4X3NjYW5feSA9IG5fbGZuc3Rfc2l6ZSAtIDE7Cit9CisKKy8vcGFydCBv ZiA4LjcuNCBUcmFuc2Zvcm1hdGlvbiBwcm9jZXNzIGZvciBzY2FsZWQgdHJhbnNmb3JtIGNvZWZm aWNpZW50cworc3RhdGljIHZvaWQgZGVyaXZlX3RyYW5zZm9ybV90eXBlKGNvbnN0IFZWQ0ZyYW1l Q29udGV4dCAqZmMsIGNvbnN0IFZWQ0xvY2FsQ29udGV4dCAqbGMsIGNvbnN0IFRyYW5zZm9ybUJs b2NrICp0YiwgZW51bSBUeFR5cGUgKnRyaCwgZW51bSBUeFR5cGUgKnRydikKK3sKKyAgICBjb25z dCBDb2RpbmdVbml0ICpjdSA9IGxjLT5jdTsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBUeFR5cGUg bXRzX3RvX3RyaFtdID0ge0RDVDIsIERTVDcsIERDVDgsIERTVDcsIERDVDh9OworICAgIHN0YXRp YyBjb25zdCBlbnVtIFR4VHlwZSBtdHNfdG9fdHJ2W10gPSB7RENUMiwgRFNUNywgRFNUNywgRENU OCwgRENUOH07CisgICAgY29uc3QgVlZDU1BTICpzcHMgICAgICAgPSBmYy0+cHMuc3BzOworICAg IGludCBpbXBsaWNpdF9tdHNfZW5hYmxlZCA9IDA7CisgICAgaWYgKHRiLT5jX2lkeCB8fCAoY3Ut PmlzcF9zcGxpdF90eXBlICE9IElTUF9OT19TUExJVCAmJiBjdS0+bGZuc3RfaWR4KSkgeworICAg ICAgICAqdHJoID0gKnRydiA9IERDVDI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBp ZiAoc3BzLT5yLT5zcHNfbXRzX2VuYWJsZWRfZmxhZykgeworICAgICAgICBpZiAoY3UtPmlzcF9z cGxpdF90eXBlICE9IElTUF9OT19TUExJVCB8fAorICAgICAgICAgICAgKGN1LT5zYnRfZmxhZyAm JiBGRk1BWCh0Yi0+dGJfd2lkdGgsIHRiLT50Yl9oZWlnaHQpIDw9IDMyKSB8fAorICAgICAgICAg ICAgKCFzcHMtPnItPnNwc19leHBsaWNpdF9tdHNfaW50cmFfZW5hYmxlZF9mbGFnICYmIGN1LT5w cmVkX21vZGUgPT0gTU9ERV9JTlRSQSAmJgorICAgICAgICAgICAgIWN1LT5sZm5zdF9pZHggJiYg IWN1LT5pbnRyYV9taXBfZmxhZykpIHsKKyAgICAgICAgICAgIGltcGxpY2l0X210c19lbmFibGVk ID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW1wbGljaXRfbXRzX2VuYWJsZWQpIHsK KyAgICAgICAgY29uc3QgaW50IHcgPSB0Yi0+dGJfd2lkdGg7CisgICAgICAgIGNvbnN0IGludCBo ID0gdGItPnRiX2hlaWdodDsKKyAgICAgICAgaWYgKGN1LT5zYnRfZmxhZykgeworICAgICAgICAg ICAgKnRyaCA9IChjdS0+c2J0X2hvcml6b250YWxfZmxhZyAgfHwgY3UtPnNidF9wb3NfZmxhZykg PyBEU1Q3IDogRENUODsKKyAgICAgICAgICAgICp0cnYgPSAoIWN1LT5zYnRfaG9yaXpvbnRhbF9m bGFnIHx8IGN1LT5zYnRfcG9zX2ZsYWcpID8gRFNUNyA6IERDVDg7CisgICAgICAgIH0gZWxzZSB7 CisgICAgICAgICAgICAqdHJoID0gKHcgPj0gNCAmJiB3IDw9IDE2KSA/IERTVDcgOiBEQ1QyOwor ICAgICAgICAgICAgKnRydiA9IChoID49IDQgJiYgaCA8PSAxNikgPyBEU1Q3IDogRENUMjsKKyAg ICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgICp0cmggPSBtdHNfdG9fdHJoW2N1 LT5tdHNfaWR4XTsKKyAgICAqdHJ2ID0gbXRzX3RvX3RydltjdS0+bXRzX2lkeF07Cit9CisKK3N0 YXRpYyB2b2lkIGFkZF9yZXNpZHVhbF9mb3Jfam9pbnRfY29kaW5nX2Nocm9tYShWVkNMb2NhbENv bnRleHQgKmxjLAorICAgIGNvbnN0IFRyYW5zZm9ybVVuaXQgKnR1LCBUcmFuc2Zvcm1CbG9jayAq dGIsIGNvbnN0IGludCBjaHJvbWFfc2NhbGUpCit7CisgICAgY29uc3QgVlZDRnJhbWVDb250ZXh0 ICpmYyAgPSBsYy0+ZmM7CisgICAgY29uc3QgQ29kaW5nVW5pdCAqY3UgPSBsYy0+Y3U7CisgICAg Y29uc3QgaW50IGNfc2lnbiA9IDEgLSAyICogZmMtPnBzLnBoLnItPnBoX2pvaW50X2NiY3Jfc2ln bl9mbGFnOworICAgIGNvbnN0IGludCBzaGlmdCAgPSB0dS0+Y29kZWRfZmxhZ1sxXSBeIHR1LT5j b2RlZF9mbGFnWzJdOworICAgIGNvbnN0IGludCBjX2lkeCAgPSAxICsgdHUtPmNvZGVkX2ZsYWdb MV07CisgICAgY29uc3QgcHRyZGlmZl90IHN0cmlkZSA9IGZjLT5mcmFtZS0+bGluZXNpemVbY19p ZHhdOworICAgIGNvbnN0IGludCBocyA9IGZjLT5wcy5zcHMtPmhzaGlmdFtjX2lkeF07CisgICAg Y29uc3QgaW50IHZzID0gZmMtPnBzLnNwcy0+dnNoaWZ0W2NfaWR4XTsKKyAgICB1aW50OF90ICpk c3QgPSAmZmMtPmZyYW1lLT5kYXRhW2NfaWR4XVsodGItPnkwID4+IHZzKSAqIHN0cmlkZSArCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRiLT54MCA+PiBocykg PDwgZmMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpXTsKKyAgICBpZiAoY2hyb21hX3NjYWxlKSB7Cisg ICAgICAgIGZjLT52dmNkc3AuaXR4LnByZWRfcmVzaWR1YWxfam9pbnQodGItPmNvZWZmcywgdGIt PnRiX3dpZHRoLCB0Yi0+dGJfaGVpZ2h0LCBjX3NpZ24sIHNoaWZ0KTsKKyAgICAgICAgZmMtPnZ2 Y2RzcC5pbnRyYS5sbWNzX3NjYWxlX2Nocm9tYShsYywgdGItPmNvZWZmcywgdGItPmNvZWZmcywg dGItPnRiX3dpZHRoLCB0Yi0+dGJfaGVpZ2h0LCBjdS0+eDAsIGN1LT55MCk7CisgICAgICAgIGZj LT52dmNkc3AuaXR4LmFkZF9yZXNpZHVhbChkc3QsIHRiLT5jb2VmZnMsIHRiLT50Yl93aWR0aCwg dGItPnRiX2hlaWdodCwgc3RyaWRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmYy0+dnZjZHNw Lml0eC5hZGRfcmVzaWR1YWxfam9pbnQoZHN0LCB0Yi0+Y29lZmZzLCB0Yi0+dGJfd2lkdGgsIHRi LT50Yl9oZWlnaHQsIHN0cmlkZSwgY19zaWduLCBzaGlmdCk7CisgICAgfQorfQorCitzdGF0aWMg aW50IGFkZF9yZWNvbnN0cnVjdGVkX2FyZWEoVlZDTG9jYWxDb250ZXh0ICpsYywgY29uc3QgaW50 IGNoX3R5cGUsIGNvbnN0IGludCB4MCwgY29uc3QgaW50IHkwLCBjb25zdCBpbnQgdywgY29uc3Qg aW50IGgpCit7CisgICAgY29uc3QgVlZDU1BTICpzcHMgICAgICAgPSBsYy0+ZmMtPnBzLnNwczsK KyAgICBjb25zdCBpbnQgaHMgPSBzcHMtPmhzaGlmdFtjaF90eXBlXTsKKyAgICBjb25zdCBpbnQg dnMgPSBzcHMtPnZzaGlmdFtjaF90eXBlXTsKKyAgICBSZWNvbnN0cnVjdGVkQXJlYSAqYTsKKwor ICAgIGlmIChsYy0+bnVtX3Jhc1tjaF90eXBlXSA+PSBGRl9BUlJBWV9FTEVNUyhsYy0+cmFzW2No X3R5cGVdKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhID0g JmxjLT5yYXNbY2hfdHlwZV1bbGMtPm51bV9yYXNbY2hfdHlwZV1dOworICAgIGEtPnggPSB4MCA+ PiBoczsKKyAgICBhLT55ID0geTAgPj4gdnM7CisgICAgYS0+dyA9IHcgPj4gaHM7CisgICAgYS0+ aCA9IGggPj4gdnM7CisgICAgbGMtPm51bV9yYXNbY2hfdHlwZV0rKzsKKworICAgIHJldHVybiAw OworfQorCitzdGF0aWMgdm9pZCBhZGRfdHVfYXJlYShjb25zdCBUcmFuc2Zvcm1Vbml0ICp0dSwg aW50ICp4MCwgaW50ICp5MCwgaW50ICp3LCBpbnQgKmgpCit7CisgICAgKngwID0gdHUtPngwOwor ICAgICp5MCA9IHR1LT55MDsKKyAgICAqdyA9IHR1LT53aWR0aDsKKyAgICAqaCA9IHR1LT5oZWln aHQ7Cit9CisKKyNkZWZpbmUgTUlOX0lTUF9QUkVEX1dJRFRIIDQKK3N0YXRpYyBpbnQgZ2V0X2x1 bWFfcHJlZGljdF91bml0KGNvbnN0IENvZGluZ1VuaXQgKmN1LCBjb25zdCBUcmFuc2Zvcm1Vbml0 ICp0dSwgY29uc3QgaW50IGlkeCwgaW50ICp4MCwgaW50ICp5MCwgaW50ICp3LCBpbnQgKmgpCit7 CisgICAgaW50IGhhc19sdW1hID0gMTsKKyAgICBhZGRfdHVfYXJlYSh0dSwgeDAsIHkwLCB3LCBo KTsKKyAgICBpZiAoY3UtPmlzcF9zcGxpdF90eXBlID09IElTUF9WRVJfU1BMSVQgJiYgdHUtPndp ZHRoIDwgTUlOX0lTUF9QUkVEX1dJRFRIKSB7CisgICAgICAgICp3ID0gTUlOX0lTUF9QUkVEX1dJ RFRIOworICAgICAgICBoYXNfbHVtYSA9ICEoaWR4ICUgKE1JTl9JU1BfUFJFRF9XSURUSCAvIHR1 LT53aWR0aCkpOworICAgIH0KKyAgICByZXR1cm4gaGFzX2x1bWE7Cit9CisKK3N0YXRpYyBpbnQg Z2V0X2Nocm9tYV9wcmVkaWN0X3VuaXQoY29uc3QgQ29kaW5nVW5pdCAqY3UsIGNvbnN0IFRyYW5z Zm9ybVVuaXQgKnR1LCBjb25zdCBpbnQgaWR4LCBpbnQgKngwLCBpbnQgKnkwLCBpbnQgKncsIGlu dCAqaCkKK3sKKyAgICBpZiAoY3UtPmlzcF9zcGxpdF90eXBlID09IElTUF9OT19TUExJVCkgewor ICAgICAgICBhZGRfdHVfYXJlYSh0dSwgeDAsIHkwLCB3LCBoKTsKKyAgICAgICAgcmV0dXJuIDE7 CisgICAgfQorICAgIGlmIChpZHggPT0gY3UtPm51bV9pbnRyYV9zdWJwYXJ0aXRpb25zIC0gMSkg eworICAgICAgICAqeDAgPSBjdS0+eDA7CisgICAgICAgICp5MCA9IGN1LT55MDsKKyAgICAgICAg KncgPSBjdS0+Y2Jfd2lkdGg7CisgICAgICAgICpoID0gY3UtPmNiX2hlaWdodDsKKyAgICAgICAg cmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvLzguNC41LjEgR2VuZXJhbCBk ZWNvZGluZyBwcm9jZXNzIGZvciBpbnRyYSBibG9ja3MKK3N0YXRpYyB2b2lkIHByZWRpY3RfaW50 cmEoVlZDTG9jYWxDb250ZXh0ICpsYywgY29uc3QgVHJhbnNmb3JtVW5pdCAqdHUsIGNvbnN0IGlu dCBpZHgsIGNvbnN0IGludCB0YXJnZXRfY2hfdHlwZSkKK3sKKyAgICBjb25zdCBWVkNGcmFtZUNv bnRleHQgKmZjICAgICAgICAgPSBsYy0+ZmM7CisgICAgY29uc3QgQ29kaW5nVW5pdCAqY3UgICAg ICAgID0gbGMtPmN1OworICAgIGNvbnN0IFZWQ1RyZWVUeXBlIHRyZWVfdHlwZSA9IGN1LT50cmVl X3R5cGU7CisgICAgaW50IHgwLCB5MCwgdywgaDsKKyAgICBpZiAoY3UtPnByZWRfbW9kZSAhPSBN T0RFX0lOVFJBKSB7CisgICAgICAgIGFkZF9yZWNvbnN0cnVjdGVkX2FyZWEobGMsIHRhcmdldF9j aF90eXBlLCB0dS0+eDAsIHR1LT55MCwgdHUtPndpZHRoLCB0dS0+aGVpZ2h0KTsKKyAgICAgICAg cmV0dXJuOworICAgIH0KKyAgICBpZiAoIXRhcmdldF9jaF90eXBlICYmIHRyZWVfdHlwZSAhPSBE VUFMX1RSRUVfQ0hST01BKSB7CisgICAgICAgIGlmIChnZXRfbHVtYV9wcmVkaWN0X3VuaXQoY3Us IHR1LCBpZHgsICZ4MCwgJnkwLCAmdywgJmgpKSB7CisgICAgICAgICAgICBmZl92dmNfc2V0X25l aWdoYm91cl9hdmFpbGFibGUobGMsIHgwLCB5MCwgdywgaCk7CisgICAgICAgICAgICBmYy0+dnZj ZHNwLmludHJhLmludHJhX3ByZWQobGMsIHgwLCB5MCwgdywgaCwgMCk7CisgICAgICAgICAgICBh ZGRfcmVjb25zdHJ1Y3RlZF9hcmVhKGxjLCAwLCB4MCwgeTAsIHcsIGgpOworICAgICAgICB9Cisg ICAgfQorICAgIGlmICh0YXJnZXRfY2hfdHlwZSAmJiB0cmVlX3R5cGUgIT0gRFVBTF9UUkVFX0xV TUEpIHsKKyAgICAgICAgaWYgKGdldF9jaHJvbWFfcHJlZGljdF91bml0KGN1LCB0dSwgaWR4LCAm eDAsICZ5MCwgJncsICZoKSl7CisgICAgICAgICAgICBmZl92dmNfc2V0X25laWdoYm91cl9hdmFp bGFibGUobGMsIHgwLCB5MCwgdywgaCk7CisgICAgICAgICAgICBpZiAoaXNfY2NsbShjdS0+aW50 cmFfcHJlZF9tb2RlX2MpKSB7CisgICAgICAgICAgICAgICAgZmMtPnZ2Y2RzcC5pbnRyYS5pbnRy YV9jY2xtX3ByZWQobGMsIHgwLCB5MCwgdywgaCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAg ICAgICAgICAgICAgIGZjLT52dmNkc3AuaW50cmEuaW50cmFfcHJlZChsYywgeDAsIHkwLCB3LCBo LCAxKTsKKyAgICAgICAgICAgICAgICBmYy0+dnZjZHNwLmludHJhLmludHJhX3ByZWQobGMsIHgw LCB5MCwgdywgaCwgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRfcmVjb25zdHJ1 Y3RlZF9hcmVhKGxjLCAxLCB4MCwgeTAsIHcsIGgpOworICAgICAgICB9CisgICAgfQorfQorCitz dGF0aWMgdm9pZCBzY2FsZV9jbGlwKGludCAqY29lZmYsIGNvbnN0IGludCBuencsIGNvbnN0IGlu dCB3LCBjb25zdCBpbnQgaCwKKyAgICBjb25zdCBpbnQgc2hpZnQsIGNvbnN0IGludCBsb2cyX3Ry YW5zZm9ybV9yYW5nZSkKK3sKKyAgICBjb25zdCBpbnQgYWRkID0gMSA8PCAoc2hpZnQgLSAxKTsK KyAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBpbnQgKnAgPSBjb2Vm ZiArIHkgKiB3OworICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IG56dzsgeCsrKSB7CisgICAg ICAgICAgICAqcCA9IGF2X2NsaXBfaW50cDIoKCpwICsgYWRkKSA+PiBzaGlmdCwgbG9nMl90cmFu c2Zvcm1fcmFuZ2UpOworICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgICAgIG1lbXNl dChwLCAwLCBzaXplb2YoKnApICogKHcgLSBuencpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lk IHNjYWxlKGludCAqb3V0LCBjb25zdCBpbnQgKmluLCBjb25zdCBpbnQgdywgY29uc3QgaW50IGgs IGNvbnN0IGludCBzaGlmdCkKK3sKKyAgICBjb25zdCBpbnQgYWRkID0gMSA8PCAoc2hpZnQgLSAx KTsKKyAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKGludCB4 ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaW50ICpvID0gb3V0ICsgeSAqIHcgKyB4 OworICAgICAgICAgICAgY29uc3QgaW50ICppID0gaW4gKyB5ICogdyArIHg7CisgICAgICAgICAg ICAqbyA9ICgqaSArIGFkZCkgPj4gc2hpZnQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHBh cnQgb2YgOC43LjMgU2NhbGluZyBwcm9jZXNzIGZvciB0cmFuc2Zvcm0gY29lZmZpY2llbnRzCitz dGF0aWMgdm9pZCBkZXJpdmVfcXAoY29uc3QgVlZDTG9jYWxDb250ZXh0ICpsYywgY29uc3QgVHJh bnNmb3JtVW5pdCAqdHUsIFRyYW5zZm9ybUJsb2NrICp0YikKK3sKKyAgICBjb25zdCBWVkNTUFMg KnNwcyAgICAgICAgICAgICAgID0gbGMtPmZjLT5wcy5zcHM7CisgICAgY29uc3QgSDI2NlJhd1Ns aWNlSGVhZGVyICpyc2ggICA9IGxjLT5zYy0+c2gucjsKKyAgICBjb25zdCBDb2RpbmdVbml0ICpj dSAgICAgICAgICAgID0gbGMtPmN1OworICAgIGludCBxcCwgcXBfYWN0X29mZnNldDsKKworICAg IGlmICh0Yi0+Y19pZHggPT0gMCkgeworICAgICAgICAvL2ZpeCBtZQorICAgICAgICBxcCA9IGN1 LT5xcFtMVU1BXSArIHNwcy0+cXBfYmRfb2Zmc2V0OworICAgICAgICBxcF9hY3Rfb2Zmc2V0ID0g Y3UtPmFjdF9lbmFibGVkX2ZsYWcgPyAtNSA6IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29u c3QgaW50IGlzX2pjYmNyID0gdHUtPmpvaW50X2NiY3JfcmVzaWR1YWxfZmxhZyAmJiB0dS0+Y29k ZWRfZmxhZ1tDQl0gJiYgdHUtPmNvZGVkX2ZsYWdbQ1JdOworICAgICAgICBjb25zdCBpbnQgaWR4 ID0gaXNfamNiY3IgPyBKQ0JDUiA6IHRiLT5jX2lkeDsKKyAgICAgICAgcXAgPSBjdS0+cXBbaWR4 XTsKKyAgICAgICAgcXBfYWN0X29mZnNldCA9IGN1LT5hY3RfZW5hYmxlZF9mbGFnID8gMSA6IDA7 CisgICAgfQorICAgIGlmICh0Yi0+dHMpIHsKKyAgICAgICAgY29uc3QgaW50IHFwX3ByaW1lX3Rz X21pbiA9IDQgKyA2ICogc3BzLT5yLT5zcHNfbWluX3FwX3ByaW1lX3RzOworCisgICAgICAgIHRi LT5xcCA9IGF2X2NsaXAocXAgKyBxcF9hY3Rfb2Zmc2V0LCBxcF9wcmltZV90c19taW4sIDYzICsg c3BzLT5xcF9iZF9vZmZzZXQpOworICAgICAgICB0Yi0+cmVjdF9ub25fdHNfZmxhZyA9IDA7Cisg ICAgICAgIHRiLT5iZF9zaGlmdCA9IDEwOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGlu dCBsb2dfc3VtID0gdGItPmxvZzJfdGJfd2lkdGggKyB0Yi0+bG9nMl90Yl9oZWlnaHQ7CisgICAg ICAgIGNvbnN0IGludCByZWN0X25vbl90c19mbGFnID0gbG9nX3N1bSAmIDE7CisKKyAgICAgICAg dGItPnFwID0gYXZfY2xpcChxcCArIHFwX2FjdF9vZmZzZXQsIDAsIDYzICsgc3BzLT5xcF9iZF9v ZmZzZXQpOworICAgICAgICB0Yi0+cmVjdF9ub25fdHNfZmxhZyA9IHJlY3Rfbm9uX3RzX2ZsYWc7 CisgICAgICAgIHRiLT5iZF9zaGlmdCA9IHNwcy0+Yml0X2RlcHRoICsgcmVjdF9ub25fdHNfZmxh ZyArIChsb2dfc3VtIC8gMikKKyAgICAgICAgICAgICAgICAgICAgICsgMTAgLSBzcHMtPmxvZzJf dHJhbnNmb3JtX3JhbmdlICsgcnNoLT5zaF9kZXBfcXVhbnRfdXNlZF9mbGFnOworICAgIH0KKyAg ICB0Yi0+YmRfb2Zmc2V0ID0gKDEgPDwgdGItPmJkX3NoaWZ0KSA+PiAxOworfQorCisvLzguNy4z IFNjYWxpbmcgcHJvY2VzcyBmb3IgdHJhbnNmb3JtIGNvZWZmaWNpZW50cworc3RhdGljIGF2X2Fs d2F5c19pbmxpbmUgaW50IGRlcml2ZV9zY2FsZShjb25zdCBUcmFuc2Zvcm1CbG9jayAqdGIsIGNv bnN0IGludCBzaF9kZXBfcXVhbnRfdXNlZF9mbGFnKQoreworICAgIHN0YXRpYyBjb25zdCB1aW50 OF90IHJlbTZbNjMgKyAyICogNiArIDFdID0geworICAgICAgICAwLCAxLCAyLCAzLCA0LCA1LCAw LCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLAorICAgICAgICAzLCA0 LCA1LCAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1 LAorICAgICAgICAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLCAz LCA0LCA1LCAwLCAxLCAyLCAzLAorICAgICAgICA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1LCAwLCAx LCAyLCAzCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGRpdjZbNjMgKyAyICog NiArIDFdID0geworICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAy LCAyLCAyLCAyLCAyLCAyLCAzLCAgMywgIDMsCisgICAgICAgIDMsIDMsIDMsIDQsIDQsIDQsIDQs IDQsIDQsIDUsIDUsIDUsIDUsIDUsIDUsIDYsIDYsIDYsIDYsICA2LCAgNiwKKyAgICAgICAgNywg NywgNywgNywgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOSwgOSwgOSwgOSwgOSwgOSwgMTAsIDEw LCAxMCwgMTAsCisgICAgICAgIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEy LCAxMiwgMTIKKyAgICB9OworCisgICAgY29uc3Qgc3RhdGljIGludCBsZXZlbF9zY2FsZVsyXVs2 XSA9IHsKKyAgICAgICAgeyA0MCwgNDUsIDUxLCA1NywgNjQsIDcyIH0sCisgICAgICAgIHsgNTcs IDY0LCA3MiwgODAsIDkwLCAxMDIgfQorICAgIH07CisgICAgY29uc3QgaW50IGFkZGluID0gc2hf ZGVwX3F1YW50X3VzZWRfZmxhZyAmJiAhdGItPnRzOworICAgIGNvbnN0IGludCBxcCAgICA9IHRi LT5xcCArIGFkZGluOworCisgICAgcmV0dXJuIGxldmVsX3NjYWxlW3RiLT5yZWN0X25vbl90c19m bGFnXVtyZW02W3FwXV0gPDwgZGl2NltxcF07Cit9CisKKy8vOC43LjMgU2NhbGluZyBwcm9jZXNz IGZvciB0cmFuc2Zvcm0gY29lZmZpY2llbnRzCitzdGF0aWMgY29uc3QgdWludDhfdCogZGVyaXZl X3NjYWxlX20oY29uc3QgVlZDTG9jYWxDb250ZXh0ICpsYywgY29uc3QgVHJhbnNmb3JtQmxvY2sg KnRiLCB1aW50OF90ICpzY2FsZV9tKQoreworICAgIC8vVGFibGUgMzgg4oCTIFNwZWNpZmljYXRp b24gb2YgdGhlIHNjYWxpbmcgbWF0cml4IGlkZW50aWZpZXIgdmFyaWFibGUgaWQgYWNjb3JkaW5n IHRvIHByZWRNb2RlLCBjSWR4LCBuVGJXLCBhbmQgblRiSAorICAgIGNvbnN0IGludCBpZHNbMl1b M11bNl0gPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgIDAsICAyLCAgOCwgMTQsIDIwLCAy NiB9LAorICAgICAgICAgICAgeyAgMCwgIDMsICA5LCAxNSwgMjEsIDIxIH0sCisgICAgICAgICAg ICB7ICAwLCAgNCwgMTAsIDE2LCAyMiwgMjIgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAg ICAgICAgICB7ICAwLCAgNSwgMTEsIDE3LCAyMywgMjcgfSwKKyAgICAgICAgICAgIHsgIDAsICA2 LCAxMiwgMTgsIDI0LCAyNCB9LAorICAgICAgICAgICAgeyAgMSwgIDcsIDEzLCAxOSwgMjUsIDI1 IH0sCisgICAgICAgIH0KKyAgICB9OworICAgIGNvbnN0IFZWQ0ZyYW1lUGFyYW1TZXRzICpwcyAg ICAgPSAmbGMtPmZjLT5wczsKKyAgICBjb25zdCBWVkNTUFMgKnNwcyAgICAgICAgICAgICAgID0g cHMtPnNwczsKKyAgICBjb25zdCBIMjY2UmF3U2xpY2VIZWFkZXIgKnJzaCAgID0gbGMtPnNjLT5z aC5yOworICAgIGNvbnN0IENvZGluZ1VuaXQgKmN1ICAgICAgICAgICAgPSBsYy0+Y3U7CisgICAg Y29uc3QgVlZDU2NhbGluZ0xpc3QgKnNsICAgICAgICA9IHBzLT5zbDsKKyAgICBjb25zdCBpbnQg aWQgPSBpZHNbY3UtPnByZWRfbW9kZSAhPSBNT0RFX0lOVFJBXVt0Yi0+Y19pZHhdW0ZGTUFYKHRi LT5sb2cyX3RiX2hlaWdodCwgdGItPmxvZzJfdGJfd2lkdGgpIC0gMV07CisgICAgY29uc3QgaW50 IGxvZzJfbWF0cml4X3NpemUgPSAoaWQgPCAyKSA/IDEgOiAoaWQgPCA4KSA/IDIgOiAzOworICAg IHVpbnQ4X3QgKnAgPSBzY2FsZV9tOworCisgICAgYXZfYXNzZXJ0MCghc3BzLT5yLT5zcHNfc2Nh bGluZ19tYXRyaXhfZm9yX2FsdGVybmF0aXZlX2NvbG91cl9zcGFjZV9kaXNhYmxlZF9mbGFnKTsK KworICAgIGlmICghcnNoLT5zaF9leHBsaWNpdF9zY2FsaW5nX2xpc3RfdXNlZF9mbGFnIHx8IHRi LT50cyB8fAorICAgICAgICBzcHMtPnItPnNwc19zY2FsaW5nX21hdHJpeF9mb3JfbGZuc3RfZGlz YWJsZWRfZmxhZyAmJiBjdS0+YXBwbHlfbGZuc3RfZmxhZ1t0Yi0+Y19pZHhdKQorICAgICAgICBy ZXR1cm4gZmZfdnZjX2RlZmF1bHRfc2NhbGVfbTsKKworICAgIGlmICghc2wpIHsKKyAgICAgICAg YXZfbG9nKGxjLT5mYy0+bG9nX2N0eCwgQVZfTE9HX1dBUk5JTkcsICJidWc6IG5vIHNjYWxpbmcg bGlzdCBhcHMsIGlkID0gJWQiLCBwcy0+cGguci0+cGhfc2NhbGluZ19saXN0X2Fwc19pZCk7Cisg ICAgICAgIHJldHVybiBmZl92dmNfZGVmYXVsdF9zY2FsZV9tOworICAgIH0KKworICAgIGZvciAo aW50IHkgPSB0Yi0+bWluX3NjYW5feTsgeSA8PSB0Yi0+bWF4X3NjYW5feTsgeSsrKSB7CisgICAg ICAgIGNvbnN0IGludCBvZmYgPSB5IDw8IGxvZzJfbWF0cml4X3NpemUgPj4gdGItPmxvZzJfdGJf aGVpZ2h0IDw8IGxvZzJfbWF0cml4X3NpemU7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm0gPSAm c2wtPnNjYWxpbmdfbWF0cml4X3JlY1tpZF1bb2ZmXTsKKworICAgICAgICBmb3IgKGludCB4ID0g dGItPm1pbl9zY2FuX3g7IHggPD0gdGItPm1heF9zY2FuX3g7IHgrKykKKyAgICAgICAgICAgICpw KysgPSBtW3ggPDwgbG9nMl9tYXRyaXhfc2l6ZSA+PiB0Yi0+bG9nMl90Yl93aWR0aF07CisgICAg fQorICAgIGlmIChpZCA+PSBTTF9TVEFSVF8xNngxNiAmJiAhdGItPm1pbl9zY2FuX3ggJiYgIXRi LT5taW5fc2Nhbl95KQorICAgICAgICAqc2NhbGVfbSA9IHNsLT5zY2FsaW5nX21hdHJpeF9kY19y ZWNbaWQgLSBTTF9TVEFSVF8xNngxNl07CisKKyAgICByZXR1cm4gc2NhbGVfbTsKK30KKworLy84 LjcuMyBTY2FsaW5nIHByb2Nlc3MgZm9yIHRyYW5zZm9ybSBjb2VmZmljaWVudHMKK3N0YXRpYyBh dl9hbHdheXNfaW5saW5lIGludCBzY2FsZV9jb2VmZihjb25zdCBUcmFuc2Zvcm1CbG9jayAqdGIs IGludCBjb2VmZiwKKyAgICBjb25zdCBpbnQgc2NhbGUsIGNvbnN0IGludCBzY2FsZV9tLCBjb25z dCBpbnQgbG9nMl90cmFuc2Zvcm1fcmFuZ2UpCit7CisgICAgY29lZmYgPSAoY29lZmYgKiBzY2Fs ZSAqIHNjYWxlX20gKyB0Yi0+YmRfb2Zmc2V0KSA+PiB0Yi0+YmRfc2hpZnQ7CisgICAgY29lZmYg PSBhdl9jbGlwX2ludHAyKGNvZWZmLCBsb2cyX3RyYW5zZm9ybV9yYW5nZSk7CisgICAgcmV0dXJu IGNvZWZmOworfQorCitzdGF0aWMgdm9pZCBkZXF1YW50KGNvbnN0IFZWQ0xvY2FsQ29udGV4dCAq bGMsIGNvbnN0IFRyYW5zZm9ybVVuaXQgKnR1LCBUcmFuc2Zvcm1CbG9jayAqdGIpCit7CisgICAg dWludDhfdCB0bXBbTUFYX1RCX1NJWkUgKiBNQVhfVEJfU0laRV07CisgICAgY29uc3QgSDI2NlJh d1NsaWNlSGVhZGVyICpyc2ggICA9IGxjLT5zYy0+c2gucjsKKyAgICBjb25zdCBWVkNTUFMgKnNw cyAgICAgICAgICAgICAgID0gbGMtPmZjLT5wcy5zcHM7CisgICAgY29uc3QgdWludDhfdCAqc2Nh bGVfbSAgICAgICAgICA9IGRlcml2ZV9zY2FsZV9tKGxjLCB0YiwgdG1wKTsKKyAgICBpbnQgc2Nh bGU7CisKKyAgICBkZXJpdmVfcXAobGMsIHR1LCB0Yik7CisgICAgc2NhbGUgPSBkZXJpdmVfc2Nh bGUodGIsIHJzaC0+c2hfZGVwX3F1YW50X3VzZWRfZmxhZyk7CisKKyAgICBmb3IgKGludCB5ID0g dGItPm1pbl9zY2FuX3k7IHkgPD0gdGItPm1heF9zY2FuX3k7IHkrKykgeworICAgICAgICBmb3Ig KGludCB4ID0gdGItPm1pbl9zY2FuX3g7IHggPD0gdGItPm1heF9zY2FuX3g7IHgrKykgeworICAg ICAgICAgICAgaW50ICpjb2VmZiA9IHRiLT5jb2VmZnMgKyB5ICogdGItPnRiX3dpZHRoICsgeDsK KworICAgICAgICAgICAgaWYgKCpjb2VmZikKKyAgICAgICAgICAgICAgICAqY29lZmYgPSBzY2Fs ZV9jb2VmZih0YiwgKmNvZWZmLCBzY2FsZSwgKnNjYWxlX20sIHNwcy0+bG9nMl90cmFuc2Zvcm1f cmFuZ2UpOworICAgICAgICAgICAgc2NhbGVfbSsrOworICAgICAgICB9CisgICAgfQorfQorCisv L3RyYW5zbWF0cml4WzBdWzBdCisjZGVmaW5lIERDVF9BIDY0CitzdGF0aWMgdm9pZCBpdHhfMmQo Y29uc3QgVlZDRnJhbWVDb250ZXh0ICpmYywgVHJhbnNmb3JtQmxvY2sgKnRiLCBjb25zdCBlbnVt IFR4VHlwZSB0cmgsIGNvbnN0IGVudW0gVHhUeXBlIHRydikKK3sKKyAgICBjb25zdCBWVkNTUFMg KnNwcyAgID0gZmMtPnBzLnNwczsKKyAgICBjb25zdCBpbnQgdyAgICAgICAgID0gdGItPnRiX3dp ZHRoOworICAgIGNvbnN0IGludCBoICAgICAgICAgPSB0Yi0+dGJfaGVpZ2h0OworICAgIGNvbnN0 IHNpemVfdCBuencgICAgPSB0Yi0+bWF4X3NjYW5feCArIDE7CisgICAgY29uc3Qgc2l6ZV90IG56 aCAgICA9IHRiLT5tYXhfc2Nhbl95ICsgMTsKKyAgICBjb25zdCBpbnQgc2hpZnRbXSAgID0geyA3 LCA1ICsgc3BzLT5sb2cyX3RyYW5zZm9ybV9yYW5nZSAtIHNwcy0+Yml0X2RlcHRoIH07CisKKyAg ICBpZiAodyA9PSBoICYmIG56dyA9PSAxICYmIG56aCA9PSAxICYmIHRyaCA9PSBEQ1QyICYmIHRy diA9PSBEQ1QyKSB7CisgICAgICAgIGNvbnN0IGludCBhZGRbXSA9IHsgMSA8PCAoc2hpZnRbMF0g LSAxKSwgMSA8PCAoc2hpZnRbMV0gLSAxKSB9OworICAgICAgICBjb25zdCBpbnQgdCAgICAgPSAo dGItPmNvZWZmc1swXSAqIERDVF9BICsgYWRkWzBdKSA+PiBzaGlmdFswXTsKKyAgICAgICAgY29u c3QgaW50IGRjICAgID0gKHQgKiBEQ1RfQSArIGFkZFsxXSkgPj4gc2hpZnRbMV07CisKKyAgICAg ICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3ICogaDsgaSsrKQorICAgICAgICAgICAgdGItPmNvZWZm c1tpXSA9IGRjOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGludCB4ID0g MDsgeCA8IG56dzsgeCsrKQorICAgICAgICBmYy0+dnZjZHNwLml0eC5pdHhbdHJ2XVt0Yi0+bG9n Ml90Yl9oZWlnaHQgLSAxXSh0Yi0+Y29lZmZzICsgeCwgdywgbnpoKTsKKyAgICBzY2FsZV9jbGlw KHRiLT5jb2VmZnMsIG56dywgdywgaCwgc2hpZnRbMF0sIHNwcy0+bG9nMl90cmFuc2Zvcm1fcmFu Z2UpOworCisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspCisgICAgICAgIGZjLT52dmNk c3AuaXR4Lml0eFt0cmhdW3RiLT5sb2cyX3RiX3dpZHRoIC0gMV0odGItPmNvZWZmcyArIHkgKiB3 LCAxLCBuencpOworICAgIHNjYWxlKHRiLT5jb2VmZnMsIHRiLT5jb2VmZnMsIHcsIGgsIHNoaWZ0 WzFdKTsKK30KKworc3RhdGljIHZvaWQgaXR4XzFkKGNvbnN0IFZWQ0ZyYW1lQ29udGV4dCAqZmMs IFRyYW5zZm9ybUJsb2NrICp0YiwgY29uc3QgZW51bSBUeFR5cGUgdHJoLCBjb25zdCBlbnVtIFR4 VHlwZSB0cnYpCit7CisgICAgY29uc3QgVlZDU1BTICpzcHMgICA9IGZjLT5wcy5zcHM7CisgICAg Y29uc3QgaW50IHcgICAgICAgICA9IHRiLT50Yl93aWR0aDsKKyAgICBjb25zdCBpbnQgaCAgICAg ICAgID0gdGItPnRiX2hlaWdodDsKKyAgICBjb25zdCBzaXplX3Qgbnp3ICAgID0gdGItPm1heF9z Y2FuX3ggKyAxOworICAgIGNvbnN0IHNpemVfdCBuemggICAgPSB0Yi0+bWF4X3NjYW5feSArIDE7 CisKKyAgICBpZiAoKHcgPiAxICYmIG56dyA9PSAxICYmIHRyaCA9PSBEQ1QyKSB8fCAoaCA+IDEg JiYgbnpoID09IDEgJiYgdHJ2ID09IERDVDIpKSB7CisgICAgICAgIGNvbnN0IGludCBzaGlmdCA9 IDYgKyBzcHMtPmxvZzJfdHJhbnNmb3JtX3JhbmdlIC0gc3BzLT5iaXRfZGVwdGg7CisgICAgICAg IGNvbnN0IGludCBhZGQgICA9IDEgPDwgKHNoaWZ0IC0gMSk7CisgICAgICAgIGNvbnN0IGludCBk YyAgICA9ICh0Yi0+Y29lZmZzWzBdICogRENUX0EgKyBhZGQpID4+IHNoaWZ0OworCisgICAgICAg IGZvciAoaW50IGkgPSAwOyBpIDwgdyAqIGg7IGkrKykKKyAgICAgICAgICAgIHRiLT5jb2VmZnNb aV0gPSBkYzsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHcgPiAxKQorICAg ICAgICBmYy0+dnZjZHNwLml0eC5pdHhbdHJoXVt0Yi0+bG9nMl90Yl93aWR0aCAtIDFdKHRiLT5j b2VmZnMsIDEsIG56dyk7CisgICAgZWxzZQorICAgICAgICBmYy0+dnZjZHNwLml0eC5pdHhbdHJ2 XVt0Yi0+bG9nMl90Yl9oZWlnaHQgLSAxXSh0Yi0+Y29lZmZzLCAxLCBuemgpOworICAgIHNjYWxl KHRiLT5jb2VmZnMsIHRiLT5jb2VmZnMsIHcsIGgsIDYgKyBzcHMtPmxvZzJfdHJhbnNmb3JtX3Jh bmdlIC0gc3BzLT5iaXRfZGVwdGgpOworfQorCitzdGF0aWMgdm9pZCB0cmFuc2Zvcm1fYmRwY20o VHJhbnNmb3JtQmxvY2sgKnRiLCBjb25zdCBWVkNMb2NhbENvbnRleHQgKmxjLCBjb25zdCBDb2Rp bmdVbml0ICpjdSkKK3sKKyAgICBjb25zdCBWVkNTUFMgKnNwcyAgICAgICAgPSBsYy0+ZmMtPnBz LnNwczsKKyAgICBjb25zdCBJbnRyYVByZWRNb2RlIG1vZGUgPSB0Yi0+Y19pZHggPyBjdS0+aW50 cmFfcHJlZF9tb2RlX2MgOiBjdS0+aW50cmFfcHJlZF9tb2RlX3k7CisgICAgY29uc3QgaW50IHZl cnRpY2FsICAgICAgID0gbW9kZSA9PSBJTlRSQV9WRVJUOworICAgIGxjLT5mYy0+dnZjZHNwLml0 eC50cmFuc2Zvcm1fYmRwY20odGItPmNvZWZmcywgdGItPnRiX3dpZHRoLCB0Yi0+dGJfaGVpZ2h0 LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwsIHNwcy0+ bG9nMl90cmFuc2Zvcm1fcmFuZ2UpOworICAgIGlmICh2ZXJ0aWNhbCkKKyAgICAgICAgdGItPm1h eF9zY2FuX3kgPSB0Yi0+dGJfaGVpZ2h0IC0gMTsKKyAgICBlbHNlCisgICAgICAgIHRiLT5tYXhf c2Nhbl94ID0gdGItPnRiX3dpZHRoIC0gMTsKK30KKworc3RhdGljIHZvaWQgaXRyYW5zZm9ybShW VkNMb2NhbENvbnRleHQgKmxjLCBUcmFuc2Zvcm1Vbml0ICp0dSwgY29uc3QgaW50IHR1X2lkeCwg Y29uc3QgaW50IHRhcmdldF9jaF90eXBlKQoreworICAgIGNvbnN0IFZWQ0ZyYW1lQ29udGV4dCAq ZmMgICA9IGxjLT5mYzsKKyAgICBjb25zdCBWVkNTUFMgKnNwcyAgICAgICAgICAgPSBmYy0+cHMu c3BzOworICAgIGNvbnN0IFZWQ1NIICpzaCAgICAgICAgICAgICA9ICZsYy0+c2MtPnNoOworICAg IGNvbnN0IENvZGluZ1VuaXQgKmN1ICAgICAgICA9IGxjLT5jdTsKKyAgICBjb25zdCBpbnQgcHMg ICAgICAgICAgICAgICAgPSBmYy0+cHMuc3BzLT5waXhlbF9zaGlmdDsKKyAgICBERUNMQVJFX0FM SUdORUQoMzIsIGludCwgdGVtcClbTUFYX1RCX1NJWkUgKiBNQVhfVEJfU0laRV07CisKKyAgICBm b3IgKGludCBpID0gMDsgaSA8IHR1LT5uYl90YnM7IGkrKykgeworICAgICAgICBUcmFuc2Zvcm1C bG9jayAqdGIgID0gJnR1LT50YnNbaV07CisgICAgICAgIGNvbnN0IGludCBjX2lkeCAgICAgPSB0 Yi0+Y19pZHg7CisgICAgICAgIGNvbnN0IGludCBjaF90eXBlICAgPSBjX2lkeCA+IDA7CisKKyAg ICAgICAgaWYgKGNoX3R5cGUgPT0gdGFyZ2V0X2NoX3R5cGUgJiYgdGItPmhhc19jb2VmZnMpIHsK KyAgICAgICAgICAgIGNvbnN0IGludCB3ICAgICAgICAgICAgID0gdGItPnRiX3dpZHRoOworICAg ICAgICAgICAgY29uc3QgaW50IGggICAgICAgICAgICAgPSB0Yi0+dGJfaGVpZ2h0OworICAgICAg ICAgICAgY29uc3QgaW50IGNocm9tYV9zY2FsZSAgPSBjaF90eXBlICYmIHNoLT5yLT5zaF9sbWNz X3VzZWRfZmxhZyAmJiBmYy0+cHMucGguci0+cGhfY2hyb21hX3Jlc2lkdWFsX3NjYWxlX2ZsYWcg JiYgKHcgKiBoID4gNCk7CisgICAgICAgICAgICBjb25zdCBwdHJkaWZmX3Qgc3RyaWRlICA9IGZj LT5mcmFtZS0+bGluZXNpemVbY19pZHhdOworICAgICAgICAgICAgY29uc3QgaW50IGhzICAgICAg ICAgICAgPSBzcHMtPmhzaGlmdFtjX2lkeF07CisgICAgICAgICAgICBjb25zdCBpbnQgdnMgICAg ICAgICAgICA9IHNwcy0+dnNoaWZ0W2NfaWR4XTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCAg ICAgICAgICAgID0gJmZjLT5mcmFtZS0+ZGF0YVtjX2lkeF1bKHRiLT55MCA+PiB2cykgKiBzdHJp ZGUgKyAoKHRiLT54MCA+PiBocykgPDwgcHMpXTsKKworICAgICAgICAgICAgaWYgKGN1LT5iZHBj bV9mbGFnW3RiLT5jX2lkeF0pCisgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2JkcGNtKHRiLCBs YywgY3UpOworICAgICAgICAgICAgZGVxdWFudChsYywgdHUsIHRiKTsKKyAgICAgICAgICAgIGlm ICghdGItPnRzKSB7CisgICAgICAgICAgICAgICAgZW51bSBUeFR5cGUgdHJoLCB0cnY7CisKKyAg ICAgICAgICAgICAgICBpZiAoY3UtPmFwcGx5X2xmbnN0X2ZsYWdbY19pZHhdKQorICAgICAgICAg ICAgICAgICAgICBpbGZuc3RfdHJhbnNmb3JtKGxjLCB0Yik7CisgICAgICAgICAgICAgICAgZGVy aXZlX3RyYW5zZm9ybV90eXBlKGZjLCBsYywgdGIsICZ0cmgsICZ0cnYpOworICAgICAgICAgICAg ICAgIGlmICh3ID4gMSAmJiBoID4gMSkKKyAgICAgICAgICAgICAgICAgICAgaXR4XzJkKGZjLCB0 YiwgdHJoLCB0cnYpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAg aXR4XzFkKGZjLCB0YiwgdHJoLCB0cnYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBp ZiAoY2hyb21hX3NjYWxlKQorICAgICAgICAgICAgICAgIGZjLT52dmNkc3AuaW50cmEubG1jc19z Y2FsZV9jaHJvbWEobGMsIHRlbXAsIHRiLT5jb2VmZnMsIHcsIGgsIGN1LT54MCwgY3UtPnkwKTsK KyAgICAgICAgICAgIGZjLT52dmNkc3AuaXR4LmFkZF9yZXNpZHVhbChkc3QsIGNocm9tYV9zY2Fs ZSA/IHRlbXAgOiB0Yi0+Y29lZmZzLCB3LCBoLCBzdHJpZGUpOworCisgICAgICAgICAgICBpZiAo dHUtPmpvaW50X2NiY3JfcmVzaWR1YWxfZmxhZyAmJiB0Yi0+Y19pZHgpCisgICAgICAgICAgICAg ICAgYWRkX3Jlc2lkdWFsX2Zvcl9qb2ludF9jb2RpbmdfY2hyb21hKGxjLCB0dSwgdGIsIGNocm9t YV9zY2FsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcmVjb25zdHJ1Y3Qo VlZDTG9jYWxDb250ZXh0ICpsYykKK3sKKyAgICBWVkNGcmFtZUNvbnRleHQgKmZjID0gbGMtPmZj OworICAgIENvZGluZ1VuaXQgKmN1ICAgICAgPSBsYy0+Y3U7CisgICAgY29uc3QgaW50IHN0YXJ0 ICAgICA9IGN1LT50cmVlX3R5cGUgPT0gRFVBTF9UUkVFX0NIUk9NQTsKKyAgICBjb25zdCBpbnQg ZW5kICAgICAgID0gZmMtPnBzLnNwcy0+ci0+c3BzX2Nocm9tYV9mb3JtYXRfaWRjICYmIChjdS0+ dHJlZV90eXBlICE9IERVQUxfVFJFRV9MVU1BKTsKKworICAgIGZvciAoaW50IGNoX3R5cGUgPSBz dGFydDsgY2hfdHlwZSA8PSBlbmQ7IGNoX3R5cGUrKykgeworICAgICAgICBUcmFuc2Zvcm1Vbml0 ICp0dSA9IGN1LT50dXMuaGVhZDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IHR1OyBpKyspIHsK KyAgICAgICAgICAgIHByZWRpY3RfaW50cmEobGMsIHR1LCBpLCBjaF90eXBlKTsKKyAgICAgICAg ICAgIGl0cmFuc2Zvcm0obGMsIHR1LCBpLCBjaF90eXBlKTsKKyAgICAgICAgICAgIHR1ID0gdHUt Pm5leHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl92dmNf cmVjb25zdHJ1Y3QoVlZDTG9jYWxDb250ZXh0ICpsYywgY29uc3QgaW50IHJzLCBjb25zdCBpbnQg cngsIGNvbnN0IGludCByeSkKK3sKKyAgICBjb25zdCBWVkNGcmFtZUNvbnRleHQgKmZjICAgPSBs Yy0+ZmM7CisgICAgY29uc3QgVlZDU1BTICpzcHMgICAgICAgICAgID0gZmMtPnBzLnNwczsKKyAg ICBjb25zdCBpbnQgeF9jdGIgICAgICAgICAgICAgPSByeCA8PCBzcHMtPmN0Yl9sb2cyX3NpemVf eTsKKyAgICBjb25zdCBpbnQgeV9jdGIgICAgICAgICAgICAgPSByeSA8PCBzcHMtPmN0Yl9sb2cy X3NpemVfeTsKKyAgICBDVFUgKmN0dSAgICAgICAgICAgICAgICAgICAgPSBmYy0+dGFiLmN0dXMg KyByczsKKyAgICBDb2RpbmdVbml0ICpjdSAgICAgICAgICAgICAgPSBjdHUtPmN1czsKKyAgICBp bnQgcmV0ICAgICAgICAgICAgICAgICAgICAgPSAwOworCisgICAgbGMtPm51bV9yYXNbMF0gPSBs Yy0+bnVtX3Jhc1sxXSA9IDA7CisgICAgbGMtPmxtY3MueF92cGR1ID0gLTE7CisgICAgbGMtPmxt Y3MueV92cGR1ID0gLTE7CisgICAgZmZfdnZjX2RlY29kZV9uZWlnaGJvdXIobGMsIHhfY3RiLCB5 X2N0YiwgcngsIHJ5LCBycyk7CisgICAgd2hpbGUgKGN1KSB7CisgICAgICAgIGxjLT5jdSA9IGN1 OworCisgICAgICAgIGlmIChjdS0+Y2lpcF9mbGFnKQorICAgICAgICAgICAgZmZfdnZjX3ByZWRp Y3RfY2lpcChsYyk7CisgICAgICAgIGlmIChjdS0+Y29kZWRfZmxhZykgeworICAgICAgICAgICAg cmV0ID0gcmVjb25zdHJ1Y3QobGMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRk X3JlY29uc3RydWN0ZWRfYXJlYShsYywgTFVNQSwgY3UtPngwLCBjdS0+eTAsIGN1LT5jYl93aWR0 aCwgY3UtPmNiX2hlaWdodCk7CisgICAgICAgICAgICBhZGRfcmVjb25zdHJ1Y3RlZF9hcmVhKGxj LCBDSFJPTUEsIGN1LT54MCwgY3UtPnkwLCBjdS0+Y2Jfd2lkdGgsIGN1LT5jYl9oZWlnaHQpOwor ICAgICAgICB9CisgICAgICAgIGN1ID0gY3UtPm5leHQ7CisgICAgfQorICAgIGZmX3Z2Y19jdHVf ZnJlZV9jdXMoY3R1KTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZfdnZjX2dldF9taXBf c2l6ZV9pZChjb25zdCBpbnQgdywgY29uc3QgaW50IGgpCit7CisgICAgaWYgKHcgPT0gNCAmJiBo ID09IDQpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICgodyA9PSA0IHx8IGggPT0gNCkgfHwg KHcgPT0gOCAmJiBoID09IDgpKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMjsKK30K KworaW50IGZmX3Z2Y19uc2NhbGVfZGVyaXZlKGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwgY29u c3QgaW50IG1vZGUpCit7CisgICAgaW50IHNpZGVfc2l6ZSwgbnNjYWxlOworICAgIGF2X2Fzc2Vy dDAobW9kZSA8IElOVFJBX0xUX0NDTE0gJiYgIShtb2RlID4gSU5UUkFfSE9SWiAmJiBtb2RlIDwg SU5UUkFfVkVSVCkpOworICAgIGlmIChtb2RlID09IElOVFJBX1BMQU5BUiB8fCBtb2RlID09IElO VFJBX0RDIHx8CisgICAgICAgIG1vZGUgPT0gSU5UUkFfSE9SWiB8fCBtb2RlID09IElOVFJBX1ZF UlQpIHsKKyAgICAgICAgbnNjYWxlID0gKGF2X2xvZzIodykgKyBhdl9sb2cyKGgpIC0gMikgPj4g MjsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBpbnQgaW50cmFfcHJlZF9hbmdsZSA9IGZm X3Z2Y19pbnRyYV9wcmVkX2FuZ2xlX2Rlcml2ZShtb2RlKTsKKyAgICAgICAgY29uc3QgaW50IGlu dl9hbmdsZSAgICAgICAgPSBmZl92dmNfaW50cmFfaW52X2FuZ2xlX2Rlcml2ZShpbnRyYV9wcmVk X2FuZ2xlKTsKKyAgICAgICAgaWYgKG1vZGUgPj0gSU5UUkFfVkVSVCkKKyAgICAgICAgICAgIHNp ZGVfc2l6ZSA9IGg7CisgICAgICAgIGlmIChtb2RlIDw9IElOVFJBX0hPUlopCisgICAgICAgICAg ICBzaWRlX3NpemUgPSB3OworICAgICAgICBuc2NhbGUgPSBGRk1JTigyLCBhdl9sb2cyKHNpZGVf c2l6ZSkgLSBhdl9sb2cyKDMgKiBpbnZfYW5nbGUgLSAyKSArIDgpOworICAgIH0KKyAgICByZXR1 cm4gbnNjYWxlOworfQorCitpbnQgZmZfdnZjX25lZWRfcGRwYyhjb25zdCBpbnQgdywgY29uc3Qg aW50IGgsIGNvbnN0IHVpbnQ4X3QgYmRwY21fZmxhZywgY29uc3QgaW50IG1vZGUsIGNvbnN0IGlu dCByZWZfaWR4KQoreworICAgIGF2X2Fzc2VydDAobW9kZSA8IElOVFJBX0xUX0NDTE0pOworICAg IGlmICgodyA+PSA0ICYmIGggPj0gNCkgJiYgIXJlZl9pZHggJiYgIWJkcGNtX2ZsYWcpIHsKKyAg ICAgICAgaW50IG5zY2FsZTsKKyAgICAgICAgaWYgKG1vZGUgPT0gSU5UUkFfUExBTkFSIHx8IG1v ZGUgPT0gSU5UUkFfREMgfHwKKyAgICAgICAgICAgIG1vZGUgPT0gSU5UUkFfSE9SWiB8fCBtb2Rl ID09IElOVFJBX1ZFUlQpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgaWYgKG1vZGUg PiBJTlRSQV9IT1JaICYmIG1vZGUgPCBJTlRSQV9WRVJUKQorICAgICAgICAgICAgcmV0dXJuIDA7 CisgICAgICAgIG5zY2FsZSA9IGZmX3Z2Y19uc2NhbGVfZGVyaXZlKHcsIGgsIG1vZGUpOworICAg ICAgICByZXR1cm4gbnNjYWxlID49IDA7CisKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBjb25zdCBSZWNvbnN0cnVjdGVkQXJlYSogZ2V0X3JlY29uc3RydWN0ZWRfYXJlYShjb25z dCBWVkNMb2NhbENvbnRleHQgKmxjLCBjb25zdCBpbnQgeCwgY29uc3QgaW50IHksIGNvbnN0IGlu dCBjX2lkeCkKK3sKKyAgICBjb25zdCBpbnQgY2hfdHlwZSA9IGNfaWR4ID4gMDsKKyAgICBmb3Ig KGludCBpID0gbGMtPm51bV9yYXNbY2hfdHlwZV0gLSAxOyBpID49IDA7IGktLSkgeworICAgICAg ICBjb25zdCBSZWNvbnN0cnVjdGVkQXJlYSogYSA9ICZsYy0+cmFzW2NoX3R5cGVdW2ldOworICAg ICAgICBjb25zdCBpbnQgciA9IChhLT54ICsgYS0+dyk7CisgICAgICAgIGNvbnN0IGludCBiID0g KGEtPnkgKyBhLT5oKTsKKyAgICAgICAgaWYgKGEtPnggPD0geCAmJiB4IDwgciAmJiBhLT55IDw9 IHkgJiYgeSA8IGIpCisgICAgICAgICAgICByZXR1cm4gYTsKKworICAgICAgICAvL2l0J3MgdG9v IGZhciBhd2F5LCBubyBuZWVkIGNoZWNrIGl0OworICAgICAgICBpZiAoeCA+PSByICYmIHkgPj0g YikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50 IGZmX3Z2Y19nZXRfdG9wX2F2YWlsYWJsZShjb25zdCBWVkNMb2NhbENvbnRleHQgKmxjLCBjb25z dCBpbnQgeCwgY29uc3QgaW50IHksIGludCB0YXJnZXRfc2l6ZSwgY29uc3QgaW50IGNfaWR4KQor eworICAgIGNvbnN0IFZWQ0ZyYW1lQ29udGV4dCAqZmMgPSBsYy0+ZmM7CisgICAgY29uc3QgVlZD U1BTICpzcHMgPSBmYy0+cHMuc3BzOworICAgIGNvbnN0IGludCBocyA9IHNwcy0+aHNoaWZ0W2Nf aWR4XTsKKyAgICBjb25zdCBpbnQgdnMgPSBzcHMtPnZzaGlmdFtjX2lkeF07CisgICAgY29uc3Qg aW50IGxvZzJfY3RiX3NpemVfdiAgID0gc3BzLT5jdGJfbG9nMl9zaXplX3kgLSB2czsKKyAgICBj b25zdCBpbnQgZW5kX29mX2N0Yl94ICAgICAgPSAoKGxjLT5jdS0+eDAgPj4gc3BzLT5jdGJfbG9n Ml9zaXplX3kpICsgMSkgPDwgc3BzLT5jdGJfbG9nMl9zaXplX3k7CisgICAgY29uc3QgaW50IHkw YiAgICAgICAgICAgICAgID0gYXZfbW9kX3VpbnRwMih5LCBsb2cyX2N0Yl9zaXplX3YpOworICAg IGNvbnN0IGludCBtYXhfeCAgICAgICAgICAgICA9IEZGTUlOKGZjLT5wcy5wcHMtPndpZHRoLCBl bmRfb2ZfY3RiX3gpID4+IGhzOworICAgIGNvbnN0IFJlY29uc3RydWN0ZWRBcmVhICphOworICAg IGludCBweCA9IHg7CisKKyAgICBpZiAoIXkwYikgeworICAgICAgICBpZiAoIWxjLT5jdGJfdXBf ZmxhZykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB0YXJnZXRfc2l6ZSA9IEZGTUlO KHRhcmdldF9zaXplLCAobGMtPmVuZF9vZl90aWxlc194ID4+IGhzKSAtIHgpOworICAgICAgICBp ZiAoc3BzLT5yLT5zcHNfZW50cm9weV9jb2Rpbmdfc3luY19lbmFibGVkX2ZsYWcpCisgICAgICAg ICAgICB0YXJnZXRfc2l6ZSA9IEZGTUlOKHRhcmdldF9zaXplLCAoZW5kX29mX2N0Yl94ID4+IGhz KSAtIHgpOworICAgICAgICByZXR1cm4gdGFyZ2V0X3NpemU7CisgICAgfQorCisgICAgdGFyZ2V0 X3NpemUgPSBGRk1BWCgwLCBGRk1JTih0YXJnZXRfc2l6ZSwgbWF4X3ggLSB4KSk7CisgICAgd2hp bGUgKHRhcmdldF9zaXplID4gMCAmJiAoYSA9IGdldF9yZWNvbnN0cnVjdGVkX2FyZWEobGMsIHB4 LCB5IC0gMSwgY19pZHgpKSkgeworICAgICAgICBjb25zdCBpbnQgc3ogPSBGRk1JTih0YXJnZXRf c2l6ZSwgYS0+eCArIGEtPncgLSBweCk7CisgICAgICAgIHB4ICs9IHN6OworICAgICAgICB0YXJn ZXRfc2l6ZSAtPSBzejsKKyAgICB9CisgICAgcmV0dXJuIHB4IC0geDsKK30KKworaW50IGZmX3Z2 Y19nZXRfbGVmdF9hdmFpbGFibGUoY29uc3QgVlZDTG9jYWxDb250ZXh0ICpsYywgY29uc3QgaW50 IHgsIGNvbnN0IGludCB5LCBpbnQgdGFyZ2V0X3NpemUsIGNvbnN0IGludCBjX2lkeCkKK3sKKyAg ICBjb25zdCBWVkNGcmFtZUNvbnRleHQgKmZjID0gbGMtPmZjOworICAgIGNvbnN0IFZWQ1NQUyAq c3BzID0gZmMtPnBzLnNwczsKKyAgICBjb25zdCBpbnQgaHMgPSBzcHMtPmhzaGlmdFtjX2lkeF07 CisgICAgY29uc3QgaW50IHZzID0gc3BzLT52c2hpZnRbY19pZHhdOworICAgIGNvbnN0IGludCBs b2cyX2N0Yl9zaXplX2ggICA9ICBzcHMtPmN0Yl9sb2cyX3NpemVfeSAtIGhzOworICAgIGNvbnN0 IGludCB4MGIgICAgICAgICAgICAgICA9IGF2X21vZF91aW50cDIoeCwgbG9nMl9jdGJfc2l6ZV9o KTsKKyAgICBjb25zdCBpbnQgZW5kX29mX2N0Yl95ICAgICAgPSAoKGxjLT5jdS0+eTAgPj4gc3Bz LT5jdGJfbG9nMl9zaXplX3kpICsgMSkgPDwgc3BzLT5jdGJfbG9nMl9zaXplX3k7CisgICAgY29u c3QgaW50IG1heF95ICAgICAgICAgICAgID0gRkZNSU4oZmMtPnBzLnBwcy0+aGVpZ2h0LCBlbmRf b2ZfY3RiX3kpID4+IHZzOworICAgIGNvbnN0IFJlY29uc3RydWN0ZWRBcmVhICphOworICAgIGlu dCAgcHkgPSB5OworCisgICAgaWYgKCF4MGIgJiYgIWxjLT5jdGJfbGVmdF9mbGFnKQorICAgICAg ICByZXR1cm4gMDsKKworICAgIHRhcmdldF9zaXplID0gRkZNQVgoMCwgRkZNSU4odGFyZ2V0X3Np emUsIG1heF95IC0geSkpOworICAgIGlmICgheDBiKQorICAgICAgICByZXR1cm4gdGFyZ2V0X3Np emU7CisKKyAgICB3aGlsZSAodGFyZ2V0X3NpemUgPiAwICYmIChhID0gZ2V0X3JlY29uc3RydWN0 ZWRfYXJlYShsYywgeCAtIDEsIHB5LCBjX2lkeCkpKSB7CisgICAgICAgIGNvbnN0IGludCBzeiA9 IEZGTUlOKHRhcmdldF9zaXplLCBhLT55ICsgYS0+aCAtIHB5KTsKKyAgICAgICAgcHkgKz0gc3o7 CisgICAgICAgIHRhcmdldF9zaXplIC09IHN6OworICAgIH0KKyAgICByZXR1cm4gcHkgLSB5Owor fQorCitzdGF0aWMgaW50IGxlc3MoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAg ICByZXR1cm4gKihjb25zdCBpbnQqKWEgLSAqKGNvbnN0IGludCopYjsKK30KKworaW50IGZmX3Z2 Y19yZWZfZmlsdGVyX2ZsYWdfZGVyaXZlKGNvbnN0IGludCBtb2RlKQoreworICAgIHN0YXRpYyBj b25zdCBpbnQgbW9kZXNbXSA9IHsgLTE0LCAtMTIsIC0xMCwgLTYsIElOVFJBX1BMQU5BUiwgMiwg MzQsIDY2LCA3MiwgNzYsIDc4LCA4MH07CisgICAgcmV0dXJuIGJzZWFyY2goJm1vZGUsIG1vZGVz LCBGRl9BUlJBWV9FTEVNUyhtb2RlcyksIHNpemVvZihpbnQpLCBsZXNzKSAhPSBOVUxMOworfQor CitpbnQgZmZfdnZjX2ludHJhX3ByZWRfYW5nbGVfZGVyaXZlKGNvbnN0IGludCBwcmVkX21vZGUp Cit7CisgICAgc3RhdGljIGNvbnN0IGludCBhbmdsZXNbXSA9IHsKKyAgICAgICAgICAwLCAgIDEs ICAgMiwgICAzLCAgIDQsICAgNiwgICA4LCAgMTAsICAxMiwgIDE0LCAgMTYsICAxOCwgIDIwLCAg MjMsICAyNiwgMjksCisgICAgICAgICAzMiwgIDM1LCAgMzksICA0NSwgIDUxLCAgNTcsICA2NCwg IDczLCAgODYsIDEwMiwgMTI4LCAxNzEsIDI1NiwgMzQxLCA1MTIKKyAgICB9OworICAgIGludCBz aWduID0gMSwgaWR4LCBpbnRyYV9wcmVkX2FuZ2xlOworICAgIGlmIChwcmVkX21vZGUgPiBJTlRS QV9ESUFHKSB7CisgICAgICAgIGlkeCA9IHByZWRfbW9kZSAtIElOVFJBX1ZFUlQ7CisgICAgfSBl bHNlIGlmIChwcmVkX21vZGUgPiAwKSB7CisgICAgICAgIGlkeCA9IElOVFJBX0hPUlogLSBwcmVk X21vZGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWR4ID0gSU5UUkFfSE9SWiAtIDIgLSBwcmVk X21vZGU7CisgICAgfQorICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIGlkeCA9IC1pZHg7Cisg ICAgICAgIHNpZ24gPSAtMTsKKyAgICB9CisgICAgaW50cmFfcHJlZF9hbmdsZSA9IHNpZ24gKiBh bmdsZXNbaWR4XTsKKyAgICByZXR1cm4gaW50cmFfcHJlZF9hbmdsZTsKK30KKworI2RlZmluZSBS T1VORChmKSAoaW50KShmIDwgMCA/IC0oLWYgKyAwLjUpIDogKGYgKyAwLjUpKQoraW50IGZmX3Z2 Y19pbnRyYV9pbnZfYW5nbGVfZGVyaXZlKGNvbnN0IGludCBpbnRyYV9wcmVkX2FuZ2xlKQorewor ICAgIGZsb2F0IGludl9hbmdsZTsKKyAgICBhdl9hc3NlcnQwKGludHJhX3ByZWRfYW5nbGUpOwor ICAgIGludl9hbmdsZSA9IDMyICogNTEyLjAgLyBpbnRyYV9wcmVkX2FuZ2xlOworICAgIHJldHVy biBST1VORChpbnZfYW5nbGUpOworfQorCisvLzguNC41LjIuNyBXaWRlIGFuZ2xlIGludHJhIHBy ZWRpY3Rpb24gbW9kZSBtYXBwaW5nIHByb2NlcworaW50IGZmX3Z2Y193aWRlX2FuZ2xlX21vZGVf bWFwcGluZyhjb25zdCBDb2RpbmdVbml0ICpjdSwKKyAgICBjb25zdCBpbnQgdGJfd2lkdGgsIGNv bnN0IGludCB0Yl9oZWlnaHQsIGNvbnN0IGludCBjX2lkeCwgaW50IHByZWRfbW9kZV9pbnRyYSkK K3sKKyAgICBpbnQgbncsIG5oLCB3aF9yYXRpbywgbWluLCBtYXg7CisKKyAgICBpZiAoY3UtPmlz cF9zcGxpdF90eXBlID09IElTUF9OT19TUExJVCB8fCBjX2lkeCkgeworICAgICAgICBudyA9IHRi X3dpZHRoOworICAgICAgICBuaCA9IHRiX2hlaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgICBu dyA9IGN1LT5jYl93aWR0aDsKKyAgICAgICAgbmggPSBjdS0+Y2JfaGVpZ2h0OworICAgIH0KKyAg ICB3aF9yYXRpbyAgICA9IEZGQUJTKGZmX2xvZzIobncpIC0gZmZfbG9nMihuaCkpOworICAgIG1h eCAgICAgICAgID0gKHdoX3JhdGlvID4gMSkgPyAoOCAgKyAyICogd2hfcmF0aW8pIDogODsKKyAg ICBtaW4gICAgICAgICA9ICh3aF9yYXRpbyA+IDEpID8gKDYwIC0gMiAqIHdoX3JhdGlvKSA6IDYw OworCisgICAgaWYgKG53ID4gbmggJiYgcHJlZF9tb2RlX2ludHJhID49MiAmJiBwcmVkX21vZGVf aW50cmEgPCBtYXgpCisgICAgICAgIHByZWRfbW9kZV9pbnRyYSArPSA2NTsKKyAgICBlbHNlIGlm IChuaCA+IG53ICYmIHByZWRfbW9kZV9pbnRyYSA8PSA2NiAmJiBwcmVkX21vZGVfaW50cmEgPiBt aW4pCisgICAgICAgIHByZWRfbW9kZV9pbnRyYSAtPSA2NzsKKyAgICByZXR1cm4gcHJlZF9tb2Rl X2ludHJhOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92dmMvdnZjX2ludHJhLmggYi9saWJh dmNvZGVjL3Z2Yy92dmNfaW50cmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwLi42YjY3NDAwOGY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92dmMvdnZjX2lu dHJhLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIFZWQyBpbnRyYSBwcmVkaWN0aW9uCisgKgor ICogQ29weXJpZ2h0IChDKSAyMDIxIE51byBNaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9m IEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg TGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNl bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBl ZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1w ZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIElu Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMw MSBVU0EKKyAqLworI2lmbmRlZiBBVkNPREVDX1ZWQ19WVkNfSU5UUkFfSAorI2RlZmluZSBBVkNP REVDX1ZWQ19WVkNfSU5UUkFfSAorCisjaW5jbHVkZSAidnZjX2N0dS5oIgorCisvKioKKyAqIHJl Y29uc3RydWN0IGEgQ1RVCisgKiBAcGFyYW0gbGMgbG9jYWwgY29udGV4dCBmb3IgQ1RVCisgKiBA cGFyYW0gcnMgcmFzdGVyIG9yZGVyIGZvciB0aGUgQ1RVLgorICogQHBhcmFtIHJ4IHJhc3RlciBv cmRlciB4IGZvciB0aGUgQ1RVLgorICogQHBhcmFtIHJ5IHJhc3RlciBvcmRlciB5IGZvciB0aGUg Q1RVLgorICogQHJldHVybiBBVkVSUk9SCisgKi8KK2ludCBmZl92dmNfcmVjb25zdHJ1Y3QoVlZD TG9jYWxDb250ZXh0ICpsYywgY29uc3QgaW50IHJzLCBjb25zdCBpbnQgcngsIGNvbnN0IGludCBy eSk7CisKKy8vdXRpbHMgZm9yIHZ2Y19pbnRyYV90ZW1wbGF0ZQoraW50IGZmX3Z2Y19nZXRfdG9w X2F2YWlsYWJsZShjb25zdCBWVkNMb2NhbENvbnRleHQgKmxjLCBpbnQgeDAsIGludCB5MCwgaW50 IHRhcmdldF9zaXplLCBpbnQgY19pZHgpOworaW50IGZmX3Z2Y19nZXRfbGVmdF9hdmFpbGFibGUo Y29uc3QgVlZDTG9jYWxDb250ZXh0ICpsYywgaW50IHgwLCBpbnQgeTAsIGludCB0YXJnZXRfc2l6 ZSwgaW50IGNfaWR4KTsKK2ludCBmZl92dmNfZ2V0X21pcF9zaXplX2lkKGludCB3LCBpbnQgaCk7 CitpbnQgZmZfdnZjX25lZWRfcGRwYyhpbnQgdywgaW50IGgsIHVpbnQ4X3QgYmRwY21fZmxhZywg aW50IG1vZGUsIGludCByZWZfaWR4KTsKK2ludCBmZl92dmNfbnNjYWxlX2Rlcml2ZShpbnQgdywg aW50IGgsIGludCBtb2RlKTsKK2ludCBmZl92dmNfcmVmX2ZpbHRlcl9mbGFnX2Rlcml2ZShpbnQg bW9kZSk7CitpbnQgZmZfdnZjX2ludHJhX3ByZWRfYW5nbGVfZGVyaXZlKGludCBwcmVkX21vZGUp OworaW50IGZmX3Z2Y19pbnRyYV9pbnZfYW5nbGVfZGVyaXZlKGludCBwcmVkX21vZGUpOworaW50 IGZmX3Z2Y193aWRlX2FuZ2xlX21vZGVfbWFwcGluZyhjb25zdCBDb2RpbmdVbml0ICpjdSwKKyAg ICBpbnQgdGJfd2lkdGgsIGludCB0Yl9oZWlnaHQsIGludCBjX2lkeCwgaW50IHByZWRfbW9kZV9p bnRyYSk7CisKKyNlbmRpZiAvLyBBVkNPREVDX1ZWQ19WVkNfSU5UUkFfSApkaWZmIC0tZ2l0IGEv bGliYXZjb2RlYy92dmMvdnZjX2ludHJhX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL3Z2Yy92dmNf aW50cmFfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi45 ZmI0NzU0OWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92dmMvdnZjX2ludHJhX3Rl bXBsYXRlLmMKQEAgLTAsMCArMSwxMDE1IEBACisvKgorICogVlZDIGludHJhIHByZWRpY3Rpb24g RFNQCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIxLTIwMjMgTnVvbWkKKyAqCisgKiBUaGlzIGZp bGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIu MSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K KyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2 ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs b25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBG b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24s IE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYml0X2RlcHRo X3RlbXBsYXRlLmMiCisKKyNpbmNsdWRlICJ2dmNfaW50cmEuaCIKKworI2RlZmluZSBQT1MoeCwg eSkgc3JjWyh4KSArIHN0cmlkZSAqICh5KV0KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9p ZCBGVU5DKGNjbG1fbGluZWFyX3ByZWQpKFZWQ0ZyYW1lQ29udGV4dCAqZmMsIGNvbnN0IGludCB4 MCwgY29uc3QgaW50IHkwLAorICAgIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwgY29uc3QgcGl4 ZWwqIHBkc3ksIGNvbnN0IGludCAqYSwgY29uc3QgaW50ICpiLCBjb25zdCBpbnQgKmspCit7Cisg ICAgY29uc3QgVlZDU1BTICpzcHMgPSBmYy0+cHMuc3BzOworICAgIGZvciAoaW50IGkgPSAwOyBp IDwgVlZDX01BWF9TQU1QTEVfQVJSQVlTIC0gMTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBj X2lkeCA9IGkgKyAxOworICAgICAgICBjb25zdCBpbnQgeCA9IHgwID4+IHNwcy0+aHNoaWZ0W2Nf aWR4XTsKKyAgICAgICAgY29uc3QgaW50IHkgPSB5MCA+PiBzcHMtPnZzaGlmdFtjX2lkeF07Cisg ICAgICAgIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUgPSBmYy0+ZnJhbWUtPmxpbmVzaXplW2NfaWR4 XSAvIHNpemVvZihwaXhlbCk7CisgICAgICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKWZjLT5mcmFt ZS0+ZGF0YVtjX2lkeF0gKyB4ICsgeSAqIHN0cmlkZTsKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7 IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7 CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGRzeSA9IHBkc3lbeSAqIHcgKyB4XTsKKyAgICAg ICAgICAgICAgICBjb25zdCBpbnQgcHJlZCA9ICgoZHN5ICogYVtpXSkgPj4ga1tpXSkgKyBiW2ld OworICAgICAgICAgICAgICAgIFBPUyh4LCB5KSA9IENMSVAocHJlZCk7CisgICAgICAgICAgICB9 CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNkZWZpbmUgTUFYX1BJQ0tfUE9TIDQKKyNkZWZpbmUg VE9QICAwCisjZGVmaW5lIExFRlQgMQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZV TkMoY2NsbV9nZXRfcGFyYW1zX2RlZmF1bHQpKGludCAqYSwgaW50ICpiLCBpbnQgKmspCit7Cisg ICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgYVtpXSA9IGtbaV0gPSAw OworICAgICAgICBiW2ldID0gMSA8PCAoQklUX0RFUFRIIC0gMSk7CisgICAgfQorfQorCitzdGF0 aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgRlVOQyhjY2xtX2dldF9zZWxlY3RfcG9zKShjb25zdCBW VkNMb2NhbENvbnRleHQgKmxjLAorICAgIGNvbnN0IGludCB4LCBjb25zdCBpbnQgeSwgY29uc3Qg aW50IHcsIGNvbnN0IGludCBoLCBjb25zdCBpbnQgYXZhaWxfdCwgY29uc3QgaW50IGF2YWlsX2ws CisgICAgaW50IGNudFsyXSwgaW50IHBvc1syXVtNQVhfUElDS19QT1NdKQoreworICAgIGNvbnN0 IGVudW0gSW50cmFQcmVkTW9kZSBtb2RlID0gbGMtPmN1LT5pbnRyYV9wcmVkX21vZGVfYzsKKyAg ICBjb25zdCBpbnQgbnVtX2lzNCA9ICFhdmFpbF90IHx8ICFhdmFpbF9sIHx8IG1vZGUgIT0gSU5U UkFfTFRfQ0NMTTsKKyAgICBpbnQgbnVtX3NhbXBbMl07CisKKyAgICBpZiAobW9kZSA9PSBJTlRS QV9MVF9DQ0xNKSB7CisgICAgICAgIG51bV9zYW1wW1RPUF0gID0gYXZhaWxfdCA/IHcgOiAwOwor ICAgICAgICBudW1fc2FtcFtMRUZUXSA9IGF2YWlsX2wgPyBoIDogMDsKKyAgICB9IGVsc2Ugewor ICAgICAgICBudW1fc2FtcFtUT1BdID0gKGF2YWlsX3QgJiYgbW9kZSA9PSBJTlRSQV9UX0NDTE0p ID8gZmZfdnZjX2dldF90b3BfYXZhaWxhYmxlKGxjLCAgeCwgeSwgdyArIEZGTUlOKHcsIGgpLCAx KSA6IDA7CisgICAgICAgIG51bV9zYW1wW0xFRlRdID0gKGF2YWlsX2wgJiYgbW9kZSA9PSBJTlRS QV9MX0NDTE0pID8gZmZfdnZjX2dldF9sZWZ0X2F2YWlsYWJsZShsYywgeCwgeSwgaCArIEZGTUlO KHcsIGgpLCAxKSA6IDA7CisgICAgfQorICAgIGlmICghbnVtX3NhbXBbVE9QXSAmJiAhbnVtX3Nh bXBbTEVGVF0pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGZvciAoaW50IGkgPSBU T1A7IGkgPD0gTEVGVDsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBzdGFydCA9IG51bV9zYW1w W2ldID4+ICgyICsgbnVtX2lzNCk7CisgICAgICAgIGNvbnN0IGludCBzdGVwICA9IEZGTUFYKDEs IG51bV9zYW1wW2ldID4+ICgxICsgbnVtX2lzNCkpIDsKKyAgICAgICAgY250W2ldID0gRkZNSU4o bnVtX3NhbXBbaV0sICgxICsgbnVtX2lzNCkgPDwgMSk7CisgICAgICAgIGZvciAoaW50IGMgPSAw OyBjIDwgY250W2ldOyBjKyspCisgICAgICAgICAgICBwb3NbaV1bY10gPSBzdGFydCArIGMgKiBz dGVwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUg dm9pZCBGVU5DKGNjbG1fc2VsZWN0X2x1bWFfNDQ0KShjb25zdCBwaXhlbCAqc3JjLCBjb25zdCBp bnQgc3RlcCwKKyAgICBjb25zdCBpbnQgY250LCBjb25zdCBpbnQgcG9zW01BWF9QSUNLX1BPU10s ICBwaXhlbCAqc2VsX2x1bWEpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbnQ7IGkrKykK KyAgICAgICAgc2VsX2x1bWFbaV0gPSBzcmNbcG9zW2ldICogc3RlcF07Cit9CisKK3N0YXRpYyBh dl9hbHdheXNfaW5saW5lIHZvaWQgRlVOQyhjY2xtX3NlbGVjdF9sdW1hKShjb25zdCBWVkNGcmFt ZUNvbnRleHQgKmZjLAorICAgIGNvbnN0IGludCB4MCwgY29uc3QgaW50IHkwLCBjb25zdCBpbnQg YXZhaWxfdCwgY29uc3QgaW50IGF2YWlsX2wsIGNvbnN0IGludCBjbnRbMl0sIGNvbnN0IGludCBw b3NbMl1bTUFYX1BJQ0tfUE9TXSwKKyAgICBwaXhlbCAqc2VsX2x1bWEpCit7CisgICAgY29uc3Qg VlZDU1BTICpzcHMgPSBmYy0+cHMuc3BzOworCisgICAgY29uc3QgaW50IGJfY3R1X2JvdW5kYXJ5 ID0gIWF2X21vZF91aW50cDIoeTAsIHNwcy0+Y3RiX2xvZzJfc2l6ZV95KTsKKyAgICBjb25zdCBp bnQgaHMgPSBzcHMtPmhzaGlmdFsxXTsKKyAgICBjb25zdCBpbnQgdnMgPSBzcHMtPnZzaGlmdFsx XTsKKyAgICBjb25zdCBwdHJkaWZmX3Qgc3RyaWRlID0gZmMtPmZyYW1lLT5saW5lc2l6ZVswXSAv IHNpemVvZihwaXhlbCk7CisKKyAgICBpZiAoIWhzICYmICF2cykgeworICAgICAgICBjb25zdCBw aXhlbCogc3JjID0gKHBpeGVsKilmYy0+ZnJhbWUtPmRhdGFbMF0gKyB4MCArIHkwICogc3RyaWRl OworICAgICAgICBGVU5DKGNjbG1fc2VsZWN0X2x1bWFfNDQ0KShzcmMgLSBhdmFpbF90ICogc3Ry aWRlLCAxLCBjbnRbVE9QXSwgcG9zW1RPUF0sIHNlbF9sdW1hKTsKKyAgICAgICAgRlVOQyhjY2xt X3NlbGVjdF9sdW1hXzQ0NCkoc3JjIC0gYXZhaWxfbCwgc3RyaWRlLCBjbnRbTEVGVF0sIHBvc1tM RUZUXSwgc2VsX2x1bWEgKyBjbnRbVE9QXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gdG9w CisgICAgICAgIGlmICh2cyAmJiAhYl9jdHVfYm91bmRhcnkpIHsKKyAgICAgICAgICAgIGNvbnN0 IHBpeGVsICpzb3VyY2UgPSAocGl4ZWwgKilmYy0+ZnJhbWUtPmRhdGFbMF0gKyB4MCArICh5MCAt IDIpICogc3RyaWRlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbnRbVE9QXTsg aSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHggPSBwb3NbVE9QXVtpXSA8PCBoczsK KyAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCAqc3JjID0gc291cmNlICsgeDsKKyAgICAgICAg ICAgICAgICBjb25zdCBpbnQgaGFzX2xlZnQgPSB4IHx8IGF2YWlsX2w7CisgICAgICAgICAgICAg ICAgY29uc3QgcGl4ZWwgbCA9IGhhc19sZWZ0ID8gUE9TKC0xLCAwKSA6IFBPUygwLCAwKTsKKyAg ICAgICAgICAgICAgICBpZiAoc3BzLT5yLT5zcHNfY2hyb21hX3ZlcnRpY2FsX2NvbGxvY2F0ZWRf ZmxhZykgeworICAgICAgICAgICAgICAgICAgICBzZWxfbHVtYVtpXSA9IChQT1MoMCwgLTEpICsg bCArIDQgKiBQT1MoMCwgMCkgKyBQT1MoMSwgMCkgKyBQT1MoMCwgMSkgKyA0KSA+PiAzOworICAg ICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsIGwx ID0gaGFzX2xlZnQgPyBQT1MoLTEsIDEpIDogUE9TKDAsIDEpOworICAgICAgICAgICAgICAgICAg ICBzZWxfbHVtYVtpXSA9IChsICsgbDEgKyAyICogKFBPUygwLCAwKSArIFBPUygwLCAxKSkgKyBQ T1MoMSwgMCkgKyBQT1MoMSwgMSkgKyA0KSA+PiAzOworICAgICAgICAgICAgICAgIH0KKyAgICAg ICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IHBpeGVsICpzb3Vy Y2UgPSAocGl4ZWwqKWZjLT5mcmFtZS0+ZGF0YVswXSArIHgwICsgKHkwIC0gMSkgKiBzdHJpZGU7 CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNudFtUT1BdOyBpKyspIHsKKyAgICAg ICAgICAgICAgICBjb25zdCBpbnQgeCA9IHBvc1tUT1BdW2ldIDw8IGhzOworICAgICAgICAgICAg ICAgIGNvbnN0IHBpeGVsICpzcmMgPSBzb3VyY2UgKyB4OworICAgICAgICAgICAgICAgIGNvbnN0 IGludCBoYXNfbGVmdCA9IHggfHwgYXZhaWxfbDsKKyAgICAgICAgICAgICAgICBjb25zdCBwaXhl bCBsID0gaGFzX2xlZnQgPyBQT1MoLTEsIDApIDogUE9TKDAsIDApOworICAgICAgICAgICAgICAg IHNlbF9sdW1hW2ldID0gKGwgKyAyICogUE9TKDAsIDApICsgUE9TKDEsIDApICsgMikgPj4gMjsK KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGxlZnQKKyAgICAgICAgewor ICAgICAgICAgICAgY29uc3QgcGl4ZWwgKmxlZnQ7CisgICAgICAgICAgICBjb25zdCBwaXhlbCAq c291cmNlID0gKHBpeGVsICopZmMtPmZyYW1lLT5kYXRhWzBdICsgeDAgKyB5MCAqIHN0cmlkZSAt ICgxICsgaHMpICogYXZhaWxfbDsKKyAgICAgICAgICAgIGxlZnQgPSBzb3VyY2UgLSBhdmFpbF9s OworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNudFtMRUZUXTsgaSsrKSB7Cisg ICAgICAgICAgICAgICAgY29uc3QgaW50IHkgPSBwb3NbTEVGVF1baV0gPDwgdnM7CisgICAgICAg ICAgICAgICAgY29uc3QgaW50IG9mZnNldCA9IHkgKiBzdHJpZGU7CisgICAgICAgICAgICAgICAg Y29uc3QgcGl4ZWwgKmwgICA9IGxlZnQgKyBvZmZzZXQ7CisgICAgICAgICAgICAgICAgY29uc3Qg cGl4ZWwgKnNyYyA9IHNvdXJjZSArIG9mZnNldDsKKyAgICAgICAgICAgICAgICBwaXhlbCBwcmVk OworICAgICAgICAgICAgICAgIGlmICghdnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlZCA9 ICgqbCArIDIgKiBQT1MoMCwgMCkgKyBQT1MoMSwgMCkgKyAyKSA+PiAyOworICAgICAgICAgICAg ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcHMtPnItPnNwc19jaHJvbWFf dmVydGljYWxfY29sbG9jYXRlZF9mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25z dCBpbnQgaGFzX3RvcCA9IHkgfHwgYXZhaWxfdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNv bnN0IHBpeGVsIHQgPSBoYXNfdG9wID8gUE9TKDAsIC0xKSA6IFBPUygwLCAwKTsKKyAgICAgICAg ICAgICAgICAgICAgICAgIHByZWQgPSAoKmwgKyB0ICsgNCAqIFBPUygwLCAwKSArIFBPUygxLCAw KSArIFBPUygwLCAxKSArIDQpID4+IDM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Cisg ICAgICAgICAgICAgICAgICAgICAgICBwcmVkID0gKCpsICsgKihsICsgc3RyaWRlKSArIDIgKiBQ T1MoMCwgMCkgKyAyICogUE9TKDAsIDEpICsgUE9TKDEsIDApICsgUE9TKDEsIDEpICsgNCkgPj4g MzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg ICAgICBzZWxfbHVtYVtpICsgY250W1RPUF1dID0gcHJlZDsKKyAgICAgICAgICAgIH0KKyAgICAg ICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKGNjbG1f c2VsZWN0X2Nocm9tYSkoY29uc3QgVlZDRnJhbWVDb250ZXh0ICpmYywKKyAgICBjb25zdCBpbnQg eCwgY29uc3QgaW50IHksIGNvbnN0IGludCBjbnRbMl0sIGNvbnN0IGludCBwb3NbMl1bTUFYX1BJ Q0tfUE9TXSwKKyAgICBwaXhlbCBzZWxbXVtNQVhfUElDS19QT1MgKiAyXSkKK3sKKyAgICBmb3Ig KGludCBjX2lkeCA9IDE7IGNfaWR4IDwgVlZDX01BWF9TQU1QTEVfQVJSQVlTOyBjX2lkeCsrKSB7 CisgICAgICAgIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUgPSBmYy0+ZnJhbWUtPmxpbmVzaXplW2Nf aWR4XSAvIHNpemVvZihwaXhlbCk7CisKKyAgICAgICAgLy90b3AKKyAgICAgICAgY29uc3QgcGl4 ZWwgKnNyYyA9IChwaXhlbCopZmMtPmZyYW1lLT5kYXRhW2NfaWR4XSArIHggKyAoeSAtIDEpKiBz dHJpZGU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY250W1RPUF07IGkrKykgeworICAg ICAgICAgICAgc2VsW2NfaWR4XVtpXSA9IHNyY1twb3NbVE9QXVtpXV07CisgICAgICAgIH0KKwor ICAgICAgICAvL2xlZnQKKyAgICAgICAgc3JjID0gKHBpeGVsKilmYy0+ZnJhbWUtPmRhdGFbY19p ZHhdICsgeCAtIDEgKyB5ICogc3RyaWRlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNu dFtMRUZUXTsgaSsrKSB7CisgICAgICAgICAgICBzZWxbY19pZHhdW2kgKyBjbnRbVE9QXV0gPSBz cmNbcG9zW0xFRlRdW2ldICogc3RyaWRlXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGlj IGF2X2Fsd2F5c19pbmxpbmUgaW50IEZVTkMoY2NsbV9zZWxlY3Rfc2FtcGxlcykoY29uc3QgVlZD TG9jYWxDb250ZXh0ICpsYywKKyAgICBjb25zdCBpbnQgeDAsIGNvbnN0IGludCB5MCwgY29uc3Qg aW50IHcsIGNvbnN0IGludCBoLCBjb25zdCBpbnQgYXZhaWxfdCwgY29uc3QgaW50IGF2YWlsX2ws CisgICAgcGl4ZWwgc2VsW11bTUFYX1BJQ0tfUE9TICogMl0pCit7CisgICAgY29uc3QgVlZDRnJh bWVDb250ZXh0ICpmYyA9IGxjLT5mYzsKKyAgICBjb25zdCBWVkNTUFMgKnNwcyAgID0gZmMtPnBz LnNwczsKKyAgICBjb25zdCBpbnQgeCAgPSB4MCA+PiBzcHMtPmhzaGlmdFsxXTsKKyAgICBjb25z dCBpbnQgeSAgPSB5MCA+PiBzcHMtPnZzaGlmdFsxXTsKKyAgICBpbnQgY250WzJdLCBwb3NbMl1b TUFYX1BJQ0tfUE9TXTsKKworICAgIGlmICghRlVOQyhjY2xtX2dldF9zZWxlY3RfcG9zKShsYywg eCwgeSwgdywgaCwgYXZhaWxfdCwgYXZhaWxfbCwgY250LCBwb3MpKQorICAgICAgICByZXR1cm4g MDsKKworICAgIEZVTkMoY2NsbV9zZWxlY3RfbHVtYSkoZmMsIHgwLCB5MCwgYXZhaWxfdCwgYXZh aWxfbCwgY250LCBwb3MsIHNlbFtMVU1BXSk7CisgICAgRlVOQyhjY2xtX3NlbGVjdF9jaHJvbWEp KGZjLCB4LCB5LCBjbnQsIHBvcywgc2VsKTsKKworICAgIGlmIChjbnRbVE9QXSArIGNudFtMRUZU XSA9PSAyKSB7CisgICAgICAgIGZvciAoaW50IGNfaWR4ID0gMDsgY19pZHggPCBWVkNfTUFYX1NB TVBMRV9BUlJBWVM7IGNfaWR4KyspIHsKKyAgICAgICAgICAgIHNlbFtjX2lkeF1bM10gPSBzZWxb Y19pZHhdWzBdOworICAgICAgICAgICAgc2VsW2NfaWR4XVsyXSA9IHNlbFtjX2lkeF1bMV07Cisg ICAgICAgICAgICBzZWxbY19pZHhdWzBdID0gc2VsW2NfaWR4XVsxXTsKKyAgICAgICAgICAgIHNl bFtjX2lkeF1bMV0gPSBzZWxbY19pZHhdWzNdOworICAgICAgICB9CisgICAgfQorICAgIHJldHVy biAxOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZVTkMoY2NsbV9nZXRfbWlu X21heCkoCisgICAgY29uc3QgcGl4ZWwgc2VsW11bTUFYX1BJQ0tfUE9TICogMl0sIGludCAqbWlu LCBpbnQgKm1heCkKK3sKKyAgICBpbnQgbWluX2dycF9pZHhbXSA9IHsgMCwgMiB9OworICAgIGlu dCBtYXhfZ3JwX2lkeFtdID0geyAxLCAzIH07CisKKyAgICBpZiAoc2VsW0xVTUFdW21pbl9ncnBf aWR4WzBdXSA+IHNlbFtMVU1BXVttaW5fZ3JwX2lkeFsxXV0pCisgICAgICAgIEZGU1dBUChpbnQs IG1pbl9ncnBfaWR4WzBdLCBtaW5fZ3JwX2lkeFsxXSk7CisgICAgaWYgKHNlbFtMVU1BXVttYXhf Z3JwX2lkeFswXV0gPiBzZWxbTFVNQV1bbWF4X2dycF9pZHhbMV1dKQorICAgICAgICBGRlNXQVAo aW50LCBtYXhfZ3JwX2lkeFswXSwgbWF4X2dycF9pZHhbMV0pOworICAgIGlmIChzZWxbTFVNQV1b bWluX2dycF9pZHhbMF1dID4gc2VsW0xVTUFdW21heF9ncnBfaWR4WzFdXSkgeworICAgICAgICBG RlNXQVAoaW50LCBtaW5fZ3JwX2lkeFswXSwgbWF4X2dycF9pZHhbMF0pOworICAgICAgICBGRlNX QVAoaW50LCBtaW5fZ3JwX2lkeFsxXSwgbWF4X2dycF9pZHhbMV0pOworICAgIH0KKyAgICBpZiAo c2VsW0xVTUFdW21pbl9ncnBfaWR4WzFdXSA+IHNlbFtMVU1BXVttYXhfZ3JwX2lkeFswXV0pCisg ICAgICAgIEZGU1dBUChpbnQsIG1pbl9ncnBfaWR4WzFdLCBtYXhfZ3JwX2lkeFswXSk7CisgICAg Zm9yIChpbnQgY19pZHggPSAwOyBjX2lkeCA8IFZWQ19NQVhfU0FNUExFX0FSUkFZUzsgY19pZHgr KykgeworICAgICAgICBtYXhbY19pZHhdID0gKHNlbFtjX2lkeF1bbWF4X2dycF9pZHhbMF1dICsg c2VsW2NfaWR4XVttYXhfZ3JwX2lkeFsxXV0gKyAxKSA+PiAxOworICAgICAgICBtaW5bY19pZHhd ID0gKHNlbFtjX2lkeF1bbWluX2dycF9pZHhbMF1dICsgc2VsW2NfaWR4XVttaW5fZ3JwX2lkeFsx XV0gKyAxKSA+PiAxOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBG VU5DKGNjbG1fZ2V0X3BhcmFtcykoY29uc3QgVlZDTG9jYWxDb250ZXh0ICpsYywKKyAgICBjb25z dCBpbnQgeDAsIGNvbnN0IGludCB5MCwgY29uc3QgaW50IHcsIGNvbnN0IGludCBoLCBjb25zdCBp bnQgYXZhaWxfdCwgY29uc3QgaW50IGF2YWlsX2wsCisgICAgaW50ICphLCBpbnQgKmIsIGludCAq aykKK3sKKyAgICBwaXhlbCBzZWxbVlZDX01BWF9TQU1QTEVfQVJSQVlTXVtNQVhfUElDS19QT1Mg KiAyXTsKKyAgICBpbnQgbWF4W1ZWQ19NQVhfU0FNUExFX0FSUkFZU10sIG1pbltWVkNfTUFYX1NB TVBMRV9BUlJBWVNdOworICAgIGludCBkaWZmOworCisgICAgaWYgKCFGVU5DKGNjbG1fc2VsZWN0 X3NhbXBsZXMpKGxjLCB4MCwgeTAsIHcsIGgsIGF2YWlsX3QsIGF2YWlsX2wsIHNlbCkpIHsKKyAg ICAgICAgRlVOQyhjY2xtX2dldF9wYXJhbXNfZGVmYXVsdCkoYSwgYiwgayk7CisgICAgICAgIHJl dHVybjsKKyAgICB9CisKKyAgICBGVU5DKGNjbG1fZ2V0X21pbl9tYXgpKHNlbCwgbWluLCBtYXgp OworCisgICAgZGlmZiA9IG1heFtMVU1BXSAtIG1pbltMVU1BXTsKKyAgICBpZiAoZGlmZiA9PSAw KSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBh W2ldID0ga1tpXSA9IDA7CisgICAgICAgICAgICBiW2ldID0gbWluW2kgKyAxXTsKKyAgICAgICAg fQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsr KSB7CisgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgZGl2X3NpZ190YWJsZVtdID0gezAsIDcsIDYs IDUsIDUsIDQsIDQsIDMsIDMsIDIsIDIsIDEsIDEsIDEsIDEsIDB9OworICAgICAgICBjb25zdCBp bnQgZGlmZmMgPSBtYXhbaSArIDFdIC0gbWluW2kgKyAxXTsKKyAgICAgICAgaW50ICB4ID0gYXZf bG9nMihkaWZmKTsKKyAgICAgICAgaW50ICB5LCB2LCBzaWduLCBhZGQ7CisgICAgICAgIGNvbnN0 IGludCBub3JtX2RpZmYgPSAoKGRpZmYgPDwgNCkgPj4geCkgJiAxNTsKKyAgICAgICAgeCArPSAo bm9ybV9kaWZmKSA/IDEgOiAwOworICAgICAgICB5ID0gYWJzKGRpZmZjKSA+IDAgPyBhdl9sb2cy KGFicyhkaWZmYykpICsgMSA6IDA7CisgICAgICAgIHYgPSBkaXZfc2lnX3RhYmxlW25vcm1fZGlm Zl0gfCA4OworICAgICAgICBhZGQgPSAoMSA8PCB5ID4+IDEpOworICAgICAgICBhW2ldID0gKGRp ZmZjICogdiArIGFkZCkgPj4geTsKKyAgICAgICAga1tpXSA9IEZGTUFYKDEsIDMgKyB4IC15KTsK KyAgICAgICAgc2lnbiA9IGFbaV0gPCAwID8gLTEgOiAoYVtpXSA+IDApOworICAgICAgICBhW2ld ID0gKCgzICsgeCAtIHkpIDwgMSkgPyAgc2lnbiAqIDE1IDogYVtpXTsKKyAgICAgICAgYltpXSA9 IG1pbltpICsgMV0gLSAoKGFbaV0gKiBtaW5bMF0pID4+IGtbaV0pOworICAgIH0KKworfQorCisj dW5kZWYgVE9QCisjdW5kZWYgTEVGVAorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZV TkMoY2NsbV9nZXRfbHVtYV9yZWNfcGl4ZWxzKShjb25zdCBWVkNGcmFtZUNvbnRleHQgKmZjLAor ICAgIGNvbnN0IGludCB4MCwgY29uc3QgaW50IHkwLCBjb25zdCBpbnQgdywgY29uc3QgaW50IGgs IGNvbnN0IGludCBhdmFpbF90LCBjb25zdCBpbnQgYXZhaWxfbCwKKyAgICBwaXhlbCAqcGRzeSkK K3sKKyAgICBjb25zdCBpbnQgaHMgICAgICAgICAgICA9IGZjLT5wcy5zcHMtPmhzaGlmdFsxXTsK KyAgICBjb25zdCBpbnQgdnMgICAgICAgICAgICA9IGZjLT5wcy5zcHMtPnZzaGlmdFsxXTsKKyAg ICBjb25zdCBwdHJkaWZmX3Qgc3RyaWRlICA9IGZjLT5mcmFtZS0+bGluZXNpemVbMF0gLyBzaXpl b2YocGl4ZWwpOworICAgIGNvbnN0IHBpeGVsICpzb3VyY2UgICAgID0gKHBpeGVsKilmYy0+ZnJh bWUtPmRhdGFbMF0gKyB4MCArIHkwICogc3RyaWRlOworICAgIGNvbnN0IHBpeGVsICpsZWZ0ICAg ICAgID0gc291cmNlIC0gYXZhaWxfbDsKKyAgICBjb25zdCBwaXhlbCAqdG9wICAgICAgICA9IHNv dXJjZSAtIGF2YWlsX3QgKiBzdHJpZGU7CisKKyAgICBjb25zdCBWVkNTUFMgKnNwcyA9IGZjLT5w cy5zcHM7CisgICAgaWYgKCFocyAmJiAhdnMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkg PCBoOyBpKyspCisgICAgICAgICAgICBtZW1jcHkocGRzeSArIGkgKiB3LCBzb3VyY2UgKyBpICog c3RyaWRlLCB3ICogc2l6ZW9mKHBpeGVsKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAg Zm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgY29uc3QgcGl4ZWwgKnNyYyAg PSBzb3VyY2U7CisgICAgICAgIGNvbnN0IHBpeGVsICpsID0gbGVmdDsKKyAgICAgICAgY29uc3Qg cGl4ZWwgKnQgPSB0b3A7CisgICAgICAgIGlmICghdnMpIHsKKyAgICAgICAgICAgIGZvciAoaW50 IGogPSAwOyBqIDwgdzsgaisrKSB7CisgICAgICAgICAgICAgICAgcGl4ZWwgcHJlZCAgPSAoKmwg KyAyICogUE9TKDAsIDApICsgUE9TKDEsIDApICsgMikgPj4gMjsKKyAgICAgICAgICAgICAgICBw ZHN5W2kgKiB3ICsgal0gPSBwcmVkOworICAgICAgICAgICAgICAgIHNyYyArPSAyOworICAgICAg ICAgICAgICAgIGwgPSBzcmMgLSAxOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7 CisgICAgICAgICAgICBpZiAoc3BzLT5yLT5zcHNfY2hyb21hX3ZlcnRpY2FsX2NvbGxvY2F0ZWRf ZmxhZykgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHc7IGorKykgewor ICAgICAgICAgICAgICAgICAgICBwaXhlbCBwcmVkICA9ICgqbCArICp0ICsgNCAqIFBPUygwLCAw KSArIFBPUygxLCAwKSArIFBPUygwLCAxKSArIDQpID4+IDM7CisgICAgICAgICAgICAgICAgICAg IHBkc3lbaSAqIHcgKyBqXSA9IHByZWQ7CisgICAgICAgICAgICAgICAgICAgIHNyYyArPSAyOwor ICAgICAgICAgICAgICAgICAgICB0ICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGwgPSBzcmMg LSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg ICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB3OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAg cGl4ZWwgcHJlZCAgPSAoKmwgKyAqKGwgKyBzdHJpZGUpICsgMiAqIFBPUygwLCAwKSArIDIgKiBQ T1MoMCwgMSkgKyBQT1MoMSwgMCkgKyBQT1MoMSwgMSkgKyA0KSA+PiAzOworCisgICAgICAgICAg ICAgICAgICAgIHBkc3lbaSAqIHcgKyBqXSA9IHByZWQ7CisgICAgICAgICAgICAgICAgICAgIHNy YyArPSAyOworICAgICAgICAgICAgICAgICAgICBsID0gc3JjIC0gMTsKKyAgICAgICAgICAgICAg ICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc291cmNlICs9IChzdHJpZGUg PDwgdnMpOworICAgICAgICBsZWZ0ICAgKz0gKHN0cmlkZSA8PCB2cyk7CisgICAgICAgIHRvcCAg ICA9IHNvdXJjZSAtIHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5l IHZvaWQgRlVOQyhjY2xtX3ByZWRfZGVmYXVsdCkoVlZDRnJhbWVDb250ZXh0ICpmYywKKyAgICBj b25zdCBpbnQgeCwgY29uc3QgaW50IHksIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwgY29uc3Qg aW50IGF2YWlsX3QsIGNvbnN0IGludCBhdmFpbF9sKQoreworICAgIGZvciAoaW50IGNfaWR4ID0g MTsgY19pZHggPCBWVkNfTUFYX1NBTVBMRV9BUlJBWVM7IGNfaWR4KyspIHsKKyAgICAgICAgY29u c3QgcHRyZGlmZl90IHN0cmlkZSA9IGZjLT5mcmFtZS0+bGluZXNpemVbY19pZHhdIC8gc2l6ZW9m KHBpeGVsKTsKKyAgICAgICAgcGl4ZWwgKmRzdCA9IChwaXhlbCopZmMtPmZyYW1lLT5kYXRhW2Nf aWR4XSArIHggKyB5ICogc3RyaWRlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkr KykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB3OyBqKyspIHsKKyAgICAgICAg ICAgICAgICBkc3Rbal0gPSAxIDw8IChCSVRfREVQVEggLSAxKTsKKyAgICAgICAgICAgIH0KKyAg ICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vOC40LjUu Mi4xNCBTcGVjaWZpY2F0aW9uIG9mIElOVFJBX0xUX0NDTE0sIElOVFJBX0xfQ0NMTSBhbmQgSU5U UkFfVF9DQ0xNIGludHJhIHByZWRpY3Rpb24gbW9kZQorc3RhdGljIHZvaWQgRlVOQyhpbnRyYV9j Y2xtX3ByZWQpKGNvbnN0IFZWQ0xvY2FsQ29udGV4dCAqbGMsIGNvbnN0IGludCB4MCwgY29uc3Qg aW50IHkwLAorICAgIGNvbnN0IGludCB3aWR0aCwgY29uc3QgaW50IGhlaWdodCkKK3sKKyAgICBW VkNGcmFtZUNvbnRleHQgKmZjICAgICA9IGxjLT5mYzsKKyAgICBjb25zdCBWVkNTUFMgKnNwcyA9 IGZjLT5wcy5zcHM7CisgICAgY29uc3QgaW50IGF2YWlsX3QgPSBmZl92dmNfZ2V0X3RvcF9hdmFp bGFibGUobGMsIHgwLCB5MCwgMSwgMCk7CisgICAgY29uc3QgaW50IGF2YWlsX2wgPSBmZl92dmNf Z2V0X2xlZnRfYXZhaWxhYmxlKGxjLCB4MCwgeTAsIDEsIDApOworICAgIGNvbnN0IGludCBocyA9 IHNwcy0+aHNoaWZ0WzFdOworICAgIGNvbnN0IGludCB2cyA9IHNwcy0+dnNoaWZ0WzFdOworICAg IGNvbnN0IGludCB4ICA9IHgwID4+IGhzOworICAgIGNvbnN0IGludCB5ICA9IHkwID4+IHZzOwor ICAgIGNvbnN0IGludCB3ICA9IHdpZHRoID4+IGhzOworICAgIGNvbnN0IGludCBoICA9IGhlaWdo dCA+PiB2czsKKyAgICBpbnQgYVsyXSwgYlsyXSwga1syXTsKKworICAgIHBpeGVsIGRzeVtNQVhf VEJfU0laRSAqIE1BWF9UQl9TSVpFXTsKKyAgICBpZiAoIWF2YWlsX3QgJiYgIWF2YWlsX2wpIHsK KyAgICAgICAgRlVOQyhjY2xtX3ByZWRfZGVmYXVsdCkoZmMsIHgsIHksIHcsIGgsIGF2YWlsX3Qs IGF2YWlsX2wpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEZVTkMoY2NsbV9nZXRfbHVt YV9yZWNfcGl4ZWxzKShmYywgeDAsIHkwLCB3LCBoLCBhdmFpbF90LCBhdmFpbF9sLCBkc3kpOwor ICAgIEZVTkMoY2NsbV9nZXRfcGFyYW1zKSAobGMsIHgwLCB5MCwgdywgaCwgYXZhaWxfdCwgYXZh aWxfbCwgYSwgYiwgayk7CisgICAgRlVOQyhjY2xtX2xpbmVhcl9wcmVkKShmYywgeDAsIHkwLCB3 LCBoLCBkc3ksIGEsIGIsIGspOworfQorCitzdGF0aWMgaW50IEZVTkMobG1jc19zdW1fc2FtcGxl cykoY29uc3QgcGl4ZWwgKnN0YXJ0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCBpbnQgYXZhaWws IGNvbnN0IGludCB0YXJnZXRfc2l6ZSkKK3sKKyAgICBjb25zdCBpbnQgc2l6ZSA9IEZGTUlOKGF2 YWlsLCB0YXJnZXRfc2l6ZSk7CisgICAgaW50IHN1bSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7 IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgc3VtICs9ICpzdGFydDsKKyAgICAgICAgc3RhcnQg Kz0gc3RyaWRlOworICAgIH0KKyAgICBzdW0gKz0gKihzdGFydCAtIHN0cmlkZSkgKiAodGFyZ2V0 X3NpemUgLSBzaXplKTsKKyAgICByZXR1cm4gc3VtOworfQorCisvLyA4LjcuNS4zIFBpY3R1cmUg cmVjb25zdHJ1Y3Rpb24gd2l0aCBsdW1hIGRlcGVuZGVudCBjaHJvbWEgcmVzaWR1YWwgc2NhbGlu ZyBwcm9jZXNzIGZvciBjaHJvbWEgc2FtcGxlcworc3RhdGljIGludCBGVU5DKGxtY3NfZGVyaXZl X2Nocm9tYV9zY2FsZSkoVlZDTG9jYWxDb250ZXh0ICpsYywgY29uc3QgaW50IHgwLCBjb25zdCBp bnQgeTApCit7CisgICAgVlZDRnJhbWVDb250ZXh0ICpmYyA9IGxjLT5mYzsKKyAgICBjb25zdCBW VkNMTUNTICpsbWNzID0gJmZjLT5wcy5sbWNzOworICAgIGNvbnN0IGludCBzaXplX3kgICAgPSBG Rk1JTihmYy0+cHMuc3BzLT5jdGJfc2l6ZV95LCA2NCk7CisKKyAgICBjb25zdCBpbnQgeCA9IHgw ICYgfihzaXplX3kgLSAxKTsKKyAgICBjb25zdCBpbnQgeSA9IHkwICYgfihzaXplX3kgLSAxKTsK KyAgICBpZiAobGMtPmxtY3MueF92cGR1ICE9IHggfHwgbGMtPmxtY3MueV92cGR1ICE9IHkpIHsK KyAgICAgICAgaW50IGNudCA9IDAsIGx1bWEgPSAwLCBpOworICAgICAgICBjb25zdCBwaXhlbCAq c3JjID0gKGNvbnN0IHBpeGVsICopKGZjLT5mcmFtZS0+ZGF0YVtMVU1BXSArIHkgKiBmYy0+ZnJh bWUtPmxpbmVzaXplW0xVTUFdICsgKHggPDwgZmMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpKTsKKyAg ICAgICAgY29uc3QgcHRyZGlmZl90IHN0cmlkZSA9IGZjLT5mcmFtZS0+bGluZXNpemVbTFVNQV0g LyBzaXplb2YocGl4ZWwpOworICAgICAgICBjb25zdCBpbnQgYXZhaWxfdCA9IGZmX3Z2Y19nZXRf dG9wX2F2YWlsYWJsZSAobGMsIHgsIHksIDEsIDApOworICAgICAgICBjb25zdCBpbnQgYXZhaWxf bCA9IGZmX3Z2Y19nZXRfbGVmdF9hdmFpbGFibGUobGMsIHgsIHksIDEsIDApOworICAgICAgICBp ZiAoYXZhaWxfbCkgeworICAgICAgICAgICAgbHVtYSArPSBGVU5DKGxtY3Nfc3VtX3NhbXBsZXMp KHNyYyAtIDEsIHN0cmlkZSwgZmMtPnBzLnBwcy0+aGVpZ2h0IC0geSwgc2l6ZV95KTsKKyAgICAg ICAgICAgIGNudCA9IHNpemVfeTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZhaWxfdCkgewor ICAgICAgICAgICAgbHVtYSArPSBGVU5DKGxtY3Nfc3VtX3NhbXBsZXMpKHNyYyAtIHN0cmlkZSwg MSwgZmMtPnBzLnBwcy0+d2lkdGggLSB4LCBzaXplX3kpOworICAgICAgICAgICAgY250ICs9IHNp emVfeTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY250KQorICAgICAgICAgICAgbHVtYSA9IChs dW1hICsgKGNudCA+PiAxKSkgPj4gYXZfbG9nMihjbnQpOworICAgICAgICBlbHNlCisgICAgICAg ICAgICBsdW1hID0gMSA8PCAoQklUX0RFUFRIIC0gMSk7CisKKyAgICAgICAgZm9yIChpID0gbG1j cy0+bWluX2Jpbl9pZHg7IGkgPD0gbG1jcy0+bWF4X2Jpbl9pZHg7IGkrKykgeworICAgICAgICAg ICAgaWYgKGx1bWEgPCBsbWNzLT5waXZvdFtpICsgMV0pCisgICAgICAgICAgICAgICAgYnJlYWs7 CisgICAgICAgIH0KKyAgICAgICAgaSA9IEZGTUlOKGksIExNQ1NfTUFYX0JJTl9TSVpFIC0gMSk7 CisKKyAgICAgICAgbGMtPmxtY3MuY2hyb21hX3NjYWxlID0gbG1jcy0+Y2hyb21hX3NjYWxlX2Nv ZWZmW2ldOworICAgICAgICBsYy0+bG1jcy54X3ZwZHUgPSB4OworICAgICAgICBsYy0+bG1jcy55 X3ZwZHUgPSB5OworICAgIH0KKyAgICByZXR1cm4gbGMtPmxtY3MuY2hyb21hX3NjYWxlOworfQor CisvLyA4LjcuNS4zIFBpY3R1cmUgcmVjb25zdHJ1Y3Rpb24gd2l0aCBsdW1hIGRlcGVuZGVudCBj aHJvbWEgcmVzaWR1YWwgc2NhbGluZyBwcm9jZXNzIGZvciBjaHJvbWEgc2FtcGxlcworc3RhdGlj IHZvaWQgRlVOQyhsbWNzX3NjYWxlX2Nocm9tYSkoVlZDTG9jYWxDb250ZXh0ICpsYywgaW50ICpk c3QsIGNvbnN0IGludCAqY29lZmYsCisgICAgY29uc3QgaW50IHdpZHRoLCBjb25zdCBpbnQgaGVp Z2h0LCBjb25zdCBpbnQgeDBfY3UsIGNvbnN0IGludCB5MF9jdSkKK3sKKyAgICBjb25zdCBpbnQg Y2hyb21hX3NjYWxlID0gRlVOQyhsbWNzX2Rlcml2ZV9jaHJvbWFfc2NhbGUpKGxjLCB4MF9jdSwg eTBfY3UpOworCisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAg ICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGlu dCBjID0gYXZfY2xpcF9pbnRwMigqY29lZmYsIEJJVF9ERVBUSCk7CisKKyAgICAgICAgICAgIGlm IChjID4gMCkKKyAgICAgICAgICAgICAgICAqZHN0ID0gKGMgKiBjaHJvbWFfc2NhbGUgKyAoMSA8 PCAxMCkpID4+IDExOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpkc3QgPSAt KCgtYyAqIGNocm9tYV9zY2FsZSArICgxIDw8IDEwKSkgPj4gMTEpOworICAgICAgICAgICAgY29l ZmYrKzsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMg YXZfYWx3YXlzX2lubGluZSB2b2lkIEZVTkMocmVmX2ZpbHRlcikoY29uc3QgcGl4ZWwgKmxlZnQs IGNvbnN0IHBpeGVsICp0b3AsCisgICAgcGl4ZWwgKmZpbHRlcmVkX2xlZnQsIHBpeGVsICpmaWx0 ZXJlZF90b3AsIGNvbnN0IGludCBsZWZ0X3NpemUsIGNvbnN0IGludCB0b3Bfc2l6ZSwKKyAgICBj b25zdCBpbnQgdW5maWx0ZXJfbGFzdF9vbmUpCit7CisgICAgZmlsdGVyZWRfbGVmdFstMV0gPSBm aWx0ZXJlZF90b3BbLTFdID0gKGxlZnRbMF0gKyAgMiAqIGxlZnRbLTFdICsgdG9wWzBdICsgMiAp ID4+IDI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZWZ0X3NpemUgLSB1bmZpbHRlcl9sYXN0 X29uZTsgaSsrKSB7CisgICAgICAgIGZpbHRlcmVkX2xlZnRbaV0gPSAobGVmdFtpLSAxXSArIDIg KiBsZWZ0W2ldICsgbGVmdFtpICsgMV0gKyAyKSA+PiAyOworICAgIH0KKyAgICBmb3IgKGludCBp ID0gMDsgaSA8IHRvcF9zaXplIC0gdW5maWx0ZXJfbGFzdF9vbmU7IGkrKykgeworICAgICAgICBm aWx0ZXJlZF90b3BbaV0gPSAodG9wW2ktMV0gKyAyICogdG9wW2ldICsgdG9wW2kgKyAxXSArIDIp ID4+IDI7CisgICAgfQorICAgIGlmICh1bmZpbHRlcl9sYXN0X29uZSkgeworICAgICAgICBmaWx0 ZXJlZF90b3BbdG9wX3NpemUgLSAxXSA9IHRvcFt0b3Bfc2l6ZSAtIDFdOworICAgICAgICBmaWx0 ZXJlZF9sZWZ0W2xlZnRfc2l6ZSAtIDFdID0gbGVmdFtsZWZ0X3NpemUgLSAxXTsKKyAgICB9Cit9 CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgRlVOQyhwcmVwYXJlX2ludHJhX2VkZ2Vf cGFyYW1zKShjb25zdCBWVkNMb2NhbENvbnRleHQgKmxjLAorICAgIEludHJhRWRnZVBhcmFtcyog ZWRnZSwgY29uc3QgcGl4ZWwgKnNyYywgY29uc3QgcHRyZGlmZl90IHN0cmlkZSwKKyAgICBjb25z dCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGNfaWR4LCBjb25zdCBpbnQgaXNfaW50 cmFfbWlwLAorICAgIGNvbnN0IGludCBtb2RlLCBjb25zdCBpbnQgcmVmX2lkeCwgY29uc3QgaW50 IG5lZWRfcGRwYykKK3sKKyNkZWZpbmUgRVhURU5EKHB0ciwgdmFsLCBsZW4pICAgICAgICAgXAor ZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsg aSA8IChsZW4pOyBpKyspICAgICAgIFwKKyAgICAgICAgKihwdHIgKyBpKSA9IHZhbDsgICAgICAg ICAgICAgXAorfSB3aGlsZSAoMCkKKyAgICBjb25zdCBDb2RpbmdVbml0ICpjdSA9IGxjLT5jdTsK KyAgICBjb25zdCBpbnQgcmVmX2ZpbHRlcl9mbGFnID0gaXNfaW50cmFfbWlwID8gMCA6IGZmX3Z2 Y19yZWZfZmlsdGVyX2ZsYWdfZGVyaXZlKG1vZGUpOworICAgIGNvbnN0IGludCBmaWx0ZXJfZmxh ZyA9ICFyZWZfaWR4ICYmIHcgKiBoID4gMzIgJiYgIWNfaWR4ICYmCisgICAgICAgIGN1LT5pc3Bf c3BsaXRfdHlwZSA9PSBJU1BfTk9fU1BMSVQgJiYgcmVmX2ZpbHRlcl9mbGFnOworICAgIGludCBj YW5kX3VwX2xlZnQgICAgICA9IGxjLT5uYS5jYW5kX3VwX2xlZnQ7CisgICAgcGl4ZWwgICpsZWZ0 ICAgICAgICAgID0gKHBpeGVsKillZGdlLT5sZWZ0X2FycmF5ICsgTUFYX1RCX1NJWkUgKyAzOwor ICAgIHBpeGVsICAqdG9wICAgICAgICAgICA9IChwaXhlbCopZWRnZS0+dG9wX2FycmF5ICArIE1B WF9UQl9TSVpFICsgMzsKKyAgICBwaXhlbCAgKmZpbHRlcmVkX2xlZnQgPSAocGl4ZWwqKWVkZ2Ut PmZpbHRlcmVkX2xlZnRfYXJyYXkgKyBNQVhfVEJfU0laRSArIDM7CisgICAgcGl4ZWwgICpmaWx0 ZXJlZF90b3AgID0gKHBpeGVsKillZGdlLT5maWx0ZXJlZF90b3BfYXJyYXkgICsgTUFYX1RCX1NJ WkUgKyAzOworICAgIGNvbnN0IGludCByZWZfbGluZSA9IHJlZl9pZHggPT0gMyA/IC00IDogKC0x IC0gcmVmX2lkeCk7CisgICAgaW50IGxlZnRfc2l6ZSwgdG9wX3NpemUsIHVuZmlsdGVyX2xlZnRf c2l6ZSwgdW5maWx0ZXJfdG9wX3NpemU7CisgICAgaW50IGxlZnRfYXZhaWxhYmxlLCB0b3BfYXZh aWxhYmxlOworICAgIGludCByZWZ3LCByZWZoOworICAgIGludCBpbnRyYV9wcmVkX2FuZ2xlLCBp bnZfYW5nbGU7CisgICAgaW50IGk7CisKKyAgICBpZiAoaXNfaW50cmFfbWlwIHx8IG1vZGUgPT0g SU5UUkFfUExBTkFSKSB7CisgICAgICAgIGxlZnRfc2l6ZSA9IGggKyAxOworICAgICAgICB0b3Bf c2l6ZSAgPSB3ICsgMTsKKyAgICAgICAgdW5maWx0ZXJfbGVmdF9zaXplID0gbGVmdF9zaXplICsg ZmlsdGVyX2ZsYWc7CisgICAgICAgIHVuZmlsdGVyX3RvcF9zaXplICA9IHRvcF9zaXplICArIGZp bHRlcl9mbGFnOworICAgIH0gZWxzZSBpZiAobW9kZSA9PSBJTlRSQV9EQykgeworICAgICAgICB1 bmZpbHRlcl9sZWZ0X3NpemUgPSBsZWZ0X3NpemUgPSBoOworICAgICAgICB1bmZpbHRlcl90b3Bf c2l6ZSA9IHRvcF9zaXplICA9IHc7CisgICAgfSBlbHNlIGlmIChtb2RlID09IElOVFJBX1ZFUlQp IHsKKyAgICAgICAgLy93ZSBtYXkgbmVlZCAxIHBpeGVsIHRvIHByZWRpY3QgdGhlIHRvcCBsZWZ0 LgorICAgICAgICB1bmZpbHRlcl9sZWZ0X3NpemUgPSBsZWZ0X3NpemUgPSBuZWVkX3BkcGMgPyBo IDogMTsKKyAgICAgICAgdW5maWx0ZXJfdG9wX3NpemUgPSB0b3Bfc2l6ZSAgPSB3OworICAgIH0g ZWxzZSBpZiAobW9kZSA9PSBJTlRSQV9IT1JaKSB7CisgICAgICAgIHVuZmlsdGVyX2xlZnRfc2l6 ZSA9IGxlZnRfc2l6ZSA9IGg7CisgICAgICAgIC8vZXZlbiBuZWVkX3BkcGMgPT0gMCwgd2UgbWF5 IG5lZWQgMSBwaXhlbCB0byBwcmVkaWN0IHRoZSB0b3AgbGVmdC4KKyAgICAgICAgdW5maWx0ZXJf dG9wX3NpemUgPSB0b3Bfc2l6ZSA9IG5lZWRfcGRwYyA/IHcgOiAxOworICAgIH0gZWxzZSB7Cisg ICAgICAgIGlmIChjdS0+aXNwX3NwbGl0X3R5cGUgPT0gSVNQX05PX1NQTElUIHx8IGNfaWR4KSB7 CisgICAgICAgICAgICByZWZ3ID0gdyAqIDI7CisgICAgICAgICAgICByZWZoID0gaCAqIDI7Cisg ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWZ3ID0gY3UtPmNiX3dpZHRoICsgdzsKKyAg ICAgICAgICAgIHJlZmggPSBjdS0+Y2JfaGVpZ2h0ICsgaDsKKyAgICAgICAgfQorICAgICAgICBp bnRyYV9wcmVkX2FuZ2xlID0gZmZfdnZjX2ludHJhX3ByZWRfYW5nbGVfZGVyaXZlKG1vZGUpOwor ICAgICAgICBpbnZfYW5nbGUgPSBmZl92dmNfaW50cmFfaW52X2FuZ2xlX2Rlcml2ZShpbnRyYV9w cmVkX2FuZ2xlKTsKKyAgICAgICAgdW5maWx0ZXJfdG9wX3NpemUgPSB0b3Bfc2l6ZSAgPSByZWZ3 OworICAgICAgICB1bmZpbHRlcl9sZWZ0X3NpemUgPSBsZWZ0X3NpemUgPSByZWZoOworICAgIH0K KworICAgIGxlZnRfYXZhaWxhYmxlID0gZmZfdnZjX2dldF9sZWZ0X2F2YWlsYWJsZShsYywgeCwg eSwgdW5maWx0ZXJfbGVmdF9zaXplLCBjX2lkeCk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlZnRf YXZhaWxhYmxlOyBpKyspCisgICAgICAgIGxlZnRbaV0gPSBQT1MocmVmX2xpbmUsIGkpOworCisg ICAgdG9wX2F2YWlsYWJsZSA9IGZmX3Z2Y19nZXRfdG9wX2F2YWlsYWJsZShsYywgeCwgeSwgdW5m aWx0ZXJfdG9wX3NpemUsIGNfaWR4KTsKKyAgICBtZW1jcHkodG9wLCBzcmMgKyByZWZfbGluZSAq IHN0cmlkZSwgdG9wX2F2YWlsYWJsZSAqIHNpemVvZihwaXhlbCkpOworCisgICAgZm9yIChpbnQg aSA9IC0xOyBpID49IHJlZl9saW5lOyBpLS0pIHsKKyAgICAgICAgaWYgKGNhbmRfdXBfbGVmdCkg eworICAgICAgICAgICAgbGVmdFtpXSA9IFBPUyhyZWZfbGluZSwgaSk7CisgICAgICAgICAgICB0 b3BbaV0gID0gUE9TKGksIHJlZl9saW5lKTsKKyAgICAgICAgfSBlbHNlIGlmIChsZWZ0X2F2YWls YWJsZSkgeworICAgICAgICAgICAgbGVmdFtpXSA9IHRvcFtpXSA9IGxlZnRbMF07CisgICAgICAg IH0gZWxzZSBpZiAodG9wX2F2YWlsYWJsZSkgeworICAgICAgICAgICAgbGVmdFtpXSA9IHRvcFtp XSA9IHRvcFswXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlZnRbaV0gPSB0b3Bb aV0gPSAxIDw8IChCSVRfREVQVEggLSAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEVYVEVO RCh0b3AgKyB0b3BfYXZhaWxhYmxlLCB0b3BbdG9wX2F2YWlsYWJsZS0xXSwgdW5maWx0ZXJfdG9w X3NpemUgLSB0b3BfYXZhaWxhYmxlKTsKKyAgICBFWFRFTkQobGVmdCArIGxlZnRfYXZhaWxhYmxl LCBsZWZ0W2xlZnRfYXZhaWxhYmxlLTFdLCB1bmZpbHRlcl9sZWZ0X3NpemUgLSBsZWZ0X2F2YWls YWJsZSk7CisKKyAgICBpZiAocmVmX2ZpbHRlcl9mbGFnKSB7CisgICAgICAgIGlmICghcmVmX2lk eCAmJiB3ICogaCA+IDMyICYmICFjX2lkeCAmJiBjdS0+aXNwX3NwbGl0X3R5cGUgPT0gSVNQX05P X1NQTElUICkgeworICAgICAgICAgICAgY29uc3QgaW50IHVuZmlsdGVyX2xhc3Rfb25lID0gbGVm dF9zaXplID09IHVuZmlsdGVyX2xlZnRfc2l6ZTsKKyAgICAgICAgICAgIEZVTkMocmVmX2ZpbHRl cikobGVmdCwgdG9wLCBmaWx0ZXJlZF9sZWZ0LCBmaWx0ZXJlZF90b3AsIHVuZmlsdGVyX2xlZnRf c2l6ZSwgdW5maWx0ZXJfdG9wX3NpemUsIHVuZmlsdGVyX2xhc3Rfb25lKTsKKyAgICAgICAgICAg IGxlZnQgPSBmaWx0ZXJlZF9sZWZ0OworICAgICAgICAgICAgdG9wICA9IGZpbHRlcmVkX3RvcDsK KyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWlzX2ludHJhX21pcCAmJiBtb2RlICE9IElOVFJB X1BMQU5BUiAmJiBtb2RlICE9IElOVFJBX0RDKSB7CisgICAgICAgIGlmIChyZWZfZmlsdGVyX2Zs YWcgfHwgcmVmX2lkeCB8fCBjdS0+aXNwX3NwbGl0X3R5cGUgIT0gSVNQX05PX1NQTElUKSB7Cisg ICAgICAgICAgICBlZGdlLT5maWx0ZXJfZmxhZyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAg ICAgICAgICBjb25zdCBpbnQgbWluX2Rpc3RfdmVyX2hvciA9IEZGTUlOKGFicyhtb2RlIC0gNTAp LCBhYnMobW9kZSAtIDE4KSk7CisgICAgICAgICAgICBjb25zdCBpbnQgaW50cmFfaG9yX3Zlcl9k aXN0X3RocmVzW10gPSB7MjQsIDE0LCAyLCAwLCAwfTsKKyAgICAgICAgICAgIGNvbnN0IGludCBu dGJzID0gKGF2X2xvZzIodykgKyBhdl9sb2cyKGgpKSA+PiAxOworICAgICAgICAgICAgZWRnZS0+ ZmlsdGVyX2ZsYWcgPSBtaW5fZGlzdF92ZXJfaG9yID4gaW50cmFfaG9yX3Zlcl9kaXN0X3RocmVz W250YnMgLSAyXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtb2RlICE9IElOVFJBX1ZFUlQg JiYgbW9kZSAhPSBJTlRSQV9IT1JaKSB7CisgICAgICAgICAgICBpZiAobW9kZSA+PSBJTlRSQV9E SUFHKSB7CisgICAgICAgICAgICAgICAgaWYgKGludHJhX3ByZWRfYW5nbGUgPCAwKSB7CisgICAg ICAgICAgICAgICAgICAgIHBpeGVsICpwID0gdG9wIC0gKHJlZl9pZHggKyAxKTsKKyAgICAgICAg ICAgICAgICAgICAgZm9yIChpbnQgeCA9IC1oOyB4IDwgMDsgeCsrKSB7CisgICAgICAgICAgICAg ICAgICAgICAgICBjb25zdCBpbnQgaWR4ID0gLTEgLSByZWZfaWR4ICsgRkZNSU4oKHgqaW52X2Fu Z2xlICsgMjU2KSA+PiA5LCBoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBbeF0gPSBsZWZ0 W2lkeF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugewor ICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcmVmdzsgaSA8PSByZWZ3ICsgRkZNQVgo MSwgdy9oKSAqIHJlZl9pZHggKyAxOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB0b3Bb aV0gPSB0b3BbcmVmdyAtIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxz ZSB7CisgICAgICAgICAgICAgICAgaWYgKGludHJhX3ByZWRfYW5nbGUgPCAwKSB7CisgICAgICAg ICAgICAgICAgICAgIHBpeGVsICpwID0gbGVmdCAtIChyZWZfaWR4ICsgMSk7CisgICAgICAgICAg ICAgICAgICAgIGZvciAoaW50IHggPSAtdzsgeCA8IDA7IHgrKykgeworICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgaW50IGlkeCA9IC0xIC0gcmVmX2lkeCArIEZGTUlOKCh4Kmludl9hbmds ZSArIDI1NikgPj4gOSwgdyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwW3hdID0gdG9wW2lk eF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAg ICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcmVmaDsgaSA8PSByZWZoICsgRkZNQVgoMSwg aC93KSAqIHJlZl9pZHggKyAxOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0W2ld ID0gbGVmdFtyZWZoIC0gMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg ICAgICB9CisgICAgfQorICAgIGVkZ2UtPmxlZnQgPSAodWludDhfdCopbGVmdDsKKyAgICBlZGdl LT50b3AgID0gKHVpbnQ4X3QqKXRvcDsKK30KKworLy84LjQuMSBHZW5lcmFsIGRlY29kaW5nIHBy b2Nlc3MgZm9yIGNvZGluZyB1bml0cyBjb2RlZCBpbiBpbnRyYSBwcmVkaWN0aW9uIG1vZGUKK3N0 YXRpYyB2b2lkIEZVTkMoaW50cmFfcHJlZCkoY29uc3QgVlZDTG9jYWxDb250ZXh0ICpsYywgaW50 IHgwLCBpbnQgeTAsCisgICAgY29uc3QgaW50IHdpZHRoLCBjb25zdCBpbnQgaGVpZ2h0LCBpbnQg Y19pZHgpCit7CisgICAgVlZDRnJhbWVDb250ZXh0ICpmYyAgICAgPSBsYy0+ZmM7CisgICAgY29u c3QgVlZDU1BTICpzcHMgPSBmYy0+cHMuc3BzOworICAgIGNvbnN0IFZWQ1BQUyAqcHBzID0gZmMt PnBzLnBwczsKKyAgICBjb25zdCBDb2RpbmdVbml0ICpjdSA9IGxjLT5jdTsKKyAgICBjb25zdCBp bnQgbG9nMl9taW5fY2Jfc2l6ZSAgICA9IHNwcy0+bWluX2NiX2xvZzJfc2l6ZV95OworICAgIGNv bnN0IGludCBtaW5fY2Jfd2lkdGggICAgICAgID0gcHBzLT5taW5fY2Jfd2lkdGg7CisgICAgY29u c3QgaW50IHhfY2IgICAgICAgICAgICAgICAgPSB4MCA+PiBsb2cyX21pbl9jYl9zaXplOworICAg IGNvbnN0IGludCB5X2NiICAgICAgICAgICAgICAgID0geTAgPj4gbG9nMl9taW5fY2Jfc2l6ZTsK KworICAgIGNvbnN0IGludCBoc2hpZnQgPSBmYy0+cHMuc3BzLT5oc2hpZnRbY19pZHhdOworICAg IGNvbnN0IGludCB2c2hpZnQgPSBmYy0+cHMuc3BzLT52c2hpZnRbY19pZHhdOworICAgIGNvbnN0 IGludCB4ID0geDAgPj4gaHNoaWZ0OworICAgIGNvbnN0IGludCB5ID0geTAgPj4gdnNoaWZ0Owor ICAgIGNvbnN0IGludCB3ID0gd2lkdGggPj4gaHNoaWZ0OworICAgIGNvbnN0IGludCBoID0gaGVp Z2h0ID4+IHZzaGlmdDsKKyAgICBjb25zdCBwdHJkaWZmX3Qgc3RyaWRlID0gZmMtPmZyYW1lLT5s aW5lc2l6ZVtjX2lkeF0gLyBzaXplb2YocGl4ZWwpOworCisgICAgY29uc3QgaW50IHByZWRfbW9k ZSA9IGNfaWR4ID8gY3UtPmludHJhX3ByZWRfbW9kZV9jIDogY3UtPmludHJhX3ByZWRfbW9kZV95 OworICAgIGNvbnN0IGludCBtb2RlID0gZmZfdnZjX3dpZGVfYW5nbGVfbW9kZV9tYXBwaW5nKGN1 LCB3LCBoLCBjX2lkeCwgcHJlZF9tb2RlKTsKKworICAgIGNvbnN0IGludCBpbnRyYV9taXBfZmxh ZyAgPSBTQU1QTEVfQ1RCKGZjLT50YWIuaW1mLCB4X2NiLCB5X2NiKTsKKyAgICBjb25zdCBpbnQg aXNfaW50cmFfbWlwICAgID0gaW50cmFfbWlwX2ZsYWcgJiYgKCFjX2lkeCB8fCBjdS0+bWlwX2No cm9tYV9kaXJlY3RfZmxhZyk7CisgICAgY29uc3QgaW50IHJlZl9pZHggPSBjX2lkeCA/IDAgOiBj dS0+aW50cmFfbHVtYV9yZWZfaWR4OworICAgIGNvbnN0IGludCBuZWVkX3BkcGMgPSBmZl92dmNf bmVlZF9wZHBjKHcsIGgsIGN1LT5iZHBjbV9mbGFnW2NfaWR4XSwgbW9kZSwgcmVmX2lkeCk7CisK KworICAgIHBpeGVsICpzcmMgPSAocGl4ZWwqKWZjLT5mcmFtZS0+ZGF0YVtjX2lkeF0gKyB4ICsg eSAqIHN0cmlkZTsKKyAgICBJbnRyYUVkZ2VQYXJhbXMgZWRnZTsKKworICAgIEZVTkMocHJlcGFy ZV9pbnRyYV9lZGdlX3BhcmFtcykobGMsICZlZGdlLCBzcmMsIHN0cmlkZSwgeCwgeSwgdywgaCwg Y19pZHgsIGlzX2ludHJhX21pcCwgbW9kZSwgcmVmX2lkeCwgbmVlZF9wZHBjKTsKKworICAgIGlm IChpc19pbnRyYV9taXApIHsKKyAgICAgICAgaW50IGludHJhX21pcF90cmFuc3Bvc2VkX2ZsYWcg PSBTQU1QTEVfQ1RCKGZjLT50YWIuaW10ZiwgeF9jYiwgeV9jYik7CisgICAgICAgIGludCBpbnRy YV9taXBfbW9kZSA9IFNBTVBMRV9DVEIoZmMtPnRhYi5pbW0sIHhfY2IsIHlfY2IpOworCisgICAg ICAgIGZjLT52dmNkc3AuaW50cmEucHJlZF9taXAoKHVpbnQ4X3QgKilzcmMsIGVkZ2UudG9wLCBl ZGdlLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICB3LCBoLCBzdHJpZGUsIGludHJhX21p cF9tb2RlLCBpbnRyYV9taXBfdHJhbnNwb3NlZF9mbGFnKTsKKyAgICB9IGVsc2UgaWYgKG1vZGUg PT0gSU5UUkFfUExBTkFSKSB7CisgICAgICAgIGZjLT52dmNkc3AuaW50cmEucHJlZF9wbGFuYXIo KHVpbnQ4X3QgKilzcmMsIGVkZ2UudG9wLCBlZGdlLmxlZnQsIHcsIGgsIHN0cmlkZSk7CisgICAg fSBlbHNlIGlmIChtb2RlID09IElOVFJBX0RDKSB7CisgICAgICAgIGZjLT52dmNkc3AuaW50cmEu cHJlZF9kYygodWludDhfdCAqKXNyYywgZWRnZS50b3AsIGVkZ2UubGVmdCwgdywgaCwgc3RyaWRl KTsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gSU5UUkFfVkVSVCkgeworICAgICAgICBmYy0+dnZj ZHNwLmludHJhLnByZWRfdigodWludDhfdCAqKXNyYywgZWRnZS50b3AsIHcsIGgsIHN0cmlkZSk7 CisgICAgfSBlbHNlIGlmIChtb2RlID09IElOVFJBX0hPUlopIHsKKyAgICAgICAgZmMtPnZ2Y2Rz cC5pbnRyYS5wcmVkX2goKHVpbnQ4X3QgKilzcmMsIGVkZ2UubGVmdCwgdywgaCwgc3RyaWRlKTsK KyAgICB9IGVsc2UgeworICAgICAgICBpZiAobW9kZSA+PSBJTlRSQV9ESUFHKSB7CisgICAgICAg ICAgICBmYy0+dnZjZHNwLmludHJhLnByZWRfYW5ndWxhcl92KCh1aW50OF90ICopc3JjLCBlZGdl LnRvcCwgZWRnZS5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsIGgs IHN0cmlkZSwgY19pZHgsIG1vZGUsIHJlZl9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZWRnZS5maWx0ZXJfZmxhZywgbmVlZF9wZHBjKTsKKyAgICAgICAgfSBlbHNlIHsK KyAgICAgICAgICAgIGZjLT52dmNkc3AuaW50cmEucHJlZF9hbmd1bGFyX2goKHVpbnQ4X3QgKilz cmMsIGVkZ2UudG9wLCBlZGdlLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgdywgaCwgc3RyaWRlLCBjX2lkeCwgbW9kZSwgcmVmX2lkeCwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBlZGdlLmZpbHRlcl9mbGFnLCBuZWVkX3BkcGMpOworICAgICAgICB9 CisgICAgfQorICAgIGlmIChuZWVkX3BkcGMpIHsKKyAgICAgICAgLy84LjQuNS4yLjE1IFBvc2l0 aW9uLWRlcGVuZGVudCBpbnRyYSBwcmVkaWN0aW9uIHNhbXBsZSBmaWx0ZXJpbmcgcHJvY2Vzcwor ICAgICAgICBpZiAoIWlzX2ludHJhX21pcCAmJiAobW9kZSA9PSBJTlRSQV9QTEFOQVIgfHwgbW9k ZSA9PSBJTlRSQV9EQyB8fAorICAgICAgICAgICAgbW9kZSA9PSBJTlRSQV9WRVJUIHx8IG1vZGUg PT0gSU5UUkFfSE9SWikpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZSA9IChhdl9sb2cy KHcpICsgYXZfbG9nMihoKSAtIDIpID4+IDI7CisgICAgICAgICAgICBjb25zdCBwaXhlbCAqbGVm dCA9IChwaXhlbCopZWRnZS5sZWZ0OworICAgICAgICAgICAgY29uc3QgcGl4ZWwgKnRvcCAgPSAo cGl4ZWwqKWVkZ2UudG9wOworICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5Kysp IHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAg ICAgICAgICAgICAgICBpbnQgbCwgdCwgd2wsIHd0LCBwcmVkOworICAgICAgICAgICAgICAgICAg ICBwaXhlbCB2YWw7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlID09IElOVFJBX1BMQU5B UiB8fCBtb2RlID09IElOVFJBX0RDKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsICA9IGxl ZnRbeV07CisgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdG9wW3hdOworICAgICAgICAgICAg ICAgICAgICAgICAgd2wgPSAzMiA+PiBGRk1JTigoeCA8PCAxKSA+PiBzY2FsZSwgMzEpOworICAg ICAgICAgICAgICAgICAgICAgICAgd3QgPSAzMiA+PiBGRk1JTigoeSA8PCAxKSA+PiBzY2FsZSwg MzEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAg ICAgbCAgPSBsZWZ0W3ldIC0gbGVmdFstMV0gKyBQT1MoeCx5KTsKKyAgICAgICAgICAgICAgICAg ICAgICAgIHQgPSB0b3BbeF0gLSB0b3BbLTFdICsgUE9TKHgseSk7CisgICAgICAgICAgICAgICAg ICAgICAgICB3bCA9IChtb2RlID09IElOVFJBX1ZFUlQpID8gICgzMiA+PiBGRk1JTigoeCA8PCAx KSA+PiBzY2FsZSwgMzEpKSA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3dCA9IChtb2Rl ID09IElOVFJBX0hPUlopID8gICgzMiA+PiBGRk1JTigoeSA8PCAxKSA+PiBzY2FsZSwgMzEpKSA6 IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFsID0gUE9T KHgsIHkpOworICAgICAgICAgICAgICAgICAgICBwcmVkICA9IHZhbCArICgod2wgKiAobCAtIHZh bCkgKyB3dCAqICh0IC0gdmFsKSArIDMyKSA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgUE9T KHgsIHkpID0gQ0xJUChwcmVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cisg ICAgICAgIH0KKyAgICB9Cit9CisKKy8vOC40LjUuMi4xMSBTcGVjaWZpY2F0aW9uIG9mIElOVFJB X1BMQU5BUiBpbnRyYSBwcmVkaWN0aW9uIG1vZGUKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZv aWQgRlVOQyhwcmVkX3BsYW5hcikodWludDhfdCAqX3NyYywgY29uc3QgdWludDhfdCAqX3RvcCwK KyAgICBjb25zdCB1aW50OF90ICpfbGVmdCwgY29uc3QgaW50IHcsIGNvbnN0IGludCBoLCBjb25z dCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGludCB4LCB5OworICAgIHBpeGVsICpzcmMgICAg ICAgID0gKHBpeGVsICopX3NyYzsKKyAgICBjb25zdCBwaXhlbCAqdG9wICA9IChjb25zdCBwaXhl bCAqKV90b3A7CisgICAgY29uc3QgcGl4ZWwgKmxlZnQgPSAoY29uc3QgcGl4ZWwgKilfbGVmdDsK KyAgICBjb25zdCBpbnQgbG9ndyAgPSBhdl9sb2cyKHcpOworICAgIGNvbnN0IGludCBsb2doICA9 IGF2X2xvZzIoaCk7CisgICAgY29uc3QgaW50IHNpemUgID0gIHcgKiBoOworICAgIGNvbnN0IGlu dCBzaGlmdCA9IChsb2d3ICsgbG9naCArIDEpOworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5Kysp IHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgY29uc3Qg aW50IHByZWRfdiA9ICgoaCAtIDEgLSB5KSAqIHRvcFt4XSAgKyAoeSArIDEpICogbGVmdFtoXSkg PDwgbG9ndzsKKyAgICAgICAgICAgIGNvbnN0IGludCBwcmVkX2ggPSAoKHcgLSAxIC0geCkgKiBs ZWZ0W3ldICsgKHggKyAxKSAqIHRvcFt3XSkgPDwgbG9naDsKKyAgICAgICAgICAgIGNvbnN0IGlu dCBwcmVkID0gKHByZWRfdiArIHByZWRfaCArIHNpemUpID4+IHNoaWZ0OworICAgICAgICAgICAg UE9TKHgsIHkpID0gcHJlZDsKKyAgICAgICAgfQorICAgIH0KK30KKworLy84LjQuNS4yLjMgTUlQ IGJvdW5kYXJ5IHNhbXBsZSBkb3duc2FtcGxpbmcgcHJvY2Vzcworc3RhdGljIGF2X2Fsd2F5c19p bmxpbmUgdm9pZCBGVU5DKG1pcF9kb3duc2FtcGxpbmcpKGludCAqcmVkdWNlZCwgY29uc3QgaW50 IGJvdW5kYXJ5X3NpemUsCisgICAgY29uc3QgcGl4ZWwgKnJlZiwgY29uc3QgaW50IG5fdGJfcykK K3sKKyAgICBjb25zdCBpbnQgYl9kd24gPSBuX3RiX3MgLyBib3VuZGFyeV9zaXplOworICAgIGNv bnN0IGludCBsb2cyID0gYXZfbG9nMihiX2R3bik7CisKKyAgICBpZiAoYm91bmRhcnlfc2l6ZSA9 PSBuX3RiX3MpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuX3RiX3M7IGkrKykKKyAg ICAgICAgICAgIHJlZHVjZWRbaV0gPSByZWZbaV07CisgICAgICAgIHJldHVybjsKKyAgICB9Cisg ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3VuZGFyeV9zaXplOyBpKyspIHsKKyAgICAgICAgaW50 IHI7CisgICAgICAgIHIgPSAqcmVmKys7CisgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgYl9k d247IGorKykKKyAgICAgICAgICAgIHIgKz0gKnJlZisrOworICAgICAgICByZWR1Y2VkW2ldID0g KHIgKyAoMSA8PCAobG9nMiAtIDEpKSkgPj4gbG9nMjsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9h bHdheXNfaW5saW5lIHZvaWQgRlVOQyhtaXBfcmVkdWNlZF9wcmVkKShwaXhlbCAqc3JjLCBjb25z dCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgIGNvbnN0IGludCB1cF9ob3IsIGNvbnN0IGludCB1cF92 ZXIsIGNvbnN0IGludCBwcmVkX3NpemUsIGNvbnN0IGludCAqcmVkdWNlZCwgY29uc3QgaW50IHJl ZHVjZWRfc2l6ZSwKKyAgICBjb25zdCBpbnQgb3csIGNvbnN0IGludCB0ZW1wMCwgY29uc3QgdWlu dDhfdCAqbWF0cml4LCBpbnQgaXNfdHJhbnNwb3NlZCkKK3sKKyAgICBzcmMgPSAmUE9TKHVwX2hv ciAtIDEsIHVwX3ZlciAtIDEpOworICAgIGZvciAoaW50IHkgPSAwOyB5IDwgcHJlZF9zaXplOyB5 KyspIHsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBwcmVkX3NpemU7IHgrKykgeworICAg ICAgICAgICAgaW50IHByZWQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBy ZWR1Y2VkX3NpemU7IGkrKykKKyAgICAgICAgICAgICAgICBwcmVkICs9IHJlZHVjZWRbaV0gKiBt YXRyaXhbaV07CisgICAgICAgICAgICBtYXRyaXggKz0gcmVkdWNlZF9zaXplOworICAgICAgICAg ICAgcHJlZCA9ICgocHJlZCArIG93KSA+PiA2KSArIHRlbXAwOworICAgICAgICAgICAgcHJlZCA9 IGF2X2NsaXAocHJlZCwgMCwgKDE8PEJJVF9ERVBUSCkgLSAxKTsKKyAgICAgICAgICAgIGlmIChp c190cmFuc3Bvc2VkKQorICAgICAgICAgICAgICAgIFBPUyh5ICogdXBfaG9yLCB4ICogdXBfdmVy KSA9IHByZWQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUE9TKHggKiB1cF9o b3IsIHkgKiB1cF92ZXIpID0gcHJlZDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2 X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKG1pcF91cHNhbXBsaW5nXzFkKShwaXhlbCAqZHN0LCBj b25zdCBpbnQgZHN0X3N0ZXAsIGNvbnN0IGludCBkc3Rfc3RyaWRlLCBjb25zdCBpbnQgZHN0X2hl aWdodCwgY29uc3QgaW50IGZhY3RvciwKKyAgICBjb25zdCBwaXhlbCAqYm91bmRhcnksIGNvbnN0 IGludCBib3VuZGFyeV9zdGVwLCAgY29uc3QgaW50IHByZWRfc2l6ZSkKK3sKKworICAgIGZvciAo aW50IGkgPSAwOyBpIDwgZHN0X2hlaWdodDsgaSsrKSB7CisgICAgICAgIGNvbnN0IHBpeGVsICpi ZWZvcmUgPSBib3VuZGFyeTsKKyAgICAgICAgY29uc3QgcGl4ZWwgKmFmdGVyICA9IGRzdCAtIGRz dF9zdGVwOworICAgICAgICBwaXhlbCAqZCA9IGRzdDsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7 IGogPCBwcmVkX3NpemU7IGorKykgeworICAgICAgICAgICAgYWZ0ZXIgKz0gZHN0X3N0ZXAgKiBm YWN0b3I7CisgICAgICAgICAgICBmb3IgKGludCBrID0gMTsgayA8IGZhY3RvcjsgaysrKSB7Cisg ICAgICAgICAgICAgICAgaW50IG1pZCA9IChmYWN0b3IgLSBrKSAqICgqYmVmb3JlKSArIGsgKiAo KmFmdGVyKTsKKyAgICAgICAgICAgICAgICAqZCA9IChtaWQgKyBmYWN0b3IgLyAyKSAvIGZhY3Rv cjsKKyAgICAgICAgICAgICAgICBkICs9IGRzdF9zdGVwOworICAgICAgICAgICAgfQorICAgICAg ICAgICAgYmVmb3JlID0gYWZ0ZXI7CisgICAgICAgICAgICBkICs9IGRzdF9zdGVwOworICAgICAg ICB9CisgICAgICAgIGJvdW5kYXJ5ICs9IGJvdW5kYXJ5X3N0ZXA7CisgICAgICAgIGRzdCArPSBk c3Rfc3RyaWRlOworICAgIH0KK30KKworLy84LjQuNS4yLjIgTWF0cml4LWJhc2VkIGludHJhIHNh bXBsZSBwcmVkaWN0aW9uCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZVTkMocHJlZF9t aXApKHVpbnQ4X3QgKl9zcmMsIGNvbnN0IHVpbnQ4X3QgKl90b3AsCisgICAgY29uc3QgdWludDhf dCAqX2xlZnQsIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwgY29uc3QgcHRyZGlmZl90IHN0cmlk ZSwKKyAgICBpbnQgbW9kZV9pZCwgaW50IGlzX3RyYW5zcG9zZWQpCit7CisgICAgcGl4ZWwgKnNy YyAgICAgICAgPSAocGl4ZWwgKilfc3JjOworICAgIGNvbnN0IHBpeGVsICp0b3AgID0gKGNvbnN0 IHBpeGVsICopX3RvcDsKKyAgICBjb25zdCBwaXhlbCAqbGVmdCA9IChjb25zdCBwaXhlbCAqKV9s ZWZ0OworCisgICAgY29uc3QgaW50IHNpemVfaWQgPSBmZl92dmNfZ2V0X21pcF9zaXplX2lkKHcs IGgpOworICAgIHN0YXRpYyBjb25zdCBpbnQgYm91bmRhcnlfc2l6ZXNbXSA9IHsyLCA0LCA0fTsK KyAgICBzdGF0aWMgY29uc3QgaW50IHByZWRfc2l6ZXNbXSA9IHs0LCA0LCA4fTsKKyAgICBjb25z dCBpbnQgYm91bmRhcnlfc2l6ZSA9IGJvdW5kYXJ5X3NpemVzW3NpemVfaWRdOworICAgIGNvbnN0 IGludCBwcmVkX3NpemUgICAgID0gcHJlZF9zaXplc1tzaXplX2lkXTsKKyAgICBjb25zdCBpbnQg aW5fc2l6ZSA9IDIgKiBib3VuZGFyeV9zaXplIC0gKChzaXplX2lkID09IDIpID8gMSA6IDApOwor ICAgIGNvbnN0IHVpbnQ4X3QgKm1hdHJpeCA9IGZmX3Z2Y19nZXRfbWlwX21hdHJpeChzaXplX2lk LCBtb2RlX2lkKTsKKyAgICBjb25zdCBpbnQgdXBfaG9yID0gdyAvIHByZWRfc2l6ZTsKKyAgICBj b25zdCBpbnQgdXBfdmVyID0gaCAvIHByZWRfc2l6ZTsKKworICAgIGludCByZWR1Y2VkWzE2XTsK KyAgICBpbnQgKnJlZF90ICA9IHJlZHVjZWQ7CisgICAgaW50ICpyZWRfbCAgPSByZWR1Y2VkICsg Ym91bmRhcnlfc2l6ZTsKKyAgICBpbnQgb2ZmID0gMSwgb3cgPSAwOworICAgIGludCB0ZW1wMDsK KworICAgIGlmIChpc190cmFuc3Bvc2VkKSB7CisgICAgICAgIEZGU1dBUChpbnQqLCByZWRfdCwg cmVkX2wpOworICAgIH0KKyAgICBGVU5DKG1pcF9kb3duc2FtcGxpbmcpKHJlZF90LCBib3VuZGFy eV9zaXplLCB0b3AsIHcpOworICAgIEZVTkMobWlwX2Rvd25zYW1wbGluZykocmVkX2wsIGJvdW5k YXJ5X3NpemUsIGxlZnQsIGgpOworCisgICAgdGVtcDAgPSByZWR1Y2VkWzBdOworICAgIGlmIChz aXplX2lkICE9IDIpIHsKKyAgICAgICAgb2ZmID0gMDsKKyAgICAgICAgb3cgPSAoMSA8PCAoQklU X0RFUFRIIC0gMSkpIC0gdGVtcDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3cgPSByZWR1Y2Vk WzFdIC0gdGVtcDA7CisgICAgfQorICAgIHJlZHVjZWRbMF0gPSBvdzsKKyAgICBmb3IgKGludCBp ID0gMTsgaSA8IGluX3NpemU7IGkrKykgeworICAgICAgICByZWR1Y2VkW2ldID0gcmVkdWNlZFtp ICsgb2ZmXSAtIHRlbXAwOworICAgICAgICBvdyArPSByZWR1Y2VkW2ldOworICAgIH0KKyAgICBv dyA9IDMyIC0gMzIgKiBvdzsKKworICAgIEZVTkMobWlwX3JlZHVjZWRfcHJlZCkoc3JjLCBzdHJp ZGUsIHVwX2hvciwgdXBfdmVyLCBwcmVkX3NpemUsIHJlZHVjZWQsIGluX3NpemUsIG93LCB0ZW1w MCwgbWF0cml4LCBpc190cmFuc3Bvc2VkKTsKKyAgICBpZiAodXBfaG9yID4gMSB8fCB1cF92ZXIg PiAxKSB7CisgICAgICAgIGlmICh1cF9ob3IgPiAxKQorICAgICAgICAgICAgRlVOQyhtaXBfdXBz YW1wbGluZ18xZCkoJlBPUygwLCB1cF92ZXIgLSAxKSwgMSwgdXBfdmVyICogc3RyaWRlLCBwcmVk X3NpemUsIHVwX2hvciwgbGVmdCArIHVwX3ZlciAtIDEsIHVwX3ZlciwgcHJlZF9zaXplKTsKKyAg ICAgICAgaWYgKHVwX3ZlciA+IDEpCisgICAgICAgICAgICBGVU5DKG1pcF91cHNhbXBsaW5nXzFk KShzcmMsIHN0cmlkZSwgMSwgdywgdXBfdmVyLCB0b3AsIDEsIHByZWRfc2l6ZSk7CisgICAgfQor fQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBwaXhlbCBGVU5DKHByZWRfZGNfdmFsKShjb25z dCBwaXhlbCAqdG9wLCBjb25zdCBwaXhlbCAqbGVmdCwKKyAgICBjb25zdCBpbnQgdywgY29uc3Qg aW50IGgpCit7CisgICAgcGl4ZWwgZGNfdmFsOworICAgIGludCBzdW0gPSAwOworICAgIHVuc2ln bmVkIGludCBvZmZzZXQgPSAodyA9PSBoKSA/ICh3IDw8IDEpIDogRkZNQVgodywgaCk7CisgICAg Y29uc3QgaW50IHNoaWZ0ID0gYXZfbG9nMihvZmZzZXQpOworICAgIG9mZnNldCA+Pj0gMTsKKyAg ICBpZiAodyA+PSBoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdzsgaSsrKQorICAg ICAgICAgICAgc3VtICs9IHRvcFtpXTsKKyAgICB9CisgICAgaWYgKHcgPD0gaCkgeworICAgICAg ICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKykKKyAgICAgICAgICAgIHN1bSArPSBsZWZ0W2ld OworICAgIH0KKyAgICBkY192YWwgPSAoc3VtICsgb2Zmc2V0KSA+PiBzaGlmdDsKKyAgICByZXR1 cm4gZGNfdmFsOworfQorCisvLzguNC41LjIuMTIgU3BlY2lmaWNhdGlvbiBvZiBJTlRSQV9EQyBp bnRyYSBwcmVkaWN0aW9uIG1vZGUKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgRlVOQyhw cmVkX2RjKSh1aW50OF90ICpfc3JjLCBjb25zdCB1aW50OF90ICpfdG9wLAorICAgIGNvbnN0IHVp bnQ4X3QgKl9sZWZ0LCBjb25zdCBpbnQgdywgY29uc3QgaW50IGgsIGNvbnN0IHB0cmRpZmZfdCBz dHJpZGUpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKnNyYyAgICAgICAgICA9IChwaXhl bCAqKV9zcmM7CisgICAgY29uc3QgcGl4ZWwgKnRvcCAgICA9IChjb25zdCBwaXhlbCAqKV90b3A7 CisgICAgY29uc3QgcGl4ZWwgKmxlZnQgICA9IChjb25zdCBwaXhlbCAqKV9sZWZ0OworICAgIGNv bnN0IHBpeGVsIGRjICAgICAgPSBGVU5DKHByZWRfZGNfdmFsKSh0b3AsIGxlZnQsIHcsIGgpOwor ICAgIGNvbnN0IHBpeGVsNCBhICAgICAgPSBQSVhFTF9TUExBVF9YNChkYyk7CisgICAgZm9yICh5 ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBwaXhlbCAqcyA9IHNyYzsKKyAgICAgICAgZm9y ICh4ID0gMDsgeCA8IHc7IHggKz0gNCkgeworICAgICAgICAgICAgQVZfV040UChzLCBhKTsKKyAg ICAgICAgICAgIHMgKz0gNDsKKyAgICAgICAgfQorICAgICAgICBzcmMgKz0gc3RyaWRlOworICAg IH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKHByZWRfdikodWludDhf dCAqX3NyYywgY29uc3QgdWludDhfdCAqX3RvcCwKKyAgICBjb25zdCBpbnQgdywgY29uc3QgaW50 IGgsIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgcGl4ZWwgKnNyYyAgICAgICAgICA9 IChwaXhlbCAqKV9zcmM7CisgICAgY29uc3QgcGl4ZWwgKnRvcCAgICA9IChjb25zdCBwaXhlbCAq KV90b3A7CisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgbWVtY3B5 KHNyYywgdG9wLCBzaXplb2YocGl4ZWwpICAqIHcpOworICAgICAgICBzcmMgKz0gc3RyaWRlOwor ICAgIH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhwcmVkX2gpKHVpbnQ4X3QgKl9zcmMsIGNvbnN0 IHVpbnQ4X3QgKl9sZWZ0LCBjb25zdCBpbnQgdywgY29uc3QgaW50IGgsCisgICAgY29uc3QgcHRy ZGlmZl90IHN0cmlkZSkKK3sKKyAgICBwaXhlbCAqc3JjICAgICAgICAgID0gKHBpeGVsICopX3Ny YzsKKyAgICBjb25zdCBwaXhlbCAqbGVmdCAgICA9IChjb25zdCBwaXhlbCAqKV9sZWZ0OworICAg IGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGNvbnN0IHBpeGVsNCBhID0g UElYRUxfU1BMQVRfWDQobGVmdFt5XSk7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsg eCArPSA0KSB7CisgICAgICAgICAgICBBVl9XTjRQKCZQT1MoeCwgeSksIGEpOworICAgICAgICB9 CisgICAgfQorfQorCisjZGVmaW5lIElOVFJBX0xVTUFfRklMVEVSKHApICAgIENMSVAoKHBbMF0g KiBmWzBdICsgcFsxXSAqIGZbMV0gKyBwWzJdICogZlsyXSArIHBbM10gKiBmWzNdICsgMzIpID4+ IDYpCisjZGVmaW5lIElOVFJBX0NIUk9NQV9GSUxURVIocCkgICgoKDMyIC0gZmFjdCkgKiBwWzFd ICsgZmFjdCAqIHBbMl0gKyAxNikgPj4gNSkKKworLy84LjQuNS4yLjEzIFNwZWNpZmljYXRpb24g b2YgSU5UUkFfQU5HVUxBUjIuLklOVFJBX0FOR1VMQVI2NiBpbnRyYSBwcmVkaWN0aW9uIG1vZGVz CitzdGF0aWMgdm9pZCBGVU5DKHByZWRfYW5ndWxhcl92KSh1aW50OF90ICpfc3JjLCBjb25zdCB1 aW50OF90ICpfdG9wLCBjb25zdCB1aW50OF90ICpfbGVmdCwKKyAgICBjb25zdCBpbnQgdywgY29u c3QgaW50IGgsIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IGludCBjX2lkeCwgY29uc3Qg aW50IG1vZGUsCisgICAgY29uc3QgaW50IHJlZl9pZHgsIGNvbnN0IGludCBmaWx0ZXJfZmxhZywg Y29uc3QgaW50IG5lZWRfcGRwYykKK3sKKyAgICBwaXhlbCAqc3JjICAgICAgICAgID0gKHBpeGVs ICopX3NyYzsKKyAgICBjb25zdCBwaXhlbCAqbGVmdCAgID0gKGNvbnN0IHBpeGVsICopX2xlZnQ7 CisgICAgY29uc3QgcGl4ZWwgKnRvcCAgICA9IChjb25zdCBwaXhlbCAqKV90b3AgLSAoMSArIHJl Zl9pZHgpOworICAgIGNvbnN0IGludCBpbnRyYV9wcmVkX2FuZ2xlID0gZmZfdnZjX2ludHJhX3By ZWRfYW5nbGVfZGVyaXZlKG1vZGUpOworICAgIGludCBwb3MgPSAoMSArIHJlZl9pZHgpICogaW50 cmFfcHJlZF9hbmdsZTsKKyAgICBjb25zdCBpbnQgZHAgPSBpbnRyYV9wcmVkX2FuZ2xlOworICAg IGNvbnN0IGludCBpc19sdW1hID0gIWNfaWR4OworICAgIGludCBuc2NhbGUsIGludl9hbmdsZTsK KworICAgIGlmIChuZWVkX3BkcGMpIHsKKyAgICAgICAgaW52X2FuZ2xlID0gZmZfdnZjX2ludHJh X2ludl9hbmdsZV9kZXJpdmUoaW50cmFfcHJlZF9hbmdsZSk7CisgICAgICAgIG5zY2FsZSA9IGZm X3Z2Y19uc2NhbGVfZGVyaXZlKHcsIGgsIG1vZGUpOworICAgIH0KKworICAgIGZvciAoaW50IHkg PSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGNvbnN0IGludCBpZHggICA9IChwb3MgPj4gNSkg KyByZWZfaWR4OworICAgICAgICBjb25zdCBpbnQgZmFjdCA9IHBvcyAmIDMxOworICAgICAgICBp ZiAoIWZhY3QgJiYgKCFpc19sdW1hIHx8ICFmaWx0ZXJfZmxhZykpIHsKKyAgICAgICAgICAgIGZv ciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwg KnAgPSB0b3AgKyB4ICsgaWR4ICsgMTsKKyAgICAgICAgICAgICAgICBQT1MoeCwgeSkgPSAqcDsK KyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghY19pZHgp IHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmYgPSBmZl92dmNfaW50cmFfbHVtYV9m aWx0ZXJbZmlsdGVyX2ZsYWddW2ZhY3RdOworICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAw OyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsICpwID0gdG9w ICsgeCArIGlkeDsKKyAgICAgICAgICAgICAgICAgICAgUE9TKHgsIHkpID0gSU5UUkFfTFVNQV9G SUxURVIocCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAg ICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgICAg ICAgICBjb25zdCBwaXhlbCAqcCA9IHRvcCArIHggKyBpZHg7CisgICAgICAgICAgICAgICAgICAg IFBPUyh4LCB5KSA9IElOVFJBX0NIUk9NQV9GSUxURVIocCk7CisgICAgICAgICAgICAgICAgfQor ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuZWVkX3BkcGMpIHsKKyAgICAg ICAgICAgIGludCBpbnZfYW5nbGVfc3VtID0gMjU2ICsgaW52X2FuZ2xlOworICAgICAgICAgICAg Zm9yIChpbnQgeCA9IDA7IHggPCBGRk1JTih3LCAzIDw8IG5zY2FsZSk7IHgrKykgeworICAgICAg ICAgICAgICAgIGNvbnN0IHBpeGVsIGwgICA9IGxlZnRbeSArIChpbnZfYW5nbGVfc3VtID4+IDkp XTsKKyAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCB2YWwgPSBQT1MoeCwgeSk7CisgICAgICAg ICAgICAgICAgY29uc3QgaW50IHdsICAgID0gMzIgPj4gKCh4IDw8IDEpID4+IG5zY2FsZSk7Cisg ICAgICAgICAgICAgICAgY29uc3QgaW50IHByZWQgID0gdmFsICsgKCgobCAtIHZhbCkgKiB3bCAr IDMyKSA+PiA2KTsKKyAgICAgICAgICAgICAgICBQT1MoeCwgeSkgPSBDTElQKHByZWQpOworICAg ICAgICAgICAgICAgIGludl9hbmdsZV9zdW0gKz0gaW52X2FuZ2xlOworICAgICAgICAgICAgfQor ICAgICAgICB9CisgICAgICAgIHBvcyArPSBkcDsKKyAgICB9Cit9CisKKy8vOC40LjUuMi4xMyBT cGVjaWZpY2F0aW9uIG9mIElOVFJBX0FOR1VMQVIyLi5JTlRSQV9BTkdVTEFSNjYgaW50cmEgcHJl ZGljdGlvbiBtb2Rlcworc3RhdGljIHZvaWQgRlVOQyhwcmVkX2FuZ3VsYXJfaCkodWludDhfdCAq X3NyYywgY29uc3QgdWludDhfdCAqX3RvcCwgY29uc3QgdWludDhfdCAqX2xlZnQsCisgICAgY29u c3QgaW50IHcsIGNvbnN0IGludCBoLCBjb25zdCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCBpbnQg Y19pZHgsIGNvbnN0IGludCBtb2RlLAorICAgIGNvbnN0IGludCByZWZfaWR4LCBjb25zdCBpbnQg ZmlsdGVyX2ZsYWcsIGNvbnN0IGludCBuZWVkX3BkcGMpCit7CisgICAgcGl4ZWwgKnNyYyAgICAg ICAgICA9IChwaXhlbCAqKV9zcmM7CisgICAgY29uc3QgcGl4ZWwgKmxlZnQgICA9IChjb25zdCBw aXhlbCAqKV9sZWZ0IC0gKDEgKyByZWZfaWR4KTsKKyAgICBjb25zdCBwaXhlbCAqdG9wICAgID0g KGNvbnN0IHBpeGVsICopX3RvcDsKKyAgICBjb25zdCBpbnQgaXNfbHVtYSA9ICFjX2lkeDsKKyAg ICBjb25zdCBpbnQgaW50cmFfcHJlZF9hbmdsZSA9IGZmX3Z2Y19pbnRyYV9wcmVkX2FuZ2xlX2Rl cml2ZShtb2RlKTsKKyAgICBjb25zdCBpbnQgZHAgPSBpbnRyYV9wcmVkX2FuZ2xlOworICAgIGlu dCBuc2NhbGUgPSAwLCBpbnZfYW5nbGUsIGludl9hbmdsZV9zdW07CisKKyAgICBpZiAobmVlZF9w ZHBjKSB7CisgICAgICAgIGludl9hbmdsZSA9IGZmX3Z2Y19pbnRyYV9pbnZfYW5nbGVfZGVyaXZl KGludHJhX3ByZWRfYW5nbGUpOworICAgICAgICBpbnZfYW5nbGVfc3VtID0gMjU2ICsgaW52X2Fu Z2xlOworICAgICAgICBuc2NhbGUgPSBmZl92dmNfbnNjYWxlX2Rlcml2ZSh3LCBoLCBtb2RlKTsK KyAgICB9CisKKyAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBpbnQg cG9zID0gKDEgKyByZWZfaWR4KSAqIGludHJhX3ByZWRfYW5nbGU7CisgICAgICAgIGludCB3dDsK KyAgICAgICAgaWYgKG5lZWRfcGRwYykKKyAgICAgICAgICAgIHd0ID0gKDMyID4+ICgoeSAqIDIp ID4+IG5zY2FsZSkpOworCisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7Cisg ICAgICAgICAgICBjb25zdCBpbnQgaWR4ICA9IChwb3MgPj4gNSkgKyByZWZfaWR4OworICAgICAg ICAgICAgY29uc3QgaW50IGZhY3QgPSBwb3MgJiAzMTsKKyAgICAgICAgICAgIGNvbnN0IHBpeGVs ICpwID0gbGVmdCArIHkgKyBpZHg7CisgICAgICAgICAgICBpbnQgcHJlZDsKKyAgICAgICAgICAg IGlmICghZmFjdCAmJiAoIWlzX2x1bWEgfHwgIWZpbHRlcl9mbGFnKSkgeworICAgICAgICAgICAg ICAgIHByZWQgPSBwWzFdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBp ZiAoIWNfaWR4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZiA9IGZmX3Z2 Y19pbnRyYV9sdW1hX2ZpbHRlcltmaWx0ZXJfZmxhZ11bZmFjdF07CisgICAgICAgICAgICAgICAg ICAgIHByZWQgPSBJTlRSQV9MVU1BX0ZJTFRFUihwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2Ug eworICAgICAgICAgICAgICAgICAgICBwcmVkID0gSU5UUkFfQ0hST01BX0ZJTFRFUihwKTsKKyAg ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmVlZF9wZHBj KSB7CisgICAgICAgICAgICAgICAgaWYgKHkgPCAoMyA8PCBuc2NhbGUpKSB7CisgICAgICAgICAg ICAgICAgICAgIGNvbnN0IHBpeGVsIHQgPSB0b3BbeCArIChpbnZfYW5nbGVfc3VtID4+IDkpXTsK KyAgICAgICAgICAgICAgICAgICAgcHJlZCA9IENMSVAocHJlZCArICgoKHQgLSBwcmVkKSAqIHd0 ICsgMzIpID4+IDYpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAg ICAgICBQT1MoeCwgeSkgPSBwcmVkOworICAgICAgICAgICAgcG9zICs9IGRwOworICAgICAgICB9 CisgICAgICAgIGlmIChuZWVkX3BkcGMpCisgICAgICAgICAgICBpbnZfYW5nbGVfc3VtICs9IGlu dl9hbmdsZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEZVTkMoZmZfdnZjX2ludHJhX2RzcF9p bml0KShWVkNJbnRyYURTUENvbnRleHQgKmNvbnN0IGludHJhKQoreworICAgIGludHJhLT5sbWNz X3NjYWxlX2Nocm9tYSAgPSBGVU5DKGxtY3Nfc2NhbGVfY2hyb21hKTsKKyAgICBpbnRyYS0+aW50 cmFfY2NsbV9wcmVkICAgID0gRlVOQyhpbnRyYV9jY2xtX3ByZWQpOworICAgIGludHJhLT5pbnRy YV9wcmVkICAgICAgICAgPSBGVU5DKGludHJhX3ByZWQpOworICAgIGludHJhLT5wcmVkX3BsYW5h ciAgICAgICAgPSBGVU5DKHByZWRfcGxhbmFyKTsKKyAgICBpbnRyYS0+cHJlZF9taXAgICAgICAg ICAgID0gRlVOQyhwcmVkX21pcCk7CisgICAgaW50cmEtPnByZWRfZGMgICAgICAgICAgICA9IEZV TkMocHJlZF9kYyk7CisgICAgaW50cmEtPnByZWRfdiAgICAgICAgICAgICA9IEZVTkMocHJlZF92 KTsKKyAgICBpbnRyYS0+cHJlZF9oICAgICAgICAgICAgID0gRlVOQyhwcmVkX2gpOworICAgIGlu dHJhLT5wcmVkX2FuZ3VsYXJfdiAgICAgPSBGVU5DKHByZWRfYW5ndWxhcl92KTsKKyAgICBpbnRy YS0+cHJlZF9hbmd1bGFyX2ggICAgID0gRlVOQyhwcmVkX2FuZ3VsYXJfaCk7Cit9Ci0tIAoyLjI1 LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmZmbXBl Zy1kZXZlbCBtYWlsaW5nIGxpc3QKZmZtcGVnLWRldmVsQGZmbXBlZy5vcmcKaHR0cHM6Ly9mZm1w ZWcub3JnL21haWxtYW4vbGlzdGluZm8vZmZtcGVnLWRldmVsCgpUbyB1bnN1YnNjcmliZSwgdmlz aXQgbGluayBhYm92ZSwgb3IgZW1haWwKZmZtcGVnLWRldmVsLXJlcXVlc3RAZmZtcGVnLm9yZyB3 aXRoIHN1YmplY3QgInVuc3Vic2NyaWJlIi4K