From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on2047.outbound.protection.outlook.com [40.107.15.47]) by sourceware.org (Postfix) with ESMTPS id B7201385C6F5 for ; Thu, 17 Aug 2023 10:32:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B7201385C6F5 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=tOs4t+ecr5AcO0S1xWZSv5dKqs84G2nuXPgKeZ3050Y=; b=d57+YzFbJDWCF1RZKIJzijGUijK54enClxstLj44nt5/jkT6oO2zaZhlqw9uDVcBaM9mvRNhHCuOePyocgoZJL/hnAQUSMHmOFDFrLV9TrIfw58E8XVAQpHEAPJ2w6q1gdWI3ZDn4W67aj5dXHtk3E9TvhGGjEZFSc9D4e5GvNs= Received: from AM0PR04CA0045.eurprd04.prod.outlook.com (2603:10a6:208:1::22) by PAVPR08MB9090.eurprd08.prod.outlook.com (2603:10a6:102:327::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6678.26; Thu, 17 Aug 2023 10:32:03 +0000 Received: from AM7EUR03FT023.eop-EUR03.prod.protection.outlook.com (2603:10a6:208:1:cafe::a3) by AM0PR04CA0045.outlook.office365.com (2603:10a6:208:1::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6652.33 via Frontend Transport; Thu, 17 Aug 2023 10:32:03 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM7EUR03FT023.mail.protection.outlook.com (100.127.140.73) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6699.17 via Frontend Transport; Thu, 17 Aug 2023 10:32:02 +0000 Received: ("Tessian outbound c99fbc01d472:v175"); Thu, 17 Aug 2023 10:32:02 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 4458ba6a3679e15d X-CR-MTA-TID: 64aa7808 Received: from 97cec0a0a3ab.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 4FA1CC29-1975-42BC-A7BD-0DB16B38250A.1; Thu, 17 Aug 2023 10:31:50 +0000 Received: from EUR05-VI1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 97cec0a0a3ab.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Thu, 17 Aug 2023 10:31:50 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Ctblo/WEEXDGvNO39VlleR02DJYf8/sHJWVFL/DzEYbZ9tEHkLB49MnkRWphrkdtHRbqjZrgrinru08th6+HqaXvVDwEZFZlADzrrE2FrhDzmWf9BaKV15A9h9XdbYPiFlZU7+zNA28MCMLgXyEaYUyIKaEv5Fi6tjhD92cB4GOCHnJngw42iF07oC+Mv39sgN8rnqZ3zCgl3xV4DoZJ6hXh/NUFZ0IBh/aRSYzsaC/eh057z9JMAKdzxOUvPWC1Vnehiq5ArSBWKDvvq9aQrXc/MeF6mRVXO5tcsK7nW4+5suWXUQ71v1exfC7861SsxQOgrbJnEidWOCRyKa1dmw== 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=tOs4t+ecr5AcO0S1xWZSv5dKqs84G2nuXPgKeZ3050Y=; b=auJnSfRogR7jfXDbbndpH3bE5arx4oQBcYss9+lS8MPN7K7HlZqTompuOgHNDzW4A2G14SGXVzs6Hm6vzwcUaF64j790LCE+ndCpizufsxnOjwEh6t6PV/+EBUkt0ctK4yXStE5EaZwkcCBvcEgmOjOmHIvMJwFIqkEwI+RFTRrHOry1EW5yOHTOTY6zUoi9CFrtHHPFKTrXH1MN4ZJprmyLnDCw6hEOWPJ6wUjz/WS1KqwzYjrP+j3iZIP37RIYAkcY+YVgHxDkKwjL5eKFwKn1JsnFJ0D1RqDBRsjZC5Qa+xMguuseYhGX3AR7zgLW0TiMDtIZlnZBsDT2ot9CzQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=tOs4t+ecr5AcO0S1xWZSv5dKqs84G2nuXPgKeZ3050Y=; b=d57+YzFbJDWCF1RZKIJzijGUijK54enClxstLj44nt5/jkT6oO2zaZhlqw9uDVcBaM9mvRNhHCuOePyocgoZJL/hnAQUSMHmOFDFrLV9TrIfw58E8XVAQpHEAPJ2w6q1gdWI3ZDn4W67aj5dXHtk3E9TvhGGjEZFSc9D4e5GvNs= Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) by AM8PR08MB6498.eurprd08.prod.outlook.com (2603:10a6:20b:364::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6678.31; Thu, 17 Aug 2023 10:31:48 +0000 Received: from DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::9580:520e:6b52:f3d8]) by DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::9580:520e:6b52:f3d8%3]) with mapi id 15.20.6678.029; Thu, 17 Aug 2023 10:31:47 +0000 Content-Type: multipart/mixed; boundary="------------HQEzT1WXJQjLHCXLezCWe6yK" Message-ID: <949f5dd0-cdf0-715a-f04c-3de80c9b974f@arm.com> Date: Thu, 17 Aug 2023 11:31:26 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Content-Language: en-US To: gcc-patches@gcc.gnu.org Cc: Kyrylo Tkachov , Richard Earnshaw From: Stamatis Markianos-Wright Subject: [PATCH 2/2] arm: Add support for MVE Tail-Predicated Low Overhead Loops X-ClientProxiedBy: SA0PR11CA0063.namprd11.prod.outlook.com (2603:10b6:806:d2::8) To DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: DB9PR08MB6507:EE_|AM8PR08MB6498:EE_|AM7EUR03FT023:EE_|PAVPR08MB9090:EE_ X-MS-Office365-Filtering-Correlation-Id: 26409d76-37b8-4984-c82c-08db9f0d322e x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: URqAmBXuZPnsVcn4vgWG1z3Uh0pnWLW8WzwL+F0FRuF+v5MeD2yLbzTCn/8b3SOLtVWAp99EnplE31huJEvte4/t3liBubQ0tVWAXX9radplUfSR1D6cLDq/fi09pGlBgPwGkHeZQqnubwIDAWM/CZinU1BHIPFkenLlAUSsPsK4hjEsJVDBCrfFjDhwXvq3AjiCc6JK8+ICFXEabat966xWrdA42LG6tla6ND/S4ycxC5f7wA17yRccLY8TB/AZzyn6I8lcedumnfkKNqCdWRElinCT7uR1oQ4Th7g/6P4cQbFLF7z1tHntJK99qRvFrTffS9C7DI5cDfn2Eh6htdR9mh0PsS+QLjhf/CI9ROwUvZ2Hz5BfOGkzbuV2Yl7bWgl6lgu2QHhhl6qaXHE06G8fWhOIAE5ZcLbmHf60Z6+v2WHHeu/A/WC6yQetIj+pdiCGAou/Ig/gbhhPXI085Zm8j9Gob2Q6SX1dYhpQPhDW6VTOQHIKhDZFdLEA6RclemObz8Il4JjbbcWkHZo85roZlUzn3+IcACTQBgZDuQEvCzpwztx8SgIXuqwhgoy1Z9rak5eQxBQ9IA90Bg5A51UxGC9BXH+VIEMk+qi1oMp6T+4g81v4qA5JfuAkXZ106KSUPHg1sv2T8/LRFLNWzeAZo2bRNQBIIUW9Wwbyti5GgDIL6mVV/1+GMYbm2I8F X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DB9PR08MB6507.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(396003)(136003)(366004)(39860400002)(346002)(376002)(1800799009)(186009)(451199024)(83380400001)(235185007)(2906002)(66946007)(478600001)(66556008)(66476007)(6666004)(6506007)(33964004)(54906003)(6486002)(6916009)(316002)(5660300002)(2616005)(26005)(6512007)(4326008)(8936002)(8676002)(41300700001)(36756003)(31696002)(86362001)(38100700002)(31686004)(84970400001)(45980500001)(43740500002);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8PR08MB6498 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM7EUR03FT023.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 1fd403ec-85fe-4c43-c27b-08db9f0d2847 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: cPgtAU2YjwUKb1l+l8o8VRtRWAbT60XEMlv9P2/UD84KpPi0P2wCxUE+DTsX84w6Xoim6qDTEhG8jCrChLPPb249pW53mZrIdypLUq8A9+oznoDg6FcjvQggGsUNklQaM6GDY5Y/YAgINRq9K2e3BSc9P+Ar7IzE6fjeoKl2llWZet2o9T7PxEe8IATkYYx+hwGNNkZdSHZdqN/0EfqpWG5wc393PcOwhnAT01VkrnlleQZODuUnBBLKD8araIifgGlDawk8/ViAlqBCfs1qhB9EtyxgQmM34AJ7FvSGGukMbt0k3XQmq3v1Pv9+bvYH9dFBSZJB8nimasHH5Mp6qzBfSfMIF3cyRFGb9FqVDs8mbruBEj+d3Ox3LaFI1P3DjDn2rl6HoMQeZ6L/F+tK2fh+va5Ex+ynaR5BbTGwE4q97DVodAxIXqXY2MpVbu87ZU8ANZ/5gWORi+f8MIq5X7Ok/e7va4FWcf3K6yq7pWZ8js7aV64Pt3xm1PiOSSGvHABSm643LBOgJ8oqUoW+Y+D9SxdMot4RrFvCrs53d8RXnSFLjKyuugcqnn90B5YIvmuEDYwALpvOHfNGQ95Rlxc2HZM13NMjzJFeVPt/S2LG5sYTBKCl60gQp1vUq2PQFJdVeIi+W2BV8olC4lN/ftC+CyA/1fRYvrmQdsTro3bLaFLn9sXtphugywUoKoH0pFJVah/Hyh4H+JKCpnjgXIYU/WFhC9UUHsACYeMPgsAssQLezsNYfNHKD7+bGFAkvi0+0d9R1PzVuGZZmaafZzbGvVNdp6o4IAngidnucVJzj9xsJeXFcDoIT3Wbnhur X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(13230031)(4636009)(39860400002)(396003)(346002)(136003)(376002)(1800799009)(451199024)(186009)(82310400011)(46966006)(40470700004)(36840700001)(316002)(54906003)(82740400003)(356005)(81166007)(70586007)(70206006)(6916009)(31686004)(5660300002)(41300700001)(36860700001)(84970400001)(47076005)(4326008)(8936002)(8676002)(26005)(40460700003)(2906002)(31696002)(235185007)(83380400001)(40480700001)(336012)(478600001)(86362001)(6512007)(6486002)(6506007)(36756003)(6666004)(33964004)(2616005)(43740500002);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Aug 2023 10:32:02.7750 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 26409d76-37b8-4984-c82c-08db9f0d322e X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: AM7EUR03FT023.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAVPR08MB9090 X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE,TXREP,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --------------HQEzT1WXJQjLHCXLezCWe6yK Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi all, This is the 2/2 patch that contains the functional changes needed for MVE Tail Predicated Low Overhead Loops.  See my previous email for a general introduction of MVE LOLs. This support is added through the already existing loop-doloop mechanisms that are used for non-MVE dls/le looping. Mid-end changes are: 1) Relax the loop-doloop mechanism in the mid-end to allow for    decrement numbers other that -1 and for `count` to be an    rtx containing a simple REG (which in this case will contain    the number of elements to be processed), rather    than an expression for calculating the number of iterations. 2) Added a new df utility function: `df_bb_regno_only_def_find` that    will return the DEF of a REG if it is DEF-ed only once within the    basic block. And many things in the backend to implement the above optimisation: 3)  Implement the `arm_predict_doloop_p` target hook to instruct the     mid-end about Low Overhead Loops (MVE or not), as well as     `arm_loop_unroll_adjust` which will prevent unrolling of any loops     that are valid for becoming MVE Tail_Predicated Low Overhead Loops     (unrolling can transform a loop in ways that invalidate the dlstp/     letp tranformation logic and the benefit of the dlstp/letp loop     would be considerably higher than that of unrolling) 4)  Appropriate changes to the define_expand of doloop_end, new     patterns for dlstp and letp, new iterators,  unspecs, etc. 5) `arm_mve_loop_valid_for_dlstp` and a number of checking functions:    * `arm_mve_dlstp_check_dec_counter`    * `arm_mve_dlstp_check_inc_counter`    * `arm_mve_check_reg_origin_is_num_elems`    * `arm_mve_check_df_chain_back_for_implic_predic`    * `arm_mve_check_df_chain_fwd_for_implic_predic_impact`    This all, in smoe way or another, are running checks on the loop    structure in order to determine if the loop is valid for dlstp/letp    transformation. 6) `arm_attempt_dlstp_transform`: (called from the define_expand of     doloop_end) this function re-checks for the loop's suitability for     dlstp/letp transformation and then implements it, if possible. 7) Various utility functions:    *`arm_mve_get_vctp_lanes` to map    from vctp unspecs to number of lanes, and `arm_get_required_vpr_reg`    to check an insn to see if it requires the VPR or not.    * `arm_mve_get_loop_vctp`    * `arm_mve_get_vctp_lanes`    * `arm_emit_mve_unpredicated_insn_to_seq`    * `arm_get_required_vpr_reg`    * `arm_get_required_vpr_reg_param`    * `arm_get_required_vpr_reg_ret_val`    * `arm_mve_is_across_vector_insn`    * `arm_is_mve_load_store_insn`    * `arm_mve_vec_insn_is_predicated_with_this_predicate`    * `arm_mve_vec_insn_is_unpredicated_or_uses_other_predicate` No regressions on arm-none-eabi with various targets and on aarch64-none-elf. Thoughts on getting this into trunk? Thank you, Stam Markianos-Wright gcc/ChangeLog:     * config/arm/arm-protos.h (arm_target_insn_ok_for_lob): Rename to...     (arm_target_bb_ok_for_lob): ...this     (arm_attempt_dlstp_transform): New.     * config/arm/arm.cc (TARGET_LOOP_UNROLL_ADJUST): New.     (TARGET_PREDICT_DOLOOP_P): New.     (arm_block_set_vect):     (arm_target_insn_ok_for_lob): Rename from arm_target_insn_ok_for_lob.     (arm_target_bb_ok_for_lob): New.     (arm_mve_get_vctp_lanes): New.     (arm_get_required_vpr_reg): New.     (arm_get_required_vpr_reg_param): New.     (arm_get_required_vpr_reg_ret_val): New.     (arm_mve_get_loop_vctp): New.     (arm_mve_vec_insn_is_unpredicated_or_uses_other_predicate): New.     (arm_mve_vec_insn_is_predicated_with_this_predicate): New.     (arm_mve_check_df_chain_back_for_implic_predic): New.     (arm_mve_check_df_chain_fwd_for_implic_predic_impact): New.     (arm_mve_check_reg_origin_is_num_elems): New.     (arm_mve_dlstp_check_inc_counter): New.     (arm_mve_dlstp_check_dec_counter): New.     (arm_mve_loop_valid_for_dlstp): New.     (arm_mve_is_across_vector_insn): New.     (arm_is_mve_load_store_insn): New.     (arm_predict_doloop_p): New.     (arm_loop_unroll_adjust): New.     (arm_emit_mve_unpredicated_insn_to_seq): New.     (arm_attempt_dlstp_transform): New.         * config/arm/iterators.md (DLSTP): New.         (mode1): Add DLSTP mappings.         * config/arm/mve.md (*predicated_doloop_end_internal): New.         (dlstp_insn): New.         * config/arm/thumb2.md (doloop_end): Update for MVE LOLs.         * config/arm/unspecs.md: New unspecs.     * df-core.cc (df_bb_regno_only_def_find): New.     * df.h (df_bb_regno_only_def_find): New.         * loop-doloop.cc (doloop_condition_get): Relax conditions.         (doloop_optimize): Add support for elementwise LoLs. gcc/testsuite/ChangeLog:         * gcc.target/arm/lob.h: Update framework.         * gcc.target/arm/lob1.c: Likewise.         * gcc.target/arm/lob6.c: Likewise.     * gcc.target/arm/mve/dlstp-compile-asm.c: New test.     * gcc.target/arm/mve/dlstp-int16x8.c: New test.     * gcc.target/arm/mve/dlstp-int32x4.c: New test.     * gcc.target/arm/mve/dlstp-int64x2.c: New test.     * gcc.target/arm/mve/dlstp-int8x16.c: New test.     * gcc.target/arm/mve/dlstp-invalid-asm.c: New test. --------------HQEzT1WXJQjLHCXLezCWe6yK Content-Type: text/x-patch; charset=UTF-8; name="2.patch" Content-Disposition: attachment; filename="2.patch" Content-Transfer-Encoding: base64 Y29tbWl0IDg1NjRkZWUwOWMxMjU4YzM4ODA5NGFiZDYxNGYzMTFlNjA3MjMzNjgKQXV0aG9yOiBT dGFtIE1hcmtpYW5vcy1XcmlnaHQgPHN0YW0ubWFya2lhbm9zLXdyaWdodEBhcm0uY29tPgpEYXRl OiAgIFR1ZSBPY3QgMTggMTc6NDI6NTYgMjAyMiArMDEwMAoKICAgIGFybTogQWRkIHN1cHBvcnQg Zm9yIE1WRSBUYWlsLVByZWRpY2F0ZWQgTG93IE92ZXJoZWFkIExvb3BzCiAgICAKICAgIFRoaXMg aXMgdGhlIDIvMiBwYXRjaCB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbmFsIGNoYW5nZXMgbmVl ZGVkCiAgICBmb3IgTVZFIFRhaWwgUHJlZGljYXRlZCBMb3cgT3ZlcmhlYWQgTG9vcHMuICBTZWUg bXkgcHJldmlvdXMgZW1haWwKICAgIGZvciBhIGdlbmVyYWwgaW50cm9kdWN0aW9uIG9mIE1WRSBM T0xzLgogICAgCiAgICBUaGlzIHN1cHBvcnQgaXMgYWRkZWQgdGhyb3VnaCB0aGUgYWxyZWFkeSBl eGlzdGluZyBsb29wLWRvbG9vcAogICAgbWVjaGFuaXNtcyB0aGF0IGFyZSB1c2VkIGZvciBub24t TVZFIGRscy9sZSBsb29waW5nLgogICAgCiAgICBNaWQtZW5kIGNoYW5nZXMgYXJlOgogICAgCiAg ICAxKSBSZWxheCB0aGUgbG9vcC1kb2xvb3AgbWVjaGFuaXNtIGluIHRoZSBtaWQtZW5kIHRvIGFs bG93IGZvcgogICAgICAgZGVjcmVtZW50IG51bWJlcnMgb3RoZXIgdGhhdCAtMSBhbmQgZm9yIGBj b3VudGAgdG8gYmUgYW4KICAgICAgIHJ0eCBjb250YWluaW5nIGEgc2ltcGxlIFJFRyAod2hpY2gg aW4gdGhpcyBjYXNlIHdpbGwgY29udGFpbgogICAgICAgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0 byBiZSBwcm9jZXNzZWQpLCByYXRoZXIKICAgICAgIHRoYW4gYW4gZXhwcmVzc2lvbiBmb3IgY2Fs Y3VsYXRpbmcgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zLgogICAgMikgQWRkZWQgYSBuZXcgZGYg dXRpbGl0eSBmdW5jdGlvbjogYGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmRgIHRoYXQKICAgICAg IHdpbGwgcmV0dXJuIHRoZSBERUYgb2YgYSBSRUcgaWYgaXQgaXMgREVGLWVkIG9ubHkgb25jZSB3 aXRoaW4gdGhlCiAgICAgICBiYXNpYyBibG9jay4KICAgIAogICAgQW5kIG1hbnkgdGhpbmdzIGlu IHRoZSBiYWNrZW5kIHRvIGltcGxlbWVudCB0aGUgYWJvdmUgb3B0aW1pc2F0aW9uOgogICAgCiAg ICAzKSAgSW1wbGVtZW50IHRoZSBgYXJtX3ByZWRpY3RfZG9sb29wX3BgIHRhcmdldCBob29rIHRv IGluc3RydWN0IHRoZQogICAgICAgIG1pZC1lbmQgYWJvdXQgTG93IE92ZXJoZWFkIExvb3BzIChN VkUgb3Igbm90KSwgYXMgd2VsbCBhcwogICAgICAgIGBhcm1fbG9vcF91bnJvbGxfYWRqdXN0YCB3 aGljaCB3aWxsIHByZXZlbnQgdW5yb2xsaW5nIG9mIGFueSBsb29wcwogICAgICAgIHRoYXQgYXJl IHZhbGlkIGZvciBiZWNvbWluZyBNVkUgVGFpbF9QcmVkaWNhdGVkIExvdyBPdmVyaGVhZCBMb29w cwogICAgICAgICh1bnJvbGxpbmcgY2FuIHRyYW5zZm9ybSBhIGxvb3AgaW4gd2F5cyB0aGF0IGlu dmFsaWRhdGUgdGhlIGRsc3RwLwogICAgICAgIGxldHAgdHJhbmZvcm1hdGlvbiBsb2dpYyBhbmQg dGhlIGJlbmVmaXQgb2YgdGhlIGRsc3RwL2xldHAgbG9vcAogICAgICAgIHdvdWxkIGJlIGNvbnNp ZGVyYWJseSBoaWdoZXIgdGhhbiB0aGF0IG9mIHVucm9sbGluZykKICAgIDQpICBBcHByb3ByaWF0 ZSBjaGFuZ2VzIHRvIHRoZSBkZWZpbmVfZXhwYW5kIG9mIGRvbG9vcF9lbmQsIG5ldwogICAgICAg IHBhdHRlcm5zIGZvciBkbHN0cCBhbmQgbGV0cCwgbmV3IGl0ZXJhdG9ycywgIHVuc3BlY3MsIGV0 Yy4KICAgIDUpIGBhcm1fbXZlX2xvb3BfdmFsaWRfZm9yX2Rsc3RwYCBhbmQgYSBudW1iZXIgb2Yg Y2hlY2tpbmcgZnVuY3Rpb25zOgogICAgICAgKiBgYXJtX212ZV9kbHN0cF9jaGVja19kZWNfY291 bnRlcmAKICAgICAgICogYGFybV9tdmVfZGxzdHBfY2hlY2tfaW5jX2NvdW50ZXJgCiAgICAgICAq IGBhcm1fbXZlX2NoZWNrX3JlZ19vcmlnaW5faXNfbnVtX2VsZW1zYAogICAgICAgKiBgYXJtX212 ZV9jaGVja19kZl9jaGFpbl9iYWNrX2Zvcl9pbXBsaWNfcHJlZGljYAogICAgICAgKiBgYXJtX212 ZV9jaGVja19kZl9jaGFpbl9md2RfZm9yX2ltcGxpY19wcmVkaWNfaW1wYWN0YAogICAgICAgVGhp cyBhbGwsIGluIHNtb2Ugd2F5IG9yIGFub3RoZXIsIGFyZSBydW5uaW5nIGNoZWNrcyBvbiB0aGUg bG9vcAogICAgICAgc3RydWN0dXJlIGluIG9yZGVyIHRvIGRldGVybWluZSBpZiB0aGUgbG9vcCBp cyB2YWxpZCBmb3IgZGxzdHAvbGV0cAogICAgICAgdHJhbnNmb3JtYXRpb24uCiAgICA2KSBgYXJt X2F0dGVtcHRfZGxzdHBfdHJhbnNmb3JtYDogKGNhbGxlZCBmcm9tIHRoZSBkZWZpbmVfZXhwYW5k IG9mCiAgICAgICAgZG9sb29wX2VuZCkgdGhpcyBmdW5jdGlvbiByZS1jaGVja3MgZm9yIHRoZSBs b29wJ3Mgc3VpdGFiaWxpdHkgZm9yCiAgICAgICAgZGxzdHAvbGV0cCB0cmFuc2Zvcm1hdGlvbiBh bmQgdGhlbiBpbXBsZW1lbnRzIGl0LCBpZiBwb3NzaWJsZS4KICAgIDcpIFZhcmlvdXMgdXRpbGl0 eSBmdW5jdGlvbnM6CiAgICAgICAqYGFybV9tdmVfZ2V0X3ZjdHBfbGFuZXNgIHRvIG1hcAogICAg ICAgZnJvbSB2Y3RwIHVuc3BlY3MgdG8gbnVtYmVyIG9mIGxhbmVzLCBhbmQgYGFybV9nZXRfcmVx dWlyZWRfdnByX3JlZ2AKICAgICAgIHRvIGNoZWNrIGFuIGluc24gdG8gc2VlIGlmIGl0IHJlcXVp cmVzIHRoZSBWUFIgb3Igbm90LgogICAgICAgKiBgYXJtX212ZV9nZXRfbG9vcF92Y3RwYAogICAg ICAgKiBgYXJtX212ZV9nZXRfdmN0cF9sYW5lc2AKICAgICAgICogYGFybV9lbWl0X212ZV91bnBy ZWRpY2F0ZWRfaW5zbl90b19zZXFgCiAgICAgICAqIGBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdg CiAgICAgICAqIGBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdfcGFyYW1gCiAgICAgICAqIGBhcm1f Z2V0X3JlcXVpcmVkX3Zwcl9yZWdfcmV0X3ZhbGAKICAgICAgICogYGFybV9tdmVfaXNfYWNyb3Nz X3ZlY3Rvcl9pbnNuYAogICAgICAgKiBgYXJtX2lzX212ZV9sb2FkX3N0b3JlX2luc25gCiAgICAg ICAqIGBhcm1fbXZlX3ZlY19pbnNuX2lzX3ByZWRpY2F0ZWRfd2l0aF90aGlzX3ByZWRpY2F0ZWAK ICAgICAgICogYGFybV9tdmVfdmVjX2luc25faXNfdW5wcmVkaWNhdGVkX29yX3VzZXNfb3RoZXJf cHJlZGljYXRlYAogICAgCiAgICBObyByZWdyZXNzaW9ucyBvbiBhcm0tbm9uZS1lYWJpIHdpdGgg dmFyaW91cyB0YXJnZXRzIGFuZCBvbgogICAgYWFyY2g2NC1ub25lLWVsZi4gVGhvdWdodHMgb24g Z2V0dGluZyB0aGlzIGludG8gdHJ1bms/CiAgICAKICAgIFRoYW5rIHlvdSwKICAgIFN0YW0gTWFy a2lhbm9zLVdyaWdodAogICAgCiAgICBnY2MvQ2hhbmdlTG9nOgogICAgCiAgICAgICAgICAgICog Y29uZmlnL2FybS9hcm0tcHJvdG9zLmggKGFybV90YXJnZXRfaW5zbl9va19mb3JfbG9iKTogUmVu YW1lIHRvLi4uCiAgICAgICAgICAgIChhcm1fdGFyZ2V0X2JiX29rX2Zvcl9sb2IpOiAuLi50aGlz CiAgICAgICAgICAgIChhcm1fYXR0ZW1wdF9kbHN0cF90cmFuc2Zvcm0pOiBOZXcuCiAgICAgICAg ICAgICogY29uZmlnL2FybS9hcm0uY2MgKFRBUkdFVF9MT09QX1VOUk9MTF9BREpVU1QpOiBOZXcu CiAgICAgICAgICAgIChUQVJHRVRfUFJFRElDVF9ET0xPT1BfUCk6IE5ldy4KICAgICAgICAgICAg KGFybV9ibG9ja19zZXRfdmVjdCk6CiAgICAgICAgICAgIChhcm1fdGFyZ2V0X2luc25fb2tfZm9y X2xvYik6IFJlbmFtZSBmcm9tIGFybV90YXJnZXRfaW5zbl9va19mb3JfbG9iLgogICAgICAgICAg ICAoYXJtX3RhcmdldF9iYl9va19mb3JfbG9iKTogTmV3LgogICAgICAgICAgICAoYXJtX212ZV9n ZXRfdmN0cF9sYW5lcyk6IE5ldy4KICAgICAgICAgICAgKGFybV9nZXRfcmVxdWlyZWRfdnByX3Jl Zyk6IE5ldy4KICAgICAgICAgICAgKGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZ19wYXJhbSk6IE5l dy4KICAgICAgICAgICAgKGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZ19yZXRfdmFsKTogTmV3Lgog ICAgICAgICAgICAoYXJtX212ZV9nZXRfbG9vcF92Y3RwKTogTmV3LgogICAgICAgICAgICAoYXJt X212ZV92ZWNfaW5zbl9pc191bnByZWRpY2F0ZWRfb3JfdXNlc19vdGhlcl9wcmVkaWNhdGUpOiBO ZXcuCiAgICAgICAgICAgIChhcm1fbXZlX3ZlY19pbnNuX2lzX3ByZWRpY2F0ZWRfd2l0aF90aGlz X3ByZWRpY2F0ZSk6IE5ldy4KICAgICAgICAgICAgKGFybV9tdmVfY2hlY2tfZGZfY2hhaW5fYmFj a19mb3JfaW1wbGljX3ByZWRpYyk6IE5ldy4KICAgICAgICAgICAgKGFybV9tdmVfY2hlY2tfZGZf Y2hhaW5fZndkX2Zvcl9pbXBsaWNfcHJlZGljX2ltcGFjdCk6IE5ldy4KICAgICAgICAgICAgKGFy bV9tdmVfY2hlY2tfcmVnX29yaWdpbl9pc19udW1fZWxlbXMpOiBOZXcuCiAgICAgICAgICAgIChh cm1fbXZlX2Rsc3RwX2NoZWNrX2luY19jb3VudGVyKTogTmV3LgogICAgICAgICAgICAoYXJtX212 ZV9kbHN0cF9jaGVja19kZWNfY291bnRlcik6IE5ldy4KICAgICAgICAgICAgKGFybV9tdmVfbG9v cF92YWxpZF9mb3JfZGxzdHApOiBOZXcuCiAgICAgICAgICAgIChhcm1fbXZlX2lzX2Fjcm9zc192 ZWN0b3JfaW5zbik6IE5ldy4KICAgICAgICAgICAgKGFybV9pc19tdmVfbG9hZF9zdG9yZV9pbnNu KTogTmV3LgogICAgICAgICAgICAoYXJtX3ByZWRpY3RfZG9sb29wX3ApOiBOZXcuCiAgICAgICAg ICAgIChhcm1fbG9vcF91bnJvbGxfYWRqdXN0KTogTmV3LgogICAgICAgICAgICAoYXJtX2VtaXRf bXZlX3VucHJlZGljYXRlZF9pbnNuX3RvX3NlcSk6IE5ldy4KICAgICAgICAgICAgKGFybV9hdHRl bXB0X2Rsc3RwX3RyYW5zZm9ybSk6IE5ldy4KICAgICAgICAgICAgKiBjb25maWcvYXJtL2l0ZXJh dG9ycy5tZCAoRExTVFApOiBOZXcuCiAgICAgICAgICAgIChtb2RlMSk6IEFkZCBETFNUUCBtYXBw aW5ncy4KICAgICAgICAgICAgKiBjb25maWcvYXJtL212ZS5tZCAoKnByZWRpY2F0ZWRfZG9sb29w X2VuZF9pbnRlcm5hbCk6IE5ldy4KICAgICAgICAgICAgKGRsc3RwPG1vZGUxPl9pbnNuKTogTmV3 LgogICAgICAgICAgICAqIGNvbmZpZy9hcm0vdGh1bWIyLm1kIChkb2xvb3BfZW5kKTogVXBkYXRl IGZvciBNVkUgTE9Mcy4KICAgICAgICAgICAgKiBjb25maWcvYXJtL3Vuc3BlY3MubWQ6IE5ldyB1 bnNwZWNzLgogICAgICAgICAgICAqIGRmLWNvcmUuY2MgKGRmX2JiX3JlZ25vX29ubHlfZGVmX2Zp bmQpOiBOZXcuCiAgICAgICAgICAgICogZGYuaCAoZGZfYmJfcmVnbm9fb25seV9kZWZfZmluZCk6 IE5ldy4KICAgICAgICAgICAgKiBsb29wLWRvbG9vcC5jYyAoZG9sb29wX2NvbmRpdGlvbl9nZXQp OiBSZWxheCBjb25kaXRpb25zLgogICAgICAgICAgICAoZG9sb29wX29wdGltaXplKTogQWRkIHN1 cHBvcnQgZm9yIGVsZW1lbnR3aXNlIExvTHMuCiAgICAKICAgIGdjYy90ZXN0c3VpdGUvQ2hhbmdl TG9nOgogICAgCiAgICAgICAgICAgICogZ2NjLnRhcmdldC9hcm0vbG9iLmg6IFVwZGF0ZSBmcmFt ZXdvcmsuCiAgICAgICAgICAgICogZ2NjLnRhcmdldC9hcm0vbG9iMS5jOiBMaWtld2lzZS4KICAg ICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9sb2I2LmM6IExpa2V3aXNlLgogICAgICAgICAgICAq IGdjYy50YXJnZXQvYXJtL212ZS9kbHN0cC1jb21waWxlLWFzbS5jOiBOZXcgdGVzdC4KICAgICAg ICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50MTZ4OC5jOiBOZXcgdGVzdC4KICAg ICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50MzJ4NC5jOiBOZXcgdGVzdC4K ICAgICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50NjR4Mi5jOiBOZXcgdGVz dC4KICAgICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50OHgxNi5jOiBOZXcg dGVzdC4KICAgICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW52YWxpZC1hc20u YzogTmV3IHRlc3QuCgpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9hcm0vYXJtLXByb3Rvcy5oIGIv Z2NjL2NvbmZpZy9hcm0vYXJtLXByb3Rvcy5oCmluZGV4IDc3ZTc2MzM2ZTk0Li43NDE4NjkzMGYw YiAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hcm0vYXJtLXByb3Rvcy5oCisrKyBiL2djYy9jb25m aWcvYXJtL2FybS1wcm90b3MuaApAQCAtNjUsOCArNjUsOCBAQCBleHRlcm4gdm9pZCBhcm1fZW1p dF9zcGVjdWxhdGlvbl9iYXJyaWVyX2Z1bmN0aW9uICh2b2lkKTsKIGV4dGVybiB2b2lkIGFybV9k ZWNvbXBvc2VfZGlfYmlub3AgKHJ0eCwgcnR4LCBydHggKiwgcnR4ICosIHJ0eCAqLCBydHggKik7 CiBleHRlcm4gYm9vbCBhcm1fcV9iaXRfYWNjZXNzICh2b2lkKTsKIGV4dGVybiBib29sIGFybV9n ZV9iaXRzX2FjY2VzcyAodm9pZCk7Ci1leHRlcm4gYm9vbCBhcm1fdGFyZ2V0X2luc25fb2tfZm9y X2xvYiAocnR4KTsKLQorZXh0ZXJuIGJvb2wgYXJtX3RhcmdldF9iYl9va19mb3JfbG9iIChiYXNp Y19ibG9jayk7CitleHRlcm4gcnR4IGFybV9hdHRlbXB0X2Rsc3RwX3RyYW5zZm9ybSAocnR4KTsK ICNpZmRlZiBSVFhfQ09ERQogZW51bSByZWdfY2xhc3MKIGFybV9tb2RlX2Jhc2VfcmVnX2NsYXNz IChtYWNoaW5lX21vZGUpOwpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9hcm0vYXJtLmNjIGIvZ2Nj L2NvbmZpZy9hcm0vYXJtLmNjCmluZGV4IDZlOTMzYzgwMTgzLi4zOWQ5N2JhNWU0ZCAxMDA2NDQK LS0tIGEvZ2NjL2NvbmZpZy9hcm0vYXJtLmNjCisrKyBiL2djYy9jb25maWcvYXJtL2FybS5jYwpA QCAtNjU5LDYgKzY1OSwxMiBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9zcGVjIGFy bV9hdHRyaWJ1dGVfdGFibGVbXSA9CiAjdW5kZWYgVEFSR0VUX0hBVkVfQ09ORElUSU9OQUxfRVhF Q1VUSU9OCiAjZGVmaW5lIFRBUkdFVF9IQVZFX0NPTkRJVElPTkFMX0VYRUNVVElPTiBhcm1faGF2 ZV9jb25kaXRpb25hbF9leGVjdXRpb24KIAorI3VuZGVmIFRBUkdFVF9MT09QX1VOUk9MTF9BREpV U1QKKyNkZWZpbmUgVEFSR0VUX0xPT1BfVU5ST0xMX0FESlVTVCBhcm1fbG9vcF91bnJvbGxfYWRq dXN0CisKKyN1bmRlZiBUQVJHRVRfUFJFRElDVF9ET0xPT1BfUAorI2RlZmluZSBUQVJHRVRfUFJF RElDVF9ET0xPT1BfUCBhcm1fcHJlZGljdF9kb2xvb3BfcAorCiAjdW5kZWYgVEFSR0VUX0xFR0lU SU1BVEVfQ09OU1RBTlRfUAogI2RlZmluZSBUQVJHRVRfTEVHSVRJTUFURV9DT05TVEFOVF9QIGFy bV9sZWdpdGltYXRlX2NvbnN0YW50X3AKIApAQCAtMzQ0MTYsMTkgKzM0NDIyLDEwOTYgQEAgYXJt X2ludmFsaWRfd2l0aGluX2RvbG9vcCAoY29uc3QgcnR4X2luc24gKmluc24pCiB9CiAKIGJvb2wK LWFybV90YXJnZXRfaW5zbl9va19mb3JfbG9iIChydHggaW5zbikKK2FybV90YXJnZXRfYmJfb2tf Zm9yX2xvYiAoYmFzaWNfYmxvY2sgYmIpCiB7Ci0gIGJhc2ljX2Jsb2NrIGJiID0gQkxPQ0tfRk9S X0lOU04gKGluc24pOwogICAvKiBNYWtlIHN1cmUgdGhlIGJhc2ljIGJsb2NrIG9mIHRoZSB0YXJn ZXQgaW5zbiBpcyBhIHNpbXBsZSBsYXRjaAogICAgICBoYXZpbmcgYXMgc2luZ2xlIHByZWRlY2Vz c29yIGFuZCBzdWNjZXNzb3IgdGhlIGJvZHkgb2YgdGhlIGxvb3AKICAgICAgaXRzZWxmLiAgT25s eSBzaW1wbGUgbG9vcHMgd2l0aCBhIHNpbmdsZSBiYXNpYyBibG9jayBhcyBib2R5IGFyZQogICAg ICBzdXBwb3J0ZWQgZm9yICdsb3cgb3ZlciBoZWFkIGxvb3AnIG1ha2luZyBzdXJlIHRoYXQgTEUg dGFyZ2V0IGlzCiAgICAgIGFib3ZlIExFIGl0c2VsZiBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuICAq LwotCiAgIHJldHVybiBzaW5nbGVfc3VjY19wIChiYikKLSAgICAmJiBzaW5nbGVfcHJlZF9wIChi YikKLSAgICAmJiBzaW5nbGVfc3VjY19lZGdlIChiYiktPmRlc3QgPT0gc2luZ2xlX3ByZWRfZWRn ZSAoYmIpLT5zcmMKLSAgICAmJiBjb250YWluc19ub19hY3RpdmVfaW5zbl9wIChiYik7CisJICYm IHNpbmdsZV9wcmVkX3AgKGJiKQorCSAmJiBzaW5nbGVfc3VjY19lZGdlIChiYiktPmRlc3QgPT0g c2luZ2xlX3ByZWRfZWRnZSAoYmIpLT5zcmM7Cit9CisKKy8qIFV0aWxpdHkgZnVjdGlvbjogR2l2 ZW4gYSBWQ1RQIG9yIGEgVkNUUF9NIGluc24sIHJldHVybiB0aGUgbnVtYmVyIG9mIE1WRQorICAg bGFuZXMgYmFzZWQgb24gdGhlIG1hY2hpbmUgbW9kZSBiZWluZyB1c2VkLiAgKi8KKworc3RhdGlj IGludAorYXJtX212ZV9nZXRfdmN0cF9sYW5lcyAocnR4IHgpCit7CisgIGlmIChHRVRfQ09ERSAo eCkgPT0gU0VUICYmIEdFVF9DT0RFIChYRVhQICh4LCAxKSkgPT0gVU5TUEVDCisgICAgICAmJiAo WElOVCAoWEVYUCAoeCwgMSksIDEpID09IFZDVFAgfHwgWElOVCAoWEVYUCAoeCwgMSksIDEpID09 IFZDVFBfTSkpCisgICAgeworICAgICAgbWFjaGluZV9tb2RlIG1vZGUgPSBHRVRfTU9ERSAoWEVY UCAoeCwgMSkpOworICAgICAgcmV0dXJuIChWRUNUT1JfTU9ERV9QIChtb2RlKSAmJiBWQUxJRF9N VkVfUFJFRF9NT0RFIChtb2RlKSkKKwkgICAgID8gR0VUX01PREVfTlVOSVRTIChtb2RlKSA6IDA7 CisgICAgfQorICByZXR1cm4gMDsKK30KKworLyogQ2hlY2sgaWYgSU5TTiByZXF1aXJlcyB0aGUg dXNlIG9mIHRoZSBWUFIgcmVnLCBpZiBpdCBkb2VzLCByZXR1cm4gdGhlCisgICBzdWItcnR4IG9m IHRoZSBWUFIgcmVnLiAgVGhlIFRZUEUgYXJndW1lbnQgY29udHJvbHMgd2hldGhlcgorICAgdGhp cyBmdW5jdGlvbiBzaG91bGQ6CisgICAqIEZvciBUWVBFID09IDAsIGNoZWNrIGFsbCBvcGVyYW5k cywgaW5jbHVkaW5nIHRoZSBPVVQgb3BlcmFuZHMsCisgICAgIGFuZCByZXR1cm4gdGhlIGZpcnN0 IG9jY3VycmVuY2Ugb2YgdGhlIFZQUiByZWcuCisgICAqIEZvciBUWVBFID09IDEsIG9ubHkgY2hl Y2sgdGhlIGlucHV0IG9wZXJhbmRzLgorICAgKiBGb3IgVFlQRSA9PSAyLCBvbmx5IGNoZWNrIHRo ZSBvdXRwdXQgb3BlcmFuZHMuCisgICAoSU5PVVQgb3BlcmFuZHMgYXJlIGNvbnNpZGVyZWQgYm90 aCBhcyBpbnB1dCBhbmQgb3V0cHV0IG9wZXJhbmRzKQorKi8KK3N0YXRpYyBydHgKK2FybV9nZXRf cmVxdWlyZWRfdnByX3JlZyAocnR4X2luc24gKmluc24sIHVuc2lnbmVkIGludCB0eXBlID0gMCkK K3sKKyAgZ2NjX2Fzc2VydCAodHlwZSA8IDMpOworICBpZiAoIU5PTkpVTVBfSU5TTl9QIChpbnNu KSkKKyAgICByZXR1cm4gTlVMTF9SVFg7CisKKyAgYm9vbCByZXF1aXJlc192cHI7CisgIGV4dHJh Y3RfY29uc3RyYWluX2luc24gKGluc24pOworICBpbnQgbl9vcGVyYW5kcyA9IHJlY29nX2RhdGEu bl9vcGVyYW5kczsKKyAgaWYgKHJlY29nX2RhdGEubl9hbHRlcm5hdGl2ZXMgPT0gMCkKKyAgICBy ZXR1cm4gTlVMTF9SVFg7CisKKyAgLyogRmlsbCBpbiByZWNvZ19vcF9hbHQgd2l0aCBpbmZvcm1h dGlvbiBhYm91dCB0aGUgY29uc3RyYWludHMgb2YKKyAgICAgdGhpcyBpbnNuLiAgKi8KKyAgcHJl cHJvY2Vzc19jb25zdHJhaW50cyAoaW5zbik7CisKKyAgZm9yIChpbnQgb3AgPSAwOyBvcCA8IG5f b3BlcmFuZHM7IG9wKyspCisgICAgeworICAgICAgcmVxdWlyZXNfdnByID0gdHJ1ZTsKKyAgICAg IGlmICh0eXBlID09IDEgJiYgcmVjb2dfZGF0YS5vcGVyYW5kX3R5cGVbb3BdID09IE9QX09VVCkK Kwljb250aW51ZTsKKyAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMiAmJiByZWNvZ19kYXRhLm9wZXJh bmRfdHlwZVtvcF0gPT0gT1BfSU4pCisJY29udGludWU7CisKKyAgICAgIC8qIEl0ZXJhdGUgdGhy b3VnaCBhbHRlcm5hdGl2ZXMgb2Ygb3BlcmFuZCAib3AiIGluIHJlY29nX29wX2FsdCBhbmQKKwkg aWRlbnRpZnkgaWYgdGhlIG9wZXJhbmQgaXMgcmVxdWlyZWQgdG8gYmUgdGhlIFZQUi4gICovCisg ICAgICBmb3IgKGludCBhbHQgPSAwOyBhbHQgPCByZWNvZ19kYXRhLm5fYWx0ZXJuYXRpdmVzOyBh bHQrKykKKwl7CisJICBjb25zdCBvcGVyYW5kX2FsdGVybmF0aXZlICpvcF9hbHQKKwkgICAgICA9 ICZyZWNvZ19vcF9hbHRbYWx0ICogbl9vcGVyYW5kc107CisJICAvKiBGZXRjaCB0aGUgcmVnX2Ns YXNzIGZvciBlYWNoIGVudHJ5IGFuZCBjaGVjayBpdCBhZ2FpbnN0IHRoZQorCSAgICAgVlBSX1JF RyByZWdfY2xhc3MuICAqLworCSAgaWYgKGFsdGVybmF0aXZlX2NsYXNzIChvcF9hbHQsIG9wKSAh PSBWUFJfUkVHKQorCSAgICByZXF1aXJlc192cHIgPSBmYWxzZTsKKwl9CisgICAgICAvKiBJZiBh bGwgYWx0ZXJuYXRpdmVzIG9mIHRoZSBpbnNuIHJlcXVpcmUgdGhlIFZQUiByZWcgZm9yIHRoaXMg b3BlcmFuZCwKKwkgaXQgbWVhbnMgdGhhdCBlaXRoZXIgdGhpcyBpcyBWUFItZ2VuZXJhdGluZyBp bnN0cnVjdGlvbiwgbGlrZSBhIHZjdHAsCisJIHZjbXAsIGV0Yy4sIG9yIGl0IGlzIGEgVlBULXBy ZWRpY2F0ZWQgaW5zcnVjdGlvbi4gIFJldHVybiB0aGUgc3VicnR4CisJIG9mIHRoZSBWUFIgcmVn IG9wZXJhbmQuICAqLworICAgICAgaWYgKHJlcXVpcmVzX3ZwcikKKwlyZXR1cm4gcmVjb2dfZGF0 YS5vcGVyYW5kW29wXTsKKyAgICB9CisgIHJldHVybiBOVUxMX1JUWDsKK30KKworLyogV3JhcHBl ciBmdW5jdGlvbiBvZiBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWcgd2l0aCBUWVBFID09IDEsIHNv IHJldHVybgorICAgc29tZXRoaW5nIG9ubHkgaWYgdGhlIFZQUiByZWcgaXMgYW4gaW5wdXQgb3Bl cmFuZCB0byB0aGUgaW5zbi4gICovCisKK3N0YXRpYyBydHgKK0FMV0FZU19JTkxJTkUKK2FybV9n ZXRfcmVxdWlyZWRfdnByX3JlZ19wYXJhbSAocnR4X2luc24gKmluc24pCit7CisgIHJldHVybiBh cm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWcgKGluc24sIDEpOworfQorCisvKiBXcmFwcGVyIGZ1bmN0 aW9uIG9mIGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZyB3aXRoIFRZUEUgPT0gMiwgc28gcmV0dXJu CisgICBzb21ldGhpbmcgb25seSBpZiB0aGUgVlBSIHJlZyBpcyB0aGUgcmV0dXJuIHZhbHVlLCBh biBvdXRwdXQgb2YsIG9yIGlzCisgICBjbG9iYmVyZWQgYnkgdGhlIGluc24uICAqLworCitzdGF0 aWMgcnR4CitBTFdBWVNfSU5MSU5FCithcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdfcmV0X3ZhbCAo cnR4X2luc24gKmluc24pCit7CisgIHJldHVybiBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWcgKGlu c24sIDIpOworfQorCisvKiBTY2FuIHRoZSBiYXNpYyBibG9jayBvZiBhIGxvb3AgYm9keSBmb3Ig YSB2Y3RwIGluc3RydWN0aW9uLiAgSWYgdGhlcmUgaXMKKyAgIGF0IGxlYXN0IHZjdHAgaW5zdHJ1 Y3Rpb24sIHJldHVybiB0aGUgZmlyc3QgcnR4X2luc24gKi4gICovCisKK3N0YXRpYyBydHhfaW5z biAqCithcm1fbXZlX2dldF9sb29wX3ZjdHAgKGJhc2ljX2Jsb2NrIGJiKQoreworICBydHhfaW5z biAqaW5zbiA9IEJCX0hFQUQgKGJiKTsKKworICAvKiBOb3cgc2NhbiB0aHJvdWdoIGFsbCB0aGUg aW5zdHJ1Y3Rpb24gcGF0dGVybnMgYW5kIHBpY2sgb3V0IHRoZSBWQ1RQCisgICAgIGluc3RydWN0 aW9uLiAgV2UgcmVxdWlyZSBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdfcGFyYW0gdG8gYmUgZmFs c2UKKyAgICAgdG8gbWFrZSBzdXJlIHdlIHBpY2sgdXAgYSBWQ1RQLCByYXRoZXIgdGhhbiBhIFZD VFBfTS4gICovCisgIEZPUl9CQl9JTlNOUyAoYmIsIGluc24pCisgICAgaWYgKE5PTkRFQlVHX0lO U05fUCAoaW5zbikpCisgICAgICBpZiAoYXJtX2dldF9yZXF1aXJlZF92cHJfcmVnX3JldF92YWwg KGluc24pCisJICAmJiAoYXJtX212ZV9nZXRfdmN0cF9sYW5lcyAoUEFUVEVSTiAoaW5zbikpICE9 IDApCisJICAmJiAhYXJtX2dldF9yZXF1aXJlZF92cHJfcmVnX3BhcmFtIChpbnNuKSkKKwlyZXR1 cm4gaW5zbjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIElOU04gaXMg YSBNVkUgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBWUFQtcHJlZGljYWJsZSwgYnV0IGluCisgICBpdHMg dW5wcmVkaWNhdGVkIGZvcm0sIG9yIGlmIGl0IGlzIHByZWRpY2F0ZWQsIGJ1dCBvbiBhIHByZWRp Y2F0ZSBvdGhlcgorICAgdGhhbiBWUFJfUkVHLiAgKi8KKworc3RhdGljIGJvb2wKK2FybV9tdmVf dmVjX2luc25faXNfdW5wcmVkaWNhdGVkX29yX3VzZXNfb3RoZXJfcHJlZGljYXRlIChydHhfaW5z biAqaW5zbiwKKwkJCQkJCQkgIHJ0eCB2cHJfcmVnKQoreworICBydHggaW5zbl92cHJfcmVnX29w ZXJhbmQ7CisgIGlmIChNVkVfVlBUX1VOUFJFRElDQVRFRF9JTlNOX1AgKGluc24pCisgICAgICB8 fCAoTVZFX1ZQVF9QUkVESUNBVEVEX0lOU05fUCAoaW5zbikKKwkgICYmIChpbnNuX3Zwcl9yZWdf b3BlcmFuZCA9IGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZ19wYXJhbSAoaW5zbikpCisJICAmJiAh cnR4X2VxdWFsX3AgKHZwcl9yZWcsIGluc25fdnByX3JlZ19vcGVyYW5kKSkpCisgICAgcmV0dXJu IHRydWU7CisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIFJldHVybiB0cnVlIGlm IElOU04gaXMgYSBNVkUgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBWUFQtcHJlZGljYWJsZSBhbmQgaXMK KyAgIHByZWRpY2F0ZWQgb24gVlBSX1JFRy4gICovCisKK3N0YXRpYyBib29sCithcm1fbXZlX3Zl Y19pbnNuX2lzX3ByZWRpY2F0ZWRfd2l0aF90aGlzX3ByZWRpY2F0ZSAocnR4X2luc24gKmluc24s CisJCQkJCQkgICAgcnR4IHZwcl9yZWcpCit7CisgIHJ0eCBpbnNuX3Zwcl9yZWdfb3BlcmFuZDsK KyAgaWYgKE1WRV9WUFRfUFJFRElDQVRFRF9JTlNOX1AgKGluc24pCisgICAgICAmJiAoaW5zbl92 cHJfcmVnX29wZXJhbmQgPSBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdfcGFyYW0gKGluc24pKQor ICAgICAgJiYgcnR4X2VxdWFsX3AgKHZwcl9yZWcsIGluc25fdnByX3JlZ19vcGVyYW5kKSkKKyAg ICByZXR1cm4gdHJ1ZTsKKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyogVXRpbGl0 eSBmdW5jdGlvbiB0byBpZGVudGlmeSBpZiBJTlNOIGlzIGFuIE1WRSBpbnN0cnVjdGlvbiB0aGF0 IHBlcmZvcm1zCisgICBzb21lIGFjcm9zcy12ZWN0b3Igb3BlcmF0aW9uIChhbmQgYXMgYSByZXN1 bHQgZG9lcyBub3QgYWxpZ24gd2l0aCBub3JtYWwKKyAgIGxhbmUgcHJlZGljYXRpb24gcnVsZXMp LiAgQWxsIHN1Y2ggaW5zdHJ1Y3Rpb25zIGdpdmUgb25lIG9ubHkgc2NhbGFyCisgICBvdXRwdXQs IGV4Y2VwdCBmb3IgdnNobGNxIHdoaWNoIGdpdmVzIGEgUEFSQUxMRUwgb2YgYSB2ZWN0b3IgYW5k IGEgc2NhbGFyCisgICAob25lIHZlY3RvciByZXN1bHQgYW5kIG9uZSBjYXJyeSBvdXRwdXQpLiAg Ki8KKworc3RhdGljIGJvb2wKK2FybV9pc19tdmVfYWNyb3NzX3ZlY3Rvcl9pbnNuIChydHhfaW5z biogaW5zbikKK3sKKyAgZGZfcmVmIGluc25fZGVmcyA9IE5VTEw7CisgIGlmICghTVZFX1ZQVF9Q UkVESUNBQkxFX0lOU05fUCAoaW5zbikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgaXNf YWNyb3NzX3ZlY3RvciA9IGZhbHNlOworICBGT1JfRUFDSF9JTlNOX0RFRiAoaW5zbl9kZWZzLCBp bnNuKQorICAgIGlmICghVkFMSURfTVZFX01PREUgKEdFVF9NT0RFIChERl9SRUZfUkVHIChpbnNu X2RlZnMpKSkKKwkmJiAhYXJtX2dldF9yZXF1aXJlZF92cHJfcmVnX3JldF92YWwgKGluc24pKQor ICAgICAgaXNfYWNyb3NzX3ZlY3RvciA9IHRydWU7CisKKyAgcmV0dXJuIGlzX2Fjcm9zc192ZWN0 b3I7Cit9CisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gaWRlbnRpZnkgaWYgSU5TTiBpcyBhbiBN VkUgbG9hZCBvciBzdG9yZSBpbnN0cnVjdGlvbi4KKyAgICogRm9yIFRZUEUgPT0gMCwgY2hlY2sg YWxsIG9wZXJhbmRzLiAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwKKyAgICAgSU5TTiBp cyBhIGxvYWQgb3IgYSBzdG9yZSBpbnNuLgorICAgKiBGb3IgVFlQRSA9PSAxLCBvbmx5IGNoZWNr IHRoZSBpbnB1dCBvcGVyYW5kcy4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgICAgIHRydWUs IElOU04gaXMgYSBsb2FkIGluc24uCisgICAqIEZvciBUWVBFID09IDIsIG9ubHkgY2hlY2sgdGhl IG91dHB1dCBvcGVyYW5kcy4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgICAgIHRydWUsIElO U04gaXMgYSBzdG9yZSBpbnNuLiAgKi8KKworc3RhdGljIGJvb2wKK2FybV9pc19tdmVfbG9hZF9z dG9yZV9pbnNuIChydHhfaW5zbiogaW5zbiwgaW50IHR5cGUgPSAwKQoreworICBpbnQgbl9vcGVy YW5kcyA9IHJlY29nX2RhdGEubl9vcGVyYW5kczsKKyAgZXh0cmFjdF9pbnNuIChpbnNuKTsKKwor ICBmb3IgKGludCBvcCA9IDA7IG9wIDwgbl9vcGVyYW5kczsgb3ArKykKKyAgICB7CisgICAgICBp ZiAodHlwZSA9PSAxICYmIHJlY29nX2RhdGEub3BlcmFuZF90eXBlW29wXSA9PSBPUF9PVVQpCisJ Y29udGludWU7CisgICAgICBlbHNlIGlmICh0eXBlID09IDIgJiYgcmVjb2dfZGF0YS5vcGVyYW5k X3R5cGVbb3BdID09IE9QX0lOKQorCWNvbnRpbnVlOworICAgICAgaWYgKG12ZV9tZW1vcnlfb3Bl cmFuZCAocmVjb2dfZGF0YS5vcGVyYW5kW29wXSwKKwkJCSAgICAgIEdFVF9NT0RFIChyZWNvZ19k YXRhLm9wZXJhbmRbb3BdKSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIHJldHVybiBm YWxzZTsKK30KKworLyogV2hlbiB0cmFuc2Zvcm1pbmcgYW4gTVZFIGludHJpbnNpYyBsb29wIGlu dG8gYW4gTVZFIFRhaWwgUHJlZGljYXRlZCBMb3cKKyAgIE92ZXJoZWFkIExvb3AsIHRoZXJlIGFy ZSBhIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhhdCwgaWYgaW4gdGhlaXIKKyAgIHVucHJlZGlj YXRlZCBmb3JtLCBhY3QgYWNyb3NzIHZlY3RvciBsYW5lcywgYnV0IGFyZSBzdGlsbCBzYWZlIHRv IGluY2x1ZGUKKyAgIHdpdGhpbiB0aGUgbG9vcCwgZGVzcGl0ZSB0aGUgaW1wbGljaXQgcHJlZGlj YXRpb24gYWRkZWQgdG8gdGhlIHZlY3RvciBsYW5lcy4KKyAgIFRoaXMgbGlzdCBoYXMgYmVlbiBj b21waWxlZCBieSBjYXJlZnVsbHkgYW5hbHl6aW5nIHRoZSBpbnN0cnVjdGlvbgorICAgcHNldWRv Y29kZSBpbiB0aGUgQXJtLUFSTS4KKyAgIEFsbCBvdGhlciBhY3Jvc3MtdmVjdG9yIGluc3RydWN0 aW9ucyBhcmVuJ3QgYWxsb3dlZCwgYmVjYXVzZSB0aGUgYWRkaXRpb24KKyAgIG9mIGltcGxpY2l0 IHByZWRpY2F0aW9uIGNvdWxkIGluZmx1bmNlIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4K KyAgIEFueSBuZXcgYWNyb3NzLXZlY3RvciBpbnN0cnVjdGlvbnMgdG8gdGhlIE1WRSBJU0Egd2ls bCBoYXZlIHRvIGFzc2Vzc2VkIGZvcgorICAgaW5jbHVzaW9uIHRvIHRoaXMgbGlzdC4gICovCisK K3N0YXRpYyBib29sCithcm1fbXZlX2lzX2FsbG93ZWRfdW5wcmVkaWNfYWNyb3NzX3ZlY3Rvcl9p bnNuIChydHhfaW5zbiogaW5zbikKK3sKKyAgZ2NjX2Fzc2VydCAoTVZFX1ZQVF9VTlBSRURJQ0FU RURfSU5TTl9QIChpbnNuKQorCSAgICAgICYmIGFybV9pc19tdmVfYWNyb3NzX3ZlY3Rvcl9pbnNu IChpbnNuKSk7CisgIHJ0eCBpbnNuX3BhdHRlcm4gPSBQQVRURVJOIChpbnNuKTsKKyAgaWYgKEdF VF9DT0RFIChpbnNuX3BhdHRlcm4pID09IFNFVAorICAgICAgJiYgR0VUX0NPREUgKFhFWFAgKGlu c25fcGF0dGVybiwgMSkpID09IFVOU1BFQworICAgICAgJiYgKFhJTlQgKFhFWFAgKGluc25fcGF0 dGVybiwgMSksIDEpID09IFZBRERWUV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4s IDEpLCAxKSA9PSBWQUREVlFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwg MSkgPT0gVkFERFZBUV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9 PSBWQUREVkFRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZN TEFEQVZRX1UKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZNTEFE QVZRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZNTEFEQVZY UV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWTUxBREFWQVFf VQorCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVk1MQURBVkFRX1MK KwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZNTEFEQVZBWFFfUwor CSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVkFCQVZRX1MKKwkgIHx8 IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZBQkFWUV9VCisJICB8fCBYSU5U IChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWQURETFZRX1MKKwkgIHx8IFhJTlQgKFhF WFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZBRERMVlFfVQorCSAgfHwgWElOVCAoWEVYUCAo aW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVkFERExWQVFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5z bl9wYXR0ZXJuLCAxKSwgMSkgPT0gVkFERExWQVFfVQorCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9w YXR0ZXJuLCAxKSwgMSkgPT0gVkFERFZBUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRl cm4sIDEpLCAxKSA9PSBWQUREVkFRX1UKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwg MSksIDEpID09IFZNQVhWUV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAx KSA9PSBWTUFYQVZRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09 IFZNTEFMREFWUV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBW TUxBTERBVlhRX1UKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZN TEFMREFWWFFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVk1M QUxEQVZRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZNTEFM REFWQVFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVk1MQUxE QVZBUV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWTUxBTERB VkFYUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWTUxBTERB VkFYUV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWTUxTREFW UV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWTUxTREFWWFFf UworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVk1MU0RBVkFYUV9T CisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWTUxTREFWQVFfUwor CSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVk1MU0xEQVZRX1MKKwkg IHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZNTFNMREFWWFFfUworCSAg fHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVk1MU0xEQVZBUV9TCisJICB8 fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWTUxTTERBVkFYUV9TCisJICB8 fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWUk1MQUxEQVZIWFFfUworCSAg fHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVlJNTEFMREFWSFFfVQorCSAg fHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVlJNTEFMREFWSFFfUworCSAg fHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVlJNTEFMREFWSEFRX1MKKwkg IHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZSTUxBTERBVkhBUV9VCisJ ICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWUk1MQUxEQVZIQVhRX1MK KwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZSTUxTTERBVkhRX1MK KwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZSTUxTTERBVkhYUV9T CisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWUk1MU0xEQVZIQVFf UworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVlJNTFNMREFWSEFY UV9TKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8qIFJlY3Vy c2l2ZWx5IHNjYW4gdGhyb3VnaCB0aGUgREYgY2hhaW4gYmFja3dhcmRzIHdpdGhpbiB0aGUgYmFz aWMgYmxvY2sgYW5kCisgICBkZXRlcm1pbmUgaWYgYW55IG9mIHRoZSBVU0VzIG9mIHRoZSBvcmln aW5hbCBpbnNuIChvciB0aGUgVVNFcyBvZiB0aGUgaW5zbnMKKyAgIHdoZXJlIHRoeSB3ZXJlIERF Ri1lZCwgZXRjLiwgcmVjdXJzaXZlbHkpIHdlcmUgYWZmZWN0ZWQgYnkgaW1wbGljaXQgVlBUCisg ICBwcmVkaWNhdGlvbiBvZiBhbiBNVkVfVlBUX1VOUFJFRElDQVRFRF9JTlNOX1AgaW4gYSBkbHN0 cC9sZXRwIGxvb3AuCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zbiBp cyBhZmZlY3RlZCBpbXBsaWNpdCBwcmVkaWNhdGlvbgorICAgYW5kIGZhbHNlIG90aGVyd2lzZS4K KyAgIEhhdmluZyBzdWNoIGltcGxpY2l0IHByZWRpY2F0aW9uIG9uIGFuIHVucHJlZGljYXRlZCBp bnNuIHdvdWxkbid0IGluIGl0c2VsZgorICAgYmxvY2sgdGFpbCBwcmVkaWNhdGlvbiwgYmVjYXVz ZSB0aGUgb3V0cHV0IG9mIHRoYXQgaW5zbiBtaWdodCB0aGVuIGJlIHVzZWQKKyAgIGluIGEgY29y cmVjdGx5IHByZWRpY2F0ZWQgc3RvcmUgaW5zbiwgd2hlcmUgdGhlIGRpc2FibGVkIGxhbmVzIHdp bGwgYmUKKyAgIGlnbm9yZWQuICBUbyB2ZXJpZnkgdGhpcyB3ZSBsYXRlciBjYWxsOgorICAgYGFy bV9tdmVfY2hlY2tfZGZfY2hhaW5fZndkX2Zvcl9pbXBsaWNfcHJlZGljX2ltcGFjdGAsIHdoaWNo IHdpbGwgY2hlY2sgdGhlCisgICBERiBjaGFpbnMgZm9yd2FyZCB0byBzZWUgaWYgYW55IGltcGxp Y2l0bHktcHJlZGljYXRlZCBvcGVyYW5kIGdldHMgdXNlZCBpbgorICAgYW4gaW1wcm9wZXIgd2F5 LiAgKi8KKworc3RhdGljIGJvb2wKK2FybV9tdmVfY2hlY2tfZGZfY2hhaW5fYmFja19mb3JfaW1w bGljX3ByZWRpYworICAoaGFzaF9tYXA8aW50X2hhc2g8aW50LCAtMSwgLTI+LCBib29sPiogc2Fm ZV9pbnNuX21hcCwgcnR4X2luc24gKmluc24sCisgICBydHggdmN0cF92cHJfZ2VuZXJhdGVkKQor eworICBib29sKiB0ZW1wID0gTlVMTDsKKyAgaWYgKCh0ZW1wID0gc2FmZV9pbnNuX21hcC0+Z2V0 IChJTlNOX1VJRCAoaW5zbikpKSkKKyAgICByZXR1cm4gKnRlbXA7CisKKyAgYmFzaWNfYmxvY2sg Ym9keSA9IEJMT0NLX0ZPUl9JTlNOIChpbnNuKTsKKyAgLyogVGhlIGNpcmN1bXN0YW5jZXMgdW5k ZXIgd2hpY2ggYW4gaW5zdHJ1Y3Rpb24gaXMgYWZmZWN0ZWQgYnkgImltcGxpY2l0CisgICAgIHBy ZWRpY2F0aW9uIiBhcmUgYXMgZm9sbG93czoKKyAgICAgICogSXQgaXMgYW4gVU5QUkVESUNBVEVE X0lOU05fUDoKKwkqIFRoYXQgbG9hZHMvc3RvcmVzIGZyb20vdG8gbWVtb3J5LgorCSogV2hlcmUg YW55IG9uZSBvZiBpdHMgb3BlcmFuZHMgaXMgYW4gTVZFIHZlY3RvciBmcm9tIG91dHNpZGUgdGhl CisJICBsb29wIGJvZHkgYmIuCisgICAgIE9yOgorICAgICAgKiBBbnkgb2YgaXQncyBvcGVyYW5k cywgcmVjdXJzaXZlbHkgYmFja3dhcmRzLCBhcmUgYWZmZWN0ZWQuICAqLworICBpZiAoTVZFX1ZQ VF9VTlBSRURJQ0FURURfSU5TTl9QIChpbnNuKQorICAgICAgJiYgKGFybV9pc19tdmVfbG9hZF9z dG9yZV9pbnNuIChpbnNuKQorCSAgfHwgKGFybV9pc19tdmVfYWNyb3NzX3ZlY3Rvcl9pbnNuIChp bnNuKQorCSAgICAgICYmICFhcm1fbXZlX2lzX2FsbG93ZWRfdW5wcmVkaWNfYWNyb3NzX3ZlY3Rv cl9pbnNuIChpbnNuKSkpKQorICAgIHsKKyAgICAgIHNhZmVfaW5zbl9tYXAtPnB1dCAoSU5TTl9V SUQgKGluc24pLCB0cnVlKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBkZl9yZWYg aW5zbl91c2VzID0gTlVMTDsKKyAgRk9SX0VBQ0hfSU5TTl9VU0UgKGluc25fdXNlcywgaW5zbikK KyAgeworICAgIC8qIElmIHRoZSBvcGVyYW5kIGlzIGluIHRoZSBpbnB1dCByZWcgc2V0IHRvIHRo ZSB0aGUgYmFzaWMgYmxvY2ssCisgICAgICAgKGkuZS4gaXQgaGFzIGNvbWUgZnJvbSBvdXRzaWRl IHRoZSBsb29wISksIGNvbnNpZGVyIGl0IHVuc2FmZSBpZjoKKwkgKiBJdCdzIGJlaW5nIHVzZWQg aW4gYW4gdW5wcmVkaWNhdGVkIGluc24uCisJICogSXQgaXMgYSBwcmVkaWNhYmxlIE1WRSB2ZWN0 b3IuICAqLworICAgIGlmIChNVkVfVlBUX1VOUFJFRElDQVRFRF9JTlNOX1AgKGluc24pCisJJiYg VkFMSURfTVZFX01PREUgKEdFVF9NT0RFIChERl9SRUZfUkVHIChpbnNuX3VzZXMpKSkKKwkmJiBS RUdOT19SRUdfU0VUX1AgKERGX0xSX0lOIChib2R5KSwgREZfUkVGX1JFR05PIChpbnNuX3VzZXMp KSkKKyAgICAgIHsKKwlzYWZlX2luc25fbWFwLT5wdXQgKElOU05fVUlEIChpbnNuKSwgdHJ1ZSk7 CisJcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgLyogU2NhbiBiYWNrd2FyZHMgZnJvbSB0aGUg Y3VycmVudCBJTlNOIHRocm91Z2ggdGhlIGluc3RydWN0aW9uIGNoYWluCisgICAgICAgdW50aWwg dGhlIHN0YXJ0IG9mIHRoZSBiYXNpYyBibG9jay4gICovCisgICAgZm9yIChydHhfaW5zbiAqcHJl dl9pbnNuID0gUFJFVl9JTlNOIChpbnNuKTsKKwkgcHJldl9pbnNuICYmIHByZXZfaW5zbiAhPSBQ UkVWX0lOU04gKEJCX0hFQUQgKGJvZHkpKTsKKwkgcHJldl9pbnNuID0gUFJFVl9JTlNOIChwcmV2 X2luc24pKQorICAgICAgeworCS8qIElmIGEgcHJldmlvdXMgaW5zbiBkZWZpbmVzIGEgcmVnaXN0 ZXIgdGhhdCBJTlNOIHVzZXMsIHRoZW4gcmVjdXJzZQorCSAgIGluIG9yZGVyIHRvIGNoZWNrIHRo YXQgaW5zbidzIFVTRXMuCisJICAgSWYgYW55IG9mIHRoZXNlIGluc25zIHJldHVybiB0cnVlIGFz IE1WRV9WUFRfVU5QUkVESUNBVEVEX0lOU05fUHMsCisJICAgdGhlbiB0aGUgd2hvbGUgY2hhaW4g aXMgYWZmZWN0ZWQgYnkgdGhlIGNoYW5nZSBpbiBiZWhhdmlvdXIgZnJvbQorCSAgIGJlaW5nIHBs YWNlZCBpbiBkbHN0cC9sZXRwIGxvb3AuICAqLworCWRmX3JlZiBwcmV2X2luc25fZGVmcyA9IE5V TEw7CisJRk9SX0VBQ0hfSU5TTl9ERUYgKHByZXZfaW5zbl9kZWZzLCBwcmV2X2luc24pCisJewor CSAgaWYgKERGX1JFRl9SRUdOTyAoaW5zbl91c2VzKSA9PSBERl9SRUZfUkVHTk8gKHByZXZfaW5z bl9kZWZzKQorCSAgICAgICYmICFhcm1fbXZlX3ZlY19pbnNuX2lzX3ByZWRpY2F0ZWRfd2l0aF90 aGlzX3ByZWRpY2F0ZQorCQkgICAoaW5zbiwgdmN0cF92cHJfZ2VuZXJhdGVkKQorCSAgICAgICYm IGFybV9tdmVfY2hlY2tfZGZfY2hhaW5fYmFja19mb3JfaW1wbGljX3ByZWRpYworCQkgIChzYWZl X2luc25fbWFwLCBwcmV2X2luc24sIHZjdHBfdnByX2dlbmVyYXRlZCkpCisJICAgIHsKKwkgICAg ICBzYWZlX2luc25fbWFwLT5wdXQgKElOU05fVUlEIChpbnNuKSwgdHJ1ZSk7CisJICAgICAgcmV0 dXJuIHRydWU7CisJICAgIH0KKwl9CisgICAgICB9CisgIH0KKyAgc2FmZV9pbnNuX21hcC0+cHV0 IChJTlNOX1VJRCAoaW5zbiksIGZhbHNlKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBJZiB3 ZSBoYXZlIGlkZW50aWZpZWQgdGhhdCB0aGUgY3VycmVudCBERUYgd2lsbCBiZSBtb2RpZmllZAor ICAgYnkgc3VjaCBpbXBsaWNpdCBwcmVkaWNhdGlvbiwgc2NhbiB0aHJvdWdoIGFsbCB0aGUKKyAg IGluc25zIHRoYXQgVVNFIGl0IGFuZCBiYWlsIG91dCBpZiBhbnkgb25lIGlzIG91dHNpZGUgdGhl CisgICBjdXJyZW50IGJhc2ljIGJsb2NrIChpLmUuIHRoZSByZWcgaXMgbGl2ZSBhZnRlciB0aGUg bG9vcCkKKyAgIG9yIGlmIGFueSBhcmUgc3RvcmUgaW5zbnMgdGhhdCBhcmUgdW5wcmVkaWNhdGVk IG9yIHVzaW5nIGEKKyAgIHByZWRpY2F0ZSBvdGhlciB0aGFuIHRoZSBsb29wIFZQUi4KKyAgIFRo aXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBpbnNuIGlzIG5vdCBzdWl0YWJsZSBmb3IK KyAgIGltcGxpY2l0IHByZWRpY2F0aW9uIGFuZCBmYWxzZSBvdGhlcndpc2UuKi8KKworc3RhdGlj IGJvb2wKK2FybV9tdmVfY2hlY2tfZGZfY2hhaW5fZndkX2Zvcl9pbXBsaWNfcHJlZGljX2ltcGFj dCAocnR4X2luc24gKmluc24sCisJCQkJCQkgICAgIHJ0eCB2Y3RwX3Zwcl9nZW5lcmF0ZWQpCit7 CisKKyAgLyogSWYgdGhpcyBpbnNuIGlzIGluZGVlZCBhbiB1bnByZWRpY2F0ZWQgc3RvcmUgdG8g bWVtb3J5LCBiYWlsIG91dC4gICovCisgIGlmIChhcm1fbXZlX3ZlY19pbnNuX2lzX3VucHJlZGlj YXRlZF9vcl91c2VzX290aGVyX3ByZWRpY2F0ZQorCShpbnNuLCB2Y3RwX3Zwcl9nZW5lcmF0ZWQp CisgICAgICAmJiAoYXJtX2lzX212ZV9sb2FkX3N0b3JlX2luc24gKGluc24sIDIpCisJICB8fCBh cm1faXNfbXZlX2Fjcm9zc192ZWN0b3JfaW5zbiAoaW5zbikpKQorICAgIHJldHVybiB0cnVlOwor CisgIC8qIE5leHQsIHNjYW4gZm9yd2FyZCB0byB0aGUgdmFyaW91cyBVU0VzIG9mIHRoZSBERUZz IGluIHRoaXMgaW5zbi4gICovCisgIGRmX3JlZiBpbnNuX2RlZiA9IE5VTEw7CisgIEZPUl9FQUNI X0lOU05fREVGIChpbnNuX2RlZiwgaW5zbikKKyAgICB7CisgICAgICBmb3IgKGRmX3JlZiB1c2Ug PSBERl9SRUdfVVNFX0NIQUlOIChERl9SRUZfUkVHTk8gKGluc25fZGVmKSk7IHVzZTsKKwkgICB1 c2UgPSBERl9SRUZfTkVYVF9SRUcgKHVzZSkpCisJeworCSAgcnR4X2luc24gKm5leHRfdXNlX2lu c24gPSBERl9SRUZfSU5TTiAodXNlKTsKKwkgIGlmIChuZXh0X3VzZV9pbnNuICE9IGluc24KKwkg ICAgICAmJiBOT05ERUJVR19JTlNOX1AgKG5leHRfdXNlX2luc24pKQorCSAgICB7CisJICAgICAg LyogSWYgdGhlIFVTRSBpcyBvdXRzaWRlIHRoZSBsb29wIGJvZHkgYmIsIG9yIGl0IGlzIGluc2lk ZSwgYnV0CisJCSBpcyBhbiBkaWZmZXJlbnRseS1wcmVkaWNhdGVkIHN0b3JlIHRvIG1lbW9yeSBv ciBpdCBpcyBhbnkKKwkJIGFjcm9zcy12ZWN0b3IgaW5zdHJ1Y3Rpb24uICAqLworCSAgICAgIGlm IChCTE9DS19GT1JfSU5TTiAoaW5zbikgIT0gQkxPQ0tfRk9SX0lOU04gKG5leHRfdXNlX2luc24p CisJCSAgfHwgKGFybV9tdmVfdmVjX2luc25faXNfdW5wcmVkaWNhdGVkX29yX3VzZXNfb3RoZXJf cHJlZGljYXRlCisJCSAgICAgICAobmV4dF91c2VfaW5zbiwgdmN0cF92cHJfZ2VuZXJhdGVkKQor CQkgICAgICYmIChhcm1faXNfbXZlX2xvYWRfc3RvcmVfaW5zbiAobmV4dF91c2VfaW5zbiwgMikK KwkJCSB8fCBhcm1faXNfbXZlX2Fjcm9zc192ZWN0b3JfaW5zbiAobmV4dF91c2VfaW5zbikpKSkK KwkJcmV0dXJuIHRydWU7CisJICAgIH0KKwl9CisgICAgfQorICByZXR1cm4gZmFsc2U7Cit9CisK Ky8qIEhlbHBlciBmdW5jdGlvbiB0byBgYXJtX212ZV9kbHN0cF9jaGVja19pbmNfY291bnRlcmAg YW5kIHRvCisgICBgYXJtX212ZV9kbHN0cF9jaGVja19kZWNfY291bnRlcmAuICBJbiB0aGUgc2l0 dWF0aW9ucyB3aGVyZSB0aGUgbG9vcCBjb3VudGVyCisgICBpcyBpbmNyZW1lbnRpbmcgYnkgMSBv ciBkZWNyZW1lbnRpbmcgYnkgMSBpbiBlYWNoIGl0ZXJhdGlvbiwgZW5zdXJlIHRoYXQgdGhlCisg ICB0YXJnZXQgdmFsdWUgb3IgdGhlIGluaXRpYWxpc2F0aW9uIHZhbHVlLCByZXNwZWN0aXZlbHks IHdhcyBhIGNhbGN1bGF0aW9uCisgICBvZiB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgb2YgdGhl IGxvb3AsIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGJlIGFuIEFTSElGVFJUCisgICBieSBWQ1RQX1NU RVAuICAqLworCitzdGF0aWMgYm9vbAorYXJtX212ZV9jaGVja19yZWdfb3JpZ2luX2lzX251bV9l bGVtcyAoYmFzaWNfYmxvY2sgYm9keSwgcnR4IHJlZywgcnR4IHZjdHBfc3RlcCkKK3sKKyAgLyog T2ssIHdlIG5vdyBrbm93IHRoZSBsb29wIHN0YXJ0cyBmcm9tIHplcm8gYW5kIGluY3JlbWVudHMg Ynkgb25lLgorICAgICBOb3cganVzdCBzaG93IHRoYXQgdGhlIG1heCB2YWx1ZSBvZiB0aGUgY291 bnRlciBjYW1lIGZyb20gYW4KKyAgICAgYXBwcm9wcmlhdGUgQVNISUZSVCBleHByIG9mIHRoZSBj b3JyZWN0IGFtb3VudC4gICovCisgIGJhc2ljX2Jsb2NrIHByZV9sb29wX2JiID0gYm9keS0+cHJl dl9iYjsKKyAgd2hpbGUgKHByZV9sb29wX2JiICYmIEJCX0VORCAocHJlX2xvb3BfYmIpCisJICYm ICFkZl9iYl9yZWdub19vbmx5X2RlZl9maW5kIChwcmVfbG9vcF9iYiwgUkVHTk8gKHJlZykpKQor ICAgIHByZV9sb29wX2JiID0gcHJlX2xvb3BfYmItPnByZXZfYmI7CisKKyAgZGZfcmVmIGNvdW50 ZXJfbWF4X2xhc3RfZGVmID0gZGZfYmJfcmVnbm9fb25seV9kZWZfZmluZCAocHJlX2xvb3BfYmIs IFJFR05PIChyZWcpKTsKKyAgcnR4IGNvdW50ZXJfbWF4X2xhc3Rfc2V0OworICBpZiAoY291bnRl cl9tYXhfbGFzdF9kZWYpCisgICAgY291bnRlcl9tYXhfbGFzdF9zZXQgPSBQQVRURVJOIChERl9S RUZfSU5TTiAoY291bnRlcl9tYXhfbGFzdF9kZWYpKTsKKyAgZWxzZQorICAgIHJldHVybiBmYWxz ZTsKKworICAvKiBJZiB3ZSBlbmNvdW50ZXIgYSBzaW1wbGUgU0VUIGZyb20gYSBSRUcsIGZvbGxv dyBpdCB0aHJvdWdoLiAgKi8KKyAgaWYgKEdFVF9DT0RFIChjb3VudGVyX21heF9sYXN0X3NldCkg PT0gU0VUCisgICAgICAmJiBSRUdfUCAoWEVYUCAoY291bnRlcl9tYXhfbGFzdF9zZXQsIDEpKSkK KyAgICByZXR1cm4gYXJtX212ZV9jaGVja19yZWdfb3JpZ2luX2lzX251bV9lbGVtcworCSAgICAg KHByZV9sb29wX2JiLT5uZXh0X2JiLCBYRVhQIChjb3VudGVyX21heF9sYXN0X3NldCwgMSksIHZj dHBfc3RlcCk7CisKKyAgLyogSWYgd2UgZW5jb3VudGVyIGEgU0VUIGZyb20gYW4gSUZfVEhFTl9F TFNFIHdoZXJlIG9uZSBvZiB0aGUgb3BlcmFuZHMgaXMgYQorICAgICBjb25zdGFudCBhbmQgdGhl IG90aGVyIGlzIGEgUkVHLCBmb2xsb3cgdGhyb3VnaCB0byB0aGF0IFJFRy4gICovCisgIGlmIChH RVRfQ09ERSAoY291bnRlcl9tYXhfbGFzdF9zZXQpID09IFNFVAorICAgICAgJiYgR0VUX0NPREUg KFhFWFAgKGNvdW50ZXJfbWF4X2xhc3Rfc2V0LCAxKSkgPT0gSUZfVEhFTl9FTFNFCisgICAgICAm JiBSRUdfUCAoWEVYUCAoWEVYUCAoY291bnRlcl9tYXhfbGFzdF9zZXQsIDEpLCAxKSkKKyAgICAg ICYmIENPTlNUX0lOVF9QIChYRVhQIChYRVhQIChjb3VudGVyX21heF9sYXN0X3NldCwgMSksIDIp KSkKKyAgICByZXR1cm4gYXJtX212ZV9jaGVja19yZWdfb3JpZ2luX2lzX251bV9lbGVtcworCSAg ICAgKHByZV9sb29wX2JiLT5uZXh0X2JiLCBYRVhQIChYRVhQIChjb3VudGVyX21heF9sYXN0X3Nl dCwgMSksIDEpLCB2Y3RwX3N0ZXApOworCisgIGlmIChHRVRfQ09ERSAoWEVYUCAoY291bnRlcl9t YXhfbGFzdF9zZXQsIDEpKSA9PSBBU0hJRlRSVAorICAgICAgJiYgQ09OU1RfSU5UX1AgKFhFWFAg KFhFWFAgKGNvdW50ZXJfbWF4X2xhc3Rfc2V0LCAxKSwgMSkpCisgICAgICAmJiAoKDEgPDwgSU5U VkFMIChYRVhQIChYRVhQIChjb3VudGVyX21heF9sYXN0X3NldCwgMSksIDEpKSkKKwkgICA9PSBh YnMgKElOVFZBTCAodmN0cF9zdGVwKSkpKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBm YWxzZTsKK30KKworLyogSWYgd2UgaGF2ZSBpZGVudGlmaWVkIHRoZSBsb29wIHRvIGhhdmUgYW4g aW5jcmVtZW50aW5nIGNvdW50ZXIsIHdlIG5lZWQgdG8KKyAgIG1ha2Ugc3VyZSB0aGF0IGl0IGlu Y3JlbWVudHMgYnkgMSBhbmQgdGhhdCB0aGUgbG9vcCBpcyBzdHJ1Y3R1cmVkIGNvcnJlY3RseToK KyAgICAqIFRoZSBjb3VudGVyIHN0YXJ0cyBmcm9tIDAKKyAgICAqIFRoZSBjb3VudGVyIHRlcm1p bmF0ZXMgYXQgKG51bV9vZl9lbGVtICsgbnVtX29mX2xhbmVzIC0gMSkgLyBudW1fb2ZfbGFuZXMK KyAgICAqIFRoZSB2Y3RwIGluc24gdXNlcyBhIHJlZyB0aGF0IGRlY3JlbWVudHMgYXBwcm9wcmlh dGVseSBpbiBlYWNoIGl0ZXJhdGlvbi4KKyovCisKK3N0YXRpYyBydHhfaW5zbioKK2FybV9tdmVf ZGxzdHBfY2hlY2tfaW5jX2NvdW50ZXIgKGJhc2ljX2Jsb2NrIGJvZHksIHJ0eF9pbnNuKiB2Y3Rw X2luc24sCisJCQkJIHJ0eCBjb25kY29uc3QsIHJ0eCBjb25kY291bnQpCit7CisgIHJ0eCB2Y3Rw X3JlZyA9IFhWRUNFWFAgKFhFWFAgKFBBVFRFUk4gKHZjdHBfaW5zbiksIDEpLCAwLCAwKTsKKyAg LyogVGhlIGxvb3AgbGF0Y2ggaGFzIHRvIGJlIGVtcHR5LiAgV2hlbiBjb21waWxpbmcgYWxsIHRo ZSBrbm93biBNVkUgTG9McyBpbgorICAgICB1c2VyIGFwcGxpY2F0aW9ucywgbm9uZSBvZiB0aG9z ZSB3aXRoIGluY3JlbWVudGluZyBjb3VudGVycyBoYWQgYW55IHJlYWwKKyAgICAgaW5zbnMgaW4g dGhlIGxvb3AgbGF0Y2guICBBcyBzdWNoLCB0aGlzIGZ1bmN0aW9uIGhhcyBvbmx5IGJlZW4gdGVz dGVkIHdpdGgKKyAgICAgYW4gZW1wdHkgbGF0Y2ggYW5kIG1heSBtaXNiZWhhdmUgb3IgSUNFIGlm IHdlIHNvbWVob3cgZ2V0IGhlcmUgd2l0aCBhbgorICAgICBpbmNyZW1lbnQgaW4gdGhlIGxhdGNo LCBzbywgZm9yIGNvcnJlY3RuZXNzLCBlcnJvciBvdXQgZWFybHkuICAqLworICBydHhfaW5zbiAq ZGVjX2luc24gPSBCQl9FTkQgKGJvZHktPmxvb3BfZmF0aGVyLT5sYXRjaCk7CisgIGlmIChOT05E RUJVR19JTlNOX1AgKGRlY19pbnNuKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBjbGFzcyBydHhf aXYgdmN0cF9yZWdfaXY7CisgIC8qIEZvciBsb29wcyBvZiB0eXBlIEIpIHRoZSBsb29wIGNvdW50 ZXIgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGRlY3JlbWVudAorICAgICBvZiB0aGUgcmVnIHVzZWQg aW4gdGhlIHZjdHBfaW5zbi4gU28gcnVuIGl2IGFuYWx5c2lzIG9uIHRoYXQgcmVnLiAgVGhpcwor ICAgICBoYXMgdG8gc3VjY2VlZCBmb3Igc3VjaCBsb29wcyB0byBiZSBzdXBwb3J0ZWQuICAqLwor ICBpZiAoIWl2X2FuYWx5emUgKHZjdHBfaW5zbiwgYXNfYTxzY2FsYXJfaW50X21vZGU+IChHRVRf TU9ERSAodmN0cF9yZWcpKSwKKyAgICAgIHZjdHBfcmVnLCAmdmN0cF9yZWdfaXYpKQorICAgIHJl dHVybiBOVUxMOworCisgIC8qIEZpbmQgd2hlcmUgYm90aCBvZiB0aG9zZSBhcmUgbW9kaWZpZWQg aW4gdGhlIGxvb3AgYm9keSBiYi4gICovCisgIHJ0eCBjb25kY291bnRfcmVnX3NldAorCT0gUEFU VEVSTiAoREZfUkVGX0lOU04gKGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmQKKwkJCQkgKGJvZHks IFJFR05PIChjb25kY291bnQpKSkpOworICBydHggdmN0cF9yZWdfc2V0ID0gUEFUVEVSTiAoREZf UkVGX0lOU04gKGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmQKKwkJCQkJICAgIChib2R5LCBSRUdO TyAodmN0cF9yZWcpKSkpOworICBpZiAoIXZjdHBfcmVnX3NldCB8fCAhY29uZGNvdW50X3JlZ19z ZXQpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKFJFR19QIChjb25kY291bnQpICYmIFJFR19Q IChjb25kY29uc3QpKQorICAgIHsKKyAgICAgIC8qIEZpcnN0IHdlIG5lZWQgdG8gcHJvdmUgdGhh dCB0aGUgbG9vcCBpcyBnb2luZyAwLi5jb25kY29uc3Qgd2l0aCBhbgorCSBpbmMgb2YgMSBpbiBl YWNoIGl0ZXJhdGlvbi4gICovCisgICAgICBpZiAoR0VUX0NPREUgKFhFWFAgKGNvbmRjb3VudF9y ZWdfc2V0LCAxKSkgPT0gUExVUworCSAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKFhFWFAgKGNvbmRj b3VudF9yZWdfc2V0LCAxKSwgMSkpCisJICAmJiBJTlRWQUwgKFhFWFAgKFhFWFAgKGNvbmRjb3Vu dF9yZWdfc2V0LCAxKSwgMSkpID09IDEpCisJeworCSAgICBydHggY291bnRlcl9yZWcgPSBYRVhQ IChjb25kY291bnRfcmVnX3NldCwgMCk7CisJICAgIC8qIENoZWNrIHRoYXQgdGhlIGNvdW50ZXIg ZGlkIGluZGVlZCBzdGFydCBmcm9tIHplcm8uICAqLworCSAgICBkZl9yZWYgdGhpc19zZXQgPSBE Rl9SRUdfREVGX0NIQUlOIChSRUdOTyAoY291bnRlcl9yZWcpKTsKKwkgICAgaWYgKCF0aGlzX3Nl dCkKKwkgICAgICByZXR1cm4gTlVMTDsKKwkgICAgZGZfcmVmIGxhc3Rfc2V0ID0gREZfUkVGX05F WFRfUkVHICh0aGlzX3NldCk7CisJICAgIGlmICghbGFzdF9zZXQpCisJICAgICAgcmV0dXJuIE5V TEw7CisJICAgIHJ0eF9pbnNuKiBsYXN0X3NldF9pbnNuID0gREZfUkVGX0lOU04gKGxhc3Rfc2V0 KTsKKwkgICAgaWYgKCFzaW5nbGVfc2V0IChsYXN0X3NldF9pbnNuKSkKKwkgICAgICByZXR1cm4g TlVMTDsKKwkgICAgcnR4IGNvdW50ZXJfb3JpZ19zZXQ7CisJICAgIGNvdW50ZXJfb3JpZ19zZXQg PSBYRVhQIChQQVRURVJOIChsYXN0X3NldF9pbnNuKSwgMSk7CisJICAgIGlmICghQ09OU1RfSU5U X1AgKGNvdW50ZXJfb3JpZ19zZXQpCisJCXx8IChJTlRWQUwgKGNvdW50ZXJfb3JpZ19zZXQpICE9 IDApKQorCSAgICAgIHJldHVybiBOVUxMOworCSAgICAvKiBBbmQgZmluYWxseSBjaGVjayB0aGF0 IHRoZSB0YXJnZXQgdmFsdWUgb2YgdGhlIGNvdW50ZXIsCisJICAgICAgIGNvbmRjb25zdCBpcyBv ZiB0aGUgY29ycmVjdCBzaGFwZS4gICovCisJICAgIGlmICghYXJtX212ZV9jaGVja19yZWdfb3Jp Z2luX2lzX251bV9lbGVtcyAoYm9keSwgY29uZGNvbnN0LAorCQkJCQkJCXZjdHBfcmVnX2l2LnN0 ZXApKQorCSAgICAgIHJldHVybiBOVUxMOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gTlVMTDsK KyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBFeHRyYWN0IHRoZSBkZWNy ZW1lbnRudW0gb2YgdGhlIHZjdHAgcmVnLiAgKi8KKyAgaW50IGRlY3JlbWVudG51bSA9IGFicyAo SU5UVkFMICh2Y3RwX3JlZ19pdi5zdGVwKSk7CisgIC8qIEVuc3VyZSBpdCBtYXRjaGVzIHRoZSBu dW1iZXIgb2YgbGFuZXMgb2YgdGhlIHZjdHAgaW5zdHJ1Y3Rpb24uICAqLworICBpZiAoZGVjcmVt ZW50bnVtICE9IGFybV9tdmVfZ2V0X3ZjdHBfbGFuZXMgKFBBVFRFUk4gKHZjdHBfaW5zbikpKQor ICAgIHJldHVybiBOVUxMOworCisgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgdmFsaWQuICAqLworICBy ZXR1cm4gdmN0cF9pbnNuOworfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gdG8gYGFybV9tdmVfbG9v cF92YWxpZF9mb3JfZGxzdHBgLiAgSW4gdGhlIGNhc2Ugb2YgYQorICAgY291bnRlciB0aGF0IGlz IGRlY3JlbWVudGluZywgZW5zdXJlIHRoYXQgaXQgaXMgZGVjcmVtZW50aW5nIGJ5IHRoZQorICAg cmlnaHQgYW1vdW50IGluIGVhY2ggaXRlcmF0aW9uIGFuZCB0aGF0IHRoZSB0YXJnZXQgY29uZGl0 aW9uIGlzIHdoYXQKKyAgIHdlIGV4cGVjdC4gICovCisKK3N0YXRpYyBydHhfaW5zbioKK2FybV9t dmVfZGxzdHBfY2hlY2tfZGVjX2NvdW50ZXIgKGJhc2ljX2Jsb2NrIGJvZHksIHJ0eF9pbnNuKiB2 Y3RwX2luc24sCisJCQkJIHJ0eCBjb25kY29uc3QsIHJ0eCBjb25kY291bnQpCit7CisgIHJ0eCB2 Y3RwX3JlZyA9IFhWRUNFWFAgKFhFWFAgKFBBVFRFUk4gKHZjdHBfaW5zbiksIDEpLCAwLCAwKTsK KyAgY2xhc3MgcnR4X2l2IHZjdHBfcmVnX2l2OworICBpbnQgZGVjcmVtZW50bnVtOworICAvKiBG b3IgZGVjcmVtZW50aW5nIGxvb3BzIG9mIHR5cGUgQSksIHRoZSBjb3VudGVyIGlzIHVzdWFsbHkg cHJlc2VudCBpbiB0aGUKKyAgICAgbG9vcCBsYXRjaC4gIEhlcmUgd2Ugc2ltcGx5IG5lZWQgdG8g dmVyaWZ5IHRoYXQgdGhpcyBjb3VudGVyIGlzIHRoZSBzYW1lCisgICAgIHJlZyB0aGF0IGlzIGFs c28gdXNlZCBpbiB0aGUgdmN0cF9pbnNuIGFuZCB0aGF0IGl0IGlzIG5vdCBvdGhlcndpc2UKKyAg ICAgbW9kaWZpZWQuICAqLworICBydHhfaW5zbiAqZGVjX2luc24gPSBCQl9FTkQgKGJvZHktPmxv b3BfZmF0aGVyLT5sYXRjaCk7CisgIC8qIElmIG5vdCBpbiB0aGUgbG9vcCBsYXRjaCwgdHJ5IHRv IGZpbmQgdGhlIGRlY3JlbWVudCBpbiB0aGUgbG9vcCBib2R5LiAgKi8KKyAgaWYgKCFOT05ERUJV R19JTlNOX1AgKGRlY19pbnNuKSkKKyAgeworICAgIGRmX3JlZiB0ZW1wID0gZGZfYmJfcmVnbm9f b25seV9kZWZfZmluZCAoYm9keSwgUkVHTk8gKGNvbmRjb3VudCkpOworICAgIC8qIElmIHdlIGhh dmVuJ3QgYmVlbiBhYmxlIHRvIGZpbmQgdGhlIGRlY3JlbWVudCwgYmFpbCBvdXQuICAqLworICAg IGlmICghdGVtcCkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGRlY19pbnNuID0gREZfUkVGX0lO U04gKHRlbXApOworICB9CisKKyAgLyogTmV4dCwgZW5zdXJlIHRoYXQgaXQgaXMgYSBQTFVTIG9m IHRoZSBmb3JtOgorICAgICAoc2V0IChyZWcgYSkgKHBsdXMgKHJlZyBhKSAoY29uc3RfaW50KSkp CisgICAgIHdoZXJlIChyZWcgYSkgaXMgdGhlIHNhbWUgYXMgY29uZGNvdW50LiAgKi8KKyAgaWYg KEdFVF9DT0RFIChYRVhQIChQQVRURVJOIChkZWNfaW5zbiksIDEpKSA9PSBQTFVTCisgICAgICAm JiBSRUdOTyAoWEVYUCAoUEFUVEVSTiAoZGVjX2luc24pLCAwKSkKKwkgID09IFJFR05PIChYRVhQ IChYRVhQIChQQVRURVJOIChkZWNfaW5zbiksIDEpLCAwKSkKKyAgICAgICYmIFJFR05PIChYRVhQ IChQQVRURVJOIChkZWNfaW5zbiksIDApKSA9PSBSRUdOTyAoY29uZGNvdW50KSkKKyAgICBkZWNy ZW1lbnRudW0gPSBhYnMgKElOVFZBTCAoWEVYUCAoWEVYUCAoUEFUVEVSTiAoZGVjX2luc24pLCAx KSwgMSkpKTsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworCisgIC8qIE9rLCBzbyB3ZSBub3cg a25vdyB0aGUgbG9vcCBkZWNyZW1lbnQuICBJZiBpdCBpcyBhIDEsIHRoZW4gd2UgbmVlZCB0bwor ICAgICBsb29rIGF0IHRoZSBsb29wIHZjdHBfcmVnIGFuZCB2ZXJpZnkgdGhhdCBpdCBhbHNvIGRl Y3JlbWVudHMgY29ycmVjdGx5LgorICAgICBUaGVuLCB3ZSBuZWVkIHRvIGVzdGFibGlzaCB0aGF0 IHRoZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgbG9vcCBkZWNyZW1lbnQKKyAgICAgb3JpZ2luYXRl cyBmcm9tIHRoZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgdmN0cCBkZWNyZW1lbnQuICAqLworICBp ZiAoZGVjcmVtZW50bnVtID09IDEpCisgICAgeworICAgICAgY2xhc3MgcnR4X2l2IHZjdHBfcmVn X2l2OworICAgICAgLyogVGhlIGxvb3AgY291bnRlciBpcyBmb3VuZCB0byBiZSBpbmRlcGVuZGVu dCBvZiB0aGUgZGVjcmVtZW50CisJIG9mIHRoZSByZWcgdXNlZCBpbiB0aGUgdmN0cF9pbnNuLCBh Z2Fpbi4gIEVuc3VyZSB0aGF0IElWIGFuYWx5c2lzCisJIHN1Y2NlZWRzIGFuZCBjaGVjayB0aGUg c3RlcC4gICovCisgICAgICBpZiAoIWl2X2FuYWx5emUgKHZjdHBfaW5zbiwgYXNfYTxzY2FsYXJf aW50X21vZGU+IChHRVRfTU9ERSAodmN0cF9yZWcpKSwKKwkJICAgICAgIHZjdHBfcmVnLCAmdmN0 cF9yZWdfaXYpKQorCXJldHVybiBOVUxMOworICAgICAgLyogRW5zdXJlIGl0IG1hdGNoZXMgdGhl IG51bWJlciBvZiBsYW5lcyBvZiB0aGUgdmN0cCBpbnN0cnVjdGlvbi4gICovCisgICAgICBpZiAo YWJzIChJTlRWQUwgKHZjdHBfcmVnX2l2LnN0ZXApKQorCSAgIT0gYXJtX212ZV9nZXRfdmN0cF9s YW5lcyAoUEFUVEVSTiAodmN0cF9pbnNuKSkpCisJcmV0dXJuIE5VTEw7CisgICAgICBpZiAoIWFy bV9tdmVfY2hlY2tfcmVnX29yaWdpbl9pc19udW1fZWxlbXMgKGJvZHksIGNvbmRjb3VudCwgdmN0 cF9yZWdfaXYuc3RlcCkpCisJcmV0dXJuIE5VTEw7CisgICAgfQorICAvKiBJZiB0aGUgZGVjcmVt ZW50cyBhcmUgdGhlIHNhbWUsIHRoZW4gdGhlIHNpdHVhdGlvbiBpcyBzaW1wbGU6IGVpdGhlciB0 aGV5CisgICAgIGFyZSBhbHNvIHRoZSBzYW1lIHJlZywgd2hpY2ggaXMgc2FmZSwgb3IgdGhleSBh cmUgZGlmZmVyZW50IHJlZ2lzdGVycywgaW4KKyAgICAgd2hpY2ggY2FzZSBtYWtzZSBzdXJlIHRo YXQgdGhlcmUgaXMgYSBvbmx5IHNpbXBsZSBTRVQgZnJvbSBvbmUgdG8gdGhlCisgICAgIG90aGVy IGluc2lkZSB0aGUgbG9vcC4qLworICBlbHNlIGlmIChkZWNyZW1lbnRudW0gPT0gYXJtX212ZV9n ZXRfdmN0cF9sYW5lcyAoUEFUVEVSTiAodmN0cF9pbnNuKSkpCisgICAgeworICAgICAgaWYgKFJF R05PIChjb25kY291bnQpICE9IFJFR05PICh2Y3RwX3JlZykpCisJeworCSAgLyogSXQgd2Fzbid0 IHRoZSBzYW1lIHJlZywgYnV0IGl0IGNvdWxkIGJlIGJlaGlsZCBhCisJICAgICAoc2V0ICh2Y3Rw X3JlZykgKGNvbmRjb3VudCkpLCBzbyBpbnN0ZWFkIGZpbmQgd2hlcmUKKwkgICAgIHRoZSBWQ1RQ IGluc24gaXMgREVGJ2QgaW5zaWRlIHRoZSBsb29wLiAgKi8KKwkgIHJ0eCB2Y3RwX3JlZ19zZXQg PQorCQlQQVRURVJOIChERl9SRUZfSU5TTiAoZGZfYmJfcmVnbm9fb25seV9kZWZfZmluZAorCQkJ CQkoYm9keSwgUkVHTk8gKHZjdHBfcmVnKSkpKTsKKwkgIC8qIFRoaXMgbXVzdCBqdXN0IGJlIGEg c2ltcGxlIFNFVCBmcm9tIHRoZSBjb25kY291bnQuICAqLworCSAgaWYgKEdFVF9DT0RFICh2Y3Rw X3JlZ19zZXQpICE9IFNFVCB8fCAhUkVHX1AgKFhFWFAgKHZjdHBfcmVnX3NldCwgMSkpCisJICAg ICAgfHwgUkVHTk8gKFhFWFAgKHZjdHBfcmVnX3NldCwgMSkpICE9IFJFR05PIChjb25kY291bnQp KQorCSAgICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIE5VTEw7 CisKKyAgLyogV2Ugbm93IG9ubHkgbmVlZCB0byBmaW5kIG91dCB0aGF0IHRoZSBsb29wIHRlcm1p bmF0ZXMgd2l0aCBhIExFCisgICAgIHplcm8gY29uZGl0aW9uLiAgSWYgY29uZGNvbnN0IGlzIGEg Y29uc3RfaW50LCB0aGVuIHRoaXMgaXMgZWFzeS4KKyAgICAgSWYgaXRzIGEgUkVHLCBsb29rIGF0 IHRoZSBsYXN0IGNvbmRpdGlvbitqdW1wIGluIGEgYmIgYmVmb3JlCisgICAgIHRoZSBsb29wLCBi ZWNhdXNlIHRoYXQgdXN1YWxseSB3aWxsIGhhdmUgYSBicmFuY2gganVtcGluZyBvdmVyCisgICAg IHRoZSBsb29wIGJvZHkuICAqLworICBpZiAoQ09OU1RfSU5UX1AgKGNvbmRjb25zdCkKKyAgICAg ICYmICEoSU5UVkFMIChjb25kY29uc3QpID09IDAgJiYgSlVNUF9QIChCQl9FTkQgKGJvZHkpKQor CSAgICYmIEdFVF9DT0RFIChYRVhQIChQQVRURVJOIChCQl9FTkQgKGJvZHkpKSwgMSkpID09IElG X1RIRU5fRUxTRQorCSAgICYmIChHRVRfQ09ERSAoWEVYUCAoWEVYUCAoUEFUVEVSTiAoQkJfRU5E IChib2R5KSksIDEpLCAwKSkgPT0gTkUKKwkgICAgICAgfHxHRVRfQ09ERSAoWEVYUCAoWEVYUCAo UEFUVEVSTiAoQkJfRU5EIChib2R5KSksIDEpLCAwKSkgPT0gR1QpKSkKKyAgICByZXR1cm4gTlVM TDsKKyAgZWxzZSBpZiAoUkVHX1AgKGNvbmRjb25zdCkpCisgICAgeworICAgICAgYmFzaWNfYmxv Y2sgcHJlX2xvb3BfYmIgPSBib2R5OworICAgICAgd2hpbGUgKHByZV9sb29wX2JiLT5wcmV2X2Ji ICYmIEJCX0VORCAocHJlX2xvb3BfYmItPnByZXZfYmIpCisJICAgICAmJiAhSlVNUF9QIChCQl9F TkQgKHByZV9sb29wX2JiLT5wcmV2X2JiKSkpCisJcHJlX2xvb3BfYmIgPSBwcmVfbG9vcF9iYi0+ cHJldl9iYjsKKyAgICAgIGlmIChwcmVfbG9vcF9iYiAmJiBCQl9FTkQgKHByZV9sb29wX2JiKSkK KwlwcmVfbG9vcF9iYiA9IHByZV9sb29wX2JiLT5wcmV2X2JiOworICAgICAgZWxzZQorCXJldHVy biBOVUxMOworICAgICAgcnR4IGluaXRpYWxfY29tcGFyZSA9IE5VTExfUlRYOworICAgICAgaWYg KCEocHJldl9ub25ub3RlX25vbmRlYnVnX2luc25fYmIgKEJCX0VORCAocHJlX2xvb3BfYmIpKQor CSAgICAmJiBJTlNOX1AgKHByZXZfbm9ubm90ZV9ub25kZWJ1Z19pbnNuX2JiIChCQl9FTkQgKHBy ZV9sb29wX2JiKSkpKSkKKwlyZXR1cm4gTlVMTDsKKyAgICAgIGVsc2UKKwlpbml0aWFsX2NvbXBh cmUKKwkgICAgPSBQQVRURVJOIChwcmV2X25vbm5vdGVfbm9uZGVidWdfaW5zbl9iYiAoQkJfRU5E IChwcmVfbG9vcF9iYikpKTsKKyAgICAgIGlmICghKGluaXRpYWxfY29tcGFyZSAmJiBHRVRfQ09E RSAoaW5pdGlhbF9jb21wYXJlKSA9PSBTRVQKKwkgICAgJiYgY2NfcmVnaXN0ZXIgKFhFWFAgKGlu aXRpYWxfY29tcGFyZSwgMCksIFZPSURtb2RlKQorCSAgICAmJiBHRVRfQ09ERSAoWEVYUCAoaW5p dGlhbF9jb21wYXJlLCAxKSkgPT0gQ09NUEFSRQorCSAgICAmJiBDT05TVF9JTlRfUCAoWEVYUCAo WEVYUCAoaW5pdGlhbF9jb21wYXJlLCAxKSwgMSkpCisJICAgICYmIElOVFZBTCAoWEVYUCAoWEVY UCAoaW5pdGlhbF9jb21wYXJlLCAxKSwgMSkpID09IDApKQorCXJldHVybiBOVUxMOworCisgICAg ICAvKiBVc3VhbGx5IHRoaXMgaXMgYSBMRSBjb25kaXRpb24sIGJ1dCBpdCBjYW4gYWxzbyBqdXN0 IGJlIGEgR1Qgb3IgYW4gRVEKKwkgY29uZGl0aW9uIChpZiB0aGUgdmFsdWUgaXMgdW5zaWduZWQg b3IgdGhlIGNvbXBpbGVyIGtub3dzIGl0cyBub3QgbmVnYXRpdmUpICAqLworICAgICAgcnR4X2lu c24gKmxvb3BfanVtcG92ZXIgPSBCQl9FTkQgKHByZV9sb29wX2JiKTsKKyAgICAgIGlmICghKEpV TVBfUCAobG9vcF9qdW1wb3ZlcikKKwkgICAgJiYgR0VUX0NPREUgKFhFWFAgKFBBVFRFUk4gKGxv b3BfanVtcG92ZXIpLCAxKSkgPT0gSUZfVEhFTl9FTFNFCisJICAgICYmIChHRVRfQ09ERSAoWEVY UCAoWEVYUCAoUEFUVEVSTiAobG9vcF9qdW1wb3ZlciksIDEpLCAwKSkgPT0gTEUKKwkJfHwgR0VU X0NPREUgKFhFWFAgKFhFWFAgKFBBVFRFUk4gKGxvb3BfanVtcG92ZXIpLCAxKSwgMCkpID09IEdU CisJCXx8IEdFVF9DT0RFIChYRVhQIChYRVhQIChQQVRURVJOIChsb29wX2p1bXBvdmVyKSwgMSks IDApKSA9PSBFUSkpKQorCXJldHVybiBOVUxMOworICAgIH0KKworICAvKiBFdmVyeXRoaW5nIGxv b2tzIHZhbGlkLiAgKi8KKyAgcmV0dXJuIHZjdHBfaW5zbjsKK30KKworLyogRnVuY3Rpb24gdG8g Y2hlY2sgYSBsb29wJ3Mgc3RydWN0dXJlIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIGNhbmRpZGF0 ZSBmb3IKKyAgIGFuIE1WRSBUYWlsIFByZWRpY2F0ZWQgTG93LU92ZXJoZWFkIExvb3AuICBSZXR1 cm5zIHRoZSBsb29wJ3MgVkNUUF9JTlNOIGlmCisgICBpdCBpcyB2YWxpZCwgb3IgTlVMTCBpZiBp dCBpc24ndC4gICovCisKK3N0YXRpYyBydHhfaW5zbioKK2FybV9tdmVfbG9vcF92YWxpZF9mb3Jf ZGxzdHAgKGJhc2ljX2Jsb2NrIGJvZHkpCit7CisgIC8qIERvbG9vcCBjYW4gb25seSBiZSBkb25l ICJlbGVtZW50d2lzZSIgd2l0aCBwcmVkaWNhdGVkIGRsc3RwL2xldHAgaWYgaXQKKyAgICAgY29u dGFpbnMgYSBWQ1RQIG9uIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcHJvY2Vzc2VkIGJ5IHRoZSBs b29wLgorICAgICBGaW5kIHRoZSBWQ1RQIHByZWRpY2F0ZSBnZW5lcmF0aW9uIGluc2lkZSB0aGUg bG9vcCBib2R5IEJCLiAgKi8KKyAgcnR4X2luc24gKnZjdHBfaW5zbiA9IGFybV9tdmVfZ2V0X2xv b3BfdmN0cCAoYm9keSk7CisgIGlmICghdmN0cF9pbnNuKQorICAgIHJldHVybiBOVUxMOworCisg IC8qIFRoZXJlIGFyZSBvbmx5IHR3byB0eXBlcyBvZiBsb29wcyB0aGF0IGNhbiBiZSB0dXJuZWQg aW50byBkbHN0cC9sZXRwCisgICAgIGxvb3BzOgorICAgICAgQSkgTG9vcHMgb2YgdGhlIGZvcm06 CisJICB3aGlsZSAobnVtX29mX2VsZW0gPiAwKQorCSAgICB7CisJICAgICAgcCA9IHZjdHA8c2l6 ZT4gKG51bV9vZl9lbGVtKQorCSAgICAgIG4gLT0gbnVtX29mX2xhbmVzOworCSAgICB9CisgICAg ICBCKSBMb29wcyBvZiB0aGUgZm9ybToKKwkgIGludCBudW1fb2ZfaXRlcnMgPSAobnVtX29mX2Vs ZW0gKyBudW1fb2ZfbGFuZXMgLSAxKSAvIG51bV9vZl9sYW5lcworCSAgZm9yIChpID0gMDsgaSA8 IG51bV9vZl9pdGVyczsgaSsrKQorCSAgICB7CisJICAgICAgcCA9IHZjdHA8c2l6ZT4gKG51bV9v Zl9lbGVtKQorCSAgICAgIG4gLT0gbnVtX29mX2xhbmVzOworCSAgICB9CisKKyAgICBUaGVuLCBk ZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbG9vcCBhYm92ZSB3ZSBuZWVkIHdpbGwgbmVlZCB0byBk bworICAgIGRpZmZlcmVudCBzZXRzIG9mIGNoZWNrcy4gICovCisgIGl2X2FuYWx5c2lzX2xvb3Bf aW5pdCAoYm9keS0+bG9vcF9mYXRoZXIpOworCisgIC8qIEluIG9yZGVyIHRvIGZpbmQgb3V0IGlm IHRoZSBsb29wIGlzIG9mIHR5cGUgQSBvciBCIGFib3ZlIGxvb2sgZm9yIHRoZQorICAgICBsb29w IGNvdW50ZXI6IGl0IHdpbGwgZWl0aGVyIGJlIGluY3JlbWVudGluZyBieSBvbmUgcGVyIGl0ZXJh dGlvbiBvcgorICAgICBpdCB3aWxsIGJlIGRlY3JlbWVudGluZyBieSBudW1fb2ZfbGFuZXMuICBX ZSBjYW4gZmluZCB0aGUgbG9vcCBjb3VudGVyCisgICAgIGluIHRoZSBjb25kaXRpb24gYXQgdGhl IGVuZCBvZiB0aGUgbG9vcC4gICovCisgIHJ0eF9pbnNuICpsb29wX2NvbmQgPSBwcmV2X25vbm5v dGVfbm9uZGVidWdfaW5zbl9iYiAoQkJfRU5EIChib2R5KSk7CisgIGlmICghKGNjX3JlZ2lzdGVy IChYRVhQIChQQVRURVJOIChsb29wX2NvbmQpLCAwKSwgVk9JRG1vZGUpCisJJiYgR0VUX0NPREUg KFhFWFAgKFBBVFRFUk4gKGxvb3BfY29uZCksIDEpKSA9PSBDT01QQVJFKSkKKyAgICByZXR1cm4g TlVMTDsKKworICAvKiBUaGUgb3BlcmFuZHMgaW4gdGhlIGNvbmRpdGlvbjogIFRyeSB0byBpZGVu dGlmeSB3aGljaCBvbmUgaXMgdGhlCisgICAgIGNvbnN0YW50IGFuZCB3aGljaCBpcyB0aGUgY291 bnRlciBhbmQgcnVuIElWIGFuYWx5c2lzIG9uIHRoZSBsYXR0ZXIuICAqLworICBydHggY29uZF9h cmdfMSA9IFhFWFAgKFhFWFAgKFBBVFRFUk4gKGxvb3BfY29uZCksIDEpLCAwKTsKKyAgcnR4IGNv bmRfYXJnXzIgPSBYRVhQIChYRVhQIChQQVRURVJOIChsb29wX2NvbmQpLCAxKSwgMSk7CisKKyAg cnR4IGxvb3BfY29uZF9jb25zdGFudDsKKyAgcnR4IGxvb3BfY291bnRlcjsKKyAgY2xhc3MgcnR4 X2l2IGNvbmRfY291bnRlcl9pdiwgY29uZF90ZW1wX2l2OworCisgIGlmIChDT05TVF9JTlRfUCAo Y29uZF9hcmdfMSkpCisgICAgeworICAgICAgLyogY29uZF9hcmdfMSBpcyB0aGUgY29uc3RhbnQg YW5kIGNvbmRfYXJnXzIgaXMgdGhlIGNvdW50ZXIuICAqLworICAgICAgbG9vcF9jb25kX2NvbnN0 YW50ID0gY29uZF9hcmdfMTsKKyAgICAgIGxvb3BfY291bnRlciA9IGNvbmRfYXJnXzI7CisgICAg ICBpdl9hbmFseXplIChsb29wX2NvbmQsIGFzX2E8c2NhbGFyX2ludF9tb2RlPiAoR0VUX01PREUg KGNvbmRfYXJnXzIpKSwKKwkJICBjb25kX2FyZ18yLCAmY29uZF9jb3VudGVyX2l2KTsKKyAgICB9 CisgIGVsc2UgaWYgKENPTlNUX0lOVF9QIChjb25kX2FyZ18yKSkKKyAgICB7CisgICAgICAvKiBj b25kX2FyZ18yIGlzIHRoZSBjb25zdGFudCBhbmQgY29uZF9hcmdfMSBpcyB0aGUgY291bnRlci4g ICovCisgICAgICBsb29wX2NvbmRfY29uc3RhbnQgPSBjb25kX2FyZ18yOworICAgICAgbG9vcF9j b3VudGVyID0gY29uZF9hcmdfMTsKKyAgICAgIGl2X2FuYWx5emUgKGxvb3BfY29uZCwgYXNfYTxz Y2FsYXJfaW50X21vZGU+IChHRVRfTU9ERSAoY29uZF9hcmdfMSkpLAorCQkgIGNvbmRfYXJnXzEs ICZjb25kX2NvdW50ZXJfaXYpOworICAgIH0KKyAgZWxzZSBpZiAoUkVHX1AgKGNvbmRfYXJnXzEp ICYmIFJFR19QIChjb25kX2FyZ18yKSkKKyAgICB7CisgICAgICAvKiBJZiBib3RoIG9wZXJhbmRz IHRvIHRoZSBjb21wYXJlIGFyZSBSRUdzLCB3ZSBjYW4gc2FmZWx5CisJIHJ1biBJViBhbmFseXNp cyBvbiBib3RoIGFuZCB0aGVuIGRldGVybWluZSB3aGljaCBpcyB0aGUKKwkgY29uc3RhbnQgYnkg bG9va2luZyBhdCB0aGUgc3RlcC4KKwkgRmlyc3QgYXNzdW1lIGNvbmRfYXJnXzEgaXMgdGhlIGNv dW50ZXIuICAqLworICAgICAgbG9vcF9jb3VudGVyID0gY29uZF9hcmdfMTsKKyAgICAgIGxvb3Bf Y29uZF9jb25zdGFudCA9IGNvbmRfYXJnXzI7CisgICAgICBpdl9hbmFseXplIChsb29wX2NvbmQs IGFzX2E8c2NhbGFyX2ludF9tb2RlPiAoR0VUX01PREUgKGNvbmRfYXJnXzEpKSwKKwkJICBjb25k X2FyZ18xLCAmY29uZF9jb3VudGVyX2l2KTsKKyAgICAgIGl2X2FuYWx5emUgKGxvb3BfY29uZCwg YXNfYTxzY2FsYXJfaW50X21vZGU+IChHRVRfTU9ERSAoY29uZF9hcmdfMikpLAorCQkgIGNvbmRf YXJnXzIsICZjb25kX3RlbXBfaXYpOworCisgICAgICBpZiAoIUNPTlNUX0lOVF9QIChjb25kX2Nv dW50ZXJfaXYuc3RlcCkgfHwgIUNPTlNUX0lOVF9QIChjb25kX3RlbXBfaXYuc3RlcCkpCisJcmV0 dXJuIE5VTEw7CisgICAgICAvKiBMb29rIGF0IHRoZSBzdGVwcyBhbmQgc3dhcCBhcm91bmQgdGhl IHJ0eCdzIGlmIG5lZWRlZC4gIEVycm9yIG91dCBpZgorCSBvbmUgb2YgdGhlbSBjYW5ub3QgYmUg aWRlbnRpZmllZCBhcyBjb25zdGFudC4gICovCisgICAgICBpZiAoSU5UVkFMIChjb25kX2NvdW50 ZXJfaXYuc3RlcCkgIT0gMCAmJiBJTlRWQUwgKGNvbmRfdGVtcF9pdi5zdGVwKSAhPSAwKQorCXJl dHVybiBOVUxMOworICAgICAgaWYgKElOVFZBTCAoY29uZF9jb3VudGVyX2l2LnN0ZXApID09IDAg JiYgSU5UVkFMIChjb25kX3RlbXBfaXYuc3RlcCkgIT0gMCkKKwl7CisJICBsb29wX2NvdW50ZXIg PSBjb25kX2FyZ18yOworCSAgbG9vcF9jb25kX2NvbnN0YW50ID0gY29uZF9hcmdfMTsKKwkgIGNv bmRfY291bnRlcl9pdiA9IGNvbmRfdGVtcF9pdjsKKwl9CisgICAgfQorICBlbHNlCisgICAgcmV0 dXJuIE5VTEw7CisKKyAgaWYgKCFSRUdfUCAobG9vcF9jb3VudGVyKSkKKyAgICByZXR1cm4gTlVM TDsKKyAgaWYgKCEoUkVHX1AgKGxvb3BfY29uZF9jb25zdGFudCkgfHwgQ09OU1RfSU5UX1AgKGxv b3BfY29uZF9jb25zdGFudCkpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIE5vdyB3ZSBoYXZl IGV4dHJhY3RlZCB0aGUgSVYgc3RlcCBvZiB0aGUgbG9vcCBjb3VudGVyLCBjYWxsIHRoZQorICAg ICBhcHByb3ByaWF0ZSBjaGVja2luZyBmdW5jdGlvbi4gICovCisgIGlmIChJTlRWQUwgKGNvbmRf Y291bnRlcl9pdi5zdGVwKSA+IDApCisgICAgcmV0dXJuIGFybV9tdmVfZGxzdHBfY2hlY2tfaW5j X2NvdW50ZXIgKGJvZHksIHZjdHBfaW5zbiwKKwkJCQkJICAgIGxvb3BfY29uZF9jb25zdGFudCwg bG9vcF9jb3VudGVyKTsKKyAgZWxzZSBpZiAoSU5UVkFMIChjb25kX2NvdW50ZXJfaXYuc3RlcCkg PCAwKQorICAgIHJldHVybiBhcm1fbXZlX2Rsc3RwX2NoZWNrX2RlY19jb3VudGVyIChib2R5LCB2 Y3RwX2luc24sCisJCQkJCSAgICBsb29wX2NvbmRfY29uc3RhbnQsIGxvb3BfY291bnRlcik7Cisg IGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogUHJlZGljdCB3aGV0aGVyIHRoZSBnaXZl biBsb29wIGluIGdpbXBsZSB3aWxsIGJlIHRyYW5zZm9ybWVkIGluIHRoZSBSVEwKKyAgIGRvbG9v cF9vcHRpbWl6ZSBwYXNzLiAgKi8KKworc3RhdGljIGJvb2wKK2FybV9wcmVkaWN0X2RvbG9vcF9w IChzdHJ1Y3QgbG9vcCAqbG9vcCkKK3sKKyAgZ2NjX2Fzc2VydCAobG9vcCk7CisgIC8qIE9uIGFy bSwgdGFyZ2V0bS5jYW5fdXNlX2RvbG9vcF9wIGlzIGFjdHVhbGx5CisgICAgIGNhbl91c2VfZG9s b29wX2lmX2lubmVybW9zdC4gIEVuc3VyZSB0aGUgbG9vcCBpcyBpbm5lcm1vc3QsCisgICAgIGl0 IGlzIHZhbGlkIGFuZCBhcyBwZXIgYXJtX3RhcmdldF9iYl9va19mb3JfbG9iIGFuZCB0aGUKKyAg ICAgY29ycmVjdCBhcmNoaXRlY3R1cmUgZmxhZ3MgYXJlIGVuYWJsZWQuICAqLworICBpZiAoIShU QVJHRVRfMzJCSVQgJiYgVEFSR0VUX0hBVkVfTE9CICYmIG9wdGltaXplID4gMCkpCisgICAgewor ICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKwlmcHJp bnRmIChkdW1wX2ZpbGUsICJQcmVkaWN0IGRvbG9vcCBmYWlsdXJlIGR1ZSB0byIKKwkJCSAgICAi IHRhcmdldCBhcmNoaXRlY3R1cmUgb3Igb3B0aW1pc2F0aW9uIGZsYWdzLlxuIik7CisgICAgICBy ZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlIGlmIChsb29wLT5pbm5lciAhPSBOVUxMKQorICAg IHsKKyAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCisJ ZnByaW50ZiAoZHVtcF9maWxlLCAiUHJlZGljdCBkb2xvb3AgZmFpbHVyZSBkdWUgdG8iCisJCQkg ICAgIiBsb29wIG5lc3RpbmcuXG4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIGVs c2UgaWYgKCFhcm1fdGFyZ2V0X2JiX29rX2Zvcl9sb2IgKGxvb3AtPmhlYWRlci0+bmV4dF9iYikp CisgICAgeworICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxT KSkKKwlmcHJpbnRmIChkdW1wX2ZpbGUsICJQcmVkaWN0IGRvbG9vcCBmYWlsdXJlIGR1ZSB0byIK KwkJCSAgICAiIGxvb3AgYmIgY29tcGxleGl0eS5cbiIpOworICAgICAgcmV0dXJuIGZhbHNlOwor ICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogSW1wbGVtZW50IHRhcmdldG0ubG9vcF91 bnJvbGxfYWRqdXN0LiAgVXNlIHRoaXMgdG8gYmxvY2sgdW5yb2xsaW5nIG9mIGxvb3BzCisgICB0 aGF0IG1heSBsYXRlciBiZSB0dXJuZWQgaW50byBNVkUgVGFpbCBQcmVkaWNhdGVkIExvdyBPdmVy aGVhZCBMb29wcy4gIFRoZQorICAgcGVyZm9ybWFuY2UgYmVuZWZpdCBvZiBhbiBNVkUgTG9MIGlz IGxpa2VseSB0byBiZSBtdWNoIGhpZ2hlciB0aGFuIHRoYXQgb2YKKyAgIHRoZSB1bnJvbGxpbmcu ICAqLworCit1bnNpZ25lZAorYXJtX2xvb3BfdW5yb2xsX2FkanVzdCAodW5zaWduZWQgbnVucm9s bCwgc3RydWN0IGxvb3AgKmxvb3ApCit7CisgIGlmIChUQVJHRVRfSEFWRV9NVkUKKyAgICAgICYm IGFybV90YXJnZXRfYmJfb2tfZm9yX2xvYiAobG9vcC0+bGF0Y2gpCisgICAgICAmJiBhcm1fbXZl X2xvb3BfdmFsaWRfZm9yX2Rsc3RwIChsb29wLT5oZWFkZXIpKQorICAgIHJldHVybiAwOworICBl bHNlCisgICAgcmV0dXJuIG51bnJvbGw7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGhhZGxlIGVtaXR0 aW5nIGEgVlBULXVucHJlZGljYXRlZCB2ZXJzaW9uIG9mIGEgVlBULXByZWRpY2F0ZWQKKyAgIGlu c24gdG8gYSBzZXF1ZW5jZS4gICovCisKK3N0YXRpYyBib29sCithcm1fZW1pdF9tdmVfdW5wcmVk aWNhdGVkX2luc25fdG9fc2VxIChydHhfaW5zbiogaW5zbikKK3sKKyAgcnR4IGluc25fdnByX3Jl Z19vcGVyYW5kID0gYXJtX2dldF9yZXF1aXJlZF92cHJfcmVnX3BhcmFtIChpbnNuKTsKKyAgaW50 IG5ld19pY29kZSA9IGdldF9hdHRyX212ZV91bnByZWRpY2F0ZWRfaW5zbiAoaW5zbik7CisgIGlm ICghaW5fc2VxdWVuY2VfcCAoKQorICAgICAgfHwgIU1WRV9WUFRfUFJFRElDQVRFRF9JTlNOX1Ag KGluc24pCisgICAgICB8fCAoIWluc25fdnByX3JlZ19vcGVyYW5kKQorICAgICAgfHwgKCFuZXdf aWNvZGUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBleHRyYWN0X2luc24gKGluc24pOworICBy dHggYXJyWzhdOworICBpbnQgaiA9IDA7CisKKyAgLyogV2hlbiB0cmFuc2Zvcm1pbmcgYSBWUFQt cHJlZGljYXRlZCBpbnN0cnVjdGlvbgorICAgICBpbnRvIGl0cyB1bnByZWRpY2F0ZWQgZXF1aXZh bGVudCB3ZSBuZWVkIHRvIGRyb3AKKyAgICAgdGhlIFZQUiBvcGVyYW5kIGFuZCB3ZSBtYXkgbmVl ZCB0byBhbHNvIGRyb3AgYQorICAgICBtZXJnZSAidnVuaW5pdCIgaW5wdXQgb3BlcmFuZCwgZGVw ZW5kaW5nIG9uIHRoZQorICAgICBpbnN0cnVjdGlvbiBwYXR0ZXJuLiAgSGVyZSBlbnN1cmUgdGhh dCB3ZSBoYXZlIGF0CisgICAgIG1vc3QgYSB0d28tb3BlcmFuZCBkaWZmZXJlbmNlIGJldHdlZW4g dGhlIHR3bworICAgICBpbnN0cnVuY3Rpb25zLiAgKi8KKyAgaW50IG5fb3BlcmFuZHNfZGlmZgor ICAgICAgPSByZWNvZ19kYXRhLm5fb3BlcmFuZHMgLSBpbnNuX2RhdGFbbmV3X2ljb2RlXS5uX29w ZXJhbmRzOworICBpZiAoIShuX29wZXJhbmRzX2RpZmYgPiAwICYmIG5fb3BlcmFuZHNfZGlmZiA8 PSAyKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogVGhlbiwgbG9vcCB0aHJvdWdoIHRoZSBv cGVyYW5kcyBvZiB0aGUgcHJlZGljYXRlZAorICAgICBpbnN0cnVjdGlvbiwgYW5kIHJldGFpbiB0 aGUgb25lcyB0aGF0IG1hcCB0byB0aGUKKyAgICAgdW5wcmVkaWNhdGVkIGluc3RydWN0aW9uLiAg Ki8KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvZ19kYXRhLm5fb3BlcmFuZHM7IGkrKykKKyAg ICB7CisgICAgICAvKiBJZ25vcmUgdGhlIFZQUiBhbmQsIGlmIG5lZWRlZCwgdGhlIHZ1bmluaXQK Kwkgb3BlcmFuZC4gICovCisgICAgICBpZiAoaW5zbl92cHJfcmVnX29wZXJhbmQgPT0gcmVjb2df ZGF0YS5vcGVyYW5kW2ldCisJICB8fCAobl9vcGVyYW5kc19kaWZmID09IDIKKwkgICAgICAmJiAh c3RyY21wIChyZWNvZ19kYXRhLmNvbnN0cmFpbnRzW2ldLCAiMCIpKSkKKwljb250aW51ZTsKKyAg ICAgIGVsc2UKKwl7CisJICBhcnJbal0gPSByZWNvZ19kYXRhLm9wZXJhbmRbaV07CisJICBqKys7 CisJfQorICAgIH0KKworICAvKiBGaW5hbGx5LCBlbWl0IHRoZSB1cHJlZGljYXRlZCBpbnN0cnVj dGlvbi4gICovCisgIHN3aXRjaCAoaikKKyAgICB7CisgICAgICBjYXNlIDE6CisJZW1pdF9pbnNu IChHRU5fRkNOIChuZXdfaWNvZGUpIChhcnJbMF0pKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMjoK KwllbWl0X2luc24gKEdFTl9GQ04gKG5ld19pY29kZSkgKGFyclswXSwgYXJyWzFdKSk7CisJYnJl YWs7CisgICAgICBjYXNlIDM6CisJZW1pdF9pbnNuIChHRU5fRkNOIChuZXdfaWNvZGUpIChhcnJb MF0sIGFyclsxXSwgYXJyWzJdKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDQ6CisJZW1pdF9pbnNu IChHRU5fRkNOIChuZXdfaWNvZGUpIChhcnJbMF0sIGFyclsxXSwgYXJyWzJdLAorCQkJCQlhcnJb M10pKTsKKwlicmVhazsKKyAgICAgIGNhc2UgNToKKwllbWl0X2luc24gKEdFTl9GQ04gKG5ld19p Y29kZSkgKGFyclswXSwgYXJyWzFdLCBhcnJbMl0sIGFyclszXSwKKwkJCQkJYXJyWzRdKSk7CisJ YnJlYWs7CisgICAgICBjYXNlIDY6CisJZW1pdF9pbnNuIChHRU5fRkNOIChuZXdfaWNvZGUpIChh cnJbMF0sIGFyclsxXSwgYXJyWzJdLCBhcnJbM10sCisJCQkJCWFycls0XSwgYXJyWzVdKSk7CisJ YnJlYWs7CisgICAgICBjYXNlIDc6CisJZW1pdF9pbnNuIChHRU5fRkNOIChuZXdfaWNvZGUpIChh cnJbMF0sIGFyclsxXSwgYXJyWzJdLCBhcnJbM10sCisJCQkJCWFycls0XSwgYXJyWzVdLCBhcnJb Nl0pKTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJZ2NjX3VucmVhY2hhYmxlICgpOworICAg IH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdoZW4gYSB2Y3RwIGluc24gaXMgdXNlZCwgaXRz IG91dCBpcyBvZnRlbiBmb2xsb3dlZCBieQorICAgYSB6ZXJvLWV4dGVuZCBpbnNuIHRvIFNJbW9k ZSwgd2hpY2ggaXMgdGhlbiBTVUJSRUcnZCBpbnRvIGEKKyAgIHZlY3RvciBmb3JtIG9mIG1vZGUg VkFMSURfTVZFX1BSRURfTU9ERTogdGhpcyB2ZWN0b3IgZm9ybSBpcworICAgd2hhdCBpcyB0aGVu IHVzZWQgYXMgYW4gaW5wdXQgdG8gdGhlIGluc3RydWN0aW9ucyB3aXRoaW4gdGhlCisgICBsb29w LiAgSGVuY2UsIHN0b3JlIHRoYXQgdmVjdG9yIGZvcm0gb2YgdGhlIFZQUiByZWcgaW50bworICAg dmN0cF92cHJfZ2VuZXJhdGVkLCBzbyB0aGF0IHdlIGNhbiBtYXRjaCBpdCB3aXRoIGluc3RydWN0 aW9ucworICAgaW4gdGhlIGxvb3AgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIHByZWRpY2F0ZWQg b24gdGhpcyBzYW1lCisgICBWUFIuICBJZiB0aGVyZSBpcyBubyB6ZXJvLWV4dGVuZCBhbmQgc3Vi cmVnIG9yIGl0IGlzIG90aGVyd2lzZQorICAgaW52YWxpZCwgdGhlbiByZXR1cm4gTlVMTCB0byBj YW5jZWwgdGhlIGRsc3RwIHRyYW5zZm9ybS4gICovCisKK3N0YXRpYyBydHgKK2FybV9tdmVfZ2V0 X3ZjdHBfdmVjX2Zvcm0gKHJ0eF9pbnNuICppbnNuKQoreworICBydHggdmN0cF92cHJfZ2VuZXJh dGVkID0gTlVMTF9SVFg7CisgIHJ0eF9pbnNuICpuZXh0X3VzZTEgPSBOVUxMOworICBkZl9yZWYg dXNlOworICBmb3IgKHVzZQorCT0gREZfUkVHX1VTRV9DSEFJTgorCSAgIChERl9SRUZfUkVHTk8g KERGX0lOU05fSU5GT19ERUZTIChERl9JTlNOX0lORk9fR0VUIChpbnNuKSkpKTsKKyAgICAgICB1 c2U7IHVzZSA9IERGX1JFRl9ORVhUX1JFRyAodXNlKSkKKyAgICBpZiAoIW5leHRfdXNlMSAmJiBO T05ERUJVR19JTlNOX1AgKERGX1JFRl9JTlNOICh1c2UpKSkKKyAgICAgIG5leHRfdXNlMSA9IERG X1JFRl9JTlNOICh1c2UpOworCisgIGlmIChzaW5nbGVfc2V0IChuZXh0X3VzZTEpCisgICAgICAm JiBHRVRfQ09ERSAoU0VUX1NSQyAoc2luZ2xlX3NldCAobmV4dF91c2UxKSkpID09IFpFUk9fRVhU RU5EKQorICAgIHsKKyAgICAgIHJ0eF9pbnNuICpuZXh0X3VzZTIgPSBOVUxMOworICAgICAgZm9y ICh1c2UKKwkgICAgPSBERl9SRUdfVVNFX0NIQUlOCisJICAgICAgIChERl9SRUZfUkVHTk8KKwkJ IChERl9JTlNOX0lORk9fREVGUyAoREZfSU5TTl9JTkZPX0dFVCAobmV4dF91c2UxKSkpKTsKKwkg ICB1c2U7IHVzZSA9IERGX1JFRl9ORVhUX1JFRyAodXNlKSkKKwlpZiAoIW5leHRfdXNlMiAmJiBO T05ERUJVR19JTlNOX1AgKERGX1JFRl9JTlNOICh1c2UpKSkKKwkgIG5leHRfdXNlMiA9IERGX1JF Rl9JTlNOICh1c2UpOworCisgICAgICBpZiAoc2luZ2xlX3NldCAobmV4dF91c2UyKQorCSAgJiYg R0VUX0NPREUgKFNFVF9TUkMgKHNpbmdsZV9zZXQgKG5leHRfdXNlMikpKSA9PSBTVUJSRUcpCisJ dmN0cF92cHJfZ2VuZXJhdGVkID0gWEVYUCAoUEFUVEVSTiAobmV4dF91c2UyKSwgMCk7CisgICAg fQorCisgIGlmICghdmN0cF92cHJfZ2VuZXJhdGVkIHx8ICFSRUdfUCAodmN0cF92cHJfZ2VuZXJh dGVkKQorICAgICAgfHwgIVZBTElEX01WRV9QUkVEX01PREUgKEdFVF9NT0RFICh2Y3RwX3Zwcl9n ZW5lcmF0ZWQpKSkKKyAgICByZXR1cm4gTlVMTF9SVFg7CisKKyAgcmV0dXJuIHZjdHBfdnByX2dl bmVyYXRlZDsKK30KKworLyogQXR0ZW1wdCB0byB0cmFuc2Zvcm0gdGhlIGxvb3AgY29udGVudHMg b2YgbG9vcCBiYXNpYyBibG9jayBmcm9tIFZQVAorICAgcHJlZGljYXRlZCBpbnNucyBpbnRvIHVu cHJlZGljYXRlZCBpbnNucyBmb3IgYSBkbHN0cC9sZXRwIGxvb3AuICAqLworCitydHgKK2FybV9h dHRlbXB0X2Rsc3RwX3RyYW5zZm9ybSAocnR4IGxhYmVsKQoreworICBiYXNpY19ibG9jayBib2R5 ID0gQkxPQ0tfRk9SX0lOU04gKGxhYmVsKS0+cHJldl9iYjsKKworICAvKiBFbnN1cmUgdGhhdCB0 aGUgYmIgaXMgd2l0aGluIGEgbG9vcCB0aGF0IGhhcyBhbGwgcmVxdWlyZWQgbWV0YWRhdGEuICAq LworICBpZiAoIWJvZHktPmxvb3BfZmF0aGVyIHx8ICFib2R5LT5sb29wX2ZhdGhlci0+aGVhZGVy CisgICAgICB8fCAhYm9keS0+bG9vcF9mYXRoZXItPnNpbXBsZV9sb29wX2Rlc2MpCisgICAgcmV0 dXJuIEdFTl9JTlQgKDEpOworCisgIHJ0eF9pbnNuICp2Y3RwX2luc24gPSBhcm1fbXZlX2xvb3Bf dmFsaWRfZm9yX2Rsc3RwIChib2R5KTsKKyAgaWYgKCF2Y3RwX2luc24pCisgICAgcmV0dXJuIEdF Tl9JTlQgKDEpOworICBydHggdmN0cF9yZWcgPSBYVkVDRVhQIChYRVhQIChQQVRURVJOICh2Y3Rw X2luc24pLCAxKSwgMCwgMCk7CisKKyAgcnR4IHZjdHBfdnByX2dlbmVyYXRlZCA9IGFybV9tdmVf Z2V0X3ZjdHBfdmVjX2Zvcm0gKHZjdHBfaW5zbik7CisgIGlmICghdmN0cF92cHJfZ2VuZXJhdGVk KQorICAgIHJldHVybiBHRU5fSU5UICgxKTsKKworICAvKiBkZWNyZW1lbnR1bnVtIGlzIGFscmVh ZHkga25vd24gdG8gYmUgdmFsaWQgYXQgdGhpcyBwb2ludC4gICovCisgIGludCBkZWNyZW1lbnRu dW0gPSBhcm1fbXZlX2dldF92Y3RwX2xhbmVzIChQQVRURVJOICh2Y3RwX2luc24pKTsKKworICBy dHhfaW5zbiAqaW5zbiA9IDA7CisgIHJ0eF9pbnNuICpjdXJfaW5zbiA9IDA7CisgIHJ0eF9pbnNu ICpzZXE7CisgIGhhc2hfbWFwPGludF9oYXNoPGludCwgLTEsIC0yPiwgYm9vbD4qIHNhZmVfaW5z bl9tYXAKKwkJCQkJICA9IG5ldyBoYXNoX21hcDxpbnRfaGFzaDxpbnQsIC0xLCAtMj4sCisJCQkJ CQkJIGJvb2w+OworCisgIC8qIFNjYW4gdGhyb3VnaCB0aGUgaW5zbnMgaW4gdGhlIGxvb3AgYmIg YW5kIGVtaXQgdGhlIHRyYW5zZm9ybWVkIGJiCisgICAgIGluc25zIHRvIGEgc2VxdWVuY2UuICAq LworICBzdGFydF9zZXF1ZW5jZSAoKTsKKyAgRk9SX0JCX0lOU05TIChib2R5LCBpbnNuKQorICAg IHsKKyAgICAgIGlmIChHRVRfQ09ERSAoaW5zbikgPT0gQ09ERV9MQUJFTCB8fCBOT1RFX0lOU05f QkFTSUNfQkxPQ0tfUCAoaW5zbikpCisJY29udGludWU7CisgICAgICBlbHNlIGlmIChOT1RFX1Ag KGluc24pKQorCWVtaXRfbm90ZSAoKGVudW0gaW5zbl9ub3RlKU5PVEVfS0lORCAoaW5zbikpOwor ICAgICAgZWxzZSBpZiAoREVCVUdfSU5TTl9QIChpbnNuKSkKKwllbWl0X2RlYnVnX2luc24gKFBB VFRFUk4gKGluc24pKTsKKyAgICAgIGVsc2UgaWYgKCFJTlNOX1AgKGluc24pKQorCXsKKwkgIGVu ZF9zZXF1ZW5jZSAoKTsKKwkgIHJldHVybiBHRU5fSU5UICgxKTsKKwl9CisgICAgICAvKiBXaGVu IHdlIGZpbmQgdGhlIHZjdHAgaW5zdHJ1Y3Rpb246IGNvbnRpbnVlLiAgKi8KKyAgICAgIGVsc2Ug aWYgKGluc24gPT0gdmN0cF9pbnNuKQorCWNvbnRpbnVlOworICAgICAgIC8qIElmIHRoZSBpbnNu IHBhdHRlcm4gcmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgVlBSIHZhbHVlIGZyb20gdGhlCisJICB2 Y3RwIGFzIGFuIGlucHV0IHBhcmFtZXRlciBmb3IgcHJlZGljYXRpb24uICAqLworICAgICAgZWxz ZSBpZiAoYXJtX212ZV92ZWNfaW5zbl9pc19wcmVkaWNhdGVkX3dpdGhfdGhpc19wcmVkaWNhdGUK KwkJKGluc24sIHZjdHBfdnByX2dlbmVyYXRlZCkpCisJeworCSAgYm9vbCBzdWNjZXNzID0gYXJt X2VtaXRfbXZlX3VucHJlZGljYXRlZF9pbnNuX3RvX3NlcSAoaW5zbik7CisJICBpZiAoIXN1Y2Nl c3MpCisJICAgIHsKKwkgICAgICBlbmRfc2VxdWVuY2UgKCk7CisJICAgICAgcmV0dXJuIEdFTl9J TlQgKDEpOworCSAgICB9CisJfQorICAgICAgLyogSWYgdGhlIGluc24gaXNuJ3QgVlBUIHByZWRp Y2F0ZWQgb24gdmN0cF92cHJfZ2VuZXJhdGVkLCB3ZSBuZWVkIHRvCisJIG1ha2Ugc3VyZSB0aGF0 IGl0IGlzIHN0aWxsIHZhbGlkIHdpdGhpbiB0aGUgZGxzdHAvbGV0cCBsb29wLiAgKi8KKyAgICAg IGVsc2UKKwl7CisJICAvKiBJZiB0aGlzIGluc3RydWN0aW9uIFVTRS1zIHRoZSB2Y3RwX3Zwcl9n ZW5lcmF0ZWQgb3RoZXIgdGhhbiBmb3IKKwkgICAgIHByZWRpY2F0aW9uLCB0aGlzIGJsb2NrcyB0 aGUgdHJhbnNmb3JtYXRpb24gYXMgd2UgYXJlIG5vdCBhbGxvd2VkCisJICAgICB0byBvcHRpbWlz ZSB0aGUgVlBSIHZhbHVlIGF3YXkuICAqLworCSAgZGZfcmVmIGluc25fdXNlcyA9IE5VTEw7CisJ ICBGT1JfRUFDSF9JTlNOX1VTRSAoaW5zbl91c2VzLCBpbnNuKQorCSAgeworCSAgICBpZiAocnR4 X2VxdWFsX3AgKHZjdHBfdnByX2dlbmVyYXRlZCwgREZfUkVGX1JFRyAoaW5zbl91c2VzKSkpCisJ ICAgICAgeworCQllbmRfc2VxdWVuY2UgKCk7CisJCXJldHVybiBHRU5fSU5UICgxKTsKKwkgICAg ICB9CisJICB9CisJICAvKiBJZiB3aXRoaW4gdGhlIGxvb3Agd2UgaGF2ZSBhbiBNVkUgdmVjdG9y IGluc3RydWN0aW9uIHRoYXQgaXMKKwkgICAgIHVucHJlZGljYXRlZCwgdGhlIGRsc3RwL2xldHAg bG9vcGluZyB3aWxsIGFkZCBpbXBsaWNpdAorCSAgICAgcHJlZGljYXRpb24gdG8gaXQuICBUaGlz IHdpbGwgcmVzdWx0IGluIGEgY2hhbmdlIGluIGJlaGF2aW91cgorCSAgICAgb2YgdGhlIGluc3Ry dWN0aW9uLCBzbyB3ZSBuZWVkIHRvIGZpbmQgb3V0IGlmIGFueSBpbnN0cnVjdGlvbnMKKwkgICAg IHRoYXQgZmVlZCBpbnRvIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHdlcmUgaW1wbGljaXRseQor CSAgICAgcHJlZGljYXRlZC4gICovCisJICBpZiAoYXJtX212ZV9jaGVja19kZl9jaGFpbl9iYWNr X2Zvcl9pbXBsaWNfcHJlZGljCisJCShzYWZlX2luc25fbWFwLCBpbnNuLCB2Y3RwX3Zwcl9nZW5l cmF0ZWQpKQorCSAgICB7CisJICAgICAgaWYgKGFybV9tdmVfY2hlY2tfZGZfY2hhaW5fZndkX2Zv cl9pbXBsaWNfcHJlZGljX2ltcGFjdAorCQkgICAgKGluc24sIHZjdHBfdnByX2dlbmVyYXRlZCkp CisJCXsKKwkJICBlbmRfc2VxdWVuY2UgKCk7CisJCSAgcmV0dXJuIEdFTl9JTlQgKDEpOworCQl9 CisJICAgIH0KKwkgIGVtaXRfaW5zbiAoUEFUVEVSTiAoaW5zbikpOworCX0KKyAgICB9CisgIHNl cSA9IGdldF9pbnNucyAoKTsKKyAgZW5kX3NlcXVlbmNlICgpOworCisgIC8qIFJlLXdyaXRlIHRo ZSBlbnRpcmUgQkIgY29udGVudHMgd2l0aCB0aGUgdHJhbnNmb3JtZWQKKyAgICAgc2VxdWVuY2Uu ICAqLworICBGT1JfQkJfSU5TTlNfU0FGRSAoYm9keSwgaW5zbiwgY3VyX2luc24pCisgICAgaWYg KCEoR0VUX0NPREUgKGluc24pID09IENPREVfTEFCRUwgfHwgTk9URV9JTlNOX0JBU0lDX0JMT0NL X1AgKGluc24pKSkKKyAgICAgIGRlbGV0ZV9pbnNuIChpbnNuKTsKKyAgZm9yIChpbnNuID0gc2Vx OyBORVhUX0lOU04gKGluc24pOyBpbnNuID0gTkVYVF9JTlNOIChpbnNuKSkKKyAgICBpZiAoTk9U RV9QIChpbnNuKSkKKyAgICAgIGVtaXRfbm90ZV9hZnRlciAoKGVudW0gaW5zbl9ub3RlKU5PVEVf S0lORCAoaW5zbiksIEJCX0VORCAoYm9keSkpOworICAgIGVsc2UgaWYgKERFQlVHX0lOU05fUCAo aW5zbikpCisgICAgICBlbWl0X2RlYnVnX2luc25fYWZ0ZXIgKFBBVFRFUk4gKGluc24pLCBCQl9F TkQgKGJvZHkpKTsKKyAgICBlbHNlCisgICAgICBlbWl0X2luc25fYWZ0ZXIgKFBBVFRFUk4gKGlu c24pLCBCQl9FTkQgKGJvZHkpKTsKKworICBlbWl0X2p1bXBfaW5zbl9hZnRlciAoUEFUVEVSTiAo aW5zbiksIEJCX0VORCAoYm9keSkpOworICAvKiBUaGUgdHJhbnNmb3JtYXRpb24gaGFzIHN1Y2Nl ZWRlZCwgc28gbm93IG1vZGlmeSB0aGUgImNvdW50IgorICAgICAoYS5rLmEuIG5pdGVyX2V4cHIp IGZvciB0aGUgbWlkZGxlLWVuZC4gIEFsc28gc2V0IG5vbG9vcF9hc3N1bXB0aW9ucworICAgICB0 byBOVUxMIHRvIHN0b3AgdGhlIG1pZGRsZS1lbmQgZnJvbSBtYWtpbmcgYXNzdW1wdGlvbnMgYWJv dXQgdGhlCisgICAgIG51bWJlciBvZiBpdGVyYXRpb25zLiAgKi8KKyAgc2ltcGxlX2xvb3BfZGVz YyAoYm9keS0+bG9vcF9mYXRoZXIpLT5uaXRlcl9leHByID0gdmN0cF9yZWc7CisgIHNpbXBsZV9s b29wX2Rlc2MgKGJvZHktPmxvb3BfZmF0aGVyKS0+bm9sb29wX2Fzc3VtcHRpb25zID0gTlVMTF9S VFg7CisgIHJldHVybiBHRU5fSU5UIChkZWNyZW1lbnRudW0pOwogfQogCiAjaWYgQ0hFQ0tJTkdf UApkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9hcm0vYXJtLm1kIGIvZ2NjL2NvbmZpZy9hcm0vYXJt Lm1kCmluZGV4IGVlOTMxYWQ2ZWJkLi43MGZhZGUwZDBkYSAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZp Zy9hcm0vYXJtLm1kCisrKyBiL2djYy9jb25maWcvYXJtL2FybS5tZApAQCAtMTI0LDYgKzEyNCwx MSBAQAogOyBhbmQgbm90IGFsbCBBUk0gaW5zbnMgZG8uCiAoZGVmaW5lX2F0dHIgInByZWRpY2F0 ZWQiICJ5ZXMsbm8iIChjb25zdF9zdHJpbmcgIm5vIikpCiAKKworOyBBbiBhdHRyaWJ1dGUgdGhh dCBlbmNvZGVzIHRoZSBDT0RFX0ZPUl88aW5zbj4gb2YgdGhlIE1WRSBWUFQgdW5wcmVkaWNhdGVk Cis7IHZlcnNpb24gb2YgYSBWUFQtcHJlZGljYXRlZCBpbnN0cnVjdGlvbi4gIEZvciB1bnByZWRp Y2F0ZWQgaW5zdHJ1Y3Rpb25zCis7IHRoYXQgYXJlIHByZWRpY2FibGUsIGVuY29kZSB0aGUgc2Ft ZSBwYXR0ZXJuJ3MgQ09ERV9GT1JfPGluc24+IGFzIGEgd2F5IHRvCis7IGVuY29kZSB0aGF0IGl0 IGlzIGEgcHJlZGljYWJsZSBpbnN0cnVjdGlvbi4KIChkZWZpbmVfYXR0ciAibXZlX3VucHJlZGlj YXRlZF9pbnNuIiAiIiAoY29uc3RfaW50IDApKQogCiA7IExFTkdUSCBvZiBhbiBpbnN0cnVjdGlv biAoaW4gYnl0ZXMpCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2FybS9pdGVyYXRvcnMubWQgYi9n Y2MvY29uZmlnL2FybS9pdGVyYXRvcnMubWQKaW5kZXggNzFlNDM1Mzk2MTYuLjE0MDFiNTlkYzBi IDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2FybS9pdGVyYXRvcnMubWQKKysrIGIvZ2NjL2NvbmZp Zy9hcm0vaXRlcmF0b3JzLm1kCkBAIC0yNjYwLDYgKzI2NjAsOSBAQAogKGRlZmluZV9pbnRfYXR0 ciBtcnJjIFsoVlVOU1BFQ19NUlJDICJtcnJjIikgKFZVTlNQRUNfTVJSQzIgIm1ycmMyIildKQog KGRlZmluZV9pbnRfYXR0ciBNUlJDIFsoVlVOU1BFQ19NUlJDICJNUlJDIikgKFZVTlNQRUNfTVJS QzIgIk1SUkMyIildKQogCisoZGVmaW5lX2ludF9hdHRyIG1vZGUxIFsoRExTVFA4ICI4IikgKERM U1RQMTYgIjE2IikgKERMU1RQMzIgIjMyIikKKwkJCShETFNUUDY0ICI2NCIpXSkKKwogKGRlZmlu ZV9pbnRfYXR0ciBvcHN1ZmZpeCBbKFVOU1BFQ19ET1RfUyAiczgiKQogCQkJICAgKFVOU1BFQ19E T1RfVSAidTgiKQogCQkJICAgKFVOU1BFQ19ET1RfVVMgInM4IikKQEAgLTI5MDMsNiArMjkwNiw4 IEBACiAoZGVmaW5lX2ludF9pdGVyYXRvciBWU0hMQ1FfTSBbVlNITENRX01fUyBWU0hMQ1FfTV9V XSkKIChkZWZpbmVfaW50X2l0ZXJhdG9yIFZRU0hMVVFfTV9OIFtWUVNITFVRX01fTl9TXSkKIChk ZWZpbmVfaW50X2l0ZXJhdG9yIFZRU0hMVVFfTiBbVlFTSExVUV9OX1NdKQorKGRlZmluZV9pbnRf aXRlcmF0b3IgRExTVFAgW0RMU1RQOCBETFNUUDE2IERMU1RQMzIKKwkJCQkgICBETFNUUDY0XSkK IAogOzsgRGVmaW5lIGl0ZXJhdG9ycyBmb3IgVkNNTEEgb3BlcmF0aW9ucwogKGRlZmluZV9pbnRf aXRlcmF0b3IgVkNNTEFfT1AgW1VOU1BFQ19WQ01MQQpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9h cm0vbXZlLm1kIGIvZ2NjL2NvbmZpZy9hcm0vbXZlLm1kCmluZGV4IDg3Y2JmNmMxNzI2Li5kYzRi NjMwMWFhYSAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hcm0vbXZlLm1kCisrKyBiL2djYy9jb25m aWcvYXJtL212ZS5tZApAQCAtNjk5Nyw3ICs2OTk3LDcgQEAKICAgIChzZXQgKHJlZzpTSSBMUl9S RUdOVU0pCiAJKHBsdXM6U0kgKHJlZzpTSSBMUl9SRUdOVU0pIChtYXRjaF9kdXAgMCkpKQogICAg KGNsb2JiZXIgKHJlZzpDQyBDQ19SRUdOVU0pKV0KLSAgIlRBUkdFVF8zMkJJVCAmJiBUQVJHRVRf SEFWRV9MT0IgJiYgVEFSR0VUX0hBVkVfTVZFICYmIFRBUkdFVF9USFVNQjIiCisgICJUQVJHRVRf SEFWRV9NVkUiCiAgIHsKICAgICBpZiAoZ2V0X2F0dHJfbGVuZ3RoIChpbnNuKSA9PSA0KQogICAg ICAgcmV0dXJuICJsZXRwXHQlfGxyLCAlbDEiOwpAQCAtNzAxNyw1ICs3MDE3LDUgQEAKIAkgKHVu c3BlYzpTSSBbKG1hdGNoX29wZXJhbmQ6U0kgMCAic19yZWdpc3Rlcl9vcGVyYW5kIiAiciIpXQog CSAgRExTVFApKQogICBdCi0gICJUQVJHRVRfMzJCSVQgJiYgVEFSR0VUX0hBVkVfTE9CICYmIFRB UkdFVF9IQVZFX01WRSAmJiBUQVJHRVRfVEhVTUIyIgorICAiVEFSR0VUX0hBVkVfTVZFIgogICAi ZGxzdHAuPG1vZGUxPlx0JXxsciwgJTAiKQpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9hcm0vdGh1 bWIyLm1kIGIvZ2NjL2NvbmZpZy9hcm0vdGh1bWIyLm1kCmluZGV4IGUxZTAxM2JlZmE3Li4zNjhk NTEzOGNhMSAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hcm0vdGh1bWIyLm1kCisrKyBiL2djYy9j b25maWcvYXJtL3RodW1iMi5tZApAQCAtMTYxMyw3ICsxNjEzLDcgQEAKICAgICh1c2UgKG1hdGNo X29wZXJhbmQgMSAiIiAiIikpXSAgICAgOyBsYWJlbAogICAiVEFSR0VUXzMyQklUIgogICAiCi0g eworewogICAgLyogQ3VycmVudGx5IFNNUyByZWxpZXMgb24gdGhlIGRvLWxvb3AgcGF0dGVybiB0 byByZWNvZ25pemUgbG9vcHMKICAgICAgIHdoZXJlICgxKSB0aGUgY29udHJvbCBwYXJ0IGNvbnNp c3RzIG9mIGFsbCBpbnNucyBkZWZpbmluZyBhbmQvb3IKICAgICAgIHVzaW5nIGEgY2VydGFpbiAn Y291bnQnIHJlZ2lzdGVyIGFuZCAoMikgdGhlIGxvb3AgY291bnQgY2FuIGJlCkBAIC0xNjIzLDQx ICsxNjIzLDY1IEBACiAKICAgICAgIEFsc28gdXNlZCB0byBpbXBsZW1lbnQgdGhlIGxvdyBvdmVy IGhlYWQgbG9vcHMgZmVhdHVyZSwgd2hpY2ggaXMgcGFydCBvZgogICAgICAgdGhlIEFybXY4LjEt TSBNYWlubGluZSBMb3cgT3ZlcmhlYWQgQnJhbmNoIChMT0IpIGV4dGVuc2lvbi4gICovCi0gICBp ZiAob3B0aW1pemUgPiAwICYmIChmbGFnX21vZHVsb19zY2hlZCB8fCBUQVJHRVRfSEFWRV9MT0Ip KQotICAgewotICAgICBydHggczA7Ci0gICAgIHJ0eCBiY29tcDsKLSAgICAgcnR4IGxvY19yZWY7 Ci0gICAgIHJ0eCBjY19yZWc7Ci0gICAgIHJ0eCBpbnNuOwotICAgICBydHggY21wOwotCi0gICAg IGlmIChHRVRfTU9ERSAob3BlcmFuZHNbMF0pICE9IFNJbW9kZSkKLSAgICAgICBGQUlMOwotCi0g ICAgIHMwID0gb3BlcmFuZHMgWzBdOwotCi0gICAgIC8qIExvdyBvdmVyIGhlYWQgbG9vcCBpbnN0 cnVjdGlvbnMgcmVxdWlyZSB0aGUgZmlyc3Qgb3BlcmFuZCB0byBiZSBMUi4gICovCi0gICAgIGlm IChUQVJHRVRfSEFWRV9MT0IgJiYgYXJtX3RhcmdldF9pbnNuX29rX2Zvcl9sb2IgKG9wZXJhbmRz IFsxXSkpCi0gICAgICAgczAgPSBnZW5fcnR4X1JFRyAoU0ltb2RlLCBMUl9SRUdOVU0pOwotCi0g ICAgIGlmIChUQVJHRVRfVEhVTUIyKQotICAgICAgIGluc24gPSBlbWl0X2luc24gKGdlbl90aHVt YjJfYWRkc2kzX2NvbXBhcmUwIChzMCwgczAsIEdFTl9JTlQgKC0xKSkpOwotICAgICBlbHNlCi0g ICAgICAgaW5zbiA9IGVtaXRfaW5zbiAoZ2VuX2FkZHNpM19jb21wYXJlMCAoczAsIHMwLCBHRU5f SU5UICgtMSkpKTsKLQotICAgICBjbXAgPSBYVkVDRVhQIChQQVRURVJOIChpbnNuKSwgMCwgMCk7 Ci0gICAgIGNjX3JlZyA9IFNFVF9ERVNUIChjbXApOwotICAgICBiY29tcCA9IGdlbl9ydHhfTkUg KFZPSURtb2RlLCBjY19yZWcsIGNvbnN0MF9ydHgpOwotICAgICBsb2NfcmVmID0gZ2VuX3J0eF9M QUJFTF9SRUYgKFZPSURtb2RlLCBvcGVyYW5kcyBbMV0pOwotICAgICBlbWl0X2p1bXBfaW5zbiAo Z2VuX3J0eF9TRVQgKHBjX3J0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBn ZW5fcnR4X0lGX1RIRU5fRUxTRSAoVk9JRG1vZGUsIGJjb21wLAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NfcmVmLCBwY19ydHgpKSk7 Ci0gICAgIERPTkU7Ci0gICB9Ci0gZWxzZQotICAgRkFJTDsKLSB9IikKKyAgaWYgKG9wdGltaXpl ID4gMCAmJiAoZmxhZ19tb2R1bG9fc2NoZWQgfHwgVEFSR0VUX0hBVkVfTE9CKSkKKyAgICB7Cisg ICAgICBydHggczA7CisgICAgICBydHggYmNvbXA7CisgICAgICBydHggbG9jX3JlZjsKKyAgICAg IHJ0eCBjY19yZWc7CisgICAgICBydHggaW5zbjsKKyAgICAgIHJ0eCBjbXA7CisgICAgICBydHgg ZGVjcmVtZW50X251bTsKKworICAgICAgaWYgKEdFVF9NT0RFIChvcGVyYW5kc1swXSkgIT0gU0lt b2RlKQorCUZBSUw7CisKKyAgICAgIHMwID0gb3BlcmFuZHNbMF07CisKKyAgICAgICBpZiAoVEFS R0VUX0hBVkVfTE9CICYmIGFybV90YXJnZXRfYmJfb2tfZm9yX2xvYiAoQkxPQ0tfRk9SX0lOU04g KG9wZXJhbmRzWzFdKSkpCisJeworCSAgczAgPSBnZW5fcnR4X1JFRyAoU0ltb2RlLCBMUl9SRUdO VU0pOworCisJICAvKiBJZiB3ZSBoYXZlIGEgY29tcGF0aWJlIE1WRSB0YXJnZXQsIHRyeSBhbmQg YW5hbHlzZSB0aGUgbG9vcAorCSAgICAgY29udGVudHMgdG8gZGV0ZXJtaW5lIGlmIHdlIGNhbiB1 c2UgcHJlZGljYXRlZCBkbHN0cC9sZXRwCisJICAgICBsb29waW5nLiAgKi8KKwkgIGlmIChUQVJH RVRfSEFWRV9NVkUKKwkgICAgICAmJiAoZGVjcmVtZW50X251bSA9IGFybV9hdHRlbXB0X2Rsc3Rw X3RyYW5zZm9ybSAob3BlcmFuZHNbMV0pKQorCSAgICAgICYmIChJTlRWQUwgKGRlY3JlbWVudF9u dW0pICE9IDEpKQorCSAgICB7CisJICAgICAgaW5zbiA9IGVtaXRfaW5zbgorCQkgICAgICAoZ2Vu X3RodW1iMl9hZGRzaTNfY29tcGFyZTAKKwkJCSAgKHMwLCBzMCwgR0VOX0lOVCAoKC0xKSAqIChJ TlRWQUwgKGRlY3JlbWVudF9udW0pKSkpKTsKKwkgICAgICBjbXAgPSBYVkVDRVhQIChQQVRURVJO IChpbnNuKSwgMCwgMCk7CisJICAgICAgY2NfcmVnID0gU0VUX0RFU1QgKGNtcCk7CisJICAgICAg YmNvbXAgPSBnZW5fcnR4X0dFIChWT0lEbW9kZSwgY2NfcmVnLCBjb25zdDBfcnR4KTsKKwkgICAg ICBsb2NfcmVmID0gZ2VuX3J0eF9MQUJFTF9SRUYgKFZPSURtb2RlLCBvcGVyYW5kc1sxXSk7CisJ ICAgICAgZW1pdF9qdW1wX2luc24gKGdlbl9ydHhfU0VUIChwY19ydHgsCisJCQkJICAgICAgIGdl bl9ydHhfSUZfVEhFTl9FTFNFIChWT0lEbW9kZSwgYmNvbXAsCisJCQkJCQkJICAgICBsb2NfcmVm LCBwY19ydHgpKSk7CisJICAgICAgRE9ORTsKKwkgICAgfQorCX0KKworCS8qIE90aGVyd2lzZSwg dHJ5IHN0YW5kYXJkIGRlY3JlbWVudC1ieS1vbmUgZGxzL2xlIGxvb3BpbmcuICAqLworCWlmIChU QVJHRVRfVEhVTUIyKQorCSAgaW5zbiA9IGVtaXRfaW5zbiAoZ2VuX3RodW1iMl9hZGRzaTNfY29t cGFyZTAgKHMwLCBzMCwKKwkJCQkJCQlHRU5fSU5UICgtMSkpKTsKKwllbHNlCisJICBpbnNuID0g ZW1pdF9pbnNuIChnZW5fYWRkc2kzX2NvbXBhcmUwIChzMCwgczAsIEdFTl9JTlQgKC0xKSkpOwor CisJY21wID0gWFZFQ0VYUCAoUEFUVEVSTiAoaW5zbiksIDAsIDApOworCWNjX3JlZyA9IFNFVF9E RVNUIChjbXApOworCWJjb21wID0gZ2VuX3J0eF9ORSAoVk9JRG1vZGUsIGNjX3JlZywgY29uc3Qw X3J0eCk7CisJbG9jX3JlZiA9IGdlbl9ydHhfTEFCRUxfUkVGIChWT0lEbW9kZSwgb3BlcmFuZHNb MV0pOworCWVtaXRfanVtcF9pbnNuIChnZW5fcnR4X1NFVCAocGNfcnR4LAorCQkJCSAgICAgZ2Vu X3J0eF9JRl9USEVOX0VMU0UgKFZPSURtb2RlLCBiY29tcCwKKwkJCQkJCQkgICBsb2NfcmVmLCBw Y19ydHgpKSk7CisJRE9ORTsKKyAgICB9CisgIGVsc2UKKyAgICBGQUlMOworfSIpCiAKIChkZWZp bmVfaW5zbiAiKmNsZWFyX2Fwc3IiCiAgIFsodW5zcGVjX3ZvbGF0aWxlOlNJIFsoY29uc3RfaW50 IDApXSBWVU5TUEVDX0NMUk1fQVBTUikKQEAgLTE3NTUsNyArMTc3OSwzNyBAQAogICB7CiAgICAg aWYgKFJFR05PIChvcGVyYW5kc1swXSkgPT0gTFJfUkVHTlVNKQogICAgICAgewotCWVtaXRfaW5z biAoZ2VuX2Rsc19pbnNuIChvcGVyYW5kc1swXSkpOworCS8qIFBpY2sgb3V0IHRoZSBudW1iZXIg Ynkgd2hpY2ggd2UgYXJlIGRlY3JlbWVudGluZyB0aGUgbG9vcCBjb3VudGVyCisJICAgaW4gZXZl cnkgaXRlcmF0aW9uLiAgSWYgaXQncyA+IDEsIHRoZW4gdXNlIGRsc3RwLiAgKi8KKwlpbnQgY29u c3RfaW50X2RlY19udW0KKwkgICAgID0gYWJzIChJTlRWQUwgKFhFWFAgKFhFWFAgKFhWRUNFWFAg KFBBVFRFUk4gKG9wZXJhbmRzWzFdKSwgMCwgMSksCisJCQkJICAxKSwKKwkJCSAgICAxKSkpOwor CXN3aXRjaCAoY29uc3RfaW50X2RlY19udW0pCisJICB7CisJICAgIGNhc2UgMTY6CisJICAgICAg ZW1pdF9pbnNuIChnZW5fZGxzdHA4X2luc24gKG9wZXJhbmRzWzBdKSk7CisJICAgICAgYnJlYWs7 CisKKwkgICAgY2FzZSA4OgorCSAgICAgIGVtaXRfaW5zbiAoZ2VuX2Rsc3RwMTZfaW5zbiAob3Bl cmFuZHNbMF0pKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIDQ6CisJICAgICAgZW1pdF9p bnNuIChnZW5fZGxzdHAzMl9pbnNuIChvcGVyYW5kc1swXSkpOworCSAgICAgIGJyZWFrOworCisJ ICAgIGNhc2UgMjoKKwkgICAgICBlbWl0X2luc24gKGdlbl9kbHN0cDY0X2luc24gKG9wZXJhbmRz WzBdKSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAxOgorCSAgICAgIGVtaXRfaW5zbiAo Z2VuX2Rsc19pbnNuIChvcGVyYW5kc1swXSkpOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1 bHQ6CisJICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOworCSAgfQogCURPTkU7CiAgICAgICB9CiAg ICAgZWxzZQpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9hcm0vdW5zcGVjcy5tZCBiL2djYy9jb25m aWcvYXJtL3Vuc3BlY3MubWQKaW5kZXggNmE1YjFmOGY2MjMuLjc5MjFiZmZjMTY5IDEwMDY0NAot LS0gYS9nY2MvY29uZmlnL2FybS91bnNwZWNzLm1kCisrKyBiL2djYy9jb25maWcvYXJtL3Vuc3Bl Y3MubWQKQEAgLTU4MSw2ICs1ODEsMTAgQEAKICAgVkFERExWUV9VCiAgIFZDVFAKICAgVkNUUF9N CisgIERMU1RQOAorICBETFNUUDE2CisgIERMU1RQMzIKKyAgRExTVFA2NAogICBWUE5PVAogICBW Q1JFQVRFUV9GCiAgIFZDVlRRX05fVE9fRl9TCmRpZmYgLS1naXQgYS9nY2MvZGYtY29yZS5jYyBi L2djYy9kZi1jb3JlLmNjCmluZGV4IGQ0ODEyYjA0YTdjLi40ZmNjMTRiZjc5MCAxMDA2NDQKLS0t IGEvZ2NjL2RmLWNvcmUuY2MKKysrIGIvZ2NjL2RmLWNvcmUuY2MKQEAgLTE5NjQsNiArMTk2NCwy MSBAQCBkZl9iYl9yZWdub19sYXN0X2RlZl9maW5kIChiYXNpY19ibG9jayBiYiwgdW5zaWduZWQg aW50IHJlZ25vKQogICByZXR1cm4gTlVMTDsKIH0KIAorLyogUmV0dXJuIHRoZSBvbmUgYW5kIG9u bHkgZGVmIG9mIFJFR05PIHdpdGhpbiBCQi4gIElmIHRoZXJlIGlzIG5vIGRlZiBvcgorICAgdGhl cmUgYXJlIG11bHRpcGxlIGRlZnMsIHJldHVybiBOVUxMLiAgKi8KKworZGZfcmVmCitkZl9iYl9y ZWdub19vbmx5X2RlZl9maW5kIChiYXNpY19ibG9jayBiYiwgdW5zaWduZWQgaW50IHJlZ25vKQor eworICBkZl9yZWYgdGVtcCA9IGRmX2JiX3JlZ25vX2ZpcnN0X2RlZl9maW5kIChiYiwgcmVnbm8p OworICBpZiAoIXRlbXApCisgICAgcmV0dXJuIE5VTEw7CisgIGVsc2UgaWYgKHRlbXAgPT0gZGZf YmJfcmVnbm9fbGFzdF9kZWZfZmluZCAoYmIsIHJlZ25vKSkKKyAgICByZXR1cm4gdGVtcDsKKyAg ZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCiAvKiBGaW5kcyB0aGUgcmVmZXJlbmNlIGNvcnJl c3BvbmRpbmcgdG8gdGhlIGRlZmluaXRpb24gb2YgUkVHIGluIElOU04uCiAgICBERiBpcyB0aGUg ZGF0YWZsb3cgb2JqZWN0LiAgKi8KIApkaWZmIC0tZ2l0IGEvZ2NjL2RmLmggYi9nY2MvZGYuaApp bmRleCA0MDI2NTdhNzA3Ni4uOTg2MjM2MzdmOWMgMTAwNjQ0Ci0tLSBhL2djYy9kZi5oCisrKyBi L2djYy9kZi5oCkBAIC05ODcsNiArOTg3LDcgQEAgZXh0ZXJuIHZvaWQgZGZfY2hlY2tfY2ZnX2Ns ZWFuICh2b2lkKTsKICNlbmRpZgogZXh0ZXJuIGRmX3JlZiBkZl9iYl9yZWdub19maXJzdF9kZWZf ZmluZCAoYmFzaWNfYmxvY2ssIHVuc2lnbmVkIGludCk7CiBleHRlcm4gZGZfcmVmIGRmX2JiX3Jl Z25vX2xhc3RfZGVmX2ZpbmQgKGJhc2ljX2Jsb2NrLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGRm X3JlZiBkZl9iYl9yZWdub19vbmx5X2RlZl9maW5kIChiYXNpY19ibG9jaywgdW5zaWduZWQgaW50 KTsKIGV4dGVybiBkZl9yZWYgZGZfZmluZF9kZWYgKHJ0eF9pbnNuICosIHJ0eCk7CiBleHRlcm4g Ym9vbCBkZl9yZWdfZGVmaW5lZCAocnR4X2luc24gKiwgcnR4KTsKIGV4dGVybiBkZl9yZWYgZGZf ZmluZF91c2UgKHJ0eF9pbnNuICosIHJ0eCk7CmRpZmYgLS1naXQgYS9nY2MvbG9vcC1kb2xvb3Au Y2MgYi9nY2MvbG9vcC1kb2xvb3AuY2MKaW5kZXggNGZlYjBhMjVhYjkuLmY2ZGJkMDUxNWRlIDEw MDY0NAotLS0gYS9nY2MvbG9vcC1kb2xvb3AuY2MKKysrIGIvZ2NjL2xvb3AtZG9sb29wLmNjCkBA IC04NSwyOSArODUsMjkgQEAgZG9sb29wX2NvbmRpdGlvbl9nZXQgKHJ0eF9pbnNuICpkb2xvb3Bf cGF0KQogICAgICBmb3JtczoKIAogICAgICAxKSAgKHBhcmFsbGVsIFsoc2V0IChwYykgKGlmX3Ro ZW5fZWxzZSAoY29uZGl0aW9uKQotCSAgCQkJICAgICAgICAgICAgKGxhYmVsX3JlZiAobGFiZWwp KQotCQkJCSAgICAgICAgICAgIChwYykpKQotCSAgICAgICAgICAgICAoc2V0IChyZWcpIChwbHVz IChyZWcpIChjb25zdF9pbnQgLTEpKSkKLQkgICAgICAgICAgICAgKGFkZGl0aW9uYWwgY2xvYmJl cnMgYW5kIHVzZXMpXSkKKwkJCQkJICAgIChsYWJlbF9yZWYgKGxhYmVsKSkKKwkJCQkJICAgIChw YykpKQorCQkgICAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtbikpKQorCQkg ICAgIChhZGRpdGlvbmFsIGNsb2JiZXJzIGFuZCB1c2VzKV0pCiAKICAgICAgVGhlIGJyYW5jaCBt dXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgcGFyYWxsZWwgKGFsc28gcmVxdWlyZWQKICAg ICAgYnkganVtcC5jYyksIGFuZCB0aGUgc2Vjb25kIGVudHJ5IG9mIHRoZSBwYXJhbGxlbCBtdXN0 IGJlIGEgc2V0IG9mCiAgICAgIHRoZSBsb29wIGNvdW50ZXIgcmVnaXN0ZXIuICBTb21lIHRhcmdl dHMgKElBLTY0KSB3cmFwIHRoZSBzZXQgb2YKICAgICAgdGhlIGxvb3AgY291bnRlciBpbiBhbiBp Zl90aGVuX2Vsc2UgdG9vLgogCi0gICAgIDIpICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChjb25z dF9pbnQgLTEpKQotICAgICAgICAgKHNldCAocGMpIChpZl90aGVuX2Vsc2UgKHJlZyAhPSAwKQot CSAgICAgICAgICAgICAgICAgICAgICAgICAobGFiZWxfcmVmIChsYWJlbCkpCi0JCQkgICAgICAg ICAocGMpKSkuICAKKyAgICAgMikgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAt bikpCisJIChzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChyZWcgIT0gMCkKKwkJCQkgKGxhYmVsX3Jl ZiAobGFiZWwpKQorCQkJCSAocGMpKSkuCiAKICAgICAgU29tZSB0YXJnZXRzIChBUk0pIGRvIHRo ZSBjb21wYXJpc29uIGJlZm9yZSB0aGUgYnJhbmNoLCBhcyBpbiB0aGUKICAgICAgZm9sbG93aW5n IGZvcm06CiAKLSAgICAgMykgKHBhcmFsbGVsIFsoc2V0IChjYykgKGNvbXBhcmUgKChwbHVzIChy ZWcpIChjb25zdF9pbnQgLTEpLCAwKSkpCi0gICAgICAgICAgICAgICAgICAgKHNldCAocmVnKSAo cGx1cyAocmVnKSAoY29uc3RfaW50IC0xKSkpXSkKLSAgICAgICAgKHNldCAocGMpIChpZl90aGVu X2Vsc2UgKGNjID09IE5FKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFiZWxf cmVmIChsYWJlbCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYykpKSAqLwor ICAgICAzKSAocGFyYWxsZWwgWyhzZXQgKGNjKSAoY29tcGFyZSAoKHBsdXMgKHJlZykgKGNvbnN0 X2ludCAtbiksIDApKSkKKwkJICAgKHNldCAocmVnKSAocGx1cyAocmVnKSAoY29uc3RfaW50IC1u KSkpXSkKKwkoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAoY2MgPT0gTkUpCisJCQkJKGxhYmVsX3Jl ZiAobGFiZWwpKQorCQkJCShwYykpKSAqLwogCiAgIHBhdHRlcm4gPSBQQVRURVJOIChkb2xvb3Bf cGF0KTsKIApAQCAtMTQzLDcgKzE0Myw3IEBAIGRvbG9vcF9jb25kaXRpb25fZ2V0IChydHhfaW5z biAqZG9sb29wX3BhdCkKIAkgICAgICB8fCBHRVRfQ09ERSAoY21wX2FyZzEpICE9IFBMVVMpCiAJ ICAgIHJldHVybiAwOwogCSAgcmVnX29yaWcgPSBYRVhQIChjbXBfYXJnMSwgMCk7Ci0JICBpZiAo WEVYUCAoY21wX2FyZzEsIDEpICE9IEdFTl9JTlQgKC0xKSAKKwkgIGlmICghQ09OU1RfSU5UX1Ag KFhFWFAgKGNtcF9hcmcxLCAxKSkKIAkgICAgICB8fCAhUkVHX1AgKHJlZ19vcmlnKSkKIAkgICAg cmV0dXJuIDA7CiAJICBjY19yZWcgPSBTRVRfREVTVCAoY21wX29yaWcpOwpAQCAtMTU2LDcgKzE1 Niw4IEBAIGRvbG9vcF9jb25kaXRpb25fZ2V0IChydHhfaW5zbiAqZG9sb29wX3BhdCkKIAl7CiAJ ICAvKiBXZSBleHBlY3QgdGhlIGNvbmRpdGlvbiB0byBiZSBvZiB0aGUgZm9ybSAocmVnICE9IDAp ICAqLwogCSAgY29uZCA9IFhFWFAgKFNFVF9TUkMgKGNtcCksIDApOwotCSAgaWYgKEdFVF9DT0RF IChjb25kKSAhPSBORSB8fCBYRVhQIChjb25kLCAxKSAhPSBjb25zdDBfcnR4KQorCSAgaWYgKChH RVRfQ09ERSAoY29uZCkgIT0gTkUgJiYgR0VUX0NPREUgKGNvbmQpICE9IEdFKQorCSAgICAgIHx8 IFhFWFAgKGNvbmQsIDEpICE9IGNvbnN0MF9ydHgpCiAJICAgIHJldHVybiAwOwogCX0KICAgICB9 CkBAIC0xNzMsMTQgKzE3NCwxNCBAQCBkb2xvb3BfY29uZGl0aW9uX2dldCAocnR4X2luc24gKmRv bG9vcF9wYXQpCiAgIGlmICghIFJFR19QIChyZWcpKQogICAgIHJldHVybiAwOwogCi0gIC8qIENo ZWNrIGlmIHNvbWV0aGluZyA9IChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKS4KKyAgLyogQ2hl Y2sgaWYgc29tZXRoaW5nID0gKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtbikpLgogICAgICBPbiBJ QS02NCwgdGhpcyBkZWNyZW1lbnQgaXMgd3JhcHBlZCBpbiBhbiBpZl90aGVuX2Vsc2UuICAqLwog ICBpbmNfc3JjID0gU0VUX1NSQyAoaW5jKTsKICAgaWYgKEdFVF9DT0RFIChpbmNfc3JjKSA9PSBJ Rl9USEVOX0VMU0UpCiAgICAgaW5jX3NyYyA9IFhFWFAgKGluY19zcmMsIDEpOwogICBpZiAoR0VU X0NPREUgKGluY19zcmMpICE9IFBMVVMKICAgICAgIHx8IFhFWFAgKGluY19zcmMsIDApICE9IHJl ZwotICAgICAgfHwgWEVYUCAoaW5jX3NyYywgMSkgIT0gY29uc3RtMV9ydHgpCisgICAgICB8fCAh Q09OU1RfSU5UX1AgKFhFWFAgKGluY19zcmMsIDEpKSkKICAgICByZXR1cm4gMDsKIAogICAvKiBD aGVjayBmb3IgKHNldCAocGMpIChpZl90aGVuX2Vsc2UgKGNvbmRpdGlvbikKQEAgLTIxMSw0MiAr MjEyLDQ5IEBAIGRvbG9vcF9jb25kaXRpb25fZ2V0IChydHhfaW5zbiAqZG9sb29wX3BhdCkKICAg ICAgIHx8IChHRVRfQ09ERSAoWEVYUCAoY29uZGl0aW9uLCAwKSkgPT0gUExVUwogCSAgJiYgWEVY UCAoWEVYUCAoY29uZGl0aW9uLCAwKSwgMCkgPT0gcmVnKSkKICAgIHsKLSAgICAgaWYgKEdFVF9D T0RFIChwYXR0ZXJuKSAhPSBQQVJBTExFTCkKICAgICAgLyogIEZvciB0aGUgc2Vjb25kIGZvcm0g d2UgZXhwZWN0OgogCi0gICAgICAgICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQg LTEpKQotICAgICAgICAgKHNldCAocGMpIChpZl90aGVuX2Vsc2UgKHJlZyAhPSAwKQotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhYmVsX3JlZiAobGFiZWwpKQotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKHBjKSkpLgorCSAoc2V0IChyZWcpIChwbHVzIChyZWcp IChjb25zdF9pbnQgLW4pKQorCSAoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAocmVnICE9IDApCisJ CQkJIChsYWJlbF9yZWYgKGxhYmVsKSkKKwkJCQkgKHBjKSkpLgogCi0gICAgICAgICBpcyBlcXVp dmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6CisJIElmIG4gPT0gMSwgdGhhdCBpcyBlcXVpdmFsZW50 IHRvIHRoZSBmb2xsb3dpbmc6CiAKLSAgICAgICAgIChwYXJhbGxlbCBbKHNldCAocGMpIChpZl90 aGVuX2Vsc2UgKHJlZyAhPSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAobGFiZWxfcmVmIChsYWJlbCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChwYykpKQotICAgICAgICAgICAgICAgICAgICAgKHNldCAocmVnKSAo cGx1cyAocmVnKSAoY29uc3RfaW50IC0xKSkpCi0gICAgICAgICAgICAgICAgICAgICAoYWRkaXRp b25hbCBjbG9iYmVycyBhbmQgdXNlcyldKQorCSAocGFyYWxsZWwgWyhzZXQgKHBjKSAoaWZfdGhl bl9lbHNlIChyZWcgIT0gMSkKKwkJCQkJICAgIChsYWJlbF9yZWYgKGxhYmVsKSkKKwkJCQkJICAg IChwYykpKQorCQkgICAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpKQor CQkgICAgIChhZGRpdGlvbmFsIGNsb2JiZXJzIGFuZCB1c2VzKV0pCiAKLSAgICAgICAgRm9yIHRo ZSB0aGlyZCBmb3JtIHdlIGV4cGVjdDoKKwlGb3IgdGhlIHRoaXJkIGZvcm0gd2UgZXhwZWN0Ogog Ci0gICAgICAgIChwYXJhbGxlbCBbKHNldCAoY2MpIChjb21wYXJlICgocGx1cyAocmVnKSAoY29u c3RfaW50IC0xKSksIDApKQotICAgICAgICAgICAgICAgICAgIChzZXQgKHJlZykgKHBsdXMgKHJl ZykgKGNvbnN0X2ludCAtMSkpKV0pCi0gICAgICAgIChzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChj YyA9PSBORSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhYmVsX3JlZiAobGFi ZWwpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGMpKSkgCisJKHBhcmFsbGVs IFsoc2V0IChjYykgKGNvbXBhcmUgKChwbHVzIChyZWcpIChjb25zdF9pbnQgLW4pKSwgMCkpCisJ CSAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtbikpKV0pCisJKHNldCAocGMp IChpZl90aGVuX2Vsc2UgKGNjID09IE5FKQorCQkJCShsYWJlbF9yZWYgKGxhYmVsKSkKKwkJCQko cGMpKSkKIAotICAgICAgICB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6CisJ V2hpY2ggYWxzbyBmb3IgbiA9PSAxIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKIAot ICAgICAgICAocGFyYWxsZWwgWyhzZXQgKGNjKSAoY29tcGFyZSAocmVnLCAgMSkpCi0gICAgICAg ICAgICAgICAgICAgKHNldCAocmVnKSAocGx1cyAocmVnKSAoY29uc3RfaW50IC0xKSkpCi0gICAg ICAgICAgICAgICAgICAgKHNldCAocGMpIChpZl90aGVuX2Vsc2UgKE5FID09IGNjKQotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYWJlbF9yZWYgKGxhYmVsKSkK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGMpKSkpXSkKKwko cGFyYWxsZWwgWyhzZXQgKGNjKSAoY29tcGFyZSAocmVnLCAgMSkpCisJCSAgIChzZXQgKHJlZykg KHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpKQorCQkgICAoc2V0IChwYykgKGlmX3RoZW5fZWxz ZSAoTkUgPT0gY2MpCisJCQkJCSAgIChsYWJlbF9yZWYgKGxhYmVsKSkKKwkJCQkJICAgKHBjKSkp KV0pCiAKLSAgICAgICAgU28gd2UgcmV0dXJuIHRoZSBzZWNvbmQgZm9ybSBpbnN0ZWFkIGZvciB0 aGUgdHdvIGNhc2VzLgorCVNvIHdlIHJldHVybiB0aGUgc2Vjb25kIGZvcm0gaW5zdGVhZCBmb3Ig dGhlIHR3byBjYXNlcy4KIAorCUZvciB0aGUgImVsZW1lbnR3aXNlIiBmb3JtIHdoZXJlIHRoZSBk ZWNyZW1lbnQgbnVtYmVyIGlzbid0IC0xLAorCXRoZSBmaW5hbCB2YWx1ZSBtYXkgYmUgZXhjZWVk ZWQsIHNvIHVzZSBHRSBpbnN0ZWFkIG9mIE5FLgogICAgICAqLwotICAgICAgICBjb25kaXRpb24g PSBnZW5fcnR4X2ZtdF9lZSAoTkUsIFZPSURtb2RlLCBpbmNfc3JjLCBjb25zdDFfcnR4KTsKKyAg ICAgaWYgKEdFVF9DT0RFIChwYXR0ZXJuKSAhPSBQQVJBTExFTCkKKyAgICAgICB7CisJaWYgKElO VFZBTCAoWEVYUCAoaW5jX3NyYywgMSkpICE9IC0xKQorCSAgY29uZGl0aW9uID0gZ2VuX3J0eF9m bXRfZWUgKEdFLCBWT0lEbW9kZSwgaW5jX3NyYywgY29uc3QwX3J0eCk7CisJZWxzZQorCSAgY29u ZGl0aW9uID0gZ2VuX3J0eF9mbXRfZWUgKE5FLCBWT0lEbW9kZSwgaW5jX3NyYywgY29uc3QxX3J0 eCk7OworICAgICAgIH0KIAogICAgIHJldHVybiBjb25kaXRpb247CiAgICB9CkBAIC02ODUsMTcg KzY5Myw2IEBAIGRvbG9vcF9vcHRpbWl6ZSAoY2xhc3MgbG9vcCAqbG9vcCkKICAgICAgIHJldHVy biBmYWxzZTsKICAgICB9CiAKLSAgbWF4X2Nvc3QKLSAgICA9IENPU1RTX05fSU5TTlMgKHBhcmFt X21heF9pdGVyYXRpb25zX2NvbXB1dGF0aW9uX2Nvc3QpOwotICBpZiAoc2V0X3NyY19jb3N0IChk ZXNjLT5uaXRlcl9leHByLCBtb2RlLCBvcHRpbWl6ZV9sb29wX2Zvcl9zcGVlZF9wIChsb29wKSkK LSAgICAgID4gbWF4X2Nvc3QpCi0gICAgewotICAgICAgaWYgKGR1bXBfZmlsZSkKLQlmcHJpbnRm IChkdW1wX2ZpbGUsCi0JCSAiRG9sb29wOiBudW1iZXIgb2YgaXRlcmF0aW9ucyB0b28gY29zdGx5 IHRvIGNvbXB1dGUuXG4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KICAgaWYgKGRl c2MtPmNvbnN0X2l0ZXIpCiAgICAgaXRlcmF0aW9ucyA9IHdpZGVzdF9pbnQ6OmZyb20gKHJ0eF9t b2RlX3QgKGRlc2MtPm5pdGVyX2V4cHIsIG1vZGUpLAogCQkJCSAgIFVOU0lHTkVEKTsKQEAgLTcx NiwxMSArNzEzLDI0IEBAIGRvbG9vcF9vcHRpbWl6ZSAoY2xhc3MgbG9vcCAqbG9vcCkKIAogICAv KiBHZW5lcmF0ZSBsb29waW5nIGluc24uICBJZiB0aGUgcGF0dGVybiBGQUlMcyB0aGVuIGdpdmUg dXAgdHJ5aW5nCiAgICAgIHRvIG1vZGlmeSB0aGUgbG9vcCBzaW5jZSB0aGVyZSBpcyBzb21lIGFz cGVjdCB0aGUgYmFjay1lbmQgZG9lcwotICAgICBub3QgbGlrZS4gICovCi0gIGNvdW50ID0gY29w eV9ydHggKGRlc2MtPm5pdGVyX2V4cHIpOworICAgICBub3QgbGlrZS4gIElmIHRoaXMgc3VjY2Vl ZHMsIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgdGhlIGxvb3AKKyAgICAgZGVzYy0+bml0ZXJfZXhw ciBoYXMgYmVlbiBhbHRlcmVkIGJ5IHRoZSBiYWNrZW5kLCBzbyBvbmx5IGV4dHJhY3QKKyAgICAg dGhhdCBkYXRhIGFmdGVyIHRoZSBnZW5fZG9sb29wX2VuZC4gICovCiAgIHN0YXJ0X2xhYmVsID0g YmxvY2tfbGFiZWwgKGRlc2MtPmluX2VkZ2UtPmRlc3QpOwogICBkb2xvb3BfcmVnID0gZ2VuX3Jl Z19ydHggKG1vZGUpOwogICBydHhfaW5zbiAqZG9sb29wX3NlcSA9IHRhcmdldG0uZ2VuX2RvbG9v cF9lbmQgKGRvbG9vcF9yZWcsIHN0YXJ0X2xhYmVsKTsKKyAgY291bnQgPSBjb3B5X3J0eCAoZGVz Yy0+bml0ZXJfZXhwcik7CisKKyAgbWF4X2Nvc3QKKyAgICA9IENPU1RTX05fSU5TTlMgKHBhcmFt X21heF9pdGVyYXRpb25zX2NvbXB1dGF0aW9uX2Nvc3QpOworICBpZiAoc2V0X3NyY19jb3N0IChj b3VudCwgbW9kZSwgb3B0aW1pemVfbG9vcF9mb3Jfc3BlZWRfcCAobG9vcCkpCisgICAgICA+IG1h eF9jb3N0KQorICAgIHsKKyAgICAgIGlmIChkdW1wX2ZpbGUpCisJZnByaW50ZiAoZHVtcF9maWxl LAorCQkgIkRvbG9vcDogbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG9vIGNvc3RseSB0byBjb21wdXRl LlxuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCiAgIHdvcmRfbW9kZV9zaXplID0g R0VUX01PREVfUFJFQ0lTSU9OICh3b3JkX21vZGUpOwogICB3b3JkX21vZGVfbWF4ID0gKEhPU1Rf V0lERV9JTlRfMVUgPDwgKHdvcmRfbW9kZV9zaXplIC0gMSkgPDwgMSkgLSAxOwpkaWZmIC0tZ2l0 IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2IuaCBiL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9hcm0vbG9iLmgKaW5kZXggZmVhYWU3Y2M4OTkuLjM5NDFmZTdhOGI2IDEwMDY0NAot LS0gYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL2xvYi5oCisrKyBiL2djYy90ZXN0c3Vp dGUvZ2NjLnRhcmdldC9hcm0vbG9iLmgKQEAgLTEsMTUgKzEsMTMxIEBACiAjaW5jbHVkZSA8c3Ry aW5nLmg+Ci0KKyNpbmNsdWRlIDxzdGRpbnQuaD4KIC8qIENvbW1vbiBjb2RlIGZvciBsb2IgdGVz dHMuICAqLwogCiAjZGVmaW5lIE5PX0xPQiBhc20gdm9sYXRpbGUgKCJAIGNsb2JiZXIgbHIiIDog OiA6ICJsciIgKQogCi0jZGVmaW5lIE4gMTAwMDAKKyNkZWZpbmUgTiAxMDAKKworc3RhdGljIHZv aWQKK3Jlc2V0X2RhdGEgKGludCAqYSwgaW50ICpiLCBpbnQgKmMsIGludCB4KQoreworICBtZW1z ZXQgKGEsIC0xLCB4ICogc2l6ZW9mICgqYSkpOworICBtZW1zZXQgKGIsIC0xLCB4ICogc2l6ZW9m ICgqYikpOworICBtZW1zZXQgKGMsIDAsIHggKiBzaXplb2YgKCpjKSk7Cit9CisKK3N0YXRpYyB2 b2lkCityZXNldF9kYXRhOCAoaW50OF90ICphLCBpbnQ4X3QgKmIsIGludDhfdCAqYywgaW50IHgp Cit7CisgIG1lbXNldCAoYSwgLTEsIHggKiBzaXplb2YgKCphKSk7CisgIG1lbXNldCAoYiwgLTEs IHggKiBzaXplb2YgKCpiKSk7CisgIG1lbXNldCAoYywgMCwgeCAqIHNpemVvZiAoKmMpKTsKK30K Kworc3RhdGljIHZvaWQKK3Jlc2V0X2RhdGExNiAoaW50MTZfdCAqYSwgaW50MTZfdCAqYiwgaW50 MTZfdCAqYywgaW50IHgpCit7CisgIG1lbXNldCAoYSwgLTEsIHggKiBzaXplb2YgKCphKSk7Cisg IG1lbXNldCAoYiwgLTEsIHggKiBzaXplb2YgKCpiKSk7CisgIG1lbXNldCAoYywgMCwgeCAqIHNp emVvZiAoKmMpKTsKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X2RhdGEzMiAoaW50MzJfdCAqYSwg aW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IHgpCit7CisgIG1lbXNldCAoYSwgLTEsIHggKiBz aXplb2YgKCphKSk7CisgIG1lbXNldCAoYiwgLTEsIHggKiBzaXplb2YgKCpiKSk7CisgIG1lbXNl dCAoYywgMCwgeCAqIHNpemVvZiAoKmMpKTsKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X2RhdGE2 NCAoaW50NjRfdCAqYSwgaW50NjRfdCAqYywgaW50IHgpCit7CisgIG1lbXNldCAoYSwgLTEsIHgg KiBzaXplb2YgKCphKSk7CisgIG1lbXNldCAoYywgMCwgeCAqIHNpemVvZiAoKmMpKTsKK30KKwor c3RhdGljIHZvaWQKK2NoZWNrX3BsdXMgKGludCAqYSwgaW50ICpiLCBpbnQgKmMsIGludCB4KQor eworICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykKKyAgICB7CisgICAgICBOT19MT0I7Cisg ICAgICBpZiAoaSA8IHgpCisJeworCSAgaWYgKGNbaV0gIT0gKGFbaV0gKyBiW2ldKSkgYWJvcnQg KCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChjW2ldICE9IDApIGFib3J0ICgpOworCX0K KyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19wbHVzOCAoaW50OF90ICphLCBpbnQ4X3Qg KmIsIGludDhfdCAqYywgaW50IHgpCit7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQor ICAgIHsKKyAgICAgIE5PX0xPQjsKKyAgICAgIGlmIChpIDwgeCkKKwl7CisJICBpZiAoY1tpXSAh PSAoYVtpXSArIGJbaV0pKSBhYm9ydCAoKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGNb aV0gIT0gMCkgYWJvcnQgKCk7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3Bs dXMxNiAoaW50MTZfdCAqYSwgaW50MTZfdCAqYiwgaW50MTZfdCAqYywgaW50IHgpCit7CisgIGZv ciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQorICAgIHsKKyAgICAgIE5PX0xPQjsKKyAgICAgIGlm IChpIDwgeCkKKwl7CisJICBpZiAoY1tpXSAhPSAoYVtpXSArIGJbaV0pKSBhYm9ydCAoKTsKKwl9 CisgICAgICBlbHNlCisJeworCSAgaWYgKGNbaV0gIT0gMCkgYWJvcnQgKCk7CisJfQorICAgIH0K K30KKworc3RhdGljIHZvaWQKK2NoZWNrX3BsdXMzMiAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwg aW50MzJfdCAqYywgaW50IHgpCit7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQorICAg IHsKKyAgICAgIE5PX0xPQjsKKyAgICAgIGlmIChpIDwgeCkKKwl7CisJICBpZiAoY1tpXSAhPSAo YVtpXSArIGJbaV0pKSBhYm9ydCAoKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGNbaV0g IT0gMCkgYWJvcnQgKCk7CisJfQorICAgIH0KK30KIAogc3RhdGljIHZvaWQKLXJlc2V0X2RhdGEg KGludCAqYSwgaW50ICpiLCBpbnQgKmMpCitjaGVja19tZW1jcHk2NCAoaW50NjRfdCAqYSwgaW50 NjRfdCAqYywgaW50IHgpCiB7Ci0gIG1lbXNldCAoYSwgLTEsIE4gKiBzaXplb2YgKCphKSk7Ci0g IG1lbXNldCAoYiwgLTEsIE4gKiBzaXplb2YgKCpiKSk7Ci0gIG1lbXNldCAoYywgLTEsIE4gKiBz aXplb2YgKCpjKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQorICAgIHsKKyAgICAg IE5PX0xPQjsKKyAgICAgIGlmIChpIDwgeCkKKwl7CisJICBpZiAoY1tpXSAhPSBhW2ldKSBhYm9y dCAoKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGNbaV0gIT0gMCkgYWJvcnQgKCk7CisJ fQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9i MS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2IxLmMKaW5kZXggYmE1YzgyY2Q1 NWMuLmM4Y2U2NTNhNWMzIDEwMDY0NAotLS0gYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJt L2xvYjEuYworKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL2xvYjEuYwpAQCAtNTQs MjkgKzU0LDE4IEBAIGxvb3AzIChpbnQgKmEsIGludCAqYiwgaW50ICpjKQogICAgIH0gd2hpbGUg KGkgPCBOKTsKIH0KIAotdm9pZAotY2hlY2sgKGludCAqYSwgaW50ICpiLCBpbnQgKmMpCi17Ci0g IGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQotICAgIHsKLSAgICAgIE5PX0xPQjsKLSAgICAg IGlmIChjW2ldICE9IGFbaV0gKyBiW2ldKQotCWFib3J0ICgpOwotICAgIH0KLX0KLQogaW50CiBt YWluICh2b2lkKQogewotICByZXNldF9kYXRhIChhLCBiLCBjKTsKKyAgcmVzZXRfZGF0YSAoYSwg YiwgYywgTik7CiAgIGxvb3AxIChhLCBiICxjKTsKLSAgY2hlY2sgKGEsIGIgLGMpOwotICByZXNl dF9kYXRhIChhLCBiLCBjKTsKKyAgY2hlY2tfcGx1cyAoYSwgYiwgYywgTik7CisgIHJlc2V0X2Rh dGEgKGEsIGIsIGMsIE4pOwogICBsb29wMiAoYSwgYiAsYyk7Ci0gIGNoZWNrIChhLCBiICxjKTsK LSAgcmVzZXRfZGF0YSAoYSwgYiwgYyk7CisgIGNoZWNrX3BsdXMgKGEsIGIsIGMsIE4pOworICBy ZXNldF9kYXRhIChhLCBiLCBjLCBOKTsKICAgbG9vcDMgKGEsIGIgLGMpOwotICBjaGVjayAoYSwg YiAsYyk7CisgIGNoZWNrX3BsdXMgKGEsIGIsIGMsIE4pOwogCiAgIHJldHVybiAwOwogfQpkaWZm IC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2I2LmMgYi9nY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvYXJtL2xvYjYuYwppbmRleCAxN2I2MTI0Mjk1ZS4uNGZlMTE2ZTJjMmIg MTAwNjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9iNi5jCisrKyBiL2dj Yy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9iNi5jCkBAIC03OSwxNCArNzksMTQgQEAgY2hl Y2sgKHZvaWQpCiBpbnQKIG1haW4gKHZvaWQpCiB7Ci0gIHJlc2V0X2RhdGEgKGExLCBiMSwgYzEp OwotICByZXNldF9kYXRhIChhMiwgYjIsIGMyKTsKKyAgcmVzZXRfZGF0YSAoYTEsIGIxLCBjMSwg Tik7CisgIHJlc2V0X2RhdGEgKGEyLCBiMiwgYzIsIE4pOwogICBsb29wMSAoYTEsIGIxLCBjMSk7 CiAgIHJlZjEgKGEyLCBiMiwgYzIpOwogICBjaGVjayAoKTsKIAotICByZXNldF9kYXRhIChhMSwg YjEsIGMxKTsKLSAgcmVzZXRfZGF0YSAoYTIsIGIyLCBjMik7CisgIHJlc2V0X2RhdGEgKGExLCBi MSwgYzEsIE4pOworICByZXNldF9kYXRhIChhMiwgYjIsIGMyLCBOKTsKICAgbG9vcDIgKGExLCBi MSwgYzEpOwogICByZWYyIChhMiwgYjIsIGMyKTsKICAgY2hlY2sgKCk7CmRpZmYgLS1naXQgYS9n Y2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1jb21waWxlLWFzbS5jIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtY29tcGlsZS1hc20uYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNWRkZDk5NGU1M2QKLS0tIC9kZXYvbnVs bAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1jb21waWxlLWFz bS5jCkBAIC0wLDAgKzEsNTYxIEBACisvKiB7IGRnLWRvIGNvbXBpbGUgeyB0YXJnZXQgeyBhcm0q LSotKiB9IH0gfSAqLworLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXJtX3Y4XzFt X212ZV9vayB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMyAtc2F2ZS10ZW1wcyIgfSAqLworLyog eyBkZy1hZGQtb3B0aW9ucyBhcm1fdjhfMW1fbXZlIH0gKi8KKworI2luY2x1ZGUgPGFybV9tdmUu aD4KKworI2RlZmluZSBJTU0gNQorCisjZGVmaW5lIFRFU1RfQ09NUElMRV9JTl9ETFNUUF9URVJO QVJZKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCBUWVBFLCBTSUdOLCBOQU1FLCBQUkVEKQkJCQlc Cit2b2lkIHRlc3RfIyNOQU1FIyNQUkVEIyNfIyNTSUdOIyNCSVRTIChUWVBFIyNCSVRTIyNfdCAq YSwgVFlQRSMjQklUUyMjX3QgKmIsICBUWVBFIyNCSVRTIyNfdCAqYywgaW50IG4pCVwKK3sJCQkJ CQkJCQkJCVwKKyAgd2hpbGUgKG4gPiAwKQkJCQkJCQkJCQlcCisgICAgewkJCQkJCQkJCQkJXAor ICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwIyNCSVRTIyNxIChuKTsJCQkJCQlcCisgICAgICBU WVBFIyNCSVRTIyN4IyNMQU5FUyMjX3QgdmEgPSB2bGRyIyNMRFJTVFJZVFBFIyNxX3pfIyNTSUdO IyNCSVRTIChhLCBwKTsJCVwKKyAgICAgIFRZUEUjI0JJVFMjI3gjI0xBTkVTIyNfdCB2YiA9IHZs ZHIjI0xEUlNUUllUUEUjI3Ffel8jI1NJR04jI0JJVFMgKGIsIHApOwkJXAorICAgICAgVFlQRSMj QklUUyMjeCMjTEFORVMjI190IHZjID0gTkFNRSMjUFJFRCMjXyMjU0lHTiMjQklUUyAodmEsIHZi LCBwKTsJCVwKKyAgICAgIHZzdHIjI0xEUlNUUllUUEUjI3FfcF8jI1NJR04jI0JJVFMgKGMsIHZj LCBwKTsJCQkJCVwKKyAgICAgIGMgKz0gTEFORVM7CQkJCQkJCQkJXAorICAgICAgYSArPSBMQU5F UzsJCQkJCQkJCQlcCisgICAgICBiICs9IExBTkVTOwkJCQkJCQkJCVwKKyAgICAgIG4gLT0gTEFO RVM7CQkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBURVNUX0NPTVBJ TEVfSU5fRExTVFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUlkoQklUUywgTEFORVMsIExEUlNUUllU UEUsIE5BTUUsIFBSRUQpCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9URVJOQVJZIChCSVRTLCBM QU5FUywgTERSU1RSWVRQRSwgaW50LCBzLCBOQU1FLCBQUkVEKQkJCVwKK1RFU1RfQ09NUElMRV9J Tl9ETFNUUF9URVJOQVJZIChCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgdWludCwgdSwgTkFNRSwg UFJFRCkKKworI2RlZmluZSBURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5T SUdORURfVEVSTkFSWShOQU1FLCBQUkVEKQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdO RURfVU5TSUdORURfVEVSTkFSWSAoOCwgMTYsIGIsIE5BTUUsIFBSRUQpCQkJCVwKK1RFU1RfQ09N UElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWSAoMTYsIDgsIGgsIE5BTUUsIFBS RUQpCQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWSAo MzIsIDQsIHcsIE5BTUUsIFBSRUQpCisKKworVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNf U0lHTkVEX1VOU0lHTkVEX1RFUk5BUlkgKHZhZGRxLCBfeCkKK1RFU1RfQ09NUElMRV9JTl9ETFNU UF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZICh2bXVscSwgX3gpCitURVNUX0NPTVBJ TEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWSAodnN1YnEsIF94KQor VEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUlkgKHZo YWRkcSwgX3gpCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURf VEVSTkFSWSAodm9ycnEsIF94KQorCisKKyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RF Uk5BUllfTShCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgVFlQRSwgU0lHTiwgTkFNRSwgUFJFRCkJ CQkJXAordm9pZCB0ZXN0XyMjTkFNRSMjUFJFRCMjXyMjU0lHTiMjQklUUyAoVFlQRSMjQklUUyMj eCMjTEFORVMjI190IF9faW5hY3RpdmUsIFRZUEUjI0JJVFMjI190ICphLCBUWVBFIyNCSVRTIyNf dCAqYiwgIFRZUEUjI0JJVFMjI190ICpjLCBpbnQgbikJXAorewkJCQkJCQkJCQkJXAorICB3aGls ZSAobiA+IDApCQkJCQkJCQkJCVwKKyAgICB7CQkJCQkJCQkJCQlcCisgICAgICBtdmVfcHJlZDE2 X3QgcCA9IHZjdHAjI0JJVFMjI3EgKG4pOwkJCQkJCVwKKyAgICAgIFRZUEUjI0JJVFMjI3gjI0xB TkVTIyNfdCB2YSA9IHZsZHIjI0xEUlNUUllUUEUjI3Ffel8jI1NJR04jI0JJVFMgKGEsIHApOwkJ XAorICAgICAgVFlQRSMjQklUUyMjeCMjTEFORVMjI190IHZiID0gdmxkciMjTERSU1RSWVRQRSMj cV96XyMjU0lHTiMjQklUUyAoYiwgcCk7CQlcCisgICAgICBUWVBFIyNCSVRTIyN4IyNMQU5FUyMj X3QgdmMgPSBOQU1FIyNQUkVEIyNfIyNTSUdOIyNCSVRTIChfX2luYWN0aXZlLCB2YSwgdmIsIHAp OwkJXAorICAgICAgdnN0ciMjTERSU1RSWVRQRSMjcV9wXyMjU0lHTiMjQklUUyAoYywgdmMsIHAp OwkJCQkJXAorICAgICAgYyArPSBMQU5FUzsJCQkJCQkJCQlcCisgICAgICBhICs9IExBTkVTOwkJ CQkJCQkJCVwKKyAgICAgIGIgKz0gTEFORVM7CQkJCQkJCQkJXAorICAgICAgbiAtPSBMQU5FUzsJ CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCQkJXAorfQorCisjZGVmaW5lIFRFU1RfQ09NUElMRV9J Tl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWV9NKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBF LCBOQU1FLCBQUkVEKQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBfVEVSTkFSWV9NIChCSVRTLCBM QU5FUywgTERSU1RSWVRQRSwgaW50LCBzLCBOQU1FLCBQUkVEKQkJCVwKK1RFU1RfQ09NUElMRV9J Tl9ETFNUUF9URVJOQVJZX00gKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCB1aW50LCB1LCBOQU1F LCBQUkVEKQorCisjZGVmaW5lIFRFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9V TlNJR05FRF9URVJOQVJZX00oTkFNRSwgUFJFRCkJCQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBf U0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTSAoOCwgMTYsIGIsIE5BTUUsIFBSRUQpCQkJCVwKK1RF U1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWV9NICgxNiwgOCwgaCwg TkFNRSwgUFJFRCkJCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJR05FRF9U RVJOQVJZX00gKDMyLCA0LCB3LCBOQU1FLCBQUkVEKQorCisKK1RFU1RfQ09NUElMRV9JTl9ETFNU UF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX00gKHZhZGRxLCBfbSkKK1RFU1RfQ09N UElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX00gKHZtdWxxLCBf bSkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZ X00gKHZzdWJxLCBfbSkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJ R05FRF9URVJOQVJZX00gKHZoYWRkcSwgX20pCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklU U19TSUdORURfVU5TSUdORURfVEVSTkFSWV9NICh2b3JycSwgX20pCisKKyNkZWZpbmUgVEVTVF9D T01QSUxFX0lOX0RMU1RQX1RFUk5BUllfTihCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgVFlQRSwg U0lHTiwgTkFNRSwgUFJFRCkJXAordm9pZCB0ZXN0XyMjTkFNRSMjUFJFRCMjX25fIyNTSUdOIyNC SVRTIChUWVBFIyNCSVRTIyNfdCAqYSwgIFRZUEUjI0JJVFMjI190ICpjLCBpbnQgbikJXAorewkJ CQkJCQkJCQkJXAorICB3aGlsZSAobiA+IDApCQkJCQkJCQkJCVwKKyAgICB7CQkJCQkJCQkJCQlc CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAjI0JJVFMjI3EgKG4pOwkJCQkJCVwKKyAgICAg IFRZUEUjI0JJVFMjI3gjI0xBTkVTIyNfdCB2YSA9IHZsZHIjI0xEUlNUUllUUEUjI3Ffel8jI1NJ R04jI0JJVFMgKGEsIHApOwkJXAorICAgICAgVFlQRSMjQklUUyMjeCMjTEFORVMjI190IHZjID0g TkFNRSMjUFJFRCMjX25fIyNTSUdOIyNCSVRTICh2YSwgSU1NLCBwKTsJCVwKKyAgICAgIHZzdHIj I0xEUlNUUllUUEUjI3FfcF8jI1NJR04jI0JJVFMgKGMsIHZjLCBwKTsJCQkJCVwKKyAgICAgIGMg Kz0gTEFORVM7CQkJCQkJCQkJXAorICAgICAgYSArPSBMQU5FUzsJCQkJCQkJCQlcCisgICAgICBu IC09IExBTkVTOwkJCQkJCQkJCVwKKyAgICB9CQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgVEVT VF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX04oQklUUywgTEFORVMs IExEUlNUUllUUEUsIE5BTUUsIFBSRUQpCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9URVJOQVJZ X04gKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCBpbnQsIHMsIE5BTUUsIFBSRUQpCQkJXAorVEVT VF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUllfTiAoQklUUywgTEFORVMsIExEUlNUUllUUEUsIHVp bnQsIHUsIE5BTUUsIFBSRUQpCisKKyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJ VFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTihOQU1FLCBQUkVEKQkJCVwKK1RFU1RfQ09NUElM RV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWV9OICg4LCAxNiwgYiwgTkFNRSwgUFJF RCkJCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX04g KDE2LCA4LCBoLCBOQU1FLCBQUkVEKQkJCQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBfU0lHTkVE X1VOU0lHTkVEX1RFUk5BUllfTiAoMzIsIDQsIHcsIE5BTUUsIFBSRUQpCisKK1RFU1RfQ09NUElM RV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX04gKHZhZGRxLCBfeCkK K1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX04g KHZtdWxxLCBfeCkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05F RF9URVJOQVJZX04gKHZzdWJxLCBfeCkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJ R05FRF9VTlNJR05FRF9URVJOQVJZX04gKHZoYWRkcSwgX3gpCisKK1RFU1RfQ09NUElMRV9JTl9E TFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX04gKHZicnNycSwgX3gpCitURVNU X0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9OICh2c2hs cSwgX3gpCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVS TkFSWV9OICh2c2hycSwgX3gpCisKKyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5B UllfTV9OKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCBUWVBFLCBTSUdOLCBOQU1FLCBQUkVEKQlc Cit2b2lkIHRlc3RfIyNOQU1FIyNQUkVEIyNfbl8jI1NJR04jI0JJVFMgKFRZUEUjI0JJVFMjI3gj I0xBTkVTIyNfdCBfX2luYWN0aXZlLCBUWVBFIyNCSVRTIyNfdCAqYSwgIFRZUEUjI0JJVFMjI190 ICpjLCBpbnQgbikJXAorewkJCQkJCQkJCQkJXAorICB3aGlsZSAobiA+IDApCQkJCQkJCQkJCVwK KyAgICB7CQkJCQkJCQkJCQlcCisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAjI0JJVFMjI3Eg KG4pOwkJCQkJCVwKKyAgICAgIFRZUEUjI0JJVFMjI3gjI0xBTkVTIyNfdCB2YSA9IHZsZHIjI0xE UlNUUllUUEUjI3Ffel8jI1NJR04jI0JJVFMgKGEsIHApOwkJXAorICAgICAgVFlQRSMjQklUUyMj eCMjTEFORVMjI190IHZjID0gTkFNRSMjUFJFRCMjX25fIyNTSUdOIyNCSVRTIChfX2luYWN0aXZl LCB2YSwgSU1NLCBwKTsJCVwKKyAgICAgIHZzdHIjI0xEUlNUUllUUEUjI3FfcF8jI1NJR04jI0JJ VFMgKGMsIHZjLCBwKTsJCQkJCVwKKyAgICAgIGMgKz0gTEFORVM7CQkJCQkJCQkJXAorICAgICAg YSArPSBMQU5FUzsJCQkJCQkJCQlcCisgICAgICBuIC09IExBTkVTOwkJCQkJCQkJCVwKKyAgICB9 CQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9V TlNJR05FRF9URVJOQVJZX01fTihCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgTkFNRSwgUFJFRCkJ XAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUllfTV9OIChCSVRTLCBMQU5FUywgTERSU1RS WVRQRSwgaW50LCBzLCBOQU1FLCBQUkVEKQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9URVJO QVJZX01fTiAoQklUUywgTEFORVMsIExEUlNUUllUUEUsIHVpbnQsIHUsIE5BTUUsIFBSRUQpCisK KyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RF Uk5BUllfTV9OKE5BTUUsIFBSRUQpCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9V TlNJR05FRF9URVJOQVJZX01fTiAoOCwgMTYsIGIsIE5BTUUsIFBSRUQpCQkJCVwKK1RFU1RfQ09N UElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWV9NX04gKDE2LCA4LCBoLCBOQU1F LCBQUkVEKQkJCQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5B UllfTV9OICgzMiwgNCwgdywgTkFNRSwgUFJFRCkKKworVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lO VEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OICh2YWRkcSwgX20pCitURVNUX0NPTVBJ TEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9NX04gKHZtdWxxLCBf bSkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZ X01fTiAodnN1YnEsIF9tKQorVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VO U0lHTkVEX1RFUk5BUllfTV9OICh2aGFkZHEsIF9tKQorCitURVNUX0NPTVBJTEVfSU5fRExTVFBf SU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9NX04gKHZicnNycSwgX20pCitURVNUX0NP TVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9NX04gKHZzaGxx LCBfbSkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJO QVJZX01fTiAodnNocnEsIF9tKQorCisvKiBOb3cgdGVzdCBzb21lIG1vcmUgY29uZmlndXJhdGlv bnMuICAqLworCisvKiBVc2luZyBhID49MSBjb25kaXRpb24uICAqLwordm9pZCB0ZXN0MSAoaW50 MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IG4pCit7CisgIHdoaWxlIChuID49 IDEpCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGlu dDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2 bGRyd3Ffel9zMzIgKGIsIHApOworICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZh LCB2YiwgcCk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwKTsKKyAgICAgIGMrPTQ7Cisg ICAgICBhKz00OworICAgICAgYis9NDsKKyAgICAgIG4tPTQ7CisgICAgfQorfQorCisvKiBUZXN0 IGEgZm9yIGxvb3AgZm9ybWF0IG9mIGRlY3JlbWVudGluZyB0byB6ZXJvICovCitpbnQzMl90IGFb XSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3fTsKK3ZvaWQgdGVzdDIgKGludDMyX3QgKmIsIGlu dCBudW1fZWxlbXMpCit7CisgICAgZm9yIChpbnQgaSA9IG51bV9lbGVtczsgaSA+IDA7IGktPSA0 KQorICAgIHsKKyAgICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChpKTsKKyAgICAgICAg aW50MzJ4NF90IHZhID0gdmxkcndxX3pfczMyICgmKGFbaV0pLCBwKTsKKyAgICAgICAgdnN0cndx X3BfczMyIChiICsgaSwgdmEsIHApOworICAgIH0KK30KKworLyogSXRlcmF0aW9uIGNvdW50ZXIg Y291bnRpbmcgdXAgdG8gbnVtX2l0ZXIuICAqLwordm9pZCB0ZXN0MyAodWludDhfdCAqYSwgdWlu dDhfdCAqYiwgdWludDhfdCAqYywgaW50IG4pCit7CisgICAgaW50IG51bV9pdGVyID0gKG4gKyAx NSkvMTY7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1faXRlcjsgaSsrKQorICAgIHsKKyAg ICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwOHEgKG4pOworICAgICAgICB1aW50OHgxNl90IHZh ID0gdmxkcmJxX3pfdTggKGEsIHApOworICAgICAgICB1aW50OHgxNl90IHZiID0gdmxkcmJxX3pf dTggKGIsIHApOworICAgICAgICB1aW50OHgxNl90IHZjID0gdmFkZHFfeF91OCAodmEsIHZiLCBw KTsKKyAgICAgICAgdnN0cmJxX3BfdTggKGMsIHZjLCBwKTsKKyAgICAgICAgbi09MTY7CisgICAg fQorfQorCisvKiBJdGVyYXRpb24gY291bnRlciBjb3VudGluZyBkb3duIGZyb20gbnVtX2l0ZXIu ICAqLwordm9pZCB0ZXN0NCAodWludDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50 IG4pCit7CisgICAgaW50IG51bV9pdGVyID0gKG4gKyAxNSkvMTY7CisgICAgZm9yIChpbnQgaSA9 IG51bV9pdGVyOyBpID4gMDsgaS0tKQorICAgIHsKKyAgICAgICAgbXZlX3ByZWQxNl90IHAgPSB2 Y3RwOHEgKG4pOworICAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOwor ICAgICAgICB1aW50OHgxNl90IHZiID0gdmxkcmJxX3pfdTggKGIsIHApOworICAgICAgICB1aW50 OHgxNl90IHZjID0gdmFkZHFfeF91OCAodmEsIHZiLCBwKTsKKyAgICAgICAgdnN0cmJxX3BfdTgg KGMsIHZjLCBwKTsKKyAgICAgICAgbi09MTY7CisgICAgfQorfQorCisvKiBVc2luZyBhbiB1bnBy ZWRpY2F0ZWQgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbiB3aXRoaW4gdGhlIGxvb3AuICAqLwordm9p ZCB0ZXN0NSAodWludDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgIHVpbnQ4X3QgKmQs IGludCBuKQoreworICAgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICAgIG12ZV9wcmVkMTZf dCBwID0gdmN0cDhxIChuKTsKKyAgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChh LCBwKTsKKyAgICAgICAgdWludDh4MTZfdCB2YiA9IHZsZHJicV91OCAoYik7CisJLyogSXMgYWZm ZWN0ZWQgYnkgaW1wbGljaXQgcHJlZGljYXRpb24sIGJlY2F1c2UgdmIgYWxzbworCWNhbWUgZnJv bSBhbiB1bnByZWRpY2F0ZWQgbG9hZCwgYnV0IHRoZXJlIGlzIG5vIGZ1bmN0aW9uYWwKKwlwcm9i bGVtLCBiZWNhdXNlIHRoZSByZXN1bHQgaXMgdXNlZCBpbiBhIHByZWRpY2F0ZWQgc3RvcmUuICAq LyAKKyAgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX3U4ICh2YSwgdmIpOworICAgICAgICB1 aW50OHgxNl90IHZkID0gdmFkZHFfeF91OCAodmEsIHZiLCBwKTsKKyAgICAgICAgdnN0cmJxX3Bf dTggKGMsIHZjLCBwKTsKKyAgICAgICAgdnN0cmJxX3BfdTggKGQsIHZkLCBwKTsKKyAgICAgICAg bi09MTY7CisgICAgfQorfQorCisvKiBVc2luZyBhIGRpZmZlcmVudCBWUFIgdmFsdWUgZm9yIG9u ZSBpbnN0cnVjdGlvbiBpbiB0aGUgbG9vcC4gICovCit2b2lkIHRlc3Q2IChpbnQzMl90ICphLCBp bnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgbiwgbXZlX3ByZWQxNl90IHAxKQoreworICB3aGls ZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAg ICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBpbnQzMng0X3Qg dmIgPSB2bGRyd3Ffel9zMzIgKGIsIHAxKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3hf czMyICh2YSwgdmIsIHApOworICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAgICBj ICs9IDQ7CisgICAgICBhICs9IDQ7CisgICAgICBiICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAg fQorfQorCisvKiBHZW5lcmF0aW5nIGFuZCB1c2luZyBhbm90aGVyIFZQUiB2YWx1ZSBpbiB0aGUg bG9vcCwgd2l0aCBhIHZjdHAuCisgICBUaGUgZG9sb29wIGxvZ2ljIHdpbGwgYWx3YXlzIHRyeSB0 byBkbyB0aGUgdHJhbnNmb3JtIG9uIHRoZSBmaXJzdAorICAgdmN0cCBpdCBlbmNvdW50ZXJzLCBz byB0aGlzIGlzIHN0aWxsIGV4cGVjdGVkIHRvIHdvcmsuICAqLwordm9pZCB0ZXN0NyAoaW50MzJf dCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IG4sIGludCBnKQoreworICB3aGlsZSAo biA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAg IGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBtdmVfcHJlZDE2X3Qg cDEgPSB2Y3RwMzJxIChnKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwg cDEpOworICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcCk7CisgICAg ICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwKTsKKyAgICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsK KyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsKKyAgICB9Cit9CisKKy8qIEdlbmVyYXRpbmcg YW5kIHVzaW5nIGEgZGlmZmVyZW50IFZQUiB2YWx1ZSBpbiB0aGUgbG9vcCwgd2l0aCBhIHZjdHAs CisgICBidXQgdGhpcyB0aW1lIHRoZSBwMSB3aWxsIGFsc28gY2hhbmdlIGluIGV2ZXJ5IGxvb3Ag KHN0aWxsIGZpbmUpICAqLwordm9pZCB0ZXN0OCAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50 MzJfdCAqYywgaW50IG4sIGludCBnKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAg bXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3 cV96X3MzMiAoYSwgcCk7CisgICAgICBtdmVfcHJlZDE2X3QgcDEgPSB2Y3RwMzJxIChnKTsKKyAg ICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcDEpOworICAgICAgaW50MzJ4NF90 IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcCk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZj LCBwKTsKKyAgICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAg IG4gLT0gNDsKKyAgICAgIGcrKzsKKyAgICB9Cit9CisKKy8qIEdlbmVyYXRpbmcgYW5kIHVzaW5n IGEgZGlmZmVyZW50IFZQUiB2YWx1ZSBpbiB0aGUgbG9vcCwgd2l0aCBhIHZjdHBfbQorICAgdGhh dCBpcyBpbmRlcGVuZGVudCBvZiB0aGUgbG9vcCB2Y3RwIFZQUi4gICovCit2b2lkIHRlc3Q5IChp bnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgbiwgbXZlX3ByZWQxNl90IHAx KQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3Rw MzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAg ICBtdmVfcHJlZDE2X3QgcDIgPSB2Y3RwMzJxX20gKG4sIHAxKTsKKyAgICAgIGludDMyeDRfdCB2 YiA9IHZsZHJ3cV96X3MzMiAoYiwgcDEpOworICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9z MzIgKHZhLCB2YiwgcDIpOworICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAgICBj ICs9IDQ7CisgICAgICBhICs9IDQ7CisgICAgICBiICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAg fQorfQorCisvKiBHZW5lcmF0aW5nIGFuZCB1c2luZyBhIGRpZmZlcmVudCBWUFIgdmFsdWUgaW4g dGhlIGxvb3AsCisgICB3aXRoIGEgdmN0cF9tIHRoYXQgaXMgdGllZCB0byB0aGUgYmFzZSB2Y3Rw IFZQUi4gIFRoaXMKKyAgIGlzIHN0aWxsIGZpbmUsIGJlY2F1c2UgdGhlIHZjdHBfbSB3aWxsIGJl IHRyYW5zZm9ybWVkCisgICBpbnRvIGEgdmN0cCBhbmQgYmUgaW1wbGljaXRseSBwcmVkaWNhdGVk LiAgKi8KK3ZvaWQgdGVzdDEwIChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBp bnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0g dmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEsIHApOwor ICAgICAgbXZlX3ByZWQxNl90IHAxID0gdmN0cDMycV9tIChuLCBwKTsKKyAgICAgIGludDMyeDRf dCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcDEpOworICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFf eF9zMzIgKHZhLCB2YiwgcDEpOworICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAg ICBjICs9IDQ7CisgICAgICBhICs9IDQ7CisgICAgICBiICs9IDQ7CisgICAgICBuIC09IDQ7Cisg ICAgfQorfQorCisvKiBHZW5lcmF0aW5nIGFuZCB1c2luZyBhIGRpZmZlcmVudCBWUFIgdmFsdWUg aW4gdGhlIGxvb3AsIHdpdGggYSB2Y21wLiAgKi8KK3ZvaWQgdGVzdDExIChpbnQzMl90ICphLCBp bnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsK KyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3QgdmEg PSB2bGRyd3Ffel9zMzIgKGEsIHApOworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMy IChiLCBwKTsKKyAgICAgIG12ZV9wcmVkMTZfdCBwMSA9IHZjbXBlcXFfczMyICh2YSwgdmIpOwor ICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcDEpOworICAgICAgdnN0 cndxX3BfczMyIChjLCB2YywgcCk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7CisgICAg ICBiICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAgfQorfQorCisvKiBHZW5lcmF0aW5nIGFuZCB1 c2luZyBhIGRpZmZlcmVudCBWUFIgdmFsdWUgaW4gdGhlIGxvb3AsIHdpdGggYSB2Y21wX20uICAq Lwordm9pZCB0ZXN0MTIgKGludDMyX3QgKmEsIGludDMyX3QgKmIsIGludDMyX3QgKmMsIGludCBu LCBtdmVfcHJlZDE2X3QgcDEpCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVf cHJlZDE2X3QgcCA9IHZjdHAzMnEgKG4pOworICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pf czMyIChhLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcCk7Cisg ICAgICBtdmVfcHJlZDE2X3QgcDIgPSB2Y21wZXFxX21fczMyICh2YSwgdmIsIHAxKTsKKyAgICAg IGludDMyeDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIsIHAyKTsKKyAgICAgIHZzdHJ3cV9w X3MzMiAoYywgdmMsIHApOworICAgICAgYyArPSA0OworICAgICAgYSArPSA0OworICAgICAgYiAr PSA0OworICAgICAgbiAtPSA0OworICAgIH0KK30KKworLyogR2VuZXJhdGluZyBhbmQgdXNpbmcg YSBkaWZmZXJlbnQgVlBSIHZhbHVlIGluIHRoZSBsb29wLCB3aXRoIGEgdmNtcF9tIAorICAgdGhh dCBpcyB0aWVkIHRvIHRoZSBiYXNlIHZjdHAgVlBSIChzYW1lIGFzIGFib3ZlLCB0aGlzIHdpbGwg YmUgdHVybmVkCisgICBpbnRvIGEgdmNtcCBhbmQgYmUgaW1wbGljaXRseSBwcmVkaWNhdGVkKS4g ICovCit2b2lkIHRlc3QxMyAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50 IG4sIG12ZV9wcmVkMTZfdCBwMSkKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12 ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3Ff el9zMzIgKGEsIHApOworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMyIChiLCBwKTsK KyAgICAgIG12ZV9wcmVkMTZfdCBwMiA9IHZjbXBlcXFfbV9zMzIgKHZhLCB2YiwgcCk7CisgICAg ICBpbnQzMng0X3QgdmMgPSB2YWRkcV94X3MzMiAodmEsIHZiLCBwMik7CisgICAgICB2c3Ryd3Ff cF9zMzIgKGMsIHZjLCBwKTsKKyAgICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIg Kz0gNDsKKyAgICAgIG4gLT0gNDsKKyAgICB9Cit9CisKKy8qIFVzaW5nIGFuIHVucHJlZGljYXRl ZCBvcCB3aXRoIGEgc2NhbGFyIG91dHB1dCwgd2hlcmUgdGhlIHJlc3VsdCBpcyB2YWxpZAorICAg b3V0c2lkZSB0aGUgYmIuICBUaGlzIGlzIHZhbGlkLCBiZWNhdXNlIGFsbCB0aGUgaW5wdXRzIHRv IHRoZSB1bnByZWRpY2F0ZWQKKyAgIG9wIGFyZSBjb3JyZWN0bHkgcHJlZGljYXRlZC4gICovCit1 aW50OF90IHRlc3QxNCAodWludDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50IG4s IHVpbnQ4eDE2X3QgdngpCit7CisgICAgdWludDhfdCBzdW0gPSAwOworICAgIHdoaWxlIChuID4g MCkKKyAgICB7CisgICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwOHEgKG4pOworICAgICAgIHVp bnQ4eDE2X3QgdmEgPSB2bGRyYnFfel91OCAoYSwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YiA9 IHZsZHJicV96X3U4IChiLCBwKTsKKyAgICAgICB1aW50OHgxNl90IHZjID0gdmFkZHFfbV91OCAo dngsIHZhLCB2YiwgcCk7CisgICAgICAgc3VtICs9IHZhZGR2cV91OCAodmMpOworICAgICAgIGEg Kz0gMTY7CisgICAgICAgYiArPSAxNjsKKyAgICAgICBuIC09IDE2OworICAgIH0KKyAgICByZXR1 cm4gc3VtOworfQorCisvKiBTYW1lIGFzIGFib3ZlLCBidXQgd2l0aCBhbm90aGVyIHNjYWxhciBv cCBiZXR3ZWVuIHRoZSB1bnByZWRpY2F0ZWQgb3AgYW5kCisgICB0aGUgc2NhbGFyIG9wIG91dHNp ZGUgdGhlIGxvb3AuICAqLwordWludDhfdCB0ZXN0MTUgKHVpbnQ4X3QgKmEsIHVpbnQ4X3QgKmIs IHVpbnQ4X3QgKmMsIGludCBuLCB1aW50OHgxNl90IHZ4LCBpbnQgZykKK3sKKyAgICB1aW50OF90 IHN1bSA9IDA7CisgICAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgICBtdmVfcHJlZDE2X3Qg cCA9IHZjdHA4cSAobik7CisgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBw KTsKKyAgICAgICB1aW50OHgxNl90IHZiID0gdmxkcmJxX3pfdTggKGIsIHApOworICAgICAgIHVp bnQ4eDE2X3QgdmMgPSB2YWRkcV9tX3U4ICh2eCwgdmEsIHZiLCBwKTsKKyAgICAgICBzdW0gKz0g dmFkZHZxX3U4ICh2Yyk7CisgICAgICAgc3VtICs9IGc7CisgICAgICAgYSArPSAxNjsKKyAgICAg ICBiICs9IDE2OworICAgICAgIG4gLT0gMTY7CisgICAgfQorICAgIHJldHVybiBzdW07Cit9CisK Ky8qIFVzaW5nIGFuIHVucHJlZGljYXRlZCB2Y21wIHRvIGdlbmVyYXRlIGEgbmV3IHByZWRpY2F0 ZSB2YWx1ZSBpbiB0aGUKKyAgIGxvb3AgYW5kIHRoZW4gdXNpbmcgaXQgaW4gYSBwcmVkaWNhdGVk IHN0b3JlIGluc24uICAqLwordm9pZCB0ZXN0MTYgKGludDMyX3QgKmEsIGludDMyX3QgKmIsIGlu dDMyX3QgKmMsIGludCBuKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3By ZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3Mz MiAoYSwgcCk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3FfczMyIChiKTsKKyAgICAgIGlu dDMyeDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIsIHApOworICAgICAgbXZlX3ByZWQxNl90 IHAxID0gdmNtcGVxcV9zMzIgKHZhLCB2Yyk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBw MSk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7CisgICAgICBiICs9IDQ7CisgICAgICBu IC09IDQ7CisgICAgfQorfQorCisvKiBVc2luZyBhIHByZWRpY2F0ZWQgdmNtcCB0byBnZW5lcmF0 ZSBhIG5ldyBwcmVkaWNhdGUgdmFsdWUgaW4gdGhlCisgICBsb29wIGFuZCB0aGVuIHVzaW5nIGl0 IGluIGEgcHJlZGljYXRlZCBzdG9yZSBpbnNuLiAgKi8KK3ZvaWQgdGVzdDE3IChpbnQzMl90ICph LCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAg IHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3Qg dmEgPSB2bGRyd3Ffel9zMzIgKGEsIHApOworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pf czMyIChiLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3MzMiAodmEsIHZiKTsKKyAg ICAgIG12ZV9wcmVkMTZfdCBwMSA9IHZjbXBlcXFfbV9zMzIgKHZhLCB2YywgcCk7CisgICAgICB2 c3Ryd3FfcF9zMzIgKGMsIHZjLCBwMSk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7Cisg ICAgICBiICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAgfQorfQorCisvKiBVc2luZyBhbiBhY3Jv c3MtdmVjdG9yIHVucHJlZGljYXRlZCBpbnN0cnVjdGlvbiBpbiBhIHZhbGlkIHdheS4KKyAgIFRo aXMgdGVzdHMgdGhhdCAidmMiIGhhcyBjb3JyZWN0bHkgbWFza2VkIHRoZSByaXNreSAidmIiLiAg Ki8KK3VpbnQxNl90IHRlc3QxOCAodWludDE2X3QgKmEsIHVpbnQxNl90ICpiLCAgdWludDE2X3Qg KmMsIGludCBuKQoreworICB1aW50MTZ4OF90IHZiID0gdmxkcmhxX3UxNiAoYik7CisgIHVpbnQx Nl90IHJlcyA9IDA7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3Qg cCA9IHZjdHAxNnEgKG4pOworICAgICAgdWludDE2eDhfdCB2YSA9IHZsZHJocV96X3UxNiAoYSwg cCk7CisgICAgICB1aW50MTZ4OF90IHZjID0gdmFkZHFfeF91MTYgKHZhLCB2YiwgcCk7CisgICAg ICByZXMgPSB2YWRkdnFfdTE2ICh2Yyk7CisgICAgICBjICs9IDg7CisgICAgICBhICs9IDg7Cisg ICAgICBiICs9IDg7CisgICAgICBuIC09IDg7CisgICAgfQorICByZXR1cm4gcmVzOworfQorCisv KiBVc2luZyBhbiBhY3Jvc3MtdmVjdG9yIHVucHJlZGljYXRlZCBpbnN0cnVjdGlvbiB3aXRoIGEg c2NhbGFyIGZyb20gb3V0c2lkZSB0aGUgbG9vcC4gICovCit1aW50MTZfdCB0ZXN0MTkgKHVpbnQx Nl90ICphLCB1aW50MTZfdCAqYiwgIHVpbnQxNl90ICpjLCBpbnQgbikKK3sKKyAgdWludDE2eDhf dCB2YiA9IHZsZHJocV91MTYgKGIpOworICB1aW50MTZfdCByZXMgPSAwOworICB3aGlsZSAobiA+ IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMTZxIChuKTsKKyAgICAgIHVp bnQxNng4X3QgdmEgPSB2bGRyaHFfel91MTYgKGEsIHApOworICAgICAgdWludDE2eDhfdCB2YyA9 IHZhZGRxX3hfdTE2ICh2YSwgdmIsIHApOworICAgICAgcmVzID0gdmFkZHZhcV91MTYgKHJlcywg dmMpOworICAgICAgYyArPSA4OworICAgICAgYSArPSA4OworICAgICAgYiArPSA4OworICAgICAg biAtPSA4OworICAgIH0KKyAgcmV0dXJuIHJlczsKK30KKworLyogVXNpbmcgYW4gYWNyb3NzLXZl Y3RvciBwcmVkaWNhdGVkIGluc3RydWN0aW9uIGluIGEgdmFsaWQgd2F5LiAgKi8KK3VpbnQxNl90 ICB0ZXN0MjAgKHVpbnQxNl90ICphLCB1aW50MTZfdCAqYiwgIHVpbnQxNl90ICpjLCBpbnQgbikK K3sKKyAgdWludDE2X3QgcmVzID0gMDsKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12 ZV9wcmVkMTZfdCBwID0gdmN0cDE2cSAobik7CisgICAgICB1aW50MTZ4OF90IHZiID0gdmxkcmhx X3UxNiAoYik7CisgICAgICB1aW50MTZ4OF90IHZhID0gdmxkcmhxX3pfdTE2IChhLCBwKTsKKyAg ICAgIHJlcyA9IHZhZGR2YXFfcF91MTYgKHJlcywgdmIsIHApOworICAgICAgYyArPSA4OworICAg ICAgYSArPSA4OworICAgICAgYiArPSA4OworICAgICAgbiAtPSA4OworICAgIH0KKyAgcmV0dXJu IHJlczsKK30KKworLyogVXNpbmcgYW4gYWNyb3NzLXZlY3RvciBwcmVkaWNhdGVkIGluc3RydWN0 aW9uIGluIGEgdmFsaWQgd2F5LiAgKi8KK3VpbnQxNl90ICB0ZXN0MjEgKHVpbnQxNl90ICphLCB1 aW50MTZfdCAqYiwgIHVpbnQxNl90ICpjLCBpbnQgbikKK3sKKyAgdWludDE2X3QgcmVzID0gMDsK KyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDE2cSAo bik7CisgICAgICB1aW50MTZ4OF90IHZiID0gdmxkcmhxX3UxNiAoYik7CisgICAgICB1aW50MTZ4 OF90IHZhID0gdmxkcmhxX3pfdTE2IChhLCBwKTsKKyAgICAgIHJlcysrOworICAgICAgcmVzID0g dmFkZHZhcV9wX3UxNiAocmVzLCB2YiwgcCk7CisgICAgICBjICs9IDg7CisgICAgICBhICs9IDg7 CisgICAgICBiICs9IDg7CisgICAgICBuIC09IDg7CisgICAgfQorICByZXR1cm4gcmVzOworfQor CitpbnQgdGVzdDIyICh1aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpjLCBpbnQgbikK K3sKKyAgICBpbnQgcmVzID0gMDsKKyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgICBt dmVfcHJlZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAgICAgIHVpbnQ4eDE2X3QgdmEgPSB2bGRy YnFfel91OCAoYSwgcCk7CisgICAgICAgIHJlcyA9IHZtYXh2cSAocmVzLCB2YSk7CisgICAgICAg IG4tPTE2OworICAgICAgICBhKz0xNjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworaW50 IHRlc3QyMyAoaW50OF90ICphLCBpbnQ4X3QgKmIsIGludDhfdCAqYywgaW50IG4pCit7CisgICAg aW50IHJlcyA9IDA7CisgICAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgICAgbXZlX3ByZWQx Nl90IHAgPSB2Y3RwOHEgKG4pOworICAgICAgICBpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel9zOCAo YSwgcCk7CisgICAgICAgIHJlcyA9IHZtYXhhdnEgKHJlcywgdmEpOworICAgICAgICBuLT0xNjsK KyAgICAgICAgYSs9MTY7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8qIFRoZSBmaW5h bCBudW1iZXIgb2YgRExTVFBzIGN1cnJlbnRseSBpcyBjYWxjdWxhdGVkIGJ5IHRoZSBudW1iZXIg b2YKKyAgYFRFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJO QVJZLipgIG1hY3JvcyAqIDYgKyAyMy4gICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJs ZXItdGltZXMge1x0ZGxzdHB9IDE2NyB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2Vt Ymxlci10aW1lcyB7XHRsZXRwfSAxNjcgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQxNng4LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQxNng4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAuLjBjZGZmYjMxMmIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0 ZS9nY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50MTZ4OC5jCkBAIC0wLDAgKzEsNjggQEAKKy8q IHsgZGctZG8gcnVuIHsgdGFyZ2V0IHsgYXJtKi0qLSogfSB9IH0gKi8KKy8qIHsgZGctcmVxdWly ZS1lZmZlY3RpdmUtdGFyZ2V0IGFybV92OF8xbV9tdmVfb2sgfSAqLworLyogeyBkZy1vcHRpb25z ICItTzIgLXNhdmUtdGVtcHMiIH0gKi8KKy8qIHsgZGctYWRkLW9wdGlvbnMgYXJtX3Y4XzFtX212 ZSB9ICovCisKKyNpbmNsdWRlIDxhcm1fbXZlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNs dWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICIuLi9sb2IuaCIKKwordm9pZCAgX19hdHRyaWJ1dGVf XyAoKG5vaW5saW5lKSkgdGVzdCAoaW50MTZfdCAqYSwgaW50MTZfdCAqYiwgaW50MTZfdCAqYywg aW50IG4pCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9 IHZjdHAxNnEgKG4pOworICAgICAgaW50MTZ4OF90IHZhID0gdmxkcmhxX3pfczE2IChhLCBwKTsK KyAgICAgIGludDE2eDhfdCB2YiA9IHZsZHJocV96X3MxNiAoYiwgcCk7CisgICAgICBpbnQxNng4 X3QgdmMgPSB2YWRkcV94X3MxNiAodmEsIHZiLCBwKTsKKyAgICAgIHZzdHJocV9wX3MxNiAoYywg dmMsIHApOworICAgICAgYys9ODsKKyAgICAgIGErPTg7CisgICAgICBiKz04OworICAgICAgbi09 ODsKKyAgICB9Cit9CisKK2ludCBtYWluICgpCit7CisgIGludCBpOworICBpbnQxNl90IHRlbXAx W05dOworICBpbnQxNl90IHRlbXAyW05dOworICBpbnQxNl90IHRlbXAzW05dOworICByZXNldF9k YXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRl bXAzLCAwKTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAwKTsKKworICBy ZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVt cDIsIHRlbXAzLCAxKTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxKTsK KworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1w MSwgdGVtcDIsIHRlbXAzLCA3KTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAz LCA3KTsKKworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0 ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA4KTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIs IHRlbXAzLCA4KTsKKworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOwor ICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA5KTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwg dGVtcDIsIHRlbXAzLCA5KTsKKworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMs IE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxNik7CisgIGNoZWNrX3BsdXMxNiAo dGVtcDEsIHRlbXAyLCB0ZW1wMywgMTYpOworCisgIHJlc2V0X2RhdGExNiAodGVtcDEsIHRlbXAy LCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE3KTsKKyAgY2hlY2tf cGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxNyk7CisKKyAgcmVzZXRfZGF0YTE2ICh0ZW1w MSwgdGVtcDIsIHRlbXAzLCBOKTsKK30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LXRpbWVzIHtcdGRsc3RwLjE2fSAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1i bGVyLXRpbWVzIHtcdGxldHB9IDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJs ZXItbm90ICJcdHZjdHAiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5v dCAiXHR2cHN0IiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgInAw IiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rs c3RwLWludDMyeDQuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWlu dDMyeDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uN2ZmNzg5ZDc2 NTAKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9k bHN0cC1pbnQzMng0LmMKQEAgLTAsMCArMSw2OCBAQAorLyogeyBkZy1kbyBydW4geyB0YXJnZXQg eyBhcm0qLSotKiB9IH0gfSAqLworLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXJt X3Y4XzFtX212ZV9vayB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtc2F2ZS10ZW1wcyIgfSAq LworLyogeyBkZy1hZGQtb3B0aW9ucyBhcm1fdjhfMW1fbXZlIH0gKi8KKworI2luY2x1ZGUgPGFy bV9tdmUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1 ZGUgIi4uL2xvYi5oIgorCit2b2lkICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKSB0ZXN0IChp bnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgbikKK3sKKyAgd2hpbGUgKG4g PiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAobik7CisgICAgICBp bnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEsIHApOworICAgICAgaW50MzJ4NF90IHZiID0g dmxkcndxX3pfczMyIChiLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3hfczMyICh2 YSwgdmIsIHApOworICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAgICBjKz00Owor ICAgICAgYSs9NDsKKyAgICAgIGIrPTQ7CisgICAgICBuLT00OworICAgIH0KK30KKworaW50IG1h aW4gKCkKK3sKKyAgaW50IGk7CisgIGludDMyX3QgdGVtcDFbTl07CisgIGludDMyX3QgdGVtcDJb Tl07CisgIGludDMyX3QgdGVtcDNbTl07CisgIHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0 ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDApOworICBjaGVja19wbHVz MzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDApOworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEsIHRl bXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDEpOworICBjaGVj a19wbHVzMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDEpOworCisgIHJlc2V0X2RhdGEzMiAodGVt cDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMpOwor ICBjaGVja19wbHVzMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMpOworCisgIHJlc2V0X2RhdGEz MiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMs IDQpOworICBjaGVja19wbHVzMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDQpOworCisgIHJlc2V0 X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwg dGVtcDMsIDUpOworICBjaGVja19wbHVzMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDUpOworCisg IHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0 ZW1wMiwgdGVtcDMsIDgpOworICBjaGVja19wbHVzMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDgp OworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRl bXAxLCB0ZW1wMiwgdGVtcDMsIDkpOworICBjaGVja19wbHVzMzIgKHRlbXAxLCB0ZW1wMiwgdGVt cDMsIDkpOworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7Cit9CisK Ky8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHRkbHN0cC4zMn0gMSB9IH0g Ki8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHRsZXRwfSAxIH0gfSAq LworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAiXHR2Y3RwIiB9IH0gKi8KKy8q IHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIlx0dnBzdCIgfSB9ICovCisvKiB7IGRn LWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJwMCIgfSB9ICovCmRpZmYgLS1naXQgYS9nY2Mv dGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQ2NHgyLmMgYi9nY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQ2NHgyLmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMDAuLjgwNjViZDAyNDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50NjR4Mi5jCkBAIC0wLDAgKzEs NjggQEAKKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IHsgYXJtKi0qLSogfSB9IH0gKi8KKy8qIHsg ZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGFybV92OF8xbV9tdmVfb2sgfSAqLworLyogeyBk Zy1vcHRpb25zICItTzIgLXNhdmUtdGVtcHMiIH0gKi8KKy8qIHsgZGctYWRkLW9wdGlvbnMgYXJt X3Y4XzFtX212ZSB9ICovCisKKyNpbmNsdWRlIDxhcm1fbXZlLmg+CisjaW5jbHVkZSA8c3RkaW8u aD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICIuLi9sb2IuaCIKKwordm9pZCAgX19h dHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgdGVzdCAoaW50NjRfdCAqYSwgaW50NjRfdCAqYywgaW50 IG4pCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZj dHA2NHEgKG4pOworICAgICAgaW50NjR4Ml90IHZhID0gdmxkcmRxX2dhdGhlcl9vZmZzZXRfel9z NjQgKGEsIHZjcmVhdGVxX3U2NCAoMCwgOCksIHApOworICAgICAgdnN0cmRxX3NjYXR0ZXJfb2Zm c2V0X3BfczY0IChjLCB2Y3JlYXRlcV91NjQgKDAsIDgpLCB2YSwgcCk7CisgICAgICBjKz0yOwor ICAgICAgYSs9MjsKKyAgICAgIG4tPTI7CisgICAgfQorfQorCitpbnQgbWFpbiAoKQoreworICBp bnQgaTsKKyAgaW50NjRfdCB0ZW1wMVtOXTsKKyAgaW50NjRfdCB0ZW1wM1tOXTsKKyAgcmVzZXRf ZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAzLCAwKTsKKyAg Y2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgMCk7CisKKyAgcmVzZXRfZGF0YTY0ICAodGVt cDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAzLCAxKTsKKyAgY2hlY2tfbWVtY3B5 NjQgKHRlbXAxLCB0ZW1wMywgMSk7CisKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBO KTsKKyAgdGVzdCAodGVtcDEsIHRlbXAzLCAyKTsKKyAgY2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0 ZW1wMywgMik7CisKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAo dGVtcDEsIHRlbXAzLCAzKTsKKyAgY2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgMyk7CisK KyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAz LCA0KTsKKyAgY2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgNCk7CisKKyAgcmVzZXRfZGF0 YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAzLCA1KTsKKyAgY2hl Y2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgNSk7CisKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEs IHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAzLCA2KTsKKyAgY2hlY2tfbWVtY3B5NjQg KHRlbXAxLCB0ZW1wMywgNik7CisKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsK KyAgdGVzdCAodGVtcDEsIHRlbXAzLCA3KTsKKyAgY2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1w MywgNyk7CisKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKK30KKworLyogeyBk Zy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHtcdGRsc3RwLjY0fSAxIH0gfSAqLworLyog eyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHtcdGxldHB9IDEgfSB9ICovCisvKiB7 IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJcdHZjdHAiIH0gfSAqLworLyogeyBkZy1m aW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAiXHR2cHN0IiB9IH0gKi8KKy8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlci1ub3QgInAwIiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3Vp dGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDh4MTYuYyBiL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDh4MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMC4uNTUyNzgxMDAxZTkKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQ4eDE2LmMKQEAgLTAsMCArMSw2OCBAQAor LyogeyBkZy1kbyBydW4geyB0YXJnZXQgeyBhcm0qLSotKiB9IH0gfSAqLworLyogeyBkZy1yZXF1 aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXJtX3Y4XzFtX212ZV9vayB9ICovCisvKiB7IGRnLW9wdGlv bnMgIi1PMiAtc2F2ZS10ZW1wcyIgfSAqLworLyogeyBkZy1hZGQtb3B0aW9ucyBhcm1fdjhfMW1f bXZlIH0gKi8KKworI2luY2x1ZGUgPGFybV9tdmUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lu Y2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIi4uL2xvYi5oIgorCit2b2lkICBfX2F0dHJpYnV0 ZV9fICgobm9pbmxpbmUpKSB0ZXN0IChpbnQ4X3QgKmEsIGludDhfdCAqYiwgaW50OF90ICpjLCBp bnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0g dmN0cDhxIChuKTsKKyAgICAgIGludDh4MTZfdCB2YSA9IHZsZHJicV96X3M4IChhLCBwKTsKKyAg ICAgIGludDh4MTZfdCB2YiA9IHZsZHJicV96X3M4IChiLCBwKTsKKyAgICAgIGludDh4MTZfdCB2 YyA9IHZhZGRxX3hfczggKHZhLCB2YiwgcCk7CisgICAgICB2c3RyYnFfcF9zOCAoYywgdmMsIHAp OworICAgICAgYys9MTY7CisgICAgICBhKz0xNjsKKyAgICAgIGIrPTE2OworICAgICAgbi09MTY7 CisgICAgfQorfQorCitpbnQgbWFpbiAoKQoreworICBpbnQgaTsKKyAgaW50OF90IHRlbXAxW05d OworICBpbnQ4X3QgdGVtcDJbTl07CisgIGludDhfdCB0ZW1wM1tOXTsKKyAgcmVzZXRfZGF0YTgg KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAw KTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDApOworCisgIHJlc2V0X2Rh dGE4ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAyLCB0ZW1w MywgMSk7CisgIGNoZWNrX3BsdXM4ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxKTsKKworICByZXNl dF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwg dGVtcDMsIDE1KTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE1KTsKKwor ICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0 ZW1wMiwgdGVtcDMsIDE2KTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE2 KTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRl bXAxLCB0ZW1wMiwgdGVtcDMsIDE3KTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVt cDMsIDE3KTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRl c3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMyKTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1w MiwgdGVtcDMsIDMyKTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7 CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMzKTsKKyAgY2hlY2tfcGx1czggKHRlbXAx LCB0ZW1wMiwgdGVtcDMsIDMzKTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1w MywgTik7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHRkbHN0 cC44fSAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHtcdGxl dHB9IDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJcdHZjdHAi IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAiXHR2cHN0IiB9IH0g Ki8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgInAwIiB9IH0gKi8KZGlmZiAt LWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludmFsaWQtYXNt LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnZhbGlkLWFzbS5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5jMWM0MGMyZmVhNwotLS0g L2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWlu dmFsaWQtYXNtLmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB7IHRhcmdl dCB7IGFybSotKi0qIH0gfSB9ICovCisvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCBh cm1fdjhfMW1fbXZlX29rIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8zIC1zYXZlLXRlbXBzIiB9 ICovCisvKiB7IGRnLWFkZC1vcHRpb25zIGFybV92OF8xbV9tdmUgfSAqLworCisjaW5jbHVkZSA8 YXJtX212ZS5oPgorCisvKiBUZXJtaW5hdGluZyBvbiBhIG5vbi16ZXJvIG51bWJlciBvZiBlbGVt ZW50cy4gICovCit2b2lkIHRlc3QwICh1aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpj LCBpbnQgbikKK3sKKyAgICB3aGlsZSAobiA+IDEpCisgICAgeworICAgICAgIG12ZV9wcmVkMTZf dCBwID0gdmN0cDhxIChuKTsKKyAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEs IHApOworICAgICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAgICAg dWludDh4MTZfdCB2YyA9IHZhZGRxX3hfdTggKHZhLCB2YiwgcCk7CisgICAgICAgdnN0cmJxX3Bf dTggKGMsIHZjLCBwKTsKKyAgICAgICBuIC09IDE2OworICAgIH0KK30KKworLyogVGVybWluYXRp bmcgb24gbiA+PSAwLiAgKi8KK3ZvaWQgdGVzdDEgKHVpbnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHVp bnQ4X3QgKmMsIGludCBuKQoreworICAgIHdoaWxlIChuID49IDApCisgICAgeworICAgICAgIG12 ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJx X3pfdTggKGEsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91OCAoYiwgcCk7 CisgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX3hfdTggKHZhLCB2YiwgcCk7CisgICAgICAg dnN0cmJxX3BfdTggKGMsIHZjLCBwKTsKKyAgICAgICBuIC09IDE2OworICAgIH0KK30KKworLyog U2ltaWxhciwgdGVybWluYXRpbmcgb24gYSBub24temVybyBudW1iZXIgb2YgZWxlbWVudHMsIGJ1 dCBpbiBhIGZvciBsb29wCisgICBmb3JtYXQuICAqLworaW50MzJfdCBhW10gPSB7MCwgMSwgMiwg MywgNCwgNSwgNiwgN307Cit2b2lkIHRlc3QyIChpbnQzMl90ICpiLCBpbnQgbnVtX2VsZW1zKQor eworICAgIGZvciAoaW50IGkgPSBudW1fZWxlbXM7IGkgPj0gMjsgaS09IDQpCisgICAgeworICAg ICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAoaSk7CisgICAgICAgaW50MzJ4NF90IHZhID0g dmxkcndxX3pfczMyICgmKGFbaV0pLCBwKTsKKyAgICAgICB2c3Ryd3FfcF9zMzIgKGIgKyBpLCB2 YSwgcCk7CisgICAgfQorfQorCisvKiBJdGVyYXRpb24gY291bnRlciBjb3VudGluZyB1cCB0byBu dW1faXRlciwgd2l0aCBhIG5vbi16ZXJvIHN0YXJ0aW5nIG51bS4gICovCit2b2lkIHRlc3QzICh1 aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpjLCBpbnQgbikKK3sKKyAgICBpbnQgbnVt X2l0ZXIgPSAobiArIDE1KS8xNjsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IG51bV9pdGVyOyBp KyspCisgICAgeworICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICB1 aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmIg PSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX3hfdTgg KHZhLCB2YiwgcCk7CisgICAgICAgdnN0cmJxX3BfdTggKGMsIHZjLCBwKTsKKyAgICAgICBuIC09 IDE2OworICAgIH0KK30KKworLyogSXRlcmF0aW9uIGNvdW50ZXIgY291bnRpbmcgdXAgdG8gbnVt X2l0ZXIsIHdpdGggYSBsYXJnZXIgaW5jcmVtZW50ICAqLwordm9pZCB0ZXN0NCAodWludDhfdCAq YSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50IG4pCit7CisgICAgaW50IG51bV9pdGVyID0g KG4gKyAxNSkvMTY7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1faXRlcjsgaSs9MikKKyAg ICB7CisgICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwOHEgKG4pOworICAgICAgIHVpbnQ4eDE2 X3QgdmEgPSB2bGRyYnFfel91OCAoYSwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YiA9IHZsZHJi cV96X3U4IChiLCBwKTsKKyAgICAgICB1aW50OHgxNl90IHZjID0gdmFkZHFfeF91OCAodmEsIHZi LCBwKTsKKyAgICAgICB2c3RyYnFfcF91OCAoYywgdmMsIHApOworICAgICAgIG4gLT0gMTY7Cisg ICAgfQorfQorCisvKiBVc2luZyBhbiB1bnByZWRpY2F0ZWQgc3RvcmUgaW5zdHJ1Y3Rpb24gd2l0 aGluIHRoZSBsb29wLiAgKi8KK3ZvaWQgdGVzdDUgKHVpbnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHVp bnQ4X3QgKmMsICB1aW50OF90ICpkLCBpbnQgbikKK3sKKyAgICB3aGlsZSAobiA+IDApCisgICAg eworICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICB1aW50OHgxNl90 IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFf el91OCAoYiwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX3U4ICh2YSwgdmIpOwor ICAgICAgIHVpbnQ4eDE2X3QgdmQgPSB2YWRkcV94X3U4ICh2YSwgdmIsIHApOworICAgICAgIHZz dHJicV91OCAoZCwgdmQpOworICAgICAgIG4gLT0gMTY7CisgICAgfQorfQorCisvKiBVc2luZyBh biB1bnByZWRpY2F0ZWQgc3RvcmUgb3V0c2lkZSB0aGUgbG9vcC4gICovCit2b2lkIHRlc3Q2ICh1 aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpjLCBpbnQgbiwgdWludDh4MTZfdCB2eCkK K3sKKyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0 cDhxIChuKTsKKyAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOworICAg ICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAgICAgdWludDh4MTZf dCB2YyA9IHZhZGRxX21fdTggKHZ4LCB2YSwgdmIsIHApOworICAgICAgIHZ4ID0gdmFkZHFfdTgg KHZ4LCB2Yyk7CisgICAgICAgYSArPSAxNjsKKyAgICAgICBiICs9IDE2OworICAgICAgIG4gLT0g MTY7CisgICAgfQorICAgIHZzdHJicV91OCAoYywgdngpOworfQorCisvKiBVc2luZyBhIFZQUiB0 aGF0IGdldHMgbW9kaWZpZWQgd2l0aGluIHRoZSBsb29wLiAgKi8KK3ZvaWQgdGVzdDkgKGludDMy X3QgKmEsIGludDMyX3QgKmIsIGludDMyX3QgKmMsIGludCBuKQoreworICB3aGlsZSAobiA+IDAp CisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMy eDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBwKys7CisgICAgICBpbnQzMng0 X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHApOworICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFf eF9zMzIgKHZhLCB2YiwgcCk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwKTsKKyAgICAg IGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsKKyAg ICB9Cit9CisKKy8qIFVzaW5nIGEgVlBSIHRoYXQgZ2V0cyByZS1nZW5lcmF0ZWQgd2l0aGluIHRo ZSBsb29wLiAgKi8KK3ZvaWQgdGVzdDEwIChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90 ICpjLCBpbnQgbikKK3sKKyAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgd2hpbGUg KG4gPiAwKQorICAgIHsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7 CisgICAgICBwID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9z MzIgKGIsIHApOworICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcCk7 CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwKTsKKyAgICAgIGMgKz0gNDsKKyAgICAgIGEg Kz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsKKyAgICB9Cit9CisKKy8qIFVzaW5n IHZjdHAzMnFfbSBpbnN0ZWFkIG9mIHZjdHAzMnEuICAqLwordm9pZCB0ZXN0MTEgKGludDMyX3Qg KmEsIGludDMyX3QgKmIsIGludDMyX3QgKmMsIGludCBuLCBtdmVfcHJlZDE2X3QgcDApCit7Cisg IHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAzMnFfbSAo biwgcDApOworICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pfczMyIChhLCBwKTsKKyAgICAg IGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcCk7CisgICAgICBpbnQzMng0X3QgdmMg PSB2YWRkcV94X3MzMiAodmEsIHZiLCBwKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHAp OworICAgICAgYyArPSA0OworICAgICAgYSArPSA0OworICAgICAgYiArPSA0OworICAgICAgbiAt PSA0OworICAgIH0KK30KKworLyogVXNpbmcgYW4gdW5wcmVkaWNhdGVkIG9wIHdpdGggYSBzY2Fs YXIgb3V0cHV0LCB3aGVyZSB0aGUgcmVzdWx0IGlzIHZhbGlkCisgICBvdXRzaWRlIHRoZSBiYi4g IFRoaXMgaXMgaW52YWxpZCwgYmVjYXVzZSBvbmUgb2YgdGhlIGlucHV0cyB0byB0aGUKKyAgIHVu cHJlZGljYXRlZCBvcCBpcyBhbHNvIHVucHJlZGljYXRlZC4gICovCit1aW50OF90IHRlc3QxMiAo dWludDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50IG4sIHVpbnQ4eDE2X3Qgdngp Cit7CisgICAgdWludDhfdCBzdW0gPSAwOworICAgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAg ICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwOHEgKG4pOworICAgICAgIHVpbnQ4eDE2X3QgdmEgPSB2 bGRyYnFfel91OCAoYSwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YiA9IHZsZHJicV91OCAoYik7 CisgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX3U4ICh2YSwgdmIpOworICAgICAgIHN1bSAr PSB2YWRkdnFfdTggKHZjKTsKKyAgICAgICBhICs9IDE2OworICAgICAgIGIgKz0gMTY7CisgICAg ICAgbiAtPSAxNjsKKyAgICB9CisgICAgcmV0dXJuIHN1bTsKK30KKworLyogVXNpbmcgYW4gdW5w cmVkaWNhdGVkIHZjbXAgdG8gZ2VuZXJhdGUgYSBuZXcgcHJlZGljYXRlIHZhbHVlIGluIHRoZQor ICAgbG9vcCBhbmQgdGhlbiB1c2luZyB0aGF0IFZQUiB0byBwcmVkaWNhdGUgYSBzdG9yZSBpbnNu LiAgKi8KK3ZvaWQgdGVzdDEzIChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMng0X3QgdmMs IGludDMyX3QgKmMsIGludCBuKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZl X3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV9z MzIgKGEpOworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMyIChiLCBwKTsKKyAgICAg IGludDMyeDRfdCB2YyA9IHZhZGRxX3MzMiAodmEsIHZiKTsKKyAgICAgIG12ZV9wcmVkMTZfdCBw MSA9IHZjbXBlcXFfczMyICh2YSwgdmMpOworICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcDEp OworICAgICAgYyArPSA0OworICAgICAgYSArPSA0OworICAgICAgYiArPSA0OworICAgICAgbiAt PSA0OworICAgIH0KK30KKworLyogVXNpbmcgYW4gYWNyb3NzLXZlY3RvciB1bnByZWRpY2F0ZWQg aW5zdHJ1Y3Rpb24uICJ2YiIgaXMgdGhlIHJpc2suICAqLwordWludDE2X3QgdGVzdDE0ICh1aW50 MTZfdCAqYSwgdWludDE2X3QgKmIsICB1aW50MTZfdCAqYywgaW50IG4pCit7CisgIHVpbnQxNng4 X3QgdmIgPSB2bGRyaHFfdTE2IChiKTsKKyAgdWludDE2X3QgcmVzID0gMDsKKyAgd2hpbGUgKG4g PiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDE2cSAobik7CisgICAgICB1 aW50MTZ4OF90IHZhID0gdmxkcmhxX3pfdTE2IChhLCBwKTsKKyAgICAgIHZiID0gdmFkZHFfdTE2 ICh2YSwgdmIpOworICAgICAgcmVzID0gdmFkZHZxX3UxNiAodmIpOworICAgICAgYyArPSA4Owor ICAgICAgYSArPSA4OworICAgICAgYiArPSA4OworICAgICAgbiAtPSA4OworICAgIH0KKyAgcmV0 dXJuIHJlczsKK30KKworLyogVXNpbmcgYW4gYWNyb3NzLXZlY3RvciB1bnByZWRpY2F0ZWQgaW5z dHJ1Y3Rpb24uICJ2YyIgaXMgdGhlIHJpc2suICovCit1aW50MTZfdCB0ZXN0MTUgKHVpbnQxNl90 ICphLCB1aW50MTZfdCAqYiwgIHVpbnQxNl90ICpjLCBpbnQgbikKK3sKKyAgdWludDE2eDhfdCB2 YiA9IHZsZHJocV91MTYgKGIpOworICB1aW50MTZfdCByZXMgPSAwOworICB3aGlsZSAobiA+IDAp CisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMTZxIChuKTsKKyAgICAgIHVpbnQx Nng4X3QgdmEgPSB2bGRyaHFfel91MTYgKGEsIHApOworICAgICAgdWludDE2eDhfdCB2YyA9IHZh ZGRxX3UxNiAodmEsIHZiKTsKKyAgICAgIHJlcyA9IHZhZGR2YXFfdTE2IChyZXMsIHZjKTsKKyAg ICAgIGMgKz0gODsKKyAgICAgIGEgKz0gODsKKyAgICAgIGIgKz0gODsKKyAgICAgIG4gLT0gODsK KyAgICB9CisgIHJldHVybiByZXM7Cit9CisKK3VpbnQxNl90IHRlc3QxNiAodWludDE2X3QgKmEs IHVpbnQxNl90ICpiLCAgdWludDE2X3QgKmMsIGludCBuKQoreworICB1aW50MTZfdCByZXMgPTA7 CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAxNnEg KG4pOworICAgICAgdWludDE2eDhfdCB2YiA9IHZsZHJocV91MTYgKGIpOworICAgICAgdWludDE2 eDhfdCB2YSA9IHZsZHJocV96X3UxNiAoYSwgcCk7CisgICAgICByZXMgPSB2YWRkdmFxX3UxNiAo cmVzLCB2Yik7CisgICAgICByZXMgPSB2YWRkdmFxX3BfdTE2IChyZXMsIHZhLCBwKTsKKyAgICAg IGMgKz0gODsKKyAgICAgIGEgKz0gODsKKyAgICAgIGIgKz0gODsKKyAgICAgIG4gLT0gODsKKyAg ICB9CisgIHJldHVybiByZXM7Cit9CisKK2ludCB0ZXN0MTcgKGludDhfdCAqYSwgaW50OF90ICpi LCBpbnQ4X3QgKmMsIGludCBuKQoreworICAgIGludCByZXMgPSAwOworICAgIHdoaWxlIChuID4g MCkKKyAgICB7CisgICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICAg aW50OHgxNl90IHZhID0gdmxkcmJxX3pfczggKGEsIHApOworICAgICAgICByZXMgPSB2bWF4dnEg KHJlcywgdmEpOworICAgICAgICBuLT0xNjsKKyAgICAgICAgYSs9MTY7CisgICAgfQorICAgIHJl dHVybiByZXM7Cit9CisKKworCitpbnQgdGVzdDE4IChpbnQ4X3QgKmEsIGludDhfdCAqYiwgaW50 OF90ICpjLCBpbnQgbikKK3sKKyAgICBpbnQgcmVzID0gMDsKKyAgICB3aGlsZSAobiA+IDApCisg ICAgeworICAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAgICAgIGludDh4 MTZfdCB2YSA9IHZsZHJicV96X3M4IChhLCBwKTsKKyAgICAgICAgcmVzID0gdm1pbnZxIChyZXMs IHZhKTsKKyAgICAgICAgbi09MTY7CisgICAgICAgIGErPTE2OworICAgIH0KKyAgICByZXR1cm4g cmVzOworfQorCitpbnQgdGVzdDE5IChpbnQ4X3QgKmEsIGludDhfdCAqYiwgaW50OF90ICpjLCBp bnQgbikKK3sKKyAgICBpbnQgcmVzID0gMDsKKyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAg ICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAgICAgIGludDh4MTZfdCB2YSA9 IHZsZHJicV96X3M4IChhLCBwKTsKKyAgICAgICAgcmVzID0gdm1pbmF2cSAocmVzLCB2YSk7Cisg ICAgICAgIG4tPTE2OworICAgICAgICBhKz0xNjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30K KworaW50IHRlc3QyMCAodWludDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50IG4p Cit7CisgICAgaW50IHJlcyA9IDA7CisgICAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgICAg bXZlX3ByZWQxNl90IHAgPSB2Y3RwOHEgKG4pOworICAgICAgICB1aW50OHgxNl90IHZhID0gdmxk cmJxX3pfdTggKGEsIHApOworICAgICAgICByZXMgPSB2bWludnEgKHJlcywgdmEpOworICAgICAg ICBuLT0xNjsKKyAgICAgICAgYSs9MTY7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3Vp bnQ4eDE2X3QgdGVzdDIxICh1aW50OF90ICphLCB1aW50MzJfdCAqYiwgaW50IG4sIHVpbnQ4eDE2 X3QgcmVzKQoreworICAgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICAgIG12ZV9wcmVkMTZf dCBwID0gdmN0cDhxIChuKTsKKyAgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChh LCBwKTsKKyAgICAgICAgcmVzID0gdnNobGNxX3U4ICh2YSwgYiwgMSk7CisgICAgICAgIG4tPTE2 OworICAgICAgICBhKz0xNjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworaW50OHgxNl90 IHRlc3QyMiAoaW50OF90ICphLCBpbnQzMl90ICpiLCBpbnQgbiwgaW50OHgxNl90IHJlcykKK3sK KyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4 cSAobik7CisgICAgICAgIGludDh4MTZfdCB2YSA9IHZsZHJicV96X3M4IChhLCBwKTsKKyAgICAg ICAgcmVzID0gdnNobGNxX3M4ICh2YSwgYiwgMSk7CisgICAgICAgIG4tPTE2OworICAgICAgICBh Kz0xNjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFz c2VtYmxlci1ub3QgIlx0ZGxzdHAiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1i bGVyLW5vdCAiXHRsZXRwIiB9IH0gKi8K --------------HQEzT1WXJQjLHCXLezCWe6yK--