From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.0 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A6F54C433E0 for ; Mon, 10 Aug 2020 18:16:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4DC54207FF for ; Mon, 10 Aug 2020 18:16:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728091AbgHJSQY (ORCPT ); Mon, 10 Aug 2020 14:16:24 -0400 Received: from asavdk3.altibox.net ([109.247.116.14]:53688 "EHLO asavdk3.altibox.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727904AbgHJSQY (ORCPT ); Mon, 10 Aug 2020 14:16:24 -0400 Received: from ravnborg.org (unknown [188.228.123.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by asavdk3.altibox.net (Postfix) with ESMTPS id 9020B20023; Mon, 10 Aug 2020 20:15:55 +0200 (CEST) Date: Mon, 10 Aug 2020 20:15:54 +0200 From: Sam Ravnborg To: allen Cc: Jernej Skrabec , Jitao Shi , Jau-Chih Tseng , Yilun Lin , David Airlie , Neil Armstrong , open list , "open list:DRM DRIVERS" , Andrzej Hajda , Hermes Wu , "moderated list:ARM/Mediatek SoC support" , Laurent Pinchart , Pi-Hsun Shih , Matthias Brugger , "moderated list:ARM/Mediatek SoC support" , Jonas Karlman Subject: Re: [PATCH v10] drm/bridge: add it6505 driver Message-ID: <20200810181554.GE292825@ravnborg.org> References: <1594892860-6569-1-git-send-email-allen.chen@ite.com.tw> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1594892860-6569-1-git-send-email-allen.chen@ite.com.tw> X-CMAE-Score: 0 X-CMAE-Analysis: v=2.3 cv=f+hm+t6M c=1 sm=1 tr=0 a=S6zTFyMACwkrwXSdXUNehg==:117 a=S6zTFyMACwkrwXSdXUNehg==:17 a=IkcTkHD0fZMA:10 a=mpaa-ttXAAAA:8 a=cm27Pg_UAAAA:8 a=1XWaLZrsAAAA:8 a=Ns9eNvu6AAAA:8 a=e5mUnYsNAAAA:8 a=L8YDfXaSqtconZh9qGgA:9 a=6YHz0X6AXIijI_lZ:21 a=OhsBIkaczIQ1SNPw:21 a=QEXdDO2ut3YA:10 a=6heAxKwa5pAsJatQ0mat:22 a=xmb-EsYY8bH0VWELuYED:22 a=LZLx1i01EnjtqRv10NxV:22 a=Vxmtnl_E_bksehYqCbjh:22 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi allen. On Thu, Jul 16, 2020 at 05:47:31PM +0800, allen wrote: > This adds support for the iTE IT6505. > This device can convert DPI signal to DP output. > > Signed-off-by: Jitao Shi > Signed-off-by: Pi-Hsun Shih > Signed-off-by: Yilun Lin > Signed-off-by: Hermes Wu > Signed-off-by: Allen Chen > --- Can you please add a From: line so it is possible for the tools to pick who is the author. Right now you are picked - which may or may not be OK. I tried to apply the patch - but there is a few things to look at: I got this with one of my configs (allyes or allmodconfigs): CC [M] drivers/gpu/drm/bridge/ite-it6505.o /home/sam/drm/linux.git/drivers/gpu/drm/bridge/ite-it6505.c:2589:12: warning: ‘it6505_bridge_suspend’ defined but not used [-Wunused-function] 2589 | static int it6505_bridge_suspend(struct device *dev) | ^~~~~~~~~~~~~~~~~~~~~ /home/sam/drm/linux.git/drivers/gpu/drm/bridge/ite-it6505.c:2582:12: warning: ‘it6505_bridge_resume’ defined but not used [-Wunused-function] 2582 | static int it6505_bridge_resume(struct device *dev) | ^~~~~~~~~~~~~~~~~~~~ Please fix. Please try to run it through checkpatch with the following options: ./scripts/checkpatch -q --emacs --strict --show-types --codespell Drop codespell if it does not work for you. Codespell did not like afe - seems that it does not know this is a shorthand for "analog front end". This is one of the warnings to ignore. There are several valid warnings that needs fixing. For example indent. The driver needs to support "flags" in attach to make connector creation optional - support for this is mandatory in new drivers. The driver also needs to support relevant bridge operations. .get_edid .detect needs to be supported, maybe more. See other bridge drivers - most of them are converted today. Please fix so we can get this driver applied. Sam > drivers/gpu/drm/bridge/Kconfig | 7 + > drivers/gpu/drm/bridge/Makefile | 1 + > drivers/gpu/drm/bridge/ite-it6505.c | 2890 +++++++++++++++++++++++++++++++++++ > 3 files changed, 2898 insertions(+) > create mode 100644 drivers/gpu/drm/bridge/ite-it6505.c > > diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig > index 43271c2..59750b8 100644 > --- a/drivers/gpu/drm/bridge/Kconfig > +++ b/drivers/gpu/drm/bridge/Kconfig > @@ -57,6 +57,13 @@ config DRM_LVDS_CODEC > Support for transparent LVDS encoders and decoders that don't > require any configuration. > > +config DRM_ITE_IT6505 > + tristate "ITE IT6505 DP bridge" > + depends on OF > + select DRM_KMS_HELPER > + help > + ITE IT6505 DP bridge chip driver. > + > config DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW > tristate "MegaChips stdp4028-ge-b850v3-fw and stdp2690-ge-b850v3-fw" > depends on OF > diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile > index d63d4b7..86619c7 100644 > --- a/drivers/gpu/drm/bridge/Makefile > +++ b/drivers/gpu/drm/bridge/Makefile > @@ -3,6 +3,7 @@ obj-$(CONFIG_DRM_CDNS_DSI) += cdns-dsi.o > obj-$(CONFIG_DRM_CHRONTEL_CH7033) += chrontel-ch7033.o > obj-$(CONFIG_DRM_DISPLAY_CONNECTOR) += display-connector.o > obj-$(CONFIG_DRM_LVDS_CODEC) += lvds-codec.o > +obj-$(CONFIG_DRM_ITE_IT6505) += ite-it6505.o > obj-$(CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW) += megachips-stdpxxxx-ge-b850v3-fw.o > obj-$(CONFIG_DRM_NXP_PTN3460) += nxp-ptn3460.o > obj-$(CONFIG_DRM_PARADE_PS8622) += parade-ps8622.o > diff --git a/drivers/gpu/drm/bridge/ite-it6505.c b/drivers/gpu/drm/bridge/ite-it6505.c > new file mode 100644 > index 00000000..12a56cd > --- /dev/null > +++ b/drivers/gpu/drm/bridge/ite-it6505.c > @@ -0,0 +1,2890 @@ > +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +/* > + * Copyright (c) 2020, The Linux Foundation. All rights reserved. > + */ > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +#define REG_IC_VER 0x04 > + > +#define REG_RESET_CTRL 0x05 > +#define VIDEO_RESET BIT(0) > +#define AUDIO_RESET BIT(1) > +#define ALL_LOGIC_RESET BIT(2) > +#define AUX_RESET BIT(3) > +#define HDCP_RESET BIT(4) > + > +#define INT_STATUS_01 0x06 > +#define INT_MASK_01 0x09 > +#define INT_HPD_CHANGE BIT(0) > +#define INT_RECEIVE_HPD_IRQ BIT(1) > +#define INT_SCDT_CHANGE BIT(2) > + > +#define INT_STATUS_02 0x07 > +#define INT_MASK_02 0x0A > +#define INT_AUX_CMD_FAIL BIT(0) > +#define INT_AUDIO_FIFO_ERROR BIT(2) > + > +#define INT_STATUS_03 0x08 > +#define INT_MASK_03 0x0B > +#define INT_LINK_TRAIN_FAIL BIT(4) > +#define INT_VID_FIFO_ERROR BIT(5) > +#define INT_IO_LATCH_FIFO_OVERFLOW BIT(7) > + > +#define REG_SYSTEM_STS 0x0D > +#define INT_STS BIT(0) > +#define HPD_STS BIT(1) > +#define VIDEO_STB BIT(2) > + > +#define REG_LINK_TRAIN_STS 0x0E > +#define LINK_STATE_CR BIT(2) > +#define LINK_STATE_EQ BIT(3) > +#define LINK_STATE_NORP BIT(4) > + > +#define REG_BANK_SEL 0x0F > +#define REG_CLK_CTRL0 0x10 > +#define M_PCLK_DELAY 0x03 > + > +#define REG_AUX_OPT 0x11 > +#define AUX_AUTO_RST BIT(0) > +#define AUX_FIX_FREQ BIT(3) > + > +#define REG_DATA_CTRL0 0x12 > +#define VIDEO_LATCH_EDGE BIT(4) > +#define ENABLE_PCLK_COUNTER BIT(7) > + > +#define REG_PCLK_COUNTER_VALUE 0x13 > + > +#define REG_501_FIFO_CTRL 0x15 > +#define RST_501_FIFO BIT(1) > + > +#define REG_TRAIN_CTRL0 0x16 > +#define FORCE_LBR BIT(0) > +#define LANE_COUNT_MASK 0x06 > +#define LANE_SWAP BIT(3) > +#define SPREAD_AMP_5 BIT(4) > +#define FORCE_CR_DONE BIT(5) > +#define FORCE_EQ_DONE BIT(6) > + > +#define REG_TRAIN_CTRL1 0x17 > +#define AUTO_TRAIN BIT(0) > +#define MANUAL_TRAIN BIT(1) > +#define FORCE_RETRAIN BIT(2) > + > +#define REG_AUX_CTRL 0x23 > +#define CLR_EDID_FIFO BIT(0) > +#define AUX_USER_MODE BIT(1) > +#define AUX_NO_SEGMENT_WR BIT(6) > +#define AUX_EN_FIFO_READ BIT(7) > + > +#define REG_AUX_ADR_0_7 0x24 > +#define REG_AUX_ADR_8_15 0x25 > +#define REG_AUX_ADR_16_19 0x26 > +#define REG_AUX_OUT_DATA0 0x27 > + > +#define REG_AUX_CMD_REQ 0x2B > +#define AUX_BUSY BIT(5) > + > +#define REG_AUX_DATA_0_7 0x2C > +#define REG_AUX_DATA_8_15 0x2D > +#define REG_AUX_DATA_16_23 0x2E > +#define REG_AUX_DATA_24_31 0x2F > + > +#define REG_AUX_DATA_FIFO 0x2F > + > +#define REG_AUX_ERROR_STS 0x9F > +#define M_AUX_REQ_FAIL 0x03 > + > +#define REG_HDCP_CTRL1 0x38 > +#define HDCP_CP_ENABLE BIT(0) > + > +#define REG_HDCP_CTRL2 0x3A > +#define HDCP_AN_SEL BIT(0) > +#define HDCP_HW_HPDIRQ_ACT BIT(2) > + > +#define REG_M0_0_7 0x4C > +#define REG_AN_0_7 0x4C > +#define REG_SP_CTRL0 0x58 > +#define REG_IP_CTRL1 0x59 > +#define REG_IP_CTRL2 0x5A > + > +#define REG_LINK_DRV 0x5C > +#define DRV_HS BIT(1) > + > +#define REG_DRV_LN_DATA_SEL 0x5D > + > +#define REG_AUX 0x5E > + > +#define REG_VID_BUS_CTRL0 0x60 > +#define IN_DDR BIT(2) > +#define DDR_CD (0x01 << 6) > + > +#define REG_VID_BUS_CTRL1 0x61 > +#define TX_FIFO_RESET BIT(1) > + > +#define REG_INPUT_CTRL 0xA0 > +#define INPUT_HSYNC_POL BIT(0) > +#define INPUT_VSYNC_POL BIT(2) > +#define INPUT_INTERLACED BIT(4) > + > +#define REG_INPUT_HTOTAL 0xA1 > +#define REG_INPUT_HACTIVE_START 0xA3 > +#define REG_INPUT_HACTIVE_WIDTH 0xA5 > +#define REG_INPUT_HFRONT_PORCH 0xA7 > +#define REG_INPUT_HSYNC_WIDTH 0xA9 > +#define REG_INPUT_VTOTAL 0xAB > +#define REG_INPUT_VACTIVE_START 0xAD > +#define REG_INPUT_VACTIVE_WIDTH 0xAF > +#define REG_INPUT_VFRONT_PORCH 0xB1 > +#define REG_INPUT_VSYNC_WIDTH 0xB3 > + > +#define REG_AUDIO_SRC_CTRL 0xB8 > +#define M_AUDIO_I2S_EN 0x0F > +#define EN_I2S0 BIT(0) > +#define EN_I2S1 BIT(1) > +#define EN_I2S2 BIT(2) > +#define EN_I2S3 BIT(3) > +#define AUDIO_FIFO_RESET BIT(7) > + > +#define REG_AUDIO_FMT 0xB9 > +#define REG_AUDIO_FIFO_SEL 0xBA > + > +#define REG_AUDIO_CTRL0 0xBB > +#define AUDIO_FULL_PKT BIT(4) > +#define AUDIO_16B_BOUND BIT(5) > + > +#define REG_AUDIO_CTRL1 0xBC > +#define REG_AUDIO_INPUT_FREQ 0xBE > + > +#define REG_IEC958_STS0 0xBF > +#define REG_IEC958_STS1 0xC0 > +#define REG_IEC958_STS2 0xC1 > +#define REG_IEC958_STS3 0xC2 > +#define REG_IEC958_STS4 0xC3 > + > +#define REG_HPD_IRQ_TIME 0xC9 > +#define REG_AUX_DEBUG_MODE 0xCA > +#define REG_AUX_OPT2 0xCB > +#define REG_HDCP_OPT 0xCE > + > +#define REG_DATA_MUTE_CTRL 0xD3 > +#define ENABLE_ENHANCED_FRAME BIT(0) > +#define ENABLE_AUTO_VIDEO_FIFO_RESET BIT(1) > +#define EN_VID_MUTE BIT(4) > +#define EN_AUD_MUTE BIT(5) > + > +#define REG_TIME_STMP_CTRL 0xD4 > +#define EN_ENHANCE_VID_STMP BIT(0) > +#define EN_ENHANCE_AUD_STMP BIT(2) > +#define M_STAMP_STEP 0x30 > +#define EN_SSC_GAT BIT(6) > + > +#define REG_INFOFRAME_CTRL 0xE8 > +#define EN_AVI_PKT BIT(0) > +#define EN_AUD_PKT BIT(1) > +#define EN_MPG_PKT BIT(2) > +#define EN_GEN_PKT BIT(3) > +#define EN_VID_TIME_STMP BIT(4) > +#define EN_AUD_TIME_STMP BIT(5) > +#define EN_VID_CTRL_PKT (EN_AVI_PKT | EN_VID_TIME_STMP) > +#define EN_AUD_CTRL_PKT (EN_AUD_PKT | EN_AUD_TIME_STMP) > + > +#define REG_AUDIO_N_0_7 0xDE > +#define REG_AUDIO_N_8_15 0xDF > +#define REG_AUDIO_N_16_23 0xE0 > + > +#define REG_AVI_INFO_DB1 0xE9 > +#define REG_AVI_INFO_DB2 0xEA > +#define REG_AVI_INFO_DB3 0xEB > +#define REG_AVI_INFO_DB4 0xEC > +#define REG_AVI_INFO_DB5 0xED > +#define REG_AVI_INFO_SUM 0xF6 > + > +#define REG_AUD_INFOFRAM_DB1 0xF7 > +#define REG_AUD_INFOFRAM_DB2 0xF8 > +#define REG_AUD_INFOFRAM_DB3 0xF9 > +#define REG_AUD_INFOFRAM_DB4 0xFA > +#define REG_AUD_INFOFRAM_SUM 0xFB > + > +/* the following six registers are in bank1 */ > +#define REG_DRV_0_DB_800_MV 0x7E > +#define REG_PRE_0_DB_800_MV 0x7F > +#define REG_PRE_3P5_DB_800_MV 0x81 > +#define REG_SSC_CTRL0 0x88 > +#define REG_SSC_CTRL1 0x89 > +#define REG_SSC_CTRL2 0x8A > + > +#define RBR DP_LINK_BW_1_62 > +#define HBR DP_LINK_BW_2_7 > +#define HBR2 DP_LINK_BW_5_4 > +#define HBR3 DP_LINK_BW_8_1 > + > +/* Vendor option */ > +#define MAX_LANE_COUNT 4 > +#define MAX_LINK_RATE HBR > +#define AUTO_TRAIN_RETRY 3 > +#define MAX_CR_LEVEL 0x03 > +#define MAX_EQ_LEVEL 0x03 > +#define AUX_WAIT_TIMEOUT_MS 15 > +#define AUX_FIFO_MAX_SIZE 32 > +#define PIXEL_CLK_DELAY 1 > +#define PIXEL_CLK_INVERSE 0 > +#define ADJUST_PHASE_THRESHOLD 80000 > +#define DPI_PIXEL_CLK_MAX 95000 > +#define DEFAULT_PWR_ON 0 > +#define DEFAULT_DRV_HOLD 0 > + > +#define AUDIO_SELECT I2S > +#define AUDIO_TYPE LPCM > +#define AUDIO_SAMPLE_RATE SAMPLE_RATE_48K > +#define AUDIO_CHANNEL_COUNT 2 > + > +/* > + * 0: Standard I2S > + * 1: 32bit I2S > + */ > +#define I2S_INPUT_FORMAT 1 > + > +/* > + * 0: Left-justified > + * 1: Right-justified > + */ > +#define I2S_JUSTIFIED 0 > + > +/* > + * 0: Data delay 1T correspond to WS > + * 1: No data delay correspond to WS > + */ > +#define I2S_DATA_DELAY 0 > + > +/* > + * 0: Left channel > + * 1: Right channel > + */ > +#define I2S_WS_CHANNEL 0 > + > +/* > + * 0: MSB shift first > + * 1: LSB shift first > + */ > +#define I2S_DATA_SEQUENCE 0 > + > +/* > + * Audio Sample Word Length > + * WORD_LENGTH_16BIT > + * WORD_LENGTH_18BIT > + * WORD_LENGTH_20BIT > + * WORD_LENGTH_24BIT > + */ > +#define AUDIO_WORD_LENGTH WORD_LENGTH_24BIT > + > +enum aux_cmd_type { > + CMD_AUX_NATIVE_READ = 0x0, > + CMD_AUX_NATIVE_WRITE = 0x5, > + CMD_AUX_I2C_EDID_READ = 0xB, > +}; > + > +enum aux_cmd_reply { > + REPLY_ACK, > + REPLY_NACK, > + REPLY_DEFER, > +}; > + > +enum link_train_status { > + LINK_IDLE, > + LINK_BUSY, > + LINK_OK, > +}; > + > +enum max_value_check { > + VOLTAGE_SWING, > + PRE_EMPHASIS, > +}; > + > +struct it6505_platform_data { > + struct regulator *pwr18; > + struct regulator *ovdd; > + struct gpio_desc *gpiod_reset; > +}; > + > +enum it6505_audio_select { > + I2S = 0, > + SPDIF, > +}; > + > +enum it6505_audio_sample_rate { > + SAMPLE_RATE_24K = 0x6, > + SAMPLE_RATE_32K = 0x3, > + SAMPLE_RATE_48K = 0x2, > + SAMPLE_RATE_96K = 0xA, > + SAMPLE_RATE_192K = 0xE, > + SAMPLE_RATE_44_1K = 0x0, > + SAMPLE_RATE_88_2K = 0x8, > + SAMPLE_RATE_176_4K = 0xC, > +}; > + > +enum it6505_audio_type { > + LPCM = 0, > + NLPCM, > + DSS, > +}; > + > +enum it6505_audio_word_length { > + WORD_LENGTH_16BIT = 0, > + WORD_LENGTH_18BIT, > + WORD_LENGTH_20BIT, > + WORD_LENGTH_24BIT, > +}; > + > +struct it6505_audio_data { > + enum it6505_audio_select select; > + enum it6505_audio_sample_rate sample_rate; > + enum it6505_audio_type type; > + enum it6505_audio_word_length word_length; > + u8 channel_count; > + u8 i2s_input_format; > + u8 i2s_justified; > + u8 i2s_data_delay; > + u8 i2s_ws_channel; > + u8 i2s_data_sequence; > +}; > + > +struct it6505_audio_sample_rate_map { > + enum it6505_audio_sample_rate rate; > + int sample_rate_value; > +}; > + > +struct it6505_drm_dp_link { > + unsigned char revision; > + unsigned int rate; > + unsigned int num_lanes; > + unsigned long capabilities; > +}; > + > +struct it6505 { > + struct drm_dp_aux aux; > + struct drm_bridge bridge; > + struct i2c_client *client; > + struct edid *edid; > + struct drm_connector connector; > + struct it6505_drm_dp_link link; > + struct it6505_platform_data pdata; > + struct mutex extcon_lock; > + struct mutex mode_lock; > + struct mutex aux_lock; > + struct regmap *regmap; > + struct drm_display_mode video_info; > + struct notifier_block event_nb; > + struct extcon_dev *extcon; > + struct work_struct extcon_wq; > + enum drm_connector_status connector_status; > + int revision; > + enum link_train_status link_state; > + struct work_struct link_works; > + u8 dpcd[DP_RECEIVER_CAP_SIZE]; > + u8 lane_count; > + u8 link_rate_bw_code; > + u8 sink_count; > + bool step_train; > + bool branch_device; > + bool enable_ssc; > + bool lane_swap_disabled; > + bool lane_swap; > + bool powered; > + u32 afe_setting; > + struct completion wait_edid_complete; > + u8 auto_train_retry; > + bool is_repeater; > + bool enable_enhanced_frame; > + hdmi_codec_plugged_cb plugged_cb; > + struct device *codec_dev; > + struct delayed_work delayed_audio; > + bool enable_audio; > + struct it6505_audio_data audio; > + > + /* it6505 driver hold option */ > + bool enable_drv_hold; > +}; > + > +struct it6505_step_train_para { > + u8 voltage_swing[MAX_LANE_COUNT]; > + u8 pre_emphasis[MAX_LANE_COUNT]; > +}; > + > +/* > + * Vendor option afe settings for different platforms > + * 0: for bitland 10e, quanta zde > + * 1: for google kukui p1/p2, huaqin krane > + */ > + > +static u8 const afe_setting_table[][3] = { > + {0x82, 0x00, 0xA6}, > + {0x93, 0x2A, 0x85} > +}; > + > +static const struct it6505_audio_sample_rate_map audio_sample_rate_map[] = { > + {SAMPLE_RATE_24K, 24000}, > + {SAMPLE_RATE_32K, 32000}, > + {SAMPLE_RATE_48K, 48000}, > + {SAMPLE_RATE_96K, 96000}, > + {SAMPLE_RATE_192K, 192000}, > + {SAMPLE_RATE_44_1K, 44100}, > + {SAMPLE_RATE_88_2K, 88200}, > + {SAMPLE_RATE_176_4K, 176400}, > +}; > + > +static const struct regmap_range it6505_bridge_volatile_ranges[] = { > + { .range_min = 0, .range_max = 0xFF }, > +}; > + > +static const struct regmap_access_table it6505_bridge_volatile_table = { > + .yes_ranges = it6505_bridge_volatile_ranges, > + .n_yes_ranges = ARRAY_SIZE(it6505_bridge_volatile_ranges), > +}; > + > +static const struct regmap_config it6505_regmap_config = { > + .reg_bits = 8, > + .val_bits = 8, > + .volatile_table = &it6505_bridge_volatile_table, > + .cache_type = REGCACHE_NONE, > +}; > + > +static int it6505_read(struct it6505 *it6505, unsigned int reg_addr) > +{ > + unsigned int value; > + int err; > + struct device *dev = &it6505->client->dev; > + > + err = regmap_read(it6505->regmap, reg_addr, &value); > + if (err < 0) { > + DRM_DEV_ERROR(dev, "read failed reg[0x%x] err: %d", reg_addr, > + err); > + return err; > + } > + > + return value; > +} > + > +static int it6505_write(struct it6505 *it6505, unsigned int reg_addr, > + unsigned int reg_val) > +{ > + int err; > + struct device *dev = &it6505->client->dev; > + > + err = regmap_write(it6505->regmap, reg_addr, reg_val); > + > + if (err < 0) { > + DRM_DEV_ERROR(dev, "write failed reg[0x%x] = 0x%x err = %d", > + reg_addr, reg_val, err); > + return err; > + } > + > + return 0; > +} > + > +static int it6505_set_bits(struct it6505 *it6505, unsigned int reg, > + unsigned int mask, unsigned int value) > +{ > + int err; > + struct device *dev = &it6505->client->dev; > + > + err = regmap_update_bits(it6505->regmap, reg, mask, value); > + if (err < 0) { > + DRM_DEV_ERROR( > + dev, "write reg[0x%x] = 0x%x mask = 0x%x failed err %d", > + reg, value, mask, err); > + return err; > + } > + > + return 0; > +} > + > +static int it6505_dpcd_read(struct it6505 *it6505, unsigned long offset) > +{ > + u8 value; > + int ret; > + struct device *dev = &it6505->client->dev; > + > + ret = drm_dp_dpcd_readb(&it6505->aux, offset, &value); > + if (ret < 0) { > + DRM_DEV_ERROR(dev, "DPCD read failed [0x%lx] ret: %d", offset, > + ret); > + return ret; > + } > + return value; > +} > + > +static int it6505_dpcd_write(struct it6505 *it6505, unsigned long offset, > + unsigned long datain) > +{ > + int ret; > + struct device *dev = &it6505->client->dev; > + > + ret = drm_dp_dpcd_writeb(&it6505->aux, offset, datain); > + if (ret < 0) { > + DRM_DEV_ERROR(dev, "DPCD write failed [0x%lx] ret: %d", offset, > + ret); > + return ret; > + } > + return 0; > +} > + > +static int it6505_get_dpcd(struct it6505 *it6505, int offset, u8 *dpcd, int num) > +{ > + int ret; > + struct device *dev = &it6505->client->dev; > + > + ret = drm_dp_dpcd_read(&it6505->aux, offset, dpcd, num); > + > + if (ret < 0) > + return ret; > + > + DRM_DEV_DEBUG_DRIVER(dev, "ret = %d DPCD[0x%x] = 0x%*ph", ret, offset, > + num, dpcd); > + > + return 0; > +} > + > +static void it6505_dump(struct it6505 *it6505) > +{ > + unsigned int i, j; > + u8 regs[16]; > + struct device *dev = &it6505->client->dev; > + > + for (i = 0; i <= 0xff; i += 16) { > + for (j = 0; j < 16; j++) > + regs[j] = it6505_read(it6505, i + j); > + > + DRM_DEV_DEBUG_DRIVER(dev, "[0x%02x] = %16ph", i, regs); > + } > +} > + > +static bool it6505_get_sink_hpd_status(struct it6505 *it6505) > +{ > + int reg_0d; > + > + reg_0d = it6505_read(it6505, REG_SYSTEM_STS); > + > + if (reg_0d < 0) > + return false; > + > + return (reg_0d & HPD_STS) ? true : false; > +} > + > +static int it6505_read_word(struct it6505 *it6505, unsigned int reg) > +{ > + int val0, val1; > + > + val0 = it6505_read(it6505, reg); > + if (val0 < 0) > + return val0; > + > + val1 = it6505_read(it6505, reg + 1); > + if (val1 < 0) > + return val1; > + > + return (val1 << 8) | val0; > +} > + > +static void it6505_calc_video_info(struct it6505 *it6505) > +{ > + struct device *dev = &it6505->client->dev; > + int hsync_pol, vsync_pol, interlaced; > + int htotal, hdes, hdew, hfph, hsyncw; > + int vtotal, vdes, vdew, vfph, vsyncw; > + int rddata, i, pclk, sum; > + > + usleep_range(10000, 15000); > + it6505_write(it6505, REG_BANK_SEL, 0x00); > + rddata = it6505_read(it6505, REG_INPUT_CTRL); > + hsync_pol = rddata & INPUT_HSYNC_POL; > + vsync_pol = (rddata & INPUT_VSYNC_POL) >> 2; > + interlaced = (rddata & INPUT_INTERLACED) >> 4; > + > + htotal = it6505_read_word(it6505, REG_INPUT_HTOTAL) & 0x1FFF; > + hdes = it6505_read_word(it6505, REG_INPUT_HACTIVE_START) & 0x1FFF; > + hdew = it6505_read_word(it6505, REG_INPUT_HACTIVE_WIDTH) & 0x1FFF; > + hfph = it6505_read_word(it6505, REG_INPUT_HFRONT_PORCH) & 0x1FFF; > + hsyncw = it6505_read_word(it6505, REG_INPUT_HSYNC_WIDTH) & 0x1FFF; > + > + vtotal = it6505_read_word(it6505, REG_INPUT_VTOTAL) & 0xFFF; > + vdes = it6505_read_word(it6505, REG_INPUT_VACTIVE_START) & 0xFFF; > + vdew = it6505_read_word(it6505, REG_INPUT_VACTIVE_WIDTH) & 0xFFF; > + vfph = it6505_read_word(it6505, REG_INPUT_VFRONT_PORCH) & 0xFFF; > + vsyncw = it6505_read_word(it6505, REG_INPUT_VSYNC_WIDTH) & 0xFFF; > + > + sum = 0; > + for (i = 0; i < 10; i++) { > + it6505_set_bits(it6505, REG_DATA_CTRL0, ENABLE_PCLK_COUNTER, > + ENABLE_PCLK_COUNTER); > + usleep_range(10000, 15000); > + it6505_set_bits(it6505, REG_DATA_CTRL0, ENABLE_PCLK_COUNTER, > + 0x00); > + rddata = it6505_read_word(it6505, REG_PCLK_COUNTER_VALUE) & > + 0xFFF; > + > + sum += rddata; > + } > + > + if (sum == 0) { > + DRM_DEV_DEBUG_DRIVER(dev, "calc video timing error"); > + return; > + } > + > + sum /= 10; > + pclk = 13500 * 2048 / sum; > + it6505->video_info.clock = pclk; > + it6505->video_info.hdisplay = hdew; > + it6505->video_info.hsync_start = hdew + hfph; > + it6505->video_info.hsync_end = hdew + hfph + hsyncw; > + it6505->video_info.htotal = htotal; > + it6505->video_info.vdisplay = vdew; > + it6505->video_info.vsync_start = vdew + vfph; > + it6505->video_info.vsync_end = vdew + vfph + vsyncw; > + it6505->video_info.vtotal = vtotal; > + > + DRM_DEV_DEBUG_DRIVER(dev, DRM_MODE_FMT, > + DRM_MODE_ARG(&it6505->video_info)); > +} > + > +static int it6505_drm_dp_link_probe(struct drm_dp_aux *aux, > + struct it6505_drm_dp_link *link) > +{ > + u8 values[3]; > + int err; > + > + memset(link, 0, sizeof(*link)); > + > + err = drm_dp_dpcd_read(aux, DP_DPCD_REV, values, sizeof(values)); > + if (err < 0) > + return err; > + > + link->revision = values[0]; > + link->rate = drm_dp_bw_code_to_link_rate(values[1]); > + link->num_lanes = values[2] & DP_MAX_LANE_COUNT_MASK; > + > + if (values[2] & DP_ENHANCED_FRAME_CAP) > + link->capabilities = 1; > + > + return 0; > +} > + > +static int it6505_drm_dp_link_power_up(struct drm_dp_aux *aux, > + struct it6505_drm_dp_link *link) > +{ > + u8 value; > + int err; > + > + /* DP_SET_POWER register is only available on DPCD v1.1 and later */ > + if (link->revision < 0x11) > + return 0; > + > + err = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value); > + if (err < 0) > + return err; > + > + value &= ~DP_SET_POWER_MASK; > + value |= DP_SET_POWER_D0; > + > + err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value); > + if (err < 0) > + return err; > + > + /* > + * According to the DP 1.1 specification, a "Sink Device must exit the > + * power saving state within 1 ms" (Section 2.5.3.1, Table 5-52, "Sink > + * Control Field" (register 0x600). > + */ > + usleep_range(1000, 2000); > + > + return 0; > +} > + > +static void it6505_clear_int(struct it6505 *it6505) > +{ > + it6505_write(it6505, REG_BANK_SEL, 0x00); > + it6505_write(it6505, INT_STATUS_01, 0xFF); > + it6505_write(it6505, INT_STATUS_02, 0xFF); > + it6505_write(it6505, INT_STATUS_03, 0xFF); > +} > + > +static void it6505_int_mask_enable(struct it6505 *it6505) > +{ > + it6505_write(it6505, REG_BANK_SEL, 0x00); > + it6505_write(it6505, INT_MASK_01, 0x1F); > + it6505_write(it6505, INT_MASK_02, 0x07); > + it6505_write(it6505, INT_MASK_03, 0xB0); > +} > + > +static void it6505_int_mask_disable(struct it6505 *it6505) > +{ > + it6505_write(it6505, REG_BANK_SEL, 0x00); > + it6505_write(it6505, INT_MASK_01, 0x00); > + it6505_write(it6505, INT_MASK_02, 0x00); > + it6505_write(it6505, INT_MASK_03, 0x00); > +} > + > +static void it6505_lane_termination_on(struct it6505 *it6505) > +{ > + if (it6505_read(it6505, 0xCF) == 0xF0) > + it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, 0x80, 0x00); > + > + if (it6505_read(it6505, 0xCF) == 0x70) { > + if (it6505->lane_swap) { > + switch (it6505->lane_count) { > + case 1: > + case 2: > + it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, > + 0x0C, 0x08); > + break; > + default: > + it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, > + 0x0C, 0x0C); > + break; > + } > + } else { > + switch (it6505->lane_count) { > + case 1: > + case 2: > + it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, > + 0x0C, 0x04); > + break; > + default: > + it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, > + 0x0C, 0x0C); > + break; > + } > + } > + } > +} > + > +static void it6505_lane_termination_off(struct it6505 *it6505) > +{ > + if (it6505_read(it6505, 0xCF) == 0xF0) > + it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, 0x80, 0x80); > + > + if (it6505_read(it6505, 0xCF) == 0x70) > + it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, 0x0C, 0x00); > +} > + > +static void it6505_lane_power_on(struct it6505 *it6505) > +{ > + it6505_set_bits( > + it6505, REG_LINK_DRV, 0xF1, > + ((BIT(it6505->lane_count) - 1) > + << (it6505->lane_swap ? (8 - it6505->lane_count) : 4)) | > + 0x01); > +} > + > +static void it6505_lane_power_off(struct it6505 *it6505) > +{ > + it6505_set_bits(it6505, REG_LINK_DRV, 0xF0, 0x00); > +} > + > +static void it6505_lane_off(struct it6505 *it6505) > +{ > + it6505_lane_power_off(it6505); > + it6505_lane_termination_off(it6505); > +} > + > +static void it6505_aux_termination_on(struct it6505 *it6505) > +{ > + if (it6505_read(it6505, 0xCF) == 0xF0) > + it6505_lane_termination_on(it6505); > + > + if (it6505_read(it6505, 0xCF) == 0x70) > + it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, 0x80, 0x80); > +} > + > +static void it6505_aux_power_on(struct it6505 *it6505) > +{ > + it6505_set_bits(it6505, REG_AUX, 0x02, 0x02); > +} > + > +static void it6505_aux_on(struct it6505 *it6505) > +{ > + it6505_aux_power_on(it6505); > + it6505_aux_termination_on(it6505); > +} > + > +static void it6505_aux_reset(struct it6505 *it6505) > +{ > + it6505_set_bits(it6505, REG_RESET_CTRL, AUX_RESET, AUX_RESET); > + it6505_set_bits(it6505, REG_RESET_CTRL, AUX_RESET, 0x00); > +} > + > +static bool it6505_reset_logic(struct it6505 *it6505) > +{ > + regmap_write(it6505->regmap, REG_RESET_CTRL, ALL_LOGIC_RESET); > + usleep_range(1000, 1500); > + > + it6505->revision = it6505_read(it6505, REG_IC_VER); > + > + if (it6505->revision < 0) > + return false; > + > + return true; > +} > + > +static bool it6505_aux_op_finished(struct it6505 *it6505) > +{ > + int reg2b = it6505_read(it6505, REG_AUX_CMD_REQ); > + > + if (reg2b < 0) > + return false; > + > + return (reg2b & AUX_BUSY) == 0; > +} > + > +static int it6505_aux_wait(struct it6505 *it6505) > +{ > + int status; > + unsigned long timeout; > + struct device *dev = &it6505->client->dev; > + > + timeout = jiffies + msecs_to_jiffies(AUX_WAIT_TIMEOUT_MS) + 1; > + > + while (!it6505_aux_op_finished(it6505)) { > + if (time_after(jiffies, timeout)) { > + DRM_DEV_ERROR(dev, "Timed out waiting AUX to finish"); > + return -ETIMEDOUT; > + } > + usleep_range(1000, 2000); > + } > + > + status = it6505_read(it6505, REG_AUX_ERROR_STS); > + if (status < 0) { > + DRM_DEV_ERROR(dev, "Failed to read AUX channel: %d", status); > + return status; > + } > + > + return 0; > +} > + > +static ssize_t it6505_aux_operation(struct it6505 *it6505, > + enum aux_cmd_type cmd, > + unsigned int address, u8 *buffer, > + size_t size, enum aux_cmd_reply *reply) > +{ > + int i, status; > + bool aux_write_check = false; > + > + if (!it6505_get_sink_hpd_status(it6505)) > + return -EIO; > + > + /* set AUX user mode */ > + it6505_set_bits(it6505, REG_AUX_CTRL, AUX_USER_MODE, AUX_USER_MODE); > + > +aux_op_start: > + > + if (cmd == CMD_AUX_I2C_EDID_READ) { > + /* DP AUX EDID FIFO has maximum length of n bytes. */ > + size = min_t(size_t, size, AUX_FIFO_MAX_SIZE); > + /* Enable AUX FIFO read back and clear FIFO */ > + it6505_set_bits(it6505, REG_AUX_CTRL, > + AUX_EN_FIFO_READ | CLR_EDID_FIFO, > + AUX_EN_FIFO_READ | CLR_EDID_FIFO); > + > + it6505_set_bits(it6505, REG_AUX_CTRL, > + AUX_EN_FIFO_READ | CLR_EDID_FIFO, > + AUX_EN_FIFO_READ); > + } else { > + /* The DP AUX transmit buffer has 4 bytes. */ > + size = min_t(size_t, size, 4); > + it6505_set_bits(it6505, REG_AUX_CTRL, AUX_NO_SEGMENT_WR, > + AUX_NO_SEGMENT_WR); > + } > + > + /* Start Address[7:0] */ > + it6505_write(it6505, REG_AUX_ADR_0_7, (address >> 0) & 0xFF); > + /* Start Address[15:8] */ > + it6505_write(it6505, REG_AUX_ADR_8_15, (address >> 8) & 0xFF); > + /* WriteNum[3:0]+StartAdr[19:16] */ > + it6505_write(it6505, REG_AUX_ADR_16_19, > + ((address >> 16) & 0x0F) | ((size - 1) << 4)); > + > + if (cmd == CMD_AUX_NATIVE_WRITE) > + regmap_bulk_write(it6505->regmap, REG_AUX_OUT_DATA0, buffer, > + size); > + > + /* Aux Fire */ > + it6505_write(it6505, REG_AUX_CMD_REQ, cmd); > + > + status = it6505_aux_wait(it6505); > + if (status < 0) > + goto aux_op_err; > + > + status = it6505_read(it6505, REG_AUX_ERROR_STS); > + if (status < 0) > + goto aux_op_err; > + > + switch ((status >> 6) & 0x3) { > + case 0: > + *reply = REPLY_ACK; > + break; > + case 1: > + *reply = REPLY_DEFER; > + status = -EAGAIN; > + goto aux_op_err; > + case 2: > + *reply = REPLY_NACK; > + status = -EIO; > + goto aux_op_err; > + case 3: > + status = -ETIMEDOUT; > + goto aux_op_err; > + } > + > + /* Read back Native Write data */ > + if (cmd == CMD_AUX_NATIVE_WRITE) { > + aux_write_check = true; > + cmd = CMD_AUX_NATIVE_READ; > + goto aux_op_start; > + } > + > + if (cmd == CMD_AUX_I2C_EDID_READ) { > + for (i = 0; i < size; i++) { > + status = it6505_read(it6505, REG_AUX_DATA_FIFO); > + if (status < 0) > + goto aux_op_err; > + buffer[i] = status; > + } > + } else { > + for (i = 0; i < size; i++) { > + status = it6505_read(it6505, REG_AUX_DATA_0_7 + i); > + if (status < 0) > + goto aux_op_err; > + > + if (aux_write_check && buffer[size - 1 - i] != status) > + break; > + > + buffer[size - 1 - i] = status; > + } > + } > + > + status = i; > + > +aux_op_err: > + > + if (cmd == CMD_AUX_I2C_EDID_READ) { > + /*clear AUX FIFO */ > + it6505_set_bits(it6505, REG_AUX_CTRL, > + AUX_EN_FIFO_READ | CLR_EDID_FIFO, > + AUX_EN_FIFO_READ | CLR_EDID_FIFO); > + it6505_set_bits(it6505, REG_AUX_CTRL, > + AUX_EN_FIFO_READ | CLR_EDID_FIFO, 0x00); > + } > + > + /* Leave AUX user mode */ > + it6505_set_bits(it6505, REG_AUX_CTRL, AUX_USER_MODE, 0); > + > + return status; > +} > + > +static ssize_t it6505_aux_do_transfer(struct it6505 *it6505, > + enum aux_cmd_type cmd, > + unsigned int address, u8 *buffer, > + size_t size, enum aux_cmd_reply *reply) > +{ > + int i, ret, ret_size = 0, request_size; > + > + mutex_lock(&it6505->aux_lock); > + for (i = 0; i < size; i += 4) { > + request_size = min((int)size - i, 4); > + ret = it6505_aux_operation(it6505, cmd, address + i, > + buffer + i, request_size, reply); > + if (ret < 0) { > + ret_size = ret; > + goto aux_op_err; > + } > + > + ret_size += ret; > + } > +aux_op_err: > + > + mutex_unlock(&it6505->aux_lock); > + return ret_size; > +} > + > +static ssize_t it6505_aux_transfer(struct drm_dp_aux *aux, > + struct drm_dp_aux_msg *msg) > +{ > + struct it6505 *it6505 = container_of(aux, struct it6505, aux); > + u8 cmd; > + bool is_i2c = !(msg->request & DP_AUX_NATIVE_WRITE); > + int ret; > + enum aux_cmd_reply reply; > + > + /* IT6505 doesn't support arbitrary I2C read / write. */ > + if (is_i2c) > + return -EINVAL; > + > + switch (msg->request) { > + case DP_AUX_NATIVE_READ: > + cmd = CMD_AUX_NATIVE_READ; > + break; > + case DP_AUX_NATIVE_WRITE: > + cmd = CMD_AUX_NATIVE_WRITE; > + break; > + default: > + return -EINVAL; > + } > + > + ret = it6505_aux_do_transfer(it6505, cmd, msg->address, msg->buffer, > + msg->size, &reply); > + if (ret < 0) > + return ret; > + > + switch (reply) { > + case REPLY_ACK: > + msg->reply = DP_AUX_NATIVE_REPLY_ACK; > + break; > + case REPLY_NACK: > + msg->reply = DP_AUX_NATIVE_REPLY_NACK; > + break; > + case REPLY_DEFER: > + msg->reply = DP_AUX_NATIVE_REPLY_DEFER; > + break; > + } > + > + return ret; > +} > + > +static int it6505_get_edid_block(void *data, u8 *buf, unsigned int block, > + size_t len) > +{ > + struct it6505 *it6505 = data; > + struct device *dev = &it6505->client->dev; > + enum aux_cmd_reply reply; > + int offset, ret, aux_retry = 100; > + > + it6505_aux_reset(it6505); > + DRM_DEV_DEBUG_DRIVER(dev, "block number = %d", block); > + > + for (offset = 0; offset < EDID_LENGTH;) { > + ret = it6505_aux_do_transfer(it6505, CMD_AUX_I2C_EDID_READ, > + block * EDID_LENGTH + offset, > + buf + offset, 8, &reply); > + > + if (ret < 0 && ret != -EAGAIN) > + return ret; > + > + switch (reply) { > + case REPLY_ACK: > + DRM_DEV_DEBUG_DRIVER(dev, "[0x%02x]: %8ph", offset, > + buf + offset); > + offset += 8; > + aux_retry = 100; > + break; > + case REPLY_NACK: > + return -EIO; > + case REPLY_DEFER: > + msleep(20); > + if (!(--aux_retry)) > + return -EIO; > + } > + } > + > + return 0; > +} > + > +static void it6505_variable_config(struct it6505 *it6505) > +{ > + it6505->link_rate_bw_code = HBR; > + it6505->lane_count = MAX_LANE_COUNT; > + it6505->link_state = LINK_IDLE; > + it6505->auto_train_retry = AUTO_TRAIN_RETRY; > + it6505->audio.select = AUDIO_SELECT; > + it6505->audio.sample_rate = AUDIO_SAMPLE_RATE; > + it6505->audio.channel_count = AUDIO_CHANNEL_COUNT; > + it6505->audio.type = AUDIO_TYPE; > + it6505->audio.i2s_input_format = I2S_INPUT_FORMAT; > + it6505->audio.i2s_justified = I2S_JUSTIFIED; > + it6505->audio.i2s_data_delay = I2S_DATA_DELAY; > + it6505->audio.i2s_ws_channel = I2S_WS_CHANNEL; > + it6505->audio.i2s_data_sequence = I2S_DATA_SEQUENCE; > + it6505->audio.word_length = AUDIO_WORD_LENGTH; > +} > + > +static int it6505_send_video_infoframe(struct it6505 *it6505, > + struct hdmi_avi_infoframe *frame) > +{ > + u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE]; > + int err; > + struct device *dev = &it6505->client->dev; > + > + err = hdmi_avi_infoframe_pack(frame, buffer, sizeof(buffer)); > + if (err < 0) { > + DRM_DEV_ERROR(dev, "Failed to pack AVI infoframe: %d", err); > + return err; > + } > + > + err = it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT, 0x00); > + if (err) > + return err; > + > + err = regmap_bulk_write(it6505->regmap, REG_AVI_INFO_DB1, > + buffer + HDMI_INFOFRAME_HEADER_SIZE, > + frame->length); > + if (err) > + return err; > + > + err = it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT, > + EN_AVI_PKT); > + if (err) > + return err; > + > + return 0; > +} > + > +static void it6505_get_extcon_property(struct it6505 *it6505) > +{ > + int err; > + union extcon_property_value property; > + struct device *dev = &it6505->client->dev; > + > + if (it6505->extcon && !it6505->lane_swap_disabled) { > + err = extcon_get_property(it6505->extcon, EXTCON_DISP_DP, > + EXTCON_PROP_USB_TYPEC_POLARITY, > + &property); > + if (err) { > + DRM_DEV_ERROR(dev, "get property fail!"); > + return; > + } > + it6505->lane_swap = property.intval; > + } > +} > + > +static void it6505_clk_phase_adjustment(struct it6505 *it6505, > + const struct drm_display_mode *mode) > +{ > + it6505_set_bits(it6505, REG_CLK_CTRL0, M_PCLK_DELAY, > + mode->clock < ADJUST_PHASE_THRESHOLD ? PIXEL_CLK_DELAY : 0); > + it6505_set_bits(it6505, REG_DATA_CTRL0, VIDEO_LATCH_EDGE, > + PIXEL_CLK_INVERSE << 4); > +} > + > +static void it6505_init(struct it6505 *it6505) > +{ > + it6505_write(it6505, REG_BANK_SEL, 0x00); > + it6505_write(it6505, REG_AUX_OPT, AUX_AUTO_RST | AUX_FIX_FREQ); > + it6505_write(it6505, REG_AUX_CTRL, AUX_NO_SEGMENT_WR); > + it6505_write(it6505, REG_HDCP_CTRL2, HDCP_AN_SEL | HDCP_HW_HPDIRQ_ACT); > + it6505_write(it6505, REG_VID_BUS_CTRL0, IN_DDR | DDR_CD); > + it6505_write(it6505, REG_VID_BUS_CTRL1, 0x01); > + it6505_write(it6505, REG_AUDIO_CTRL0, AUDIO_16B_BOUND); > + > + /* chip internal setting, don't modify */ > + it6505_write(it6505, REG_HPD_IRQ_TIME, 0xF5); > + it6505_write(it6505, REG_AUX_DEBUG_MODE, 0x4D); > + it6505_write(it6505, REG_AUX_OPT2, 0x17); > + it6505_write(it6505, REG_HDCP_OPT, 0x60); > + it6505_write(it6505, REG_DATA_MUTE_CTRL, > + EN_VID_MUTE | EN_AUD_MUTE | ENABLE_AUTO_VIDEO_FIFO_RESET); > + it6505_write(it6505, REG_TIME_STMP_CTRL, > + EN_SSC_GAT | EN_ENHANCE_VID_STMP | EN_ENHANCE_AUD_STMP); > + it6505_write(it6505, REG_INFOFRAME_CTRL, 0x00); > + it6505_write(it6505, REG_BANK_SEL, 0x01); > + it6505_write(it6505, REG_DRV_0_DB_800_MV, > + afe_setting_table[it6505->afe_setting][0]); > + it6505_write(it6505, REG_PRE_0_DB_800_MV, > + afe_setting_table[it6505->afe_setting][1]); > + it6505_write(it6505, REG_PRE_3P5_DB_800_MV, > + afe_setting_table[it6505->afe_setting][2]); > + it6505_write(it6505, REG_SSC_CTRL0, 0x9E); > + it6505_write(it6505, REG_SSC_CTRL1, 0x1C); > + it6505_write(it6505, REG_SSC_CTRL2, 0x42); > + it6505_write(it6505, REG_BANK_SEL, 0x00); > +} > + > +static void it6505_video_disable(struct it6505 *it6505) > +{ > + it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_VID_MUTE, EN_VID_MUTE); > + it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_VID_CTRL_PKT, 0x00); > + it6505_set_bits(it6505, REG_RESET_CTRL, VIDEO_RESET, VIDEO_RESET); > +} > + > +static void it6505_video_reset(struct it6505 *it6505) > +{ > + it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_VID_MUTE, EN_VID_MUTE); > + it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_VID_CTRL_PKT, 0x00); > + it6505_set_bits(it6505, REG_RESET_CTRL, VIDEO_RESET, VIDEO_RESET); > + it6505_set_bits(it6505, REG_501_FIFO_CTRL, RST_501_FIFO, RST_501_FIFO); > + it6505_set_bits(it6505, REG_501_FIFO_CTRL, RST_501_FIFO, 0x00); > + it6505_set_bits(it6505, REG_RESET_CTRL, VIDEO_RESET, 0x00); > +} > + > +static void it6505_update_video_prarmeter(struct it6505 *it6505, > + const struct drm_display_mode *mode) > +{ > + it6505_clk_phase_adjustment(it6505, mode); > + it6505_video_disable(it6505); > +} > + > +static bool it6505_audio_input(struct it6505 *it6505) > +{ > + int reg05, regbe; > + > + reg05 = it6505_read(it6505, REG_RESET_CTRL); > + it6505_set_bits(it6505, REG_RESET_CTRL, AUDIO_RESET, 0x00); > + usleep_range(3000, 4000); > + regbe = it6505_read(it6505, REG_AUDIO_INPUT_FREQ); > + it6505_write(it6505, REG_RESET_CTRL, reg05); > + > + return regbe != 0xFF; > +} > + > +static void it6505_setup_audio_channel_status(struct it6505 *it6505) > +{ > + enum it6505_audio_sample_rate sample_rate = it6505->audio.sample_rate; > + u8 audio_word_length_map[] = {0x02, 0x04, 0x03, 0x0B}; > + > + /* Channel Status */ > + it6505_write(it6505, REG_IEC958_STS0, it6505->audio.type << 1); > + it6505_write(it6505, REG_IEC958_STS1, 0x00); > + it6505_write(it6505, REG_IEC958_STS2, 0x00); > + it6505_write(it6505, REG_IEC958_STS3, sample_rate); > + it6505_write(it6505, REG_IEC958_STS4, (~sample_rate << 4) | > + audio_word_length_map[it6505->audio.word_length]); > +} > + > +static void it6505_setup_audio_format(struct it6505 *it6505) > +{ > + /* I2S MODE */ > + it6505_write(it6505, REG_AUDIO_FMT, > + (it6505->audio.word_length << 5) | > + (it6505->audio.i2s_data_sequence << 4) | > + (it6505->audio.i2s_ws_channel << 3) | > + (it6505->audio.i2s_data_delay << 2) | > + (it6505->audio.i2s_justified << 1) | > + it6505->audio.i2s_input_format); > + if (it6505->audio.select == SPDIF) { > + it6505_write(it6505, REG_AUDIO_FIFO_SEL, 0x00); > + /* 0x30 = 128*FS */ > + it6505_set_bits(it6505, REG_AUX_OPT, 0xF0, 0x30); > + } else { > + it6505_write(it6505, REG_AUDIO_FIFO_SEL, 0xE4); > + } > + > + it6505_write(it6505, REG_AUDIO_CTRL0, 0x20); > + it6505_write(it6505, REG_AUDIO_CTRL1, 0x00); > +} > + > +static void it6505_enable_audio_source(struct it6505 *it6505) > +{ > + unsigned int audio_source_count; > + > + audio_source_count = BIT(DIV_ROUND_UP(it6505->audio.channel_count, 2)) > + - 1; > + > + audio_source_count |= it6505->audio.select << 4; > + > + it6505_write(it6505, REG_AUDIO_SRC_CTRL, audio_source_count); > +} > + > +static void it6505_enable_audio_infoframe(struct it6505 *it6505) > +{ > + struct device *dev = &it6505->client->dev; > + u8 audio_info_ca[] = { 0x00, 0x00, 0x01, 0x03, 0x07, 0x0B, 0x0F, 0x1F }; > + > + DRM_DEV_DEBUG_DRIVER(dev, "infoframe channel_allocation:0x%02x", > + audio_info_ca[it6505->audio.channel_count - 1]); > + > + it6505_write(it6505, REG_AUD_INFOFRAM_DB1, it6505->audio.channel_count > + - 1); > + it6505_write(it6505, REG_AUD_INFOFRAM_DB2, 0x00); > + it6505_write(it6505, REG_AUD_INFOFRAM_DB3, > + audio_info_ca[it6505->audio.channel_count - 1]); > + it6505_write(it6505, REG_AUD_INFOFRAM_DB4, 0x00); > + it6505_write(it6505, REG_AUD_INFOFRAM_SUM, 0x00); > + > + /* Enable Audio InfoFrame */ > + it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AUD_CTRL_PKT, > + EN_AUD_CTRL_PKT); > +} > + > +static void it6505_disable_audio(struct it6505 *it6505) > +{ > + it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_AUD_MUTE, EN_AUD_MUTE); > + it6505_set_bits(it6505, REG_AUDIO_SRC_CTRL, M_AUDIO_I2S_EN, 0x00); > + it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AUD_CTRL_PKT, 0x00); > + it6505_set_bits(it6505, REG_RESET_CTRL, AUDIO_RESET, AUDIO_RESET); > + it6505->enable_audio = false; > +} > + > +static void it6505_enable_audio(struct it6505 *it6505) > +{ > + struct device *dev = &it6505->client->dev; > + int regbe; > + > + DRM_DEV_DEBUG_DRIVER(dev, "start"); > + it6505_disable_audio(it6505); > + > + it6505_setup_audio_channel_status(it6505); > + it6505_setup_audio_format(it6505); > + it6505_enable_audio_source(it6505); > + it6505_enable_audio_infoframe(it6505); > + > + it6505_write(it6505, REG_AUDIO_N_0_7, 0x00); > + it6505_write(it6505, REG_AUDIO_N_8_15, 0x80); > + it6505_write(it6505, REG_AUDIO_N_16_23, 0x00); > + > + it6505_set_bits(it6505, REG_AUDIO_SRC_CTRL, AUDIO_FIFO_RESET, > + AUDIO_FIFO_RESET); > + it6505_set_bits(it6505, REG_AUDIO_SRC_CTRL, AUDIO_FIFO_RESET, 0x00); > + it6505_set_bits(it6505, REG_RESET_CTRL, AUDIO_RESET, 0x00); > + regbe = it6505_read(it6505, REG_AUDIO_INPUT_FREQ); > + DRM_DEV_DEBUG_DRIVER(dev, "regbe:0x%02x audio input fs: %d.%d kHz", > + regbe, 6750 / regbe, 67500 % regbe); > + it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_AUD_MUTE, 0x00); > +} > + > +static bool it6505_use_step_train_check(struct it6505 *it6505) > +{ > + if (it6505->link.revision >= 0x12) > + return it6505->dpcd[DP_TRAINING_AUX_RD_INTERVAL] >= 0x01; > + > + return true; > +} > + > +static void it6505_parse_link_capabilities(struct it6505 *it6505) > +{ > + struct device *dev = &it6505->client->dev; > + struct it6505_drm_dp_link *link = &it6505->link; > + int bcaps; > + > + if (it6505->dpcd[0] == 0) { > + it6505_aux_on(it6505); > + it6505_get_dpcd(it6505, DP_DPCD_REV, it6505->dpcd, > + ARRAY_SIZE(it6505->dpcd)); > + } > + > + DRM_DEV_DEBUG_DRIVER(dev, "DPCD Rev.: %d.%d", > + link->revision >> 4, link->revision & 0x0F); > + > + DRM_DEV_DEBUG_DRIVER(dev, "Sink max link rate: %d.%d Gbps per lane", > + link->rate / 100000, link->rate / 1000 % 100); > + > + it6505->link_rate_bw_code = drm_dp_link_rate_to_bw_code(link->rate); > + DRM_DEV_DEBUG_DRIVER(dev, "link rate bw code:0x%02x", > + it6505->link_rate_bw_code); > + it6505->link_rate_bw_code = min((int)it6505->link_rate_bw_code, > + MAX_LINK_RATE); > + > + it6505->lane_count = link->num_lanes; > + DRM_DEV_DEBUG_DRIVER(dev, "Sink support %d lanes training", > + it6505->lane_count); > + it6505->lane_count = min((int)it6505->lane_count, MAX_LANE_COUNT); > + > + it6505->branch_device = drm_dp_is_branch(it6505->dpcd); > + DRM_DEV_DEBUG_DRIVER(dev, "Sink %sbranch device", > + it6505->branch_device ? "" : "Not "); > + > + it6505->enable_enhanced_frame = !!link->capabilities; > + DRM_DEV_DEBUG_DRIVER(dev, "Sink %sSupport Enhanced Framing", > + it6505->enable_enhanced_frame ? "" : "Not "); > + > + it6505->enable_ssc = !!(it6505->dpcd[DP_MAX_DOWNSPREAD] & > + DP_MAX_DOWNSPREAD_0_5); > + DRM_DEV_DEBUG_DRIVER(dev, "Maximum Down-Spread: %s, %ssupport SSC!", > + it6505->enable_ssc ? "0.5" : "0", > + it6505->enable_ssc ? "" : "Not "); > + > + it6505->step_train = it6505_use_step_train_check(it6505); > + if (it6505->step_train) > + DRM_DEV_DEBUG_DRIVER(dev, "auto train fail, will step train"); > + > + bcaps = it6505_dpcd_read(it6505, DP_AUX_HDCP_BCAPS); > + DRM_DEV_DEBUG_DRIVER(dev, "bcaps:0x%02x", bcaps); > + if (bcaps & DP_BCAPS_HDCP_CAPABLE) { > + it6505->is_repeater = !!(bcaps & DP_BCAPS_REPEATER_PRESENT); > + DRM_DEV_DEBUG_DRIVER(dev, "Support HDCP! Downstream is %s!", > + it6505->is_repeater ? "repeater" : > + "receiver"); > + } else { > + DRM_DEV_DEBUG_DRIVER(dev, "Sink not support HDCP!"); > + } > +} > + > +static void it6505_setup_ssc(struct it6505 *it6505) > +{ > + it6505_set_bits(it6505, REG_TRAIN_CTRL0, SPREAD_AMP_5, > + it6505->enable_ssc ? SPREAD_AMP_5 : 0x00); > + if (it6505->enable_ssc) { > + it6505_write(it6505, REG_BANK_SEL, 0x01); > + it6505_write(it6505, REG_SSC_CTRL0, 0x9E); > + it6505_write(it6505, REG_SSC_CTRL1, 0x1C); > + it6505_write(it6505, REG_SSC_CTRL2, 0x42); > + it6505_write(it6505, REG_BANK_SEL, 0x00); > + it6505_write(it6505, REG_SP_CTRL0, 0x07); > + it6505_write(it6505, REG_IP_CTRL1, 0x29); > + it6505_write(it6505, REG_IP_CTRL2, 0x03); > + /* Stamp Interrupt Step */ > + it6505_set_bits(it6505, REG_TIME_STMP_CTRL, M_STAMP_STEP, > + 0x10); > + it6505_dpcd_write(it6505, DP_DOWNSPREAD_CTRL, > + DP_SPREAD_AMP_0_5); > + } else { > + it6505_dpcd_write(it6505, DP_DOWNSPREAD_CTRL, 0x00); > + it6505_set_bits(it6505, REG_TIME_STMP_CTRL, M_STAMP_STEP, > + 0x00); > + } > +} > + > +static inline void it6505_link_rate_setup(struct it6505 *it6505) > +{ > + it6505_set_bits(it6505, REG_TRAIN_CTRL0, FORCE_LBR, > + (it6505->link_rate_bw_code == RBR) ? FORCE_LBR : 0x00); > + it6505_set_bits(it6505, REG_LINK_DRV, DRV_HS, > + (it6505->link_rate_bw_code == RBR) ? 0x00 : DRV_HS); > +} > + > +static void it6505_lane_count_setup(struct it6505 *it6505) > +{ > + it6505_get_extcon_property(it6505); > + it6505_set_bits(it6505, REG_TRAIN_CTRL0, LANE_SWAP, > + it6505->lane_swap ? LANE_SWAP : 0x00); > + it6505_set_bits(it6505, REG_TRAIN_CTRL0, LANE_COUNT_MASK, > + (it6505->lane_count - 1) << 1); > +} > + > +static void it6505_link_training_setup(struct it6505 *it6505) > +{ > + struct device *dev = &it6505->client->dev; > + > + if (it6505->enable_enhanced_frame) > + it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, > + ENABLE_ENHANCED_FRAME, ENABLE_ENHANCED_FRAME); > + > + it6505_link_rate_setup(it6505); > + it6505_lane_count_setup(it6505); > + it6505_setup_ssc(it6505); > + DRM_DEV_DEBUG_DRIVER(dev, > + "%s, %d lanes, %sable ssc, %sable enhanced frame", > + it6505->link_rate_bw_code != RBR ? "HBR" : "RBR", > + it6505->lane_count, > + it6505->enable_ssc ? "en" : "dis", > + it6505->enable_enhanced_frame ? "en" : "dis"); > +} > + > +static bool it6505_link_start_auto_train(struct it6505 *it6505) > +{ > + int timeout = 500, link_training_state; > + > + it6505_set_bits(it6505, REG_TRAIN_CTRL0, > + FORCE_CR_DONE | FORCE_EQ_DONE, 0x00); > + it6505_write(it6505, REG_TRAIN_CTRL1, FORCE_RETRAIN); > + it6505_write(it6505, REG_TRAIN_CTRL1, AUTO_TRAIN); > + > + while (timeout > 0) { > + usleep_range(1000, 2000); > + link_training_state = it6505_read(it6505, REG_LINK_TRAIN_STS); > + > + if ((link_training_state > 0) && > + (link_training_state & LINK_STATE_NORP)) > + return true; > + > + timeout--; > + } > + > + return false; > +} > + > +static int it6505_drm_dp_link_configure(struct it6505 *it6505) > +{ > + u8 values[2]; > + int err; > + struct drm_dp_aux *aux = &it6505->aux; > + > + values[0] = it6505->link_rate_bw_code; > + values[1] = it6505->lane_count; > + > + if (it6505->enable_enhanced_frame) > + values[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN; > + > + err = drm_dp_dpcd_write(aux, DP_LINK_BW_SET, values, sizeof(values)); > + if (err < 0) > + return err; > + > + return 0; > +} > + > +static u8 dp_link_status(const u8 link_status[DP_LINK_STATUS_SIZE], int r) > +{ > + return link_status[r - DP_LANE0_1_STATUS]; > +} > + > +static bool it6505_check_max_value(enum max_value_check type, > + u8 lane_voltage_swing_pre_emphasis) > +{ > + if (type == VOLTAGE_SWING) > + return ((lane_voltage_swing_pre_emphasis & 0x03) == > + MAX_CR_LEVEL); > + else > + return ((lane_voltage_swing_pre_emphasis & 0x03) == > + MAX_EQ_LEVEL); > +} > + > +static bool it6505_check_max_voltage_swing_reached(u8 *lane_voltage_swing, > + u8 lane_count) > +{ > + u8 i; > + > + for (i = 0; i < lane_count; i++) { > + if (lane_voltage_swing[i] & DP_TRAIN_MAX_SWING_REACHED) > + return true; > + } > + > + return false; > +} > + > +static bool it6505_step_train_lane_voltage_pre_emphasis_set( > + struct it6505 *it6505, > + struct it6505_step_train_para *lane_voltage_pre_emphasis, > + u8 *lane_voltage_pre_emphasis_set) > +{ > + u8 i; > + > + for (i = 0; i < it6505->lane_count; i++) { > + lane_voltage_pre_emphasis->voltage_swing[i] &= 0x03; > + lane_voltage_pre_emphasis_set[i] = > + lane_voltage_pre_emphasis->voltage_swing[i]; > + if (it6505_check_max_value( > + VOLTAGE_SWING, > + lane_voltage_pre_emphasis->voltage_swing[i])) > + lane_voltage_pre_emphasis_set[i] |= > + DP_TRAIN_MAX_SWING_REACHED; > + > + lane_voltage_pre_emphasis->pre_emphasis[i] &= 0x03; > + lane_voltage_pre_emphasis_set[i] |= > + lane_voltage_pre_emphasis->pre_emphasis[i] > + << DP_TRAIN_PRE_EMPHASIS_SHIFT; > + if (it6505_check_max_value( > + PRE_EMPHASIS, > + lane_voltage_pre_emphasis->pre_emphasis[i])) > + lane_voltage_pre_emphasis_set[i] |= > + DP_TRAIN_MAX_PRE_EMPHASIS_REACHED; > + it6505_dpcd_write(it6505, DP_TRAINING_LANE0_SET + i, > + lane_voltage_pre_emphasis_set[i]); > + > + if (lane_voltage_pre_emphasis_set[i] != > + it6505_dpcd_read(it6505, DP_TRAINING_LANE0_SET + i)) > + return false; > + } > + > + return true; > +} > + > +static bool > +it6505_step_cr_train(struct it6505 *it6505, > + struct it6505_step_train_para *lane_voltage_pre_emphasis) > +{ > + u8 loop_count = 0, i = 0, j; > + u8 link_status[DP_LINK_STATUS_SIZE] = { 0 }; > + u8 lane_level_config[MAX_LANE_COUNT] = { 0 }; > + int pre_emphasis_adjust = -1, voltage_swing_adjust = -1; > + > + it6505_dpcd_write(it6505, DP_DOWNSPREAD_CTRL, > + it6505->enable_ssc ? DP_SPREAD_AMP_0_5 : 0x00); > + it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, > + DP_TRAINING_PATTERN_1); > + > + while (loop_count < 5 && i < 10) { > + i++; > + if (!it6505_step_train_lane_voltage_pre_emphasis_set( > + it6505, lane_voltage_pre_emphasis, > + lane_level_config)) > + continue; > + drm_dp_link_train_clock_recovery_delay(it6505->dpcd); > + drm_dp_dpcd_read_link_status(&it6505->aux, link_status); > + > + if (drm_dp_clock_recovery_ok(link_status, it6505->lane_count)) { > + it6505_set_bits(it6505, REG_TRAIN_CTRL0, FORCE_CR_DONE, > + FORCE_CR_DONE); > + return true; > + } > + DRM_DEV_DEBUG_DRIVER(&it6505->client->dev, "cr not done"); > + > + if (it6505_check_max_voltage_swing_reached(lane_level_config, > + it6505->lane_count)) > + goto cr_train_fail; > + > + for (j = 0; j < it6505->lane_count; j++) { > + lane_voltage_pre_emphasis->voltage_swing[j] = > + drm_dp_get_adjust_request_voltage(link_status, > + j) >> > + DP_TRAIN_VOLTAGE_SWING_SHIFT; > + lane_voltage_pre_emphasis->pre_emphasis[j] = > + drm_dp_get_adjust_request_pre_emphasis( > + link_status, j) >> > + DP_TRAIN_PRE_EMPHASIS_SHIFT; > + if ((voltage_swing_adjust == > + lane_voltage_pre_emphasis->voltage_swing[j]) && > + (pre_emphasis_adjust == > + lane_voltage_pre_emphasis->pre_emphasis[j])) { > + loop_count++; > + continue; > + } > + > + voltage_swing_adjust = > + lane_voltage_pre_emphasis->voltage_swing[j]; > + pre_emphasis_adjust = > + lane_voltage_pre_emphasis->pre_emphasis[j]; > + loop_count = 0; > + > + if (voltage_swing_adjust + pre_emphasis_adjust > 0x03) > + lane_voltage_pre_emphasis->voltage_swing[j] = > + MAX_EQ_LEVEL - > + lane_voltage_pre_emphasis > + ->pre_emphasis[j]; > + } > + } > + > +cr_train_fail: > + it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, > + DP_TRAINING_PATTERN_DISABLE); > + > + return false; > +} > + > +static bool > +it6505_step_eq_train(struct it6505 *it6505, > + struct it6505_step_train_para *lane_voltage_pre_emphasis) > +{ > + u8 loop_count = 0, i, link_status[DP_LINK_STATUS_SIZE] = { 0 }; > + u8 lane_level_config[MAX_LANE_COUNT] = { 0 }; > + > + it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, > + DP_TRAINING_PATTERN_2); > + > + while (loop_count < 6) { > + loop_count++; > + > + if (!it6505_step_train_lane_voltage_pre_emphasis_set( > + it6505, lane_voltage_pre_emphasis, > + lane_level_config)) > + continue; > + > + drm_dp_link_train_channel_eq_delay(it6505->dpcd); > + drm_dp_dpcd_read_link_status(&it6505->aux, link_status); > + > + if (!drm_dp_clock_recovery_ok(link_status, it6505->lane_count)) > + goto eq_train_fail; > + > + if (drm_dp_channel_eq_ok(link_status, it6505->lane_count)) { > + it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, > + DP_TRAINING_PATTERN_DISABLE); > + it6505_set_bits(it6505, REG_TRAIN_CTRL0, FORCE_EQ_DONE, > + FORCE_EQ_DONE); > + return true; > + } > + DRM_DEV_DEBUG_DRIVER(&it6505->client->dev, "eq not done"); > + > + for (i = 0; i < it6505->lane_count; i++) { > + lane_voltage_pre_emphasis->voltage_swing[i] = > + drm_dp_get_adjust_request_voltage(link_status, > + i) >> > + DP_TRAIN_VOLTAGE_SWING_SHIFT; > + lane_voltage_pre_emphasis->pre_emphasis[i] = > + drm_dp_get_adjust_request_pre_emphasis( > + link_status, i) >> > + DP_TRAIN_PRE_EMPHASIS_SHIFT; > + > + if (lane_voltage_pre_emphasis->voltage_swing[i] + > + lane_voltage_pre_emphasis->pre_emphasis[i] > > + 0x03) > + lane_voltage_pre_emphasis->voltage_swing[i] = > + 0x03 - lane_voltage_pre_emphasis > + ->pre_emphasis[i]; > + } > + } > + > +eq_train_fail: > + it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, > + DP_TRAINING_PATTERN_DISABLE); > + return false; > +} > + > +static bool it6505_link_start_step_train(struct it6505 *it6505) > +{ > + int err; > + struct it6505_step_train_para lane_voltage_pre_emphasis = { > + .voltage_swing = { 0 }, > + .pre_emphasis = { 0 }, > + }; > + > + DRM_DEV_DEBUG_DRIVER(&it6505->client->dev, "start"); > + err = it6505_drm_dp_link_configure(it6505); > + > + if (err != 0) > + return false; > + if (!it6505_step_cr_train(it6505, &lane_voltage_pre_emphasis)) > + return false; > + if (!it6505_step_eq_train(it6505, &lane_voltage_pre_emphasis)) > + return false; > + return true; > +} > + > +static bool it6505_get_video_status(struct it6505 *it6505) > +{ > + int reg_0d; > + > + reg_0d = it6505_read(it6505, REG_SYSTEM_STS); > + > + if (reg_0d < 0) > + return false; > + > + return (reg_0d & VIDEO_STB) ? true : false; > +} > + > +static void it6505_reset_hdcp(struct it6505 *it6505) > +{ > + /* Disable CP_Desired */ > + it6505_set_bits(it6505, REG_HDCP_CTRL1, HDCP_CP_ENABLE, 0x00); > + it6505_set_bits(it6505, REG_RESET_CTRL, HDCP_RESET, HDCP_RESET); > +} > + > +static void it6505_stop_link_train(struct it6505 *it6505) > +{ > + it6505->link_state = LINK_IDLE; > + cancel_work_sync(&it6505->link_works); > + it6505_write(it6505, REG_TRAIN_CTRL1, FORCE_RETRAIN); > +} > + > +static void it6505_link_training_work(struct work_struct *work) > +{ > + struct it6505 *it6505 = container_of(work, struct it6505, link_works); > + struct device *dev = &it6505->client->dev; > + int err, i, step_retry = 3; > + > + DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count: %d", > + it6505->sink_count); > + > + > + if (!it6505_get_sink_hpd_status(it6505)) > + return; > + > + it6505_link_training_setup(it6505); > + > + if (it6505->auto_train_retry < 1) > + goto step_train; > + > + it6505_reset_hdcp(it6505); > + it6505_aux_reset(it6505); > + err = it6505_link_start_auto_train(it6505); > + DRM_DEV_DEBUG_DRIVER(dev, "auto train %s, auto_train_retry: %d", > + err ? "pass" : "failed", it6505->auto_train_retry); > + it6505->auto_train_retry--; > + > + if (err) > + goto link_train_ok; > + > + it6505_dump(it6505); > + return; > + > +step_train: > + DRM_DEV_DEBUG_DRIVER(dev, "Start step train"); > + > + if (it6505->sink_count == 0) { > + DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count:%d, force eq", > + it6505->sink_count); > + it6505_set_bits(it6505, REG_TRAIN_CTRL0, FORCE_EQ_DONE, > + FORCE_EQ_DONE); > + return; > + } > + > + if (!it6505->step_train) > + goto link_train_error; > + > + /* setp training start here */ > + for (i = 0; i < step_retry; i++) { > + it6505_set_bits(it6505, REG_TRAIN_CTRL0, > + FORCE_CR_DONE | FORCE_EQ_DONE, 0x00); > + it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, > + DP_TRAINING_PATTERN_DISABLE); > + err = it6505_link_start_step_train(it6505); > + DRM_DEV_DEBUG_DRIVER(dev, "step train %s, retry:%d times", > + err ? "pass" : "failed", i + 1); > + if (err) > + goto link_train_ok; > + } > + > +link_train_error: > + DRM_DEV_DEBUG_DRIVER(dev, "training fail"); > + it6505->link_state = LINK_IDLE; > + > + if (!it6505_get_video_status(it6505)) > + it6505_video_reset(it6505); > + return; > + > +link_train_ok: > + > + it6505->link_state = LINK_OK; > + /* disalbe mute enable avi info frame */ > + it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_VID_MUTE, 0x00); > + it6505_set_bits(it6505, REG_INFOFRAME_CTRL, > + EN_VID_CTRL_PKT, EN_VID_CTRL_PKT); > + > + if (it6505_audio_input(it6505)) { > + DRM_DEV_DEBUG_DRIVER(dev, "Enable audio!"); > + it6505_enable_audio(it6505); > + } > +} > + > +static void it6505_plugged_status_to_codec(struct it6505 *it6505) > +{ > + enum drm_connector_status status = it6505->connector_status; > + > + if (it6505->plugged_cb && it6505->codec_dev) > + it6505->plugged_cb(it6505->codec_dev, > + status == connector_status_connected); > +} > + > +static int it6505_procss_hpd_irq(struct it6505 *it6505) > +{ > + struct device *dev = &it6505->client->dev; > + int ret, dpcd_sink_count, dp_irq_vector; > + u8 link_status[DP_LINK_STATUS_SIZE]; > + > + if (!it6505_get_sink_hpd_status(it6505)) { > + DRM_DEV_DEBUG_DRIVER(dev, "HPD_IRQ HPD low"); > + it6505->sink_count = 0; > + return 0; > + } > + > + ret = it6505_dpcd_read(it6505, DP_SINK_COUNT); > + if (ret < 0) > + return ret; > + > + dpcd_sink_count = DP_GET_SINK_COUNT(ret); > + DRM_DEV_DEBUG_DRIVER(dev, "dpcd_sink_count: %d it6505->sink_count:%d", > + dpcd_sink_count, it6505->sink_count); > + > + if (it6505->branch_device && dpcd_sink_count != it6505->sink_count) { > + memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); > + it6505->sink_count = dpcd_sink_count; > + kfree(it6505->edid); > + it6505->edid = NULL; > + it6505_reset_logic(it6505); > + it6505_int_mask_enable(it6505); > + it6505_init(it6505); > + return 0; > + } > + > + dp_irq_vector = it6505_dpcd_read(it6505, DP_DEVICE_SERVICE_IRQ_VECTOR); > + if (dp_irq_vector < 0) > + return dp_irq_vector; > + > + DRM_DEV_DEBUG_DRIVER(dev, "dp_irq_vector = 0x%02x", dp_irq_vector); > + > + /* no need to check link status if no training */ > + if (it6505->link_state == LINK_OK) { > + ret = drm_dp_dpcd_read_link_status(&it6505->aux, link_status); > + if (ret < 0) { > + DRM_DEV_ERROR(dev, "Fail to read link status ret: %d", > + ret); > + return ret; > + } > + > + if (dp_link_status(link_status, DP_LANE_ALIGN_STATUS_UPDATED) & > + DP_LINK_STATUS_UPDATED) { > + if (!drm_dp_channel_eq_ok(link_status, > + it6505->lane_count)) > + it6505_video_reset(it6505); > + } > + } > + > + return 0; > +} > + > +static void it6505_check_reg06(struct it6505 *it6505, unsigned int reg06) > +{ > + struct device *dev = &it6505->client->dev; > + bool data; > + > + if (reg06 & INT_HPD_CHANGE) { > + data = it6505_get_sink_hpd_status(it6505); > + DRM_DEV_DEBUG_DRIVER(dev, "hpd change interrupt, change to %s", > + data ? "high" : "low"); > + > + drm_helper_hpd_irq_event(it6505->connector.dev); > + DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count: %d", > + it6505->sink_count); > + > + if (data) { > + wait_for_completion_timeout(&it6505->wait_edid_complete, > + msecs_to_jiffies(6000)); > + it6505_lane_termination_on(it6505); > + it6505_lane_power_on(it6505); > + > + /* > + * for some dongle which issue HPD_irq > + * when sink counnt change from 0->1 > + * it6505 not able to receive HPD_IRQ > + * if HW never go into trainig done > + */ > + > + if (it6505->branch_device && it6505->sink_count == 0) > + schedule_work(&it6505->link_works); > + > + if (!it6505_get_video_status(it6505)) > + it6505_video_reset(it6505); > + > + it6505_calc_video_info(it6505); > + } else { > + kfree(it6505->edid); > + it6505->edid = NULL; > + memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); > + > + it6505_video_disable(it6505); > + it6505_disable_audio(it6505); > + it6505_stop_link_train(it6505); > + it6505_lane_off(it6505); > + return; > + } > + } > + > + if (reg06 & INT_RECEIVE_HPD_IRQ) { > + DRM_DEV_DEBUG_DRIVER(dev, "hpd_irq interrupt"); > + > + if (it6505_procss_hpd_irq(it6505) < 0) > + DRM_DEV_DEBUG_DRIVER(dev, "process hpd_irq fail!"); > + } > + > + if (reg06 & INT_SCDT_CHANGE) { > + data = it6505_get_video_status(it6505); > + DRM_DEV_DEBUG_DRIVER(dev, "video stable change interrupt, %s", > + data ? "stable" : "unstable"); > + it6505_calc_video_info(it6505); > + > + if (data) > + schedule_work(&it6505->link_works); > + } > +} > + > +static void it6505_check_reg07(struct it6505 *it6505, unsigned int reg07) > +{ > + struct device *dev = &it6505->client->dev; > + > + if (reg07 & INT_AUX_CMD_FAIL) > + DRM_DEV_DEBUG_DRIVER(dev, "AUX PC Request Fail Interrupt"); > + > + if (reg07 & INT_AUDIO_FIFO_ERROR) { > + DRM_DEV_DEBUG_DRIVER(dev, "audio fifo error Interrupt"); > + > + if (it6505_audio_input(it6505)) > + it6505_enable_audio(it6505); > + } > + > +} > + > +static void it6505_check_reg08(struct it6505 *it6505, unsigned int reg08) > +{ > + struct device *dev = &it6505->client->dev; > + > + if (reg08 & INT_LINK_TRAIN_FAIL) { > + DRM_DEV_DEBUG_DRIVER(dev, "link training fail interrupt"); > + schedule_work(&it6505->link_works); > + } > + > + if (reg08 & INT_VID_FIFO_ERROR) { > + DRM_DEV_DEBUG_DRIVER(dev, "video fifo overflow interrupt"); > + it6505_video_reset(it6505); > + it6505->auto_train_retry = AUTO_TRAIN_RETRY; > + } > + > + if (reg08 & INT_IO_LATCH_FIFO_OVERFLOW) { > + DRM_DEV_DEBUG_DRIVER(dev, "IO latch fifo overflow interrupt"); > + it6505_video_reset(it6505); > + } > +} > + > +static irqreturn_t it6505_int_threaded_handler(int unused, void *data) > +{ > + struct it6505 *it6505 = data; > + struct device *dev = &it6505->client->dev; > + int reg06, reg07, reg08; > + > + msleep(100); > + mutex_lock(&it6505->extcon_lock); > + > + if (it6505->enable_drv_hold || !it6505->powered) > + goto unlock; > + > + reg06 = it6505_read(it6505, INT_STATUS_01); > + reg07 = it6505_read(it6505, INT_STATUS_02); > + reg08 = it6505_read(it6505, INT_STATUS_03); > + > + it6505_write(it6505, INT_STATUS_01, reg06); > + it6505_write(it6505, INT_STATUS_02, reg07); > + it6505_write(it6505, INT_STATUS_03, reg08); > + > + DRM_DEV_DEBUG_DRIVER(dev, "reg06 = 0x%02x", reg06); > + DRM_DEV_DEBUG_DRIVER(dev, "reg07 = 0x%02x", reg07); > + DRM_DEV_DEBUG_DRIVER(dev, "reg08 = 0x%02x", reg08); > + > + if (reg06 != 0) > + it6505_check_reg06(it6505, reg06); > + > + if (reg07 != 0) > + it6505_check_reg07(it6505, reg07); > + > + if (reg08 != 0) > + it6505_check_reg08(it6505, reg08); > + > +unlock: > + mutex_unlock(&it6505->extcon_lock); > + > + return IRQ_HANDLED; > +} > + > +static int it6505_poweron(struct it6505 *it6505) > +{ > + struct device *dev = &it6505->client->dev; > + struct it6505_platform_data *pdata = &it6505->pdata; > + int err; > + > + if (it6505->powered) { > + DRM_DEV_DEBUG_DRIVER(dev, "it6505 already powered on"); > + return 0; > + } > + > + if (pdata->pwr18) { > + err = regulator_enable(pdata->pwr18); > + if (err) { > + DRM_DEV_DEBUG_DRIVER(dev, "Failed to enable VDD18: %d", > + err); > + return err; > + } > + } > + > + if (pdata->ovdd) { > + /* time interval between IVDD and OVDD at least be 1ms */ > + usleep_range(1000, 2000); > + err = regulator_enable(pdata->ovdd); > + if (err) { > + regulator_disable(pdata->pwr18); > + return err; > + } > + } > + /* time interval between OVDD and SYSRSTN at least be 10ms */ > + if (pdata->gpiod_reset) { > + usleep_range(10000, 20000); > + gpiod_set_value_cansleep(pdata->gpiod_reset, 0); > + usleep_range(1000, 2000); > + gpiod_set_value_cansleep(pdata->gpiod_reset, 1); > + usleep_range(10000, 20000); > + } > + > + it6505_reset_logic(it6505); > + it6505_int_mask_enable(it6505); > + it6505_init(it6505); > + it6505_lane_off(it6505); > + > + it6505->powered = true; > + > + return 0; > +} > + > +static int it6505_poweroff(struct it6505 *it6505) > +{ > + struct device *dev = &it6505->client->dev; > + struct it6505_platform_data *pdata = &it6505->pdata; > + int err; > + > + if (!it6505->powered) { > + DRM_DEV_DEBUG_DRIVER(dev, "power had been already off"); > + return 0; > + } > + > + if (pdata->gpiod_reset) > + gpiod_set_value_cansleep(pdata->gpiod_reset, 0); > + > + if (pdata->pwr18) { > + err = regulator_disable(pdata->pwr18); > + if (err) > + return err; > + } > + > + if (pdata->ovdd) { > + err = regulator_disable(pdata->ovdd); > + if (err) > + return err; > + } > + > + it6505->powered = false; > + kfree(it6505->edid); > + it6505->edid = NULL; > + it6505->sink_count = 0; > + > + return 0; > +} > + > +static inline struct it6505 *connector_to_it6505(struct drm_connector *c) > +{ > + return container_of(c, struct it6505, connector); > +} > + > +static int it6505_get_modes(struct drm_connector *connector) > +{ > + struct it6505 *it6505 = connector_to_it6505(connector); > + int err, num_modes = 0, i; > + struct device *dev = &it6505->client->dev; > + > + if (it6505->edid) > + return drm_add_edid_modes(connector, it6505->edid); > + > + mutex_lock(&it6505->mode_lock); > + init_completion(&it6505->wait_edid_complete); > + > + for (i = 0; i < 3; i++) { > + if (!it6505_get_sink_hpd_status(it6505)) > + goto unlock; > + > + it6505->edid = > + drm_do_get_edid(&it6505->connector, it6505_get_edid_block, > + it6505); > + > + if (it6505->edid) > + break; > + } > + if (!it6505->edid) { > + DRM_DEV_ERROR(dev, "Failed to read EDID"); > + goto unlock; > + } > + > + err = drm_connector_update_edid_property(connector, it6505->edid); > + if (err) { > + DRM_DEV_ERROR(dev, "Failed to update EDID property: %d", err); > + goto unlock; > + } > + > + num_modes = drm_add_edid_modes(connector, it6505->edid); > + > +unlock: > + complete(&it6505->wait_edid_complete); > + mutex_unlock(&it6505->mode_lock); > + > + return num_modes; > +} > + > +static const struct drm_connector_helper_funcs it6505_connector_helper_funcs = { > + .get_modes = it6505_get_modes, > +}; > + > +static enum drm_connector_status it6505_detect(struct drm_connector *connector, > + bool force) > +{ > + struct it6505 *it6505 = connector_to_it6505(connector); > + struct device *dev = &it6505->client->dev; > + enum drm_connector_status status = connector_status_disconnected; > + > + DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count:%d powered:%d", > + it6505->sink_count, it6505->powered); > + > + mutex_lock(&it6505->mode_lock); > + > + if (!it6505->powered) > + goto unlock; > + > + if (it6505->enable_drv_hold) { > + status = it6505_get_sink_hpd_status(it6505) ? > + connector_status_connected : > + connector_status_disconnected; > + goto unlock; > + } > + > + if (it6505_get_sink_hpd_status(it6505)) { > + it6505_aux_on(it6505); > + it6505_drm_dp_link_probe(&it6505->aux, &it6505->link); > + it6505_drm_dp_link_power_up(&it6505->aux, &it6505->link); > + it6505->auto_train_retry = AUTO_TRAIN_RETRY; > + > + if (it6505->dpcd[0] == 0) { > + it6505_get_dpcd(it6505, DP_DPCD_REV, it6505->dpcd, > + ARRAY_SIZE(it6505->dpcd)); > + it6505_variable_config(it6505); > + it6505_parse_link_capabilities(it6505); > + } > + > + it6505->sink_count = DP_GET_SINK_COUNT(it6505_dpcd_read(it6505, > + DP_SINK_COUNT)); > + DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count:%d branch:%d", > + it6505->sink_count, it6505->branch_device); > + > + if (it6505->branch_device) { > + status = (it6505->sink_count != 0) ? > + connector_status_connected : > + connector_status_disconnected; > + } else { > + status = connector_status_connected; > + } > + } else { > + it6505->sink_count = 0; > + memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); > + } > + > +unlock: > + if (it6505->connector_status != status) { > + it6505->connector_status = status; > + it6505_plugged_status_to_codec(it6505); > + } > + > + mutex_unlock(&it6505->mode_lock); > + > + return status; > +} > + > +static const struct drm_connector_funcs it6505_connector_funcs = { > + .fill_modes = drm_helper_probe_single_connector_modes, > + .detect = it6505_detect, > + .destroy = drm_connector_cleanup, > + .reset = drm_atomic_helper_connector_reset, > + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, > + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > +}; > + > +static int it6505_extcon_notifier(struct notifier_block *self, > + unsigned long event, void *ptr) > +{ > + struct it6505 *it6505 = container_of(self, struct it6505, event_nb); > + > + schedule_work(&it6505->extcon_wq); > + return NOTIFY_DONE; > +} > + > +static void it6505_extcon_work(struct work_struct *work) > +{ > + struct it6505 *it6505 = container_of(work, struct it6505, extcon_wq); > + struct device *dev = &it6505->client->dev; > + int state = extcon_get_state(it6505->extcon, EXTCON_DISP_DP); > + unsigned int pwroffretry = 0; > + > + if (it6505->enable_drv_hold) > + return; > + > + mutex_lock(&it6505->extcon_lock); > + > + DRM_DEV_DEBUG_DRIVER(dev, "EXTCON_DISP_DP = 0x%02x", state); > + if (state > 0) { > + DRM_DEV_DEBUG_DRIVER(dev, "start to power on"); > + msleep(100); > + it6505_poweron(it6505); > + } else { > + DRM_DEV_DEBUG_DRIVER(dev, "start to power off"); > + while (it6505_poweroff(it6505) && pwroffretry++ < 5) { > + DRM_DEV_DEBUG_DRIVER(dev, "power off fail %d times", > + pwroffretry); > + } > + > + drm_helper_hpd_irq_event(it6505->connector.dev); > + memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); > + DRM_DEV_DEBUG_DRIVER(dev, "power off it6505 success!"); > + } > + > + mutex_unlock(&it6505->extcon_lock); > +} > + > +static int it6505_use_notifier_module(struct it6505 *it6505) > +{ > + int ret; > + struct device *dev = &it6505->client->dev; > + > + it6505->event_nb.notifier_call = it6505_extcon_notifier; > + INIT_WORK(&it6505->extcon_wq, it6505_extcon_work); > + ret = devm_extcon_register_notifier(&it6505->client->dev, > + it6505->extcon, EXTCON_DISP_DP, > + &it6505->event_nb); > + if (ret) { > + DRM_DEV_ERROR(dev, "failed to register notifier for DP"); > + return ret; > + } > + > + schedule_work(&it6505->extcon_wq); > + > + return 0; > +} > + > +static void it6505_remove_notifier_module(struct it6505 *it6505) > +{ > + if (it6505->extcon) { > + devm_extcon_unregister_notifier(&it6505->client->dev, > + it6505->extcon, EXTCON_DISP_DP, > + &it6505->event_nb); > + > + flush_work(&it6505->extcon_wq); > + } > +} > + > +static void __maybe_unused it6505_delayed_audio(struct work_struct *work) > +{ > + struct it6505 *it6505 = container_of(work, struct it6505, > + delayed_audio.work); > + > + DRM_DEV_DEBUG_DRIVER(&it6505->client->dev, "start"); > + > + if (!it6505->powered) > + return; > + > + if (!it6505->enable_drv_hold) > + it6505_enable_audio(it6505); > +} > + > +static int __maybe_unused it6505_audio_setup_hw_params(struct it6505 *it6505, > + struct hdmi_codec_params *params) > +{ > + struct device *dev = &it6505->client->dev; > + int i = 0; > + > + DRM_DEV_DEBUG_DRIVER(dev, "%s %d Hz, %d bit, %d channels\n", __func__, > + params->sample_rate, params->sample_width, > + params->cea.channels); > + > + if (!it6505->bridge.encoder) > + return -ENODEV; > + > + if (params->cea.channels <= 1 || params->cea.channels > 8) { > + DRM_DEV_DEBUG_DRIVER(dev, "channel number: %d not support", > + it6505->audio.channel_count); > + return -EINVAL; > + } > + > + it6505->audio.channel_count = params->cea.channels; > + > + while (i < ARRAY_SIZE(audio_sample_rate_map) && > + params->sample_rate != > + audio_sample_rate_map[i].sample_rate_value) { > + i++; > + } > + if (i == ARRAY_SIZE(audio_sample_rate_map)) { > + DRM_DEV_DEBUG_DRIVER(dev, "sample rate: %d Hz not support", > + params->sample_rate); > + return -EINVAL; > + } > + it6505->audio.sample_rate = audio_sample_rate_map[i].rate; > + > + switch (params->sample_width) { > + case 16: > + it6505->audio.word_length = WORD_LENGTH_16BIT; > + break; > + case 18: > + it6505->audio.word_length = WORD_LENGTH_18BIT; > + break; > + case 20: > + it6505->audio.word_length = WORD_LENGTH_20BIT; > + break; > + case 24: > + case 32: > + it6505->audio.word_length = WORD_LENGTH_24BIT; > + break; > + default: > + DRM_DEV_DEBUG_DRIVER(dev, "wordlength: %d bit not support", > + params->sample_width); > + return -EINVAL; > + } > + > + return 0; > +} > + > +static void __maybe_unused it6505_audio_shutdown(struct device *dev, void *data) > +{ > + struct it6505 *it6505 = dev_get_drvdata(dev); > + > + if (it6505->powered) > + it6505_disable_audio(it6505); > +} > + > +static int __maybe_unused it6505_audio_hook_plugged_cb(struct device *dev, > + void *data, > + hdmi_codec_plugged_cb fn, > + struct device *codec_dev) > +{ > + struct it6505 *it6505 = data; > + > + it6505->plugged_cb = fn; > + it6505->codec_dev = codec_dev; > + it6505_plugged_status_to_codec(it6505); > + > + return 0; > +} > + > +static inline struct it6505 *bridge_to_it6505(struct drm_bridge *bridge) > +{ > + return container_of(bridge, struct it6505, bridge); > +} > + > +static void it6505_bridge_mode_set(struct drm_bridge *bridge, > + const struct drm_display_mode *mode, > + const struct drm_display_mode *adjusted_mode) > +{ > + struct it6505 *it6505 = bridge_to_it6505(bridge); > + struct hdmi_avi_infoframe frame; > + int err; > + struct device *dev = &it6505->client->dev; > + > + if (WARN_ON(!it6505->powered)) > + return; > + > + mutex_lock(&it6505->mode_lock); > + > + err = drm_hdmi_avi_infoframe_from_display_mode(&frame, > + &it6505->connector, > + adjusted_mode); > + if (err) { > + DRM_DEV_ERROR(dev, "Failed to setup AVI infoframe: %d", err); > + goto unlock; > + } > + > + it6505_update_video_prarmeter(it6505, adjusted_mode); > + > + err = it6505_send_video_infoframe(it6505, &frame); > + if (err) > + DRM_DEV_ERROR(dev, "Failed to send AVI infoframe: %d", err); > + > +unlock: > + mutex_unlock(&it6505->mode_lock); > +} > + > +static int it6505_bridge_attach(struct drm_bridge *bridge, > + enum drm_bridge_attach_flags flags) > +{ > + struct it6505 *it6505 = bridge_to_it6505(bridge); > + struct device *dev = &it6505->client->dev; > + int err; > + > + if (!bridge->encoder) { > + DRM_DEV_ERROR(dev, "Parent encoder object not found"); > + return -ENODEV; > + } > + > + err = drm_connector_init(bridge->dev, &it6505->connector, > + &it6505_connector_funcs, > + DRM_MODE_CONNECTOR_DisplayPort); > + if (err < 0) { > + DRM_DEV_ERROR(dev, "Failed to initialize connector: %d", err); > + return err; > + } > + > + drm_connector_helper_add(&it6505->connector, > + &it6505_connector_helper_funcs); > + > + it6505->connector.polled = DRM_CONNECTOR_POLL_HPD; > + > + err = drm_connector_attach_encoder(&it6505->connector, bridge->encoder); > + if (err < 0) { > + DRM_DEV_ERROR(dev, "Failed to link up connector to encoder: %d", > + err); > + goto cleanup_connector; > + } > + > + err = drm_connector_register(&it6505->connector); > + if (err < 0) { > + DRM_DEV_ERROR(dev, "Failed to register connector: %d", err); > + goto cleanup_connector; > + } > + > + if (it6505->extcon) { > + err = it6505_use_notifier_module(it6505); > + if (err < 0) { > + drm_connector_unregister(&it6505->connector); > + goto cleanup_connector; > + } > + } > + > + return 0; > + > +cleanup_connector: > + drm_connector_cleanup(&it6505->connector); > + return err; > +} > + > +static void it6505_bridge_detach(struct drm_bridge *bridge) > +{ > + struct it6505 *it6505 = bridge_to_it6505(bridge); > + > + flush_work(&it6505->link_works); > + it6505_remove_notifier_module(it6505); > + drm_connector_unregister(&it6505->connector); > + drm_connector_cleanup(&it6505->connector); > +} > + > +static enum drm_mode_status > +it6505_bridge_mode_valid(struct drm_bridge *bridge, > + const struct drm_display_info *info, > + const struct drm_display_mode *mode) > +{ > + struct it6505 *it6505 = bridge_to_it6505(bridge); > + > + if (mode->flags & DRM_MODE_FLAG_INTERLACE) > + return MODE_NO_INTERLACE; > + > + if (mode->clock > DPI_PIXEL_CLK_MAX) > + return MODE_CLOCK_HIGH; > + > + it6505->video_info.clock = mode->clock; > + > + return MODE_OK; > +} > + > +static void it6505_bridge_enable(struct drm_bridge *bridge) > +{ > + struct it6505 *it6505 = bridge_to_it6505(bridge); > + > + it6505_int_mask_enable(it6505); > + it6505_video_reset(it6505); > +} > + > +static void it6505_bridge_disable(struct drm_bridge *bridge) > +{ > + struct it6505 *it6505 = bridge_to_it6505(bridge); > + > + if (it6505->powered) > + it6505_video_disable(it6505); > +} > + > +static const struct drm_bridge_funcs it6505_bridge_funcs = { > + .attach = it6505_bridge_attach, > + .detach = it6505_bridge_detach, > + .mode_valid = it6505_bridge_mode_valid, > + .mode_set = it6505_bridge_mode_set, > + .enable = it6505_bridge_enable, > + .disable = it6505_bridge_disable, > +}; > + > +static int it6505_bridge_resume(struct device *dev) > +{ > + struct it6505 *it6505 = dev_get_drvdata(dev); > + > + return it6505_poweron(it6505); > +} > + > +static int it6505_bridge_suspend(struct device *dev) > +{ > + struct it6505 *it6505 = dev_get_drvdata(dev); > + > + return it6505_poweroff(it6505); > +} > + > +static SIMPLE_DEV_PM_OPS(it6505_bridge_pm_ops, it6505_bridge_suspend, > + it6505_bridge_resume); > + > + > + > +static int it6505_init_pdata(struct it6505 *it6505) > +{ > + struct it6505_platform_data *pdata = &it6505->pdata; > + struct device *dev = &it6505->client->dev; > + > + /* 1.0V digital core power regulator */ > + pdata->pwr18 = devm_regulator_get(dev, "pwr18"); > + if (IS_ERR(pdata->pwr18)) { > + DRM_DEV_ERROR(dev, "pwr18 regulator not found"); > + return PTR_ERR(pdata->pwr18); > + } > + > + pdata->ovdd = devm_regulator_get(dev, "ovdd"); > + if (IS_ERR(pdata->ovdd)) { > + DRM_DEV_ERROR(dev, "ovdd regulator not found"); > + return PTR_ERR(pdata->ovdd); > + } > + > + pdata->gpiod_reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); > + if (IS_ERR(pdata->gpiod_reset)) { > + DRM_DEV_ERROR(dev, "gpiod_reset gpio not found"); > + return PTR_ERR(pdata->gpiod_reset); > + } > + > + return 0; > +} > + > +static void it6505_parse_dt(struct it6505 *it6505) > +{ > + struct device *dev = &it6505->client->dev; > + u32 afe_setting = 0; > + > + it6505->lane_swap_disabled = true; > + it6505->afe_setting = 0; > + > + it6505->lane_swap_disabled = > + device_property_read_bool(dev, "no-laneswap"); > + > + if (it6505->lane_swap_disabled) > + it6505->lane_swap = false; > + > + if (device_property_read_u32(dev, "afe-setting", &afe_setting) == 0) > + if (afe_setting >= ARRAY_SIZE(afe_setting_table)) { > + DRM_DEV_ERROR(dev, "afe setting error, use default"); > + afe_setting = 0; > + } > + > + it6505->afe_setting = afe_setting; > +} > + > +static ssize_t print_timing_show(struct device *dev, > + struct device_attribute *attr, char *buf) > +{ > + struct it6505 *it6505 = dev_get_drvdata(dev); > + struct drm_display_mode *vid = &it6505->video_info; > + char *str = buf, *end = buf + PAGE_SIZE; > + > + it6505_calc_video_info(it6505); > + str += scnprintf(str, end - str, "---video timing---\n"); > + str += scnprintf(str, end - str, "PCLK:%d.%03dMHz\n", > + vid->clock / 1000, vid->clock % 1000); > + str += scnprintf(str, end - str, "HTotal:%d\n", vid->htotal); > + str += scnprintf(str, end - str, "HActive:%d\n", vid->hdisplay); > + str += scnprintf(str, end - str, "HFrontPorch:%d\n", > + vid->hsync_start - vid->hdisplay); > + str += scnprintf(str, end - str, "HSyncWidth:%d\n", > + vid->hsync_end - vid->hsync_start); > + str += scnprintf(str, end - str, "HBackPorch:%d\n", > + vid->htotal - vid->hsync_end); > + str += scnprintf(str, end - str, "VTotal:%d\n", vid->vtotal); > + str += scnprintf(str, end - str, "VActive:%d\n", vid->vdisplay); > + str += scnprintf(str, end - str, "VFrontPorch:%d\n", > + vid->vsync_start - vid->vdisplay); > + str += scnprintf(str, end - str, "VSyncWidth:%d\n", > + vid->vsync_end - vid->vsync_start); > + str += scnprintf(str, end - str, "VBackPorch:%d\n", > + vid->vtotal - vid->vsync_end); > + > + return str - buf; > +} > + > +static ssize_t force_pwronoff_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, size_t count) > +{ > + struct it6505 *it6505 = dev_get_drvdata(dev); > + int pwr; > + > + if (kstrtoint(buf, 10, &pwr) < 0) > + return -EINVAL; > + > + if (pwr) > + it6505_poweron(it6505); > + else > + it6505_poweroff(it6505); > + > + return count; > +} > + > +static ssize_t enable_drv_hold_show(struct device *dev, > + struct device_attribute *attr, char *buf) > +{ > + struct it6505 *it6505 = dev_get_drvdata(dev); > + > + return scnprintf(buf, PAGE_SIZE, "%d\n", it6505->enable_drv_hold); > +} > + > +static ssize_t enable_drv_hold_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, size_t count) > +{ > + struct it6505 *it6505 = dev_get_drvdata(dev); > + unsigned int drv_hold; > + > + if (kstrtoint(buf, 10, &drv_hold) < 0) > + return -EINVAL; > + > + it6505->enable_drv_hold = !!drv_hold; > + > + if (it6505->enable_drv_hold) { > + it6505_int_mask_disable(it6505); > + } else { > + it6505_clear_int(it6505); > + it6505_int_mask_enable(it6505); > + > + if (it6505->powered) { > + it6505->connector_status = > + it6505_get_sink_hpd_status(it6505) ? > + connector_status_connected : > + connector_status_disconnected; > + } else { > + it6505->connector_status = > + connector_status_disconnected; > + } > + } > + return count; > +} > + > +static DEVICE_ATTR_RO(print_timing); > +static DEVICE_ATTR_WO(force_pwronoff); > +static DEVICE_ATTR_RW(enable_drv_hold); > + > +static const struct attribute *it6505_attrs[] = { > + &dev_attr_print_timing.attr, > + &dev_attr_force_pwronoff.attr, > + &dev_attr_enable_drv_hold.attr, > + NULL, > +}; > + > +static int it6505_i2c_probe(struct i2c_client *client, > + const struct i2c_device_id *id) > +{ > + struct it6505 *it6505; > + struct it6505_platform_data *pdata; > + struct device *dev = &client->dev; > + struct extcon_dev *extcon; > + int err, intp_irq; > + > + it6505 = devm_kzalloc(&client->dev, sizeof(*it6505), GFP_KERNEL); > + if (!it6505) > + return -ENOMEM; > + > + mutex_init(&it6505->extcon_lock); > + mutex_init(&it6505->mode_lock); > + mutex_init(&it6505->aux_lock); > + > + pdata = &it6505->pdata; > + > + it6505->bridge.of_node = client->dev.of_node; > + it6505->connector_status = connector_status_disconnected; > + it6505->client = client; > + i2c_set_clientdata(client, it6505); > + > + /* get extcon device from DTS */ > + extcon = extcon_get_edev_by_phandle(dev, 0); > + if (PTR_ERR(extcon) == -EPROBE_DEFER) > + return -EPROBE_DEFER; > + if (IS_ERR(extcon)) { > + DRM_DEV_ERROR(dev, "can not get extcon device!"); > + return -EINVAL; > + } > + > + it6505->extcon = extcon; > + > + it6505->regmap = devm_regmap_init_i2c(client, &it6505_regmap_config); > + if (IS_ERR(it6505->regmap)) { > + DRM_DEV_ERROR(dev, "regmap i2c init failed"); > + err = PTR_ERR(it6505->regmap); > + return err; > + } > + > + err = it6505_init_pdata(it6505); > + if (err) { > + DRM_DEV_ERROR(dev, "Failed to initialize pdata: %d", err); > + return err; > + } > + > + it6505_parse_dt(it6505); > + > + intp_irq = client->irq; > + > + if (!intp_irq) { > + DRM_DEV_ERROR(dev, "Failed to get INTP IRQ"); > + err = -ENODEV; > + return err; > + } > + > + err = devm_request_threaded_irq(&client->dev, intp_irq, NULL, > + it6505_int_threaded_handler, > + IRQF_TRIGGER_LOW | IRQF_ONESHOT, > + "it6505-intp", it6505); > + if (err) { > + DRM_DEV_ERROR(dev, "Failed to request INTP threaded IRQ: %d", > + err); > + return err; > + } > + > + /* Register aux channel */ > + it6505->aux.name = "DP-AUX"; > + it6505->aux.dev = dev; > + it6505->aux.transfer = it6505_aux_transfer; > + > + err = drm_dp_aux_register(&it6505->aux); > + if (err < 0) { > + DRM_DEV_ERROR(dev, "Failed to register aux: %d", err); > + return err; > + } > + > + INIT_WORK(&it6505->link_works, it6505_link_training_work); > + init_completion(&it6505->wait_edid_complete); > + it6505->powered = false; > + it6505->enable_drv_hold = DEFAULT_DRV_HOLD; > + > + if (DEFAULT_PWR_ON) > + it6505_poweron(it6505); > + > + err = sysfs_create_files(&client->dev.kobj, it6505_attrs); > + if (err) { > + drm_dp_aux_unregister(&it6505->aux); > + return err; > + } > + > + it6505->bridge.funcs = &it6505_bridge_funcs; > + drm_bridge_add(&it6505->bridge); > + > + return 0; > +} > + > +static int it6505_i2c_remove(struct i2c_client *client) > +{ > + struct it6505 *it6505 = i2c_get_clientdata(client); > + > + drm_connector_unregister(&it6505->connector); > + drm_connector_cleanup(&it6505->connector); > + drm_bridge_remove(&it6505->bridge); > + drm_dp_aux_unregister(&it6505->aux); > + sysfs_remove_files(&client->dev.kobj, it6505_attrs); > + it6505_poweroff(it6505); > + > + return 0; > +} > + > +static const struct i2c_device_id it6505_id[] = { > + { "it6505", 0 }, > + { } > +}; > + > +MODULE_DEVICE_TABLE(i2c, it6505_id); > + > +static const struct of_device_id it6505_of_match[] = { > + { .compatible = "ite,it6505" }, > + { } > +}; > + > +static struct i2c_driver it6505_i2c_driver = { > + .driver = { > + .name = "it6505", > + .of_match_table = it6505_of_match, > + .pm = &it6505_bridge_pm_ops, > + }, > + .probe = it6505_i2c_probe, > + .remove = it6505_i2c_remove, > + .id_table = it6505_id, > +}; > + > +module_i2c_driver(it6505_i2c_driver); > + > +MODULE_AUTHOR("Hermes Wu "); > +MODULE_DESCRIPTION("IT6505 DisplayPort Transmitter driver"); > +MODULE_LICENSE("GPL v2"); > -- > 1.9.1 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3FEAEC433E1 for ; Mon, 10 Aug 2020 18:16:29 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BE08E207FF for ; Mon, 10 Aug 2020 18:16:28 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="e3C8LXq1" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BE08E207FF Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ravnborg.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=cgUhyrxsdL0KnaIaD8RAVslect3JL6wjOHAzh/eAtVg=; b=e3C8LXq1/WL2hIDcx5Ugbn1Tw uQKoru0bkpxI0OsVnwmYRmHFZIjDNmCBs8aaUg28bSnizDF7Cmzs6J0iyhDk1xWgkUSdzlBdY+wLn Ts+FeuGeN7E/PFlr4AoaDJIlLh3Q5IF63NUfjFRymaBUoccAIlLJH9zCTqadiMh4gnvHQSGH6FzCT U6jnugIHJYxE4KXBGfky5ff6NXn/kfTrxo95PXSyNUfGsGRCjk7kmFiPkDG2OeZDhv5gqmacIgUv8 vvNxiiaOYVqY+N+78AN2h12t5qx4c61o+pYi4UitbScd4ATUHwnt7dkFpliYPn/TE/syZh8WH5Uei Pwl4aoG0A==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1k5CLC-0003Oi-7o; Mon, 10 Aug 2020 18:16:10 +0000 Received: from asavdk3.altibox.net ([109.247.116.14]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1k5CL5-0003O4-1N; Mon, 10 Aug 2020 18:16:05 +0000 Received: from ravnborg.org (unknown [188.228.123.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by asavdk3.altibox.net (Postfix) with ESMTPS id 9020B20023; Mon, 10 Aug 2020 20:15:55 +0200 (CEST) Date: Mon, 10 Aug 2020 20:15:54 +0200 From: Sam Ravnborg To: allen Subject: Re: [PATCH v10] drm/bridge: add it6505 driver Message-ID: <20200810181554.GE292825@ravnborg.org> References: <1594892860-6569-1-git-send-email-allen.chen@ite.com.tw> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1594892860-6569-1-git-send-email-allen.chen@ite.com.tw> X-CMAE-Score: 0 X-CMAE-Analysis: v=2.3 cv=f+hm+t6M c=1 sm=1 tr=0 a=S6zTFyMACwkrwXSdXUNehg==:117 a=S6zTFyMACwkrwXSdXUNehg==:17 a=IkcTkHD0fZMA:10 a=mpaa-ttXAAAA:8 a=cm27Pg_UAAAA:8 a=1XWaLZrsAAAA:8 a=Ns9eNvu6AAAA:8 a=e5mUnYsNAAAA:8 a=L8YDfXaSqtconZh9qGgA:9 a=6YHz0X6AXIijI_lZ:21 a=OhsBIkaczIQ1SNPw:21 a=QEXdDO2ut3YA:10 a=6heAxKwa5pAsJatQ0mat:22 a=xmb-EsYY8bH0VWELuYED:22 a=LZLx1i01EnjtqRv10NxV:22 a=Vxmtnl_E_bksehYqCbjh:22 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200810_141603_798252_86CCAA34 X-CRM114-Status: GOOD ( 31.51 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jernej Skrabec , Jitao Shi , Neil Armstrong , Yilun Lin , Jau-Chih Tseng , open list , "open list:DRM DRIVERS" , Andrzej Hajda , David Airlie , Hermes Wu , "moderated list:ARM/Mediatek SoC support" , Laurent Pinchart , Pi-Hsun Shih , Matthias Brugger , "moderated list:ARM/Mediatek SoC support" , Jonas Karlman Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org SGkgYWxsZW4uCgpPbiBUaHUsIEp1bCAxNiwgMjAyMCBhdCAwNTo0NzozMVBNICswODAwLCBhbGxl biB3cm90ZToKPiBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgdGhlIGlURSBJVDY1MDUuCj4gVGhpcyBk ZXZpY2UgY2FuIGNvbnZlcnQgRFBJIHNpZ25hbCB0byBEUCBvdXRwdXQuCj4gCj4gU2lnbmVkLW9m Zi1ieTogSml0YW8gU2hpIDxqaXRhby5zaGlAbWVkaWF0ZWsuY29tPgo+IFNpZ25lZC1vZmYtYnk6 IFBpLUhzdW4gU2hpaCA8cGloc3VuQGNocm9taXVtLm9yZz4KPiBTaWduZWQtb2ZmLWJ5OiBZaWx1 biBMaW4gPHlsbGluQGdvb2dsZS5jb20+Cj4gU2lnbmVkLW9mZi1ieTogSGVybWVzIFd1IDxoZXJt ZXMud3VAaXRlLmNvbS50dz4KPiBTaWduZWQtb2ZmLWJ5OiBBbGxlbiBDaGVuIDxhbGxlbi5jaGVu QGl0ZS5jb20udHc+Cj4gLS0tCkNhbiB5b3UgcGxlYXNlIGFkZCBhIEZyb206IGxpbmUgc28gaXQg aXMgcG9zc2libGUgZm9yIHRoZSB0b29scyB0byBwaWNrCndobyBpcyB0aGUgYXV0aG9yLgpSaWdo dCBub3cgeW91IGFyZSBwaWNrZWQgLSB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBPSy4KCgpJIHRy aWVkIHRvIGFwcGx5IHRoZSBwYXRjaCAtIGJ1dCB0aGVyZSBpcyBhIGZldyB0aGluZ3MgdG8gbG9v ayBhdDoKCkkgZ290IHRoaXMgd2l0aCBvbmUgb2YgbXkgY29uZmlncyAoYWxseWVzIG9yIGFsbG1v ZGNvbmZpZ3MpOgogQ0MgW01dICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY1MDUubwov aG9tZS9zYW0vZHJtL2xpbnV4LmdpdC9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY1MDUu YzoyNTg5OjEyOiB3YXJuaW5nOiDigJhpdDY1MDVfYnJpZGdlX3N1c3BlbmTigJkgZGVmaW5lZCBi dXQgbm90IHVzZWQgWy1XdW51c2VkLWZ1bmN0aW9uXQogMjU4OSB8IHN0YXRpYyBpbnQgaXQ2NTA1 X2JyaWRnZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKICAgICAgfCAgICAgICAgICAgIF5+ fn5+fn5+fn5+fn5+fn5+fn5+fgovaG9tZS9zYW0vZHJtL2xpbnV4LmdpdC9kcml2ZXJzL2dwdS9k cm0vYnJpZGdlL2l0ZS1pdDY1MDUuYzoyNTgyOjEyOiB3YXJuaW5nOiDigJhpdDY1MDVfYnJpZGdl X3Jlc3VtZeKAmSBkZWZpbmVkIGJ1dCBub3QgdXNlZCBbLVd1bnVzZWQtZnVuY3Rpb25dCiAyNTgy IHwgc3RhdGljIGludCBpdDY1MDVfYnJpZGdlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiAg ICAgIHwgICAgICAgICAgICBefn5+fn5+fn5+fn5+fn5+fn5+fgoKUGxlYXNlIGZpeC4KCgpQbGVh c2UgdHJ5IHRvIHJ1biBpdCB0aHJvdWdoIGNoZWNrcGF0Y2ggd2l0aCB0aGUgZm9sbG93aW5nIG9w dGlvbnM6Ci4vc2NyaXB0cy9jaGVja3BhdGNoIC1xIC0tZW1hY3MgLS1zdHJpY3QgLS1zaG93LXR5 cGVzIC0tY29kZXNwZWxsCgpEcm9wIGNvZGVzcGVsbCBpZiBpdCBkb2VzIG5vdCB3b3JrIGZvciB5 b3UuCgpDb2Rlc3BlbGwgZGlkIG5vdCBsaWtlIGFmZSAtIHNlZW1zIHRoYXQgaXQgZG9lcyBub3Qg a25vdyB0aGlzIGlzIGEKc2hvcnRoYW5kIGZvciAiYW5hbG9nIGZyb250IGVuZCIuIFRoaXMgaXMg b25lIG9mIHRoZSB3YXJuaW5ncyB0byBpZ25vcmUuCgpUaGVyZSBhcmUgc2V2ZXJhbCB2YWxpZCB3 YXJuaW5ncyB0aGF0IG5lZWRzIGZpeGluZy4gRm9yIGV4YW1wbGUgaW5kZW50LgoKClRoZSBkcml2 ZXIgbmVlZHMgdG8gc3VwcG9ydCAiZmxhZ3MiIGluIGF0dGFjaCB0byBtYWtlIGNvbm5lY3RvciBj cmVhdGlvbgpvcHRpb25hbCAtIHN1cHBvcnQgZm9yIHRoaXMgaXMgbWFuZGF0b3J5IGluIG5ldyBk cml2ZXJzLgoKVGhlIGRyaXZlciBhbHNvIG5lZWRzIHRvIHN1cHBvcnQgcmVsZXZhbnQgYnJpZGdl IG9wZXJhdGlvbnMuCgkuZ2V0X2VkaWQKCS5kZXRlY3QKCm5lZWRzIHRvIGJlIHN1cHBvcnRlZCwg bWF5YmUgbW9yZS4KClNlZSBvdGhlciBicmlkZ2UgZHJpdmVycyAtIG1vc3Qgb2YgdGhlbSBhcmUg Y29udmVydGVkIHRvZGF5LgoKClBsZWFzZSBmaXggc28gd2UgY2FuIGdldCB0aGlzIGRyaXZlciBh cHBsaWVkLgoKCVNhbQoKCgo+ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tjb25maWcgICAgICB8 ICAgIDcgKwo+ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL01ha2VmaWxlICAgICB8ICAgIDEgKwo+ ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY1MDUuYyB8IDI4OTAgKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysKPiAgMyBmaWxlcyBjaGFuZ2VkLCAyODk4IGluc2VydGlv bnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvaXRlLWl0 NjUwNS5jCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvS2NvbmZpZyBi L2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvS2NvbmZpZwo+IGluZGV4IDQzMjcxYzIuLjU5NzUwYjgg MTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9LY29uZmlnCj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL2JyaWRnZS9LY29uZmlnCj4gQEAgLTU3LDYgKzU3LDEzIEBAIGNvbmZpZyBE Uk1fTFZEU19DT0RFQwo+ICAJICBTdXBwb3J0IGZvciB0cmFuc3BhcmVudCBMVkRTIGVuY29kZXJz IGFuZCBkZWNvZGVycyB0aGF0IGRvbid0Cj4gIAkgIHJlcXVpcmUgYW55IGNvbmZpZ3VyYXRpb24u Cj4gIAo+ICtjb25maWcgRFJNX0lURV9JVDY1MDUKPiArCXRyaXN0YXRlICJJVEUgSVQ2NTA1IERQ IGJyaWRnZSIKPiArCWRlcGVuZHMgb24gT0YKPiArCXNlbGVjdCBEUk1fS01TX0hFTFBFUgo+ICsJ aGVscAo+ICsJICBJVEUgSVQ2NTA1IERQIGJyaWRnZSBjaGlwIGRyaXZlci4KPiArCj4gIGNvbmZp ZyBEUk1fTUVHQUNISVBTX1NURFBYWFhYX0dFX0I4NTBWM19GVwo+ICAJdHJpc3RhdGUgIk1lZ2FD aGlwcyBzdGRwNDAyOC1nZS1iODUwdjMtZncgYW5kIHN0ZHAyNjkwLWdlLWI4NTB2My1mdyIKPiAg CWRlcGVuZHMgb24gT0YKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9NYWtl ZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUKPiBpbmRleCBkNjNkNGI3Li44 NjYxOWM3IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUKPiAr KysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL01ha2VmaWxlCj4gQEAgLTMsNiArMyw3IEBAIG9i ai0kKENPTkZJR19EUk1fQ0ROU19EU0kpICs9IGNkbnMtZHNpLm8KPiAgb2JqLSQoQ09ORklHX0RS TV9DSFJPTlRFTF9DSDcwMzMpICs9IGNocm9udGVsLWNoNzAzMy5vCj4gIG9iai0kKENPTkZJR19E Uk1fRElTUExBWV9DT05ORUNUT1IpICs9IGRpc3BsYXktY29ubmVjdG9yLm8KPiAgb2JqLSQoQ09O RklHX0RSTV9MVkRTX0NPREVDKSArPSBsdmRzLWNvZGVjLm8KPiArb2JqLSQoQ09ORklHX0RSTV9J VEVfSVQ2NTA1KSArPSBpdGUtaXQ2NTA1Lm8KPiAgb2JqLSQoQ09ORklHX0RSTV9NRUdBQ0hJUFNf U1REUFhYWFhfR0VfQjg1MFYzX0ZXKSArPSBtZWdhY2hpcHMtc3RkcHh4eHgtZ2UtYjg1MHYzLWZ3 Lm8KPiAgb2JqLSQoQ09ORklHX0RSTV9OWFBfUFROMzQ2MCkgKz0gbnhwLXB0bjM0NjAubwo+ICBv YmotJChDT05GSUdfRFJNX1BBUkFERV9QUzg2MjIpICs9IHBhcmFkZS1wczg2MjIubwo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY1MDUuYyBiL2RyaXZlcnMvZ3B1 L2RybS9icmlkZ2UvaXRlLWl0NjUwNS5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAw MDAwMDAwMC4uMTJhNTZjZAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0v YnJpZGdlL2l0ZS1pdDY1MDUuYwo+IEBAIC0wLDAgKzEsMjg5MCBAQAo+ICsvLyBTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogKEdQTC0yLjAtb25seSBPUiBCU0QtMi1DbGF1c2UpCj4gKy8qCj4gKyAq IENvcHlyaWdodCAoYykgMjAyMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCj4gKyAqLwo+ICsjaW5jbHVkZSA8bGludXgvYml0cy5oPgo+ICsjaW5jbHVkZSA8bGlu dXgvZGVsYXkuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGlu dXgvZXJyLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9leHRjb24uaD4KPiArI2luY2x1ZGUgPGxpbnV4 L2ZzLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+Cj4gKyNpbmNsdWRlIDxs aW51eC9pMmMuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+ICsjaW5jbHVkZSA8 bGludXgva2VybmVsLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiArI2luY2x1ZGUg PGxpbnV4L3BtX3J1bnRpbWUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgo+ICsjaW5j bHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC90eXBl cy5oPgo+ICsjaW5jbHVkZSA8bGludXgvd2FpdC5oPgo+ICsKPiArI2luY2x1ZGUgPGNyeXB0by9o YXNoLmg+Cj4gKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+Cj4gKwo+ICsjaW5jbHVkZSA8ZHJtL2Ry bV9hdG9taWNfaGVscGVyLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2JyaWRnZS5oPgo+ICsjaW5j bHVkZSA8ZHJtL2RybV9jcnRjLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+ Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2RwX2hlbHBlci5oPgo+ICsjaW5jbHVkZSA8ZHJtL2RybV9l ZGlkLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX3ByaW50Lmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJt X3Byb2JlX2hlbHBlci5oPgo+ICsKPiArI2luY2x1ZGUgPHNvdW5kL2hkbWktY29kZWMuaD4KPiAr Cj4gKyNkZWZpbmUgUkVHX0lDX1ZFUiAweDA0Cj4gKwo+ICsjZGVmaW5lIFJFR19SRVNFVF9DVFJM IDB4MDUKPiArI2RlZmluZSBWSURFT19SRVNFVCBCSVQoMCkKPiArI2RlZmluZSBBVURJT19SRVNF VCBCSVQoMSkKPiArI2RlZmluZSBBTExfTE9HSUNfUkVTRVQgQklUKDIpCj4gKyNkZWZpbmUgQVVY X1JFU0VUIEJJVCgzKQo+ICsjZGVmaW5lIEhEQ1BfUkVTRVQgQklUKDQpCj4gKwo+ICsjZGVmaW5l IElOVF9TVEFUVVNfMDEgMHgwNgo+ICsjZGVmaW5lIElOVF9NQVNLXzAxIDB4MDkKPiArI2RlZmlu ZSBJTlRfSFBEX0NIQU5HRSBCSVQoMCkKPiArI2RlZmluZSBJTlRfUkVDRUlWRV9IUERfSVJRIEJJ VCgxKQo+ICsjZGVmaW5lIElOVF9TQ0RUX0NIQU5HRSBCSVQoMikKPiArCj4gKyNkZWZpbmUgSU5U X1NUQVRVU18wMiAweDA3Cj4gKyNkZWZpbmUgSU5UX01BU0tfMDIgMHgwQQo+ICsjZGVmaW5lIElO VF9BVVhfQ01EX0ZBSUwgQklUKDApCj4gKyNkZWZpbmUgSU5UX0FVRElPX0ZJRk9fRVJST1IgQklU KDIpCj4gKwo+ICsjZGVmaW5lIElOVF9TVEFUVVNfMDMgMHgwOAo+ICsjZGVmaW5lIElOVF9NQVNL XzAzIDB4MEIKPiArI2RlZmluZSBJTlRfTElOS19UUkFJTl9GQUlMIEJJVCg0KQo+ICsjZGVmaW5l IElOVF9WSURfRklGT19FUlJPUiBCSVQoNSkKPiArI2RlZmluZSBJTlRfSU9fTEFUQ0hfRklGT19P VkVSRkxPVyBCSVQoNykKPiArCj4gKyNkZWZpbmUgUkVHX1NZU1RFTV9TVFMgMHgwRAo+ICsjZGVm aW5lIElOVF9TVFMgQklUKDApCj4gKyNkZWZpbmUgSFBEX1NUUyBCSVQoMSkKPiArI2RlZmluZSBW SURFT19TVEIgQklUKDIpCj4gKwo+ICsjZGVmaW5lIFJFR19MSU5LX1RSQUlOX1NUUyAweDBFCj4g KyNkZWZpbmUgTElOS19TVEFURV9DUiBCSVQoMikKPiArI2RlZmluZSBMSU5LX1NUQVRFX0VRIEJJ VCgzKQo+ICsjZGVmaW5lIExJTktfU1RBVEVfTk9SUCBCSVQoNCkKPiArCj4gKyNkZWZpbmUgUkVH X0JBTktfU0VMIDB4MEYKPiArI2RlZmluZSBSRUdfQ0xLX0NUUkwwIDB4MTAKPiArI2RlZmluZSBN X1BDTEtfREVMQVkgMHgwMwo+ICsKPiArI2RlZmluZSBSRUdfQVVYX09QVCAweDExCj4gKyNkZWZp bmUgQVVYX0FVVE9fUlNUIEJJVCgwKQo+ICsjZGVmaW5lIEFVWF9GSVhfRlJFUSBCSVQoMykKPiAr Cj4gKyNkZWZpbmUgUkVHX0RBVEFfQ1RSTDAgMHgxMgo+ICsjZGVmaW5lIFZJREVPX0xBVENIX0VE R0UgQklUKDQpCj4gKyNkZWZpbmUgRU5BQkxFX1BDTEtfQ09VTlRFUiBCSVQoNykKPiArCj4gKyNk ZWZpbmUgUkVHX1BDTEtfQ09VTlRFUl9WQUxVRSAweDEzCj4gKwo+ICsjZGVmaW5lIFJFR181MDFf RklGT19DVFJMIDB4MTUKPiArI2RlZmluZSBSU1RfNTAxX0ZJRk8gQklUKDEpCj4gKwo+ICsjZGVm aW5lIFJFR19UUkFJTl9DVFJMMCAweDE2Cj4gKyNkZWZpbmUgRk9SQ0VfTEJSIEJJVCgwKQo+ICsj ZGVmaW5lIExBTkVfQ09VTlRfTUFTSyAweDA2Cj4gKyNkZWZpbmUgTEFORV9TV0FQIEJJVCgzKQo+ ICsjZGVmaW5lIFNQUkVBRF9BTVBfNSBCSVQoNCkKPiArI2RlZmluZSBGT1JDRV9DUl9ET05FIEJJ VCg1KQo+ICsjZGVmaW5lIEZPUkNFX0VRX0RPTkUgQklUKDYpCj4gKwo+ICsjZGVmaW5lIFJFR19U UkFJTl9DVFJMMSAweDE3Cj4gKyNkZWZpbmUgQVVUT19UUkFJTiBCSVQoMCkKPiArI2RlZmluZSBN QU5VQUxfVFJBSU4gQklUKDEpCj4gKyNkZWZpbmUgRk9SQ0VfUkVUUkFJTiBCSVQoMikKPiArCj4g KyNkZWZpbmUgUkVHX0FVWF9DVFJMIDB4MjMKPiArI2RlZmluZSBDTFJfRURJRF9GSUZPIEJJVCgw KQo+ICsjZGVmaW5lIEFVWF9VU0VSX01PREUgQklUKDEpCj4gKyNkZWZpbmUgQVVYX05PX1NFR01F TlRfV1IgQklUKDYpCj4gKyNkZWZpbmUgQVVYX0VOX0ZJRk9fUkVBRCBCSVQoNykKPiArCj4gKyNk ZWZpbmUgUkVHX0FVWF9BRFJfMF83IDB4MjQKPiArI2RlZmluZSBSRUdfQVVYX0FEUl84XzE1IDB4 MjUKPiArI2RlZmluZSBSRUdfQVVYX0FEUl8xNl8xOSAweDI2Cj4gKyNkZWZpbmUgUkVHX0FVWF9P VVRfREFUQTAgMHgyNwo+ICsKPiArI2RlZmluZSBSRUdfQVVYX0NNRF9SRVEgMHgyQgo+ICsjZGVm aW5lIEFVWF9CVVNZIEJJVCg1KQo+ICsKPiArI2RlZmluZSBSRUdfQVVYX0RBVEFfMF83IDB4MkMK PiArI2RlZmluZSBSRUdfQVVYX0RBVEFfOF8xNSAweDJECj4gKyNkZWZpbmUgUkVHX0FVWF9EQVRB XzE2XzIzIDB4MkUKPiArI2RlZmluZSBSRUdfQVVYX0RBVEFfMjRfMzEgMHgyRgo+ICsKPiArI2Rl ZmluZSBSRUdfQVVYX0RBVEFfRklGTyAweDJGCj4gKwo+ICsjZGVmaW5lIFJFR19BVVhfRVJST1Jf U1RTIDB4OUYKPiArI2RlZmluZSBNX0FVWF9SRVFfRkFJTCAweDAzCj4gKwo+ICsjZGVmaW5lIFJF R19IRENQX0NUUkwxIDB4MzgKPiArI2RlZmluZSBIRENQX0NQX0VOQUJMRSBCSVQoMCkKPiArCj4g KyNkZWZpbmUgUkVHX0hEQ1BfQ1RSTDIgMHgzQQo+ICsjZGVmaW5lIEhEQ1BfQU5fU0VMIEJJVCgw KQo+ICsjZGVmaW5lIEhEQ1BfSFdfSFBESVJRX0FDVCBCSVQoMikKPiArCj4gKyNkZWZpbmUgUkVH X00wXzBfNyAweDRDCj4gKyNkZWZpbmUgUkVHX0FOXzBfNyAweDRDCj4gKyNkZWZpbmUgUkVHX1NQ X0NUUkwwIDB4NTgKPiArI2RlZmluZSBSRUdfSVBfQ1RSTDEgMHg1OQo+ICsjZGVmaW5lIFJFR19J UF9DVFJMMiAweDVBCj4gKwo+ICsjZGVmaW5lIFJFR19MSU5LX0RSViAweDVDCj4gKyNkZWZpbmUg RFJWX0hTIEJJVCgxKQo+ICsKPiArI2RlZmluZSBSRUdfRFJWX0xOX0RBVEFfU0VMIDB4NUQKPiAr Cj4gKyNkZWZpbmUgUkVHX0FVWCAweDVFCj4gKwo+ICsjZGVmaW5lIFJFR19WSURfQlVTX0NUUkww IDB4NjAKPiArI2RlZmluZSBJTl9ERFIgQklUKDIpCj4gKyNkZWZpbmUgRERSX0NEICgweDAxIDw8 IDYpCj4gKwo+ICsjZGVmaW5lIFJFR19WSURfQlVTX0NUUkwxIDB4NjEKPiArI2RlZmluZSBUWF9G SUZPX1JFU0VUIEJJVCgxKQo+ICsKPiArI2RlZmluZSBSRUdfSU5QVVRfQ1RSTCAweEEwCj4gKyNk ZWZpbmUgSU5QVVRfSFNZTkNfUE9MIEJJVCgwKQo+ICsjZGVmaW5lIElOUFVUX1ZTWU5DX1BPTCBC SVQoMikKPiArI2RlZmluZSBJTlBVVF9JTlRFUkxBQ0VEIEJJVCg0KQo+ICsKPiArI2RlZmluZSBS RUdfSU5QVVRfSFRPVEFMIDB4QTEKPiArI2RlZmluZSBSRUdfSU5QVVRfSEFDVElWRV9TVEFSVCAw eEEzCj4gKyNkZWZpbmUgUkVHX0lOUFVUX0hBQ1RJVkVfV0lEVEggMHhBNQo+ICsjZGVmaW5lIFJF R19JTlBVVF9IRlJPTlRfUE9SQ0ggMHhBNwo+ICsjZGVmaW5lIFJFR19JTlBVVF9IU1lOQ19XSURU SCAweEE5Cj4gKyNkZWZpbmUgUkVHX0lOUFVUX1ZUT1RBTCAweEFCCj4gKyNkZWZpbmUgUkVHX0lO UFVUX1ZBQ1RJVkVfU1RBUlQgMHhBRAo+ICsjZGVmaW5lIFJFR19JTlBVVF9WQUNUSVZFX1dJRFRI IDB4QUYKPiArI2RlZmluZSBSRUdfSU5QVVRfVkZST05UX1BPUkNIIDB4QjEKPiArI2RlZmluZSBS RUdfSU5QVVRfVlNZTkNfV0lEVEggMHhCMwo+ICsKPiArI2RlZmluZSBSRUdfQVVESU9fU1JDX0NU UkwgMHhCOAo+ICsjZGVmaW5lIE1fQVVESU9fSTJTX0VOIDB4MEYKPiArI2RlZmluZSBFTl9JMlMw IEJJVCgwKQo+ICsjZGVmaW5lIEVOX0kyUzEgQklUKDEpCj4gKyNkZWZpbmUgRU5fSTJTMiBCSVQo MikKPiArI2RlZmluZSBFTl9JMlMzIEJJVCgzKQo+ICsjZGVmaW5lIEFVRElPX0ZJRk9fUkVTRVQg QklUKDcpCj4gKwo+ICsjZGVmaW5lIFJFR19BVURJT19GTVQgMHhCOQo+ICsjZGVmaW5lIFJFR19B VURJT19GSUZPX1NFTCAweEJBCj4gKwo+ICsjZGVmaW5lIFJFR19BVURJT19DVFJMMCAweEJCCj4g KyNkZWZpbmUgQVVESU9fRlVMTF9QS1QgQklUKDQpCj4gKyNkZWZpbmUgQVVESU9fMTZCX0JPVU5E IEJJVCg1KQo+ICsKPiArI2RlZmluZSBSRUdfQVVESU9fQ1RSTDEgMHhCQwo+ICsjZGVmaW5lIFJF R19BVURJT19JTlBVVF9GUkVRIDB4QkUKPiArCj4gKyNkZWZpbmUgUkVHX0lFQzk1OF9TVFMwIDB4 QkYKPiArI2RlZmluZSBSRUdfSUVDOTU4X1NUUzEgMHhDMAo+ICsjZGVmaW5lIFJFR19JRUM5NThf U1RTMiAweEMxCj4gKyNkZWZpbmUgUkVHX0lFQzk1OF9TVFMzIDB4QzIKPiArI2RlZmluZSBSRUdf SUVDOTU4X1NUUzQgMHhDMwo+ICsKPiArI2RlZmluZSBSRUdfSFBEX0lSUV9USU1FIDB4QzkKPiAr I2RlZmluZSBSRUdfQVVYX0RFQlVHX01PREUgMHhDQQo+ICsjZGVmaW5lIFJFR19BVVhfT1BUMiAw eENCCj4gKyNkZWZpbmUgUkVHX0hEQ1BfT1BUIDB4Q0UKPiArCj4gKyNkZWZpbmUgUkVHX0RBVEFf TVVURV9DVFJMIDB4RDMKPiArI2RlZmluZSBFTkFCTEVfRU5IQU5DRURfRlJBTUUgQklUKDApCj4g KyNkZWZpbmUgRU5BQkxFX0FVVE9fVklERU9fRklGT19SRVNFVCBCSVQoMSkKPiArI2RlZmluZSBF Tl9WSURfTVVURSBCSVQoNCkKPiArI2RlZmluZSBFTl9BVURfTVVURSBCSVQoNSkKPiArCj4gKyNk ZWZpbmUgUkVHX1RJTUVfU1RNUF9DVFJMIDB4RDQKPiArI2RlZmluZSBFTl9FTkhBTkNFX1ZJRF9T VE1QIEJJVCgwKQo+ICsjZGVmaW5lIEVOX0VOSEFOQ0VfQVVEX1NUTVAgQklUKDIpCj4gKyNkZWZp bmUgTV9TVEFNUF9TVEVQIDB4MzAKPiArI2RlZmluZSBFTl9TU0NfR0FUIEJJVCg2KQo+ICsKPiAr I2RlZmluZSBSRUdfSU5GT0ZSQU1FX0NUUkwgMHhFOAo+ICsjZGVmaW5lIEVOX0FWSV9QS1QgQklU KDApCj4gKyNkZWZpbmUgRU5fQVVEX1BLVCBCSVQoMSkKPiArI2RlZmluZSBFTl9NUEdfUEtUIEJJ VCgyKQo+ICsjZGVmaW5lIEVOX0dFTl9QS1QgQklUKDMpCj4gKyNkZWZpbmUgRU5fVklEX1RJTUVf U1RNUCBCSVQoNCkKPiArI2RlZmluZSBFTl9BVURfVElNRV9TVE1QIEJJVCg1KQo+ICsjZGVmaW5l IEVOX1ZJRF9DVFJMX1BLVCAoRU5fQVZJX1BLVCB8IEVOX1ZJRF9USU1FX1NUTVApCj4gKyNkZWZp bmUgRU5fQVVEX0NUUkxfUEtUIChFTl9BVURfUEtUIHwgRU5fQVVEX1RJTUVfU1RNUCkKPiArCj4g KyNkZWZpbmUgUkVHX0FVRElPX05fMF83IDB4REUKPiArI2RlZmluZSBSRUdfQVVESU9fTl84XzE1 IDB4REYKPiArI2RlZmluZSBSRUdfQVVESU9fTl8xNl8yMyAweEUwCj4gKwo+ICsjZGVmaW5lIFJF R19BVklfSU5GT19EQjEgMHhFOQo+ICsjZGVmaW5lIFJFR19BVklfSU5GT19EQjIgMHhFQQo+ICsj ZGVmaW5lIFJFR19BVklfSU5GT19EQjMgMHhFQgo+ICsjZGVmaW5lIFJFR19BVklfSU5GT19EQjQg MHhFQwo+ICsjZGVmaW5lIFJFR19BVklfSU5GT19EQjUgMHhFRAo+ICsjZGVmaW5lIFJFR19BVklf SU5GT19TVU0gMHhGNgo+ICsKPiArI2RlZmluZSBSRUdfQVVEX0lORk9GUkFNX0RCMSAweEY3Cj4g KyNkZWZpbmUgUkVHX0FVRF9JTkZPRlJBTV9EQjIgMHhGOAo+ICsjZGVmaW5lIFJFR19BVURfSU5G T0ZSQU1fREIzIDB4RjkKPiArI2RlZmluZSBSRUdfQVVEX0lORk9GUkFNX0RCNCAweEZBCj4gKyNk ZWZpbmUgUkVHX0FVRF9JTkZPRlJBTV9TVU0gMHhGQgo+ICsKPiArLyogdGhlIGZvbGxvd2luZyBz aXggcmVnaXN0ZXJzIGFyZSBpbiBiYW5rMSAqLwo+ICsjZGVmaW5lIFJFR19EUlZfMF9EQl84MDBf TVYgMHg3RQo+ICsjZGVmaW5lIFJFR19QUkVfMF9EQl84MDBfTVYgMHg3Rgo+ICsjZGVmaW5lIFJF R19QUkVfM1A1X0RCXzgwMF9NViAweDgxCj4gKyNkZWZpbmUgUkVHX1NTQ19DVFJMMCAweDg4Cj4g KyNkZWZpbmUgUkVHX1NTQ19DVFJMMSAweDg5Cj4gKyNkZWZpbmUgUkVHX1NTQ19DVFJMMiAweDhB Cj4gKwo+ICsjZGVmaW5lIFJCUiBEUF9MSU5LX0JXXzFfNjIKPiArI2RlZmluZSBIQlIgRFBfTElO S19CV18yXzcKPiArI2RlZmluZSBIQlIyIERQX0xJTktfQldfNV80Cj4gKyNkZWZpbmUgSEJSMyBE UF9MSU5LX0JXXzhfMQo+ICsKPiArLyogVmVuZG9yIG9wdGlvbiAqLwo+ICsjZGVmaW5lIE1BWF9M QU5FX0NPVU5UIDQKPiArI2RlZmluZSBNQVhfTElOS19SQVRFIEhCUgo+ICsjZGVmaW5lIEFVVE9f VFJBSU5fUkVUUlkgMwo+ICsjZGVmaW5lIE1BWF9DUl9MRVZFTCAweDAzCj4gKyNkZWZpbmUgTUFY X0VRX0xFVkVMIDB4MDMKPiArI2RlZmluZSBBVVhfV0FJVF9USU1FT1VUX01TIDE1Cj4gKyNkZWZp bmUgQVVYX0ZJRk9fTUFYX1NJWkUgMzIKPiArI2RlZmluZSBQSVhFTF9DTEtfREVMQVkgMQo+ICsj ZGVmaW5lIFBJWEVMX0NMS19JTlZFUlNFIDAKPiArI2RlZmluZSBBREpVU1RfUEhBU0VfVEhSRVNI T0xEIDgwMDAwCj4gKyNkZWZpbmUgRFBJX1BJWEVMX0NMS19NQVggOTUwMDAKPiArI2RlZmluZSBE RUZBVUxUX1BXUl9PTiAwCj4gKyNkZWZpbmUgREVGQVVMVF9EUlZfSE9MRCAwCj4gKwo+ICsjZGVm aW5lIEFVRElPX1NFTEVDVCBJMlMKPiArI2RlZmluZSBBVURJT19UWVBFIExQQ00KPiArI2RlZmlu ZSBBVURJT19TQU1QTEVfUkFURSBTQU1QTEVfUkFURV80OEsKPiArI2RlZmluZSBBVURJT19DSEFO TkVMX0NPVU5UIDIKPiArCj4gKy8qCj4gKyAqIDA6IFN0YW5kYXJkIEkyUwo+ICsgKiAxOiAzMmJp dCBJMlMKPiArICovCj4gKyNkZWZpbmUgSTJTX0lOUFVUX0ZPUk1BVCAxCj4gKwo+ICsvKgo+ICsg KiAwOiBMZWZ0LWp1c3RpZmllZAo+ICsgKiAxOiBSaWdodC1qdXN0aWZpZWQKPiArICovCj4gKyNk ZWZpbmUgSTJTX0pVU1RJRklFRCAwCj4gKwo+ICsvKgo+ICsgKiAwOiBEYXRhIGRlbGF5IDFUIGNv cnJlc3BvbmQgdG8gV1MKPiArICogMTogTm8gZGF0YSBkZWxheSBjb3JyZXNwb25kIHRvIFdTCj4g KyAqLwo+ICsjZGVmaW5lIEkyU19EQVRBX0RFTEFZIDAKPiArCj4gKy8qCj4gKyAqIDA6IExlZnQg Y2hhbm5lbAo+ICsgKiAxOiBSaWdodCBjaGFubmVsCj4gKyAqLwo+ICsjZGVmaW5lIEkyU19XU19D SEFOTkVMIDAKPiArCj4gKy8qCj4gKyAqIDA6IE1TQiBzaGlmdCBmaXJzdAo+ICsgKiAxOiBMU0Ig c2hpZnQgZmlyc3QKPiArICovCj4gKyNkZWZpbmUgSTJTX0RBVEFfU0VRVUVOQ0UgMAo+ICsKPiAr LyoKPiArICogQXVkaW8gU2FtcGxlIFdvcmQgTGVuZ3RoCj4gKyAqIFdPUkRfTEVOR1RIXzE2QklU Cj4gKyAqIFdPUkRfTEVOR1RIXzE4QklUCj4gKyAqIFdPUkRfTEVOR1RIXzIwQklUCj4gKyAqIFdP UkRfTEVOR1RIXzI0QklUCj4gKyAqLwo+ICsjZGVmaW5lIEFVRElPX1dPUkRfTEVOR1RIIFdPUkRf TEVOR1RIXzI0QklUCj4gKwo+ICtlbnVtIGF1eF9jbWRfdHlwZSB7Cj4gKwlDTURfQVVYX05BVElW RV9SRUFEID0gMHgwLAo+ICsJQ01EX0FVWF9OQVRJVkVfV1JJVEUgPSAweDUsCj4gKwlDTURfQVVY X0kyQ19FRElEX1JFQUQgPSAweEIsCj4gK307Cj4gKwo+ICtlbnVtIGF1eF9jbWRfcmVwbHkgewo+ ICsJUkVQTFlfQUNLLAo+ICsJUkVQTFlfTkFDSywKPiArCVJFUExZX0RFRkVSLAo+ICt9Owo+ICsK PiArZW51bSBsaW5rX3RyYWluX3N0YXR1cyB7Cj4gKwlMSU5LX0lETEUsCj4gKwlMSU5LX0JVU1ks Cj4gKwlMSU5LX09LLAo+ICt9Owo+ICsKPiArZW51bSBtYXhfdmFsdWVfY2hlY2sgewo+ICsJVk9M VEFHRV9TV0lORywKPiArCVBSRV9FTVBIQVNJUywKPiArfTsKPiArCj4gK3N0cnVjdCBpdDY1MDVf cGxhdGZvcm1fZGF0YSB7Cj4gKwlzdHJ1Y3QgcmVndWxhdG9yICpwd3IxODsKPiArCXN0cnVjdCBy ZWd1bGF0b3IgKm92ZGQ7Cj4gKwlzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvZF9yZXNldDsKPiArfTsK PiArCj4gK2VudW0gaXQ2NTA1X2F1ZGlvX3NlbGVjdCB7Cj4gKwlJMlMgPSAwLAo+ICsJU1BESUYs Cj4gK307Cj4gKwo+ICtlbnVtIGl0NjUwNV9hdWRpb19zYW1wbGVfcmF0ZSB7Cj4gKwlTQU1QTEVf UkFURV8yNEsgPSAweDYsCj4gKwlTQU1QTEVfUkFURV8zMksgPSAweDMsCj4gKwlTQU1QTEVfUkFU RV80OEsgPSAweDIsCj4gKwlTQU1QTEVfUkFURV85NksgPSAweEEsCj4gKwlTQU1QTEVfUkFURV8x OTJLID0gMHhFLAo+ICsJU0FNUExFX1JBVEVfNDRfMUsgPSAweDAsCj4gKwlTQU1QTEVfUkFURV84 OF8ySyA9IDB4OCwKPiArCVNBTVBMRV9SQVRFXzE3Nl80SyA9IDB4QywKPiArfTsKPiArCj4gK2Vu dW0gaXQ2NTA1X2F1ZGlvX3R5cGUgewo+ICsJTFBDTSA9IDAsCj4gKwlOTFBDTSwKPiArCURTUywK PiArfTsKPiArCj4gK2VudW0gaXQ2NTA1X2F1ZGlvX3dvcmRfbGVuZ3RoIHsKPiArCVdPUkRfTEVO R1RIXzE2QklUID0gMCwKPiArCVdPUkRfTEVOR1RIXzE4QklULAo+ICsJV09SRF9MRU5HVEhfMjBC SVQsCj4gKwlXT1JEX0xFTkdUSF8yNEJJVCwKPiArfTsKPiArCj4gK3N0cnVjdCBpdDY1MDVfYXVk aW9fZGF0YSB7Cj4gKwllbnVtIGl0NjUwNV9hdWRpb19zZWxlY3Qgc2VsZWN0Owo+ICsJZW51bSBp dDY1MDVfYXVkaW9fc2FtcGxlX3JhdGUgc2FtcGxlX3JhdGU7Cj4gKwllbnVtIGl0NjUwNV9hdWRp b190eXBlIHR5cGU7Cj4gKwllbnVtIGl0NjUwNV9hdWRpb193b3JkX2xlbmd0aCB3b3JkX2xlbmd0 aDsKPiArCXU4IGNoYW5uZWxfY291bnQ7Cj4gKwl1OCBpMnNfaW5wdXRfZm9ybWF0Owo+ICsJdTgg aTJzX2p1c3RpZmllZDsKPiArCXU4IGkyc19kYXRhX2RlbGF5Owo+ICsJdTggaTJzX3dzX2NoYW5u ZWw7Cj4gKwl1OCBpMnNfZGF0YV9zZXF1ZW5jZTsKPiArfTsKPiArCj4gK3N0cnVjdCBpdDY1MDVf YXVkaW9fc2FtcGxlX3JhdGVfbWFwIHsKPiArCWVudW0gaXQ2NTA1X2F1ZGlvX3NhbXBsZV9yYXRl IHJhdGU7Cj4gKwlpbnQgc2FtcGxlX3JhdGVfdmFsdWU7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgaXQ2 NTA1X2RybV9kcF9saW5rIHsKPiArCXVuc2lnbmVkIGNoYXIgcmV2aXNpb247Cj4gKwl1bnNpZ25l ZCBpbnQgcmF0ZTsKPiArCXVuc2lnbmVkIGludCBudW1fbGFuZXM7Cj4gKwl1bnNpZ25lZCBsb25n IGNhcGFiaWxpdGllczsKPiArfTsKPiArCj4gK3N0cnVjdCBpdDY1MDUgewo+ICsJc3RydWN0IGRy bV9kcF9hdXggYXV4Owo+ICsJc3RydWN0IGRybV9icmlkZ2UgYnJpZGdlOwo+ICsJc3RydWN0IGky Y19jbGllbnQgKmNsaWVudDsKPiArCXN0cnVjdCBlZGlkICplZGlkOwo+ICsJc3RydWN0IGRybV9j b25uZWN0b3IgY29ubmVjdG9yOwo+ICsJc3RydWN0IGl0NjUwNV9kcm1fZHBfbGluayBsaW5rOwo+ ICsJc3RydWN0IGl0NjUwNV9wbGF0Zm9ybV9kYXRhIHBkYXRhOwo+ICsJc3RydWN0IG11dGV4IGV4 dGNvbl9sb2NrOwo+ICsJc3RydWN0IG11dGV4IG1vZGVfbG9jazsKPiArCXN0cnVjdCBtdXRleCBh dXhfbG9jazsKPiArCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKPiArCXN0cnVjdCBkcm1fZGlzcGxh eV9tb2RlIHZpZGVvX2luZm87Cj4gKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZXZlbnRfbmI7Cj4g KwlzdHJ1Y3QgZXh0Y29uX2RldiAqZXh0Y29uOwo+ICsJc3RydWN0IHdvcmtfc3RydWN0IGV4dGNv bl93cTsKPiArCWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgY29ubmVjdG9yX3N0YXR1czsKPiAr CWludCByZXZpc2lvbjsKPiArCWVudW0gbGlua190cmFpbl9zdGF0dXMgbGlua19zdGF0ZTsKPiAr CXN0cnVjdCB3b3JrX3N0cnVjdCBsaW5rX3dvcmtzOwo+ICsJdTggZHBjZFtEUF9SRUNFSVZFUl9D QVBfU0laRV07Cj4gKwl1OCBsYW5lX2NvdW50Owo+ICsJdTggbGlua19yYXRlX2J3X2NvZGU7Cj4g Kwl1OCBzaW5rX2NvdW50Owo+ICsJYm9vbCBzdGVwX3RyYWluOwo+ICsJYm9vbCBicmFuY2hfZGV2 aWNlOwo+ICsJYm9vbCBlbmFibGVfc3NjOwo+ICsJYm9vbCBsYW5lX3N3YXBfZGlzYWJsZWQ7Cj4g Kwlib29sIGxhbmVfc3dhcDsKPiArCWJvb2wgcG93ZXJlZDsKPiArCXUzMiBhZmVfc2V0dGluZzsK PiArCXN0cnVjdCBjb21wbGV0aW9uIHdhaXRfZWRpZF9jb21wbGV0ZTsKPiArCXU4IGF1dG9fdHJh aW5fcmV0cnk7Cj4gKwlib29sIGlzX3JlcGVhdGVyOwo+ICsJYm9vbCBlbmFibGVfZW5oYW5jZWRf ZnJhbWU7Cj4gKwloZG1pX2NvZGVjX3BsdWdnZWRfY2IgcGx1Z2dlZF9jYjsKPiArCXN0cnVjdCBk ZXZpY2UgKmNvZGVjX2RldjsKPiArCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF9hdWRpbzsK PiArCWJvb2wgZW5hYmxlX2F1ZGlvOwo+ICsJc3RydWN0IGl0NjUwNV9hdWRpb19kYXRhIGF1ZGlv Owo+ICsKPiArCS8qIGl0NjUwNSBkcml2ZXIgaG9sZCBvcHRpb24gKi8KPiArCWJvb2wgZW5hYmxl X2Rydl9ob2xkOwo+ICt9Owo+ICsKPiArc3RydWN0IGl0NjUwNV9zdGVwX3RyYWluX3BhcmEgewo+ ICsJdTggdm9sdGFnZV9zd2luZ1tNQVhfTEFORV9DT1VOVF07Cj4gKwl1OCBwcmVfZW1waGFzaXNb TUFYX0xBTkVfQ09VTlRdOwo+ICt9Owo+ICsKPiArLyoKPiArICogVmVuZG9yIG9wdGlvbiBhZmUg c2V0dGluZ3MgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMKPiArICogMDogZm9yIGJpdGxhbmQgMTBl LCBxdWFudGEgemRlCj4gKyAqIDE6IGZvciBnb29nbGUga3VrdWkgcDEvcDIsIGh1YXFpbiBrcmFu ZQo+ICsgKi8KPiArCj4gK3N0YXRpYyB1OCBjb25zdCBhZmVfc2V0dGluZ190YWJsZVtdWzNdID0g ewo+ICsJezB4ODIsIDB4MDAsIDB4QTZ9LAo+ICsJezB4OTMsIDB4MkEsIDB4ODV9Cj4gK307Cj4g Kwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGl0NjUwNV9hdWRpb19zYW1wbGVfcmF0ZV9tYXAgYXVk aW9fc2FtcGxlX3JhdGVfbWFwW10gPSB7Cj4gKwl7U0FNUExFX1JBVEVfMjRLLCAyNDAwMH0sCj4g Kwl7U0FNUExFX1JBVEVfMzJLLCAzMjAwMH0sCj4gKwl7U0FNUExFX1JBVEVfNDhLLCA0ODAwMH0s Cj4gKwl7U0FNUExFX1JBVEVfOTZLLCA5NjAwMH0sCj4gKwl7U0FNUExFX1JBVEVfMTkySywgMTky MDAwfSwKPiArCXtTQU1QTEVfUkFURV80NF8xSywgNDQxMDB9LAo+ICsJe1NBTVBMRV9SQVRFXzg4 XzJLLCA4ODIwMH0sCj4gKwl7U0FNUExFX1JBVEVfMTc2XzRLLCAxNzY0MDB9LAo+ICt9Owo+ICsK PiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfcmFuZ2UgaXQ2NTA1X2JyaWRnZV92b2xhdGls ZV9yYW5nZXNbXSA9IHsKPiArCXsgLnJhbmdlX21pbiA9IDAsIC5yYW5nZV9tYXggPSAweEZGIH0s Cj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaXQ2 NTA1X2JyaWRnZV92b2xhdGlsZV90YWJsZSA9IHsKPiArCS55ZXNfcmFuZ2VzID0gaXQ2NTA1X2Jy aWRnZV92b2xhdGlsZV9yYW5nZXMsCj4gKwkubl95ZXNfcmFuZ2VzID0gQVJSQVlfU0laRShpdDY1 MDVfYnJpZGdlX3ZvbGF0aWxlX3JhbmdlcyksCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IHJlZ21hcF9jb25maWcgaXQ2NTA1X3JlZ21hcF9jb25maWcgPSB7Cj4gKwkucmVnX2JpdHMg PSA4LAo+ICsJLnZhbF9iaXRzID0gOCwKPiArCS52b2xhdGlsZV90YWJsZSA9ICZpdDY1MDVfYnJp ZGdlX3ZvbGF0aWxlX3RhYmxlLAo+ICsJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9OT05FLAo+ICt9 Owo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfcmVhZChzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVu c2lnbmVkIGludCByZWdfYWRkcikKPiArewo+ICsJdW5zaWduZWQgaW50IHZhbHVlOwo+ICsJaW50 IGVycjsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsK PiArCWVyciA9IHJlZ21hcF9yZWFkKGl0NjUwNS0+cmVnbWFwLCByZWdfYWRkciwgJnZhbHVlKTsK PiArCWlmIChlcnIgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJyZWFkIGZhaWxlZCBy ZWdbMHgleF0gZXJyOiAlZCIsIHJlZ19hZGRyLAo+ICsJCQkgICAgICBlcnIpOwo+ICsJCXJldHVy biBlcnI7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHZhbHVlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IGl0NjUwNV93cml0ZShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVuc2lnbmVkIGludCByZWdfYWRk ciwKPiArCQkgICAgICB1bnNpZ25lZCBpbnQgcmVnX3ZhbCkKPiArewo+ICsJaW50IGVycjsKPiAr CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsKPiArCWVyciA9 IHJlZ21hcF93cml0ZShpdDY1MDUtPnJlZ21hcCwgcmVnX2FkZHIsIHJlZ192YWwpOwo+ICsKPiAr CWlmIChlcnIgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJ3cml0ZSBmYWlsZWQgcmVn WzB4JXhdID0gMHgleCBlcnIgPSAlZCIsCj4gKwkJCSAgICAgIHJlZ19hZGRyLCByZWdfdmFsLCBl cnIpOwo+ICsJCXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgaXQ2NTA1X3NldF9iaXRzKHN0cnVjdCBpdDY1MDUgKml0NjUwNSwgdW5zaWdu ZWQgaW50IHJlZywKPiArCQkJIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsdWUp Cj4gK3sKPiArCWludCBlcnI7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGll bnQtPmRldjsKPiArCj4gKwllcnIgPSByZWdtYXBfdXBkYXRlX2JpdHMoaXQ2NTA1LT5yZWdtYXAs IHJlZywgbWFzaywgdmFsdWUpOwo+ICsJaWYgKGVyciA8IDApIHsKPiArCQlEUk1fREVWX0VSUk9S KAo+ICsJCQlkZXYsICJ3cml0ZSByZWdbMHgleF0gPSAweCV4IG1hc2sgPSAweCV4IGZhaWxlZCBl cnIgJWQiLAo+ICsJCQlyZWcsIHZhbHVlLCBtYXNrLCBlcnIpOwo+ICsJCXJldHVybiBlcnI7Cj4g Kwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaXQ2NTA1X2RwY2Rf cmVhZChzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQo+ICt7Cj4g Kwl1OCB2YWx1ZTsKPiArCWludCByZXQ7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1 LT5jbGllbnQtPmRldjsKPiArCj4gKwlyZXQgPSBkcm1fZHBfZHBjZF9yZWFkYigmaXQ2NTA1LT5h dXgsIG9mZnNldCwgJnZhbHVlKTsKPiArCWlmIChyZXQgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJP UihkZXYsICJEUENEIHJlYWQgZmFpbGVkIFsweCVseF0gcmV0OiAlZCIsIG9mZnNldCwKPiArCQkJ ICAgICAgcmV0KTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsJcmV0dXJuIHZhbHVlOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IGl0NjUwNV9kcGNkX3dyaXRlKHN0cnVjdCBpdDY1MDUgKml0NjUw NSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCj4gKwkJCSAgICAgdW5zaWduZWQgbG9uZyBkYXRhaW4p Cj4gK3sKPiArCWludCByZXQ7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGll bnQtPmRldjsKPiArCj4gKwlyZXQgPSBkcm1fZHBfZHBjZF93cml0ZWIoJml0NjUwNS0+YXV4LCBv ZmZzZXQsIGRhdGFpbik7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCURSTV9ERVZfRVJST1IoZGV2 LCAiRFBDRCB3cml0ZSBmYWlsZWQgWzB4JWx4XSByZXQ6ICVkIiwgb2Zmc2V0LAo+ICsJCQkgICAg ICByZXQpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiAr c3RhdGljIGludCBpdDY1MDVfZ2V0X2RwY2Qoc3RydWN0IGl0NjUwNSAqaXQ2NTA1LCBpbnQgb2Zm c2V0LCB1OCAqZHBjZCwgaW50IG51bSkKPiArewo+ICsJaW50IHJldDsKPiArCXN0cnVjdCBkZXZp Y2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsKPiArCXJldCA9IGRybV9kcF9kcGNk X3JlYWQoJml0NjUwNS0+YXV4LCBvZmZzZXQsIGRwY2QsIG51bSk7Cj4gKwo+ICsJaWYgKHJldCA8 IDApCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJy ZXQgPSAlZCBEUENEWzB4JXhdID0gMHglKnBoIiwgcmV0LCBvZmZzZXQsCj4gKwkJCSAgICAgbnVt LCBkcGNkKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1 X2R1bXAoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwl1bnNpZ25lZCBpbnQgaSwgajsK PiArCXU4IHJlZ3NbMTZdOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUwNS0+Y2xpZW50 LT5kZXY7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8PSAweGZmOyBpICs9IDE2KSB7Cj4gKwkJZm9y IChqID0gMDsgaiA8IDE2OyBqKyspCj4gKwkJCXJlZ3Nbal0gPSBpdDY1MDVfcmVhZChpdDY1MDUs IGkgKyBqKTsKPiArCj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiWzB4JTAyeF0gPSAl MTZwaCIsIGksIHJlZ3MpOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgYm9vbCBpdDY1MDVfZ2V0 X3NpbmtfaHBkX3N0YXR1cyhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWludCByZWdf MGQ7Cj4gKwo+ICsJcmVnXzBkID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBSRUdfU1lTVEVNX1NUUyk7 Cj4gKwo+ICsJaWYgKHJlZ18wZCA8IDApCj4gKwkJcmV0dXJuIGZhbHNlOwo+ICsKPiArCXJldHVy biAocmVnXzBkICYgSFBEX1NUUykgPyB0cnVlIDogZmFsc2U7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgaXQ2NTA1X3JlYWRfd29yZChzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVuc2lnbmVkIGludCBy ZWcpCj4gK3sKPiArCWludCB2YWwwLCB2YWwxOwo+ICsKPiArCXZhbDAgPSBpdDY1MDVfcmVhZChp dDY1MDUsIHJlZyk7Cj4gKwlpZiAodmFsMCA8IDApCj4gKwkJcmV0dXJuIHZhbDA7Cj4gKwo+ICsJ dmFsMSA9IGl0NjUwNV9yZWFkKGl0NjUwNSwgcmVnICsgMSk7Cj4gKwlpZiAodmFsMSA8IDApCj4g KwkJcmV0dXJuIHZhbDE7Cj4gKwo+ICsJcmV0dXJuICh2YWwxIDw8IDgpIHwgdmFsMDsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2NhbGNfdmlkZW9faW5mbyhzdHJ1Y3QgaXQ2NTA1ICpp dDY1MDUpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2 Owo+ICsJaW50IGhzeW5jX3BvbCwgdnN5bmNfcG9sLCBpbnRlcmxhY2VkOwo+ICsJaW50IGh0b3Rh bCwgaGRlcywgaGRldywgaGZwaCwgaHN5bmN3Owo+ICsJaW50IHZ0b3RhbCwgdmRlcywgdmRldywg dmZwaCwgdnN5bmN3Owo+ICsJaW50IHJkZGF0YSwgaSwgcGNsaywgc3VtOwo+ICsKPiArCXVzbGVl cF9yYW5nZSgxMDAwMCwgMTUwMDApOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0JBTktf U0VMLCAweDAwKTsKPiArCXJkZGF0YSA9IGl0NjUwNV9yZWFkKGl0NjUwNSwgUkVHX0lOUFVUX0NU UkwpOwo+ICsJaHN5bmNfcG9sID0gcmRkYXRhICYgSU5QVVRfSFNZTkNfUE9MOwo+ICsJdnN5bmNf cG9sID0gKHJkZGF0YSAmIElOUFVUX1ZTWU5DX1BPTCkgPj4gMjsKPiArCWludGVybGFjZWQgPSAo cmRkYXRhICYgSU5QVVRfSU5URVJMQUNFRCkgPj4gNDsKPiArCj4gKwlodG90YWwgPSBpdDY1MDVf cmVhZF93b3JkKGl0NjUwNSwgUkVHX0lOUFVUX0hUT1RBTCkgJiAweDFGRkY7Cj4gKwloZGVzID0g aXQ2NTA1X3JlYWRfd29yZChpdDY1MDUsIFJFR19JTlBVVF9IQUNUSVZFX1NUQVJUKSAmIDB4MUZG RjsKPiArCWhkZXcgPSBpdDY1MDVfcmVhZF93b3JkKGl0NjUwNSwgUkVHX0lOUFVUX0hBQ1RJVkVf V0lEVEgpICYgMHgxRkZGOwo+ICsJaGZwaCA9IGl0NjUwNV9yZWFkX3dvcmQoaXQ2NTA1LCBSRUdf SU5QVVRfSEZST05UX1BPUkNIKSAmIDB4MUZGRjsKPiArCWhzeW5jdyA9IGl0NjUwNV9yZWFkX3dv cmQoaXQ2NTA1LCBSRUdfSU5QVVRfSFNZTkNfV0lEVEgpICYgMHgxRkZGOwo+ICsKPiArCXZ0b3Rh bCA9IGl0NjUwNV9yZWFkX3dvcmQoaXQ2NTA1LCBSRUdfSU5QVVRfVlRPVEFMKSAmIDB4RkZGOwo+ ICsJdmRlcyA9IGl0NjUwNV9yZWFkX3dvcmQoaXQ2NTA1LCBSRUdfSU5QVVRfVkFDVElWRV9TVEFS VCkgJiAweEZGRjsKPiArCXZkZXcgPSBpdDY1MDVfcmVhZF93b3JkKGl0NjUwNSwgUkVHX0lOUFVU X1ZBQ1RJVkVfV0lEVEgpICYgMHhGRkY7Cj4gKwl2ZnBoID0gaXQ2NTA1X3JlYWRfd29yZChpdDY1 MDUsIFJFR19JTlBVVF9WRlJPTlRfUE9SQ0gpICYgMHhGRkY7Cj4gKwl2c3luY3cgPSBpdDY1MDVf cmVhZF93b3JkKGl0NjUwNSwgUkVHX0lOUFVUX1ZTWU5DX1dJRFRIKSAmIDB4RkZGOwo+ICsKPiAr CXN1bSA9IDA7Cj4gKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewo+ICsJCWl0NjUwNV9zZXRf Yml0cyhpdDY1MDUsIFJFR19EQVRBX0NUUkwwLCBFTkFCTEVfUENMS19DT1VOVEVSLAo+ICsJCQkJ RU5BQkxFX1BDTEtfQ09VTlRFUik7Cj4gKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxNTAwMCk7Cj4g KwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RBVEFfQ1RSTDAsIEVOQUJMRV9QQ0xLX0NP VU5URVIsCj4gKwkJCQkweDAwKTsKPiArCQlyZGRhdGEgPSBpdDY1MDVfcmVhZF93b3JkKGl0NjUw NSwgUkVHX1BDTEtfQ09VTlRFUl9WQUxVRSkgJgo+ICsJCQkgMHhGRkY7Cj4gKwo+ICsJCXN1bSAr PSByZGRhdGE7Cj4gKwl9Cj4gKwo+ICsJaWYgKHN1bSA9PSAwKSB7Cj4gKwkJRFJNX0RFVl9ERUJV R19EUklWRVIoZGV2LCAiY2FsYyB2aWRlbyB0aW1pbmcgZXJyb3IiKTsKPiArCQlyZXR1cm47Cj4g Kwl9Cj4gKwo+ICsJc3VtIC89IDEwOwo+ICsJcGNsayA9IDEzNTAwICogMjA0OCAvIHN1bTsKPiAr CWl0NjUwNS0+dmlkZW9faW5mby5jbG9jayA9IHBjbGs7Cj4gKwlpdDY1MDUtPnZpZGVvX2luZm8u aGRpc3BsYXkgPSBoZGV3Owo+ICsJaXQ2NTA1LT52aWRlb19pbmZvLmhzeW5jX3N0YXJ0ID0gaGRl dyArIGhmcGg7Cj4gKwlpdDY1MDUtPnZpZGVvX2luZm8uaHN5bmNfZW5kID0gaGRldyArIGhmcGgg KyBoc3luY3c7Cj4gKwlpdDY1MDUtPnZpZGVvX2luZm8uaHRvdGFsID0gaHRvdGFsOwo+ICsJaXQ2 NTA1LT52aWRlb19pbmZvLnZkaXNwbGF5ID0gdmRldzsKPiArCWl0NjUwNS0+dmlkZW9faW5mby52 c3luY19zdGFydCA9IHZkZXcgKyB2ZnBoOwo+ICsJaXQ2NTA1LT52aWRlb19pbmZvLnZzeW5jX2Vu ZCA9IHZkZXcgKyB2ZnBoICsgdnN5bmN3Owo+ICsJaXQ2NTA1LT52aWRlb19pbmZvLnZ0b3RhbCA9 IHZ0b3RhbDsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsIERSTV9NT0RFX0ZNVCwK PiArCQkJICAgICBEUk1fTU9ERV9BUkcoJml0NjUwNS0+dmlkZW9faW5mbykpOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgaW50IGl0NjUwNV9kcm1fZHBfbGlua19wcm9iZShzdHJ1Y3QgZHJtX2RwX2F1eCAq YXV4LAo+ICsJCQkJICAgIHN0cnVjdCBpdDY1MDVfZHJtX2RwX2xpbmsgKmxpbmspCj4gK3sKPiAr CXU4IHZhbHVlc1szXTsKPiArCWludCBlcnI7Cj4gKwo+ICsJbWVtc2V0KGxpbmssIDAsIHNpemVv ZigqbGluaykpOwo+ICsKPiArCWVyciA9IGRybV9kcF9kcGNkX3JlYWQoYXV4LCBEUF9EUENEX1JF ViwgdmFsdWVzLCBzaXplb2YodmFsdWVzKSk7Cj4gKwlpZiAoZXJyIDwgMCkKPiArCQlyZXR1cm4g ZXJyOwo+ICsKPiArCWxpbmstPnJldmlzaW9uID0gdmFsdWVzWzBdOwo+ICsJbGluay0+cmF0ZSA9 IGRybV9kcF9id19jb2RlX3RvX2xpbmtfcmF0ZSh2YWx1ZXNbMV0pOwo+ICsJbGluay0+bnVtX2xh bmVzID0gdmFsdWVzWzJdICYgRFBfTUFYX0xBTkVfQ09VTlRfTUFTSzsKPiArCj4gKwlpZiAodmFs dWVzWzJdICYgRFBfRU5IQU5DRURfRlJBTUVfQ0FQKQo+ICsJCWxpbmstPmNhcGFiaWxpdGllcyA9 IDE7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaXQ2NTA1X2RybV9k cF9saW5rX3Bvd2VyX3VwKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsCj4gKwkJCQkgICAgICAgc3Ry dWN0IGl0NjUwNV9kcm1fZHBfbGluayAqbGluaykKPiArewo+ICsJdTggdmFsdWU7Cj4gKwlpbnQg ZXJyOwo+ICsKPiArCS8qIERQX1NFVF9QT1dFUiByZWdpc3RlciBpcyBvbmx5IGF2YWlsYWJsZSBv biBEUENEIHYxLjEgYW5kIGxhdGVyICovCj4gKwlpZiAobGluay0+cmV2aXNpb24gPCAweDExKQo+ ICsJCXJldHVybiAwOwo+ICsKPiArCWVyciA9IGRybV9kcF9kcGNkX3JlYWRiKGF1eCwgRFBfU0VU X1BPV0VSLCAmdmFsdWUpOwo+ICsJaWYgKGVyciA8IDApCj4gKwkJcmV0dXJuIGVycjsKPiArCj4g Kwl2YWx1ZSAmPSB+RFBfU0VUX1BPV0VSX01BU0s7Cj4gKwl2YWx1ZSB8PSBEUF9TRVRfUE9XRVJf RDA7Cj4gKwo+ICsJZXJyID0gZHJtX2RwX2RwY2Rfd3JpdGViKGF1eCwgRFBfU0VUX1BPV0VSLCB2 YWx1ZSk7Cj4gKwlpZiAoZXJyIDwgMCkKPiArCQlyZXR1cm4gZXJyOwo+ICsKPiArCS8qCj4gKwkg KiBBY2NvcmRpbmcgdG8gdGhlIERQIDEuMSBzcGVjaWZpY2F0aW9uLCBhICJTaW5rIERldmljZSBt dXN0IGV4aXQgdGhlCj4gKwkgKiBwb3dlciBzYXZpbmcgc3RhdGUgd2l0aGluIDEgbXMiIChTZWN0 aW9uIDIuNS4zLjEsIFRhYmxlIDUtNTIsICJTaW5rCj4gKwkgKiBDb250cm9sIEZpZWxkIiAocmVn aXN0ZXIgMHg2MDApLgo+ICsJICovCj4gKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Cj4gKwo+ ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9jbGVhcl9pbnQoc3Ry dWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQkFO S19TRUwsIDB4MDApOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgSU5UX1NUQVRVU18wMSwgMHhG Rik7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBJTlRfU1RBVFVTXzAyLCAweEZGKTsKPiArCWl0 NjUwNV93cml0ZShpdDY1MDUsIElOVF9TVEFUVVNfMDMsIDB4RkYpOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgdm9pZCBpdDY1MDVfaW50X21hc2tfZW5hYmxlKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiAr ewo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0JBTktfU0VMLCAweDAwKTsKPiArCWl0NjUw NV93cml0ZShpdDY1MDUsIElOVF9NQVNLXzAxLCAweDFGKTsKPiArCWl0NjUwNV93cml0ZShpdDY1 MDUsIElOVF9NQVNLXzAyLCAweDA3KTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIElOVF9NQVNL XzAzLCAweEIwKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2ludF9tYXNrX2Rpc2Fi bGUoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBS RUdfQkFOS19TRUwsIDB4MDApOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgSU5UX01BU0tfMDEs IDB4MDApOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgSU5UX01BU0tfMDIsIDB4MDApOwo+ICsJ aXQ2NTA1X3dyaXRlKGl0NjUwNSwgSU5UX01BU0tfMDMsIDB4MDApOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgdm9pZCBpdDY1MDVfbGFuZV90ZXJtaW5hdGlvbl9vbihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUp Cj4gK3sKPiArCWlmIChpdDY1MDVfcmVhZChpdDY1MDUsIDB4Q0YpID09IDB4RjApCj4gKwkJaXQ2 NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RSVl9MTl9EQVRBX1NFTCwgMHg4MCwgMHgwMCk7Cj4g Kwo+ICsJaWYgKGl0NjUwNV9yZWFkKGl0NjUwNSwgMHhDRikgPT0gMHg3MCkgewo+ICsJCWlmIChp dDY1MDUtPmxhbmVfc3dhcCkgewo+ICsJCQlzd2l0Y2ggKGl0NjUwNS0+bGFuZV9jb3VudCkgewo+ ICsJCQljYXNlIDE6Cj4gKwkJCWNhc2UgMjoKPiArCQkJCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUs IFJFR19EUlZfTE5fREFUQV9TRUwsCj4gKwkJCQkJCTB4MEMsIDB4MDgpOwo+ICsJCQkJYnJlYWs7 Cj4gKwkJCWRlZmF1bHQ6Cj4gKwkJCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfRFJWX0xO X0RBVEFfU0VMLAo+ICsJCQkJCQkweDBDLCAweDBDKTsKPiArCQkJCWJyZWFrOwo+ICsJCQl9Cj4g KwkJfSBlbHNlIHsKPiArCQkJc3dpdGNoIChpdDY1MDUtPmxhbmVfY291bnQpIHsKPiArCQkJY2Fz ZSAxOgo+ICsJCQljYXNlIDI6Cj4gKwkJCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfRFJW X0xOX0RBVEFfU0VMLAo+ICsJCQkJCQkweDBDLCAweDA0KTsKPiArCQkJCWJyZWFrOwo+ICsJCQlk ZWZhdWx0Ogo+ICsJCQkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RSVl9MTl9EQVRBX1NF TCwKPiArCQkJCQkJMHgwQywgMHgwQyk7Cj4gKwkJCQlicmVhazsKPiArCQkJfQo+ICsJCX0KPiAr CX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2xhbmVfdGVybWluYXRpb25fb2ZmKHN0 cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJaWYgKGl0NjUwNV9yZWFkKGl0NjUwNSwgMHhD RikgPT0gMHhGMCkKPiArCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfRFJWX0xOX0RBVEFf U0VMLCAweDgwLCAweDgwKTsKPiArCj4gKwlpZiAoaXQ2NTA1X3JlYWQoaXQ2NTA1LCAweENGKSA9 PSAweDcwKQo+ICsJCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19EUlZfTE5fREFUQV9TRUws IDB4MEMsIDB4MDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfbGFuZV9wb3dlcl9v bihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWl0NjUwNV9zZXRfYml0cygKPiArCQlp dDY1MDUsIFJFR19MSU5LX0RSViwgMHhGMSwKPiArCQkoKEJJVChpdDY1MDUtPmxhbmVfY291bnQp IC0gMSkKPiArCQkgPDwgKGl0NjUwNS0+bGFuZV9zd2FwID8gKDggLSBpdDY1MDUtPmxhbmVfY291 bnQpIDogNCkpIHwKPiArCQkJMHgwMSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9s YW5lX3Bvd2VyX29mZihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWl0NjUwNV9zZXRf Yml0cyhpdDY1MDUsIFJFR19MSU5LX0RSViwgMHhGMCwgMHgwMCk7Cj4gK30KPiArCj4gK3N0YXRp YyB2b2lkIGl0NjUwNV9sYW5lX29mZihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWl0 NjUwNV9sYW5lX3Bvd2VyX29mZihpdDY1MDUpOwo+ICsJaXQ2NTA1X2xhbmVfdGVybWluYXRpb25f b2ZmKGl0NjUwNSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9hdXhfdGVybWluYXRp b25fb24oc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpZiAoaXQ2NTA1X3JlYWQoaXQ2 NTA1LCAweENGKSA9PSAweEYwKQo+ICsJCWl0NjUwNV9sYW5lX3Rlcm1pbmF0aW9uX29uKGl0NjUw NSk7Cj4gKwo+ICsJaWYgKGl0NjUwNV9yZWFkKGl0NjUwNSwgMHhDRikgPT0gMHg3MCkKPiArCQlp dDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfRFJWX0xOX0RBVEFfU0VMLCAweDgwLCAweDgwKTsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2F1eF9wb3dlcl9vbihzdHJ1Y3QgaXQ2NTA1 ICppdDY1MDUpCj4gK3sKPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19BVVgsIDB4MDIs IDB4MDIpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfYXV4X29uKHN0cnVjdCBpdDY1 MDUgKml0NjUwNSkKPiArewo+ICsJaXQ2NTA1X2F1eF9wb3dlcl9vbihpdDY1MDUpOwo+ICsJaXQ2 NTA1X2F1eF90ZXJtaW5hdGlvbl9vbihpdDY1MDUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBp dDY1MDVfYXV4X3Jlc2V0KHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJaXQ2NTA1X3Nl dF9iaXRzKGl0NjUwNSwgUkVHX1JFU0VUX0NUUkwsIEFVWF9SRVNFVCwgQVVYX1JFU0VUKTsKPiAr CWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19SRVNFVF9DVFJMLCBBVVhfUkVTRVQsIDB4MDAp Owo+ICt9Cj4gKwo+ICtzdGF0aWMgYm9vbCBpdDY1MDVfcmVzZXRfbG9naWMoc3RydWN0IGl0NjUw NSAqaXQ2NTA1KQo+ICt7Cj4gKwlyZWdtYXBfd3JpdGUoaXQ2NTA1LT5yZWdtYXAsIFJFR19SRVNF VF9DVFJMLCBBTExfTE9HSUNfUkVTRVQpOwo+ICsJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwo+ ICsKPiArCWl0NjUwNS0+cmV2aXNpb24gPSBpdDY1MDVfcmVhZChpdDY1MDUsIFJFR19JQ19WRVIp Owo+ICsKPiArCWlmIChpdDY1MDUtPnJldmlzaW9uIDwgMCkKPiArCQlyZXR1cm4gZmFsc2U7Cj4g Kwo+ICsJcmV0dXJuIHRydWU7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGl0NjUwNV9hdXhfb3Bf ZmluaXNoZWQoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpbnQgcmVnMmIgPSBpdDY1 MDVfcmVhZChpdDY1MDUsIFJFR19BVVhfQ01EX1JFUSk7Cj4gKwo+ICsJaWYgKHJlZzJiIDwgMCkK PiArCQlyZXR1cm4gZmFsc2U7Cj4gKwo+ICsJcmV0dXJuIChyZWcyYiAmIEFVWF9CVVNZKSA9PSAw Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGl0NjUwNV9hdXhfd2FpdChzdHJ1Y3QgaXQ2NTA1ICpp dDY1MDUpCj4gK3sKPiArCWludCBzdGF0dXM7Cj4gKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Cj4g KwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCj4gKwl0aW1l b3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQVVYX1dBSVRfVElNRU9VVF9NUykgKyAx Owo+ICsKPiArCXdoaWxlICghaXQ2NTA1X2F1eF9vcF9maW5pc2hlZChpdDY1MDUpKSB7Cj4gKwkJ aWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKPiArCQkJRFJNX0RFVl9FUlJPUihk ZXYsICJUaW1lZCBvdXQgd2FpdGluZyBBVVggdG8gZmluaXNoIik7Cj4gKwkJCXJldHVybiAtRVRJ TUVET1VUOwo+ICsJCX0KPiArCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Cj4gKwl9Cj4gKwo+ ICsJc3RhdHVzID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBSRUdfQVVYX0VSUk9SX1NUUyk7Cj4gKwlp ZiAoc3RhdHVzIDwgMCkgewo+ICsJCURSTV9ERVZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIHJlYWQg QVVYIGNoYW5uZWw6ICVkIiwgc3RhdHVzKTsKPiArCQlyZXR1cm4gc3RhdHVzOwo+ICsJfQo+ICsK PiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3NpemVfdCBpdDY1MDVfYXV4X29wZXJh dGlvbihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsCj4gKwkJCQkgICAgZW51bSBhdXhfY21kX3R5cGUg Y21kLAo+ICsJCQkJICAgIHVuc2lnbmVkIGludCBhZGRyZXNzLCB1OCAqYnVmZmVyLAo+ICsJCQkJ ICAgIHNpemVfdCBzaXplLCBlbnVtIGF1eF9jbWRfcmVwbHkgKnJlcGx5KQo+ICt7Cj4gKwlpbnQg aSwgc3RhdHVzOwo+ICsJYm9vbCBhdXhfd3JpdGVfY2hlY2sgPSBmYWxzZTsKPiArCj4gKwlpZiAo IWl0NjUwNV9nZXRfc2lua19ocGRfc3RhdHVzKGl0NjUwNSkpCj4gKwkJcmV0dXJuIC1FSU87Cj4g Kwo+ICsJLyogc2V0IEFVWCB1c2VyIG1vZGUgKi8KPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUs IFJFR19BVVhfQ1RSTCwgQVVYX1VTRVJfTU9ERSwgQVVYX1VTRVJfTU9ERSk7Cj4gKwo+ICthdXhf b3Bfc3RhcnQ6Cj4gKwo+ICsJaWYgKGNtZCA9PSBDTURfQVVYX0kyQ19FRElEX1JFQUQpIHsKPiAr CQkvKiBEUCBBVVggRURJRCBGSUZPIGhhcyBtYXhpbXVtIGxlbmd0aCBvZiBuIGJ5dGVzLiAqLwo+ ICsJCXNpemUgPSBtaW5fdChzaXplX3QsIHNpemUsIEFVWF9GSUZPX01BWF9TSVpFKTsKPiArCQkv KiBFbmFibGUgQVVYIEZJRk8gcmVhZCBiYWNrIGFuZCBjbGVhciBGSUZPICovCj4gKwkJaXQ2NTA1 X3NldF9iaXRzKGl0NjUwNSwgUkVHX0FVWF9DVFJMLAo+ICsJCQkJQVVYX0VOX0ZJRk9fUkVBRCB8 IENMUl9FRElEX0ZJRk8sCj4gKwkJCQlBVVhfRU5fRklGT19SRUFEIHwgQ0xSX0VESURfRklGTyk7 Cj4gKwo+ICsJCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19BVVhfQ1RSTCwKPiArCQkJCUFV WF9FTl9GSUZPX1JFQUQgfCBDTFJfRURJRF9GSUZPLAo+ICsJCQkJQVVYX0VOX0ZJRk9fUkVBRCk7 Cj4gKwl9IGVsc2Ugewo+ICsJCS8qIFRoZSBEUCBBVVggdHJhbnNtaXQgYnVmZmVyIGhhcyA0IGJ5 dGVzLiAqLwo+ICsJCXNpemUgPSBtaW5fdChzaXplX3QsIHNpemUsIDQpOwo+ICsJCWl0NjUwNV9z ZXRfYml0cyhpdDY1MDUsIFJFR19BVVhfQ1RSTCwgQVVYX05PX1NFR01FTlRfV1IsCj4gKwkJCQlB VVhfTk9fU0VHTUVOVF9XUik7Cj4gKwl9Cj4gKwo+ICsJLyogU3RhcnQgQWRkcmVzc1s3OjBdICov Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVYX0FEUl8wXzcsIChhZGRyZXNzID4+IDAp ICYgMHhGRik7Cj4gKwkvKiBTdGFydCBBZGRyZXNzWzE1OjhdICovCj4gKwlpdDY1MDVfd3JpdGUo aXQ2NTA1LCBSRUdfQVVYX0FEUl84XzE1LCAoYWRkcmVzcyA+PiA4KSAmIDB4RkYpOwo+ICsJLyog V3JpdGVOdW1bMzowXStTdGFydEFkclsxOToxNl0gKi8KPiArCWl0NjUwNV93cml0ZShpdDY1MDUs IFJFR19BVVhfQURSXzE2XzE5LAo+ICsJCSAgICAgKChhZGRyZXNzID4+IDE2KSAmIDB4MEYpIHwg KChzaXplIC0gMSkgPDwgNCkpOwo+ICsKPiArCWlmIChjbWQgPT0gQ01EX0FVWF9OQVRJVkVfV1JJ VEUpCj4gKwkJcmVnbWFwX2J1bGtfd3JpdGUoaXQ2NTA1LT5yZWdtYXAsIFJFR19BVVhfT1VUX0RB VEEwLCBidWZmZXIsCj4gKwkJCQkgIHNpemUpOwo+ICsKPiArCS8qIEF1eCBGaXJlICovCj4gKwlp dDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVYX0NNRF9SRVEsIGNtZCk7Cj4gKwo+ICsJc3RhdHVz ID0gaXQ2NTA1X2F1eF93YWl0KGl0NjUwNSk7Cj4gKwlpZiAoc3RhdHVzIDwgMCkKPiArCQlnb3Rv IGF1eF9vcF9lcnI7Cj4gKwo+ICsJc3RhdHVzID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBSRUdfQVVY X0VSUk9SX1NUUyk7Cj4gKwlpZiAoc3RhdHVzIDwgMCkKPiArCQlnb3RvIGF1eF9vcF9lcnI7Cj4g Kwo+ICsJc3dpdGNoICgoc3RhdHVzID4+IDYpICYgMHgzKSB7Cj4gKwljYXNlIDA6Cj4gKwkJKnJl cGx5ID0gUkVQTFlfQUNLOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSAxOgo+ICsJCSpyZXBseSA9IFJF UExZX0RFRkVSOwo+ICsJCXN0YXR1cyA9IC1FQUdBSU47Cj4gKwkJZ290byBhdXhfb3BfZXJyOwo+ ICsJY2FzZSAyOgo+ICsJCSpyZXBseSA9IFJFUExZX05BQ0s7Cj4gKwkJc3RhdHVzID0gLUVJTzsK PiArCQlnb3RvIGF1eF9vcF9lcnI7Cj4gKwljYXNlIDM6Cj4gKwkJc3RhdHVzID0gLUVUSU1FRE9V VDsKPiArCQlnb3RvIGF1eF9vcF9lcnI7Cj4gKwl9Cj4gKwo+ICsJLyogUmVhZCBiYWNrIE5hdGl2 ZSBXcml0ZSBkYXRhICovCj4gKwlpZiAoY21kID09IENNRF9BVVhfTkFUSVZFX1dSSVRFKSB7Cj4g KwkJYXV4X3dyaXRlX2NoZWNrID0gdHJ1ZTsKPiArCQljbWQgPSBDTURfQVVYX05BVElWRV9SRUFE Owo+ICsJCWdvdG8gYXV4X29wX3N0YXJ0Owo+ICsJfQo+ICsKPiArCWlmIChjbWQgPT0gQ01EX0FV WF9JMkNfRURJRF9SRUFEKSB7Cj4gKwkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewo+ICsJ CQlzdGF0dXMgPSBpdDY1MDVfcmVhZChpdDY1MDUsIFJFR19BVVhfREFUQV9GSUZPKTsKPiArCQkJ aWYgKHN0YXR1cyA8IDApCj4gKwkJCQlnb3RvIGF1eF9vcF9lcnI7Cj4gKwkJCWJ1ZmZlcltpXSA9 IHN0YXR1czsKPiArCQl9Cj4gKwl9IGVsc2Ugewo+ICsJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBp KyspIHsKPiArCQkJc3RhdHVzID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBSRUdfQVVYX0RBVEFfMF83 ICsgaSk7Cj4gKwkJCWlmIChzdGF0dXMgPCAwKQo+ICsJCQkJZ290byBhdXhfb3BfZXJyOwo+ICsK PiArCQkJaWYgKGF1eF93cml0ZV9jaGVjayAmJiBidWZmZXJbc2l6ZSAtIDEgLSBpXSAhPSBzdGF0 dXMpCj4gKwkJCQlicmVhazsKPiArCj4gKwkJCWJ1ZmZlcltzaXplIC0gMSAtIGldID0gc3RhdHVz Owo+ICsJCX0KPiArCX0KPiArCj4gKwlzdGF0dXMgPSBpOwo+ICsKPiArYXV4X29wX2VycjoKPiAr Cj4gKwlpZiAoY21kID09IENNRF9BVVhfSTJDX0VESURfUkVBRCkgewo+ICsJCS8qY2xlYXIgQVVY IEZJRk8gKi8KPiArCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfQVVYX0NUUkwsCj4gKwkJ CQlBVVhfRU5fRklGT19SRUFEIHwgQ0xSX0VESURfRklGTywKPiArCQkJCUFVWF9FTl9GSUZPX1JF QUQgfCBDTFJfRURJRF9GSUZPKTsKPiArCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfQVVY X0NUUkwsCj4gKwkJCQlBVVhfRU5fRklGT19SRUFEIHwgQ0xSX0VESURfRklGTywgMHgwMCk7Cj4g Kwl9Cj4gKwo+ICsJLyogTGVhdmUgQVVYIHVzZXIgbW9kZSAqLwo+ICsJaXQ2NTA1X3NldF9iaXRz KGl0NjUwNSwgUkVHX0FVWF9DVFJMLCBBVVhfVVNFUl9NT0RFLCAwKTsKPiArCj4gKwlyZXR1cm4g c3RhdHVzOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3NpemVfdCBpdDY1MDVfYXV4X2RvX3RyYW5zZmVy KHN0cnVjdCBpdDY1MDUgKml0NjUwNSwKPiArCQkJCSAgICAgIGVudW0gYXV4X2NtZF90eXBlIGNt ZCwKPiArCQkJCSAgICAgIHVuc2lnbmVkIGludCBhZGRyZXNzLCB1OCAqYnVmZmVyLAo+ICsJCQkJ ICAgICAgc2l6ZV90IHNpemUsIGVudW0gYXV4X2NtZF9yZXBseSAqcmVwbHkpCj4gK3sKPiArCWlu dCBpLCByZXQsIHJldF9zaXplID0gMCwgcmVxdWVzdF9zaXplOwo+ICsKPiArCW11dGV4X2xvY2so Jml0NjUwNS0+YXV4X2xvY2spOwo+ICsJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgewo+ ICsJCXJlcXVlc3Rfc2l6ZSA9IG1pbigoaW50KXNpemUgLSBpLCA0KTsKPiArCQlyZXQgPSBpdDY1 MDVfYXV4X29wZXJhdGlvbihpdDY1MDUsIGNtZCwgYWRkcmVzcyArIGksCj4gKwkJCQkJICAgYnVm ZmVyICsgaSwgcmVxdWVzdF9zaXplLCByZXBseSk7Cj4gKwkJaWYgKHJldCA8IDApIHsKPiArCQkJ cmV0X3NpemUgPSByZXQ7Cj4gKwkJCWdvdG8gYXV4X29wX2VycjsKPiArCQl9Cj4gKwo+ICsJCXJl dF9zaXplICs9ICByZXQ7Cj4gKwl9Cj4gK2F1eF9vcF9lcnI6Cj4gKwo+ICsJbXV0ZXhfdW5sb2Nr KCZpdDY1MDUtPmF1eF9sb2NrKTsKPiArCXJldHVybiByZXRfc2l6ZTsKPiArfQo+ICsKPiArc3Rh dGljIHNzaXplX3QgaXQ2NTA1X2F1eF90cmFuc2ZlcihzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LAo+ ICsJCQkJICAgc3RydWN0IGRybV9kcF9hdXhfbXNnICptc2cpCj4gK3sKPiArCXN0cnVjdCBpdDY1 MDUgKml0NjUwNSA9IGNvbnRhaW5lcl9vZihhdXgsIHN0cnVjdCBpdDY1MDUsIGF1eCk7Cj4gKwl1 OCBjbWQ7Cj4gKwlib29sIGlzX2kyYyA9ICEobXNnLT5yZXF1ZXN0ICYgRFBfQVVYX05BVElWRV9X UklURSk7Cj4gKwlpbnQgcmV0Owo+ICsJZW51bSBhdXhfY21kX3JlcGx5IHJlcGx5Owo+ICsKPiAr CS8qIElUNjUwNSBkb2Vzbid0IHN1cHBvcnQgYXJiaXRyYXJ5IEkyQyByZWFkIC8gd3JpdGUuICov Cj4gKwlpZiAoaXNfaTJjKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCXN3aXRjaCAobXNn LT5yZXF1ZXN0KSB7Cj4gKwljYXNlIERQX0FVWF9OQVRJVkVfUkVBRDoKPiArCQljbWQgPSBDTURf QVVYX05BVElWRV9SRUFEOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBEUF9BVVhfTkFUSVZFX1dSSVRF Ogo+ICsJCWNtZCA9IENNRF9BVVhfTkFUSVZFX1dSSVRFOwo+ICsJCWJyZWFrOwo+ICsJZGVmYXVs dDoKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlyZXQgPSBpdDY1MDVfYXV4X2Rv X3RyYW5zZmVyKGl0NjUwNSwgY21kLCBtc2ctPmFkZHJlc3MsIG1zZy0+YnVmZmVyLAo+ICsJCQkJ ICAgICBtc2ctPnNpemUsICZyZXBseSk7Cj4gKwlpZiAocmV0IDwgMCkKPiArCQlyZXR1cm4gcmV0 Owo+ICsKPiArCXN3aXRjaCAocmVwbHkpIHsKPiArCWNhc2UgUkVQTFlfQUNLOgo+ICsJCW1zZy0+ cmVwbHkgPSBEUF9BVVhfTkFUSVZFX1JFUExZX0FDSzsKPiArCQlicmVhazsKPiArCWNhc2UgUkVQ TFlfTkFDSzoKPiArCQltc2ctPnJlcGx5ID0gRFBfQVVYX05BVElWRV9SRVBMWV9OQUNLOwo+ICsJ CWJyZWFrOwo+ICsJY2FzZSBSRVBMWV9ERUZFUjoKPiArCQltc2ctPnJlcGx5ID0gRFBfQVVYX05B VElWRV9SRVBMWV9ERUZFUjsKPiArCQlicmVhazsKPiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGl0NjUwNV9nZXRfZWRpZF9ibG9jayh2b2lkICpkYXRhLCB1 OCAqYnVmLCB1bnNpZ25lZCBpbnQgYmxvY2ssCj4gKwkJCQkgc2l6ZV90IGxlbikKPiArewo+ICsJ c3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gZGF0YTsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZp dDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsJZW51bSBhdXhfY21kX3JlcGx5IHJlcGx5Owo+ICsJaW50 IG9mZnNldCwgcmV0LCBhdXhfcmV0cnkgPSAxMDA7Cj4gKwo+ICsJaXQ2NTA1X2F1eF9yZXNldChp dDY1MDUpOwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiYmxvY2sgbnVtYmVyID0gJWQi LCBibG9jayk7Cj4gKwo+ICsJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBFRElEX0xFTkdUSDsp IHsKPiArCQlyZXQgPSBpdDY1MDVfYXV4X2RvX3RyYW5zZmVyKGl0NjUwNSwgQ01EX0FVWF9JMkNf RURJRF9SRUFELAo+ICsJCQkJCSAgICAgYmxvY2sgKiBFRElEX0xFTkdUSCArIG9mZnNldCwKPiAr CQkJCQkgICAgIGJ1ZiArIG9mZnNldCwgOCwgJnJlcGx5KTsKPiArCj4gKwkJaWYgKHJldCA8IDAg JiYgcmV0ICE9IC1FQUdBSU4pCj4gKwkJCXJldHVybiByZXQ7Cj4gKwo+ICsJCXN3aXRjaCAocmVw bHkpIHsKPiArCQljYXNlIFJFUExZX0FDSzoKPiArCQkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2 LCAiWzB4JTAyeF06ICU4cGgiLCBvZmZzZXQsCj4gKwkJCQkJICAgICBidWYgKyBvZmZzZXQpOwo+ ICsJCQlvZmZzZXQgKz0gODsKPiArCQkJYXV4X3JldHJ5ID0gMTAwOwo+ICsJCQlicmVhazsKPiAr CQljYXNlIFJFUExZX05BQ0s6Cj4gKwkJCXJldHVybiAtRUlPOwo+ICsJCWNhc2UgUkVQTFlfREVG RVI6Cj4gKwkJCW1zbGVlcCgyMCk7Cj4gKwkJCWlmICghKC0tYXV4X3JldHJ5KSkKPiArCQkJCXJl dHVybiAtRUlPOwo+ICsJCX0KPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgaXQ2NTA1X3ZhcmlhYmxlX2NvbmZpZyhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4g K3sKPiArCWl0NjUwNS0+bGlua19yYXRlX2J3X2NvZGUgPSBIQlI7Cj4gKwlpdDY1MDUtPmxhbmVf Y291bnQgPSBNQVhfTEFORV9DT1VOVDsKPiArCWl0NjUwNS0+bGlua19zdGF0ZSA9IExJTktfSURM RTsKPiArCWl0NjUwNS0+YXV0b190cmFpbl9yZXRyeSA9IEFVVE9fVFJBSU5fUkVUUlk7Cj4gKwlp dDY1MDUtPmF1ZGlvLnNlbGVjdCA9IEFVRElPX1NFTEVDVDsKPiArCWl0NjUwNS0+YXVkaW8uc2Ft cGxlX3JhdGUgPSBBVURJT19TQU1QTEVfUkFURTsKPiArCWl0NjUwNS0+YXVkaW8uY2hhbm5lbF9j b3VudCA9IEFVRElPX0NIQU5ORUxfQ09VTlQ7Cj4gKwlpdDY1MDUtPmF1ZGlvLnR5cGUgPSBBVURJ T19UWVBFOwo+ICsJaXQ2NTA1LT5hdWRpby5pMnNfaW5wdXRfZm9ybWF0ID0gSTJTX0lOUFVUX0ZP Uk1BVDsKPiArCWl0NjUwNS0+YXVkaW8uaTJzX2p1c3RpZmllZCA9IEkyU19KVVNUSUZJRUQ7Cj4g KwlpdDY1MDUtPmF1ZGlvLmkyc19kYXRhX2RlbGF5ID0gSTJTX0RBVEFfREVMQVk7Cj4gKwlpdDY1 MDUtPmF1ZGlvLmkyc193c19jaGFubmVsID0gSTJTX1dTX0NIQU5ORUw7Cj4gKwlpdDY1MDUtPmF1 ZGlvLmkyc19kYXRhX3NlcXVlbmNlID0gSTJTX0RBVEFfU0VRVUVOQ0U7Cj4gKwlpdDY1MDUtPmF1 ZGlvLndvcmRfbGVuZ3RoID0gQVVESU9fV09SRF9MRU5HVEg7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgaXQ2NTA1X3NlbmRfdmlkZW9faW5mb2ZyYW1lKHN0cnVjdCBpdDY1MDUgKml0NjUwNSwKPiAr CQkJCSAgICAgICBzdHJ1Y3QgaGRtaV9hdmlfaW5mb2ZyYW1lICpmcmFtZSkKPiArewo+ICsJdTgg YnVmZmVyW0hETUlfSU5GT0ZSQU1FX0hFQURFUl9TSVpFICsgSERNSV9BVklfSU5GT0ZSQU1FX1NJ WkVdOwo+ICsJaW50IGVycjsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVu dC0+ZGV2Owo+ICsKPiArCWVyciA9IGhkbWlfYXZpX2luZm9mcmFtZV9wYWNrKGZyYW1lLCBidWZm ZXIsIHNpemVvZihidWZmZXIpKTsKPiArCWlmIChlcnIgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJP UihkZXYsICJGYWlsZWQgdG8gcGFjayBBVkkgaW5mb2ZyYW1lOiAlZCIsIGVycik7Cj4gKwkJcmV0 dXJuIGVycjsKPiArCX0KPiArCj4gKwllcnIgPSBpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdf SU5GT0ZSQU1FX0NUUkwsIEVOX0FWSV9QS1QsIDB4MDApOwo+ICsJaWYgKGVycikKPiArCQlyZXR1 cm4gZXJyOwo+ICsKPiArCWVyciA9IHJlZ21hcF9idWxrX3dyaXRlKGl0NjUwNS0+cmVnbWFwLCBS RUdfQVZJX0lORk9fREIxLAo+ICsJCQkJYnVmZmVyICsgSERNSV9JTkZPRlJBTUVfSEVBREVSX1NJ WkUsCj4gKwkJCQlmcmFtZS0+bGVuZ3RoKTsKPiArCWlmIChlcnIpCj4gKwkJcmV0dXJuIGVycjsK PiArCj4gKwllcnIgPSBpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfSU5GT0ZSQU1FX0NUUkws IEVOX0FWSV9QS1QsCj4gKwkJCSAgICAgIEVOX0FWSV9QS1QpOwo+ICsJaWYgKGVycikKPiArCQly ZXR1cm4gZXJyOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1 MDVfZ2V0X2V4dGNvbl9wcm9wZXJ0eShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWlu dCBlcnI7Cj4gKwl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgcHJvcGVydHk7Cj4gKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCj4gKwlpZiAoaXQ2NTA1 LT5leHRjb24gJiYgIWl0NjUwNS0+bGFuZV9zd2FwX2Rpc2FibGVkKSB7Cj4gKwkJZXJyID0gZXh0 Y29uX2dldF9wcm9wZXJ0eShpdDY1MDUtPmV4dGNvbiwgRVhUQ09OX0RJU1BfRFAsCj4gKwkJCQkJ ICBFWFRDT05fUFJPUF9VU0JfVFlQRUNfUE9MQVJJVFksCj4gKwkJCQkJICAmcHJvcGVydHkpOwo+ ICsJCWlmIChlcnIpIHsKPiArCQkJRFJNX0RFVl9FUlJPUihkZXYsICJnZXQgcHJvcGVydHkgZmFp bCEiKTsKPiArCQkJcmV0dXJuOwo+ICsJCX0KPiArCQlpdDY1MDUtPmxhbmVfc3dhcCA9IHByb3Bl cnR5LmludHZhbDsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2Nsa19waGFz ZV9hZGp1c3RtZW50KHN0cnVjdCBpdDY1MDUgKml0NjUwNSwKPiArCQkJCQljb25zdCBzdHJ1Y3Qg ZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiArewo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwg UkVHX0NMS19DVFJMMCwgTV9QQ0xLX0RFTEFZLAo+ICsJCW1vZGUtPmNsb2NrIDwgQURKVVNUX1BI QVNFX1RIUkVTSE9MRCA/IFBJWEVMX0NMS19ERUxBWSA6IDApOwo+ICsJaXQ2NTA1X3NldF9iaXRz KGl0NjUwNSwgUkVHX0RBVEFfQ1RSTDAsIFZJREVPX0xBVENIX0VER0UsCj4gKwkJCVBJWEVMX0NM S19JTlZFUlNFIDw8IDQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfaW5pdChzdHJ1 Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19CQU5L X1NFTCwgMHgwMCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVYX09QVCwgQVVYX0FV VE9fUlNUIHwgQVVYX0ZJWF9GUkVRKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19BVVhf Q1RSTCwgQVVYX05PX1NFR01FTlRfV1IpOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0hE Q1BfQ1RSTDIsIEhEQ1BfQU5fU0VMIHwgSERDUF9IV19IUERJUlFfQUNUKTsKPiArCWl0NjUwNV93 cml0ZShpdDY1MDUsIFJFR19WSURfQlVTX0NUUkwwLCBJTl9ERFIgfCBERFJfQ0QpOwo+ICsJaXQ2 NTA1X3dyaXRlKGl0NjUwNSwgUkVHX1ZJRF9CVVNfQ1RSTDEsIDB4MDEpOwo+ICsJaXQ2NTA1X3dy aXRlKGl0NjUwNSwgUkVHX0FVRElPX0NUUkwwLCBBVURJT18xNkJfQk9VTkQpOwo+ICsKPiArCS8q IGNoaXAgaW50ZXJuYWwgc2V0dGluZywgZG9uJ3QgbW9kaWZ5ICovCj4gKwlpdDY1MDVfd3JpdGUo aXQ2NTA1LCBSRUdfSFBEX0lSUV9USU1FLCAweEY1KTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUs IFJFR19BVVhfREVCVUdfTU9ERSwgMHg0RCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdf QVVYX09QVDIsIDB4MTcpOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0hEQ1BfT1BULCAw eDYwKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19EQVRBX01VVEVfQ1RSTCwKPiArCQkg ICAgIEVOX1ZJRF9NVVRFIHwgRU5fQVVEX01VVEUgfCBFTkFCTEVfQVVUT19WSURFT19GSUZPX1JF U0VUKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19USU1FX1NUTVBfQ1RSTCwKPiArCQkg ICAgIEVOX1NTQ19HQVQgfCBFTl9FTkhBTkNFX1ZJRF9TVE1QIHwgRU5fRU5IQU5DRV9BVURfU1RN UCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfSU5GT0ZSQU1FX0NUUkwsIDB4MDApOwo+ ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0JBTktfU0VMLCAweDAxKTsKPiArCWl0NjUwNV93 cml0ZShpdDY1MDUsIFJFR19EUlZfMF9EQl84MDBfTVYsCj4gKwkJICAgICBhZmVfc2V0dGluZ190 YWJsZVtpdDY1MDUtPmFmZV9zZXR0aW5nXVswXSk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBS RUdfUFJFXzBfREJfODAwX01WLAo+ICsJCSAgICAgYWZlX3NldHRpbmdfdGFibGVbaXQ2NTA1LT5h ZmVfc2V0dGluZ11bMV0pOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX1BSRV8zUDVfREJf ODAwX01WLAo+ICsJCSAgICAgYWZlX3NldHRpbmdfdGFibGVbaXQ2NTA1LT5hZmVfc2V0dGluZ11b Ml0pOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX1NTQ19DVFJMMCwgMHg5RSk7Cj4gKwlp dDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfU1NDX0NUUkwxLCAweDFDKTsKPiArCWl0NjUwNV93cml0 ZShpdDY1MDUsIFJFR19TU0NfQ1RSTDIsIDB4NDIpOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwg UkVHX0JBTktfU0VMLCAweDAwKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X3ZpZGVv X2Rpc2FibGUoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfc2V0X2JpdHMo aXQ2NTA1LCBSRUdfREFUQV9NVVRFX0NUUkwsIEVOX1ZJRF9NVVRFLCBFTl9WSURfTVVURSk7Cj4g KwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfSU5GT0ZSQU1FX0NUUkwsIEVOX1ZJRF9DVFJM X1BLVCwgMHgwMCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfUkVTRVRfQ1RSTCwg VklERU9fUkVTRVQsIFZJREVPX1JFU0VUKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1 X3ZpZGVvX3Jlc2V0KHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJaXQ2NTA1X3NldF9i aXRzKGl0NjUwNSwgUkVHX0RBVEFfTVVURV9DVFJMLCBFTl9WSURfTVVURSwgRU5fVklEX01VVEUp Owo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0lORk9GUkFNRV9DVFJMLCBFTl9WSURf Q1RSTF9QS1QsIDB4MDApOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1JFU0VUX0NU UkwsIFZJREVPX1JFU0VULCBWSURFT19SRVNFVCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1 LCBSRUdfNTAxX0ZJRk9fQ1RSTCwgUlNUXzUwMV9GSUZPLCBSU1RfNTAxX0ZJRk8pOwo+ICsJaXQ2 NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHXzUwMV9GSUZPX0NUUkwsIFJTVF81MDFfRklGTywgMHgw MCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfUkVTRVRfQ1RSTCwgVklERU9fUkVT RVQsIDB4MDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfdXBkYXRlX3ZpZGVvX3By YXJtZXRlcihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsCj4gKwkJCQkJICBjb25zdCBzdHJ1Y3QgZHJt X2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiArewo+ICsJaXQ2NTA1X2Nsa19waGFzZV9hZGp1c3RtZW50 KGl0NjUwNSwgbW9kZSk7Cj4gKwlpdDY1MDVfdmlkZW9fZGlzYWJsZShpdDY1MDUpOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgYm9vbCBpdDY1MDVfYXVkaW9faW5wdXQoc3RydWN0IGl0NjUwNSAqaXQ2NTA1 KQo+ICt7Cj4gKwlpbnQgcmVnMDUsIHJlZ2JlOwo+ICsKPiArCXJlZzA1ID0gaXQ2NTA1X3JlYWQo aXQ2NTA1LCBSRUdfUkVTRVRfQ1RSTCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdf UkVTRVRfQ1RSTCwgQVVESU9fUkVTRVQsIDB4MDApOwo+ICsJdXNsZWVwX3JhbmdlKDMwMDAsIDQw MDApOwo+ICsJcmVnYmUgPSBpdDY1MDVfcmVhZChpdDY1MDUsIFJFR19BVURJT19JTlBVVF9GUkVR KTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19SRVNFVF9DVFJMLCByZWcwNSk7Cj4gKwo+ ICsJcmV0dXJuIHJlZ2JlICE9IDB4RkY7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9z ZXR1cF9hdWRpb19jaGFubmVsX3N0YXR1cyhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiAr CWVudW0gaXQ2NTA1X2F1ZGlvX3NhbXBsZV9yYXRlIHNhbXBsZV9yYXRlID0gaXQ2NTA1LT5hdWRp by5zYW1wbGVfcmF0ZTsKPiArCXU4IGF1ZGlvX3dvcmRfbGVuZ3RoX21hcFtdID0gezB4MDIsIDB4 MDQsIDB4MDMsIDB4MEJ9Owo+ICsKPiArCS8qIENoYW5uZWwgU3RhdHVzICovCj4gKwlpdDY1MDVf d3JpdGUoaXQ2NTA1LCBSRUdfSUVDOTU4X1NUUzAsIGl0NjUwNS0+YXVkaW8udHlwZSA8PCAxKTsK PiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19JRUM5NThfU1RTMSwgMHgwMCk7Cj4gKwlpdDY1 MDVfd3JpdGUoaXQ2NTA1LCBSRUdfSUVDOTU4X1NUUzIsIDB4MDApOwo+ICsJaXQ2NTA1X3dyaXRl KGl0NjUwNSwgUkVHX0lFQzk1OF9TVFMzLCBzYW1wbGVfcmF0ZSk7Cj4gKwlpdDY1MDVfd3JpdGUo aXQ2NTA1LCBSRUdfSUVDOTU4X1NUUzQsICh+c2FtcGxlX3JhdGUgPDwgNCkgfAo+ICsJCSAgICAg YXVkaW9fd29yZF9sZW5ndGhfbWFwW2l0NjUwNS0+YXVkaW8ud29yZF9sZW5ndGhdKTsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X3NldHVwX2F1ZGlvX2Zvcm1hdChzdHJ1Y3QgaXQ2NTA1 ICppdDY1MDUpCj4gK3sKPiArCS8qIEkyUyBNT0RFICovCj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1 LCBSRUdfQVVESU9fRk1ULAo+ICsJCSAgICAgKGl0NjUwNS0+YXVkaW8ud29yZF9sZW5ndGggPDwg NSkgfAo+ICsJCSAgICAgKGl0NjUwNS0+YXVkaW8uaTJzX2RhdGFfc2VxdWVuY2UgPDwgNCkgfAo+ ICsJCSAgICAgKGl0NjUwNS0+YXVkaW8uaTJzX3dzX2NoYW5uZWwgPDwgMykgfAo+ICsJCSAgICAg KGl0NjUwNS0+YXVkaW8uaTJzX2RhdGFfZGVsYXkgPDwgMikgfAo+ICsJCSAgICAgKGl0NjUwNS0+ YXVkaW8uaTJzX2p1c3RpZmllZCA8PCAxKSB8Cj4gKwkJICAgICBpdDY1MDUtPmF1ZGlvLmkyc19p bnB1dF9mb3JtYXQpOwo+ICsJaWYgKGl0NjUwNS0+YXVkaW8uc2VsZWN0ID09IFNQRElGKSB7Cj4g KwkJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0FVRElPX0ZJRk9fU0VMLCAweDAwKTsKPiArCQkv KiAweDMwID0gMTI4KkZTICovCj4gKwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0FVWF9P UFQsIDB4RjAsIDB4MzApOwo+ICsJfSBlbHNlIHsKPiArCQlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBS RUdfQVVESU9fRklGT19TRUwsIDB4RTQpOwo+ICsJfQo+ICsKPiArCWl0NjUwNV93cml0ZShpdDY1 MDUsIFJFR19BVURJT19DVFJMMCwgMHgyMCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdf QVVESU9fQ1RSTDEsIDB4MDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfZW5hYmxl X2F1ZGlvX3NvdXJjZShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCXVuc2lnbmVkIGlu dCBhdWRpb19zb3VyY2VfY291bnQ7Cj4gKwo+ICsJYXVkaW9fc291cmNlX2NvdW50ID0gQklUKERJ Vl9ST1VORF9VUChpdDY1MDUtPmF1ZGlvLmNoYW5uZWxfY291bnQsIDIpKQo+ICsJCQkJIC0gMTsK PiArCj4gKwlhdWRpb19zb3VyY2VfY291bnQgfD0gaXQ2NTA1LT5hdWRpby5zZWxlY3QgPDwgNDsK PiArCj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVESU9fU1JDX0NUUkwsIGF1ZGlvX3Nv dXJjZV9jb3VudCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9lbmFibGVfYXVkaW9f aW5mb2ZyYW1lKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJc3RydWN0IGRldmljZSAq ZGV2ID0gJml0NjUwNS0+Y2xpZW50LT5kZXY7Cj4gKwl1OCBhdWRpb19pbmZvX2NhW10gPSB7IDB4 MDAsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDcsIDB4MEIsIDB4MEYsIDB4MUYgfTsKPiArCj4gKwlE Uk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJpbmZvZnJhbWUgY2hhbm5lbF9hbGxvY2F0aW9uOjB4 JTAyeCIsCj4gKwkJCSAgICAgYXVkaW9faW5mb19jYVtpdDY1MDUtPmF1ZGlvLmNoYW5uZWxfY291 bnQgLSAxXSk7Cj4gKwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0FVRF9JTkZPRlJBTV9E QjEsIGl0NjUwNS0+YXVkaW8uY2hhbm5lbF9jb3VudAo+ICsJCSAgICAgLSAxKTsKPiArCWl0NjUw NV93cml0ZShpdDY1MDUsIFJFR19BVURfSU5GT0ZSQU1fREIyLCAweDAwKTsKPiArCWl0NjUwNV93 cml0ZShpdDY1MDUsIFJFR19BVURfSU5GT0ZSQU1fREIzLAo+ICsJCSAgICAgYXVkaW9faW5mb19j YVtpdDY1MDUtPmF1ZGlvLmNoYW5uZWxfY291bnQgLSAxXSk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2 NTA1LCBSRUdfQVVEX0lORk9GUkFNX0RCNCwgMHgwMCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1 LCBSRUdfQVVEX0lORk9GUkFNX1NVTSwgMHgwMCk7Cj4gKwo+ICsJLyogRW5hYmxlIEF1ZGlvIElu Zm9GcmFtZSAqLwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0lORk9GUkFNRV9DVFJM LCBFTl9BVURfQ1RSTF9QS1QsCj4gKwkJCUVOX0FVRF9DVFJMX1BLVCk7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIGl0NjUwNV9kaXNhYmxlX2F1ZGlvKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiAr ewo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RBVEFfTVVURV9DVFJMLCBFTl9BVURf TVVURSwgRU5fQVVEX01VVEUpOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0FVRElP X1NSQ19DVFJMLCBNX0FVRElPX0kyU19FTiwgMHgwMCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2 NTA1LCBSRUdfSU5GT0ZSQU1FX0NUUkwsIEVOX0FVRF9DVFJMX1BLVCwgMHgwMCk7Cj4gKwlpdDY1 MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfUkVTRVRfQ1RSTCwgQVVESU9fUkVTRVQsIEFVRElPX1JF U0VUKTsKPiArCWl0NjUwNS0+ZW5hYmxlX2F1ZGlvID0gZmFsc2U7Cj4gK30KPiArCj4gK3N0YXRp YyB2b2lkIGl0NjUwNV9lbmFibGVfYXVkaW8oc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4g KwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCWludCByZWdi ZTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJzdGFydCIpOwo+ICsJaXQ2NTA1 X2Rpc2FibGVfYXVkaW8oaXQ2NTA1KTsKPiArCj4gKwlpdDY1MDVfc2V0dXBfYXVkaW9fY2hhbm5l bF9zdGF0dXMoaXQ2NTA1KTsKPiArCWl0NjUwNV9zZXR1cF9hdWRpb19mb3JtYXQoaXQ2NTA1KTsK PiArCWl0NjUwNV9lbmFibGVfYXVkaW9fc291cmNlKGl0NjUwNSk7Cj4gKwlpdDY1MDVfZW5hYmxl X2F1ZGlvX2luZm9mcmFtZShpdDY1MDUpOwo+ICsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJF R19BVURJT19OXzBfNywgMHgwMCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVESU9f Tl84XzE1LCAweDgwKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19BVURJT19OXzE2XzIz LCAweDAwKTsKPiArCj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfQVVESU9fU1JDX0NU UkwsIEFVRElPX0ZJRk9fUkVTRVQsCj4gKwkJCUFVRElPX0ZJRk9fUkVTRVQpOwo+ICsJaXQ2NTA1 X3NldF9iaXRzKGl0NjUwNSwgUkVHX0FVRElPX1NSQ19DVFJMLCBBVURJT19GSUZPX1JFU0VULCAw eDAwKTsKPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19SRVNFVF9DVFJMLCBBVURJT19S RVNFVCwgMHgwMCk7Cj4gKwlyZWdiZSA9IGl0NjUwNV9yZWFkKGl0NjUwNSwgUkVHX0FVRElPX0lO UFVUX0ZSRVEpOwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAicmVnYmU6MHglMDJ4IGF1 ZGlvIGlucHV0IGZzOiAlZC4lZCBrSHoiLAo+ICsJCQkgICAgIHJlZ2JlLCA2NzUwIC8gcmVnYmUs IDY3NTAwICUgcmVnYmUpOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RBVEFfTVVU RV9DVFJMLCBFTl9BVURfTVVURSwgMHgwMCk7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGl0NjUw NV91c2Vfc3RlcF90cmFpbl9jaGVjayhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWlm IChpdDY1MDUtPmxpbmsucmV2aXNpb24gPj0gMHgxMikKPiArCQlyZXR1cm4gaXQ2NTA1LT5kcGNk W0RQX1RSQUlOSU5HX0FVWF9SRF9JTlRFUlZBTF0gPj0gMHgwMTsKPiArCj4gKwlyZXR1cm4gdHJ1 ZTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X3BhcnNlX2xpbmtfY2FwYWJpbGl0aWVz KHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0 NjUwNS0+Y2xpZW50LT5kZXY7Cj4gKwlzdHJ1Y3QgaXQ2NTA1X2RybV9kcF9saW5rICpsaW5rID0g Jml0NjUwNS0+bGluazsKPiArCWludCBiY2FwczsKPiArCj4gKwlpZiAoaXQ2NTA1LT5kcGNkWzBd ID09IDApIHsKPiArCQlpdDY1MDVfYXV4X29uKGl0NjUwNSk7Cj4gKwkJaXQ2NTA1X2dldF9kcGNk KGl0NjUwNSwgRFBfRFBDRF9SRVYsIGl0NjUwNS0+ZHBjZCwKPiArCQkJCUFSUkFZX1NJWkUoaXQ2 NTA1LT5kcGNkKSk7Cj4gKwl9Cj4gKwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiRFBD RCBSZXYuOiAlZC4lZCIsCj4gKwkJCSAgICAgbGluay0+cmV2aXNpb24gPj4gNCwgbGluay0+cmV2 aXNpb24gJiAweDBGKTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJTaW5rIG1h eCBsaW5rIHJhdGU6ICVkLiVkIEdicHMgcGVyIGxhbmUiLAo+ICsJCQkgICAgIGxpbmstPnJhdGUg LyAxMDAwMDAsIGxpbmstPnJhdGUgLyAxMDAwICUgMTAwKTsKPiArCj4gKwlpdDY1MDUtPmxpbmtf cmF0ZV9id19jb2RlID0gZHJtX2RwX2xpbmtfcmF0ZV90b19id19jb2RlKGxpbmstPnJhdGUpOwo+ ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAibGluayByYXRlIGJ3IGNvZGU6MHglMDJ4IiwK PiArCQkJICAgICBpdDY1MDUtPmxpbmtfcmF0ZV9id19jb2RlKTsKPiArCWl0NjUwNS0+bGlua19y YXRlX2J3X2NvZGUgPSBtaW4oKGludClpdDY1MDUtPmxpbmtfcmF0ZV9id19jb2RlLAo+ICsJCQkJ CU1BWF9MSU5LX1JBVEUpOwo+ICsKPiArCWl0NjUwNS0+bGFuZV9jb3VudCA9IGxpbmstPm51bV9s YW5lczsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIlNpbmsgc3VwcG9ydCAlZCBsYW5l cyB0cmFpbmluZyIsCj4gKwkJCSAgICAgaXQ2NTA1LT5sYW5lX2NvdW50KTsKPiArCWl0NjUwNS0+ bGFuZV9jb3VudCA9IG1pbigoaW50KWl0NjUwNS0+bGFuZV9jb3VudCwgTUFYX0xBTkVfQ09VTlQp Owo+ICsKPiArCWl0NjUwNS0+YnJhbmNoX2RldmljZSA9IGRybV9kcF9pc19icmFuY2goaXQ2NTA1 LT5kcGNkKTsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIlNpbmsgJXNicmFuY2ggZGV2 aWNlIiwKPiArCQkJICAgICBpdDY1MDUtPmJyYW5jaF9kZXZpY2UgPyAiIiA6ICJOb3QgIik7Cj4g Kwo+ICsJaXQ2NTA1LT5lbmFibGVfZW5oYW5jZWRfZnJhbWUgPSAhIWxpbmstPmNhcGFiaWxpdGll czsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIlNpbmsgJXNTdXBwb3J0IEVuaGFuY2Vk IEZyYW1pbmciLAo+ICsJCQkgICAgIGl0NjUwNS0+ZW5hYmxlX2VuaGFuY2VkX2ZyYW1lID8gIiIg OiAiTm90ICIpOwo+ICsKPiArCWl0NjUwNS0+ZW5hYmxlX3NzYyA9ICEhKGl0NjUwNS0+ZHBjZFtE UF9NQVhfRE9XTlNQUkVBRF0gJgo+ICsJCQkJRFBfTUFYX0RPV05TUFJFQURfMF81KTsKPiArCURS TV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIk1heGltdW0gRG93bi1TcHJlYWQ6ICVzLCAlc3N1cHBv cnQgU1NDISIsCj4gKwkJCSAgICAgaXQ2NTA1LT5lbmFibGVfc3NjID8gIjAuNSIgOiAiMCIsCj4g KwkJCSAgICAgaXQ2NTA1LT5lbmFibGVfc3NjID8gIiIgOiAiTm90ICIpOwo+ICsKPiArCWl0NjUw NS0+c3RlcF90cmFpbiA9IGl0NjUwNV91c2Vfc3RlcF90cmFpbl9jaGVjayhpdDY1MDUpOwo+ICsJ aWYgKGl0NjUwNS0+c3RlcF90cmFpbikKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJh dXRvIHRyYWluIGZhaWwsIHdpbGwgc3RlcCB0cmFpbiIpOwo+ICsKPiArCWJjYXBzID0gaXQ2NTA1 X2RwY2RfcmVhZChpdDY1MDUsIERQX0FVWF9IRENQX0JDQVBTKTsKPiArCURSTV9ERVZfREVCVUdf RFJJVkVSKGRldiwgImJjYXBzOjB4JTAyeCIsIGJjYXBzKTsKPiArCWlmIChiY2FwcyAmIERQX0JD QVBTX0hEQ1BfQ0FQQUJMRSkgewo+ICsJCWl0NjUwNS0+aXNfcmVwZWF0ZXIgPSAhIShiY2FwcyAm IERQX0JDQVBTX1JFUEVBVEVSX1BSRVNFTlQpOwo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRl diwgIlN1cHBvcnQgSERDUCEgRG93bnN0cmVhbSBpcyAlcyEiLAo+ICsJCQkJICAgICBpdDY1MDUt PmlzX3JlcGVhdGVyID8gInJlcGVhdGVyIiA6Cj4gKwkJCQkgICAgICJyZWNlaXZlciIpOwo+ICsJ fSBlbHNlIHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJTaW5rIG5vdCBzdXBwb3J0 IEhEQ1AhIik7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9zZXR1cF9zc2Mo c3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBS RUdfVFJBSU5fQ1RSTDAsIFNQUkVBRF9BTVBfNSwKPiArCQkJaXQ2NTA1LT5lbmFibGVfc3NjID8g U1BSRUFEX0FNUF81IDogMHgwMCk7Cj4gKwlpZiAoaXQ2NTA1LT5lbmFibGVfc3NjKSB7Cj4gKwkJ aXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0JBTktfU0VMLCAweDAxKTsKPiArCQlpdDY1MDVfd3Jp dGUoaXQ2NTA1LCBSRUdfU1NDX0NUUkwwLCAweDlFKTsKPiArCQlpdDY1MDVfd3JpdGUoaXQ2NTA1 LCBSRUdfU1NDX0NUUkwxLCAweDFDKTsKPiArCQlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfU1ND X0NUUkwyLCAweDQyKTsKPiArCQlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQkFOS19TRUwsIDB4 MDApOwo+ICsJCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19TUF9DVFJMMCwgMHgwNyk7Cj4gKwkJ aXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0lQX0NUUkwxLCAweDI5KTsKPiArCQlpdDY1MDVfd3Jp dGUoaXQ2NTA1LCBSRUdfSVBfQ1RSTDIsIDB4MDMpOwo+ICsJCS8qIFN0YW1wIEludGVycnVwdCBT dGVwICovCj4gKwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1RJTUVfU1RNUF9DVFJMLCBN X1NUQU1QX1NURVAsCj4gKwkJCQkweDEwKTsKPiArCQlpdDY1MDVfZHBjZF93cml0ZShpdDY1MDUs IERQX0RPV05TUFJFQURfQ1RSTCwKPiArCQkJCSAgRFBfU1BSRUFEX0FNUF8wXzUpOwo+ICsJfSBl bHNlIHsKPiArCQlpdDY1MDVfZHBjZF93cml0ZShpdDY1MDUsIERQX0RPV05TUFJFQURfQ1RSTCwg MHgwMCk7Cj4gKwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1RJTUVfU1RNUF9DVFJMLCBN X1NUQU1QX1NURVAsCj4gKwkJCQkweDAwKTsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIGlubGlu ZSB2b2lkIGl0NjUwNV9saW5rX3JhdGVfc2V0dXAoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7 Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfVFJBSU5fQ1RSTDAsIEZPUkNFX0xCUiwK PiArCQkJKGl0NjUwNS0+bGlua19yYXRlX2J3X2NvZGUgPT0gUkJSKSA/IEZPUkNFX0xCUiA6IDB4 MDApOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0xJTktfRFJWLCBEUlZfSFMsCj4g KwkJCShpdDY1MDUtPmxpbmtfcmF0ZV9id19jb2RlID09IFJCUikgPyAweDAwIDogRFJWX0hTKTsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2xhbmVfY291bnRfc2V0dXAoc3RydWN0IGl0 NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfZ2V0X2V4dGNvbl9wcm9wZXJ0eShpdDY1MDUp Owo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1RSQUlOX0NUUkwwLCBMQU5FX1NXQVAs Cj4gKwkJCWl0NjUwNS0+bGFuZV9zd2FwID8gTEFORV9TV0FQIDogMHgwMCk7Cj4gKwlpdDY1MDVf c2V0X2JpdHMoaXQ2NTA1LCBSRUdfVFJBSU5fQ1RSTDAsIExBTkVfQ09VTlRfTUFTSywKPiArCQkJ KGl0NjUwNS0+bGFuZV9jb3VudCAtIDEpIDw8IDEpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBp dDY1MDVfbGlua190cmFpbmluZ19zZXR1cChzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiAr CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsKPiArCWlmIChp dDY1MDUtPmVuYWJsZV9lbmhhbmNlZF9mcmFtZSkKPiArCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1 LCBSRUdfREFUQV9NVVRFX0NUUkwsCj4gKwkJCQlFTkFCTEVfRU5IQU5DRURfRlJBTUUsIEVOQUJM RV9FTkhBTkNFRF9GUkFNRSk7Cj4gKwo+ICsJaXQ2NTA1X2xpbmtfcmF0ZV9zZXR1cChpdDY1MDUp Owo+ICsJaXQ2NTA1X2xhbmVfY291bnRfc2V0dXAoaXQ2NTA1KTsKPiArCWl0NjUwNV9zZXR1cF9z c2MoaXQ2NTA1KTsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwKPiArCQkJICAgICAiJXMs ICVkIGxhbmVzLCAlc2FibGUgc3NjLCAlc2FibGUgZW5oYW5jZWQgZnJhbWUiLAo+ICsJCQkgICAg IGl0NjUwNS0+bGlua19yYXRlX2J3X2NvZGUgIT0gUkJSID8gIkhCUiIgOiAiUkJSIiwKPiArCQkJ ICAgICBpdDY1MDUtPmxhbmVfY291bnQsCj4gKwkJCSAgICAgaXQ2NTA1LT5lbmFibGVfc3NjID8g ImVuIiA6ICJkaXMiLAo+ICsJCQkgICAgIGl0NjUwNS0+ZW5hYmxlX2VuaGFuY2VkX2ZyYW1lID8g ImVuIiA6ICJkaXMiKTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgaXQ2NTA1X2xpbmtfc3RhcnRf YXV0b190cmFpbihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWludCB0aW1lb3V0ID0g NTAwLCBsaW5rX3RyYWluaW5nX3N0YXRlOwo+ICsKPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUs IFJFR19UUkFJTl9DVFJMMCwKPiArCQkJCUZPUkNFX0NSX0RPTkUgfCBGT1JDRV9FUV9ET05FLCAw eDAwKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19UUkFJTl9DVFJMMSwgRk9SQ0VfUkVU UkFJTik7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfVFJBSU5fQ1RSTDEsIEFVVE9fVFJB SU4pOwo+ICsKPiArCXdoaWxlICh0aW1lb3V0ID4gMCkgewo+ICsJCXVzbGVlcF9yYW5nZSgxMDAw LCAyMDAwKTsKPiArCQlsaW5rX3RyYWluaW5nX3N0YXRlID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBS RUdfTElOS19UUkFJTl9TVFMpOwo+ICsKPiArCQlpZiAoKGxpbmtfdHJhaW5pbmdfc3RhdGUgPiAw KSAmJgo+ICsJCSAgICAobGlua190cmFpbmluZ19zdGF0ZSAmIExJTktfU1RBVEVfTk9SUCkpCj4g KwkJCXJldHVybiB0cnVlOwo+ICsKPiArCQl0aW1lb3V0LS07Cj4gKwl9Cj4gKwo+ICsJcmV0dXJu IGZhbHNlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGl0NjUwNV9kcm1fZHBfbGlua19jb25maWd1 cmUoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwl1OCB2YWx1ZXNbMl07Cj4gKwlpbnQg ZXJyOwo+ICsJc3RydWN0IGRybV9kcF9hdXggKmF1eCA9ICZpdDY1MDUtPmF1eDsKPiArCj4gKwl2 YWx1ZXNbMF0gPSBpdDY1MDUtPmxpbmtfcmF0ZV9id19jb2RlOwo+ICsJdmFsdWVzWzFdID0gaXQ2 NTA1LT5sYW5lX2NvdW50Owo+ICsKPiArCWlmIChpdDY1MDUtPmVuYWJsZV9lbmhhbmNlZF9mcmFt ZSkKPiArCQl2YWx1ZXNbMV0gfD0gRFBfTEFORV9DT1VOVF9FTkhBTkNFRF9GUkFNRV9FTjsKPiAr Cj4gKwllcnIgPSBkcm1fZHBfZHBjZF93cml0ZShhdXgsIERQX0xJTktfQldfU0VULCB2YWx1ZXMs IHNpemVvZih2YWx1ZXMpKTsKPiArCWlmIChlcnIgPCAwKQo+ICsJCXJldHVybiBlcnI7Cj4gKwo+ ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB1OCBkcF9saW5rX3N0YXR1cyhjb25zdCB1 OCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXSwgaW50IHIpCj4gK3sKPiArCXJldHVy biBsaW5rX3N0YXR1c1tyIC0gRFBfTEFORTBfMV9TVEFUVVNdOwo+ICt9Cj4gKwo+ICtzdGF0aWMg Ym9vbCBpdDY1MDVfY2hlY2tfbWF4X3ZhbHVlKGVudW0gbWF4X3ZhbHVlX2NoZWNrIHR5cGUsCj4g KwkJCQkgICB1OCBsYW5lX3ZvbHRhZ2Vfc3dpbmdfcHJlX2VtcGhhc2lzKQo+ICt7Cj4gKwlpZiAo dHlwZSA9PSBWT0xUQUdFX1NXSU5HKQo+ICsJCXJldHVybiAoKGxhbmVfdm9sdGFnZV9zd2luZ19w cmVfZW1waGFzaXMgJiAweDAzKSA9PQo+ICsJCQlNQVhfQ1JfTEVWRUwpOwo+ICsJZWxzZQo+ICsJ CXJldHVybiAoKGxhbmVfdm9sdGFnZV9zd2luZ19wcmVfZW1waGFzaXMgJiAweDAzKSA9PQo+ICsJ CQlNQVhfRVFfTEVWRUwpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgYm9vbCBpdDY1MDVfY2hlY2tfbWF4 X3ZvbHRhZ2Vfc3dpbmdfcmVhY2hlZCh1OCAqbGFuZV92b2x0YWdlX3N3aW5nLAo+ICsJCQkJCQkg ICB1OCBsYW5lX2NvdW50KQo+ICt7Cj4gKwl1OCBpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBs YW5lX2NvdW50OyBpKyspIHsKPiArCQlpZiAobGFuZV92b2x0YWdlX3N3aW5nW2ldICYgRFBfVFJB SU5fTUFYX1NXSU5HX1JFQUNIRUQpCj4gKwkJCXJldHVybiB0cnVlOwo+ICsJfQo+ICsKPiArCXJl dHVybiBmYWxzZTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgaXQ2NTA1X3N0ZXBfdHJhaW5fbGFu ZV92b2x0YWdlX3ByZV9lbXBoYXNpc19zZXQoCj4gKwlzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsCj4g KwlzdHJ1Y3QgaXQ2NTA1X3N0ZXBfdHJhaW5fcGFyYSAqbGFuZV92b2x0YWdlX3ByZV9lbXBoYXNp cywKPiArCXU4ICpsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzX3NldCkKPiArewo+ICsJdTggaTsK PiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgaXQ2NTA1LT5sYW5lX2NvdW50OyBpKyspIHsKPiArCQls YW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2ldICY9IDB4MDM7Cj4gKwkJ bGFuZV92b2x0YWdlX3ByZV9lbXBoYXNpc19zZXRbaV0gPQo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJl X2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2ldOwo+ICsJCWlmIChpdDY1MDVfY2hlY2tfbWF4X3Zh bHVlKAo+ICsJCQkgICAgVk9MVEFHRV9TV0lORywKPiArCQkJICAgIGxhbmVfdm9sdGFnZV9wcmVf ZW1waGFzaXMtPnZvbHRhZ2Vfc3dpbmdbaV0pKQo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhh c2lzX3NldFtpXSB8PQo+ICsJCQkJRFBfVFJBSU5fTUFYX1NXSU5HX1JFQUNIRUQ7Cj4gKwo+ICsJ CWxhbmVfdm9sdGFnZV9wcmVfZW1waGFzaXMtPnByZV9lbXBoYXNpc1tpXSAmPSAweDAzOwo+ICsJ CWxhbmVfdm9sdGFnZV9wcmVfZW1waGFzaXNfc2V0W2ldIHw9Cj4gKwkJCWxhbmVfdm9sdGFnZV9w cmVfZW1waGFzaXMtPnByZV9lbXBoYXNpc1tpXQo+ICsJCQk8PCBEUF9UUkFJTl9QUkVfRU1QSEFT SVNfU0hJRlQ7Cj4gKwkJaWYgKGl0NjUwNV9jaGVja19tYXhfdmFsdWUoCj4gKwkJCSAgICBQUkVf RU1QSEFTSVMsCj4gKwkJCSAgICBsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT5wcmVfZW1waGFz aXNbaV0pKQo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzX3NldFtpXSB8PQo+ICsJCQkJ RFBfVFJBSU5fTUFYX1BSRV9FTVBIQVNJU19SRUFDSEVEOwo+ICsJCWl0NjUwNV9kcGNkX3dyaXRl KGl0NjUwNSwgRFBfVFJBSU5JTkdfTEFORTBfU0VUICsgaSwKPiArCQkJCSAgbGFuZV92b2x0YWdl X3ByZV9lbXBoYXNpc19zZXRbaV0pOwo+ICsKPiArCQlpZiAobGFuZV92b2x0YWdlX3ByZV9lbXBo YXNpc19zZXRbaV0gIT0KPiArCQkgICAgaXQ2NTA1X2RwY2RfcmVhZChpdDY1MDUsIERQX1RSQUlO SU5HX0xBTkUwX1NFVCArIGkpKQo+ICsJCQlyZXR1cm4gZmFsc2U7Cj4gKwl9Cj4gKwo+ICsJcmV0 dXJuIHRydWU7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sCj4gK2l0NjUwNV9zdGVwX2NyX3RyYWlu KHN0cnVjdCBpdDY1MDUgKml0NjUwNSwKPiArCQkgICAgIHN0cnVjdCBpdDY1MDVfc3RlcF90cmFp bl9wYXJhICpsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzKQo+ICt7Cj4gKwl1OCBsb29wX2NvdW50 ID0gMCwgaSA9IDAsIGo7Cj4gKwl1OCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXSA9 IHsgMCB9Owo+ICsJdTggbGFuZV9sZXZlbF9jb25maWdbTUFYX0xBTkVfQ09VTlRdID0geyAwIH07 Cj4gKwlpbnQgcHJlX2VtcGhhc2lzX2FkanVzdCA9IC0xLCB2b2x0YWdlX3N3aW5nX2FkanVzdCA9 IC0xOwo+ICsKPiArCWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwgRFBfRE9XTlNQUkVBRF9DVFJM LAo+ICsJCQkgIGl0NjUwNS0+ZW5hYmxlX3NzYyA/IERQX1NQUkVBRF9BTVBfMF81IDogMHgwMCk7 Cj4gKwlpdDY1MDVfZHBjZF93cml0ZShpdDY1MDUsIERQX1RSQUlOSU5HX1BBVFRFUk5fU0VULAo+ ICsJCQkgIERQX1RSQUlOSU5HX1BBVFRFUk5fMSk7Cj4gKwo+ICsJd2hpbGUgKGxvb3BfY291bnQg PCA1ICYmIGkgPCAxMCkgewo+ICsJCWkrKzsKPiArCQlpZiAoIWl0NjUwNV9zdGVwX3RyYWluX2xh bmVfdm9sdGFnZV9wcmVfZW1waGFzaXNfc2V0KAo+ICsJCQkgICAgaXQ2NTA1LCBsYW5lX3ZvbHRh Z2VfcHJlX2VtcGhhc2lzLAo+ICsJCQkgICAgbGFuZV9sZXZlbF9jb25maWcpKQo+ICsJCQljb250 aW51ZTsKPiArCQlkcm1fZHBfbGlua190cmFpbl9jbG9ja19yZWNvdmVyeV9kZWxheShpdDY1MDUt PmRwY2QpOwo+ICsJCWRybV9kcF9kcGNkX3JlYWRfbGlua19zdGF0dXMoJml0NjUwNS0+YXV4LCBs aW5rX3N0YXR1cyk7Cj4gKwo+ICsJCWlmIChkcm1fZHBfY2xvY2tfcmVjb3Zlcnlfb2sobGlua19z dGF0dXMsIGl0NjUwNS0+bGFuZV9jb3VudCkpIHsKPiArCQkJaXQ2NTA1X3NldF9iaXRzKGl0NjUw NSwgUkVHX1RSQUlOX0NUUkwwLCBGT1JDRV9DUl9ET05FLAo+ICsJCQkJCUZPUkNFX0NSX0RPTkUp Owo+ICsJCQlyZXR1cm4gdHJ1ZTsKPiArCQl9Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoJml0 NjUwNS0+Y2xpZW50LT5kZXYsICJjciBub3QgZG9uZSIpOwo+ICsKPiArCQlpZiAoaXQ2NTA1X2No ZWNrX21heF92b2x0YWdlX3N3aW5nX3JlYWNoZWQobGFuZV9sZXZlbF9jb25maWcsCj4gKwkJCQkJ CQkgICBpdDY1MDUtPmxhbmVfY291bnQpKQo+ICsJCQlnb3RvIGNyX3RyYWluX2ZhaWw7Cj4gKwo+ ICsJCWZvciAoaiA9IDA7IGogPCBpdDY1MDUtPmxhbmVfY291bnQ7IGorKykgewo+ICsJCQlsYW5l X3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2pdID0KPiArCQkJCWRybV9kcF9n ZXRfYWRqdXN0X3JlcXVlc3Rfdm9sdGFnZShsaW5rX3N0YXR1cywKPiArCQkJCQkJCQkgIGopID4+ Cj4gKwkJCQlEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX1NISUZUOwo+ICsJCQlsYW5lX3ZvbHRhZ2Vf cHJlX2VtcGhhc2lzLT5wcmVfZW1waGFzaXNbal0gPQo+ICsJCQkJZHJtX2RwX2dldF9hZGp1c3Rf cmVxdWVzdF9wcmVfZW1waGFzaXMoCj4gKwkJCQkJbGlua19zdGF0dXMsIGopID4+Cj4gKwkJCQlE UF9UUkFJTl9QUkVfRU1QSEFTSVNfU0hJRlQ7Cj4gKwkJCWlmICgodm9sdGFnZV9zd2luZ19hZGp1 c3QgPT0KPiArCQkJICAgICBsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT52b2x0YWdlX3N3aW5n W2pdKSAmJgo+ICsJCQkgICAgKHByZV9lbXBoYXNpc19hZGp1c3QgPT0KPiArCQkJICAgICBsYW5l X3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT5wcmVfZW1waGFzaXNbal0pKSB7Cj4gKwkJCQlsb29wX2Nv dW50Kys7Cj4gKwkJCQljb250aW51ZTsKPiArCQkJfQo+ICsKPiArCQkJdm9sdGFnZV9zd2luZ19h ZGp1c3QgPQo+ICsJCQkJbGFuZV92b2x0YWdlX3ByZV9lbXBoYXNpcy0+dm9sdGFnZV9zd2luZ1tq XTsKPiArCQkJcHJlX2VtcGhhc2lzX2FkanVzdCA9Cj4gKwkJCQlsYW5lX3ZvbHRhZ2VfcHJlX2Vt cGhhc2lzLT5wcmVfZW1waGFzaXNbal07Cj4gKwkJCWxvb3BfY291bnQgPSAwOwo+ICsKPiArCQkJ aWYgKHZvbHRhZ2Vfc3dpbmdfYWRqdXN0ICsgcHJlX2VtcGhhc2lzX2FkanVzdCA+IDB4MDMpCj4g KwkJCQlsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2pdID0KPiArCQkJ CQlNQVhfRVFfTEVWRUwgLQo+ICsJCQkJCWxhbmVfdm9sdGFnZV9wcmVfZW1waGFzaXMKPiArCQkJ CQkJLT5wcmVfZW1waGFzaXNbal07Cj4gKwkJfQo+ICsJfQo+ICsKPiArY3JfdHJhaW5fZmFpbDoK PiArCWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4g KwkJCSAgRFBfVFJBSU5JTkdfUEFUVEVSTl9ESVNBQkxFKTsKPiArCj4gKwlyZXR1cm4gZmFsc2U7 Cj4gK30KPiArCj4gK3N0YXRpYyBib29sCj4gK2l0NjUwNV9zdGVwX2VxX3RyYWluKHN0cnVjdCBp dDY1MDUgKml0NjUwNSwKPiArCQkgICAgIHN0cnVjdCBpdDY1MDVfc3RlcF90cmFpbl9wYXJhICps YW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzKQo+ICt7Cj4gKwl1OCBsb29wX2NvdW50ID0gMCwgaSwg bGlua19zdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRV0gPSB7IDAgfTsKPiArCXU4IGxhbmVfbGV2 ZWxfY29uZmlnW01BWF9MQU5FX0NPVU5UXSA9IHsgMCB9Owo+ICsKPiArCWl0NjUwNV9kcGNkX3dy aXRlKGl0NjUwNSwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4gKwkJCSAgRFBfVFJBSU5JTkdf UEFUVEVSTl8yKTsKPiArCj4gKwl3aGlsZSAobG9vcF9jb3VudCA8IDYpIHsKPiArCQlsb29wX2Nv dW50Kys7Cj4gKwo+ICsJCWlmICghaXQ2NTA1X3N0ZXBfdHJhaW5fbGFuZV92b2x0YWdlX3ByZV9l bXBoYXNpc19zZXQoCj4gKwkJCSAgICBpdDY1MDUsIGxhbmVfdm9sdGFnZV9wcmVfZW1waGFzaXMs Cj4gKwkJCSAgICBsYW5lX2xldmVsX2NvbmZpZykpCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQlk cm1fZHBfbGlua190cmFpbl9jaGFubmVsX2VxX2RlbGF5KGl0NjUwNS0+ZHBjZCk7Cj4gKwkJZHJt X2RwX2RwY2RfcmVhZF9saW5rX3N0YXR1cygmaXQ2NTA1LT5hdXgsIGxpbmtfc3RhdHVzKTsKPiAr Cj4gKwkJaWYgKCFkcm1fZHBfY2xvY2tfcmVjb3Zlcnlfb2sobGlua19zdGF0dXMsIGl0NjUwNS0+ bGFuZV9jb3VudCkpCj4gKwkJCWdvdG8gZXFfdHJhaW5fZmFpbDsKPiArCj4gKwkJaWYgKGRybV9k cF9jaGFubmVsX2VxX29rKGxpbmtfc3RhdHVzLCBpdDY1MDUtPmxhbmVfY291bnQpKSB7Cj4gKwkJ CWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4gKwkJ CQkJICBEUF9UUkFJTklOR19QQVRURVJOX0RJU0FCTEUpOwo+ICsJCQlpdDY1MDVfc2V0X2JpdHMo aXQ2NTA1LCBSRUdfVFJBSU5fQ1RSTDAsIEZPUkNFX0VRX0RPTkUsCj4gKwkJCQkJRk9SQ0VfRVFf RE9ORSk7Cj4gKwkJCXJldHVybiB0cnVlOwo+ICsJCX0KPiArCQlEUk1fREVWX0RFQlVHX0RSSVZF UigmaXQ2NTA1LT5jbGllbnQtPmRldiwgImVxIG5vdCBkb25lIik7Cj4gKwo+ICsJCWZvciAoaSA9 IDA7IGkgPCBpdDY1MDUtPmxhbmVfY291bnQ7IGkrKykgewo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJl X2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2ldID0KPiArCQkJCWRybV9kcF9nZXRfYWRqdXN0X3Jl cXVlc3Rfdm9sdGFnZShsaW5rX3N0YXR1cywKPiArCQkJCQkJCQkgIGkpID4+Cj4gKwkJCQlEUF9U UkFJTl9WT0xUQUdFX1NXSU5HX1NISUZUOwo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lz LT5wcmVfZW1waGFzaXNbaV0gPQo+ICsJCQkJZHJtX2RwX2dldF9hZGp1c3RfcmVxdWVzdF9wcmVf ZW1waGFzaXMoCj4gKwkJCQkJbGlua19zdGF0dXMsIGkpID4+Cj4gKwkJCQlEUF9UUkFJTl9QUkVf RU1QSEFTSVNfU0hJRlQ7Cj4gKwo+ICsJCQlpZiAobGFuZV92b2x0YWdlX3ByZV9lbXBoYXNpcy0+ dm9sdGFnZV9zd2luZ1tpXSArCj4gKwkJCQkgICAgbGFuZV92b2x0YWdlX3ByZV9lbXBoYXNpcy0+ cHJlX2VtcGhhc2lzW2ldID4KPiArCQkJICAgIDB4MDMpCj4gKwkJCQlsYW5lX3ZvbHRhZ2VfcHJl X2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2ldID0KPiArCQkJCQkweDAzIC0gbGFuZV92b2x0YWdl X3ByZV9lbXBoYXNpcwo+ICsJCQkJCQkgICAgICAgLT5wcmVfZW1waGFzaXNbaV07Cj4gKwkJfQo+ ICsJfQo+ICsKPiArZXFfdHJhaW5fZmFpbDoKPiArCWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwg RFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4gKwkJCSAgRFBfVFJBSU5JTkdfUEFUVEVSTl9ESVNB QkxFKTsKPiArCXJldHVybiBmYWxzZTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgaXQ2NTA1X2xp bmtfc3RhcnRfc3RlcF90cmFpbihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWludCBl cnI7Cj4gKwlzdHJ1Y3QgaXQ2NTA1X3N0ZXBfdHJhaW5fcGFyYSBsYW5lX3ZvbHRhZ2VfcHJlX2Vt cGhhc2lzID0gewo+ICsJCS52b2x0YWdlX3N3aW5nID0geyAwIH0sCj4gKwkJLnByZV9lbXBoYXNp cyA9IHsgMCB9LAo+ICsJfTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUigmaXQ2NTA1LT5j bGllbnQtPmRldiwgInN0YXJ0Iik7Cj4gKwllcnIgPSBpdDY1MDVfZHJtX2RwX2xpbmtfY29uZmln dXJlKGl0NjUwNSk7Cj4gKwo+ICsJaWYgKGVyciAhPSAwKQo+ICsJCXJldHVybiBmYWxzZTsKPiAr CWlmICghaXQ2NTA1X3N0ZXBfY3JfdHJhaW4oaXQ2NTA1LCAmbGFuZV92b2x0YWdlX3ByZV9lbXBo YXNpcykpCj4gKwkJcmV0dXJuIGZhbHNlOwo+ICsJaWYgKCFpdDY1MDVfc3RlcF9lcV90cmFpbihp dDY1MDUsICZsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzKSkKPiArCQlyZXR1cm4gZmFsc2U7Cj4g KwlyZXR1cm4gdHJ1ZTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgaXQ2NTA1X2dldF92aWRlb19z dGF0dXMoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpbnQgcmVnXzBkOwo+ICsKPiAr CXJlZ18wZCA9IGl0NjUwNV9yZWFkKGl0NjUwNSwgUkVHX1NZU1RFTV9TVFMpOwo+ICsKPiArCWlm IChyZWdfMGQgPCAwKQo+ICsJCXJldHVybiBmYWxzZTsKPiArCj4gKwlyZXR1cm4gKHJlZ18wZCAm IFZJREVPX1NUQikgPyB0cnVlIDogZmFsc2U7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUw NV9yZXNldF9oZGNwKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJLyogRGlzYWJsZSBD UF9EZXNpcmVkICovCj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfSERDUF9DVFJMMSwg SERDUF9DUF9FTkFCTEUsIDB4MDApOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1JF U0VUX0NUUkwsIEhEQ1BfUkVTRVQsIEhEQ1BfUkVTRVQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9p ZCBpdDY1MDVfc3RvcF9saW5rX3RyYWluKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJ aXQ2NTA1LT5saW5rX3N0YXRlID0gTElOS19JRExFOwo+ICsJY2FuY2VsX3dvcmtfc3luYygmaXQ2 NTA1LT5saW5rX3dvcmtzKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19UUkFJTl9DVFJM MSwgRk9SQ0VfUkVUUkFJTik7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9saW5rX3Ry YWluaW5nX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICt7Cj4gKwlzdHJ1Y3QgaXQ2 NTA1ICppdDY1MDUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGl0NjUwNSwgbGlua193b3Jr cyk7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCWlu dCBlcnIsIGksIHN0ZXBfcmV0cnkgPSAzOwo+ICsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRl diwgIml0NjUwNS0+c2lua19jb3VudDogJWQiLAo+ICsJCQkgICAgIGl0NjUwNS0+c2lua19jb3Vu dCk7Cj4gKwo+ICsKPiArCWlmICghaXQ2NTA1X2dldF9zaW5rX2hwZF9zdGF0dXMoaXQ2NTA1KSkK PiArCQlyZXR1cm47Cj4gKwo+ICsJaXQ2NTA1X2xpbmtfdHJhaW5pbmdfc2V0dXAoaXQ2NTA1KTsK PiArCj4gKwlpZiAoaXQ2NTA1LT5hdXRvX3RyYWluX3JldHJ5IDwgMSkKPiArCQlnb3RvIHN0ZXBf dHJhaW47Cj4gKwo+ICsJaXQ2NTA1X3Jlc2V0X2hkY3AoaXQ2NTA1KTsKPiArCWl0NjUwNV9hdXhf cmVzZXQoaXQ2NTA1KTsKPiArCWVyciA9IGl0NjUwNV9saW5rX3N0YXJ0X2F1dG9fdHJhaW4oaXQ2 NTA1KTsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgImF1dG8gdHJhaW4gJXMsIGF1dG9f dHJhaW5fcmV0cnk6ICVkIiwKPiArCQkJICAgICBlcnIgPyAicGFzcyIgOiAiZmFpbGVkIiwgaXQ2 NTA1LT5hdXRvX3RyYWluX3JldHJ5KTsKPiArCWl0NjUwNS0+YXV0b190cmFpbl9yZXRyeS0tOwo+ ICsKPiArCWlmIChlcnIpCj4gKwkJZ290byBsaW5rX3RyYWluX29rOwo+ICsKPiArCWl0NjUwNV9k dW1wKGl0NjUwNSk7Cj4gKwlyZXR1cm47Cj4gKwo+ICtzdGVwX3RyYWluOgo+ICsJRFJNX0RFVl9E RUJVR19EUklWRVIoZGV2LCAiU3RhcnQgc3RlcCB0cmFpbiIpOwo+ICsKPiArCWlmIChpdDY1MDUt PnNpbmtfY291bnQgPT0gMCkgewo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIml0NjUw NS0+c2lua19jb3VudDolZCwgZm9yY2UgZXEiLAo+ICsJCQkJICAgICBpdDY1MDUtPnNpbmtfY291 bnQpOwo+ICsJCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsCVJFR19UUkFJTl9DVFJMMCwgRk9SQ0Vf RVFfRE9ORSwKPiArCQkJCUZPUkNFX0VRX0RPTkUpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4g KwlpZiAoIWl0NjUwNS0+c3RlcF90cmFpbikKPiArCQlnb3RvIGxpbmtfdHJhaW5fZXJyb3I7Cj4g Kwo+ICsJLyogc2V0cCB0cmFpbmluZyBzdGFydCBoZXJlICovCj4gKwlmb3IgKGkgPSAwOyBpIDwg c3RlcF9yZXRyeTsgaSsrKSB7Cj4gKwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1RSQUlO X0NUUkwwLAo+ICsJCQkJRk9SQ0VfQ1JfRE9ORSB8IEZPUkNFX0VRX0RPTkUsIDB4MDApOwo+ICsJ CWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4gKwkJ CQkgIERQX1RSQUlOSU5HX1BBVFRFUk5fRElTQUJMRSk7Cj4gKwkJZXJyID0gaXQ2NTA1X2xpbmtf c3RhcnRfc3RlcF90cmFpbihpdDY1MDUpOwo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwg InN0ZXAgdHJhaW4gJXMsIHJldHJ5OiVkIHRpbWVzIiwKPiArCQkJCSAgICAgZXJyID8gInBhc3Mi IDogImZhaWxlZCIsIGkgKyAxKTsKPiArCQlpZiAoZXJyKQo+ICsJCQlnb3RvIGxpbmtfdHJhaW5f b2s7Cj4gKwl9Cj4gKwo+ICtsaW5rX3RyYWluX2Vycm9yOgo+ICsJRFJNX0RFVl9ERUJVR19EUklW RVIoZGV2LCAidHJhaW5pbmcgZmFpbCIpOwo+ICsJaXQ2NTA1LT5saW5rX3N0YXRlID0gTElOS19J RExFOwo+ICsKPiArCWlmICghaXQ2NTA1X2dldF92aWRlb19zdGF0dXMoaXQ2NTA1KSkKPiArCQlp dDY1MDVfdmlkZW9fcmVzZXQoaXQ2NTA1KTsKPiArCXJldHVybjsKPiArCj4gK2xpbmtfdHJhaW5f b2s6Cj4gKwo+ICsJaXQ2NTA1LT5saW5rX3N0YXRlID0gTElOS19PSzsKPiArCS8qIGRpc2FsYmUg bXV0ZSBlbmFibGUgYXZpIGluZm8gZnJhbWUgKi8KPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUs IFJFR19EQVRBX01VVEVfQ1RSTCwgRU5fVklEX01VVEUsIDB4MDApOwo+ICsJaXQ2NTA1X3NldF9i aXRzKGl0NjUwNSwgUkVHX0lORk9GUkFNRV9DVFJMLAo+ICsJCQlFTl9WSURfQ1RSTF9QS1QsIEVO X1ZJRF9DVFJMX1BLVCk7Cj4gKwo+ICsJaWYgKGl0NjUwNV9hdWRpb19pbnB1dChpdDY1MDUpKSB7 Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiRW5hYmxlIGF1ZGlvISIpOwo+ICsJCWl0 NjUwNV9lbmFibGVfYXVkaW8oaXQ2NTA1KTsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQg aXQ2NTA1X3BsdWdnZWRfc3RhdHVzX3RvX2NvZGVjKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiAr ewo+ICsJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXMgPSBpdDY1MDUtPmNvbm5lY3Rv cl9zdGF0dXM7Cj4gKwo+ICsJaWYgKGl0NjUwNS0+cGx1Z2dlZF9jYiAmJiBpdDY1MDUtPmNvZGVj X2RldikKPiArCQlpdDY1MDUtPnBsdWdnZWRfY2IoaXQ2NTA1LT5jb2RlY19kZXYsCj4gKwkJCQkg ICBzdGF0dXMgPT0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQpOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50IGl0NjUwNV9wcm9jc3NfaHBkX2lycShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sK PiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsJaW50IHJl dCwgZHBjZF9zaW5rX2NvdW50LCBkcF9pcnFfdmVjdG9yOwo+ICsJdTggbGlua19zdGF0dXNbRFBf TElOS19TVEFUVVNfU0laRV07Cj4gKwo+ICsJaWYgKCFpdDY1MDVfZ2V0X3NpbmtfaHBkX3N0YXR1 cyhpdDY1MDUpKSB7Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiSFBEX0lSUSBIUEQg bG93Iik7Cj4gKwkJaXQ2NTA1LT5zaW5rX2NvdW50ID0gMDsKPiArCQlyZXR1cm4gMDsKPiArCX0K PiArCj4gKwlyZXQgPSBpdDY1MDVfZHBjZF9yZWFkKGl0NjUwNSwgRFBfU0lOS19DT1VOVCk7Cj4g KwlpZiAocmV0IDwgMCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCWRwY2Rfc2lua19jb3VudCA9 IERQX0dFVF9TSU5LX0NPVU5UKHJldCk7Cj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJk cGNkX3NpbmtfY291bnQ6ICVkIGl0NjUwNS0+c2lua19jb3VudDolZCIsCj4gKwkJCSAgICAgZHBj ZF9zaW5rX2NvdW50LCBpdDY1MDUtPnNpbmtfY291bnQpOwo+ICsKPiArCWlmIChpdDY1MDUtPmJy YW5jaF9kZXZpY2UgJiYgZHBjZF9zaW5rX2NvdW50ICE9IGl0NjUwNS0+c2lua19jb3VudCkgewo+ ICsJCW1lbXNldChpdDY1MDUtPmRwY2QsIDAsIHNpemVvZihpdDY1MDUtPmRwY2QpKTsKPiArCQlp dDY1MDUtPnNpbmtfY291bnQgPSBkcGNkX3NpbmtfY291bnQ7Cj4gKwkJa2ZyZWUoaXQ2NTA1LT5l ZGlkKTsKPiArCQlpdDY1MDUtPmVkaWQgPSBOVUxMOwo+ICsJCWl0NjUwNV9yZXNldF9sb2dpYyhp dDY1MDUpOwo+ICsJCWl0NjUwNV9pbnRfbWFza19lbmFibGUoaXQ2NTA1KTsKPiArCQlpdDY1MDVf aW5pdChpdDY1MDUpOwo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICsKPiArCWRwX2lycV92ZWN0b3Ig PSBpdDY1MDVfZHBjZF9yZWFkKGl0NjUwNSwgRFBfREVWSUNFX1NFUlZJQ0VfSVJRX1ZFQ1RPUik7 Cj4gKwlpZiAoZHBfaXJxX3ZlY3RvciA8IDApCj4gKwkJcmV0dXJuIGRwX2lycV92ZWN0b3I7Cj4g Kwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiZHBfaXJxX3ZlY3RvciA9IDB4JTAyeCIs IGRwX2lycV92ZWN0b3IpOwo+ICsKPiArCS8qIG5vIG5lZWQgdG8gY2hlY2sgbGluayBzdGF0dXMg aWYgbm8gdHJhaW5pbmcgKi8KPiArCWlmIChpdDY1MDUtPmxpbmtfc3RhdGUgPT0gTElOS19PSykg ewo+ICsJCXJldCA9IGRybV9kcF9kcGNkX3JlYWRfbGlua19zdGF0dXMoJml0NjUwNS0+YXV4LCBs aW5rX3N0YXR1cyk7Cj4gKwkJaWYgKHJldCA8IDApIHsKPiArCQkJRFJNX0RFVl9FUlJPUihkZXYs ICJGYWlsIHRvIHJlYWQgbGluayBzdGF0dXMgcmV0OiAlZCIsCj4gKwkJCQkgICAgICByZXQpOwo+ ICsJCQlyZXR1cm4gcmV0Owo+ICsJCX0KPiArCj4gKwkJaWYgKGRwX2xpbmtfc3RhdHVzKGxpbmtf c3RhdHVzLCBEUF9MQU5FX0FMSUdOX1NUQVRVU19VUERBVEVEKSAmCj4gKwkJICAgIERQX0xJTktf U1RBVFVTX1VQREFURUQpIHsKPiArCQkJaWYgKCFkcm1fZHBfY2hhbm5lbF9lcV9vayhsaW5rX3N0 YXR1cywKPiArCQkJCQkJICBpdDY1MDUtPmxhbmVfY291bnQpKQo+ICsJCQkJaXQ2NTA1X3ZpZGVv X3Jlc2V0KGl0NjUwNSk7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBpdDY1MDVfY2hlY2tfcmVnMDYoc3RydWN0IGl0NjUwNSAqaXQ2NTA1LCB1 bnNpZ25lZCBpbnQgcmVnMDYpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUt PmNsaWVudC0+ZGV2Owo+ICsJYm9vbCBkYXRhOwo+ICsKPiArCWlmIChyZWcwNiAmIElOVF9IUERf Q0hBTkdFKSB7Cj4gKwkJZGF0YSA9IGl0NjUwNV9nZXRfc2lua19ocGRfc3RhdHVzKGl0NjUwNSk7 Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiaHBkIGNoYW5nZSBpbnRlcnJ1cHQsIGNo YW5nZSB0byAlcyIsCj4gKwkJCQkgICAgIGRhdGEgPyAiaGlnaCIgOiAibG93Iik7Cj4gKwo+ICsJ CWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChpdDY1MDUtPmNvbm5lY3Rvci5kZXYpOwo+ICsJCURS TV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIml0NjUwNS0+c2lua19jb3VudDogJWQiLAo+ICsJCQkJ ICAgICBpdDY1MDUtPnNpbmtfY291bnQpOwo+ICsKPiArCQlpZiAoZGF0YSkgewo+ICsJCQl3YWl0 X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJml0NjUwNS0+d2FpdF9lZGlkX2NvbXBsZXRlLAo+ICsJ CQkJCQkgICAgbXNlY3NfdG9famlmZmllcyg2MDAwKSk7Cj4gKwkJCWl0NjUwNV9sYW5lX3Rlcm1p bmF0aW9uX29uKGl0NjUwNSk7Cj4gKwkJCWl0NjUwNV9sYW5lX3Bvd2VyX29uKGl0NjUwNSk7Cj4g Kwo+ICsJCQkvKgo+ICsJCQkgKiBmb3Igc29tZSBkb25nbGUgd2hpY2ggaXNzdWUgSFBEX2lycQo+ ICsJCQkgKiB3aGVuIHNpbmsgY291bm50IGNoYW5nZSBmcm9tICAwLT4xCj4gKwkJCSAqIGl0NjUw NSBub3QgYWJsZSB0byByZWNlaXZlIEhQRF9JUlEKPiArCQkJICogaWYgSFcgbmV2ZXIgZ28gaW50 byB0cmFpbmlnIGRvbmUKPiArCQkJICovCj4gKwo+ICsJCQlpZiAoaXQ2NTA1LT5icmFuY2hfZGV2 aWNlICYmIGl0NjUwNS0+c2lua19jb3VudCA9PSAwKQo+ICsJCQkJc2NoZWR1bGVfd29yaygmaXQ2 NTA1LT5saW5rX3dvcmtzKTsKPiArCj4gKwkJCWlmICghaXQ2NTA1X2dldF92aWRlb19zdGF0dXMo aXQ2NTA1KSkKPiArCQkJCWl0NjUwNV92aWRlb19yZXNldChpdDY1MDUpOwo+ICsKPiArCQkJaXQ2 NTA1X2NhbGNfdmlkZW9faW5mbyhpdDY1MDUpOwo+ICsJCX0gZWxzZSB7Cj4gKwkJCWtmcmVlKGl0 NjUwNS0+ZWRpZCk7Cj4gKwkJCWl0NjUwNS0+ZWRpZCA9IE5VTEw7Cj4gKwkJCW1lbXNldChpdDY1 MDUtPmRwY2QsIDAsIHNpemVvZihpdDY1MDUtPmRwY2QpKTsKPiArCj4gKwkJCWl0NjUwNV92aWRl b19kaXNhYmxlKGl0NjUwNSk7Cj4gKwkJCWl0NjUwNV9kaXNhYmxlX2F1ZGlvKGl0NjUwNSk7Cj4g KwkJCWl0NjUwNV9zdG9wX2xpbmtfdHJhaW4oaXQ2NTA1KTsKPiArCQkJaXQ2NTA1X2xhbmVfb2Zm KGl0NjUwNSk7Cj4gKwkJCXJldHVybjsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJaWYgKHJlZzA2ICYg SU5UX1JFQ0VJVkVfSFBEX0lSUSkgewo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgImhw ZF9pcnEgaW50ZXJydXB0Iik7Cj4gKwo+ICsJCWlmIChpdDY1MDVfcHJvY3NzX2hwZF9pcnEoaXQ2 NTA1KSA8IDApCj4gKwkJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgInByb2Nlc3MgaHBkX2ly cSBmYWlsISIpOwo+ICsJfQo+ICsKPiArCWlmIChyZWcwNiAmIElOVF9TQ0RUX0NIQU5HRSkgewo+ ICsJCWRhdGEgPSBpdDY1MDVfZ2V0X3ZpZGVvX3N0YXR1cyhpdDY1MDUpOwo+ICsJCURSTV9ERVZf REVCVUdfRFJJVkVSKGRldiwgInZpZGVvIHN0YWJsZSBjaGFuZ2UgaW50ZXJydXB0LCAlcyIsCj4g KwkJCQkgICAgIGRhdGEgPyAic3RhYmxlIiA6ICJ1bnN0YWJsZSIpOwo+ICsJCWl0NjUwNV9jYWxj X3ZpZGVvX2luZm8oaXQ2NTA1KTsKPiArCj4gKwkJaWYgKGRhdGEpCj4gKwkJCXNjaGVkdWxlX3dv cmsoJml0NjUwNS0+bGlua193b3Jrcyk7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0 NjUwNV9jaGVja19yZWcwNyhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVuc2lnbmVkIGludCByZWcw NykKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUwNS0+Y2xpZW50LT5kZXY7Cj4g Kwo+ICsJaWYgKHJlZzA3ICYgSU5UX0FVWF9DTURfRkFJTCkKPiArCQlEUk1fREVWX0RFQlVHX0RS SVZFUihkZXYsICJBVVggUEMgUmVxdWVzdCBGYWlsIEludGVycnVwdCIpOwo+ICsKPiArCWlmIChy ZWcwNyAmIElOVF9BVURJT19GSUZPX0VSUk9SKSB7Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIo ZGV2LCAiYXVkaW8gZmlmbyBlcnJvciBJbnRlcnJ1cHQiKTsKPiArCj4gKwkJaWYgKGl0NjUwNV9h dWRpb19pbnB1dChpdDY1MDUpKQo+ICsJCQlpdDY1MDVfZW5hYmxlX2F1ZGlvKGl0NjUwNSk7Cj4g Kwl9Cj4gKwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfY2hlY2tfcmVnMDgoc3RydWN0 IGl0NjUwNSAqaXQ2NTA1LCB1bnNpZ25lZCBpbnQgcmVnMDgpCj4gK3sKPiArCXN0cnVjdCBkZXZp Y2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsKPiArCWlmIChyZWcwOCAmIElOVF9M SU5LX1RSQUlOX0ZBSUwpIHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJsaW5rIHRy YWluaW5nIGZhaWwgaW50ZXJydXB0Iik7Cj4gKwkJc2NoZWR1bGVfd29yaygmaXQ2NTA1LT5saW5r X3dvcmtzKTsKPiArCX0KPiArCj4gKwlpZiAocmVnMDggJiBJTlRfVklEX0ZJRk9fRVJST1IpIHsK PiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJ2aWRlbyBmaWZvIG92ZXJmbG93IGludGVy cnVwdCIpOwo+ICsJCWl0NjUwNV92aWRlb19yZXNldChpdDY1MDUpOwo+ICsJCWl0NjUwNS0+YXV0 b190cmFpbl9yZXRyeSA9IEFVVE9fVFJBSU5fUkVUUlk7Cj4gKwl9Cj4gKwo+ICsJaWYgKHJlZzA4 ICYgSU5UX0lPX0xBVENIX0ZJRk9fT1ZFUkZMT1cpIHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZF UihkZXYsICJJTyBsYXRjaCBmaWZvIG92ZXJmbG93IGludGVycnVwdCIpOwo+ICsJCWl0NjUwNV92 aWRlb19yZXNldChpdDY1MDUpOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgaXJxcmV0dXJuX3Qg aXQ2NTA1X2ludF90aHJlYWRlZF9oYW5kbGVyKGludCB1bnVzZWQsIHZvaWQgKmRhdGEpCj4gK3sK PiArCXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGRhdGE7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYg PSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCWludCByZWcwNiwgcmVnMDcsIHJlZzA4Owo+ICsK PiArCW1zbGVlcCgxMDApOwo+ICsJbXV0ZXhfbG9jaygmaXQ2NTA1LT5leHRjb25fbG9jayk7Cj4g Kwo+ICsJaWYgKGl0NjUwNS0+ZW5hYmxlX2Rydl9ob2xkIHx8ICFpdDY1MDUtPnBvd2VyZWQpCj4g KwkJZ290byB1bmxvY2s7Cj4gKwo+ICsJcmVnMDYgPSBpdDY1MDVfcmVhZChpdDY1MDUsIElOVF9T VEFUVVNfMDEpOwo+ICsJcmVnMDcgPSBpdDY1MDVfcmVhZChpdDY1MDUsIElOVF9TVEFUVVNfMDIp Owo+ICsJcmVnMDggPSBpdDY1MDVfcmVhZChpdDY1MDUsIElOVF9TVEFUVVNfMDMpOwo+ICsKPiAr CWl0NjUwNV93cml0ZShpdDY1MDUsIElOVF9TVEFUVVNfMDEsIHJlZzA2KTsKPiArCWl0NjUwNV93 cml0ZShpdDY1MDUsIElOVF9TVEFUVVNfMDIsIHJlZzA3KTsKPiArCWl0NjUwNV93cml0ZShpdDY1 MDUsIElOVF9TVEFUVVNfMDMsIHJlZzA4KTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihk ZXYsICJyZWcwNiA9IDB4JTAyeCIsIHJlZzA2KTsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRl diwgInJlZzA3ID0gMHglMDJ4IiwgcmVnMDcpOwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2 LCAicmVnMDggPSAweCUwMngiLCByZWcwOCk7Cj4gKwo+ICsJaWYgKHJlZzA2ICE9IDApCj4gKwkJ aXQ2NTA1X2NoZWNrX3JlZzA2KGl0NjUwNSwgcmVnMDYpOwo+ICsKPiArCWlmIChyZWcwNyAhPSAw KQo+ICsJCWl0NjUwNV9jaGVja19yZWcwNyhpdDY1MDUsIHJlZzA3KTsKPiArCj4gKwlpZiAocmVn MDggIT0gMCkKPiArCQlpdDY1MDVfY2hlY2tfcmVnMDgoaXQ2NTA1LCByZWcwOCk7Cj4gKwo+ICt1 bmxvY2s6Cj4gKwltdXRleF91bmxvY2soJml0NjUwNS0+ZXh0Y29uX2xvY2spOwo+ICsKPiArCXJl dHVybiBJUlFfSEFORExFRDsKPiArfQo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfcG93ZXJvbihz dHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1 MDUtPmNsaWVudC0+ZGV2Owo+ICsJc3RydWN0IGl0NjUwNV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9 ICZpdDY1MDUtPnBkYXRhOwo+ICsJaW50IGVycjsKPiArCj4gKwlpZiAoaXQ2NTA1LT5wb3dlcmVk KSB7Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiaXQ2NTA1IGFscmVhZHkgcG93ZXJl ZCBvbiIpOwo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICsKPiArCWlmIChwZGF0YS0+cHdyMTgpIHsK PiArCQllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHBkYXRhLT5wd3IxOCk7Cj4gKwkJaWYgKGVycikg ewo+ICsJCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIFZERDE4 OiAlZCIsCj4gKwkJCQkJICAgICBlcnIpOwo+ICsJCQlyZXR1cm4gZXJyOwo+ICsJCX0KPiArCX0K PiArCj4gKwlpZiAocGRhdGEtPm92ZGQpIHsKPiArCQkvKiB0aW1lIGludGVydmFsIGJldHdlZW4g SVZERCBhbmQgT1ZERCBhdCBsZWFzdCBiZSAxbXMgKi8KPiArCQl1c2xlZXBfcmFuZ2UoMTAwMCwg MjAwMCk7Cj4gKwkJZXJyID0gcmVndWxhdG9yX2VuYWJsZShwZGF0YS0+b3ZkZCk7Cj4gKwkJaWYg KGVycikgewo+ICsJCQlyZWd1bGF0b3JfZGlzYWJsZShwZGF0YS0+cHdyMTgpOwo+ICsJCQlyZXR1 cm4gZXJyOwo+ICsJCX0KPiArCX0KPiArCS8qIHRpbWUgaW50ZXJ2YWwgYmV0d2VlbiBPVkREIGFu ZCBTWVNSU1ROIGF0IGxlYXN0IGJlIDEwbXMgKi8KPiArCWlmIChwZGF0YS0+Z3Bpb2RfcmVzZXQp IHsKPiArCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKPiArCQlncGlvZF9zZXRfdmFsdWVf Y2Fuc2xlZXAocGRhdGEtPmdwaW9kX3Jlc2V0LCAwKTsKPiArCQl1c2xlZXBfcmFuZ2UoMTAwMCwg MjAwMCk7Cj4gKwkJZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKHBkYXRhLT5ncGlvZF9yZXNldCwg MSk7Cj4gKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7Cj4gKwl9Cj4gKwo+ICsJaXQ2NTA1 X3Jlc2V0X2xvZ2ljKGl0NjUwNSk7Cj4gKwlpdDY1MDVfaW50X21hc2tfZW5hYmxlKGl0NjUwNSk7 Cj4gKwlpdDY1MDVfaW5pdChpdDY1MDUpOwo+ICsJaXQ2NTA1X2xhbmVfb2ZmKGl0NjUwNSk7Cj4g Kwo+ICsJaXQ2NTA1LT5wb3dlcmVkID0gdHJ1ZTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsK PiArc3RhdGljIGludCBpdDY1MDVfcG93ZXJvZmYoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7 Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCXN0cnVj dCBpdDY1MDVfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSAmaXQ2NTA1LT5wZGF0YTsKPiArCWludCBl cnI7Cj4gKwo+ICsJaWYgKCFpdDY1MDUtPnBvd2VyZWQpIHsKPiArCQlEUk1fREVWX0RFQlVHX0RS SVZFUihkZXYsICJwb3dlciBoYWQgYmVlbiBhbHJlYWR5IG9mZiIpOwo+ICsJCXJldHVybiAwOwo+ ICsJfQo+ICsKPiArCWlmIChwZGF0YS0+Z3Bpb2RfcmVzZXQpCj4gKwkJZ3Bpb2Rfc2V0X3ZhbHVl X2NhbnNsZWVwKHBkYXRhLT5ncGlvZF9yZXNldCwgMCk7Cj4gKwo+ICsJaWYgKHBkYXRhLT5wd3Ix OCkgewo+ICsJCWVyciA9IHJlZ3VsYXRvcl9kaXNhYmxlKHBkYXRhLT5wd3IxOCk7Cj4gKwkJaWYg KGVycikKPiArCQkJcmV0dXJuIGVycjsKPiArCX0KPiArCj4gKwlpZiAocGRhdGEtPm92ZGQpIHsK PiArCQllcnIgPSByZWd1bGF0b3JfZGlzYWJsZShwZGF0YS0+b3ZkZCk7Cj4gKwkJaWYgKGVycikK PiArCQkJcmV0dXJuIGVycjsKPiArCX0KPiArCj4gKwlpdDY1MDUtPnBvd2VyZWQgPSBmYWxzZTsK PiArCWtmcmVlKGl0NjUwNS0+ZWRpZCk7Cj4gKwlpdDY1MDUtPmVkaWQgPSBOVUxMOwo+ICsJaXQ2 NTA1LT5zaW5rX2NvdW50ID0gMDsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGlj IGlubGluZSBzdHJ1Y3QgaXQ2NTA1ICpjb25uZWN0b3JfdG9faXQ2NTA1KHN0cnVjdCBkcm1fY29u bmVjdG9yICpjKQo+ICt7Cj4gKwlyZXR1cm4gY29udGFpbmVyX29mKGMsIHN0cnVjdCBpdDY1MDUs IGNvbm5lY3Rvcik7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaXQ2NTA1X2dldF9tb2RlcyhzdHJ1 Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ICt7Cj4gKwlzdHJ1Y3QgaXQ2NTA1ICppdDY1 MDUgPSBjb25uZWN0b3JfdG9faXQ2NTA1KGNvbm5lY3Rvcik7Cj4gKwlpbnQgZXJyLCBudW1fbW9k ZXMgPSAwLCBpOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUwNS0+Y2xpZW50LT5kZXY7 Cj4gKwo+ICsJaWYgKGl0NjUwNS0+ZWRpZCkKPiArCQlyZXR1cm4gZHJtX2FkZF9lZGlkX21vZGVz KGNvbm5lY3RvciwgaXQ2NTA1LT5lZGlkKTsKPiArCj4gKwltdXRleF9sb2NrKCZpdDY1MDUtPm1v ZGVfbG9jayk7Cj4gKwlpbml0X2NvbXBsZXRpb24oJml0NjUwNS0+d2FpdF9lZGlkX2NvbXBsZXRl KTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Cj4gKwkJaWYgKCFpdDY1MDVfZ2V0 X3NpbmtfaHBkX3N0YXR1cyhpdDY1MDUpKQo+ICsJCQlnb3RvIHVubG9jazsKPiArCj4gKwkJaXQ2 NTA1LT5lZGlkID0KPiArCQlkcm1fZG9fZ2V0X2VkaWQoJml0NjUwNS0+Y29ubmVjdG9yLCBpdDY1 MDVfZ2V0X2VkaWRfYmxvY2ssCj4gKwkJCQlpdDY1MDUpOwo+ICsKPiArCQlpZiAoaXQ2NTA1LT5l ZGlkKQo+ICsJCQlicmVhazsKPiArCX0KPiArCWlmICghaXQ2NTA1LT5lZGlkKSB7Cj4gKwkJRFJN X0RFVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gcmVhZCBFRElEIik7Cj4gKwkJZ290byB1bmxvY2s7 Cj4gKwl9Cj4gKwo+ICsJZXJyID0gZHJtX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShj b25uZWN0b3IsIGl0NjUwNS0+ZWRpZCk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJRFJNX0RFVl9FUlJP UihkZXYsICJGYWlsZWQgdG8gdXBkYXRlIEVESUQgcHJvcGVydHk6ICVkIiwgZXJyKTsKPiArCQln b3RvIHVubG9jazsKPiArCX0KPiArCj4gKwludW1fbW9kZXMgPSBkcm1fYWRkX2VkaWRfbW9kZXMo Y29ubmVjdG9yLCBpdDY1MDUtPmVkaWQpOwo+ICsKPiArdW5sb2NrOgo+ICsJY29tcGxldGUoJml0 NjUwNS0+d2FpdF9lZGlkX2NvbXBsZXRlKTsKPiArCW11dGV4X3VubG9jaygmaXQ2NTA1LT5tb2Rl X2xvY2spOwo+ICsKPiArCXJldHVybiBudW1fbW9kZXM7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25z dCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgaXQ2NTA1X2Nvbm5lY3Rvcl9oZWxw ZXJfZnVuY3MgPSB7Cj4gKwkuZ2V0X21vZGVzID0gaXQ2NTA1X2dldF9tb2RlcywKPiArfTsKPiAr Cj4gK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGl0NjUwNV9kZXRlY3Qoc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiArCQkJCQkgICAgICAgYm9vbCBmb3JjZSkKPiAr ewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gY29ubmVjdG9yX3RvX2l0NjUwNShjb25uZWN0 b3IpOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUwNS0+Y2xpZW50LT5kZXY7Cj4gKwll bnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29u bmVjdGVkOwo+ICsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIml0NjUwNS0+c2lua19j b3VudDolZCBwb3dlcmVkOiVkIiwKPiArCQkJICAgICBpdDY1MDUtPnNpbmtfY291bnQsIGl0NjUw NS0+cG93ZXJlZCk7Cj4gKwo+ICsJbXV0ZXhfbG9jaygmaXQ2NTA1LT5tb2RlX2xvY2spOwo+ICsK PiArCWlmICghaXQ2NTA1LT5wb3dlcmVkKQo+ICsJCWdvdG8gdW5sb2NrOwo+ICsKPiArCWlmIChp dDY1MDUtPmVuYWJsZV9kcnZfaG9sZCkgewo+ICsJCXN0YXR1cyA9IGl0NjUwNV9nZXRfc2lua19o cGRfc3RhdHVzKGl0NjUwNSkgPwo+ICsJCQkJCWNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkIDoK PiArCQkJCQljb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKPiArCQlnb3RvIHVubG9jazsK PiArCX0KPiArCj4gKwlpZiAoaXQ2NTA1X2dldF9zaW5rX2hwZF9zdGF0dXMoaXQ2NTA1KSkgewo+ ICsJCWl0NjUwNV9hdXhfb24oaXQ2NTA1KTsKPiArCQlpdDY1MDVfZHJtX2RwX2xpbmtfcHJvYmUo Jml0NjUwNS0+YXV4LCAmaXQ2NTA1LT5saW5rKTsKPiArCQlpdDY1MDVfZHJtX2RwX2xpbmtfcG93 ZXJfdXAoJml0NjUwNS0+YXV4LCAmaXQ2NTA1LT5saW5rKTsKPiArCQlpdDY1MDUtPmF1dG9fdHJh aW5fcmV0cnkgPSBBVVRPX1RSQUlOX1JFVFJZOwo+ICsKPiArCQlpZiAoaXQ2NTA1LT5kcGNkWzBd ID09IDApIHsKPiArCQkJaXQ2NTA1X2dldF9kcGNkKGl0NjUwNSwgRFBfRFBDRF9SRVYsIGl0NjUw NS0+ZHBjZCwKPiArCQkJCQlBUlJBWV9TSVpFKGl0NjUwNS0+ZHBjZCkpOwo+ICsJCQlpdDY1MDVf dmFyaWFibGVfY29uZmlnKGl0NjUwNSk7Cj4gKwkJCWl0NjUwNV9wYXJzZV9saW5rX2NhcGFiaWxp dGllcyhpdDY1MDUpOwo+ICsJCX0KPiArCj4gKwkJaXQ2NTA1LT5zaW5rX2NvdW50ID0gRFBfR0VU X1NJTktfQ09VTlQoaXQ2NTA1X2RwY2RfcmVhZChpdDY1MDUsCj4gKwkJCQkJCSAgICAgICBEUF9T SU5LX0NPVU5UKSk7Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiaXQ2NTA1LT5zaW5r X2NvdW50OiVkIGJyYW5jaDolZCIsCj4gKwkJCQkgICAgIGl0NjUwNS0+c2lua19jb3VudCwgaXQ2 NTA1LT5icmFuY2hfZGV2aWNlKTsKPiArCj4gKwkJaWYgKGl0NjUwNS0+YnJhbmNoX2RldmljZSkg ewo+ICsJCQlzdGF0dXMgPSAoaXQ2NTA1LT5zaW5rX2NvdW50ICE9IDApID8KPiArCQkJCSBjb25u ZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCA6Cj4gKwkJCQkgY29ubmVjdG9yX3N0YXR1c19kaXNjb25u ZWN0ZWQ7Cj4gKwkJfSBlbHNlIHsKPiArCQkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25u ZWN0ZWQ7Cj4gKwkJfQo+ICsJfSBlbHNlIHsKPiArCQlpdDY1MDUtPnNpbmtfY291bnQgPSAwOwo+ ICsJCW1lbXNldChpdDY1MDUtPmRwY2QsIDAsIHNpemVvZihpdDY1MDUtPmRwY2QpKTsKPiArCX0K PiArCj4gK3VubG9jazoKPiArCWlmIChpdDY1MDUtPmNvbm5lY3Rvcl9zdGF0dXMgIT0gc3RhdHVz KSB7Cj4gKwkJaXQ2NTA1LT5jb25uZWN0b3Jfc3RhdHVzID0gc3RhdHVzOwo+ICsJCWl0NjUwNV9w bHVnZ2VkX3N0YXR1c190b19jb2RlYyhpdDY1MDUpOwo+ICsJfQo+ICsKPiArCW11dGV4X3VubG9j aygmaXQ2NTA1LT5tb2RlX2xvY2spOwo+ICsKPiArCXJldHVybiBzdGF0dXM7Cj4gK30KPiArCj4g K3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyBpdDY1MDVfY29ubmVjdG9y X2Z1bmNzID0gewo+ICsJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25u ZWN0b3JfbW9kZXMsCj4gKwkuZGV0ZWN0ID0gaXQ2NTA1X2RldGVjdCwKPiArCS5kZXN0cm95ID0g ZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwLAo+ICsJLnJlc2V0ID0gZHJtX2F0b21pY19oZWxwZXJfY29u bmVjdG9yX3Jlc2V0LAo+ICsJLmF0b21pY19kdXBsaWNhdGVfc3RhdGUgPSBkcm1fYXRvbWljX2hl bHBlcl9jb25uZWN0b3JfZHVwbGljYXRlX3N0YXRlLAo+ICsJLmF0b21pY19kZXN0cm95X3N0YXRl ID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2Rlc3Ryb3lfc3RhdGUsCj4gK307Cj4gKwo+ ICtzdGF0aWMgaW50IGl0NjUwNV9leHRjb25fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2Nr ICpzZWxmLAo+ICsJCQkJICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCj4gK3sKPiAr CXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGNvbnRhaW5lcl9vZihzZWxmLCBzdHJ1Y3QgaXQ2NTA1 LCBldmVudF9uYik7Cj4gKwo+ICsJc2NoZWR1bGVfd29yaygmaXQ2NTA1LT5leHRjb25fd3EpOwo+ ICsJcmV0dXJuIE5PVElGWV9ET05FOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfZXh0 Y29uX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICt7Cj4gKwlzdHJ1Y3QgaXQ2NTA1 ICppdDY1MDUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGl0NjUwNSwgZXh0Y29uX3dxKTsK PiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsJaW50IHN0 YXRlID0gZXh0Y29uX2dldF9zdGF0ZShpdDY1MDUtPmV4dGNvbiwgRVhUQ09OX0RJU1BfRFApOwo+ ICsJdW5zaWduZWQgaW50IHB3cm9mZnJldHJ5ID0gMDsKPiArCj4gKwlpZiAoaXQ2NTA1LT5lbmFi bGVfZHJ2X2hvbGQpCj4gKwkJcmV0dXJuOwo+ICsKPiArCW11dGV4X2xvY2soJml0NjUwNS0+ZXh0 Y29uX2xvY2spOwo+ICsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIkVYVENPTl9ESVNQ X0RQID0gMHglMDJ4Iiwgc3RhdGUpOwo+ICsJaWYgKHN0YXRlID4gMCkgewo+ICsJCURSTV9ERVZf REVCVUdfRFJJVkVSKGRldiwgInN0YXJ0IHRvIHBvd2VyIG9uIik7Cj4gKwkJbXNsZWVwKDEwMCk7 Cj4gKwkJaXQ2NTA1X3Bvd2Vyb24oaXQ2NTA1KTsKPiArCX0gZWxzZSB7Cj4gKwkJRFJNX0RFVl9E RUJVR19EUklWRVIoZGV2LCAic3RhcnQgdG8gcG93ZXIgb2ZmIik7Cj4gKwkJd2hpbGUgKGl0NjUw NV9wb3dlcm9mZihpdDY1MDUpICYmIHB3cm9mZnJldHJ5KysgPCA1KSB7Cj4gKwkJCURSTV9ERVZf REVCVUdfRFJJVkVSKGRldiwgInBvd2VyIG9mZiBmYWlsICVkIHRpbWVzIiwKPiArCQkJCQkgICAg IHB3cm9mZnJldHJ5KTsKPiArCQl9Cj4gKwo+ICsJCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChp dDY1MDUtPmNvbm5lY3Rvci5kZXYpOwo+ICsJCW1lbXNldChpdDY1MDUtPmRwY2QsIDAsIHNpemVv ZihpdDY1MDUtPmRwY2QpKTsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJwb3dlciBv ZmYgaXQ2NTA1IHN1Y2Nlc3MhIik7Cj4gKwl9Cj4gKwo+ICsJbXV0ZXhfdW5sb2NrKCZpdDY1MDUt PmV4dGNvbl9sb2NrKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfdXNlX25vdGlmaWVy X21vZHVsZShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWludCByZXQ7Cj4gKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCj4gKwlpdDY1MDUtPmV2 ZW50X25iLm5vdGlmaWVyX2NhbGwgPSBpdDY1MDVfZXh0Y29uX25vdGlmaWVyOwo+ICsJSU5JVF9X T1JLKCZpdDY1MDUtPmV4dGNvbl93cSwgaXQ2NTA1X2V4dGNvbl93b3JrKTsKPiArCXJldCA9IGRl dm1fZXh0Y29uX3JlZ2lzdGVyX25vdGlmaWVyKCZpdDY1MDUtPmNsaWVudC0+ZGV2LAo+ICsJCQkJ CSAgICBpdDY1MDUtPmV4dGNvbiwgRVhUQ09OX0RJU1BfRFAsCj4gKwkJCQkJICAgICZpdDY1MDUt PmV2ZW50X25iKTsKPiArCWlmIChyZXQpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwgImZhaWxl ZCB0byByZWdpc3RlciBub3RpZmllciBmb3IgRFAiKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ ICsKPiArCXNjaGVkdWxlX3dvcmsoJml0NjUwNS0+ZXh0Y29uX3dxKTsKPiArCj4gKwlyZXR1cm4g MDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X3JlbW92ZV9ub3RpZmllcl9tb2R1bGUo c3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpZiAoaXQ2NTA1LT5leHRjb24pIHsKPiAr CQlkZXZtX2V4dGNvbl91bnJlZ2lzdGVyX25vdGlmaWVyKCZpdDY1MDUtPmNsaWVudC0+ZGV2LAo+ ICsJCQkJCQlpdDY1MDUtPmV4dGNvbiwJRVhUQ09OX0RJU1BfRFAsCj4gKwkJCQkJCSZpdDY1MDUt PmV2ZW50X25iKTsKPiArCj4gKwkJZmx1c2hfd29yaygmaXQ2NTA1LT5leHRjb25fd3EpOwo+ICsJ fQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBpdDY1MDVfZGVsYXllZF9h dWRpbyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCj4gK3sKPiArCXN0cnVjdCBpdDY1MDUgKml0 NjUwNSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXQ2NTA1LAo+ICsJCQkJCSAgICAgZGVs YXllZF9hdWRpby53b3JrKTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUigmaXQ2NTA1LT5j bGllbnQtPmRldiwgInN0YXJ0Iik7Cj4gKwo+ICsJaWYgKCFpdDY1MDUtPnBvd2VyZWQpCj4gKwkJ cmV0dXJuOwo+ICsKPiArCWlmICghaXQ2NTA1LT5lbmFibGVfZHJ2X2hvbGQpCj4gKwkJaXQ2NTA1 X2VuYWJsZV9hdWRpbyhpdDY1MDUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IF9fbWF5YmVfdW51 c2VkIGl0NjUwNV9hdWRpb19zZXR1cF9od19wYXJhbXMoc3RydWN0IGl0NjUwNSAqaXQ2NTA1LAo+ ICsJCQkJCXN0cnVjdCBoZG1pX2NvZGVjX3BhcmFtcyAqcGFyYW1zKQo+ICt7Cj4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCWludCBpID0gMDsKPiArCj4g KwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICIlcyAlZCBIeiwgJWQgYml0LCAlZCBjaGFubmVs c1xuIiwgX19mdW5jX18sCj4gKwkJCSAgICAgcGFyYW1zLT5zYW1wbGVfcmF0ZSwgcGFyYW1zLT5z YW1wbGVfd2lkdGgsCj4gKwkJCSAgICAgcGFyYW1zLT5jZWEuY2hhbm5lbHMpOwo+ICsKPiArCWlm ICghaXQ2NTA1LT5icmlkZ2UuZW5jb2RlcikKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCj4gKwlp ZiAocGFyYW1zLT5jZWEuY2hhbm5lbHMgPD0gMSB8fCBwYXJhbXMtPmNlYS5jaGFubmVscyA+IDgp IHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJjaGFubmVsIG51bWJlcjogJWQgbm90 IHN1cHBvcnQiLAo+ICsJCQkJICAgICBpdDY1MDUtPmF1ZGlvLmNoYW5uZWxfY291bnQpOwo+ICsJ CXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCWl0NjUwNS0+YXVkaW8uY2hhbm5lbF9jb3Vu dCA9IHBhcmFtcy0+Y2VhLmNoYW5uZWxzOwo+ICsKPiArCXdoaWxlIChpIDwgQVJSQVlfU0laRShh dWRpb19zYW1wbGVfcmF0ZV9tYXApICYmCj4gKwkgICAgICAgcGFyYW1zLT5zYW1wbGVfcmF0ZSAh PQo+ICsJCSAgICAgICBhdWRpb19zYW1wbGVfcmF0ZV9tYXBbaV0uc2FtcGxlX3JhdGVfdmFsdWUp IHsKPiArCQlpKys7Cj4gKwl9Cj4gKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGF1ZGlvX3NhbXBsZV9y YXRlX21hcCkpIHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJzYW1wbGUgcmF0ZTog JWQgSHogbm90IHN1cHBvcnQiLAo+ICsJCQkJICAgICBwYXJhbXMtPnNhbXBsZV9yYXRlKTsKPiAr CQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCWl0NjUwNS0+YXVkaW8uc2FtcGxlX3JhdGUgPSBh dWRpb19zYW1wbGVfcmF0ZV9tYXBbaV0ucmF0ZTsKPiArCj4gKwlzd2l0Y2ggKHBhcmFtcy0+c2Ft cGxlX3dpZHRoKSB7Cj4gKwljYXNlIDE2Ogo+ICsJCWl0NjUwNS0+YXVkaW8ud29yZF9sZW5ndGgg PSBXT1JEX0xFTkdUSF8xNkJJVDsKPiArCQlicmVhazsKPiArCWNhc2UgMTg6Cj4gKwkJaXQ2NTA1 LT5hdWRpby53b3JkX2xlbmd0aCA9IFdPUkRfTEVOR1RIXzE4QklUOwo+ICsJCWJyZWFrOwo+ICsJ Y2FzZSAyMDoKPiArCQlpdDY1MDUtPmF1ZGlvLndvcmRfbGVuZ3RoID0gV09SRF9MRU5HVEhfMjBC SVQ7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIDI0Ogo+ICsJY2FzZSAzMjoKPiArCQlpdDY1MDUtPmF1 ZGlvLndvcmRfbGVuZ3RoID0gV09SRF9MRU5HVEhfMjRCSVQ7Cj4gKwkJYnJlYWs7Cj4gKwlkZWZh dWx0Ogo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIndvcmRsZW5ndGg6ICVkIGJpdCBu b3Qgc3VwcG9ydCIsCj4gKwkJCQkgICAgIHBhcmFtcy0+c2FtcGxlX3dpZHRoKTsKPiArCQlyZXR1 cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZv aWQgX19tYXliZV91bnVzZWQgaXQ2NTA1X2F1ZGlvX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRl diwgdm9pZCAqZGF0YSkKPiArewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gZGV2X2dldF9k cnZkYXRhKGRldik7Cj4gKwo+ICsJaWYgKGl0NjUwNS0+cG93ZXJlZCkKPiArCQlpdDY1MDVfZGlz YWJsZV9hdWRpbyhpdDY1MDUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IF9fbWF5YmVfdW51c2Vk IGl0NjUwNV9hdWRpb19ob29rX3BsdWdnZWRfY2Ioc3RydWN0IGRldmljZSAqZGV2LAo+ICsJCQkJ CQkgICAgICAgdm9pZCAqZGF0YSwKPiArCQkJCQkJICAgICAgIGhkbWlfY29kZWNfcGx1Z2dlZF9j YiBmbiwKPiArCQkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmNvZGVjX2RldikKPiArewo+ICsJ c3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gZGF0YTsKPiArCj4gKwlpdDY1MDUtPnBsdWdnZWRfY2Ig PSBmbjsKPiArCWl0NjUwNS0+Y29kZWNfZGV2ID0gY29kZWNfZGV2Owo+ICsJaXQ2NTA1X3BsdWdn ZWRfc3RhdHVzX3RvX2NvZGVjKGl0NjUwNSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4g K3N0YXRpYyBpbmxpbmUgc3RydWN0IGl0NjUwNSAqYnJpZGdlX3RvX2l0NjUwNShzdHJ1Y3QgZHJt X2JyaWRnZSAqYnJpZGdlKQo+ICt7Cj4gKwlyZXR1cm4gY29udGFpbmVyX29mKGJyaWRnZSwgc3Ry dWN0IGl0NjUwNSwgYnJpZGdlKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2JyaWRn ZV9tb2RlX3NldChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+ICsJCQkJICAgY29uc3Qgc3Ry dWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCj4gKwkJCQkgICBjb25zdCBzdHJ1Y3QgZHJtX2Rp c3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKPiArewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1 ID0gYnJpZGdlX3RvX2l0NjUwNShicmlkZ2UpOwo+ICsJc3RydWN0IGhkbWlfYXZpX2luZm9mcmFt ZSBmcmFtZTsKPiArCWludCBlcnI7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5j bGllbnQtPmRldjsKPiArCj4gKwlpZiAoV0FSTl9PTighaXQ2NTA1LT5wb3dlcmVkKSkKPiArCQly ZXR1cm47Cj4gKwo+ICsJbXV0ZXhfbG9jaygmaXQ2NTA1LT5tb2RlX2xvY2spOwo+ICsKPiArCWVy ciA9IGRybV9oZG1pX2F2aV9pbmZvZnJhbWVfZnJvbV9kaXNwbGF5X21vZGUoJmZyYW1lLAo+ICsJ CQkJCQkgICAgICAgJml0NjUwNS0+Y29ubmVjdG9yLAo+ICsJCQkJCQkgICAgICAgYWRqdXN0ZWRf bW9kZSk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJGYWlsZWQgdG8g c2V0dXAgQVZJIGluZm9mcmFtZTogJWQiLCBlcnIpOwo+ICsJCWdvdG8gdW5sb2NrOwo+ICsJfQo+ ICsKPiArCWl0NjUwNV91cGRhdGVfdmlkZW9fcHJhcm1ldGVyKGl0NjUwNSwgYWRqdXN0ZWRfbW9k ZSk7Cj4gKwo+ICsJZXJyID0gaXQ2NTA1X3NlbmRfdmlkZW9faW5mb2ZyYW1lKGl0NjUwNSwgJmZy YW1lKTsKPiArCWlmIChlcnIpCj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gc2Vu ZCBBVkkgaW5mb2ZyYW1lOiAlZCIsIGVycik7Cj4gKwo+ICt1bmxvY2s6Cj4gKwltdXRleF91bmxv Y2soJml0NjUwNS0+bW9kZV9sb2NrKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfYnJp ZGdlX2F0dGFjaChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+ICsJCQkJZW51bSBkcm1fYnJp ZGdlX2F0dGFjaF9mbGFncyBmbGFncykKPiArewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0g YnJpZGdlX3RvX2l0NjUwNShicmlkZ2UpOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUw NS0+Y2xpZW50LT5kZXY7Cj4gKwlpbnQgZXJyOwo+ICsKPiArCWlmICghYnJpZGdlLT5lbmNvZGVy KSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJQYXJlbnQgZW5jb2RlciBvYmplY3Qgbm90IGZv dW5kIik7Cj4gKwkJcmV0dXJuIC1FTk9ERVY7Cj4gKwl9Cj4gKwo+ICsJZXJyID0gZHJtX2Nvbm5l Y3Rvcl9pbml0KGJyaWRnZS0+ZGV2LCAmaXQ2NTA1LT5jb25uZWN0b3IsCj4gKwkJCQkgJml0NjUw NV9jb25uZWN0b3JfZnVuY3MsCj4gKwkJCQkgRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0 KTsKPiArCWlmIChlcnIgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJGYWlsZWQgdG8g aW5pdGlhbGl6ZSBjb25uZWN0b3I6ICVkIiwgZXJyKTsKPiArCQlyZXR1cm4gZXJyOwo+ICsJfQo+ ICsKPiArCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmaXQ2NTA1LT5jb25uZWN0b3IsCj4gKwkJ CQkgJml0NjUwNV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKPiArCj4gKwlpdDY1MDUtPmNvbm5l Y3Rvci5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfSFBEOwo+ICsKPiArCWVyciA9IGRybV9j b25uZWN0b3JfYXR0YWNoX2VuY29kZXIoJml0NjUwNS0+Y29ubmVjdG9yLCBicmlkZ2UtPmVuY29k ZXIpOwo+ICsJaWYgKGVyciA8IDApIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwgIkZhaWxlZCB0 byBsaW5rIHVwIGNvbm5lY3RvciB0byBlbmNvZGVyOiAlZCIsCj4gKwkJCSAgICAgIGVycik7Cj4g KwkJZ290byBjbGVhbnVwX2Nvbm5lY3RvcjsKPiArCX0KPiArCj4gKwllcnIgPSBkcm1fY29ubmVj dG9yX3JlZ2lzdGVyKCZpdDY1MDUtPmNvbm5lY3Rvcik7Cj4gKwlpZiAoZXJyIDwgMCkgewo+ICsJ CURSTV9ERVZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNvbm5lY3RvcjogJWQiLCBl cnIpOwo+ICsJCWdvdG8gY2xlYW51cF9jb25uZWN0b3I7Cj4gKwl9Cj4gKwo+ICsJaWYgKGl0NjUw NS0+ZXh0Y29uKSB7Cj4gKwkJZXJyID0gaXQ2NTA1X3VzZV9ub3RpZmllcl9tb2R1bGUoaXQ2NTA1 KTsKPiArCQlpZiAoZXJyIDwgMCkgewo+ICsJCQlkcm1fY29ubmVjdG9yX3VucmVnaXN0ZXIoJml0 NjUwNS0+Y29ubmVjdG9yKTsKPiArCQkJZ290byBjbGVhbnVwX2Nvbm5lY3RvcjsKPiArCQl9Cj4g Kwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gKwo+ICtjbGVhbnVwX2Nvbm5lY3RvcjoKPiArCWRybV9j b25uZWN0b3JfY2xlYW51cCgmaXQ2NTA1LT5jb25uZWN0b3IpOwo+ICsJcmV0dXJuIGVycjsKPiAr fQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2JyaWRnZV9kZXRhY2goc3RydWN0IGRybV9icmlk Z2UgKmJyaWRnZSkKPiArewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gYnJpZGdlX3RvX2l0 NjUwNShicmlkZ2UpOwo+ICsKPiArCWZsdXNoX3dvcmsoJml0NjUwNS0+bGlua193b3Jrcyk7Cj4g KwlpdDY1MDVfcmVtb3ZlX25vdGlmaWVyX21vZHVsZShpdDY1MDUpOwo+ICsJZHJtX2Nvbm5lY3Rv cl91bnJlZ2lzdGVyKCZpdDY1MDUtPmNvbm5lY3Rvcik7Cj4gKwlkcm1fY29ubmVjdG9yX2NsZWFu dXAoJml0NjUwNS0+Y29ubmVjdG9yKTsKPiArfQo+ICsKPiArc3RhdGljIGVudW0gZHJtX21vZGVf c3RhdHVzCj4gK2l0NjUwNV9icmlkZ2VfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJp ZGdlLAo+ICsJCQkgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X2luZm8gKmluZm8sCj4gKwkJCSBj b25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiArewo+ICsJc3RydWN0IGl0NjUw NSAqaXQ2NTA1ID0gYnJpZGdlX3RvX2l0NjUwNShicmlkZ2UpOwo+ICsKPiArCWlmIChtb2RlLT5m bGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKQo+ICsJCXJldHVybiBNT0RFX05PX0lOVEVS TEFDRTsKPiArCj4gKwlpZiAobW9kZS0+Y2xvY2sgPiBEUElfUElYRUxfQ0xLX01BWCkKPiArCQly ZXR1cm4gTU9ERV9DTE9DS19ISUdIOwo+ICsKPiArCWl0NjUwNS0+dmlkZW9faW5mby5jbG9jayA9 IG1vZGUtPmNsb2NrOwo+ICsKPiArCXJldHVybiBNT0RFX09LOwo+ICt9Cj4gKwo+ICtzdGF0aWMg dm9pZCBpdDY1MDVfYnJpZGdlX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ICt7 Cj4gKwlzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUgPSBicmlkZ2VfdG9faXQ2NTA1KGJyaWRnZSk7Cj4g Kwo+ICsJaXQ2NTA1X2ludF9tYXNrX2VuYWJsZShpdDY1MDUpOwo+ICsJaXQ2NTA1X3ZpZGVvX3Jl c2V0KGl0NjUwNSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9icmlkZ2VfZGlzYWJs ZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ICt7Cj4gKwlzdHJ1Y3QgaXQ2NTA1ICppdDY1 MDUgPSBicmlkZ2VfdG9faXQ2NTA1KGJyaWRnZSk7Cj4gKwo+ICsJaWYgKGl0NjUwNS0+cG93ZXJl ZCkKPiArCQlpdDY1MDVfdmlkZW9fZGlzYWJsZShpdDY1MDUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGRybV9icmlkZ2VfZnVuY3MgaXQ2NTA1X2JyaWRnZV9mdW5jcyA9IHsKPiAr CS5hdHRhY2ggPSBpdDY1MDVfYnJpZGdlX2F0dGFjaCwKPiArCS5kZXRhY2ggPSBpdDY1MDVfYnJp ZGdlX2RldGFjaCwKPiArCS5tb2RlX3ZhbGlkID0gaXQ2NTA1X2JyaWRnZV9tb2RlX3ZhbGlkLAo+ ICsJLm1vZGVfc2V0ID0gaXQ2NTA1X2JyaWRnZV9tb2RlX3NldCwKPiArCS5lbmFibGUgPSBpdDY1 MDVfYnJpZGdlX2VuYWJsZSwKPiArCS5kaXNhYmxlID0gaXQ2NTA1X2JyaWRnZV9kaXNhYmxlLAo+ ICt9Owo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfYnJpZGdlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNl ICpkZXYpCj4gK3sKPiArCXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGRldl9nZXRfZHJ2ZGF0YShk ZXYpOwo+ICsKPiArCXJldHVybiBpdDY1MDVfcG93ZXJvbihpdDY1MDUpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IGl0NjUwNV9icmlkZ2Vfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gK3sK PiArCXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsKPiAr CXJldHVybiBpdDY1MDVfcG93ZXJvZmYoaXQ2NTA1KTsKPiArfQo+ICsKPiArc3RhdGljIFNJTVBM RV9ERVZfUE1fT1BTKGl0NjUwNV9icmlkZ2VfcG1fb3BzLCBpdDY1MDVfYnJpZGdlX3N1c3BlbmQs Cj4gKwkJCSBpdDY1MDVfYnJpZGdlX3Jlc3VtZSk7Cj4gKwo+ICsKPiArCj4gK3N0YXRpYyBpbnQg aXQ2NTA1X2luaXRfcGRhdGEoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlzdHJ1Y3Qg aXQ2NTA1X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gJml0NjUwNS0+cGRhdGE7Cj4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCj4gKwkvKiAxLjBWIGRpZ2l0 YWwgY29yZSBwb3dlciByZWd1bGF0b3IgICovCj4gKwlwZGF0YS0+cHdyMTggPSBkZXZtX3JlZ3Vs YXRvcl9nZXQoZGV2LCAicHdyMTgiKTsKPiArCWlmIChJU19FUlIocGRhdGEtPnB3cjE4KSkgewo+ ICsJCURSTV9ERVZfRVJST1IoZGV2LCAicHdyMTggcmVndWxhdG9yIG5vdCBmb3VuZCIpOwo+ICsJ CXJldHVybiBQVFJfRVJSKHBkYXRhLT5wd3IxOCk7Cj4gKwl9Cj4gKwo+ICsJcGRhdGEtPm92ZGQg PSBkZXZtX3JlZ3VsYXRvcl9nZXQoZGV2LCAib3ZkZCIpOwo+ICsJaWYgKElTX0VSUihwZGF0YS0+ b3ZkZCkpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwgIm92ZGQgcmVndWxhdG9yIG5vdCBmb3Vu ZCIpOwo+ICsJCXJldHVybiBQVFJfRVJSKHBkYXRhLT5vdmRkKTsKPiArCX0KPiArCj4gKwlwZGF0 YS0+Z3Bpb2RfcmVzZXQgPSBkZXZtX2dwaW9kX2dldChkZXYsICJyZXNldCIsIEdQSU9EX09VVF9I SUdIKTsKPiArCWlmIChJU19FUlIocGRhdGEtPmdwaW9kX3Jlc2V0KSkgewo+ICsJCURSTV9ERVZf RVJST1IoZGV2LCAiZ3Bpb2RfcmVzZXQgZ3BpbyBub3QgZm91bmQiKTsKPiArCQlyZXR1cm4gUFRS X0VSUihwZGF0YS0+Z3Bpb2RfcmVzZXQpOwo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfcGFyc2VfZHQoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCXUz MiBhZmVfc2V0dGluZyA9IDA7Cj4gKwo+ICsJaXQ2NTA1LT5sYW5lX3N3YXBfZGlzYWJsZWQgPSB0 cnVlOwo+ICsJaXQ2NTA1LT5hZmVfc2V0dGluZyA9IDA7Cj4gKwo+ICsJaXQ2NTA1LT5sYW5lX3N3 YXBfZGlzYWJsZWQgPQo+ICsJCWRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAibm8tbGFu ZXN3YXAiKTsKPiArCj4gKwlpZiAoaXQ2NTA1LT5sYW5lX3N3YXBfZGlzYWJsZWQpCj4gKwkJaXQ2 NTA1LT5sYW5lX3N3YXAgPSBmYWxzZTsKPiArCj4gKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRf dTMyKGRldiwgImFmZS1zZXR0aW5nIiwgJmFmZV9zZXR0aW5nKSA9PSAwKQo+ICsJCWlmIChhZmVf c2V0dGluZyA+PSBBUlJBWV9TSVpFKGFmZV9zZXR0aW5nX3RhYmxlKSkgewo+ICsJCQlEUk1fREVW X0VSUk9SKGRldiwgImFmZSBzZXR0aW5nIGVycm9yLCB1c2UgZGVmYXVsdCIpOwo+ICsJCQlhZmVf c2V0dGluZyA9IDA7Cj4gKwkJfQo+ICsKPiArCWl0NjUwNS0+YWZlX3NldHRpbmcgPSBhZmVfc2V0 dGluZzsKPiArfQo+ICsKPiArc3RhdGljIHNzaXplX3QgcHJpbnRfdGltaW5nX3Nob3coc3RydWN0 IGRldmljZSAqZGV2LAo+ICsJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFy ICpidWYpCj4gK3sKPiArCXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGRldl9nZXRfZHJ2ZGF0YShk ZXYpOwo+ICsJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnZpZCA9ICZpdDY1MDUtPnZpZGVvX2lu Zm87Cj4gKwljaGFyICpzdHIgPSBidWYsICplbmQgPSBidWYgKyBQQUdFX1NJWkU7Cj4gKwo+ICsJ aXQ2NTA1X2NhbGNfdmlkZW9faW5mbyhpdDY1MDUpOwo+ICsJc3RyICs9IHNjbnByaW50ZihzdHIs IGVuZCAtIHN0ciwgIi0tLXZpZGVvIHRpbWluZy0tLVxuIik7Cj4gKwlzdHIgKz0gc2NucHJpbnRm KHN0ciwgZW5kIC0gc3RyLCAiUENMSzolZC4lMDNkTUh6XG4iLAo+ICsJCQkgdmlkLT5jbG9jayAv IDEwMDAsIHZpZC0+Y2xvY2sgJSAxMDAwKTsKPiArCXN0ciArPSBzY25wcmludGYoc3RyLCBlbmQg LSBzdHIsICJIVG90YWw6JWRcbiIsIHZpZC0+aHRvdGFsKTsKPiArCXN0ciArPSBzY25wcmludGYo c3RyLCBlbmQgLSBzdHIsICJIQWN0aXZlOiVkXG4iLCB2aWQtPmhkaXNwbGF5KTsKPiArCXN0ciAr PSBzY25wcmludGYoc3RyLCBlbmQgLSBzdHIsICJIRnJvbnRQb3JjaDolZFxuIiwKPiArCQkJIHZp ZC0+aHN5bmNfc3RhcnQgLSB2aWQtPmhkaXNwbGF5KTsKPiArCXN0ciArPSBzY25wcmludGYoc3Ry LCBlbmQgLSBzdHIsICJIU3luY1dpZHRoOiVkXG4iLAo+ICsJCQkgdmlkLT5oc3luY19lbmQgLSB2 aWQtPmhzeW5jX3N0YXJ0KTsKPiArCXN0ciArPSBzY25wcmludGYoc3RyLCBlbmQgLSBzdHIsICJI QmFja1BvcmNoOiVkXG4iLAo+ICsJCQkgdmlkLT5odG90YWwgLSB2aWQtPmhzeW5jX2VuZCk7Cj4g KwlzdHIgKz0gc2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAiVlRvdGFsOiVkXG4iLCB2aWQtPnZ0 b3RhbCk7Cj4gKwlzdHIgKz0gc2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAiVkFjdGl2ZTolZFxu IiwgdmlkLT52ZGlzcGxheSk7Cj4gKwlzdHIgKz0gc2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAi VkZyb250UG9yY2g6JWRcbiIsCj4gKwkJCSB2aWQtPnZzeW5jX3N0YXJ0IC0gdmlkLT52ZGlzcGxh eSk7Cj4gKwlzdHIgKz0gc2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAiVlN5bmNXaWR0aDolZFxu IiwKPiArCQkJIHZpZC0+dnN5bmNfZW5kIC0gdmlkLT52c3luY19zdGFydCk7Cj4gKwlzdHIgKz0g c2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAiVkJhY2tQb3JjaDolZFxuIiwKPiArCQkJIHZpZC0+ dnRvdGFsIC0gdmlkLT52c3luY19lbmQpOwo+ICsKPiArCXJldHVybiBzdHIgLSBidWY7Cj4gK30K PiArCj4gK3N0YXRpYyBzc2l6ZV90IGZvcmNlX3B3cm9ub2ZmX3N0b3JlKHN0cnVjdCBkZXZpY2Ug KmRldiwKPiArCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKPiArCQkJCSAg ICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKPiArewo+ICsJc3RydWN0IGl0NjUwNSAq aXQ2NTA1ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gKwlpbnQgcHdyOwo+ICsKPiArCWlmIChr c3RydG9pbnQoYnVmLCAxMCwgJnB3cikgPCAwKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiAr CWlmIChwd3IpCj4gKwkJaXQ2NTA1X3Bvd2Vyb24oaXQ2NTA1KTsKPiArCWVsc2UKPiArCQlpdDY1 MDVfcG93ZXJvZmYoaXQ2NTA1KTsKPiArCj4gKwlyZXR1cm4gY291bnQ7Cj4gK30KPiArCj4gK3N0 YXRpYyBzc2l6ZV90IGVuYWJsZV9kcnZfaG9sZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKPiAr CQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQo+ICt7Cj4g KwlzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiArCj4gKwly ZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGl0NjUwNS0+ZW5hYmxlX2Ry dl9ob2xkKTsKPiArfQo+ICsKPiArc3RhdGljIHNzaXplX3QgZW5hYmxlX2Rydl9ob2xkX3N0b3Jl KHN0cnVjdCBkZXZpY2UgKmRldiwKPiArCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUg KmF0dHIsCj4gKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQo+ICt7Cj4g KwlzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiArCXVuc2ln bmVkIGludCBkcnZfaG9sZDsKPiArCj4gKwlpZiAoa3N0cnRvaW50KGJ1ZiwgMTAsICZkcnZfaG9s ZCkgPCAwKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCWl0NjUwNS0+ZW5hYmxlX2Rydl9o b2xkID0gISFkcnZfaG9sZDsKPiArCj4gKwlpZiAoaXQ2NTA1LT5lbmFibGVfZHJ2X2hvbGQpIHsK PiArCQlpdDY1MDVfaW50X21hc2tfZGlzYWJsZShpdDY1MDUpOwo+ICsJfSBlbHNlIHsKPiArCQlp dDY1MDVfY2xlYXJfaW50KGl0NjUwNSk7Cj4gKwkJaXQ2NTA1X2ludF9tYXNrX2VuYWJsZShpdDY1 MDUpOwo+ICsKPiArCQlpZiAoaXQ2NTA1LT5wb3dlcmVkKSB7Cj4gKwkJCWl0NjUwNS0+Y29ubmVj dG9yX3N0YXR1cyA9Cj4gKwkJCQkJaXQ2NTA1X2dldF9zaW5rX2hwZF9zdGF0dXMoaXQ2NTA1KSA/ Cj4gKwkJCQkJY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQgOgo+ICsJCQkJCWNvbm5lY3Rvcl9z dGF0dXNfZGlzY29ubmVjdGVkOwo+ICsJCX0gZWxzZSB7Cj4gKwkJCWl0NjUwNS0+Y29ubmVjdG9y X3N0YXR1cyA9Cj4gKwkJCQkJY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cj4gKwkJfQo+ ICsJfQo+ICsJcmV0dXJuIGNvdW50Owo+ICt9Cj4gKwo+ICtzdGF0aWMgREVWSUNFX0FUVFJfUk8o cHJpbnRfdGltaW5nKTsKPiArc3RhdGljIERFVklDRV9BVFRSX1dPKGZvcmNlX3B3cm9ub2ZmKTsK PiArc3RhdGljIERFVklDRV9BVFRSX1JXKGVuYWJsZV9kcnZfaG9sZCk7Cj4gKwo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqaXQ2NTA1X2F0dHJzW10gPSB7Cj4gKwkmZGV2X2F0dHJf cHJpbnRfdGltaW5nLmF0dHIsCj4gKwkmZGV2X2F0dHJfZm9yY2VfcHdyb25vZmYuYXR0ciwKPiAr CSZkZXZfYXR0cl9lbmFibGVfZHJ2X2hvbGQuYXR0ciwKPiArCU5VTEwsCj4gK307Cj4gKwo+ICtz dGF0aWMgaW50IGl0NjUwNV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKPiAr CQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKPiArewo+ICsJc3RydWN0IGl0 NjUwNSAqaXQ2NTA1Owo+ICsJc3RydWN0IGl0NjUwNV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKPiAr CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKPiArCXN0cnVjdCBleHRjb25fZGV2 ICpleHRjb247Cj4gKwlpbnQgZXJyLCBpbnRwX2lycTsKPiArCj4gKwlpdDY1MDUgPSBkZXZtX2t6 YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKml0NjUwNSksIEdGUF9LRVJORUwpOwo+ICsJaWYg KCFpdDY1MDUpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJbXV0ZXhfaW5pdCgmaXQ2NTA1 LT5leHRjb25fbG9jayk7Cj4gKwltdXRleF9pbml0KCZpdDY1MDUtPm1vZGVfbG9jayk7Cj4gKwlt dXRleF9pbml0KCZpdDY1MDUtPmF1eF9sb2NrKTsKPiArCj4gKwlwZGF0YSA9ICZpdDY1MDUtPnBk YXRhOwo+ICsKPiArCWl0NjUwNS0+YnJpZGdlLm9mX25vZGUgPSBjbGllbnQtPmRldi5vZl9ub2Rl Owo+ICsJaXQ2NTA1LT5jb25uZWN0b3Jfc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25u ZWN0ZWQ7Cj4gKwlpdDY1MDUtPmNsaWVudCA9IGNsaWVudDsKPiArCWkyY19zZXRfY2xpZW50ZGF0 YShjbGllbnQsIGl0NjUwNSk7Cj4gKwo+ICsJLyogZ2V0IGV4dGNvbiBkZXZpY2UgZnJvbSBEVFMg Ki8KPiArCWV4dGNvbiA9IGV4dGNvbl9nZXRfZWRldl9ieV9waGFuZGxlKGRldiwgMCk7Cj4gKwlp ZiAoUFRSX0VSUihleHRjb24pID09IC1FUFJPQkVfREVGRVIpCj4gKwkJcmV0dXJuIC1FUFJPQkVf REVGRVI7Cj4gKwlpZiAoSVNfRVJSKGV4dGNvbikpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwg ImNhbiBub3QgZ2V0IGV4dGNvbiBkZXZpY2UhIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9 Cj4gKwo+ICsJaXQ2NTA1LT5leHRjb24gPSBleHRjb247Cj4gKwo+ICsJaXQ2NTA1LT5yZWdtYXAg PSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZpdDY1MDVfcmVnbWFwX2NvbmZpZyk7Cj4g KwlpZiAoSVNfRVJSKGl0NjUwNS0+cmVnbWFwKSkgewo+ICsJCURSTV9ERVZfRVJST1IoZGV2LCAi cmVnbWFwIGkyYyBpbml0IGZhaWxlZCIpOwo+ICsJCWVyciA9IFBUUl9FUlIoaXQ2NTA1LT5yZWdt YXApOwo+ICsJCXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJZXJyID0gaXQ2NTA1X2luaXRfcGRh dGEoaXQ2NTA1KTsKPiArCWlmIChlcnIpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwgIkZhaWxl ZCB0byBpbml0aWFsaXplIHBkYXRhOiAlZCIsIGVycik7Cj4gKwkJcmV0dXJuIGVycjsKPiArCX0K PiArCj4gKwlpdDY1MDVfcGFyc2VfZHQoaXQ2NTA1KTsKPiArCj4gKwlpbnRwX2lycSA9IGNsaWVu dC0+aXJxOwo+ICsKPiArCWlmICghaW50cF9pcnEpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwg IkZhaWxlZCB0byBnZXQgSU5UUCBJUlEiKTsKPiArCQllcnIgPSAtRU5PREVWOwo+ICsJCXJldHVy biBlcnI7Cj4gKwl9Cj4gKwo+ICsJZXJyID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmY2xp ZW50LT5kZXYsIGludHBfaXJxLCBOVUxMLAo+ICsJCQkJCWl0NjUwNV9pbnRfdGhyZWFkZWRfaGFu ZGxlciwKPiArCQkJCQlJUlFGX1RSSUdHRVJfTE9XIHwgSVJRRl9PTkVTSE9ULAo+ICsJCQkJCSJp dDY1MDUtaW50cCIsIGl0NjUwNSk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihk ZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBJTlRQIHRocmVhZGVkIElSUTogJWQiLAo+ICsJCQkgICAg ICBlcnIpOwo+ICsJCXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJLyogUmVnaXN0ZXIgYXV4IGNo YW5uZWwgKi8KPiArCWl0NjUwNS0+YXV4Lm5hbWUgPSAiRFAtQVVYIjsKPiArCWl0NjUwNS0+YXV4 LmRldiA9IGRldjsKPiArCWl0NjUwNS0+YXV4LnRyYW5zZmVyID0gaXQ2NTA1X2F1eF90cmFuc2Zl cjsKPiArCj4gKwllcnIgPSBkcm1fZHBfYXV4X3JlZ2lzdGVyKCZpdDY1MDUtPmF1eCk7Cj4gKwlp ZiAoZXJyIDwgMCkgewo+ICsJCURSTV9ERVZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVy IGF1eDogJWQiLCBlcnIpOwo+ICsJCXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJSU5JVF9XT1JL KCZpdDY1MDUtPmxpbmtfd29ya3MsIGl0NjUwNV9saW5rX3RyYWluaW5nX3dvcmspOwo+ICsJaW5p dF9jb21wbGV0aW9uKCZpdDY1MDUtPndhaXRfZWRpZF9jb21wbGV0ZSk7Cj4gKwlpdDY1MDUtPnBv d2VyZWQgPSBmYWxzZTsKPiArCWl0NjUwNS0+ZW5hYmxlX2Rydl9ob2xkID0gREVGQVVMVF9EUlZf SE9MRDsKPiArCj4gKwlpZiAoREVGQVVMVF9QV1JfT04pCj4gKwkJaXQ2NTA1X3Bvd2Vyb24oaXQ2 NTA1KTsKPiArCj4gKwllcnIgPSBzeXNmc19jcmVhdGVfZmlsZXMoJmNsaWVudC0+ZGV2LmtvYmos IGl0NjUwNV9hdHRycyk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJZHJtX2RwX2F1eF91bnJlZ2lzdGVy KCZpdDY1MDUtPmF1eCk7Cj4gKwkJcmV0dXJuIGVycjsKPiArCX0KPiArCj4gKwlpdDY1MDUtPmJy aWRnZS5mdW5jcyA9ICZpdDY1MDVfYnJpZGdlX2Z1bmNzOwo+ICsJZHJtX2JyaWRnZV9hZGQoJml0 NjUwNS0+YnJpZGdlKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBp dDY1MDVfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQo+ICt7Cj4gKwlzdHJ1 Y3QgaXQ2NTA1ICppdDY1MDUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKPiArCj4gKwlk cm1fY29ubmVjdG9yX3VucmVnaXN0ZXIoJml0NjUwNS0+Y29ubmVjdG9yKTsKPiArCWRybV9jb25u ZWN0b3JfY2xlYW51cCgmaXQ2NTA1LT5jb25uZWN0b3IpOwo+ICsJZHJtX2JyaWRnZV9yZW1vdmUo Jml0NjUwNS0+YnJpZGdlKTsKPiArCWRybV9kcF9hdXhfdW5yZWdpc3RlcigmaXQ2NTA1LT5hdXgp Owo+ICsJc3lzZnNfcmVtb3ZlX2ZpbGVzKCZjbGllbnQtPmRldi5rb2JqLCBpdDY1MDVfYXR0cnMp Owo+ICsJaXQ2NTA1X3Bvd2Vyb2ZmKGl0NjUwNSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiAr Cj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBpdDY1MDVfaWRbXSA9IHsKPiAr CXsgIml0NjUwNSIsIDAgfSwKPiArCXsgfQo+ICt9Owo+ICsKPiArTU9EVUxFX0RFVklDRV9UQUJM RShpMmMsIGl0NjUwNV9pZCk7Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9p ZCBpdDY1MDVfb2ZfbWF0Y2hbXSA9IHsKPiArCXsgLmNvbXBhdGlibGUgPSAiaXRlLGl0NjUwNSIg fSwKPiArCXsgfQo+ICt9Owo+ICsKPiArc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGl0NjUwNV9p MmNfZHJpdmVyID0gewo+ICsJLmRyaXZlciA9IHsKPiArCQkubmFtZSA9ICJpdDY1MDUiLAo+ICsJ CS5vZl9tYXRjaF90YWJsZSA9IGl0NjUwNV9vZl9tYXRjaCwKPiArCQkucG0gPSAmaXQ2NTA1X2Jy aWRnZV9wbV9vcHMsCj4gKwl9LAo+ICsJLnByb2JlID0gaXQ2NTA1X2kyY19wcm9iZSwKPiArCS5y ZW1vdmUgPSBpdDY1MDVfaTJjX3JlbW92ZSwKPiArCS5pZF90YWJsZSA9IGl0NjUwNV9pZCwKPiAr fTsKPiArCj4gK21vZHVsZV9pMmNfZHJpdmVyKGl0NjUwNV9pMmNfZHJpdmVyKTsKPiArCj4gK01P RFVMRV9BVVRIT1IoIkhlcm1lcyBXdSA8aGVybWVzLnd1QGl0ZS5jb20udHc+Iik7Cj4gK01PRFVM RV9ERVNDUklQVElPTigiSVQ2NTA1IERpc3BsYXlQb3J0IFRyYW5zbWl0dGVyIGRyaXZlciIpOwo+ ICtNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cj4gLS0gCj4gMS45LjEKPiAKPiBfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+IGRyaS1kZXZlbCBtYWlsaW5n IGxpc3QKPiBkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gaHR0cHM6Ly9saXN0cy5m cmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4LW1lZGlhdGVrIG1haWxpbmcg bGlzdApMaW51eC1tZWRpYXRla0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZy YWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbWVkaWF0ZWsK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 40641C433DF for ; Mon, 10 Aug 2020 18:18:20 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B87AB207FF for ; Mon, 10 Aug 2020 18:18:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="qJgGz4xt" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B87AB207FF Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ravnborg.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=ZVEgAOcBk1DMGkXx0UgrAVjXuVaJ036VyCDNeVlUClQ=; b=qJgGz4xtk9Zrf2fUaFBrR8UDk dYj3R+1KhIwL3H063XNrbhKKKQ5MTscroE09hifkxBIE6d+KZVdLwXPbsp7muiRtUO4pvjFARCHPs db/XWe+WY3jycRIZNwM5v4PAk4pFTscOmn9Qk4ZP1wZ7MCdHoqLiG59r6Gj2/qwKs5MV3a1+PWu3N +XCDDSvzOaEFR7CGCJW59BDpgS3XeJ6BVhVROqawp5/Q5l9O7turAY4KkpTibvg6dQ2j17z94cHWA huFbZuF8uCGE/ur8vdLSFmWwDiz+nMCjHfSmrim4xOQ9W0ZegGpCRzpexPPEDZqe+/tQrdNNamMUT hxWj694pQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1k5CL9-0003OW-UB; Mon, 10 Aug 2020 18:16:07 +0000 Received: from asavdk3.altibox.net ([109.247.116.14]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1k5CL5-0003O4-1N; Mon, 10 Aug 2020 18:16:05 +0000 Received: from ravnborg.org (unknown [188.228.123.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by asavdk3.altibox.net (Postfix) with ESMTPS id 9020B20023; Mon, 10 Aug 2020 20:15:55 +0200 (CEST) Date: Mon, 10 Aug 2020 20:15:54 +0200 From: Sam Ravnborg To: allen Subject: Re: [PATCH v10] drm/bridge: add it6505 driver Message-ID: <20200810181554.GE292825@ravnborg.org> References: <1594892860-6569-1-git-send-email-allen.chen@ite.com.tw> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1594892860-6569-1-git-send-email-allen.chen@ite.com.tw> X-CMAE-Score: 0 X-CMAE-Analysis: v=2.3 cv=f+hm+t6M c=1 sm=1 tr=0 a=S6zTFyMACwkrwXSdXUNehg==:117 a=S6zTFyMACwkrwXSdXUNehg==:17 a=IkcTkHD0fZMA:10 a=mpaa-ttXAAAA:8 a=cm27Pg_UAAAA:8 a=1XWaLZrsAAAA:8 a=Ns9eNvu6AAAA:8 a=e5mUnYsNAAAA:8 a=L8YDfXaSqtconZh9qGgA:9 a=6YHz0X6AXIijI_lZ:21 a=OhsBIkaczIQ1SNPw:21 a=QEXdDO2ut3YA:10 a=6heAxKwa5pAsJatQ0mat:22 a=xmb-EsYY8bH0VWELuYED:22 a=LZLx1i01EnjtqRv10NxV:22 a=Vxmtnl_E_bksehYqCbjh:22 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200810_141603_798252_86CCAA34 X-CRM114-Status: GOOD ( 31.51 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jernej Skrabec , Jitao Shi , Neil Armstrong , Yilun Lin , Jau-Chih Tseng , open list , "open list:DRM DRIVERS" , Andrzej Hajda , David Airlie , Hermes Wu , "moderated list:ARM/Mediatek SoC support" , Laurent Pinchart , Pi-Hsun Shih , Matthias Brugger , "moderated list:ARM/Mediatek SoC support" , Jonas Karlman Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgYWxsZW4uCgpPbiBUaHUsIEp1bCAxNiwgMjAyMCBhdCAwNTo0NzozMVBNICswODAwLCBhbGxl biB3cm90ZToKPiBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgdGhlIGlURSBJVDY1MDUuCj4gVGhpcyBk ZXZpY2UgY2FuIGNvbnZlcnQgRFBJIHNpZ25hbCB0byBEUCBvdXRwdXQuCj4gCj4gU2lnbmVkLW9m Zi1ieTogSml0YW8gU2hpIDxqaXRhby5zaGlAbWVkaWF0ZWsuY29tPgo+IFNpZ25lZC1vZmYtYnk6 IFBpLUhzdW4gU2hpaCA8cGloc3VuQGNocm9taXVtLm9yZz4KPiBTaWduZWQtb2ZmLWJ5OiBZaWx1 biBMaW4gPHlsbGluQGdvb2dsZS5jb20+Cj4gU2lnbmVkLW9mZi1ieTogSGVybWVzIFd1IDxoZXJt ZXMud3VAaXRlLmNvbS50dz4KPiBTaWduZWQtb2ZmLWJ5OiBBbGxlbiBDaGVuIDxhbGxlbi5jaGVu QGl0ZS5jb20udHc+Cj4gLS0tCkNhbiB5b3UgcGxlYXNlIGFkZCBhIEZyb206IGxpbmUgc28gaXQg aXMgcG9zc2libGUgZm9yIHRoZSB0b29scyB0byBwaWNrCndobyBpcyB0aGUgYXV0aG9yLgpSaWdo dCBub3cgeW91IGFyZSBwaWNrZWQgLSB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBPSy4KCgpJIHRy aWVkIHRvIGFwcGx5IHRoZSBwYXRjaCAtIGJ1dCB0aGVyZSBpcyBhIGZldyB0aGluZ3MgdG8gbG9v ayBhdDoKCkkgZ290IHRoaXMgd2l0aCBvbmUgb2YgbXkgY29uZmlncyAoYWxseWVzIG9yIGFsbG1v ZGNvbmZpZ3MpOgogQ0MgW01dICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY1MDUubwov aG9tZS9zYW0vZHJtL2xpbnV4LmdpdC9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY1MDUu YzoyNTg5OjEyOiB3YXJuaW5nOiDigJhpdDY1MDVfYnJpZGdlX3N1c3BlbmTigJkgZGVmaW5lZCBi dXQgbm90IHVzZWQgWy1XdW51c2VkLWZ1bmN0aW9uXQogMjU4OSB8IHN0YXRpYyBpbnQgaXQ2NTA1 X2JyaWRnZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKICAgICAgfCAgICAgICAgICAgIF5+ fn5+fn5+fn5+fn5+fn5+fn5+fgovaG9tZS9zYW0vZHJtL2xpbnV4LmdpdC9kcml2ZXJzL2dwdS9k cm0vYnJpZGdlL2l0ZS1pdDY1MDUuYzoyNTgyOjEyOiB3YXJuaW5nOiDigJhpdDY1MDVfYnJpZGdl X3Jlc3VtZeKAmSBkZWZpbmVkIGJ1dCBub3QgdXNlZCBbLVd1bnVzZWQtZnVuY3Rpb25dCiAyNTgy IHwgc3RhdGljIGludCBpdDY1MDVfYnJpZGdlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiAg ICAgIHwgICAgICAgICAgICBefn5+fn5+fn5+fn5+fn5+fn5+fgoKUGxlYXNlIGZpeC4KCgpQbGVh c2UgdHJ5IHRvIHJ1biBpdCB0aHJvdWdoIGNoZWNrcGF0Y2ggd2l0aCB0aGUgZm9sbG93aW5nIG9w dGlvbnM6Ci4vc2NyaXB0cy9jaGVja3BhdGNoIC1xIC0tZW1hY3MgLS1zdHJpY3QgLS1zaG93LXR5 cGVzIC0tY29kZXNwZWxsCgpEcm9wIGNvZGVzcGVsbCBpZiBpdCBkb2VzIG5vdCB3b3JrIGZvciB5 b3UuCgpDb2Rlc3BlbGwgZGlkIG5vdCBsaWtlIGFmZSAtIHNlZW1zIHRoYXQgaXQgZG9lcyBub3Qg a25vdyB0aGlzIGlzIGEKc2hvcnRoYW5kIGZvciAiYW5hbG9nIGZyb250IGVuZCIuIFRoaXMgaXMg b25lIG9mIHRoZSB3YXJuaW5ncyB0byBpZ25vcmUuCgpUaGVyZSBhcmUgc2V2ZXJhbCB2YWxpZCB3 YXJuaW5ncyB0aGF0IG5lZWRzIGZpeGluZy4gRm9yIGV4YW1wbGUgaW5kZW50LgoKClRoZSBkcml2 ZXIgbmVlZHMgdG8gc3VwcG9ydCAiZmxhZ3MiIGluIGF0dGFjaCB0byBtYWtlIGNvbm5lY3RvciBj cmVhdGlvbgpvcHRpb25hbCAtIHN1cHBvcnQgZm9yIHRoaXMgaXMgbWFuZGF0b3J5IGluIG5ldyBk cml2ZXJzLgoKVGhlIGRyaXZlciBhbHNvIG5lZWRzIHRvIHN1cHBvcnQgcmVsZXZhbnQgYnJpZGdl IG9wZXJhdGlvbnMuCgkuZ2V0X2VkaWQKCS5kZXRlY3QKCm5lZWRzIHRvIGJlIHN1cHBvcnRlZCwg bWF5YmUgbW9yZS4KClNlZSBvdGhlciBicmlkZ2UgZHJpdmVycyAtIG1vc3Qgb2YgdGhlbSBhcmUg Y29udmVydGVkIHRvZGF5LgoKClBsZWFzZSBmaXggc28gd2UgY2FuIGdldCB0aGlzIGRyaXZlciBh cHBsaWVkLgoKCVNhbQoKCgo+ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tjb25maWcgICAgICB8 ICAgIDcgKwo+ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL01ha2VmaWxlICAgICB8ICAgIDEgKwo+ ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY1MDUuYyB8IDI4OTAgKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysKPiAgMyBmaWxlcyBjaGFuZ2VkLCAyODk4IGluc2VydGlv bnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvaXRlLWl0 NjUwNS5jCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvS2NvbmZpZyBi L2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvS2NvbmZpZwo+IGluZGV4IDQzMjcxYzIuLjU5NzUwYjgg MTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9LY29uZmlnCj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL2JyaWRnZS9LY29uZmlnCj4gQEAgLTU3LDYgKzU3LDEzIEBAIGNvbmZpZyBE Uk1fTFZEU19DT0RFQwo+ICAJICBTdXBwb3J0IGZvciB0cmFuc3BhcmVudCBMVkRTIGVuY29kZXJz IGFuZCBkZWNvZGVycyB0aGF0IGRvbid0Cj4gIAkgIHJlcXVpcmUgYW55IGNvbmZpZ3VyYXRpb24u Cj4gIAo+ICtjb25maWcgRFJNX0lURV9JVDY1MDUKPiArCXRyaXN0YXRlICJJVEUgSVQ2NTA1IERQ IGJyaWRnZSIKPiArCWRlcGVuZHMgb24gT0YKPiArCXNlbGVjdCBEUk1fS01TX0hFTFBFUgo+ICsJ aGVscAo+ICsJICBJVEUgSVQ2NTA1IERQIGJyaWRnZSBjaGlwIGRyaXZlci4KPiArCj4gIGNvbmZp ZyBEUk1fTUVHQUNISVBTX1NURFBYWFhYX0dFX0I4NTBWM19GVwo+ICAJdHJpc3RhdGUgIk1lZ2FD aGlwcyBzdGRwNDAyOC1nZS1iODUwdjMtZncgYW5kIHN0ZHAyNjkwLWdlLWI4NTB2My1mdyIKPiAg CWRlcGVuZHMgb24gT0YKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9NYWtl ZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUKPiBpbmRleCBkNjNkNGI3Li44 NjYxOWM3IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUKPiAr KysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL01ha2VmaWxlCj4gQEAgLTMsNiArMyw3IEBAIG9i ai0kKENPTkZJR19EUk1fQ0ROU19EU0kpICs9IGNkbnMtZHNpLm8KPiAgb2JqLSQoQ09ORklHX0RS TV9DSFJPTlRFTF9DSDcwMzMpICs9IGNocm9udGVsLWNoNzAzMy5vCj4gIG9iai0kKENPTkZJR19E Uk1fRElTUExBWV9DT05ORUNUT1IpICs9IGRpc3BsYXktY29ubmVjdG9yLm8KPiAgb2JqLSQoQ09O RklHX0RSTV9MVkRTX0NPREVDKSArPSBsdmRzLWNvZGVjLm8KPiArb2JqLSQoQ09ORklHX0RSTV9J VEVfSVQ2NTA1KSArPSBpdGUtaXQ2NTA1Lm8KPiAgb2JqLSQoQ09ORklHX0RSTV9NRUdBQ0hJUFNf U1REUFhYWFhfR0VfQjg1MFYzX0ZXKSArPSBtZWdhY2hpcHMtc3RkcHh4eHgtZ2UtYjg1MHYzLWZ3 Lm8KPiAgb2JqLSQoQ09ORklHX0RSTV9OWFBfUFROMzQ2MCkgKz0gbnhwLXB0bjM0NjAubwo+ICBv YmotJChDT05GSUdfRFJNX1BBUkFERV9QUzg2MjIpICs9IHBhcmFkZS1wczg2MjIubwo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY1MDUuYyBiL2RyaXZlcnMvZ3B1 L2RybS9icmlkZ2UvaXRlLWl0NjUwNS5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAw MDAwMDAwMC4uMTJhNTZjZAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0v YnJpZGdlL2l0ZS1pdDY1MDUuYwo+IEBAIC0wLDAgKzEsMjg5MCBAQAo+ICsvLyBTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogKEdQTC0yLjAtb25seSBPUiBCU0QtMi1DbGF1c2UpCj4gKy8qCj4gKyAq IENvcHlyaWdodCAoYykgMjAyMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCj4gKyAqLwo+ICsjaW5jbHVkZSA8bGludXgvYml0cy5oPgo+ICsjaW5jbHVkZSA8bGlu dXgvZGVsYXkuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGlu dXgvZXJyLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9leHRjb24uaD4KPiArI2luY2x1ZGUgPGxpbnV4 L2ZzLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+Cj4gKyNpbmNsdWRlIDxs aW51eC9pMmMuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+ICsjaW5jbHVkZSA8 bGludXgva2VybmVsLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiArI2luY2x1ZGUg PGxpbnV4L3BtX3J1bnRpbWUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgo+ICsjaW5j bHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC90eXBl cy5oPgo+ICsjaW5jbHVkZSA8bGludXgvd2FpdC5oPgo+ICsKPiArI2luY2x1ZGUgPGNyeXB0by9o YXNoLmg+Cj4gKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+Cj4gKwo+ICsjaW5jbHVkZSA8ZHJtL2Ry bV9hdG9taWNfaGVscGVyLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2JyaWRnZS5oPgo+ICsjaW5j bHVkZSA8ZHJtL2RybV9jcnRjLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+ Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2RwX2hlbHBlci5oPgo+ICsjaW5jbHVkZSA8ZHJtL2RybV9l ZGlkLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX3ByaW50Lmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJt X3Byb2JlX2hlbHBlci5oPgo+ICsKPiArI2luY2x1ZGUgPHNvdW5kL2hkbWktY29kZWMuaD4KPiAr Cj4gKyNkZWZpbmUgUkVHX0lDX1ZFUiAweDA0Cj4gKwo+ICsjZGVmaW5lIFJFR19SRVNFVF9DVFJM IDB4MDUKPiArI2RlZmluZSBWSURFT19SRVNFVCBCSVQoMCkKPiArI2RlZmluZSBBVURJT19SRVNF VCBCSVQoMSkKPiArI2RlZmluZSBBTExfTE9HSUNfUkVTRVQgQklUKDIpCj4gKyNkZWZpbmUgQVVY X1JFU0VUIEJJVCgzKQo+ICsjZGVmaW5lIEhEQ1BfUkVTRVQgQklUKDQpCj4gKwo+ICsjZGVmaW5l IElOVF9TVEFUVVNfMDEgMHgwNgo+ICsjZGVmaW5lIElOVF9NQVNLXzAxIDB4MDkKPiArI2RlZmlu ZSBJTlRfSFBEX0NIQU5HRSBCSVQoMCkKPiArI2RlZmluZSBJTlRfUkVDRUlWRV9IUERfSVJRIEJJ VCgxKQo+ICsjZGVmaW5lIElOVF9TQ0RUX0NIQU5HRSBCSVQoMikKPiArCj4gKyNkZWZpbmUgSU5U X1NUQVRVU18wMiAweDA3Cj4gKyNkZWZpbmUgSU5UX01BU0tfMDIgMHgwQQo+ICsjZGVmaW5lIElO VF9BVVhfQ01EX0ZBSUwgQklUKDApCj4gKyNkZWZpbmUgSU5UX0FVRElPX0ZJRk9fRVJST1IgQklU KDIpCj4gKwo+ICsjZGVmaW5lIElOVF9TVEFUVVNfMDMgMHgwOAo+ICsjZGVmaW5lIElOVF9NQVNL XzAzIDB4MEIKPiArI2RlZmluZSBJTlRfTElOS19UUkFJTl9GQUlMIEJJVCg0KQo+ICsjZGVmaW5l IElOVF9WSURfRklGT19FUlJPUiBCSVQoNSkKPiArI2RlZmluZSBJTlRfSU9fTEFUQ0hfRklGT19P VkVSRkxPVyBCSVQoNykKPiArCj4gKyNkZWZpbmUgUkVHX1NZU1RFTV9TVFMgMHgwRAo+ICsjZGVm aW5lIElOVF9TVFMgQklUKDApCj4gKyNkZWZpbmUgSFBEX1NUUyBCSVQoMSkKPiArI2RlZmluZSBW SURFT19TVEIgQklUKDIpCj4gKwo+ICsjZGVmaW5lIFJFR19MSU5LX1RSQUlOX1NUUyAweDBFCj4g KyNkZWZpbmUgTElOS19TVEFURV9DUiBCSVQoMikKPiArI2RlZmluZSBMSU5LX1NUQVRFX0VRIEJJ VCgzKQo+ICsjZGVmaW5lIExJTktfU1RBVEVfTk9SUCBCSVQoNCkKPiArCj4gKyNkZWZpbmUgUkVH X0JBTktfU0VMIDB4MEYKPiArI2RlZmluZSBSRUdfQ0xLX0NUUkwwIDB4MTAKPiArI2RlZmluZSBN X1BDTEtfREVMQVkgMHgwMwo+ICsKPiArI2RlZmluZSBSRUdfQVVYX09QVCAweDExCj4gKyNkZWZp bmUgQVVYX0FVVE9fUlNUIEJJVCgwKQo+ICsjZGVmaW5lIEFVWF9GSVhfRlJFUSBCSVQoMykKPiAr Cj4gKyNkZWZpbmUgUkVHX0RBVEFfQ1RSTDAgMHgxMgo+ICsjZGVmaW5lIFZJREVPX0xBVENIX0VE R0UgQklUKDQpCj4gKyNkZWZpbmUgRU5BQkxFX1BDTEtfQ09VTlRFUiBCSVQoNykKPiArCj4gKyNk ZWZpbmUgUkVHX1BDTEtfQ09VTlRFUl9WQUxVRSAweDEzCj4gKwo+ICsjZGVmaW5lIFJFR181MDFf RklGT19DVFJMIDB4MTUKPiArI2RlZmluZSBSU1RfNTAxX0ZJRk8gQklUKDEpCj4gKwo+ICsjZGVm aW5lIFJFR19UUkFJTl9DVFJMMCAweDE2Cj4gKyNkZWZpbmUgRk9SQ0VfTEJSIEJJVCgwKQo+ICsj ZGVmaW5lIExBTkVfQ09VTlRfTUFTSyAweDA2Cj4gKyNkZWZpbmUgTEFORV9TV0FQIEJJVCgzKQo+ ICsjZGVmaW5lIFNQUkVBRF9BTVBfNSBCSVQoNCkKPiArI2RlZmluZSBGT1JDRV9DUl9ET05FIEJJ VCg1KQo+ICsjZGVmaW5lIEZPUkNFX0VRX0RPTkUgQklUKDYpCj4gKwo+ICsjZGVmaW5lIFJFR19U UkFJTl9DVFJMMSAweDE3Cj4gKyNkZWZpbmUgQVVUT19UUkFJTiBCSVQoMCkKPiArI2RlZmluZSBN QU5VQUxfVFJBSU4gQklUKDEpCj4gKyNkZWZpbmUgRk9SQ0VfUkVUUkFJTiBCSVQoMikKPiArCj4g KyNkZWZpbmUgUkVHX0FVWF9DVFJMIDB4MjMKPiArI2RlZmluZSBDTFJfRURJRF9GSUZPIEJJVCgw KQo+ICsjZGVmaW5lIEFVWF9VU0VSX01PREUgQklUKDEpCj4gKyNkZWZpbmUgQVVYX05PX1NFR01F TlRfV1IgQklUKDYpCj4gKyNkZWZpbmUgQVVYX0VOX0ZJRk9fUkVBRCBCSVQoNykKPiArCj4gKyNk ZWZpbmUgUkVHX0FVWF9BRFJfMF83IDB4MjQKPiArI2RlZmluZSBSRUdfQVVYX0FEUl84XzE1IDB4 MjUKPiArI2RlZmluZSBSRUdfQVVYX0FEUl8xNl8xOSAweDI2Cj4gKyNkZWZpbmUgUkVHX0FVWF9P VVRfREFUQTAgMHgyNwo+ICsKPiArI2RlZmluZSBSRUdfQVVYX0NNRF9SRVEgMHgyQgo+ICsjZGVm aW5lIEFVWF9CVVNZIEJJVCg1KQo+ICsKPiArI2RlZmluZSBSRUdfQVVYX0RBVEFfMF83IDB4MkMK PiArI2RlZmluZSBSRUdfQVVYX0RBVEFfOF8xNSAweDJECj4gKyNkZWZpbmUgUkVHX0FVWF9EQVRB XzE2XzIzIDB4MkUKPiArI2RlZmluZSBSRUdfQVVYX0RBVEFfMjRfMzEgMHgyRgo+ICsKPiArI2Rl ZmluZSBSRUdfQVVYX0RBVEFfRklGTyAweDJGCj4gKwo+ICsjZGVmaW5lIFJFR19BVVhfRVJST1Jf U1RTIDB4OUYKPiArI2RlZmluZSBNX0FVWF9SRVFfRkFJTCAweDAzCj4gKwo+ICsjZGVmaW5lIFJF R19IRENQX0NUUkwxIDB4MzgKPiArI2RlZmluZSBIRENQX0NQX0VOQUJMRSBCSVQoMCkKPiArCj4g KyNkZWZpbmUgUkVHX0hEQ1BfQ1RSTDIgMHgzQQo+ICsjZGVmaW5lIEhEQ1BfQU5fU0VMIEJJVCgw KQo+ICsjZGVmaW5lIEhEQ1BfSFdfSFBESVJRX0FDVCBCSVQoMikKPiArCj4gKyNkZWZpbmUgUkVH X00wXzBfNyAweDRDCj4gKyNkZWZpbmUgUkVHX0FOXzBfNyAweDRDCj4gKyNkZWZpbmUgUkVHX1NQ X0NUUkwwIDB4NTgKPiArI2RlZmluZSBSRUdfSVBfQ1RSTDEgMHg1OQo+ICsjZGVmaW5lIFJFR19J UF9DVFJMMiAweDVBCj4gKwo+ICsjZGVmaW5lIFJFR19MSU5LX0RSViAweDVDCj4gKyNkZWZpbmUg RFJWX0hTIEJJVCgxKQo+ICsKPiArI2RlZmluZSBSRUdfRFJWX0xOX0RBVEFfU0VMIDB4NUQKPiAr Cj4gKyNkZWZpbmUgUkVHX0FVWCAweDVFCj4gKwo+ICsjZGVmaW5lIFJFR19WSURfQlVTX0NUUkww IDB4NjAKPiArI2RlZmluZSBJTl9ERFIgQklUKDIpCj4gKyNkZWZpbmUgRERSX0NEICgweDAxIDw8 IDYpCj4gKwo+ICsjZGVmaW5lIFJFR19WSURfQlVTX0NUUkwxIDB4NjEKPiArI2RlZmluZSBUWF9G SUZPX1JFU0VUIEJJVCgxKQo+ICsKPiArI2RlZmluZSBSRUdfSU5QVVRfQ1RSTCAweEEwCj4gKyNk ZWZpbmUgSU5QVVRfSFNZTkNfUE9MIEJJVCgwKQo+ICsjZGVmaW5lIElOUFVUX1ZTWU5DX1BPTCBC SVQoMikKPiArI2RlZmluZSBJTlBVVF9JTlRFUkxBQ0VEIEJJVCg0KQo+ICsKPiArI2RlZmluZSBS RUdfSU5QVVRfSFRPVEFMIDB4QTEKPiArI2RlZmluZSBSRUdfSU5QVVRfSEFDVElWRV9TVEFSVCAw eEEzCj4gKyNkZWZpbmUgUkVHX0lOUFVUX0hBQ1RJVkVfV0lEVEggMHhBNQo+ICsjZGVmaW5lIFJF R19JTlBVVF9IRlJPTlRfUE9SQ0ggMHhBNwo+ICsjZGVmaW5lIFJFR19JTlBVVF9IU1lOQ19XSURU SCAweEE5Cj4gKyNkZWZpbmUgUkVHX0lOUFVUX1ZUT1RBTCAweEFCCj4gKyNkZWZpbmUgUkVHX0lO UFVUX1ZBQ1RJVkVfU1RBUlQgMHhBRAo+ICsjZGVmaW5lIFJFR19JTlBVVF9WQUNUSVZFX1dJRFRI IDB4QUYKPiArI2RlZmluZSBSRUdfSU5QVVRfVkZST05UX1BPUkNIIDB4QjEKPiArI2RlZmluZSBS RUdfSU5QVVRfVlNZTkNfV0lEVEggMHhCMwo+ICsKPiArI2RlZmluZSBSRUdfQVVESU9fU1JDX0NU UkwgMHhCOAo+ICsjZGVmaW5lIE1fQVVESU9fSTJTX0VOIDB4MEYKPiArI2RlZmluZSBFTl9JMlMw IEJJVCgwKQo+ICsjZGVmaW5lIEVOX0kyUzEgQklUKDEpCj4gKyNkZWZpbmUgRU5fSTJTMiBCSVQo MikKPiArI2RlZmluZSBFTl9JMlMzIEJJVCgzKQo+ICsjZGVmaW5lIEFVRElPX0ZJRk9fUkVTRVQg QklUKDcpCj4gKwo+ICsjZGVmaW5lIFJFR19BVURJT19GTVQgMHhCOQo+ICsjZGVmaW5lIFJFR19B VURJT19GSUZPX1NFTCAweEJBCj4gKwo+ICsjZGVmaW5lIFJFR19BVURJT19DVFJMMCAweEJCCj4g KyNkZWZpbmUgQVVESU9fRlVMTF9QS1QgQklUKDQpCj4gKyNkZWZpbmUgQVVESU9fMTZCX0JPVU5E IEJJVCg1KQo+ICsKPiArI2RlZmluZSBSRUdfQVVESU9fQ1RSTDEgMHhCQwo+ICsjZGVmaW5lIFJF R19BVURJT19JTlBVVF9GUkVRIDB4QkUKPiArCj4gKyNkZWZpbmUgUkVHX0lFQzk1OF9TVFMwIDB4 QkYKPiArI2RlZmluZSBSRUdfSUVDOTU4X1NUUzEgMHhDMAo+ICsjZGVmaW5lIFJFR19JRUM5NThf U1RTMiAweEMxCj4gKyNkZWZpbmUgUkVHX0lFQzk1OF9TVFMzIDB4QzIKPiArI2RlZmluZSBSRUdf SUVDOTU4X1NUUzQgMHhDMwo+ICsKPiArI2RlZmluZSBSRUdfSFBEX0lSUV9USU1FIDB4QzkKPiAr I2RlZmluZSBSRUdfQVVYX0RFQlVHX01PREUgMHhDQQo+ICsjZGVmaW5lIFJFR19BVVhfT1BUMiAw eENCCj4gKyNkZWZpbmUgUkVHX0hEQ1BfT1BUIDB4Q0UKPiArCj4gKyNkZWZpbmUgUkVHX0RBVEFf TVVURV9DVFJMIDB4RDMKPiArI2RlZmluZSBFTkFCTEVfRU5IQU5DRURfRlJBTUUgQklUKDApCj4g KyNkZWZpbmUgRU5BQkxFX0FVVE9fVklERU9fRklGT19SRVNFVCBCSVQoMSkKPiArI2RlZmluZSBF Tl9WSURfTVVURSBCSVQoNCkKPiArI2RlZmluZSBFTl9BVURfTVVURSBCSVQoNSkKPiArCj4gKyNk ZWZpbmUgUkVHX1RJTUVfU1RNUF9DVFJMIDB4RDQKPiArI2RlZmluZSBFTl9FTkhBTkNFX1ZJRF9T VE1QIEJJVCgwKQo+ICsjZGVmaW5lIEVOX0VOSEFOQ0VfQVVEX1NUTVAgQklUKDIpCj4gKyNkZWZp bmUgTV9TVEFNUF9TVEVQIDB4MzAKPiArI2RlZmluZSBFTl9TU0NfR0FUIEJJVCg2KQo+ICsKPiAr I2RlZmluZSBSRUdfSU5GT0ZSQU1FX0NUUkwgMHhFOAo+ICsjZGVmaW5lIEVOX0FWSV9QS1QgQklU KDApCj4gKyNkZWZpbmUgRU5fQVVEX1BLVCBCSVQoMSkKPiArI2RlZmluZSBFTl9NUEdfUEtUIEJJ VCgyKQo+ICsjZGVmaW5lIEVOX0dFTl9QS1QgQklUKDMpCj4gKyNkZWZpbmUgRU5fVklEX1RJTUVf U1RNUCBCSVQoNCkKPiArI2RlZmluZSBFTl9BVURfVElNRV9TVE1QIEJJVCg1KQo+ICsjZGVmaW5l IEVOX1ZJRF9DVFJMX1BLVCAoRU5fQVZJX1BLVCB8IEVOX1ZJRF9USU1FX1NUTVApCj4gKyNkZWZp bmUgRU5fQVVEX0NUUkxfUEtUIChFTl9BVURfUEtUIHwgRU5fQVVEX1RJTUVfU1RNUCkKPiArCj4g KyNkZWZpbmUgUkVHX0FVRElPX05fMF83IDB4REUKPiArI2RlZmluZSBSRUdfQVVESU9fTl84XzE1 IDB4REYKPiArI2RlZmluZSBSRUdfQVVESU9fTl8xNl8yMyAweEUwCj4gKwo+ICsjZGVmaW5lIFJF R19BVklfSU5GT19EQjEgMHhFOQo+ICsjZGVmaW5lIFJFR19BVklfSU5GT19EQjIgMHhFQQo+ICsj ZGVmaW5lIFJFR19BVklfSU5GT19EQjMgMHhFQgo+ICsjZGVmaW5lIFJFR19BVklfSU5GT19EQjQg MHhFQwo+ICsjZGVmaW5lIFJFR19BVklfSU5GT19EQjUgMHhFRAo+ICsjZGVmaW5lIFJFR19BVklf SU5GT19TVU0gMHhGNgo+ICsKPiArI2RlZmluZSBSRUdfQVVEX0lORk9GUkFNX0RCMSAweEY3Cj4g KyNkZWZpbmUgUkVHX0FVRF9JTkZPRlJBTV9EQjIgMHhGOAo+ICsjZGVmaW5lIFJFR19BVURfSU5G T0ZSQU1fREIzIDB4RjkKPiArI2RlZmluZSBSRUdfQVVEX0lORk9GUkFNX0RCNCAweEZBCj4gKyNk ZWZpbmUgUkVHX0FVRF9JTkZPRlJBTV9TVU0gMHhGQgo+ICsKPiArLyogdGhlIGZvbGxvd2luZyBz aXggcmVnaXN0ZXJzIGFyZSBpbiBiYW5rMSAqLwo+ICsjZGVmaW5lIFJFR19EUlZfMF9EQl84MDBf TVYgMHg3RQo+ICsjZGVmaW5lIFJFR19QUkVfMF9EQl84MDBfTVYgMHg3Rgo+ICsjZGVmaW5lIFJF R19QUkVfM1A1X0RCXzgwMF9NViAweDgxCj4gKyNkZWZpbmUgUkVHX1NTQ19DVFJMMCAweDg4Cj4g KyNkZWZpbmUgUkVHX1NTQ19DVFJMMSAweDg5Cj4gKyNkZWZpbmUgUkVHX1NTQ19DVFJMMiAweDhB Cj4gKwo+ICsjZGVmaW5lIFJCUiBEUF9MSU5LX0JXXzFfNjIKPiArI2RlZmluZSBIQlIgRFBfTElO S19CV18yXzcKPiArI2RlZmluZSBIQlIyIERQX0xJTktfQldfNV80Cj4gKyNkZWZpbmUgSEJSMyBE UF9MSU5LX0JXXzhfMQo+ICsKPiArLyogVmVuZG9yIG9wdGlvbiAqLwo+ICsjZGVmaW5lIE1BWF9M QU5FX0NPVU5UIDQKPiArI2RlZmluZSBNQVhfTElOS19SQVRFIEhCUgo+ICsjZGVmaW5lIEFVVE9f VFJBSU5fUkVUUlkgMwo+ICsjZGVmaW5lIE1BWF9DUl9MRVZFTCAweDAzCj4gKyNkZWZpbmUgTUFY X0VRX0xFVkVMIDB4MDMKPiArI2RlZmluZSBBVVhfV0FJVF9USU1FT1VUX01TIDE1Cj4gKyNkZWZp bmUgQVVYX0ZJRk9fTUFYX1NJWkUgMzIKPiArI2RlZmluZSBQSVhFTF9DTEtfREVMQVkgMQo+ICsj ZGVmaW5lIFBJWEVMX0NMS19JTlZFUlNFIDAKPiArI2RlZmluZSBBREpVU1RfUEhBU0VfVEhSRVNI T0xEIDgwMDAwCj4gKyNkZWZpbmUgRFBJX1BJWEVMX0NMS19NQVggOTUwMDAKPiArI2RlZmluZSBE RUZBVUxUX1BXUl9PTiAwCj4gKyNkZWZpbmUgREVGQVVMVF9EUlZfSE9MRCAwCj4gKwo+ICsjZGVm aW5lIEFVRElPX1NFTEVDVCBJMlMKPiArI2RlZmluZSBBVURJT19UWVBFIExQQ00KPiArI2RlZmlu ZSBBVURJT19TQU1QTEVfUkFURSBTQU1QTEVfUkFURV80OEsKPiArI2RlZmluZSBBVURJT19DSEFO TkVMX0NPVU5UIDIKPiArCj4gKy8qCj4gKyAqIDA6IFN0YW5kYXJkIEkyUwo+ICsgKiAxOiAzMmJp dCBJMlMKPiArICovCj4gKyNkZWZpbmUgSTJTX0lOUFVUX0ZPUk1BVCAxCj4gKwo+ICsvKgo+ICsg KiAwOiBMZWZ0LWp1c3RpZmllZAo+ICsgKiAxOiBSaWdodC1qdXN0aWZpZWQKPiArICovCj4gKyNk ZWZpbmUgSTJTX0pVU1RJRklFRCAwCj4gKwo+ICsvKgo+ICsgKiAwOiBEYXRhIGRlbGF5IDFUIGNv cnJlc3BvbmQgdG8gV1MKPiArICogMTogTm8gZGF0YSBkZWxheSBjb3JyZXNwb25kIHRvIFdTCj4g KyAqLwo+ICsjZGVmaW5lIEkyU19EQVRBX0RFTEFZIDAKPiArCj4gKy8qCj4gKyAqIDA6IExlZnQg Y2hhbm5lbAo+ICsgKiAxOiBSaWdodCBjaGFubmVsCj4gKyAqLwo+ICsjZGVmaW5lIEkyU19XU19D SEFOTkVMIDAKPiArCj4gKy8qCj4gKyAqIDA6IE1TQiBzaGlmdCBmaXJzdAo+ICsgKiAxOiBMU0Ig c2hpZnQgZmlyc3QKPiArICovCj4gKyNkZWZpbmUgSTJTX0RBVEFfU0VRVUVOQ0UgMAo+ICsKPiAr LyoKPiArICogQXVkaW8gU2FtcGxlIFdvcmQgTGVuZ3RoCj4gKyAqIFdPUkRfTEVOR1RIXzE2QklU Cj4gKyAqIFdPUkRfTEVOR1RIXzE4QklUCj4gKyAqIFdPUkRfTEVOR1RIXzIwQklUCj4gKyAqIFdP UkRfTEVOR1RIXzI0QklUCj4gKyAqLwo+ICsjZGVmaW5lIEFVRElPX1dPUkRfTEVOR1RIIFdPUkRf TEVOR1RIXzI0QklUCj4gKwo+ICtlbnVtIGF1eF9jbWRfdHlwZSB7Cj4gKwlDTURfQVVYX05BVElW RV9SRUFEID0gMHgwLAo+ICsJQ01EX0FVWF9OQVRJVkVfV1JJVEUgPSAweDUsCj4gKwlDTURfQVVY X0kyQ19FRElEX1JFQUQgPSAweEIsCj4gK307Cj4gKwo+ICtlbnVtIGF1eF9jbWRfcmVwbHkgewo+ ICsJUkVQTFlfQUNLLAo+ICsJUkVQTFlfTkFDSywKPiArCVJFUExZX0RFRkVSLAo+ICt9Owo+ICsK PiArZW51bSBsaW5rX3RyYWluX3N0YXR1cyB7Cj4gKwlMSU5LX0lETEUsCj4gKwlMSU5LX0JVU1ks Cj4gKwlMSU5LX09LLAo+ICt9Owo+ICsKPiArZW51bSBtYXhfdmFsdWVfY2hlY2sgewo+ICsJVk9M VEFHRV9TV0lORywKPiArCVBSRV9FTVBIQVNJUywKPiArfTsKPiArCj4gK3N0cnVjdCBpdDY1MDVf cGxhdGZvcm1fZGF0YSB7Cj4gKwlzdHJ1Y3QgcmVndWxhdG9yICpwd3IxODsKPiArCXN0cnVjdCBy ZWd1bGF0b3IgKm92ZGQ7Cj4gKwlzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvZF9yZXNldDsKPiArfTsK PiArCj4gK2VudW0gaXQ2NTA1X2F1ZGlvX3NlbGVjdCB7Cj4gKwlJMlMgPSAwLAo+ICsJU1BESUYs Cj4gK307Cj4gKwo+ICtlbnVtIGl0NjUwNV9hdWRpb19zYW1wbGVfcmF0ZSB7Cj4gKwlTQU1QTEVf UkFURV8yNEsgPSAweDYsCj4gKwlTQU1QTEVfUkFURV8zMksgPSAweDMsCj4gKwlTQU1QTEVfUkFU RV80OEsgPSAweDIsCj4gKwlTQU1QTEVfUkFURV85NksgPSAweEEsCj4gKwlTQU1QTEVfUkFURV8x OTJLID0gMHhFLAo+ICsJU0FNUExFX1JBVEVfNDRfMUsgPSAweDAsCj4gKwlTQU1QTEVfUkFURV84 OF8ySyA9IDB4OCwKPiArCVNBTVBMRV9SQVRFXzE3Nl80SyA9IDB4QywKPiArfTsKPiArCj4gK2Vu dW0gaXQ2NTA1X2F1ZGlvX3R5cGUgewo+ICsJTFBDTSA9IDAsCj4gKwlOTFBDTSwKPiArCURTUywK PiArfTsKPiArCj4gK2VudW0gaXQ2NTA1X2F1ZGlvX3dvcmRfbGVuZ3RoIHsKPiArCVdPUkRfTEVO R1RIXzE2QklUID0gMCwKPiArCVdPUkRfTEVOR1RIXzE4QklULAo+ICsJV09SRF9MRU5HVEhfMjBC SVQsCj4gKwlXT1JEX0xFTkdUSF8yNEJJVCwKPiArfTsKPiArCj4gK3N0cnVjdCBpdDY1MDVfYXVk aW9fZGF0YSB7Cj4gKwllbnVtIGl0NjUwNV9hdWRpb19zZWxlY3Qgc2VsZWN0Owo+ICsJZW51bSBp dDY1MDVfYXVkaW9fc2FtcGxlX3JhdGUgc2FtcGxlX3JhdGU7Cj4gKwllbnVtIGl0NjUwNV9hdWRp b190eXBlIHR5cGU7Cj4gKwllbnVtIGl0NjUwNV9hdWRpb193b3JkX2xlbmd0aCB3b3JkX2xlbmd0 aDsKPiArCXU4IGNoYW5uZWxfY291bnQ7Cj4gKwl1OCBpMnNfaW5wdXRfZm9ybWF0Owo+ICsJdTgg aTJzX2p1c3RpZmllZDsKPiArCXU4IGkyc19kYXRhX2RlbGF5Owo+ICsJdTggaTJzX3dzX2NoYW5u ZWw7Cj4gKwl1OCBpMnNfZGF0YV9zZXF1ZW5jZTsKPiArfTsKPiArCj4gK3N0cnVjdCBpdDY1MDVf YXVkaW9fc2FtcGxlX3JhdGVfbWFwIHsKPiArCWVudW0gaXQ2NTA1X2F1ZGlvX3NhbXBsZV9yYXRl IHJhdGU7Cj4gKwlpbnQgc2FtcGxlX3JhdGVfdmFsdWU7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgaXQ2 NTA1X2RybV9kcF9saW5rIHsKPiArCXVuc2lnbmVkIGNoYXIgcmV2aXNpb247Cj4gKwl1bnNpZ25l ZCBpbnQgcmF0ZTsKPiArCXVuc2lnbmVkIGludCBudW1fbGFuZXM7Cj4gKwl1bnNpZ25lZCBsb25n IGNhcGFiaWxpdGllczsKPiArfTsKPiArCj4gK3N0cnVjdCBpdDY1MDUgewo+ICsJc3RydWN0IGRy bV9kcF9hdXggYXV4Owo+ICsJc3RydWN0IGRybV9icmlkZ2UgYnJpZGdlOwo+ICsJc3RydWN0IGky Y19jbGllbnQgKmNsaWVudDsKPiArCXN0cnVjdCBlZGlkICplZGlkOwo+ICsJc3RydWN0IGRybV9j b25uZWN0b3IgY29ubmVjdG9yOwo+ICsJc3RydWN0IGl0NjUwNV9kcm1fZHBfbGluayBsaW5rOwo+ ICsJc3RydWN0IGl0NjUwNV9wbGF0Zm9ybV9kYXRhIHBkYXRhOwo+ICsJc3RydWN0IG11dGV4IGV4 dGNvbl9sb2NrOwo+ICsJc3RydWN0IG11dGV4IG1vZGVfbG9jazsKPiArCXN0cnVjdCBtdXRleCBh dXhfbG9jazsKPiArCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKPiArCXN0cnVjdCBkcm1fZGlzcGxh eV9tb2RlIHZpZGVvX2luZm87Cj4gKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZXZlbnRfbmI7Cj4g KwlzdHJ1Y3QgZXh0Y29uX2RldiAqZXh0Y29uOwo+ICsJc3RydWN0IHdvcmtfc3RydWN0IGV4dGNv bl93cTsKPiArCWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgY29ubmVjdG9yX3N0YXR1czsKPiAr CWludCByZXZpc2lvbjsKPiArCWVudW0gbGlua190cmFpbl9zdGF0dXMgbGlua19zdGF0ZTsKPiAr CXN0cnVjdCB3b3JrX3N0cnVjdCBsaW5rX3dvcmtzOwo+ICsJdTggZHBjZFtEUF9SRUNFSVZFUl9D QVBfU0laRV07Cj4gKwl1OCBsYW5lX2NvdW50Owo+ICsJdTggbGlua19yYXRlX2J3X2NvZGU7Cj4g Kwl1OCBzaW5rX2NvdW50Owo+ICsJYm9vbCBzdGVwX3RyYWluOwo+ICsJYm9vbCBicmFuY2hfZGV2 aWNlOwo+ICsJYm9vbCBlbmFibGVfc3NjOwo+ICsJYm9vbCBsYW5lX3N3YXBfZGlzYWJsZWQ7Cj4g Kwlib29sIGxhbmVfc3dhcDsKPiArCWJvb2wgcG93ZXJlZDsKPiArCXUzMiBhZmVfc2V0dGluZzsK PiArCXN0cnVjdCBjb21wbGV0aW9uIHdhaXRfZWRpZF9jb21wbGV0ZTsKPiArCXU4IGF1dG9fdHJh aW5fcmV0cnk7Cj4gKwlib29sIGlzX3JlcGVhdGVyOwo+ICsJYm9vbCBlbmFibGVfZW5oYW5jZWRf ZnJhbWU7Cj4gKwloZG1pX2NvZGVjX3BsdWdnZWRfY2IgcGx1Z2dlZF9jYjsKPiArCXN0cnVjdCBk ZXZpY2UgKmNvZGVjX2RldjsKPiArCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF9hdWRpbzsK PiArCWJvb2wgZW5hYmxlX2F1ZGlvOwo+ICsJc3RydWN0IGl0NjUwNV9hdWRpb19kYXRhIGF1ZGlv Owo+ICsKPiArCS8qIGl0NjUwNSBkcml2ZXIgaG9sZCBvcHRpb24gKi8KPiArCWJvb2wgZW5hYmxl X2Rydl9ob2xkOwo+ICt9Owo+ICsKPiArc3RydWN0IGl0NjUwNV9zdGVwX3RyYWluX3BhcmEgewo+ ICsJdTggdm9sdGFnZV9zd2luZ1tNQVhfTEFORV9DT1VOVF07Cj4gKwl1OCBwcmVfZW1waGFzaXNb TUFYX0xBTkVfQ09VTlRdOwo+ICt9Owo+ICsKPiArLyoKPiArICogVmVuZG9yIG9wdGlvbiBhZmUg c2V0dGluZ3MgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMKPiArICogMDogZm9yIGJpdGxhbmQgMTBl LCBxdWFudGEgemRlCj4gKyAqIDE6IGZvciBnb29nbGUga3VrdWkgcDEvcDIsIGh1YXFpbiBrcmFu ZQo+ICsgKi8KPiArCj4gK3N0YXRpYyB1OCBjb25zdCBhZmVfc2V0dGluZ190YWJsZVtdWzNdID0g ewo+ICsJezB4ODIsIDB4MDAsIDB4QTZ9LAo+ICsJezB4OTMsIDB4MkEsIDB4ODV9Cj4gK307Cj4g Kwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGl0NjUwNV9hdWRpb19zYW1wbGVfcmF0ZV9tYXAgYXVk aW9fc2FtcGxlX3JhdGVfbWFwW10gPSB7Cj4gKwl7U0FNUExFX1JBVEVfMjRLLCAyNDAwMH0sCj4g Kwl7U0FNUExFX1JBVEVfMzJLLCAzMjAwMH0sCj4gKwl7U0FNUExFX1JBVEVfNDhLLCA0ODAwMH0s Cj4gKwl7U0FNUExFX1JBVEVfOTZLLCA5NjAwMH0sCj4gKwl7U0FNUExFX1JBVEVfMTkySywgMTky MDAwfSwKPiArCXtTQU1QTEVfUkFURV80NF8xSywgNDQxMDB9LAo+ICsJe1NBTVBMRV9SQVRFXzg4 XzJLLCA4ODIwMH0sCj4gKwl7U0FNUExFX1JBVEVfMTc2XzRLLCAxNzY0MDB9LAo+ICt9Owo+ICsK PiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfcmFuZ2UgaXQ2NTA1X2JyaWRnZV92b2xhdGls ZV9yYW5nZXNbXSA9IHsKPiArCXsgLnJhbmdlX21pbiA9IDAsIC5yYW5nZV9tYXggPSAweEZGIH0s Cj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaXQ2 NTA1X2JyaWRnZV92b2xhdGlsZV90YWJsZSA9IHsKPiArCS55ZXNfcmFuZ2VzID0gaXQ2NTA1X2Jy aWRnZV92b2xhdGlsZV9yYW5nZXMsCj4gKwkubl95ZXNfcmFuZ2VzID0gQVJSQVlfU0laRShpdDY1 MDVfYnJpZGdlX3ZvbGF0aWxlX3JhbmdlcyksCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IHJlZ21hcF9jb25maWcgaXQ2NTA1X3JlZ21hcF9jb25maWcgPSB7Cj4gKwkucmVnX2JpdHMg PSA4LAo+ICsJLnZhbF9iaXRzID0gOCwKPiArCS52b2xhdGlsZV90YWJsZSA9ICZpdDY1MDVfYnJp ZGdlX3ZvbGF0aWxlX3RhYmxlLAo+ICsJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9OT05FLAo+ICt9 Owo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfcmVhZChzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVu c2lnbmVkIGludCByZWdfYWRkcikKPiArewo+ICsJdW5zaWduZWQgaW50IHZhbHVlOwo+ICsJaW50 IGVycjsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsK PiArCWVyciA9IHJlZ21hcF9yZWFkKGl0NjUwNS0+cmVnbWFwLCByZWdfYWRkciwgJnZhbHVlKTsK PiArCWlmIChlcnIgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJyZWFkIGZhaWxlZCBy ZWdbMHgleF0gZXJyOiAlZCIsIHJlZ19hZGRyLAo+ICsJCQkgICAgICBlcnIpOwo+ICsJCXJldHVy biBlcnI7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHZhbHVlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IGl0NjUwNV93cml0ZShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVuc2lnbmVkIGludCByZWdfYWRk ciwKPiArCQkgICAgICB1bnNpZ25lZCBpbnQgcmVnX3ZhbCkKPiArewo+ICsJaW50IGVycjsKPiAr CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsKPiArCWVyciA9 IHJlZ21hcF93cml0ZShpdDY1MDUtPnJlZ21hcCwgcmVnX2FkZHIsIHJlZ192YWwpOwo+ICsKPiAr CWlmIChlcnIgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJ3cml0ZSBmYWlsZWQgcmVn WzB4JXhdID0gMHgleCBlcnIgPSAlZCIsCj4gKwkJCSAgICAgIHJlZ19hZGRyLCByZWdfdmFsLCBl cnIpOwo+ICsJCXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgaXQ2NTA1X3NldF9iaXRzKHN0cnVjdCBpdDY1MDUgKml0NjUwNSwgdW5zaWdu ZWQgaW50IHJlZywKPiArCQkJIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsdWUp Cj4gK3sKPiArCWludCBlcnI7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGll bnQtPmRldjsKPiArCj4gKwllcnIgPSByZWdtYXBfdXBkYXRlX2JpdHMoaXQ2NTA1LT5yZWdtYXAs IHJlZywgbWFzaywgdmFsdWUpOwo+ICsJaWYgKGVyciA8IDApIHsKPiArCQlEUk1fREVWX0VSUk9S KAo+ICsJCQlkZXYsICJ3cml0ZSByZWdbMHgleF0gPSAweCV4IG1hc2sgPSAweCV4IGZhaWxlZCBl cnIgJWQiLAo+ICsJCQlyZWcsIHZhbHVlLCBtYXNrLCBlcnIpOwo+ICsJCXJldHVybiBlcnI7Cj4g Kwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaXQ2NTA1X2RwY2Rf cmVhZChzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQo+ICt7Cj4g Kwl1OCB2YWx1ZTsKPiArCWludCByZXQ7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1 LT5jbGllbnQtPmRldjsKPiArCj4gKwlyZXQgPSBkcm1fZHBfZHBjZF9yZWFkYigmaXQ2NTA1LT5h dXgsIG9mZnNldCwgJnZhbHVlKTsKPiArCWlmIChyZXQgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJP UihkZXYsICJEUENEIHJlYWQgZmFpbGVkIFsweCVseF0gcmV0OiAlZCIsIG9mZnNldCwKPiArCQkJ ICAgICAgcmV0KTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsJcmV0dXJuIHZhbHVlOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IGl0NjUwNV9kcGNkX3dyaXRlKHN0cnVjdCBpdDY1MDUgKml0NjUw NSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCj4gKwkJCSAgICAgdW5zaWduZWQgbG9uZyBkYXRhaW4p Cj4gK3sKPiArCWludCByZXQ7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGll bnQtPmRldjsKPiArCj4gKwlyZXQgPSBkcm1fZHBfZHBjZF93cml0ZWIoJml0NjUwNS0+YXV4LCBv ZmZzZXQsIGRhdGFpbik7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCURSTV9ERVZfRVJST1IoZGV2 LCAiRFBDRCB3cml0ZSBmYWlsZWQgWzB4JWx4XSByZXQ6ICVkIiwgb2Zmc2V0LAo+ICsJCQkgICAg ICByZXQpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiAr c3RhdGljIGludCBpdDY1MDVfZ2V0X2RwY2Qoc3RydWN0IGl0NjUwNSAqaXQ2NTA1LCBpbnQgb2Zm c2V0LCB1OCAqZHBjZCwgaW50IG51bSkKPiArewo+ICsJaW50IHJldDsKPiArCXN0cnVjdCBkZXZp Y2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsKPiArCXJldCA9IGRybV9kcF9kcGNk X3JlYWQoJml0NjUwNS0+YXV4LCBvZmZzZXQsIGRwY2QsIG51bSk7Cj4gKwo+ICsJaWYgKHJldCA8 IDApCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJy ZXQgPSAlZCBEUENEWzB4JXhdID0gMHglKnBoIiwgcmV0LCBvZmZzZXQsCj4gKwkJCSAgICAgbnVt LCBkcGNkKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1 X2R1bXAoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwl1bnNpZ25lZCBpbnQgaSwgajsK PiArCXU4IHJlZ3NbMTZdOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUwNS0+Y2xpZW50 LT5kZXY7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8PSAweGZmOyBpICs9IDE2KSB7Cj4gKwkJZm9y IChqID0gMDsgaiA8IDE2OyBqKyspCj4gKwkJCXJlZ3Nbal0gPSBpdDY1MDVfcmVhZChpdDY1MDUs IGkgKyBqKTsKPiArCj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiWzB4JTAyeF0gPSAl MTZwaCIsIGksIHJlZ3MpOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgYm9vbCBpdDY1MDVfZ2V0 X3NpbmtfaHBkX3N0YXR1cyhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWludCByZWdf MGQ7Cj4gKwo+ICsJcmVnXzBkID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBSRUdfU1lTVEVNX1NUUyk7 Cj4gKwo+ICsJaWYgKHJlZ18wZCA8IDApCj4gKwkJcmV0dXJuIGZhbHNlOwo+ICsKPiArCXJldHVy biAocmVnXzBkICYgSFBEX1NUUykgPyB0cnVlIDogZmFsc2U7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgaXQ2NTA1X3JlYWRfd29yZChzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVuc2lnbmVkIGludCBy ZWcpCj4gK3sKPiArCWludCB2YWwwLCB2YWwxOwo+ICsKPiArCXZhbDAgPSBpdDY1MDVfcmVhZChp dDY1MDUsIHJlZyk7Cj4gKwlpZiAodmFsMCA8IDApCj4gKwkJcmV0dXJuIHZhbDA7Cj4gKwo+ICsJ dmFsMSA9IGl0NjUwNV9yZWFkKGl0NjUwNSwgcmVnICsgMSk7Cj4gKwlpZiAodmFsMSA8IDApCj4g KwkJcmV0dXJuIHZhbDE7Cj4gKwo+ICsJcmV0dXJuICh2YWwxIDw8IDgpIHwgdmFsMDsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2NhbGNfdmlkZW9faW5mbyhzdHJ1Y3QgaXQ2NTA1ICpp dDY1MDUpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2 Owo+ICsJaW50IGhzeW5jX3BvbCwgdnN5bmNfcG9sLCBpbnRlcmxhY2VkOwo+ICsJaW50IGh0b3Rh bCwgaGRlcywgaGRldywgaGZwaCwgaHN5bmN3Owo+ICsJaW50IHZ0b3RhbCwgdmRlcywgdmRldywg dmZwaCwgdnN5bmN3Owo+ICsJaW50IHJkZGF0YSwgaSwgcGNsaywgc3VtOwo+ICsKPiArCXVzbGVl cF9yYW5nZSgxMDAwMCwgMTUwMDApOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0JBTktf U0VMLCAweDAwKTsKPiArCXJkZGF0YSA9IGl0NjUwNV9yZWFkKGl0NjUwNSwgUkVHX0lOUFVUX0NU UkwpOwo+ICsJaHN5bmNfcG9sID0gcmRkYXRhICYgSU5QVVRfSFNZTkNfUE9MOwo+ICsJdnN5bmNf cG9sID0gKHJkZGF0YSAmIElOUFVUX1ZTWU5DX1BPTCkgPj4gMjsKPiArCWludGVybGFjZWQgPSAo cmRkYXRhICYgSU5QVVRfSU5URVJMQUNFRCkgPj4gNDsKPiArCj4gKwlodG90YWwgPSBpdDY1MDVf cmVhZF93b3JkKGl0NjUwNSwgUkVHX0lOUFVUX0hUT1RBTCkgJiAweDFGRkY7Cj4gKwloZGVzID0g aXQ2NTA1X3JlYWRfd29yZChpdDY1MDUsIFJFR19JTlBVVF9IQUNUSVZFX1NUQVJUKSAmIDB4MUZG RjsKPiArCWhkZXcgPSBpdDY1MDVfcmVhZF93b3JkKGl0NjUwNSwgUkVHX0lOUFVUX0hBQ1RJVkVf V0lEVEgpICYgMHgxRkZGOwo+ICsJaGZwaCA9IGl0NjUwNV9yZWFkX3dvcmQoaXQ2NTA1LCBSRUdf SU5QVVRfSEZST05UX1BPUkNIKSAmIDB4MUZGRjsKPiArCWhzeW5jdyA9IGl0NjUwNV9yZWFkX3dv cmQoaXQ2NTA1LCBSRUdfSU5QVVRfSFNZTkNfV0lEVEgpICYgMHgxRkZGOwo+ICsKPiArCXZ0b3Rh bCA9IGl0NjUwNV9yZWFkX3dvcmQoaXQ2NTA1LCBSRUdfSU5QVVRfVlRPVEFMKSAmIDB4RkZGOwo+ ICsJdmRlcyA9IGl0NjUwNV9yZWFkX3dvcmQoaXQ2NTA1LCBSRUdfSU5QVVRfVkFDVElWRV9TVEFS VCkgJiAweEZGRjsKPiArCXZkZXcgPSBpdDY1MDVfcmVhZF93b3JkKGl0NjUwNSwgUkVHX0lOUFVU X1ZBQ1RJVkVfV0lEVEgpICYgMHhGRkY7Cj4gKwl2ZnBoID0gaXQ2NTA1X3JlYWRfd29yZChpdDY1 MDUsIFJFR19JTlBVVF9WRlJPTlRfUE9SQ0gpICYgMHhGRkY7Cj4gKwl2c3luY3cgPSBpdDY1MDVf cmVhZF93b3JkKGl0NjUwNSwgUkVHX0lOUFVUX1ZTWU5DX1dJRFRIKSAmIDB4RkZGOwo+ICsKPiAr CXN1bSA9IDA7Cj4gKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewo+ICsJCWl0NjUwNV9zZXRf Yml0cyhpdDY1MDUsIFJFR19EQVRBX0NUUkwwLCBFTkFCTEVfUENMS19DT1VOVEVSLAo+ICsJCQkJ RU5BQkxFX1BDTEtfQ09VTlRFUik7Cj4gKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxNTAwMCk7Cj4g KwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RBVEFfQ1RSTDAsIEVOQUJMRV9QQ0xLX0NP VU5URVIsCj4gKwkJCQkweDAwKTsKPiArCQlyZGRhdGEgPSBpdDY1MDVfcmVhZF93b3JkKGl0NjUw NSwgUkVHX1BDTEtfQ09VTlRFUl9WQUxVRSkgJgo+ICsJCQkgMHhGRkY7Cj4gKwo+ICsJCXN1bSAr PSByZGRhdGE7Cj4gKwl9Cj4gKwo+ICsJaWYgKHN1bSA9PSAwKSB7Cj4gKwkJRFJNX0RFVl9ERUJV R19EUklWRVIoZGV2LCAiY2FsYyB2aWRlbyB0aW1pbmcgZXJyb3IiKTsKPiArCQlyZXR1cm47Cj4g Kwl9Cj4gKwo+ICsJc3VtIC89IDEwOwo+ICsJcGNsayA9IDEzNTAwICogMjA0OCAvIHN1bTsKPiAr CWl0NjUwNS0+dmlkZW9faW5mby5jbG9jayA9IHBjbGs7Cj4gKwlpdDY1MDUtPnZpZGVvX2luZm8u aGRpc3BsYXkgPSBoZGV3Owo+ICsJaXQ2NTA1LT52aWRlb19pbmZvLmhzeW5jX3N0YXJ0ID0gaGRl dyArIGhmcGg7Cj4gKwlpdDY1MDUtPnZpZGVvX2luZm8uaHN5bmNfZW5kID0gaGRldyArIGhmcGgg KyBoc3luY3c7Cj4gKwlpdDY1MDUtPnZpZGVvX2luZm8uaHRvdGFsID0gaHRvdGFsOwo+ICsJaXQ2 NTA1LT52aWRlb19pbmZvLnZkaXNwbGF5ID0gdmRldzsKPiArCWl0NjUwNS0+dmlkZW9faW5mby52 c3luY19zdGFydCA9IHZkZXcgKyB2ZnBoOwo+ICsJaXQ2NTA1LT52aWRlb19pbmZvLnZzeW5jX2Vu ZCA9IHZkZXcgKyB2ZnBoICsgdnN5bmN3Owo+ICsJaXQ2NTA1LT52aWRlb19pbmZvLnZ0b3RhbCA9 IHZ0b3RhbDsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsIERSTV9NT0RFX0ZNVCwK PiArCQkJICAgICBEUk1fTU9ERV9BUkcoJml0NjUwNS0+dmlkZW9faW5mbykpOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgaW50IGl0NjUwNV9kcm1fZHBfbGlua19wcm9iZShzdHJ1Y3QgZHJtX2RwX2F1eCAq YXV4LAo+ICsJCQkJICAgIHN0cnVjdCBpdDY1MDVfZHJtX2RwX2xpbmsgKmxpbmspCj4gK3sKPiAr CXU4IHZhbHVlc1szXTsKPiArCWludCBlcnI7Cj4gKwo+ICsJbWVtc2V0KGxpbmssIDAsIHNpemVv ZigqbGluaykpOwo+ICsKPiArCWVyciA9IGRybV9kcF9kcGNkX3JlYWQoYXV4LCBEUF9EUENEX1JF ViwgdmFsdWVzLCBzaXplb2YodmFsdWVzKSk7Cj4gKwlpZiAoZXJyIDwgMCkKPiArCQlyZXR1cm4g ZXJyOwo+ICsKPiArCWxpbmstPnJldmlzaW9uID0gdmFsdWVzWzBdOwo+ICsJbGluay0+cmF0ZSA9 IGRybV9kcF9id19jb2RlX3RvX2xpbmtfcmF0ZSh2YWx1ZXNbMV0pOwo+ICsJbGluay0+bnVtX2xh bmVzID0gdmFsdWVzWzJdICYgRFBfTUFYX0xBTkVfQ09VTlRfTUFTSzsKPiArCj4gKwlpZiAodmFs dWVzWzJdICYgRFBfRU5IQU5DRURfRlJBTUVfQ0FQKQo+ICsJCWxpbmstPmNhcGFiaWxpdGllcyA9 IDE7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaXQ2NTA1X2RybV9k cF9saW5rX3Bvd2VyX3VwKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsCj4gKwkJCQkgICAgICAgc3Ry dWN0IGl0NjUwNV9kcm1fZHBfbGluayAqbGluaykKPiArewo+ICsJdTggdmFsdWU7Cj4gKwlpbnQg ZXJyOwo+ICsKPiArCS8qIERQX1NFVF9QT1dFUiByZWdpc3RlciBpcyBvbmx5IGF2YWlsYWJsZSBv biBEUENEIHYxLjEgYW5kIGxhdGVyICovCj4gKwlpZiAobGluay0+cmV2aXNpb24gPCAweDExKQo+ ICsJCXJldHVybiAwOwo+ICsKPiArCWVyciA9IGRybV9kcF9kcGNkX3JlYWRiKGF1eCwgRFBfU0VU X1BPV0VSLCAmdmFsdWUpOwo+ICsJaWYgKGVyciA8IDApCj4gKwkJcmV0dXJuIGVycjsKPiArCj4g Kwl2YWx1ZSAmPSB+RFBfU0VUX1BPV0VSX01BU0s7Cj4gKwl2YWx1ZSB8PSBEUF9TRVRfUE9XRVJf RDA7Cj4gKwo+ICsJZXJyID0gZHJtX2RwX2RwY2Rfd3JpdGViKGF1eCwgRFBfU0VUX1BPV0VSLCB2 YWx1ZSk7Cj4gKwlpZiAoZXJyIDwgMCkKPiArCQlyZXR1cm4gZXJyOwo+ICsKPiArCS8qCj4gKwkg KiBBY2NvcmRpbmcgdG8gdGhlIERQIDEuMSBzcGVjaWZpY2F0aW9uLCBhICJTaW5rIERldmljZSBt dXN0IGV4aXQgdGhlCj4gKwkgKiBwb3dlciBzYXZpbmcgc3RhdGUgd2l0aGluIDEgbXMiIChTZWN0 aW9uIDIuNS4zLjEsIFRhYmxlIDUtNTIsICJTaW5rCj4gKwkgKiBDb250cm9sIEZpZWxkIiAocmVn aXN0ZXIgMHg2MDApLgo+ICsJICovCj4gKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Cj4gKwo+ ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9jbGVhcl9pbnQoc3Ry dWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQkFO S19TRUwsIDB4MDApOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgSU5UX1NUQVRVU18wMSwgMHhG Rik7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBJTlRfU1RBVFVTXzAyLCAweEZGKTsKPiArCWl0 NjUwNV93cml0ZShpdDY1MDUsIElOVF9TVEFUVVNfMDMsIDB4RkYpOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgdm9pZCBpdDY1MDVfaW50X21hc2tfZW5hYmxlKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiAr ewo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0JBTktfU0VMLCAweDAwKTsKPiArCWl0NjUw NV93cml0ZShpdDY1MDUsIElOVF9NQVNLXzAxLCAweDFGKTsKPiArCWl0NjUwNV93cml0ZShpdDY1 MDUsIElOVF9NQVNLXzAyLCAweDA3KTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIElOVF9NQVNL XzAzLCAweEIwKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2ludF9tYXNrX2Rpc2Fi bGUoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBS RUdfQkFOS19TRUwsIDB4MDApOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgSU5UX01BU0tfMDEs IDB4MDApOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgSU5UX01BU0tfMDIsIDB4MDApOwo+ICsJ aXQ2NTA1X3dyaXRlKGl0NjUwNSwgSU5UX01BU0tfMDMsIDB4MDApOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgdm9pZCBpdDY1MDVfbGFuZV90ZXJtaW5hdGlvbl9vbihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUp Cj4gK3sKPiArCWlmIChpdDY1MDVfcmVhZChpdDY1MDUsIDB4Q0YpID09IDB4RjApCj4gKwkJaXQ2 NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RSVl9MTl9EQVRBX1NFTCwgMHg4MCwgMHgwMCk7Cj4g Kwo+ICsJaWYgKGl0NjUwNV9yZWFkKGl0NjUwNSwgMHhDRikgPT0gMHg3MCkgewo+ICsJCWlmIChp dDY1MDUtPmxhbmVfc3dhcCkgewo+ICsJCQlzd2l0Y2ggKGl0NjUwNS0+bGFuZV9jb3VudCkgewo+ ICsJCQljYXNlIDE6Cj4gKwkJCWNhc2UgMjoKPiArCQkJCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUs IFJFR19EUlZfTE5fREFUQV9TRUwsCj4gKwkJCQkJCTB4MEMsIDB4MDgpOwo+ICsJCQkJYnJlYWs7 Cj4gKwkJCWRlZmF1bHQ6Cj4gKwkJCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfRFJWX0xO X0RBVEFfU0VMLAo+ICsJCQkJCQkweDBDLCAweDBDKTsKPiArCQkJCWJyZWFrOwo+ICsJCQl9Cj4g KwkJfSBlbHNlIHsKPiArCQkJc3dpdGNoIChpdDY1MDUtPmxhbmVfY291bnQpIHsKPiArCQkJY2Fz ZSAxOgo+ICsJCQljYXNlIDI6Cj4gKwkJCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfRFJW X0xOX0RBVEFfU0VMLAo+ICsJCQkJCQkweDBDLCAweDA0KTsKPiArCQkJCWJyZWFrOwo+ICsJCQlk ZWZhdWx0Ogo+ICsJCQkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RSVl9MTl9EQVRBX1NF TCwKPiArCQkJCQkJMHgwQywgMHgwQyk7Cj4gKwkJCQlicmVhazsKPiArCQkJfQo+ICsJCX0KPiAr CX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2xhbmVfdGVybWluYXRpb25fb2ZmKHN0 cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJaWYgKGl0NjUwNV9yZWFkKGl0NjUwNSwgMHhD RikgPT0gMHhGMCkKPiArCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfRFJWX0xOX0RBVEFf U0VMLCAweDgwLCAweDgwKTsKPiArCj4gKwlpZiAoaXQ2NTA1X3JlYWQoaXQ2NTA1LCAweENGKSA9 PSAweDcwKQo+ICsJCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19EUlZfTE5fREFUQV9TRUws IDB4MEMsIDB4MDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfbGFuZV9wb3dlcl9v bihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWl0NjUwNV9zZXRfYml0cygKPiArCQlp dDY1MDUsIFJFR19MSU5LX0RSViwgMHhGMSwKPiArCQkoKEJJVChpdDY1MDUtPmxhbmVfY291bnQp IC0gMSkKPiArCQkgPDwgKGl0NjUwNS0+bGFuZV9zd2FwID8gKDggLSBpdDY1MDUtPmxhbmVfY291 bnQpIDogNCkpIHwKPiArCQkJMHgwMSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9s YW5lX3Bvd2VyX29mZihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWl0NjUwNV9zZXRf Yml0cyhpdDY1MDUsIFJFR19MSU5LX0RSViwgMHhGMCwgMHgwMCk7Cj4gK30KPiArCj4gK3N0YXRp YyB2b2lkIGl0NjUwNV9sYW5lX29mZihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWl0 NjUwNV9sYW5lX3Bvd2VyX29mZihpdDY1MDUpOwo+ICsJaXQ2NTA1X2xhbmVfdGVybWluYXRpb25f b2ZmKGl0NjUwNSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9hdXhfdGVybWluYXRp b25fb24oc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpZiAoaXQ2NTA1X3JlYWQoaXQ2 NTA1LCAweENGKSA9PSAweEYwKQo+ICsJCWl0NjUwNV9sYW5lX3Rlcm1pbmF0aW9uX29uKGl0NjUw NSk7Cj4gKwo+ICsJaWYgKGl0NjUwNV9yZWFkKGl0NjUwNSwgMHhDRikgPT0gMHg3MCkKPiArCQlp dDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfRFJWX0xOX0RBVEFfU0VMLCAweDgwLCAweDgwKTsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2F1eF9wb3dlcl9vbihzdHJ1Y3QgaXQ2NTA1 ICppdDY1MDUpCj4gK3sKPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19BVVgsIDB4MDIs IDB4MDIpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfYXV4X29uKHN0cnVjdCBpdDY1 MDUgKml0NjUwNSkKPiArewo+ICsJaXQ2NTA1X2F1eF9wb3dlcl9vbihpdDY1MDUpOwo+ICsJaXQ2 NTA1X2F1eF90ZXJtaW5hdGlvbl9vbihpdDY1MDUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBp dDY1MDVfYXV4X3Jlc2V0KHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJaXQ2NTA1X3Nl dF9iaXRzKGl0NjUwNSwgUkVHX1JFU0VUX0NUUkwsIEFVWF9SRVNFVCwgQVVYX1JFU0VUKTsKPiAr CWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19SRVNFVF9DVFJMLCBBVVhfUkVTRVQsIDB4MDAp Owo+ICt9Cj4gKwo+ICtzdGF0aWMgYm9vbCBpdDY1MDVfcmVzZXRfbG9naWMoc3RydWN0IGl0NjUw NSAqaXQ2NTA1KQo+ICt7Cj4gKwlyZWdtYXBfd3JpdGUoaXQ2NTA1LT5yZWdtYXAsIFJFR19SRVNF VF9DVFJMLCBBTExfTE9HSUNfUkVTRVQpOwo+ICsJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwo+ ICsKPiArCWl0NjUwNS0+cmV2aXNpb24gPSBpdDY1MDVfcmVhZChpdDY1MDUsIFJFR19JQ19WRVIp Owo+ICsKPiArCWlmIChpdDY1MDUtPnJldmlzaW9uIDwgMCkKPiArCQlyZXR1cm4gZmFsc2U7Cj4g Kwo+ICsJcmV0dXJuIHRydWU7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGl0NjUwNV9hdXhfb3Bf ZmluaXNoZWQoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpbnQgcmVnMmIgPSBpdDY1 MDVfcmVhZChpdDY1MDUsIFJFR19BVVhfQ01EX1JFUSk7Cj4gKwo+ICsJaWYgKHJlZzJiIDwgMCkK PiArCQlyZXR1cm4gZmFsc2U7Cj4gKwo+ICsJcmV0dXJuIChyZWcyYiAmIEFVWF9CVVNZKSA9PSAw Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGl0NjUwNV9hdXhfd2FpdChzdHJ1Y3QgaXQ2NTA1ICpp dDY1MDUpCj4gK3sKPiArCWludCBzdGF0dXM7Cj4gKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Cj4g KwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCj4gKwl0aW1l b3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQVVYX1dBSVRfVElNRU9VVF9NUykgKyAx Owo+ICsKPiArCXdoaWxlICghaXQ2NTA1X2F1eF9vcF9maW5pc2hlZChpdDY1MDUpKSB7Cj4gKwkJ aWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKPiArCQkJRFJNX0RFVl9FUlJPUihk ZXYsICJUaW1lZCBvdXQgd2FpdGluZyBBVVggdG8gZmluaXNoIik7Cj4gKwkJCXJldHVybiAtRVRJ TUVET1VUOwo+ICsJCX0KPiArCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Cj4gKwl9Cj4gKwo+ ICsJc3RhdHVzID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBSRUdfQVVYX0VSUk9SX1NUUyk7Cj4gKwlp ZiAoc3RhdHVzIDwgMCkgewo+ICsJCURSTV9ERVZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIHJlYWQg QVVYIGNoYW5uZWw6ICVkIiwgc3RhdHVzKTsKPiArCQlyZXR1cm4gc3RhdHVzOwo+ICsJfQo+ICsK PiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3NpemVfdCBpdDY1MDVfYXV4X29wZXJh dGlvbihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsCj4gKwkJCQkgICAgZW51bSBhdXhfY21kX3R5cGUg Y21kLAo+ICsJCQkJICAgIHVuc2lnbmVkIGludCBhZGRyZXNzLCB1OCAqYnVmZmVyLAo+ICsJCQkJ ICAgIHNpemVfdCBzaXplLCBlbnVtIGF1eF9jbWRfcmVwbHkgKnJlcGx5KQo+ICt7Cj4gKwlpbnQg aSwgc3RhdHVzOwo+ICsJYm9vbCBhdXhfd3JpdGVfY2hlY2sgPSBmYWxzZTsKPiArCj4gKwlpZiAo IWl0NjUwNV9nZXRfc2lua19ocGRfc3RhdHVzKGl0NjUwNSkpCj4gKwkJcmV0dXJuIC1FSU87Cj4g Kwo+ICsJLyogc2V0IEFVWCB1c2VyIG1vZGUgKi8KPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUs IFJFR19BVVhfQ1RSTCwgQVVYX1VTRVJfTU9ERSwgQVVYX1VTRVJfTU9ERSk7Cj4gKwo+ICthdXhf b3Bfc3RhcnQ6Cj4gKwo+ICsJaWYgKGNtZCA9PSBDTURfQVVYX0kyQ19FRElEX1JFQUQpIHsKPiAr CQkvKiBEUCBBVVggRURJRCBGSUZPIGhhcyBtYXhpbXVtIGxlbmd0aCBvZiBuIGJ5dGVzLiAqLwo+ ICsJCXNpemUgPSBtaW5fdChzaXplX3QsIHNpemUsIEFVWF9GSUZPX01BWF9TSVpFKTsKPiArCQkv KiBFbmFibGUgQVVYIEZJRk8gcmVhZCBiYWNrIGFuZCBjbGVhciBGSUZPICovCj4gKwkJaXQ2NTA1 X3NldF9iaXRzKGl0NjUwNSwgUkVHX0FVWF9DVFJMLAo+ICsJCQkJQVVYX0VOX0ZJRk9fUkVBRCB8 IENMUl9FRElEX0ZJRk8sCj4gKwkJCQlBVVhfRU5fRklGT19SRUFEIHwgQ0xSX0VESURfRklGTyk7 Cj4gKwo+ICsJCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19BVVhfQ1RSTCwKPiArCQkJCUFV WF9FTl9GSUZPX1JFQUQgfCBDTFJfRURJRF9GSUZPLAo+ICsJCQkJQVVYX0VOX0ZJRk9fUkVBRCk7 Cj4gKwl9IGVsc2Ugewo+ICsJCS8qIFRoZSBEUCBBVVggdHJhbnNtaXQgYnVmZmVyIGhhcyA0IGJ5 dGVzLiAqLwo+ICsJCXNpemUgPSBtaW5fdChzaXplX3QsIHNpemUsIDQpOwo+ICsJCWl0NjUwNV9z ZXRfYml0cyhpdDY1MDUsIFJFR19BVVhfQ1RSTCwgQVVYX05PX1NFR01FTlRfV1IsCj4gKwkJCQlB VVhfTk9fU0VHTUVOVF9XUik7Cj4gKwl9Cj4gKwo+ICsJLyogU3RhcnQgQWRkcmVzc1s3OjBdICov Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVYX0FEUl8wXzcsIChhZGRyZXNzID4+IDAp ICYgMHhGRik7Cj4gKwkvKiBTdGFydCBBZGRyZXNzWzE1OjhdICovCj4gKwlpdDY1MDVfd3JpdGUo aXQ2NTA1LCBSRUdfQVVYX0FEUl84XzE1LCAoYWRkcmVzcyA+PiA4KSAmIDB4RkYpOwo+ICsJLyog V3JpdGVOdW1bMzowXStTdGFydEFkclsxOToxNl0gKi8KPiArCWl0NjUwNV93cml0ZShpdDY1MDUs IFJFR19BVVhfQURSXzE2XzE5LAo+ICsJCSAgICAgKChhZGRyZXNzID4+IDE2KSAmIDB4MEYpIHwg KChzaXplIC0gMSkgPDwgNCkpOwo+ICsKPiArCWlmIChjbWQgPT0gQ01EX0FVWF9OQVRJVkVfV1JJ VEUpCj4gKwkJcmVnbWFwX2J1bGtfd3JpdGUoaXQ2NTA1LT5yZWdtYXAsIFJFR19BVVhfT1VUX0RB VEEwLCBidWZmZXIsCj4gKwkJCQkgIHNpemUpOwo+ICsKPiArCS8qIEF1eCBGaXJlICovCj4gKwlp dDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVYX0NNRF9SRVEsIGNtZCk7Cj4gKwo+ICsJc3RhdHVz ID0gaXQ2NTA1X2F1eF93YWl0KGl0NjUwNSk7Cj4gKwlpZiAoc3RhdHVzIDwgMCkKPiArCQlnb3Rv IGF1eF9vcF9lcnI7Cj4gKwo+ICsJc3RhdHVzID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBSRUdfQVVY X0VSUk9SX1NUUyk7Cj4gKwlpZiAoc3RhdHVzIDwgMCkKPiArCQlnb3RvIGF1eF9vcF9lcnI7Cj4g Kwo+ICsJc3dpdGNoICgoc3RhdHVzID4+IDYpICYgMHgzKSB7Cj4gKwljYXNlIDA6Cj4gKwkJKnJl cGx5ID0gUkVQTFlfQUNLOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSAxOgo+ICsJCSpyZXBseSA9IFJF UExZX0RFRkVSOwo+ICsJCXN0YXR1cyA9IC1FQUdBSU47Cj4gKwkJZ290byBhdXhfb3BfZXJyOwo+ ICsJY2FzZSAyOgo+ICsJCSpyZXBseSA9IFJFUExZX05BQ0s7Cj4gKwkJc3RhdHVzID0gLUVJTzsK PiArCQlnb3RvIGF1eF9vcF9lcnI7Cj4gKwljYXNlIDM6Cj4gKwkJc3RhdHVzID0gLUVUSU1FRE9V VDsKPiArCQlnb3RvIGF1eF9vcF9lcnI7Cj4gKwl9Cj4gKwo+ICsJLyogUmVhZCBiYWNrIE5hdGl2 ZSBXcml0ZSBkYXRhICovCj4gKwlpZiAoY21kID09IENNRF9BVVhfTkFUSVZFX1dSSVRFKSB7Cj4g KwkJYXV4X3dyaXRlX2NoZWNrID0gdHJ1ZTsKPiArCQljbWQgPSBDTURfQVVYX05BVElWRV9SRUFE Owo+ICsJCWdvdG8gYXV4X29wX3N0YXJ0Owo+ICsJfQo+ICsKPiArCWlmIChjbWQgPT0gQ01EX0FV WF9JMkNfRURJRF9SRUFEKSB7Cj4gKwkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewo+ICsJ CQlzdGF0dXMgPSBpdDY1MDVfcmVhZChpdDY1MDUsIFJFR19BVVhfREFUQV9GSUZPKTsKPiArCQkJ aWYgKHN0YXR1cyA8IDApCj4gKwkJCQlnb3RvIGF1eF9vcF9lcnI7Cj4gKwkJCWJ1ZmZlcltpXSA9 IHN0YXR1czsKPiArCQl9Cj4gKwl9IGVsc2Ugewo+ICsJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBp KyspIHsKPiArCQkJc3RhdHVzID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBSRUdfQVVYX0RBVEFfMF83 ICsgaSk7Cj4gKwkJCWlmIChzdGF0dXMgPCAwKQo+ICsJCQkJZ290byBhdXhfb3BfZXJyOwo+ICsK PiArCQkJaWYgKGF1eF93cml0ZV9jaGVjayAmJiBidWZmZXJbc2l6ZSAtIDEgLSBpXSAhPSBzdGF0 dXMpCj4gKwkJCQlicmVhazsKPiArCj4gKwkJCWJ1ZmZlcltzaXplIC0gMSAtIGldID0gc3RhdHVz Owo+ICsJCX0KPiArCX0KPiArCj4gKwlzdGF0dXMgPSBpOwo+ICsKPiArYXV4X29wX2VycjoKPiAr Cj4gKwlpZiAoY21kID09IENNRF9BVVhfSTJDX0VESURfUkVBRCkgewo+ICsJCS8qY2xlYXIgQVVY IEZJRk8gKi8KPiArCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfQVVYX0NUUkwsCj4gKwkJ CQlBVVhfRU5fRklGT19SRUFEIHwgQ0xSX0VESURfRklGTywKPiArCQkJCUFVWF9FTl9GSUZPX1JF QUQgfCBDTFJfRURJRF9GSUZPKTsKPiArCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfQVVY X0NUUkwsCj4gKwkJCQlBVVhfRU5fRklGT19SRUFEIHwgQ0xSX0VESURfRklGTywgMHgwMCk7Cj4g Kwl9Cj4gKwo+ICsJLyogTGVhdmUgQVVYIHVzZXIgbW9kZSAqLwo+ICsJaXQ2NTA1X3NldF9iaXRz KGl0NjUwNSwgUkVHX0FVWF9DVFJMLCBBVVhfVVNFUl9NT0RFLCAwKTsKPiArCj4gKwlyZXR1cm4g c3RhdHVzOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3NpemVfdCBpdDY1MDVfYXV4X2RvX3RyYW5zZmVy KHN0cnVjdCBpdDY1MDUgKml0NjUwNSwKPiArCQkJCSAgICAgIGVudW0gYXV4X2NtZF90eXBlIGNt ZCwKPiArCQkJCSAgICAgIHVuc2lnbmVkIGludCBhZGRyZXNzLCB1OCAqYnVmZmVyLAo+ICsJCQkJ ICAgICAgc2l6ZV90IHNpemUsIGVudW0gYXV4X2NtZF9yZXBseSAqcmVwbHkpCj4gK3sKPiArCWlu dCBpLCByZXQsIHJldF9zaXplID0gMCwgcmVxdWVzdF9zaXplOwo+ICsKPiArCW11dGV4X2xvY2so Jml0NjUwNS0+YXV4X2xvY2spOwo+ICsJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgewo+ ICsJCXJlcXVlc3Rfc2l6ZSA9IG1pbigoaW50KXNpemUgLSBpLCA0KTsKPiArCQlyZXQgPSBpdDY1 MDVfYXV4X29wZXJhdGlvbihpdDY1MDUsIGNtZCwgYWRkcmVzcyArIGksCj4gKwkJCQkJICAgYnVm ZmVyICsgaSwgcmVxdWVzdF9zaXplLCByZXBseSk7Cj4gKwkJaWYgKHJldCA8IDApIHsKPiArCQkJ cmV0X3NpemUgPSByZXQ7Cj4gKwkJCWdvdG8gYXV4X29wX2VycjsKPiArCQl9Cj4gKwo+ICsJCXJl dF9zaXplICs9ICByZXQ7Cj4gKwl9Cj4gK2F1eF9vcF9lcnI6Cj4gKwo+ICsJbXV0ZXhfdW5sb2Nr KCZpdDY1MDUtPmF1eF9sb2NrKTsKPiArCXJldHVybiByZXRfc2l6ZTsKPiArfQo+ICsKPiArc3Rh dGljIHNzaXplX3QgaXQ2NTA1X2F1eF90cmFuc2ZlcihzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LAo+ ICsJCQkJICAgc3RydWN0IGRybV9kcF9hdXhfbXNnICptc2cpCj4gK3sKPiArCXN0cnVjdCBpdDY1 MDUgKml0NjUwNSA9IGNvbnRhaW5lcl9vZihhdXgsIHN0cnVjdCBpdDY1MDUsIGF1eCk7Cj4gKwl1 OCBjbWQ7Cj4gKwlib29sIGlzX2kyYyA9ICEobXNnLT5yZXF1ZXN0ICYgRFBfQVVYX05BVElWRV9X UklURSk7Cj4gKwlpbnQgcmV0Owo+ICsJZW51bSBhdXhfY21kX3JlcGx5IHJlcGx5Owo+ICsKPiAr CS8qIElUNjUwNSBkb2Vzbid0IHN1cHBvcnQgYXJiaXRyYXJ5IEkyQyByZWFkIC8gd3JpdGUuICov Cj4gKwlpZiAoaXNfaTJjKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCXN3aXRjaCAobXNn LT5yZXF1ZXN0KSB7Cj4gKwljYXNlIERQX0FVWF9OQVRJVkVfUkVBRDoKPiArCQljbWQgPSBDTURf QVVYX05BVElWRV9SRUFEOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBEUF9BVVhfTkFUSVZFX1dSSVRF Ogo+ICsJCWNtZCA9IENNRF9BVVhfTkFUSVZFX1dSSVRFOwo+ICsJCWJyZWFrOwo+ICsJZGVmYXVs dDoKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlyZXQgPSBpdDY1MDVfYXV4X2Rv X3RyYW5zZmVyKGl0NjUwNSwgY21kLCBtc2ctPmFkZHJlc3MsIG1zZy0+YnVmZmVyLAo+ICsJCQkJ ICAgICBtc2ctPnNpemUsICZyZXBseSk7Cj4gKwlpZiAocmV0IDwgMCkKPiArCQlyZXR1cm4gcmV0 Owo+ICsKPiArCXN3aXRjaCAocmVwbHkpIHsKPiArCWNhc2UgUkVQTFlfQUNLOgo+ICsJCW1zZy0+ cmVwbHkgPSBEUF9BVVhfTkFUSVZFX1JFUExZX0FDSzsKPiArCQlicmVhazsKPiArCWNhc2UgUkVQ TFlfTkFDSzoKPiArCQltc2ctPnJlcGx5ID0gRFBfQVVYX05BVElWRV9SRVBMWV9OQUNLOwo+ICsJ CWJyZWFrOwo+ICsJY2FzZSBSRVBMWV9ERUZFUjoKPiArCQltc2ctPnJlcGx5ID0gRFBfQVVYX05B VElWRV9SRVBMWV9ERUZFUjsKPiArCQlicmVhazsKPiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGl0NjUwNV9nZXRfZWRpZF9ibG9jayh2b2lkICpkYXRhLCB1 OCAqYnVmLCB1bnNpZ25lZCBpbnQgYmxvY2ssCj4gKwkJCQkgc2l6ZV90IGxlbikKPiArewo+ICsJ c3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gZGF0YTsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZp dDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsJZW51bSBhdXhfY21kX3JlcGx5IHJlcGx5Owo+ICsJaW50 IG9mZnNldCwgcmV0LCBhdXhfcmV0cnkgPSAxMDA7Cj4gKwo+ICsJaXQ2NTA1X2F1eF9yZXNldChp dDY1MDUpOwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiYmxvY2sgbnVtYmVyID0gJWQi LCBibG9jayk7Cj4gKwo+ICsJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBFRElEX0xFTkdUSDsp IHsKPiArCQlyZXQgPSBpdDY1MDVfYXV4X2RvX3RyYW5zZmVyKGl0NjUwNSwgQ01EX0FVWF9JMkNf RURJRF9SRUFELAo+ICsJCQkJCSAgICAgYmxvY2sgKiBFRElEX0xFTkdUSCArIG9mZnNldCwKPiAr CQkJCQkgICAgIGJ1ZiArIG9mZnNldCwgOCwgJnJlcGx5KTsKPiArCj4gKwkJaWYgKHJldCA8IDAg JiYgcmV0ICE9IC1FQUdBSU4pCj4gKwkJCXJldHVybiByZXQ7Cj4gKwo+ICsJCXN3aXRjaCAocmVw bHkpIHsKPiArCQljYXNlIFJFUExZX0FDSzoKPiArCQkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2 LCAiWzB4JTAyeF06ICU4cGgiLCBvZmZzZXQsCj4gKwkJCQkJICAgICBidWYgKyBvZmZzZXQpOwo+ ICsJCQlvZmZzZXQgKz0gODsKPiArCQkJYXV4X3JldHJ5ID0gMTAwOwo+ICsJCQlicmVhazsKPiAr CQljYXNlIFJFUExZX05BQ0s6Cj4gKwkJCXJldHVybiAtRUlPOwo+ICsJCWNhc2UgUkVQTFlfREVG RVI6Cj4gKwkJCW1zbGVlcCgyMCk7Cj4gKwkJCWlmICghKC0tYXV4X3JldHJ5KSkKPiArCQkJCXJl dHVybiAtRUlPOwo+ICsJCX0KPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgaXQ2NTA1X3ZhcmlhYmxlX2NvbmZpZyhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4g K3sKPiArCWl0NjUwNS0+bGlua19yYXRlX2J3X2NvZGUgPSBIQlI7Cj4gKwlpdDY1MDUtPmxhbmVf Y291bnQgPSBNQVhfTEFORV9DT1VOVDsKPiArCWl0NjUwNS0+bGlua19zdGF0ZSA9IExJTktfSURM RTsKPiArCWl0NjUwNS0+YXV0b190cmFpbl9yZXRyeSA9IEFVVE9fVFJBSU5fUkVUUlk7Cj4gKwlp dDY1MDUtPmF1ZGlvLnNlbGVjdCA9IEFVRElPX1NFTEVDVDsKPiArCWl0NjUwNS0+YXVkaW8uc2Ft cGxlX3JhdGUgPSBBVURJT19TQU1QTEVfUkFURTsKPiArCWl0NjUwNS0+YXVkaW8uY2hhbm5lbF9j b3VudCA9IEFVRElPX0NIQU5ORUxfQ09VTlQ7Cj4gKwlpdDY1MDUtPmF1ZGlvLnR5cGUgPSBBVURJ T19UWVBFOwo+ICsJaXQ2NTA1LT5hdWRpby5pMnNfaW5wdXRfZm9ybWF0ID0gSTJTX0lOUFVUX0ZP Uk1BVDsKPiArCWl0NjUwNS0+YXVkaW8uaTJzX2p1c3RpZmllZCA9IEkyU19KVVNUSUZJRUQ7Cj4g KwlpdDY1MDUtPmF1ZGlvLmkyc19kYXRhX2RlbGF5ID0gSTJTX0RBVEFfREVMQVk7Cj4gKwlpdDY1 MDUtPmF1ZGlvLmkyc193c19jaGFubmVsID0gSTJTX1dTX0NIQU5ORUw7Cj4gKwlpdDY1MDUtPmF1 ZGlvLmkyc19kYXRhX3NlcXVlbmNlID0gSTJTX0RBVEFfU0VRVUVOQ0U7Cj4gKwlpdDY1MDUtPmF1 ZGlvLndvcmRfbGVuZ3RoID0gQVVESU9fV09SRF9MRU5HVEg7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgaXQ2NTA1X3NlbmRfdmlkZW9faW5mb2ZyYW1lKHN0cnVjdCBpdDY1MDUgKml0NjUwNSwKPiAr CQkJCSAgICAgICBzdHJ1Y3QgaGRtaV9hdmlfaW5mb2ZyYW1lICpmcmFtZSkKPiArewo+ICsJdTgg YnVmZmVyW0hETUlfSU5GT0ZSQU1FX0hFQURFUl9TSVpFICsgSERNSV9BVklfSU5GT0ZSQU1FX1NJ WkVdOwo+ICsJaW50IGVycjsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVu dC0+ZGV2Owo+ICsKPiArCWVyciA9IGhkbWlfYXZpX2luZm9mcmFtZV9wYWNrKGZyYW1lLCBidWZm ZXIsIHNpemVvZihidWZmZXIpKTsKPiArCWlmIChlcnIgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJP UihkZXYsICJGYWlsZWQgdG8gcGFjayBBVkkgaW5mb2ZyYW1lOiAlZCIsIGVycik7Cj4gKwkJcmV0 dXJuIGVycjsKPiArCX0KPiArCj4gKwllcnIgPSBpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdf SU5GT0ZSQU1FX0NUUkwsIEVOX0FWSV9QS1QsIDB4MDApOwo+ICsJaWYgKGVycikKPiArCQlyZXR1 cm4gZXJyOwo+ICsKPiArCWVyciA9IHJlZ21hcF9idWxrX3dyaXRlKGl0NjUwNS0+cmVnbWFwLCBS RUdfQVZJX0lORk9fREIxLAo+ICsJCQkJYnVmZmVyICsgSERNSV9JTkZPRlJBTUVfSEVBREVSX1NJ WkUsCj4gKwkJCQlmcmFtZS0+bGVuZ3RoKTsKPiArCWlmIChlcnIpCj4gKwkJcmV0dXJuIGVycjsK PiArCj4gKwllcnIgPSBpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfSU5GT0ZSQU1FX0NUUkws IEVOX0FWSV9QS1QsCj4gKwkJCSAgICAgIEVOX0FWSV9QS1QpOwo+ICsJaWYgKGVycikKPiArCQly ZXR1cm4gZXJyOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1 MDVfZ2V0X2V4dGNvbl9wcm9wZXJ0eShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWlu dCBlcnI7Cj4gKwl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgcHJvcGVydHk7Cj4gKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCj4gKwlpZiAoaXQ2NTA1 LT5leHRjb24gJiYgIWl0NjUwNS0+bGFuZV9zd2FwX2Rpc2FibGVkKSB7Cj4gKwkJZXJyID0gZXh0 Y29uX2dldF9wcm9wZXJ0eShpdDY1MDUtPmV4dGNvbiwgRVhUQ09OX0RJU1BfRFAsCj4gKwkJCQkJ ICBFWFRDT05fUFJPUF9VU0JfVFlQRUNfUE9MQVJJVFksCj4gKwkJCQkJICAmcHJvcGVydHkpOwo+ ICsJCWlmIChlcnIpIHsKPiArCQkJRFJNX0RFVl9FUlJPUihkZXYsICJnZXQgcHJvcGVydHkgZmFp bCEiKTsKPiArCQkJcmV0dXJuOwo+ICsJCX0KPiArCQlpdDY1MDUtPmxhbmVfc3dhcCA9IHByb3Bl cnR5LmludHZhbDsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2Nsa19waGFz ZV9hZGp1c3RtZW50KHN0cnVjdCBpdDY1MDUgKml0NjUwNSwKPiArCQkJCQljb25zdCBzdHJ1Y3Qg ZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiArewo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwg UkVHX0NMS19DVFJMMCwgTV9QQ0xLX0RFTEFZLAo+ICsJCW1vZGUtPmNsb2NrIDwgQURKVVNUX1BI QVNFX1RIUkVTSE9MRCA/IFBJWEVMX0NMS19ERUxBWSA6IDApOwo+ICsJaXQ2NTA1X3NldF9iaXRz KGl0NjUwNSwgUkVHX0RBVEFfQ1RSTDAsIFZJREVPX0xBVENIX0VER0UsCj4gKwkJCVBJWEVMX0NM S19JTlZFUlNFIDw8IDQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfaW5pdChzdHJ1 Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19CQU5L X1NFTCwgMHgwMCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVYX09QVCwgQVVYX0FV VE9fUlNUIHwgQVVYX0ZJWF9GUkVRKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19BVVhf Q1RSTCwgQVVYX05PX1NFR01FTlRfV1IpOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0hE Q1BfQ1RSTDIsIEhEQ1BfQU5fU0VMIHwgSERDUF9IV19IUERJUlFfQUNUKTsKPiArCWl0NjUwNV93 cml0ZShpdDY1MDUsIFJFR19WSURfQlVTX0NUUkwwLCBJTl9ERFIgfCBERFJfQ0QpOwo+ICsJaXQ2 NTA1X3dyaXRlKGl0NjUwNSwgUkVHX1ZJRF9CVVNfQ1RSTDEsIDB4MDEpOwo+ICsJaXQ2NTA1X3dy aXRlKGl0NjUwNSwgUkVHX0FVRElPX0NUUkwwLCBBVURJT18xNkJfQk9VTkQpOwo+ICsKPiArCS8q IGNoaXAgaW50ZXJuYWwgc2V0dGluZywgZG9uJ3QgbW9kaWZ5ICovCj4gKwlpdDY1MDVfd3JpdGUo aXQ2NTA1LCBSRUdfSFBEX0lSUV9USU1FLCAweEY1KTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUs IFJFR19BVVhfREVCVUdfTU9ERSwgMHg0RCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdf QVVYX09QVDIsIDB4MTcpOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0hEQ1BfT1BULCAw eDYwKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19EQVRBX01VVEVfQ1RSTCwKPiArCQkg ICAgIEVOX1ZJRF9NVVRFIHwgRU5fQVVEX01VVEUgfCBFTkFCTEVfQVVUT19WSURFT19GSUZPX1JF U0VUKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19USU1FX1NUTVBfQ1RSTCwKPiArCQkg ICAgIEVOX1NTQ19HQVQgfCBFTl9FTkhBTkNFX1ZJRF9TVE1QIHwgRU5fRU5IQU5DRV9BVURfU1RN UCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfSU5GT0ZSQU1FX0NUUkwsIDB4MDApOwo+ ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0JBTktfU0VMLCAweDAxKTsKPiArCWl0NjUwNV93 cml0ZShpdDY1MDUsIFJFR19EUlZfMF9EQl84MDBfTVYsCj4gKwkJICAgICBhZmVfc2V0dGluZ190 YWJsZVtpdDY1MDUtPmFmZV9zZXR0aW5nXVswXSk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBS RUdfUFJFXzBfREJfODAwX01WLAo+ICsJCSAgICAgYWZlX3NldHRpbmdfdGFibGVbaXQ2NTA1LT5h ZmVfc2V0dGluZ11bMV0pOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX1BSRV8zUDVfREJf ODAwX01WLAo+ICsJCSAgICAgYWZlX3NldHRpbmdfdGFibGVbaXQ2NTA1LT5hZmVfc2V0dGluZ11b Ml0pOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX1NTQ19DVFJMMCwgMHg5RSk7Cj4gKwlp dDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfU1NDX0NUUkwxLCAweDFDKTsKPiArCWl0NjUwNV93cml0 ZShpdDY1MDUsIFJFR19TU0NfQ1RSTDIsIDB4NDIpOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwg UkVHX0JBTktfU0VMLCAweDAwKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X3ZpZGVv X2Rpc2FibGUoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfc2V0X2JpdHMo aXQ2NTA1LCBSRUdfREFUQV9NVVRFX0NUUkwsIEVOX1ZJRF9NVVRFLCBFTl9WSURfTVVURSk7Cj4g KwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfSU5GT0ZSQU1FX0NUUkwsIEVOX1ZJRF9DVFJM X1BLVCwgMHgwMCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfUkVTRVRfQ1RSTCwg VklERU9fUkVTRVQsIFZJREVPX1JFU0VUKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1 X3ZpZGVvX3Jlc2V0KHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJaXQ2NTA1X3NldF9i aXRzKGl0NjUwNSwgUkVHX0RBVEFfTVVURV9DVFJMLCBFTl9WSURfTVVURSwgRU5fVklEX01VVEUp Owo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0lORk9GUkFNRV9DVFJMLCBFTl9WSURf Q1RSTF9QS1QsIDB4MDApOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1JFU0VUX0NU UkwsIFZJREVPX1JFU0VULCBWSURFT19SRVNFVCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1 LCBSRUdfNTAxX0ZJRk9fQ1RSTCwgUlNUXzUwMV9GSUZPLCBSU1RfNTAxX0ZJRk8pOwo+ICsJaXQ2 NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHXzUwMV9GSUZPX0NUUkwsIFJTVF81MDFfRklGTywgMHgw MCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfUkVTRVRfQ1RSTCwgVklERU9fUkVT RVQsIDB4MDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfdXBkYXRlX3ZpZGVvX3By YXJtZXRlcihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsCj4gKwkJCQkJICBjb25zdCBzdHJ1Y3QgZHJt X2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiArewo+ICsJaXQ2NTA1X2Nsa19waGFzZV9hZGp1c3RtZW50 KGl0NjUwNSwgbW9kZSk7Cj4gKwlpdDY1MDVfdmlkZW9fZGlzYWJsZShpdDY1MDUpOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgYm9vbCBpdDY1MDVfYXVkaW9faW5wdXQoc3RydWN0IGl0NjUwNSAqaXQ2NTA1 KQo+ICt7Cj4gKwlpbnQgcmVnMDUsIHJlZ2JlOwo+ICsKPiArCXJlZzA1ID0gaXQ2NTA1X3JlYWQo aXQ2NTA1LCBSRUdfUkVTRVRfQ1RSTCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdf UkVTRVRfQ1RSTCwgQVVESU9fUkVTRVQsIDB4MDApOwo+ICsJdXNsZWVwX3JhbmdlKDMwMDAsIDQw MDApOwo+ICsJcmVnYmUgPSBpdDY1MDVfcmVhZChpdDY1MDUsIFJFR19BVURJT19JTlBVVF9GUkVR KTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19SRVNFVF9DVFJMLCByZWcwNSk7Cj4gKwo+ ICsJcmV0dXJuIHJlZ2JlICE9IDB4RkY7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9z ZXR1cF9hdWRpb19jaGFubmVsX3N0YXR1cyhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiAr CWVudW0gaXQ2NTA1X2F1ZGlvX3NhbXBsZV9yYXRlIHNhbXBsZV9yYXRlID0gaXQ2NTA1LT5hdWRp by5zYW1wbGVfcmF0ZTsKPiArCXU4IGF1ZGlvX3dvcmRfbGVuZ3RoX21hcFtdID0gezB4MDIsIDB4 MDQsIDB4MDMsIDB4MEJ9Owo+ICsKPiArCS8qIENoYW5uZWwgU3RhdHVzICovCj4gKwlpdDY1MDVf d3JpdGUoaXQ2NTA1LCBSRUdfSUVDOTU4X1NUUzAsIGl0NjUwNS0+YXVkaW8udHlwZSA8PCAxKTsK PiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19JRUM5NThfU1RTMSwgMHgwMCk7Cj4gKwlpdDY1 MDVfd3JpdGUoaXQ2NTA1LCBSRUdfSUVDOTU4X1NUUzIsIDB4MDApOwo+ICsJaXQ2NTA1X3dyaXRl KGl0NjUwNSwgUkVHX0lFQzk1OF9TVFMzLCBzYW1wbGVfcmF0ZSk7Cj4gKwlpdDY1MDVfd3JpdGUo aXQ2NTA1LCBSRUdfSUVDOTU4X1NUUzQsICh+c2FtcGxlX3JhdGUgPDwgNCkgfAo+ICsJCSAgICAg YXVkaW9fd29yZF9sZW5ndGhfbWFwW2l0NjUwNS0+YXVkaW8ud29yZF9sZW5ndGhdKTsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X3NldHVwX2F1ZGlvX2Zvcm1hdChzdHJ1Y3QgaXQ2NTA1 ICppdDY1MDUpCj4gK3sKPiArCS8qIEkyUyBNT0RFICovCj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1 LCBSRUdfQVVESU9fRk1ULAo+ICsJCSAgICAgKGl0NjUwNS0+YXVkaW8ud29yZF9sZW5ndGggPDwg NSkgfAo+ICsJCSAgICAgKGl0NjUwNS0+YXVkaW8uaTJzX2RhdGFfc2VxdWVuY2UgPDwgNCkgfAo+ ICsJCSAgICAgKGl0NjUwNS0+YXVkaW8uaTJzX3dzX2NoYW5uZWwgPDwgMykgfAo+ICsJCSAgICAg KGl0NjUwNS0+YXVkaW8uaTJzX2RhdGFfZGVsYXkgPDwgMikgfAo+ICsJCSAgICAgKGl0NjUwNS0+ YXVkaW8uaTJzX2p1c3RpZmllZCA8PCAxKSB8Cj4gKwkJICAgICBpdDY1MDUtPmF1ZGlvLmkyc19p bnB1dF9mb3JtYXQpOwo+ICsJaWYgKGl0NjUwNS0+YXVkaW8uc2VsZWN0ID09IFNQRElGKSB7Cj4g KwkJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0FVRElPX0ZJRk9fU0VMLCAweDAwKTsKPiArCQkv KiAweDMwID0gMTI4KkZTICovCj4gKwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0FVWF9P UFQsIDB4RjAsIDB4MzApOwo+ICsJfSBlbHNlIHsKPiArCQlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBS RUdfQVVESU9fRklGT19TRUwsIDB4RTQpOwo+ICsJfQo+ICsKPiArCWl0NjUwNV93cml0ZShpdDY1 MDUsIFJFR19BVURJT19DVFJMMCwgMHgyMCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdf QVVESU9fQ1RSTDEsIDB4MDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfZW5hYmxl X2F1ZGlvX3NvdXJjZShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCXVuc2lnbmVkIGlu dCBhdWRpb19zb3VyY2VfY291bnQ7Cj4gKwo+ICsJYXVkaW9fc291cmNlX2NvdW50ID0gQklUKERJ Vl9ST1VORF9VUChpdDY1MDUtPmF1ZGlvLmNoYW5uZWxfY291bnQsIDIpKQo+ICsJCQkJIC0gMTsK PiArCj4gKwlhdWRpb19zb3VyY2VfY291bnQgfD0gaXQ2NTA1LT5hdWRpby5zZWxlY3QgPDwgNDsK PiArCj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVESU9fU1JDX0NUUkwsIGF1ZGlvX3Nv dXJjZV9jb3VudCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9lbmFibGVfYXVkaW9f aW5mb2ZyYW1lKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJc3RydWN0IGRldmljZSAq ZGV2ID0gJml0NjUwNS0+Y2xpZW50LT5kZXY7Cj4gKwl1OCBhdWRpb19pbmZvX2NhW10gPSB7IDB4 MDAsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDcsIDB4MEIsIDB4MEYsIDB4MUYgfTsKPiArCj4gKwlE Uk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJpbmZvZnJhbWUgY2hhbm5lbF9hbGxvY2F0aW9uOjB4 JTAyeCIsCj4gKwkJCSAgICAgYXVkaW9faW5mb19jYVtpdDY1MDUtPmF1ZGlvLmNoYW5uZWxfY291 bnQgLSAxXSk7Cj4gKwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0FVRF9JTkZPRlJBTV9E QjEsIGl0NjUwNS0+YXVkaW8uY2hhbm5lbF9jb3VudAo+ICsJCSAgICAgLSAxKTsKPiArCWl0NjUw NV93cml0ZShpdDY1MDUsIFJFR19BVURfSU5GT0ZSQU1fREIyLCAweDAwKTsKPiArCWl0NjUwNV93 cml0ZShpdDY1MDUsIFJFR19BVURfSU5GT0ZSQU1fREIzLAo+ICsJCSAgICAgYXVkaW9faW5mb19j YVtpdDY1MDUtPmF1ZGlvLmNoYW5uZWxfY291bnQgLSAxXSk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2 NTA1LCBSRUdfQVVEX0lORk9GUkFNX0RCNCwgMHgwMCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1 LCBSRUdfQVVEX0lORk9GUkFNX1NVTSwgMHgwMCk7Cj4gKwo+ICsJLyogRW5hYmxlIEF1ZGlvIElu Zm9GcmFtZSAqLwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0lORk9GUkFNRV9DVFJM LCBFTl9BVURfQ1RSTF9QS1QsCj4gKwkJCUVOX0FVRF9DVFJMX1BLVCk7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIGl0NjUwNV9kaXNhYmxlX2F1ZGlvKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiAr ewo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RBVEFfTVVURV9DVFJMLCBFTl9BVURf TVVURSwgRU5fQVVEX01VVEUpOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0FVRElP X1NSQ19DVFJMLCBNX0FVRElPX0kyU19FTiwgMHgwMCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2 NTA1LCBSRUdfSU5GT0ZSQU1FX0NUUkwsIEVOX0FVRF9DVFJMX1BLVCwgMHgwMCk7Cj4gKwlpdDY1 MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfUkVTRVRfQ1RSTCwgQVVESU9fUkVTRVQsIEFVRElPX1JF U0VUKTsKPiArCWl0NjUwNS0+ZW5hYmxlX2F1ZGlvID0gZmFsc2U7Cj4gK30KPiArCj4gK3N0YXRp YyB2b2lkIGl0NjUwNV9lbmFibGVfYXVkaW8oc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4g KwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCWludCByZWdi ZTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJzdGFydCIpOwo+ICsJaXQ2NTA1 X2Rpc2FibGVfYXVkaW8oaXQ2NTA1KTsKPiArCj4gKwlpdDY1MDVfc2V0dXBfYXVkaW9fY2hhbm5l bF9zdGF0dXMoaXQ2NTA1KTsKPiArCWl0NjUwNV9zZXR1cF9hdWRpb19mb3JtYXQoaXQ2NTA1KTsK PiArCWl0NjUwNV9lbmFibGVfYXVkaW9fc291cmNlKGl0NjUwNSk7Cj4gKwlpdDY1MDVfZW5hYmxl X2F1ZGlvX2luZm9mcmFtZShpdDY1MDUpOwo+ICsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJF R19BVURJT19OXzBfNywgMHgwMCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVESU9f Tl84XzE1LCAweDgwKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19BVURJT19OXzE2XzIz LCAweDAwKTsKPiArCj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfQVVESU9fU1JDX0NU UkwsIEFVRElPX0ZJRk9fUkVTRVQsCj4gKwkJCUFVRElPX0ZJRk9fUkVTRVQpOwo+ICsJaXQ2NTA1 X3NldF9iaXRzKGl0NjUwNSwgUkVHX0FVRElPX1NSQ19DVFJMLCBBVURJT19GSUZPX1JFU0VULCAw eDAwKTsKPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19SRVNFVF9DVFJMLCBBVURJT19S RVNFVCwgMHgwMCk7Cj4gKwlyZWdiZSA9IGl0NjUwNV9yZWFkKGl0NjUwNSwgUkVHX0FVRElPX0lO UFVUX0ZSRVEpOwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAicmVnYmU6MHglMDJ4IGF1 ZGlvIGlucHV0IGZzOiAlZC4lZCBrSHoiLAo+ICsJCQkgICAgIHJlZ2JlLCA2NzUwIC8gcmVnYmUs IDY3NTAwICUgcmVnYmUpOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RBVEFfTVVU RV9DVFJMLCBFTl9BVURfTVVURSwgMHgwMCk7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGl0NjUw NV91c2Vfc3RlcF90cmFpbl9jaGVjayhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWlm IChpdDY1MDUtPmxpbmsucmV2aXNpb24gPj0gMHgxMikKPiArCQlyZXR1cm4gaXQ2NTA1LT5kcGNk W0RQX1RSQUlOSU5HX0FVWF9SRF9JTlRFUlZBTF0gPj0gMHgwMTsKPiArCj4gKwlyZXR1cm4gdHJ1 ZTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X3BhcnNlX2xpbmtfY2FwYWJpbGl0aWVz KHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0 NjUwNS0+Y2xpZW50LT5kZXY7Cj4gKwlzdHJ1Y3QgaXQ2NTA1X2RybV9kcF9saW5rICpsaW5rID0g Jml0NjUwNS0+bGluazsKPiArCWludCBiY2FwczsKPiArCj4gKwlpZiAoaXQ2NTA1LT5kcGNkWzBd ID09IDApIHsKPiArCQlpdDY1MDVfYXV4X29uKGl0NjUwNSk7Cj4gKwkJaXQ2NTA1X2dldF9kcGNk KGl0NjUwNSwgRFBfRFBDRF9SRVYsIGl0NjUwNS0+ZHBjZCwKPiArCQkJCUFSUkFZX1NJWkUoaXQ2 NTA1LT5kcGNkKSk7Cj4gKwl9Cj4gKwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiRFBD RCBSZXYuOiAlZC4lZCIsCj4gKwkJCSAgICAgbGluay0+cmV2aXNpb24gPj4gNCwgbGluay0+cmV2 aXNpb24gJiAweDBGKTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJTaW5rIG1h eCBsaW5rIHJhdGU6ICVkLiVkIEdicHMgcGVyIGxhbmUiLAo+ICsJCQkgICAgIGxpbmstPnJhdGUg LyAxMDAwMDAsIGxpbmstPnJhdGUgLyAxMDAwICUgMTAwKTsKPiArCj4gKwlpdDY1MDUtPmxpbmtf cmF0ZV9id19jb2RlID0gZHJtX2RwX2xpbmtfcmF0ZV90b19id19jb2RlKGxpbmstPnJhdGUpOwo+ ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAibGluayByYXRlIGJ3IGNvZGU6MHglMDJ4IiwK PiArCQkJICAgICBpdDY1MDUtPmxpbmtfcmF0ZV9id19jb2RlKTsKPiArCWl0NjUwNS0+bGlua19y YXRlX2J3X2NvZGUgPSBtaW4oKGludClpdDY1MDUtPmxpbmtfcmF0ZV9id19jb2RlLAo+ICsJCQkJ CU1BWF9MSU5LX1JBVEUpOwo+ICsKPiArCWl0NjUwNS0+bGFuZV9jb3VudCA9IGxpbmstPm51bV9s YW5lczsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIlNpbmsgc3VwcG9ydCAlZCBsYW5l cyB0cmFpbmluZyIsCj4gKwkJCSAgICAgaXQ2NTA1LT5sYW5lX2NvdW50KTsKPiArCWl0NjUwNS0+ bGFuZV9jb3VudCA9IG1pbigoaW50KWl0NjUwNS0+bGFuZV9jb3VudCwgTUFYX0xBTkVfQ09VTlQp Owo+ICsKPiArCWl0NjUwNS0+YnJhbmNoX2RldmljZSA9IGRybV9kcF9pc19icmFuY2goaXQ2NTA1 LT5kcGNkKTsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIlNpbmsgJXNicmFuY2ggZGV2 aWNlIiwKPiArCQkJICAgICBpdDY1MDUtPmJyYW5jaF9kZXZpY2UgPyAiIiA6ICJOb3QgIik7Cj4g Kwo+ICsJaXQ2NTA1LT5lbmFibGVfZW5oYW5jZWRfZnJhbWUgPSAhIWxpbmstPmNhcGFiaWxpdGll czsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIlNpbmsgJXNTdXBwb3J0IEVuaGFuY2Vk IEZyYW1pbmciLAo+ICsJCQkgICAgIGl0NjUwNS0+ZW5hYmxlX2VuaGFuY2VkX2ZyYW1lID8gIiIg OiAiTm90ICIpOwo+ICsKPiArCWl0NjUwNS0+ZW5hYmxlX3NzYyA9ICEhKGl0NjUwNS0+ZHBjZFtE UF9NQVhfRE9XTlNQUkVBRF0gJgo+ICsJCQkJRFBfTUFYX0RPV05TUFJFQURfMF81KTsKPiArCURS TV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIk1heGltdW0gRG93bi1TcHJlYWQ6ICVzLCAlc3N1cHBv cnQgU1NDISIsCj4gKwkJCSAgICAgaXQ2NTA1LT5lbmFibGVfc3NjID8gIjAuNSIgOiAiMCIsCj4g KwkJCSAgICAgaXQ2NTA1LT5lbmFibGVfc3NjID8gIiIgOiAiTm90ICIpOwo+ICsKPiArCWl0NjUw NS0+c3RlcF90cmFpbiA9IGl0NjUwNV91c2Vfc3RlcF90cmFpbl9jaGVjayhpdDY1MDUpOwo+ICsJ aWYgKGl0NjUwNS0+c3RlcF90cmFpbikKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJh dXRvIHRyYWluIGZhaWwsIHdpbGwgc3RlcCB0cmFpbiIpOwo+ICsKPiArCWJjYXBzID0gaXQ2NTA1 X2RwY2RfcmVhZChpdDY1MDUsIERQX0FVWF9IRENQX0JDQVBTKTsKPiArCURSTV9ERVZfREVCVUdf RFJJVkVSKGRldiwgImJjYXBzOjB4JTAyeCIsIGJjYXBzKTsKPiArCWlmIChiY2FwcyAmIERQX0JD QVBTX0hEQ1BfQ0FQQUJMRSkgewo+ICsJCWl0NjUwNS0+aXNfcmVwZWF0ZXIgPSAhIShiY2FwcyAm IERQX0JDQVBTX1JFUEVBVEVSX1BSRVNFTlQpOwo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRl diwgIlN1cHBvcnQgSERDUCEgRG93bnN0cmVhbSBpcyAlcyEiLAo+ICsJCQkJICAgICBpdDY1MDUt PmlzX3JlcGVhdGVyID8gInJlcGVhdGVyIiA6Cj4gKwkJCQkgICAgICJyZWNlaXZlciIpOwo+ICsJ fSBlbHNlIHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJTaW5rIG5vdCBzdXBwb3J0 IEhEQ1AhIik7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9zZXR1cF9zc2Mo c3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBS RUdfVFJBSU5fQ1RSTDAsIFNQUkVBRF9BTVBfNSwKPiArCQkJaXQ2NTA1LT5lbmFibGVfc3NjID8g U1BSRUFEX0FNUF81IDogMHgwMCk7Cj4gKwlpZiAoaXQ2NTA1LT5lbmFibGVfc3NjKSB7Cj4gKwkJ aXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0JBTktfU0VMLCAweDAxKTsKPiArCQlpdDY1MDVfd3Jp dGUoaXQ2NTA1LCBSRUdfU1NDX0NUUkwwLCAweDlFKTsKPiArCQlpdDY1MDVfd3JpdGUoaXQ2NTA1 LCBSRUdfU1NDX0NUUkwxLCAweDFDKTsKPiArCQlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfU1ND X0NUUkwyLCAweDQyKTsKPiArCQlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQkFOS19TRUwsIDB4 MDApOwo+ICsJCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19TUF9DVFJMMCwgMHgwNyk7Cj4gKwkJ aXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0lQX0NUUkwxLCAweDI5KTsKPiArCQlpdDY1MDVfd3Jp dGUoaXQ2NTA1LCBSRUdfSVBfQ1RSTDIsIDB4MDMpOwo+ICsJCS8qIFN0YW1wIEludGVycnVwdCBT dGVwICovCj4gKwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1RJTUVfU1RNUF9DVFJMLCBN X1NUQU1QX1NURVAsCj4gKwkJCQkweDEwKTsKPiArCQlpdDY1MDVfZHBjZF93cml0ZShpdDY1MDUs IERQX0RPV05TUFJFQURfQ1RSTCwKPiArCQkJCSAgRFBfU1BSRUFEX0FNUF8wXzUpOwo+ICsJfSBl bHNlIHsKPiArCQlpdDY1MDVfZHBjZF93cml0ZShpdDY1MDUsIERQX0RPV05TUFJFQURfQ1RSTCwg MHgwMCk7Cj4gKwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1RJTUVfU1RNUF9DVFJMLCBN X1NUQU1QX1NURVAsCj4gKwkJCQkweDAwKTsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIGlubGlu ZSB2b2lkIGl0NjUwNV9saW5rX3JhdGVfc2V0dXAoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7 Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfVFJBSU5fQ1RSTDAsIEZPUkNFX0xCUiwK PiArCQkJKGl0NjUwNS0+bGlua19yYXRlX2J3X2NvZGUgPT0gUkJSKSA/IEZPUkNFX0xCUiA6IDB4 MDApOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0xJTktfRFJWLCBEUlZfSFMsCj4g KwkJCShpdDY1MDUtPmxpbmtfcmF0ZV9id19jb2RlID09IFJCUikgPyAweDAwIDogRFJWX0hTKTsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2xhbmVfY291bnRfc2V0dXAoc3RydWN0IGl0 NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfZ2V0X2V4dGNvbl9wcm9wZXJ0eShpdDY1MDUp Owo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1RSQUlOX0NUUkwwLCBMQU5FX1NXQVAs Cj4gKwkJCWl0NjUwNS0+bGFuZV9zd2FwID8gTEFORV9TV0FQIDogMHgwMCk7Cj4gKwlpdDY1MDVf c2V0X2JpdHMoaXQ2NTA1LCBSRUdfVFJBSU5fQ1RSTDAsIExBTkVfQ09VTlRfTUFTSywKPiArCQkJ KGl0NjUwNS0+bGFuZV9jb3VudCAtIDEpIDw8IDEpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBp dDY1MDVfbGlua190cmFpbmluZ19zZXR1cChzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiAr CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsKPiArCWlmIChp dDY1MDUtPmVuYWJsZV9lbmhhbmNlZF9mcmFtZSkKPiArCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1 LCBSRUdfREFUQV9NVVRFX0NUUkwsCj4gKwkJCQlFTkFCTEVfRU5IQU5DRURfRlJBTUUsIEVOQUJM RV9FTkhBTkNFRF9GUkFNRSk7Cj4gKwo+ICsJaXQ2NTA1X2xpbmtfcmF0ZV9zZXR1cChpdDY1MDUp Owo+ICsJaXQ2NTA1X2xhbmVfY291bnRfc2V0dXAoaXQ2NTA1KTsKPiArCWl0NjUwNV9zZXR1cF9z c2MoaXQ2NTA1KTsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwKPiArCQkJICAgICAiJXMs ICVkIGxhbmVzLCAlc2FibGUgc3NjLCAlc2FibGUgZW5oYW5jZWQgZnJhbWUiLAo+ICsJCQkgICAg IGl0NjUwNS0+bGlua19yYXRlX2J3X2NvZGUgIT0gUkJSID8gIkhCUiIgOiAiUkJSIiwKPiArCQkJ ICAgICBpdDY1MDUtPmxhbmVfY291bnQsCj4gKwkJCSAgICAgaXQ2NTA1LT5lbmFibGVfc3NjID8g ImVuIiA6ICJkaXMiLAo+ICsJCQkgICAgIGl0NjUwNS0+ZW5hYmxlX2VuaGFuY2VkX2ZyYW1lID8g ImVuIiA6ICJkaXMiKTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgaXQ2NTA1X2xpbmtfc3RhcnRf YXV0b190cmFpbihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWludCB0aW1lb3V0ID0g NTAwLCBsaW5rX3RyYWluaW5nX3N0YXRlOwo+ICsKPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUs IFJFR19UUkFJTl9DVFJMMCwKPiArCQkJCUZPUkNFX0NSX0RPTkUgfCBGT1JDRV9FUV9ET05FLCAw eDAwKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19UUkFJTl9DVFJMMSwgRk9SQ0VfUkVU UkFJTik7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfVFJBSU5fQ1RSTDEsIEFVVE9fVFJB SU4pOwo+ICsKPiArCXdoaWxlICh0aW1lb3V0ID4gMCkgewo+ICsJCXVzbGVlcF9yYW5nZSgxMDAw LCAyMDAwKTsKPiArCQlsaW5rX3RyYWluaW5nX3N0YXRlID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBS RUdfTElOS19UUkFJTl9TVFMpOwo+ICsKPiArCQlpZiAoKGxpbmtfdHJhaW5pbmdfc3RhdGUgPiAw KSAmJgo+ICsJCSAgICAobGlua190cmFpbmluZ19zdGF0ZSAmIExJTktfU1RBVEVfTk9SUCkpCj4g KwkJCXJldHVybiB0cnVlOwo+ICsKPiArCQl0aW1lb3V0LS07Cj4gKwl9Cj4gKwo+ICsJcmV0dXJu IGZhbHNlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGl0NjUwNV9kcm1fZHBfbGlua19jb25maWd1 cmUoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwl1OCB2YWx1ZXNbMl07Cj4gKwlpbnQg ZXJyOwo+ICsJc3RydWN0IGRybV9kcF9hdXggKmF1eCA9ICZpdDY1MDUtPmF1eDsKPiArCj4gKwl2 YWx1ZXNbMF0gPSBpdDY1MDUtPmxpbmtfcmF0ZV9id19jb2RlOwo+ICsJdmFsdWVzWzFdID0gaXQ2 NTA1LT5sYW5lX2NvdW50Owo+ICsKPiArCWlmIChpdDY1MDUtPmVuYWJsZV9lbmhhbmNlZF9mcmFt ZSkKPiArCQl2YWx1ZXNbMV0gfD0gRFBfTEFORV9DT1VOVF9FTkhBTkNFRF9GUkFNRV9FTjsKPiAr Cj4gKwllcnIgPSBkcm1fZHBfZHBjZF93cml0ZShhdXgsIERQX0xJTktfQldfU0VULCB2YWx1ZXMs IHNpemVvZih2YWx1ZXMpKTsKPiArCWlmIChlcnIgPCAwKQo+ICsJCXJldHVybiBlcnI7Cj4gKwo+ ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB1OCBkcF9saW5rX3N0YXR1cyhjb25zdCB1 OCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXSwgaW50IHIpCj4gK3sKPiArCXJldHVy biBsaW5rX3N0YXR1c1tyIC0gRFBfTEFORTBfMV9TVEFUVVNdOwo+ICt9Cj4gKwo+ICtzdGF0aWMg Ym9vbCBpdDY1MDVfY2hlY2tfbWF4X3ZhbHVlKGVudW0gbWF4X3ZhbHVlX2NoZWNrIHR5cGUsCj4g KwkJCQkgICB1OCBsYW5lX3ZvbHRhZ2Vfc3dpbmdfcHJlX2VtcGhhc2lzKQo+ICt7Cj4gKwlpZiAo dHlwZSA9PSBWT0xUQUdFX1NXSU5HKQo+ICsJCXJldHVybiAoKGxhbmVfdm9sdGFnZV9zd2luZ19w cmVfZW1waGFzaXMgJiAweDAzKSA9PQo+ICsJCQlNQVhfQ1JfTEVWRUwpOwo+ICsJZWxzZQo+ICsJ CXJldHVybiAoKGxhbmVfdm9sdGFnZV9zd2luZ19wcmVfZW1waGFzaXMgJiAweDAzKSA9PQo+ICsJ CQlNQVhfRVFfTEVWRUwpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgYm9vbCBpdDY1MDVfY2hlY2tfbWF4 X3ZvbHRhZ2Vfc3dpbmdfcmVhY2hlZCh1OCAqbGFuZV92b2x0YWdlX3N3aW5nLAo+ICsJCQkJCQkg ICB1OCBsYW5lX2NvdW50KQo+ICt7Cj4gKwl1OCBpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBs YW5lX2NvdW50OyBpKyspIHsKPiArCQlpZiAobGFuZV92b2x0YWdlX3N3aW5nW2ldICYgRFBfVFJB SU5fTUFYX1NXSU5HX1JFQUNIRUQpCj4gKwkJCXJldHVybiB0cnVlOwo+ICsJfQo+ICsKPiArCXJl dHVybiBmYWxzZTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgaXQ2NTA1X3N0ZXBfdHJhaW5fbGFu ZV92b2x0YWdlX3ByZV9lbXBoYXNpc19zZXQoCj4gKwlzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsCj4g KwlzdHJ1Y3QgaXQ2NTA1X3N0ZXBfdHJhaW5fcGFyYSAqbGFuZV92b2x0YWdlX3ByZV9lbXBoYXNp cywKPiArCXU4ICpsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzX3NldCkKPiArewo+ICsJdTggaTsK PiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgaXQ2NTA1LT5sYW5lX2NvdW50OyBpKyspIHsKPiArCQls YW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2ldICY9IDB4MDM7Cj4gKwkJ bGFuZV92b2x0YWdlX3ByZV9lbXBoYXNpc19zZXRbaV0gPQo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJl X2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2ldOwo+ICsJCWlmIChpdDY1MDVfY2hlY2tfbWF4X3Zh bHVlKAo+ICsJCQkgICAgVk9MVEFHRV9TV0lORywKPiArCQkJICAgIGxhbmVfdm9sdGFnZV9wcmVf ZW1waGFzaXMtPnZvbHRhZ2Vfc3dpbmdbaV0pKQo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhh c2lzX3NldFtpXSB8PQo+ICsJCQkJRFBfVFJBSU5fTUFYX1NXSU5HX1JFQUNIRUQ7Cj4gKwo+ICsJ CWxhbmVfdm9sdGFnZV9wcmVfZW1waGFzaXMtPnByZV9lbXBoYXNpc1tpXSAmPSAweDAzOwo+ICsJ CWxhbmVfdm9sdGFnZV9wcmVfZW1waGFzaXNfc2V0W2ldIHw9Cj4gKwkJCWxhbmVfdm9sdGFnZV9w cmVfZW1waGFzaXMtPnByZV9lbXBoYXNpc1tpXQo+ICsJCQk8PCBEUF9UUkFJTl9QUkVfRU1QSEFT SVNfU0hJRlQ7Cj4gKwkJaWYgKGl0NjUwNV9jaGVja19tYXhfdmFsdWUoCj4gKwkJCSAgICBQUkVf RU1QSEFTSVMsCj4gKwkJCSAgICBsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT5wcmVfZW1waGFz aXNbaV0pKQo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzX3NldFtpXSB8PQo+ICsJCQkJ RFBfVFJBSU5fTUFYX1BSRV9FTVBIQVNJU19SRUFDSEVEOwo+ICsJCWl0NjUwNV9kcGNkX3dyaXRl KGl0NjUwNSwgRFBfVFJBSU5JTkdfTEFORTBfU0VUICsgaSwKPiArCQkJCSAgbGFuZV92b2x0YWdl X3ByZV9lbXBoYXNpc19zZXRbaV0pOwo+ICsKPiArCQlpZiAobGFuZV92b2x0YWdlX3ByZV9lbXBo YXNpc19zZXRbaV0gIT0KPiArCQkgICAgaXQ2NTA1X2RwY2RfcmVhZChpdDY1MDUsIERQX1RSQUlO SU5HX0xBTkUwX1NFVCArIGkpKQo+ICsJCQlyZXR1cm4gZmFsc2U7Cj4gKwl9Cj4gKwo+ICsJcmV0 dXJuIHRydWU7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sCj4gK2l0NjUwNV9zdGVwX2NyX3RyYWlu KHN0cnVjdCBpdDY1MDUgKml0NjUwNSwKPiArCQkgICAgIHN0cnVjdCBpdDY1MDVfc3RlcF90cmFp bl9wYXJhICpsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzKQo+ICt7Cj4gKwl1OCBsb29wX2NvdW50 ID0gMCwgaSA9IDAsIGo7Cj4gKwl1OCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXSA9 IHsgMCB9Owo+ICsJdTggbGFuZV9sZXZlbF9jb25maWdbTUFYX0xBTkVfQ09VTlRdID0geyAwIH07 Cj4gKwlpbnQgcHJlX2VtcGhhc2lzX2FkanVzdCA9IC0xLCB2b2x0YWdlX3N3aW5nX2FkanVzdCA9 IC0xOwo+ICsKPiArCWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwgRFBfRE9XTlNQUkVBRF9DVFJM LAo+ICsJCQkgIGl0NjUwNS0+ZW5hYmxlX3NzYyA/IERQX1NQUkVBRF9BTVBfMF81IDogMHgwMCk7 Cj4gKwlpdDY1MDVfZHBjZF93cml0ZShpdDY1MDUsIERQX1RSQUlOSU5HX1BBVFRFUk5fU0VULAo+ ICsJCQkgIERQX1RSQUlOSU5HX1BBVFRFUk5fMSk7Cj4gKwo+ICsJd2hpbGUgKGxvb3BfY291bnQg PCA1ICYmIGkgPCAxMCkgewo+ICsJCWkrKzsKPiArCQlpZiAoIWl0NjUwNV9zdGVwX3RyYWluX2xh bmVfdm9sdGFnZV9wcmVfZW1waGFzaXNfc2V0KAo+ICsJCQkgICAgaXQ2NTA1LCBsYW5lX3ZvbHRh Z2VfcHJlX2VtcGhhc2lzLAo+ICsJCQkgICAgbGFuZV9sZXZlbF9jb25maWcpKQo+ICsJCQljb250 aW51ZTsKPiArCQlkcm1fZHBfbGlua190cmFpbl9jbG9ja19yZWNvdmVyeV9kZWxheShpdDY1MDUt PmRwY2QpOwo+ICsJCWRybV9kcF9kcGNkX3JlYWRfbGlua19zdGF0dXMoJml0NjUwNS0+YXV4LCBs aW5rX3N0YXR1cyk7Cj4gKwo+ICsJCWlmIChkcm1fZHBfY2xvY2tfcmVjb3Zlcnlfb2sobGlua19z dGF0dXMsIGl0NjUwNS0+bGFuZV9jb3VudCkpIHsKPiArCQkJaXQ2NTA1X3NldF9iaXRzKGl0NjUw NSwgUkVHX1RSQUlOX0NUUkwwLCBGT1JDRV9DUl9ET05FLAo+ICsJCQkJCUZPUkNFX0NSX0RPTkUp Owo+ICsJCQlyZXR1cm4gdHJ1ZTsKPiArCQl9Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoJml0 NjUwNS0+Y2xpZW50LT5kZXYsICJjciBub3QgZG9uZSIpOwo+ICsKPiArCQlpZiAoaXQ2NTA1X2No ZWNrX21heF92b2x0YWdlX3N3aW5nX3JlYWNoZWQobGFuZV9sZXZlbF9jb25maWcsCj4gKwkJCQkJ CQkgICBpdDY1MDUtPmxhbmVfY291bnQpKQo+ICsJCQlnb3RvIGNyX3RyYWluX2ZhaWw7Cj4gKwo+ ICsJCWZvciAoaiA9IDA7IGogPCBpdDY1MDUtPmxhbmVfY291bnQ7IGorKykgewo+ICsJCQlsYW5l X3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2pdID0KPiArCQkJCWRybV9kcF9n ZXRfYWRqdXN0X3JlcXVlc3Rfdm9sdGFnZShsaW5rX3N0YXR1cywKPiArCQkJCQkJCQkgIGopID4+ Cj4gKwkJCQlEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX1NISUZUOwo+ICsJCQlsYW5lX3ZvbHRhZ2Vf cHJlX2VtcGhhc2lzLT5wcmVfZW1waGFzaXNbal0gPQo+ICsJCQkJZHJtX2RwX2dldF9hZGp1c3Rf cmVxdWVzdF9wcmVfZW1waGFzaXMoCj4gKwkJCQkJbGlua19zdGF0dXMsIGopID4+Cj4gKwkJCQlE UF9UUkFJTl9QUkVfRU1QSEFTSVNfU0hJRlQ7Cj4gKwkJCWlmICgodm9sdGFnZV9zd2luZ19hZGp1 c3QgPT0KPiArCQkJICAgICBsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT52b2x0YWdlX3N3aW5n W2pdKSAmJgo+ICsJCQkgICAgKHByZV9lbXBoYXNpc19hZGp1c3QgPT0KPiArCQkJICAgICBsYW5l X3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT5wcmVfZW1waGFzaXNbal0pKSB7Cj4gKwkJCQlsb29wX2Nv dW50Kys7Cj4gKwkJCQljb250aW51ZTsKPiArCQkJfQo+ICsKPiArCQkJdm9sdGFnZV9zd2luZ19h ZGp1c3QgPQo+ICsJCQkJbGFuZV92b2x0YWdlX3ByZV9lbXBoYXNpcy0+dm9sdGFnZV9zd2luZ1tq XTsKPiArCQkJcHJlX2VtcGhhc2lzX2FkanVzdCA9Cj4gKwkJCQlsYW5lX3ZvbHRhZ2VfcHJlX2Vt cGhhc2lzLT5wcmVfZW1waGFzaXNbal07Cj4gKwkJCWxvb3BfY291bnQgPSAwOwo+ICsKPiArCQkJ aWYgKHZvbHRhZ2Vfc3dpbmdfYWRqdXN0ICsgcHJlX2VtcGhhc2lzX2FkanVzdCA+IDB4MDMpCj4g KwkJCQlsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2pdID0KPiArCQkJ CQlNQVhfRVFfTEVWRUwgLQo+ICsJCQkJCWxhbmVfdm9sdGFnZV9wcmVfZW1waGFzaXMKPiArCQkJ CQkJLT5wcmVfZW1waGFzaXNbal07Cj4gKwkJfQo+ICsJfQo+ICsKPiArY3JfdHJhaW5fZmFpbDoK PiArCWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4g KwkJCSAgRFBfVFJBSU5JTkdfUEFUVEVSTl9ESVNBQkxFKTsKPiArCj4gKwlyZXR1cm4gZmFsc2U7 Cj4gK30KPiArCj4gK3N0YXRpYyBib29sCj4gK2l0NjUwNV9zdGVwX2VxX3RyYWluKHN0cnVjdCBp dDY1MDUgKml0NjUwNSwKPiArCQkgICAgIHN0cnVjdCBpdDY1MDVfc3RlcF90cmFpbl9wYXJhICps YW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzKQo+ICt7Cj4gKwl1OCBsb29wX2NvdW50ID0gMCwgaSwg bGlua19zdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRV0gPSB7IDAgfTsKPiArCXU4IGxhbmVfbGV2 ZWxfY29uZmlnW01BWF9MQU5FX0NPVU5UXSA9IHsgMCB9Owo+ICsKPiArCWl0NjUwNV9kcGNkX3dy aXRlKGl0NjUwNSwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4gKwkJCSAgRFBfVFJBSU5JTkdf UEFUVEVSTl8yKTsKPiArCj4gKwl3aGlsZSAobG9vcF9jb3VudCA8IDYpIHsKPiArCQlsb29wX2Nv dW50Kys7Cj4gKwo+ICsJCWlmICghaXQ2NTA1X3N0ZXBfdHJhaW5fbGFuZV92b2x0YWdlX3ByZV9l bXBoYXNpc19zZXQoCj4gKwkJCSAgICBpdDY1MDUsIGxhbmVfdm9sdGFnZV9wcmVfZW1waGFzaXMs Cj4gKwkJCSAgICBsYW5lX2xldmVsX2NvbmZpZykpCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQlk cm1fZHBfbGlua190cmFpbl9jaGFubmVsX2VxX2RlbGF5KGl0NjUwNS0+ZHBjZCk7Cj4gKwkJZHJt X2RwX2RwY2RfcmVhZF9saW5rX3N0YXR1cygmaXQ2NTA1LT5hdXgsIGxpbmtfc3RhdHVzKTsKPiAr Cj4gKwkJaWYgKCFkcm1fZHBfY2xvY2tfcmVjb3Zlcnlfb2sobGlua19zdGF0dXMsIGl0NjUwNS0+ bGFuZV9jb3VudCkpCj4gKwkJCWdvdG8gZXFfdHJhaW5fZmFpbDsKPiArCj4gKwkJaWYgKGRybV9k cF9jaGFubmVsX2VxX29rKGxpbmtfc3RhdHVzLCBpdDY1MDUtPmxhbmVfY291bnQpKSB7Cj4gKwkJ CWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4gKwkJ CQkJICBEUF9UUkFJTklOR19QQVRURVJOX0RJU0FCTEUpOwo+ICsJCQlpdDY1MDVfc2V0X2JpdHMo aXQ2NTA1LCBSRUdfVFJBSU5fQ1RSTDAsIEZPUkNFX0VRX0RPTkUsCj4gKwkJCQkJRk9SQ0VfRVFf RE9ORSk7Cj4gKwkJCXJldHVybiB0cnVlOwo+ICsJCX0KPiArCQlEUk1fREVWX0RFQlVHX0RSSVZF UigmaXQ2NTA1LT5jbGllbnQtPmRldiwgImVxIG5vdCBkb25lIik7Cj4gKwo+ICsJCWZvciAoaSA9 IDA7IGkgPCBpdDY1MDUtPmxhbmVfY291bnQ7IGkrKykgewo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJl X2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2ldID0KPiArCQkJCWRybV9kcF9nZXRfYWRqdXN0X3Jl cXVlc3Rfdm9sdGFnZShsaW5rX3N0YXR1cywKPiArCQkJCQkJCQkgIGkpID4+Cj4gKwkJCQlEUF9U UkFJTl9WT0xUQUdFX1NXSU5HX1NISUZUOwo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lz LT5wcmVfZW1waGFzaXNbaV0gPQo+ICsJCQkJZHJtX2RwX2dldF9hZGp1c3RfcmVxdWVzdF9wcmVf ZW1waGFzaXMoCj4gKwkJCQkJbGlua19zdGF0dXMsIGkpID4+Cj4gKwkJCQlEUF9UUkFJTl9QUkVf RU1QSEFTSVNfU0hJRlQ7Cj4gKwo+ICsJCQlpZiAobGFuZV92b2x0YWdlX3ByZV9lbXBoYXNpcy0+ dm9sdGFnZV9zd2luZ1tpXSArCj4gKwkJCQkgICAgbGFuZV92b2x0YWdlX3ByZV9lbXBoYXNpcy0+ cHJlX2VtcGhhc2lzW2ldID4KPiArCQkJICAgIDB4MDMpCj4gKwkJCQlsYW5lX3ZvbHRhZ2VfcHJl X2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2ldID0KPiArCQkJCQkweDAzIC0gbGFuZV92b2x0YWdl X3ByZV9lbXBoYXNpcwo+ICsJCQkJCQkgICAgICAgLT5wcmVfZW1waGFzaXNbaV07Cj4gKwkJfQo+ ICsJfQo+ICsKPiArZXFfdHJhaW5fZmFpbDoKPiArCWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwg RFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4gKwkJCSAgRFBfVFJBSU5JTkdfUEFUVEVSTl9ESVNB QkxFKTsKPiArCXJldHVybiBmYWxzZTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgaXQ2NTA1X2xp bmtfc3RhcnRfc3RlcF90cmFpbihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWludCBl cnI7Cj4gKwlzdHJ1Y3QgaXQ2NTA1X3N0ZXBfdHJhaW5fcGFyYSBsYW5lX3ZvbHRhZ2VfcHJlX2Vt cGhhc2lzID0gewo+ICsJCS52b2x0YWdlX3N3aW5nID0geyAwIH0sCj4gKwkJLnByZV9lbXBoYXNp cyA9IHsgMCB9LAo+ICsJfTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUigmaXQ2NTA1LT5j bGllbnQtPmRldiwgInN0YXJ0Iik7Cj4gKwllcnIgPSBpdDY1MDVfZHJtX2RwX2xpbmtfY29uZmln dXJlKGl0NjUwNSk7Cj4gKwo+ICsJaWYgKGVyciAhPSAwKQo+ICsJCXJldHVybiBmYWxzZTsKPiAr CWlmICghaXQ2NTA1X3N0ZXBfY3JfdHJhaW4oaXQ2NTA1LCAmbGFuZV92b2x0YWdlX3ByZV9lbXBo YXNpcykpCj4gKwkJcmV0dXJuIGZhbHNlOwo+ICsJaWYgKCFpdDY1MDVfc3RlcF9lcV90cmFpbihp dDY1MDUsICZsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzKSkKPiArCQlyZXR1cm4gZmFsc2U7Cj4g KwlyZXR1cm4gdHJ1ZTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgaXQ2NTA1X2dldF92aWRlb19z dGF0dXMoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpbnQgcmVnXzBkOwo+ICsKPiAr CXJlZ18wZCA9IGl0NjUwNV9yZWFkKGl0NjUwNSwgUkVHX1NZU1RFTV9TVFMpOwo+ICsKPiArCWlm IChyZWdfMGQgPCAwKQo+ICsJCXJldHVybiBmYWxzZTsKPiArCj4gKwlyZXR1cm4gKHJlZ18wZCAm IFZJREVPX1NUQikgPyB0cnVlIDogZmFsc2U7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUw NV9yZXNldF9oZGNwKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJLyogRGlzYWJsZSBD UF9EZXNpcmVkICovCj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfSERDUF9DVFJMMSwg SERDUF9DUF9FTkFCTEUsIDB4MDApOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1JF U0VUX0NUUkwsIEhEQ1BfUkVTRVQsIEhEQ1BfUkVTRVQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9p ZCBpdDY1MDVfc3RvcF9saW5rX3RyYWluKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJ aXQ2NTA1LT5saW5rX3N0YXRlID0gTElOS19JRExFOwo+ICsJY2FuY2VsX3dvcmtfc3luYygmaXQ2 NTA1LT5saW5rX3dvcmtzKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19UUkFJTl9DVFJM MSwgRk9SQ0VfUkVUUkFJTik7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9saW5rX3Ry YWluaW5nX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICt7Cj4gKwlzdHJ1Y3QgaXQ2 NTA1ICppdDY1MDUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGl0NjUwNSwgbGlua193b3Jr cyk7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCWlu dCBlcnIsIGksIHN0ZXBfcmV0cnkgPSAzOwo+ICsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRl diwgIml0NjUwNS0+c2lua19jb3VudDogJWQiLAo+ICsJCQkgICAgIGl0NjUwNS0+c2lua19jb3Vu dCk7Cj4gKwo+ICsKPiArCWlmICghaXQ2NTA1X2dldF9zaW5rX2hwZF9zdGF0dXMoaXQ2NTA1KSkK PiArCQlyZXR1cm47Cj4gKwo+ICsJaXQ2NTA1X2xpbmtfdHJhaW5pbmdfc2V0dXAoaXQ2NTA1KTsK PiArCj4gKwlpZiAoaXQ2NTA1LT5hdXRvX3RyYWluX3JldHJ5IDwgMSkKPiArCQlnb3RvIHN0ZXBf dHJhaW47Cj4gKwo+ICsJaXQ2NTA1X3Jlc2V0X2hkY3AoaXQ2NTA1KTsKPiArCWl0NjUwNV9hdXhf cmVzZXQoaXQ2NTA1KTsKPiArCWVyciA9IGl0NjUwNV9saW5rX3N0YXJ0X2F1dG9fdHJhaW4oaXQ2 NTA1KTsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgImF1dG8gdHJhaW4gJXMsIGF1dG9f dHJhaW5fcmV0cnk6ICVkIiwKPiArCQkJICAgICBlcnIgPyAicGFzcyIgOiAiZmFpbGVkIiwgaXQ2 NTA1LT5hdXRvX3RyYWluX3JldHJ5KTsKPiArCWl0NjUwNS0+YXV0b190cmFpbl9yZXRyeS0tOwo+ ICsKPiArCWlmIChlcnIpCj4gKwkJZ290byBsaW5rX3RyYWluX29rOwo+ICsKPiArCWl0NjUwNV9k dW1wKGl0NjUwNSk7Cj4gKwlyZXR1cm47Cj4gKwo+ICtzdGVwX3RyYWluOgo+ICsJRFJNX0RFVl9E RUJVR19EUklWRVIoZGV2LCAiU3RhcnQgc3RlcCB0cmFpbiIpOwo+ICsKPiArCWlmIChpdDY1MDUt PnNpbmtfY291bnQgPT0gMCkgewo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIml0NjUw NS0+c2lua19jb3VudDolZCwgZm9yY2UgZXEiLAo+ICsJCQkJICAgICBpdDY1MDUtPnNpbmtfY291 bnQpOwo+ICsJCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsCVJFR19UUkFJTl9DVFJMMCwgRk9SQ0Vf RVFfRE9ORSwKPiArCQkJCUZPUkNFX0VRX0RPTkUpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4g KwlpZiAoIWl0NjUwNS0+c3RlcF90cmFpbikKPiArCQlnb3RvIGxpbmtfdHJhaW5fZXJyb3I7Cj4g Kwo+ICsJLyogc2V0cCB0cmFpbmluZyBzdGFydCBoZXJlICovCj4gKwlmb3IgKGkgPSAwOyBpIDwg c3RlcF9yZXRyeTsgaSsrKSB7Cj4gKwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1RSQUlO X0NUUkwwLAo+ICsJCQkJRk9SQ0VfQ1JfRE9ORSB8IEZPUkNFX0VRX0RPTkUsIDB4MDApOwo+ICsJ CWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4gKwkJ CQkgIERQX1RSQUlOSU5HX1BBVFRFUk5fRElTQUJMRSk7Cj4gKwkJZXJyID0gaXQ2NTA1X2xpbmtf c3RhcnRfc3RlcF90cmFpbihpdDY1MDUpOwo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwg InN0ZXAgdHJhaW4gJXMsIHJldHJ5OiVkIHRpbWVzIiwKPiArCQkJCSAgICAgZXJyID8gInBhc3Mi IDogImZhaWxlZCIsIGkgKyAxKTsKPiArCQlpZiAoZXJyKQo+ICsJCQlnb3RvIGxpbmtfdHJhaW5f b2s7Cj4gKwl9Cj4gKwo+ICtsaW5rX3RyYWluX2Vycm9yOgo+ICsJRFJNX0RFVl9ERUJVR19EUklW RVIoZGV2LCAidHJhaW5pbmcgZmFpbCIpOwo+ICsJaXQ2NTA1LT5saW5rX3N0YXRlID0gTElOS19J RExFOwo+ICsKPiArCWlmICghaXQ2NTA1X2dldF92aWRlb19zdGF0dXMoaXQ2NTA1KSkKPiArCQlp dDY1MDVfdmlkZW9fcmVzZXQoaXQ2NTA1KTsKPiArCXJldHVybjsKPiArCj4gK2xpbmtfdHJhaW5f b2s6Cj4gKwo+ICsJaXQ2NTA1LT5saW5rX3N0YXRlID0gTElOS19PSzsKPiArCS8qIGRpc2FsYmUg bXV0ZSBlbmFibGUgYXZpIGluZm8gZnJhbWUgKi8KPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUs IFJFR19EQVRBX01VVEVfQ1RSTCwgRU5fVklEX01VVEUsIDB4MDApOwo+ICsJaXQ2NTA1X3NldF9i aXRzKGl0NjUwNSwgUkVHX0lORk9GUkFNRV9DVFJMLAo+ICsJCQlFTl9WSURfQ1RSTF9QS1QsIEVO X1ZJRF9DVFJMX1BLVCk7Cj4gKwo+ICsJaWYgKGl0NjUwNV9hdWRpb19pbnB1dChpdDY1MDUpKSB7 Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiRW5hYmxlIGF1ZGlvISIpOwo+ICsJCWl0 NjUwNV9lbmFibGVfYXVkaW8oaXQ2NTA1KTsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQg aXQ2NTA1X3BsdWdnZWRfc3RhdHVzX3RvX2NvZGVjKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiAr ewo+ICsJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXMgPSBpdDY1MDUtPmNvbm5lY3Rv cl9zdGF0dXM7Cj4gKwo+ICsJaWYgKGl0NjUwNS0+cGx1Z2dlZF9jYiAmJiBpdDY1MDUtPmNvZGVj X2RldikKPiArCQlpdDY1MDUtPnBsdWdnZWRfY2IoaXQ2NTA1LT5jb2RlY19kZXYsCj4gKwkJCQkg ICBzdGF0dXMgPT0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQpOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50IGl0NjUwNV9wcm9jc3NfaHBkX2lycShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sK PiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsJaW50IHJl dCwgZHBjZF9zaW5rX2NvdW50LCBkcF9pcnFfdmVjdG9yOwo+ICsJdTggbGlua19zdGF0dXNbRFBf TElOS19TVEFUVVNfU0laRV07Cj4gKwo+ICsJaWYgKCFpdDY1MDVfZ2V0X3NpbmtfaHBkX3N0YXR1 cyhpdDY1MDUpKSB7Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiSFBEX0lSUSBIUEQg bG93Iik7Cj4gKwkJaXQ2NTA1LT5zaW5rX2NvdW50ID0gMDsKPiArCQlyZXR1cm4gMDsKPiArCX0K PiArCj4gKwlyZXQgPSBpdDY1MDVfZHBjZF9yZWFkKGl0NjUwNSwgRFBfU0lOS19DT1VOVCk7Cj4g KwlpZiAocmV0IDwgMCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCWRwY2Rfc2lua19jb3VudCA9 IERQX0dFVF9TSU5LX0NPVU5UKHJldCk7Cj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJk cGNkX3NpbmtfY291bnQ6ICVkIGl0NjUwNS0+c2lua19jb3VudDolZCIsCj4gKwkJCSAgICAgZHBj ZF9zaW5rX2NvdW50LCBpdDY1MDUtPnNpbmtfY291bnQpOwo+ICsKPiArCWlmIChpdDY1MDUtPmJy YW5jaF9kZXZpY2UgJiYgZHBjZF9zaW5rX2NvdW50ICE9IGl0NjUwNS0+c2lua19jb3VudCkgewo+ ICsJCW1lbXNldChpdDY1MDUtPmRwY2QsIDAsIHNpemVvZihpdDY1MDUtPmRwY2QpKTsKPiArCQlp dDY1MDUtPnNpbmtfY291bnQgPSBkcGNkX3NpbmtfY291bnQ7Cj4gKwkJa2ZyZWUoaXQ2NTA1LT5l ZGlkKTsKPiArCQlpdDY1MDUtPmVkaWQgPSBOVUxMOwo+ICsJCWl0NjUwNV9yZXNldF9sb2dpYyhp dDY1MDUpOwo+ICsJCWl0NjUwNV9pbnRfbWFza19lbmFibGUoaXQ2NTA1KTsKPiArCQlpdDY1MDVf aW5pdChpdDY1MDUpOwo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICsKPiArCWRwX2lycV92ZWN0b3Ig PSBpdDY1MDVfZHBjZF9yZWFkKGl0NjUwNSwgRFBfREVWSUNFX1NFUlZJQ0VfSVJRX1ZFQ1RPUik7 Cj4gKwlpZiAoZHBfaXJxX3ZlY3RvciA8IDApCj4gKwkJcmV0dXJuIGRwX2lycV92ZWN0b3I7Cj4g Kwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiZHBfaXJxX3ZlY3RvciA9IDB4JTAyeCIs IGRwX2lycV92ZWN0b3IpOwo+ICsKPiArCS8qIG5vIG5lZWQgdG8gY2hlY2sgbGluayBzdGF0dXMg aWYgbm8gdHJhaW5pbmcgKi8KPiArCWlmIChpdDY1MDUtPmxpbmtfc3RhdGUgPT0gTElOS19PSykg ewo+ICsJCXJldCA9IGRybV9kcF9kcGNkX3JlYWRfbGlua19zdGF0dXMoJml0NjUwNS0+YXV4LCBs aW5rX3N0YXR1cyk7Cj4gKwkJaWYgKHJldCA8IDApIHsKPiArCQkJRFJNX0RFVl9FUlJPUihkZXYs ICJGYWlsIHRvIHJlYWQgbGluayBzdGF0dXMgcmV0OiAlZCIsCj4gKwkJCQkgICAgICByZXQpOwo+ ICsJCQlyZXR1cm4gcmV0Owo+ICsJCX0KPiArCj4gKwkJaWYgKGRwX2xpbmtfc3RhdHVzKGxpbmtf c3RhdHVzLCBEUF9MQU5FX0FMSUdOX1NUQVRVU19VUERBVEVEKSAmCj4gKwkJICAgIERQX0xJTktf U1RBVFVTX1VQREFURUQpIHsKPiArCQkJaWYgKCFkcm1fZHBfY2hhbm5lbF9lcV9vayhsaW5rX3N0 YXR1cywKPiArCQkJCQkJICBpdDY1MDUtPmxhbmVfY291bnQpKQo+ICsJCQkJaXQ2NTA1X3ZpZGVv X3Jlc2V0KGl0NjUwNSk7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBpdDY1MDVfY2hlY2tfcmVnMDYoc3RydWN0IGl0NjUwNSAqaXQ2NTA1LCB1 bnNpZ25lZCBpbnQgcmVnMDYpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUt PmNsaWVudC0+ZGV2Owo+ICsJYm9vbCBkYXRhOwo+ICsKPiArCWlmIChyZWcwNiAmIElOVF9IUERf Q0hBTkdFKSB7Cj4gKwkJZGF0YSA9IGl0NjUwNV9nZXRfc2lua19ocGRfc3RhdHVzKGl0NjUwNSk7 Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiaHBkIGNoYW5nZSBpbnRlcnJ1cHQsIGNo YW5nZSB0byAlcyIsCj4gKwkJCQkgICAgIGRhdGEgPyAiaGlnaCIgOiAibG93Iik7Cj4gKwo+ICsJ CWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChpdDY1MDUtPmNvbm5lY3Rvci5kZXYpOwo+ICsJCURS TV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIml0NjUwNS0+c2lua19jb3VudDogJWQiLAo+ICsJCQkJ ICAgICBpdDY1MDUtPnNpbmtfY291bnQpOwo+ICsKPiArCQlpZiAoZGF0YSkgewo+ICsJCQl3YWl0 X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJml0NjUwNS0+d2FpdF9lZGlkX2NvbXBsZXRlLAo+ICsJ CQkJCQkgICAgbXNlY3NfdG9famlmZmllcyg2MDAwKSk7Cj4gKwkJCWl0NjUwNV9sYW5lX3Rlcm1p bmF0aW9uX29uKGl0NjUwNSk7Cj4gKwkJCWl0NjUwNV9sYW5lX3Bvd2VyX29uKGl0NjUwNSk7Cj4g Kwo+ICsJCQkvKgo+ICsJCQkgKiBmb3Igc29tZSBkb25nbGUgd2hpY2ggaXNzdWUgSFBEX2lycQo+ ICsJCQkgKiB3aGVuIHNpbmsgY291bm50IGNoYW5nZSBmcm9tICAwLT4xCj4gKwkJCSAqIGl0NjUw NSBub3QgYWJsZSB0byByZWNlaXZlIEhQRF9JUlEKPiArCQkJICogaWYgSFcgbmV2ZXIgZ28gaW50 byB0cmFpbmlnIGRvbmUKPiArCQkJICovCj4gKwo+ICsJCQlpZiAoaXQ2NTA1LT5icmFuY2hfZGV2 aWNlICYmIGl0NjUwNS0+c2lua19jb3VudCA9PSAwKQo+ICsJCQkJc2NoZWR1bGVfd29yaygmaXQ2 NTA1LT5saW5rX3dvcmtzKTsKPiArCj4gKwkJCWlmICghaXQ2NTA1X2dldF92aWRlb19zdGF0dXMo aXQ2NTA1KSkKPiArCQkJCWl0NjUwNV92aWRlb19yZXNldChpdDY1MDUpOwo+ICsKPiArCQkJaXQ2 NTA1X2NhbGNfdmlkZW9faW5mbyhpdDY1MDUpOwo+ICsJCX0gZWxzZSB7Cj4gKwkJCWtmcmVlKGl0 NjUwNS0+ZWRpZCk7Cj4gKwkJCWl0NjUwNS0+ZWRpZCA9IE5VTEw7Cj4gKwkJCW1lbXNldChpdDY1 MDUtPmRwY2QsIDAsIHNpemVvZihpdDY1MDUtPmRwY2QpKTsKPiArCj4gKwkJCWl0NjUwNV92aWRl b19kaXNhYmxlKGl0NjUwNSk7Cj4gKwkJCWl0NjUwNV9kaXNhYmxlX2F1ZGlvKGl0NjUwNSk7Cj4g KwkJCWl0NjUwNV9zdG9wX2xpbmtfdHJhaW4oaXQ2NTA1KTsKPiArCQkJaXQ2NTA1X2xhbmVfb2Zm KGl0NjUwNSk7Cj4gKwkJCXJldHVybjsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJaWYgKHJlZzA2ICYg SU5UX1JFQ0VJVkVfSFBEX0lSUSkgewo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgImhw ZF9pcnEgaW50ZXJydXB0Iik7Cj4gKwo+ICsJCWlmIChpdDY1MDVfcHJvY3NzX2hwZF9pcnEoaXQ2 NTA1KSA8IDApCj4gKwkJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgInByb2Nlc3MgaHBkX2ly cSBmYWlsISIpOwo+ICsJfQo+ICsKPiArCWlmIChyZWcwNiAmIElOVF9TQ0RUX0NIQU5HRSkgewo+ ICsJCWRhdGEgPSBpdDY1MDVfZ2V0X3ZpZGVvX3N0YXR1cyhpdDY1MDUpOwo+ICsJCURSTV9ERVZf REVCVUdfRFJJVkVSKGRldiwgInZpZGVvIHN0YWJsZSBjaGFuZ2UgaW50ZXJydXB0LCAlcyIsCj4g KwkJCQkgICAgIGRhdGEgPyAic3RhYmxlIiA6ICJ1bnN0YWJsZSIpOwo+ICsJCWl0NjUwNV9jYWxj X3ZpZGVvX2luZm8oaXQ2NTA1KTsKPiArCj4gKwkJaWYgKGRhdGEpCj4gKwkJCXNjaGVkdWxlX3dv cmsoJml0NjUwNS0+bGlua193b3Jrcyk7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0 NjUwNV9jaGVja19yZWcwNyhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVuc2lnbmVkIGludCByZWcw NykKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUwNS0+Y2xpZW50LT5kZXY7Cj4g Kwo+ICsJaWYgKHJlZzA3ICYgSU5UX0FVWF9DTURfRkFJTCkKPiArCQlEUk1fREVWX0RFQlVHX0RS SVZFUihkZXYsICJBVVggUEMgUmVxdWVzdCBGYWlsIEludGVycnVwdCIpOwo+ICsKPiArCWlmIChy ZWcwNyAmIElOVF9BVURJT19GSUZPX0VSUk9SKSB7Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIo ZGV2LCAiYXVkaW8gZmlmbyBlcnJvciBJbnRlcnJ1cHQiKTsKPiArCj4gKwkJaWYgKGl0NjUwNV9h dWRpb19pbnB1dChpdDY1MDUpKQo+ICsJCQlpdDY1MDVfZW5hYmxlX2F1ZGlvKGl0NjUwNSk7Cj4g Kwl9Cj4gKwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfY2hlY2tfcmVnMDgoc3RydWN0 IGl0NjUwNSAqaXQ2NTA1LCB1bnNpZ25lZCBpbnQgcmVnMDgpCj4gK3sKPiArCXN0cnVjdCBkZXZp Y2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsKPiArCWlmIChyZWcwOCAmIElOVF9M SU5LX1RSQUlOX0ZBSUwpIHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJsaW5rIHRy YWluaW5nIGZhaWwgaW50ZXJydXB0Iik7Cj4gKwkJc2NoZWR1bGVfd29yaygmaXQ2NTA1LT5saW5r X3dvcmtzKTsKPiArCX0KPiArCj4gKwlpZiAocmVnMDggJiBJTlRfVklEX0ZJRk9fRVJST1IpIHsK PiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJ2aWRlbyBmaWZvIG92ZXJmbG93IGludGVy cnVwdCIpOwo+ICsJCWl0NjUwNV92aWRlb19yZXNldChpdDY1MDUpOwo+ICsJCWl0NjUwNS0+YXV0 b190cmFpbl9yZXRyeSA9IEFVVE9fVFJBSU5fUkVUUlk7Cj4gKwl9Cj4gKwo+ICsJaWYgKHJlZzA4 ICYgSU5UX0lPX0xBVENIX0ZJRk9fT1ZFUkZMT1cpIHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZF UihkZXYsICJJTyBsYXRjaCBmaWZvIG92ZXJmbG93IGludGVycnVwdCIpOwo+ICsJCWl0NjUwNV92 aWRlb19yZXNldChpdDY1MDUpOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgaXJxcmV0dXJuX3Qg aXQ2NTA1X2ludF90aHJlYWRlZF9oYW5kbGVyKGludCB1bnVzZWQsIHZvaWQgKmRhdGEpCj4gK3sK PiArCXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGRhdGE7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYg PSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCWludCByZWcwNiwgcmVnMDcsIHJlZzA4Owo+ICsK PiArCW1zbGVlcCgxMDApOwo+ICsJbXV0ZXhfbG9jaygmaXQ2NTA1LT5leHRjb25fbG9jayk7Cj4g Kwo+ICsJaWYgKGl0NjUwNS0+ZW5hYmxlX2Rydl9ob2xkIHx8ICFpdDY1MDUtPnBvd2VyZWQpCj4g KwkJZ290byB1bmxvY2s7Cj4gKwo+ICsJcmVnMDYgPSBpdDY1MDVfcmVhZChpdDY1MDUsIElOVF9T VEFUVVNfMDEpOwo+ICsJcmVnMDcgPSBpdDY1MDVfcmVhZChpdDY1MDUsIElOVF9TVEFUVVNfMDIp Owo+ICsJcmVnMDggPSBpdDY1MDVfcmVhZChpdDY1MDUsIElOVF9TVEFUVVNfMDMpOwo+ICsKPiAr CWl0NjUwNV93cml0ZShpdDY1MDUsIElOVF9TVEFUVVNfMDEsIHJlZzA2KTsKPiArCWl0NjUwNV93 cml0ZShpdDY1MDUsIElOVF9TVEFUVVNfMDIsIHJlZzA3KTsKPiArCWl0NjUwNV93cml0ZShpdDY1 MDUsIElOVF9TVEFUVVNfMDMsIHJlZzA4KTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihk ZXYsICJyZWcwNiA9IDB4JTAyeCIsIHJlZzA2KTsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRl diwgInJlZzA3ID0gMHglMDJ4IiwgcmVnMDcpOwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2 LCAicmVnMDggPSAweCUwMngiLCByZWcwOCk7Cj4gKwo+ICsJaWYgKHJlZzA2ICE9IDApCj4gKwkJ aXQ2NTA1X2NoZWNrX3JlZzA2KGl0NjUwNSwgcmVnMDYpOwo+ICsKPiArCWlmIChyZWcwNyAhPSAw KQo+ICsJCWl0NjUwNV9jaGVja19yZWcwNyhpdDY1MDUsIHJlZzA3KTsKPiArCj4gKwlpZiAocmVn MDggIT0gMCkKPiArCQlpdDY1MDVfY2hlY2tfcmVnMDgoaXQ2NTA1LCByZWcwOCk7Cj4gKwo+ICt1 bmxvY2s6Cj4gKwltdXRleF91bmxvY2soJml0NjUwNS0+ZXh0Y29uX2xvY2spOwo+ICsKPiArCXJl dHVybiBJUlFfSEFORExFRDsKPiArfQo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfcG93ZXJvbihz dHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1 MDUtPmNsaWVudC0+ZGV2Owo+ICsJc3RydWN0IGl0NjUwNV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9 ICZpdDY1MDUtPnBkYXRhOwo+ICsJaW50IGVycjsKPiArCj4gKwlpZiAoaXQ2NTA1LT5wb3dlcmVk KSB7Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiaXQ2NTA1IGFscmVhZHkgcG93ZXJl ZCBvbiIpOwo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICsKPiArCWlmIChwZGF0YS0+cHdyMTgpIHsK PiArCQllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHBkYXRhLT5wd3IxOCk7Cj4gKwkJaWYgKGVycikg ewo+ICsJCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIFZERDE4 OiAlZCIsCj4gKwkJCQkJICAgICBlcnIpOwo+ICsJCQlyZXR1cm4gZXJyOwo+ICsJCX0KPiArCX0K PiArCj4gKwlpZiAocGRhdGEtPm92ZGQpIHsKPiArCQkvKiB0aW1lIGludGVydmFsIGJldHdlZW4g SVZERCBhbmQgT1ZERCBhdCBsZWFzdCBiZSAxbXMgKi8KPiArCQl1c2xlZXBfcmFuZ2UoMTAwMCwg MjAwMCk7Cj4gKwkJZXJyID0gcmVndWxhdG9yX2VuYWJsZShwZGF0YS0+b3ZkZCk7Cj4gKwkJaWYg KGVycikgewo+ICsJCQlyZWd1bGF0b3JfZGlzYWJsZShwZGF0YS0+cHdyMTgpOwo+ICsJCQlyZXR1 cm4gZXJyOwo+ICsJCX0KPiArCX0KPiArCS8qIHRpbWUgaW50ZXJ2YWwgYmV0d2VlbiBPVkREIGFu ZCBTWVNSU1ROIGF0IGxlYXN0IGJlIDEwbXMgKi8KPiArCWlmIChwZGF0YS0+Z3Bpb2RfcmVzZXQp IHsKPiArCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKPiArCQlncGlvZF9zZXRfdmFsdWVf Y2Fuc2xlZXAocGRhdGEtPmdwaW9kX3Jlc2V0LCAwKTsKPiArCQl1c2xlZXBfcmFuZ2UoMTAwMCwg MjAwMCk7Cj4gKwkJZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKHBkYXRhLT5ncGlvZF9yZXNldCwg MSk7Cj4gKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7Cj4gKwl9Cj4gKwo+ICsJaXQ2NTA1 X3Jlc2V0X2xvZ2ljKGl0NjUwNSk7Cj4gKwlpdDY1MDVfaW50X21hc2tfZW5hYmxlKGl0NjUwNSk7 Cj4gKwlpdDY1MDVfaW5pdChpdDY1MDUpOwo+ICsJaXQ2NTA1X2xhbmVfb2ZmKGl0NjUwNSk7Cj4g Kwo+ICsJaXQ2NTA1LT5wb3dlcmVkID0gdHJ1ZTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsK PiArc3RhdGljIGludCBpdDY1MDVfcG93ZXJvZmYoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7 Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCXN0cnVj dCBpdDY1MDVfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSAmaXQ2NTA1LT5wZGF0YTsKPiArCWludCBl cnI7Cj4gKwo+ICsJaWYgKCFpdDY1MDUtPnBvd2VyZWQpIHsKPiArCQlEUk1fREVWX0RFQlVHX0RS SVZFUihkZXYsICJwb3dlciBoYWQgYmVlbiBhbHJlYWR5IG9mZiIpOwo+ICsJCXJldHVybiAwOwo+ ICsJfQo+ICsKPiArCWlmIChwZGF0YS0+Z3Bpb2RfcmVzZXQpCj4gKwkJZ3Bpb2Rfc2V0X3ZhbHVl X2NhbnNsZWVwKHBkYXRhLT5ncGlvZF9yZXNldCwgMCk7Cj4gKwo+ICsJaWYgKHBkYXRhLT5wd3Ix OCkgewo+ICsJCWVyciA9IHJlZ3VsYXRvcl9kaXNhYmxlKHBkYXRhLT5wd3IxOCk7Cj4gKwkJaWYg KGVycikKPiArCQkJcmV0dXJuIGVycjsKPiArCX0KPiArCj4gKwlpZiAocGRhdGEtPm92ZGQpIHsK PiArCQllcnIgPSByZWd1bGF0b3JfZGlzYWJsZShwZGF0YS0+b3ZkZCk7Cj4gKwkJaWYgKGVycikK PiArCQkJcmV0dXJuIGVycjsKPiArCX0KPiArCj4gKwlpdDY1MDUtPnBvd2VyZWQgPSBmYWxzZTsK PiArCWtmcmVlKGl0NjUwNS0+ZWRpZCk7Cj4gKwlpdDY1MDUtPmVkaWQgPSBOVUxMOwo+ICsJaXQ2 NTA1LT5zaW5rX2NvdW50ID0gMDsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGlj IGlubGluZSBzdHJ1Y3QgaXQ2NTA1ICpjb25uZWN0b3JfdG9faXQ2NTA1KHN0cnVjdCBkcm1fY29u bmVjdG9yICpjKQo+ICt7Cj4gKwlyZXR1cm4gY29udGFpbmVyX29mKGMsIHN0cnVjdCBpdDY1MDUs IGNvbm5lY3Rvcik7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaXQ2NTA1X2dldF9tb2RlcyhzdHJ1 Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ICt7Cj4gKwlzdHJ1Y3QgaXQ2NTA1ICppdDY1 MDUgPSBjb25uZWN0b3JfdG9faXQ2NTA1KGNvbm5lY3Rvcik7Cj4gKwlpbnQgZXJyLCBudW1fbW9k ZXMgPSAwLCBpOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUwNS0+Y2xpZW50LT5kZXY7 Cj4gKwo+ICsJaWYgKGl0NjUwNS0+ZWRpZCkKPiArCQlyZXR1cm4gZHJtX2FkZF9lZGlkX21vZGVz KGNvbm5lY3RvciwgaXQ2NTA1LT5lZGlkKTsKPiArCj4gKwltdXRleF9sb2NrKCZpdDY1MDUtPm1v ZGVfbG9jayk7Cj4gKwlpbml0X2NvbXBsZXRpb24oJml0NjUwNS0+d2FpdF9lZGlkX2NvbXBsZXRl KTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Cj4gKwkJaWYgKCFpdDY1MDVfZ2V0 X3NpbmtfaHBkX3N0YXR1cyhpdDY1MDUpKQo+ICsJCQlnb3RvIHVubG9jazsKPiArCj4gKwkJaXQ2 NTA1LT5lZGlkID0KPiArCQlkcm1fZG9fZ2V0X2VkaWQoJml0NjUwNS0+Y29ubmVjdG9yLCBpdDY1 MDVfZ2V0X2VkaWRfYmxvY2ssCj4gKwkJCQlpdDY1MDUpOwo+ICsKPiArCQlpZiAoaXQ2NTA1LT5l ZGlkKQo+ICsJCQlicmVhazsKPiArCX0KPiArCWlmICghaXQ2NTA1LT5lZGlkKSB7Cj4gKwkJRFJN X0RFVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gcmVhZCBFRElEIik7Cj4gKwkJZ290byB1bmxvY2s7 Cj4gKwl9Cj4gKwo+ICsJZXJyID0gZHJtX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShj b25uZWN0b3IsIGl0NjUwNS0+ZWRpZCk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJRFJNX0RFVl9FUlJP UihkZXYsICJGYWlsZWQgdG8gdXBkYXRlIEVESUQgcHJvcGVydHk6ICVkIiwgZXJyKTsKPiArCQln b3RvIHVubG9jazsKPiArCX0KPiArCj4gKwludW1fbW9kZXMgPSBkcm1fYWRkX2VkaWRfbW9kZXMo Y29ubmVjdG9yLCBpdDY1MDUtPmVkaWQpOwo+ICsKPiArdW5sb2NrOgo+ICsJY29tcGxldGUoJml0 NjUwNS0+d2FpdF9lZGlkX2NvbXBsZXRlKTsKPiArCW11dGV4X3VubG9jaygmaXQ2NTA1LT5tb2Rl X2xvY2spOwo+ICsKPiArCXJldHVybiBudW1fbW9kZXM7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25z dCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgaXQ2NTA1X2Nvbm5lY3Rvcl9oZWxw ZXJfZnVuY3MgPSB7Cj4gKwkuZ2V0X21vZGVzID0gaXQ2NTA1X2dldF9tb2RlcywKPiArfTsKPiAr Cj4gK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGl0NjUwNV9kZXRlY3Qoc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiArCQkJCQkgICAgICAgYm9vbCBmb3JjZSkKPiAr ewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gY29ubmVjdG9yX3RvX2l0NjUwNShjb25uZWN0 b3IpOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUwNS0+Y2xpZW50LT5kZXY7Cj4gKwll bnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29u bmVjdGVkOwo+ICsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIml0NjUwNS0+c2lua19j b3VudDolZCBwb3dlcmVkOiVkIiwKPiArCQkJICAgICBpdDY1MDUtPnNpbmtfY291bnQsIGl0NjUw NS0+cG93ZXJlZCk7Cj4gKwo+ICsJbXV0ZXhfbG9jaygmaXQ2NTA1LT5tb2RlX2xvY2spOwo+ICsK PiArCWlmICghaXQ2NTA1LT5wb3dlcmVkKQo+ICsJCWdvdG8gdW5sb2NrOwo+ICsKPiArCWlmIChp dDY1MDUtPmVuYWJsZV9kcnZfaG9sZCkgewo+ICsJCXN0YXR1cyA9IGl0NjUwNV9nZXRfc2lua19o cGRfc3RhdHVzKGl0NjUwNSkgPwo+ICsJCQkJCWNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkIDoK PiArCQkJCQljb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKPiArCQlnb3RvIHVubG9jazsK PiArCX0KPiArCj4gKwlpZiAoaXQ2NTA1X2dldF9zaW5rX2hwZF9zdGF0dXMoaXQ2NTA1KSkgewo+ ICsJCWl0NjUwNV9hdXhfb24oaXQ2NTA1KTsKPiArCQlpdDY1MDVfZHJtX2RwX2xpbmtfcHJvYmUo Jml0NjUwNS0+YXV4LCAmaXQ2NTA1LT5saW5rKTsKPiArCQlpdDY1MDVfZHJtX2RwX2xpbmtfcG93 ZXJfdXAoJml0NjUwNS0+YXV4LCAmaXQ2NTA1LT5saW5rKTsKPiArCQlpdDY1MDUtPmF1dG9fdHJh aW5fcmV0cnkgPSBBVVRPX1RSQUlOX1JFVFJZOwo+ICsKPiArCQlpZiAoaXQ2NTA1LT5kcGNkWzBd ID09IDApIHsKPiArCQkJaXQ2NTA1X2dldF9kcGNkKGl0NjUwNSwgRFBfRFBDRF9SRVYsIGl0NjUw NS0+ZHBjZCwKPiArCQkJCQlBUlJBWV9TSVpFKGl0NjUwNS0+ZHBjZCkpOwo+ICsJCQlpdDY1MDVf dmFyaWFibGVfY29uZmlnKGl0NjUwNSk7Cj4gKwkJCWl0NjUwNV9wYXJzZV9saW5rX2NhcGFiaWxp dGllcyhpdDY1MDUpOwo+ICsJCX0KPiArCj4gKwkJaXQ2NTA1LT5zaW5rX2NvdW50ID0gRFBfR0VU X1NJTktfQ09VTlQoaXQ2NTA1X2RwY2RfcmVhZChpdDY1MDUsCj4gKwkJCQkJCSAgICAgICBEUF9T SU5LX0NPVU5UKSk7Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiaXQ2NTA1LT5zaW5r X2NvdW50OiVkIGJyYW5jaDolZCIsCj4gKwkJCQkgICAgIGl0NjUwNS0+c2lua19jb3VudCwgaXQ2 NTA1LT5icmFuY2hfZGV2aWNlKTsKPiArCj4gKwkJaWYgKGl0NjUwNS0+YnJhbmNoX2RldmljZSkg ewo+ICsJCQlzdGF0dXMgPSAoaXQ2NTA1LT5zaW5rX2NvdW50ICE9IDApID8KPiArCQkJCSBjb25u ZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCA6Cj4gKwkJCQkgY29ubmVjdG9yX3N0YXR1c19kaXNjb25u ZWN0ZWQ7Cj4gKwkJfSBlbHNlIHsKPiArCQkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25u ZWN0ZWQ7Cj4gKwkJfQo+ICsJfSBlbHNlIHsKPiArCQlpdDY1MDUtPnNpbmtfY291bnQgPSAwOwo+ ICsJCW1lbXNldChpdDY1MDUtPmRwY2QsIDAsIHNpemVvZihpdDY1MDUtPmRwY2QpKTsKPiArCX0K PiArCj4gK3VubG9jazoKPiArCWlmIChpdDY1MDUtPmNvbm5lY3Rvcl9zdGF0dXMgIT0gc3RhdHVz KSB7Cj4gKwkJaXQ2NTA1LT5jb25uZWN0b3Jfc3RhdHVzID0gc3RhdHVzOwo+ICsJCWl0NjUwNV9w bHVnZ2VkX3N0YXR1c190b19jb2RlYyhpdDY1MDUpOwo+ICsJfQo+ICsKPiArCW11dGV4X3VubG9j aygmaXQ2NTA1LT5tb2RlX2xvY2spOwo+ICsKPiArCXJldHVybiBzdGF0dXM7Cj4gK30KPiArCj4g K3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyBpdDY1MDVfY29ubmVjdG9y X2Z1bmNzID0gewo+ICsJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25u ZWN0b3JfbW9kZXMsCj4gKwkuZGV0ZWN0ID0gaXQ2NTA1X2RldGVjdCwKPiArCS5kZXN0cm95ID0g ZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwLAo+ICsJLnJlc2V0ID0gZHJtX2F0b21pY19oZWxwZXJfY29u bmVjdG9yX3Jlc2V0LAo+ICsJLmF0b21pY19kdXBsaWNhdGVfc3RhdGUgPSBkcm1fYXRvbWljX2hl bHBlcl9jb25uZWN0b3JfZHVwbGljYXRlX3N0YXRlLAo+ICsJLmF0b21pY19kZXN0cm95X3N0YXRl ID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2Rlc3Ryb3lfc3RhdGUsCj4gK307Cj4gKwo+ ICtzdGF0aWMgaW50IGl0NjUwNV9leHRjb25fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2Nr ICpzZWxmLAo+ICsJCQkJICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCj4gK3sKPiAr CXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGNvbnRhaW5lcl9vZihzZWxmLCBzdHJ1Y3QgaXQ2NTA1 LCBldmVudF9uYik7Cj4gKwo+ICsJc2NoZWR1bGVfd29yaygmaXQ2NTA1LT5leHRjb25fd3EpOwo+ ICsJcmV0dXJuIE5PVElGWV9ET05FOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfZXh0 Y29uX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICt7Cj4gKwlzdHJ1Y3QgaXQ2NTA1 ICppdDY1MDUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGl0NjUwNSwgZXh0Y29uX3dxKTsK PiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsJaW50IHN0 YXRlID0gZXh0Y29uX2dldF9zdGF0ZShpdDY1MDUtPmV4dGNvbiwgRVhUQ09OX0RJU1BfRFApOwo+ ICsJdW5zaWduZWQgaW50IHB3cm9mZnJldHJ5ID0gMDsKPiArCj4gKwlpZiAoaXQ2NTA1LT5lbmFi bGVfZHJ2X2hvbGQpCj4gKwkJcmV0dXJuOwo+ICsKPiArCW11dGV4X2xvY2soJml0NjUwNS0+ZXh0 Y29uX2xvY2spOwo+ICsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIkVYVENPTl9ESVNQ X0RQID0gMHglMDJ4Iiwgc3RhdGUpOwo+ICsJaWYgKHN0YXRlID4gMCkgewo+ICsJCURSTV9ERVZf REVCVUdfRFJJVkVSKGRldiwgInN0YXJ0IHRvIHBvd2VyIG9uIik7Cj4gKwkJbXNsZWVwKDEwMCk7 Cj4gKwkJaXQ2NTA1X3Bvd2Vyb24oaXQ2NTA1KTsKPiArCX0gZWxzZSB7Cj4gKwkJRFJNX0RFVl9E RUJVR19EUklWRVIoZGV2LCAic3RhcnQgdG8gcG93ZXIgb2ZmIik7Cj4gKwkJd2hpbGUgKGl0NjUw NV9wb3dlcm9mZihpdDY1MDUpICYmIHB3cm9mZnJldHJ5KysgPCA1KSB7Cj4gKwkJCURSTV9ERVZf REVCVUdfRFJJVkVSKGRldiwgInBvd2VyIG9mZiBmYWlsICVkIHRpbWVzIiwKPiArCQkJCQkgICAg IHB3cm9mZnJldHJ5KTsKPiArCQl9Cj4gKwo+ICsJCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChp dDY1MDUtPmNvbm5lY3Rvci5kZXYpOwo+ICsJCW1lbXNldChpdDY1MDUtPmRwY2QsIDAsIHNpemVv ZihpdDY1MDUtPmRwY2QpKTsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJwb3dlciBv ZmYgaXQ2NTA1IHN1Y2Nlc3MhIik7Cj4gKwl9Cj4gKwo+ICsJbXV0ZXhfdW5sb2NrKCZpdDY1MDUt PmV4dGNvbl9sb2NrKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfdXNlX25vdGlmaWVy X21vZHVsZShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWludCByZXQ7Cj4gKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCj4gKwlpdDY1MDUtPmV2 ZW50X25iLm5vdGlmaWVyX2NhbGwgPSBpdDY1MDVfZXh0Y29uX25vdGlmaWVyOwo+ICsJSU5JVF9X T1JLKCZpdDY1MDUtPmV4dGNvbl93cSwgaXQ2NTA1X2V4dGNvbl93b3JrKTsKPiArCXJldCA9IGRl dm1fZXh0Y29uX3JlZ2lzdGVyX25vdGlmaWVyKCZpdDY1MDUtPmNsaWVudC0+ZGV2LAo+ICsJCQkJ CSAgICBpdDY1MDUtPmV4dGNvbiwgRVhUQ09OX0RJU1BfRFAsCj4gKwkJCQkJICAgICZpdDY1MDUt PmV2ZW50X25iKTsKPiArCWlmIChyZXQpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwgImZhaWxl ZCB0byByZWdpc3RlciBub3RpZmllciBmb3IgRFAiKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ ICsKPiArCXNjaGVkdWxlX3dvcmsoJml0NjUwNS0+ZXh0Y29uX3dxKTsKPiArCj4gKwlyZXR1cm4g MDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X3JlbW92ZV9ub3RpZmllcl9tb2R1bGUo c3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpZiAoaXQ2NTA1LT5leHRjb24pIHsKPiAr CQlkZXZtX2V4dGNvbl91bnJlZ2lzdGVyX25vdGlmaWVyKCZpdDY1MDUtPmNsaWVudC0+ZGV2LAo+ ICsJCQkJCQlpdDY1MDUtPmV4dGNvbiwJRVhUQ09OX0RJU1BfRFAsCj4gKwkJCQkJCSZpdDY1MDUt PmV2ZW50X25iKTsKPiArCj4gKwkJZmx1c2hfd29yaygmaXQ2NTA1LT5leHRjb25fd3EpOwo+ICsJ fQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBpdDY1MDVfZGVsYXllZF9h dWRpbyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCj4gK3sKPiArCXN0cnVjdCBpdDY1MDUgKml0 NjUwNSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXQ2NTA1LAo+ICsJCQkJCSAgICAgZGVs YXllZF9hdWRpby53b3JrKTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUigmaXQ2NTA1LT5j bGllbnQtPmRldiwgInN0YXJ0Iik7Cj4gKwo+ICsJaWYgKCFpdDY1MDUtPnBvd2VyZWQpCj4gKwkJ cmV0dXJuOwo+ICsKPiArCWlmICghaXQ2NTA1LT5lbmFibGVfZHJ2X2hvbGQpCj4gKwkJaXQ2NTA1 X2VuYWJsZV9hdWRpbyhpdDY1MDUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IF9fbWF5YmVfdW51 c2VkIGl0NjUwNV9hdWRpb19zZXR1cF9od19wYXJhbXMoc3RydWN0IGl0NjUwNSAqaXQ2NTA1LAo+ ICsJCQkJCXN0cnVjdCBoZG1pX2NvZGVjX3BhcmFtcyAqcGFyYW1zKQo+ICt7Cj4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCWludCBpID0gMDsKPiArCj4g KwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICIlcyAlZCBIeiwgJWQgYml0LCAlZCBjaGFubmVs c1xuIiwgX19mdW5jX18sCj4gKwkJCSAgICAgcGFyYW1zLT5zYW1wbGVfcmF0ZSwgcGFyYW1zLT5z YW1wbGVfd2lkdGgsCj4gKwkJCSAgICAgcGFyYW1zLT5jZWEuY2hhbm5lbHMpOwo+ICsKPiArCWlm ICghaXQ2NTA1LT5icmlkZ2UuZW5jb2RlcikKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCj4gKwlp ZiAocGFyYW1zLT5jZWEuY2hhbm5lbHMgPD0gMSB8fCBwYXJhbXMtPmNlYS5jaGFubmVscyA+IDgp IHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJjaGFubmVsIG51bWJlcjogJWQgbm90 IHN1cHBvcnQiLAo+ICsJCQkJICAgICBpdDY1MDUtPmF1ZGlvLmNoYW5uZWxfY291bnQpOwo+ICsJ CXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCWl0NjUwNS0+YXVkaW8uY2hhbm5lbF9jb3Vu dCA9IHBhcmFtcy0+Y2VhLmNoYW5uZWxzOwo+ICsKPiArCXdoaWxlIChpIDwgQVJSQVlfU0laRShh dWRpb19zYW1wbGVfcmF0ZV9tYXApICYmCj4gKwkgICAgICAgcGFyYW1zLT5zYW1wbGVfcmF0ZSAh PQo+ICsJCSAgICAgICBhdWRpb19zYW1wbGVfcmF0ZV9tYXBbaV0uc2FtcGxlX3JhdGVfdmFsdWUp IHsKPiArCQlpKys7Cj4gKwl9Cj4gKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGF1ZGlvX3NhbXBsZV9y YXRlX21hcCkpIHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJzYW1wbGUgcmF0ZTog JWQgSHogbm90IHN1cHBvcnQiLAo+ICsJCQkJICAgICBwYXJhbXMtPnNhbXBsZV9yYXRlKTsKPiAr CQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCWl0NjUwNS0+YXVkaW8uc2FtcGxlX3JhdGUgPSBh dWRpb19zYW1wbGVfcmF0ZV9tYXBbaV0ucmF0ZTsKPiArCj4gKwlzd2l0Y2ggKHBhcmFtcy0+c2Ft cGxlX3dpZHRoKSB7Cj4gKwljYXNlIDE2Ogo+ICsJCWl0NjUwNS0+YXVkaW8ud29yZF9sZW5ndGgg PSBXT1JEX0xFTkdUSF8xNkJJVDsKPiArCQlicmVhazsKPiArCWNhc2UgMTg6Cj4gKwkJaXQ2NTA1 LT5hdWRpby53b3JkX2xlbmd0aCA9IFdPUkRfTEVOR1RIXzE4QklUOwo+ICsJCWJyZWFrOwo+ICsJ Y2FzZSAyMDoKPiArCQlpdDY1MDUtPmF1ZGlvLndvcmRfbGVuZ3RoID0gV09SRF9MRU5HVEhfMjBC SVQ7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIDI0Ogo+ICsJY2FzZSAzMjoKPiArCQlpdDY1MDUtPmF1 ZGlvLndvcmRfbGVuZ3RoID0gV09SRF9MRU5HVEhfMjRCSVQ7Cj4gKwkJYnJlYWs7Cj4gKwlkZWZh dWx0Ogo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIndvcmRsZW5ndGg6ICVkIGJpdCBu b3Qgc3VwcG9ydCIsCj4gKwkJCQkgICAgIHBhcmFtcy0+c2FtcGxlX3dpZHRoKTsKPiArCQlyZXR1 cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZv aWQgX19tYXliZV91bnVzZWQgaXQ2NTA1X2F1ZGlvX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRl diwgdm9pZCAqZGF0YSkKPiArewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gZGV2X2dldF9k cnZkYXRhKGRldik7Cj4gKwo+ICsJaWYgKGl0NjUwNS0+cG93ZXJlZCkKPiArCQlpdDY1MDVfZGlz YWJsZV9hdWRpbyhpdDY1MDUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IF9fbWF5YmVfdW51c2Vk IGl0NjUwNV9hdWRpb19ob29rX3BsdWdnZWRfY2Ioc3RydWN0IGRldmljZSAqZGV2LAo+ICsJCQkJ CQkgICAgICAgdm9pZCAqZGF0YSwKPiArCQkJCQkJICAgICAgIGhkbWlfY29kZWNfcGx1Z2dlZF9j YiBmbiwKPiArCQkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmNvZGVjX2RldikKPiArewo+ICsJ c3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gZGF0YTsKPiArCj4gKwlpdDY1MDUtPnBsdWdnZWRfY2Ig PSBmbjsKPiArCWl0NjUwNS0+Y29kZWNfZGV2ID0gY29kZWNfZGV2Owo+ICsJaXQ2NTA1X3BsdWdn ZWRfc3RhdHVzX3RvX2NvZGVjKGl0NjUwNSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4g K3N0YXRpYyBpbmxpbmUgc3RydWN0IGl0NjUwNSAqYnJpZGdlX3RvX2l0NjUwNShzdHJ1Y3QgZHJt X2JyaWRnZSAqYnJpZGdlKQo+ICt7Cj4gKwlyZXR1cm4gY29udGFpbmVyX29mKGJyaWRnZSwgc3Ry dWN0IGl0NjUwNSwgYnJpZGdlKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2JyaWRn ZV9tb2RlX3NldChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+ICsJCQkJICAgY29uc3Qgc3Ry dWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCj4gKwkJCQkgICBjb25zdCBzdHJ1Y3QgZHJtX2Rp c3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKPiArewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1 ID0gYnJpZGdlX3RvX2l0NjUwNShicmlkZ2UpOwo+ICsJc3RydWN0IGhkbWlfYXZpX2luZm9mcmFt ZSBmcmFtZTsKPiArCWludCBlcnI7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5j bGllbnQtPmRldjsKPiArCj4gKwlpZiAoV0FSTl9PTighaXQ2NTA1LT5wb3dlcmVkKSkKPiArCQly ZXR1cm47Cj4gKwo+ICsJbXV0ZXhfbG9jaygmaXQ2NTA1LT5tb2RlX2xvY2spOwo+ICsKPiArCWVy ciA9IGRybV9oZG1pX2F2aV9pbmZvZnJhbWVfZnJvbV9kaXNwbGF5X21vZGUoJmZyYW1lLAo+ICsJ CQkJCQkgICAgICAgJml0NjUwNS0+Y29ubmVjdG9yLAo+ICsJCQkJCQkgICAgICAgYWRqdXN0ZWRf bW9kZSk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJGYWlsZWQgdG8g c2V0dXAgQVZJIGluZm9mcmFtZTogJWQiLCBlcnIpOwo+ICsJCWdvdG8gdW5sb2NrOwo+ICsJfQo+ ICsKPiArCWl0NjUwNV91cGRhdGVfdmlkZW9fcHJhcm1ldGVyKGl0NjUwNSwgYWRqdXN0ZWRfbW9k ZSk7Cj4gKwo+ICsJZXJyID0gaXQ2NTA1X3NlbmRfdmlkZW9faW5mb2ZyYW1lKGl0NjUwNSwgJmZy YW1lKTsKPiArCWlmIChlcnIpCj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gc2Vu ZCBBVkkgaW5mb2ZyYW1lOiAlZCIsIGVycik7Cj4gKwo+ICt1bmxvY2s6Cj4gKwltdXRleF91bmxv Y2soJml0NjUwNS0+bW9kZV9sb2NrKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfYnJp ZGdlX2F0dGFjaChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+ICsJCQkJZW51bSBkcm1fYnJp ZGdlX2F0dGFjaF9mbGFncyBmbGFncykKPiArewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0g YnJpZGdlX3RvX2l0NjUwNShicmlkZ2UpOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUw NS0+Y2xpZW50LT5kZXY7Cj4gKwlpbnQgZXJyOwo+ICsKPiArCWlmICghYnJpZGdlLT5lbmNvZGVy KSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJQYXJlbnQgZW5jb2RlciBvYmplY3Qgbm90IGZv dW5kIik7Cj4gKwkJcmV0dXJuIC1FTk9ERVY7Cj4gKwl9Cj4gKwo+ICsJZXJyID0gZHJtX2Nvbm5l Y3Rvcl9pbml0KGJyaWRnZS0+ZGV2LCAmaXQ2NTA1LT5jb25uZWN0b3IsCj4gKwkJCQkgJml0NjUw NV9jb25uZWN0b3JfZnVuY3MsCj4gKwkJCQkgRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0 KTsKPiArCWlmIChlcnIgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJGYWlsZWQgdG8g aW5pdGlhbGl6ZSBjb25uZWN0b3I6ICVkIiwgZXJyKTsKPiArCQlyZXR1cm4gZXJyOwo+ICsJfQo+ ICsKPiArCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmaXQ2NTA1LT5jb25uZWN0b3IsCj4gKwkJ CQkgJml0NjUwNV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKPiArCj4gKwlpdDY1MDUtPmNvbm5l Y3Rvci5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfSFBEOwo+ICsKPiArCWVyciA9IGRybV9j b25uZWN0b3JfYXR0YWNoX2VuY29kZXIoJml0NjUwNS0+Y29ubmVjdG9yLCBicmlkZ2UtPmVuY29k ZXIpOwo+ICsJaWYgKGVyciA8IDApIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwgIkZhaWxlZCB0 byBsaW5rIHVwIGNvbm5lY3RvciB0byBlbmNvZGVyOiAlZCIsCj4gKwkJCSAgICAgIGVycik7Cj4g KwkJZ290byBjbGVhbnVwX2Nvbm5lY3RvcjsKPiArCX0KPiArCj4gKwllcnIgPSBkcm1fY29ubmVj dG9yX3JlZ2lzdGVyKCZpdDY1MDUtPmNvbm5lY3Rvcik7Cj4gKwlpZiAoZXJyIDwgMCkgewo+ICsJ CURSTV9ERVZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNvbm5lY3RvcjogJWQiLCBl cnIpOwo+ICsJCWdvdG8gY2xlYW51cF9jb25uZWN0b3I7Cj4gKwl9Cj4gKwo+ICsJaWYgKGl0NjUw NS0+ZXh0Y29uKSB7Cj4gKwkJZXJyID0gaXQ2NTA1X3VzZV9ub3RpZmllcl9tb2R1bGUoaXQ2NTA1 KTsKPiArCQlpZiAoZXJyIDwgMCkgewo+ICsJCQlkcm1fY29ubmVjdG9yX3VucmVnaXN0ZXIoJml0 NjUwNS0+Y29ubmVjdG9yKTsKPiArCQkJZ290byBjbGVhbnVwX2Nvbm5lY3RvcjsKPiArCQl9Cj4g Kwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gKwo+ICtjbGVhbnVwX2Nvbm5lY3RvcjoKPiArCWRybV9j b25uZWN0b3JfY2xlYW51cCgmaXQ2NTA1LT5jb25uZWN0b3IpOwo+ICsJcmV0dXJuIGVycjsKPiAr fQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2JyaWRnZV9kZXRhY2goc3RydWN0IGRybV9icmlk Z2UgKmJyaWRnZSkKPiArewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gYnJpZGdlX3RvX2l0 NjUwNShicmlkZ2UpOwo+ICsKPiArCWZsdXNoX3dvcmsoJml0NjUwNS0+bGlua193b3Jrcyk7Cj4g KwlpdDY1MDVfcmVtb3ZlX25vdGlmaWVyX21vZHVsZShpdDY1MDUpOwo+ICsJZHJtX2Nvbm5lY3Rv cl91bnJlZ2lzdGVyKCZpdDY1MDUtPmNvbm5lY3Rvcik7Cj4gKwlkcm1fY29ubmVjdG9yX2NsZWFu dXAoJml0NjUwNS0+Y29ubmVjdG9yKTsKPiArfQo+ICsKPiArc3RhdGljIGVudW0gZHJtX21vZGVf c3RhdHVzCj4gK2l0NjUwNV9icmlkZ2VfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJp ZGdlLAo+ICsJCQkgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X2luZm8gKmluZm8sCj4gKwkJCSBj b25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiArewo+ICsJc3RydWN0IGl0NjUw NSAqaXQ2NTA1ID0gYnJpZGdlX3RvX2l0NjUwNShicmlkZ2UpOwo+ICsKPiArCWlmIChtb2RlLT5m bGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKQo+ICsJCXJldHVybiBNT0RFX05PX0lOVEVS TEFDRTsKPiArCj4gKwlpZiAobW9kZS0+Y2xvY2sgPiBEUElfUElYRUxfQ0xLX01BWCkKPiArCQly ZXR1cm4gTU9ERV9DTE9DS19ISUdIOwo+ICsKPiArCWl0NjUwNS0+dmlkZW9faW5mby5jbG9jayA9 IG1vZGUtPmNsb2NrOwo+ICsKPiArCXJldHVybiBNT0RFX09LOwo+ICt9Cj4gKwo+ICtzdGF0aWMg dm9pZCBpdDY1MDVfYnJpZGdlX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ICt7 Cj4gKwlzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUgPSBicmlkZ2VfdG9faXQ2NTA1KGJyaWRnZSk7Cj4g Kwo+ICsJaXQ2NTA1X2ludF9tYXNrX2VuYWJsZShpdDY1MDUpOwo+ICsJaXQ2NTA1X3ZpZGVvX3Jl c2V0KGl0NjUwNSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9icmlkZ2VfZGlzYWJs ZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ICt7Cj4gKwlzdHJ1Y3QgaXQ2NTA1ICppdDY1 MDUgPSBicmlkZ2VfdG9faXQ2NTA1KGJyaWRnZSk7Cj4gKwo+ICsJaWYgKGl0NjUwNS0+cG93ZXJl ZCkKPiArCQlpdDY1MDVfdmlkZW9fZGlzYWJsZShpdDY1MDUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGRybV9icmlkZ2VfZnVuY3MgaXQ2NTA1X2JyaWRnZV9mdW5jcyA9IHsKPiAr CS5hdHRhY2ggPSBpdDY1MDVfYnJpZGdlX2F0dGFjaCwKPiArCS5kZXRhY2ggPSBpdDY1MDVfYnJp ZGdlX2RldGFjaCwKPiArCS5tb2RlX3ZhbGlkID0gaXQ2NTA1X2JyaWRnZV9tb2RlX3ZhbGlkLAo+ ICsJLm1vZGVfc2V0ID0gaXQ2NTA1X2JyaWRnZV9tb2RlX3NldCwKPiArCS5lbmFibGUgPSBpdDY1 MDVfYnJpZGdlX2VuYWJsZSwKPiArCS5kaXNhYmxlID0gaXQ2NTA1X2JyaWRnZV9kaXNhYmxlLAo+ ICt9Owo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfYnJpZGdlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNl ICpkZXYpCj4gK3sKPiArCXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGRldl9nZXRfZHJ2ZGF0YShk ZXYpOwo+ICsKPiArCXJldHVybiBpdDY1MDVfcG93ZXJvbihpdDY1MDUpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IGl0NjUwNV9icmlkZ2Vfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gK3sK PiArCXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsKPiAr CXJldHVybiBpdDY1MDVfcG93ZXJvZmYoaXQ2NTA1KTsKPiArfQo+ICsKPiArc3RhdGljIFNJTVBM RV9ERVZfUE1fT1BTKGl0NjUwNV9icmlkZ2VfcG1fb3BzLCBpdDY1MDVfYnJpZGdlX3N1c3BlbmQs Cj4gKwkJCSBpdDY1MDVfYnJpZGdlX3Jlc3VtZSk7Cj4gKwo+ICsKPiArCj4gK3N0YXRpYyBpbnQg aXQ2NTA1X2luaXRfcGRhdGEoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlzdHJ1Y3Qg aXQ2NTA1X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gJml0NjUwNS0+cGRhdGE7Cj4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCj4gKwkvKiAxLjBWIGRpZ2l0 YWwgY29yZSBwb3dlciByZWd1bGF0b3IgICovCj4gKwlwZGF0YS0+cHdyMTggPSBkZXZtX3JlZ3Vs YXRvcl9nZXQoZGV2LCAicHdyMTgiKTsKPiArCWlmIChJU19FUlIocGRhdGEtPnB3cjE4KSkgewo+ ICsJCURSTV9ERVZfRVJST1IoZGV2LCAicHdyMTggcmVndWxhdG9yIG5vdCBmb3VuZCIpOwo+ICsJ CXJldHVybiBQVFJfRVJSKHBkYXRhLT5wd3IxOCk7Cj4gKwl9Cj4gKwo+ICsJcGRhdGEtPm92ZGQg PSBkZXZtX3JlZ3VsYXRvcl9nZXQoZGV2LCAib3ZkZCIpOwo+ICsJaWYgKElTX0VSUihwZGF0YS0+ b3ZkZCkpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwgIm92ZGQgcmVndWxhdG9yIG5vdCBmb3Vu ZCIpOwo+ICsJCXJldHVybiBQVFJfRVJSKHBkYXRhLT5vdmRkKTsKPiArCX0KPiArCj4gKwlwZGF0 YS0+Z3Bpb2RfcmVzZXQgPSBkZXZtX2dwaW9kX2dldChkZXYsICJyZXNldCIsIEdQSU9EX09VVF9I SUdIKTsKPiArCWlmIChJU19FUlIocGRhdGEtPmdwaW9kX3Jlc2V0KSkgewo+ICsJCURSTV9ERVZf RVJST1IoZGV2LCAiZ3Bpb2RfcmVzZXQgZ3BpbyBub3QgZm91bmQiKTsKPiArCQlyZXR1cm4gUFRS X0VSUihwZGF0YS0+Z3Bpb2RfcmVzZXQpOwo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfcGFyc2VfZHQoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCXUz MiBhZmVfc2V0dGluZyA9IDA7Cj4gKwo+ICsJaXQ2NTA1LT5sYW5lX3N3YXBfZGlzYWJsZWQgPSB0 cnVlOwo+ICsJaXQ2NTA1LT5hZmVfc2V0dGluZyA9IDA7Cj4gKwo+ICsJaXQ2NTA1LT5sYW5lX3N3 YXBfZGlzYWJsZWQgPQo+ICsJCWRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAibm8tbGFu ZXN3YXAiKTsKPiArCj4gKwlpZiAoaXQ2NTA1LT5sYW5lX3N3YXBfZGlzYWJsZWQpCj4gKwkJaXQ2 NTA1LT5sYW5lX3N3YXAgPSBmYWxzZTsKPiArCj4gKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRf dTMyKGRldiwgImFmZS1zZXR0aW5nIiwgJmFmZV9zZXR0aW5nKSA9PSAwKQo+ICsJCWlmIChhZmVf c2V0dGluZyA+PSBBUlJBWV9TSVpFKGFmZV9zZXR0aW5nX3RhYmxlKSkgewo+ICsJCQlEUk1fREVW X0VSUk9SKGRldiwgImFmZSBzZXR0aW5nIGVycm9yLCB1c2UgZGVmYXVsdCIpOwo+ICsJCQlhZmVf c2V0dGluZyA9IDA7Cj4gKwkJfQo+ICsKPiArCWl0NjUwNS0+YWZlX3NldHRpbmcgPSBhZmVfc2V0 dGluZzsKPiArfQo+ICsKPiArc3RhdGljIHNzaXplX3QgcHJpbnRfdGltaW5nX3Nob3coc3RydWN0 IGRldmljZSAqZGV2LAo+ICsJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFy ICpidWYpCj4gK3sKPiArCXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGRldl9nZXRfZHJ2ZGF0YShk ZXYpOwo+ICsJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnZpZCA9ICZpdDY1MDUtPnZpZGVvX2lu Zm87Cj4gKwljaGFyICpzdHIgPSBidWYsICplbmQgPSBidWYgKyBQQUdFX1NJWkU7Cj4gKwo+ICsJ aXQ2NTA1X2NhbGNfdmlkZW9faW5mbyhpdDY1MDUpOwo+ICsJc3RyICs9IHNjbnByaW50ZihzdHIs IGVuZCAtIHN0ciwgIi0tLXZpZGVvIHRpbWluZy0tLVxuIik7Cj4gKwlzdHIgKz0gc2NucHJpbnRm KHN0ciwgZW5kIC0gc3RyLCAiUENMSzolZC4lMDNkTUh6XG4iLAo+ICsJCQkgdmlkLT5jbG9jayAv IDEwMDAsIHZpZC0+Y2xvY2sgJSAxMDAwKTsKPiArCXN0ciArPSBzY25wcmludGYoc3RyLCBlbmQg LSBzdHIsICJIVG90YWw6JWRcbiIsIHZpZC0+aHRvdGFsKTsKPiArCXN0ciArPSBzY25wcmludGYo c3RyLCBlbmQgLSBzdHIsICJIQWN0aXZlOiVkXG4iLCB2aWQtPmhkaXNwbGF5KTsKPiArCXN0ciAr PSBzY25wcmludGYoc3RyLCBlbmQgLSBzdHIsICJIRnJvbnRQb3JjaDolZFxuIiwKPiArCQkJIHZp ZC0+aHN5bmNfc3RhcnQgLSB2aWQtPmhkaXNwbGF5KTsKPiArCXN0ciArPSBzY25wcmludGYoc3Ry LCBlbmQgLSBzdHIsICJIU3luY1dpZHRoOiVkXG4iLAo+ICsJCQkgdmlkLT5oc3luY19lbmQgLSB2 aWQtPmhzeW5jX3N0YXJ0KTsKPiArCXN0ciArPSBzY25wcmludGYoc3RyLCBlbmQgLSBzdHIsICJI QmFja1BvcmNoOiVkXG4iLAo+ICsJCQkgdmlkLT5odG90YWwgLSB2aWQtPmhzeW5jX2VuZCk7Cj4g KwlzdHIgKz0gc2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAiVlRvdGFsOiVkXG4iLCB2aWQtPnZ0 b3RhbCk7Cj4gKwlzdHIgKz0gc2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAiVkFjdGl2ZTolZFxu IiwgdmlkLT52ZGlzcGxheSk7Cj4gKwlzdHIgKz0gc2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAi VkZyb250UG9yY2g6JWRcbiIsCj4gKwkJCSB2aWQtPnZzeW5jX3N0YXJ0IC0gdmlkLT52ZGlzcGxh eSk7Cj4gKwlzdHIgKz0gc2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAiVlN5bmNXaWR0aDolZFxu IiwKPiArCQkJIHZpZC0+dnN5bmNfZW5kIC0gdmlkLT52c3luY19zdGFydCk7Cj4gKwlzdHIgKz0g c2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAiVkJhY2tQb3JjaDolZFxuIiwKPiArCQkJIHZpZC0+ dnRvdGFsIC0gdmlkLT52c3luY19lbmQpOwo+ICsKPiArCXJldHVybiBzdHIgLSBidWY7Cj4gK30K PiArCj4gK3N0YXRpYyBzc2l6ZV90IGZvcmNlX3B3cm9ub2ZmX3N0b3JlKHN0cnVjdCBkZXZpY2Ug KmRldiwKPiArCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKPiArCQkJCSAg ICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKPiArewo+ICsJc3RydWN0IGl0NjUwNSAq aXQ2NTA1ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gKwlpbnQgcHdyOwo+ICsKPiArCWlmIChr c3RydG9pbnQoYnVmLCAxMCwgJnB3cikgPCAwKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiAr CWlmIChwd3IpCj4gKwkJaXQ2NTA1X3Bvd2Vyb24oaXQ2NTA1KTsKPiArCWVsc2UKPiArCQlpdDY1 MDVfcG93ZXJvZmYoaXQ2NTA1KTsKPiArCj4gKwlyZXR1cm4gY291bnQ7Cj4gK30KPiArCj4gK3N0 YXRpYyBzc2l6ZV90IGVuYWJsZV9kcnZfaG9sZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKPiAr CQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQo+ICt7Cj4g KwlzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiArCj4gKwly ZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGl0NjUwNS0+ZW5hYmxlX2Ry dl9ob2xkKTsKPiArfQo+ICsKPiArc3RhdGljIHNzaXplX3QgZW5hYmxlX2Rydl9ob2xkX3N0b3Jl KHN0cnVjdCBkZXZpY2UgKmRldiwKPiArCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUg KmF0dHIsCj4gKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQo+ICt7Cj4g KwlzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiArCXVuc2ln bmVkIGludCBkcnZfaG9sZDsKPiArCj4gKwlpZiAoa3N0cnRvaW50KGJ1ZiwgMTAsICZkcnZfaG9s ZCkgPCAwKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCWl0NjUwNS0+ZW5hYmxlX2Rydl9o b2xkID0gISFkcnZfaG9sZDsKPiArCj4gKwlpZiAoaXQ2NTA1LT5lbmFibGVfZHJ2X2hvbGQpIHsK PiArCQlpdDY1MDVfaW50X21hc2tfZGlzYWJsZShpdDY1MDUpOwo+ICsJfSBlbHNlIHsKPiArCQlp dDY1MDVfY2xlYXJfaW50KGl0NjUwNSk7Cj4gKwkJaXQ2NTA1X2ludF9tYXNrX2VuYWJsZShpdDY1 MDUpOwo+ICsKPiArCQlpZiAoaXQ2NTA1LT5wb3dlcmVkKSB7Cj4gKwkJCWl0NjUwNS0+Y29ubmVj dG9yX3N0YXR1cyA9Cj4gKwkJCQkJaXQ2NTA1X2dldF9zaW5rX2hwZF9zdGF0dXMoaXQ2NTA1KSA/ Cj4gKwkJCQkJY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQgOgo+ICsJCQkJCWNvbm5lY3Rvcl9z dGF0dXNfZGlzY29ubmVjdGVkOwo+ICsJCX0gZWxzZSB7Cj4gKwkJCWl0NjUwNS0+Y29ubmVjdG9y X3N0YXR1cyA9Cj4gKwkJCQkJY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cj4gKwkJfQo+ ICsJfQo+ICsJcmV0dXJuIGNvdW50Owo+ICt9Cj4gKwo+ICtzdGF0aWMgREVWSUNFX0FUVFJfUk8o cHJpbnRfdGltaW5nKTsKPiArc3RhdGljIERFVklDRV9BVFRSX1dPKGZvcmNlX3B3cm9ub2ZmKTsK PiArc3RhdGljIERFVklDRV9BVFRSX1JXKGVuYWJsZV9kcnZfaG9sZCk7Cj4gKwo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqaXQ2NTA1X2F0dHJzW10gPSB7Cj4gKwkmZGV2X2F0dHJf cHJpbnRfdGltaW5nLmF0dHIsCj4gKwkmZGV2X2F0dHJfZm9yY2VfcHdyb25vZmYuYXR0ciwKPiAr CSZkZXZfYXR0cl9lbmFibGVfZHJ2X2hvbGQuYXR0ciwKPiArCU5VTEwsCj4gK307Cj4gKwo+ICtz dGF0aWMgaW50IGl0NjUwNV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKPiAr CQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKPiArewo+ICsJc3RydWN0IGl0 NjUwNSAqaXQ2NTA1Owo+ICsJc3RydWN0IGl0NjUwNV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKPiAr CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKPiArCXN0cnVjdCBleHRjb25fZGV2 ICpleHRjb247Cj4gKwlpbnQgZXJyLCBpbnRwX2lycTsKPiArCj4gKwlpdDY1MDUgPSBkZXZtX2t6 YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKml0NjUwNSksIEdGUF9LRVJORUwpOwo+ICsJaWYg KCFpdDY1MDUpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJbXV0ZXhfaW5pdCgmaXQ2NTA1 LT5leHRjb25fbG9jayk7Cj4gKwltdXRleF9pbml0KCZpdDY1MDUtPm1vZGVfbG9jayk7Cj4gKwlt dXRleF9pbml0KCZpdDY1MDUtPmF1eF9sb2NrKTsKPiArCj4gKwlwZGF0YSA9ICZpdDY1MDUtPnBk YXRhOwo+ICsKPiArCWl0NjUwNS0+YnJpZGdlLm9mX25vZGUgPSBjbGllbnQtPmRldi5vZl9ub2Rl Owo+ICsJaXQ2NTA1LT5jb25uZWN0b3Jfc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25u ZWN0ZWQ7Cj4gKwlpdDY1MDUtPmNsaWVudCA9IGNsaWVudDsKPiArCWkyY19zZXRfY2xpZW50ZGF0 YShjbGllbnQsIGl0NjUwNSk7Cj4gKwo+ICsJLyogZ2V0IGV4dGNvbiBkZXZpY2UgZnJvbSBEVFMg Ki8KPiArCWV4dGNvbiA9IGV4dGNvbl9nZXRfZWRldl9ieV9waGFuZGxlKGRldiwgMCk7Cj4gKwlp ZiAoUFRSX0VSUihleHRjb24pID09IC1FUFJPQkVfREVGRVIpCj4gKwkJcmV0dXJuIC1FUFJPQkVf REVGRVI7Cj4gKwlpZiAoSVNfRVJSKGV4dGNvbikpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwg ImNhbiBub3QgZ2V0IGV4dGNvbiBkZXZpY2UhIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9 Cj4gKwo+ICsJaXQ2NTA1LT5leHRjb24gPSBleHRjb247Cj4gKwo+ICsJaXQ2NTA1LT5yZWdtYXAg PSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZpdDY1MDVfcmVnbWFwX2NvbmZpZyk7Cj4g KwlpZiAoSVNfRVJSKGl0NjUwNS0+cmVnbWFwKSkgewo+ICsJCURSTV9ERVZfRVJST1IoZGV2LCAi cmVnbWFwIGkyYyBpbml0IGZhaWxlZCIpOwo+ICsJCWVyciA9IFBUUl9FUlIoaXQ2NTA1LT5yZWdt YXApOwo+ICsJCXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJZXJyID0gaXQ2NTA1X2luaXRfcGRh dGEoaXQ2NTA1KTsKPiArCWlmIChlcnIpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwgIkZhaWxl ZCB0byBpbml0aWFsaXplIHBkYXRhOiAlZCIsIGVycik7Cj4gKwkJcmV0dXJuIGVycjsKPiArCX0K PiArCj4gKwlpdDY1MDVfcGFyc2VfZHQoaXQ2NTA1KTsKPiArCj4gKwlpbnRwX2lycSA9IGNsaWVu dC0+aXJxOwo+ICsKPiArCWlmICghaW50cF9pcnEpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwg IkZhaWxlZCB0byBnZXQgSU5UUCBJUlEiKTsKPiArCQllcnIgPSAtRU5PREVWOwo+ICsJCXJldHVy biBlcnI7Cj4gKwl9Cj4gKwo+ICsJZXJyID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmY2xp ZW50LT5kZXYsIGludHBfaXJxLCBOVUxMLAo+ICsJCQkJCWl0NjUwNV9pbnRfdGhyZWFkZWRfaGFu ZGxlciwKPiArCQkJCQlJUlFGX1RSSUdHRVJfTE9XIHwgSVJRRl9PTkVTSE9ULAo+ICsJCQkJCSJp dDY1MDUtaW50cCIsIGl0NjUwNSk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihk ZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBJTlRQIHRocmVhZGVkIElSUTogJWQiLAo+ICsJCQkgICAg ICBlcnIpOwo+ICsJCXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJLyogUmVnaXN0ZXIgYXV4IGNo YW5uZWwgKi8KPiArCWl0NjUwNS0+YXV4Lm5hbWUgPSAiRFAtQVVYIjsKPiArCWl0NjUwNS0+YXV4 LmRldiA9IGRldjsKPiArCWl0NjUwNS0+YXV4LnRyYW5zZmVyID0gaXQ2NTA1X2F1eF90cmFuc2Zl cjsKPiArCj4gKwllcnIgPSBkcm1fZHBfYXV4X3JlZ2lzdGVyKCZpdDY1MDUtPmF1eCk7Cj4gKwlp ZiAoZXJyIDwgMCkgewo+ICsJCURSTV9ERVZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVy IGF1eDogJWQiLCBlcnIpOwo+ICsJCXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJSU5JVF9XT1JL KCZpdDY1MDUtPmxpbmtfd29ya3MsIGl0NjUwNV9saW5rX3RyYWluaW5nX3dvcmspOwo+ICsJaW5p dF9jb21wbGV0aW9uKCZpdDY1MDUtPndhaXRfZWRpZF9jb21wbGV0ZSk7Cj4gKwlpdDY1MDUtPnBv d2VyZWQgPSBmYWxzZTsKPiArCWl0NjUwNS0+ZW5hYmxlX2Rydl9ob2xkID0gREVGQVVMVF9EUlZf SE9MRDsKPiArCj4gKwlpZiAoREVGQVVMVF9QV1JfT04pCj4gKwkJaXQ2NTA1X3Bvd2Vyb24oaXQ2 NTA1KTsKPiArCj4gKwllcnIgPSBzeXNmc19jcmVhdGVfZmlsZXMoJmNsaWVudC0+ZGV2LmtvYmos IGl0NjUwNV9hdHRycyk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJZHJtX2RwX2F1eF91bnJlZ2lzdGVy KCZpdDY1MDUtPmF1eCk7Cj4gKwkJcmV0dXJuIGVycjsKPiArCX0KPiArCj4gKwlpdDY1MDUtPmJy aWRnZS5mdW5jcyA9ICZpdDY1MDVfYnJpZGdlX2Z1bmNzOwo+ICsJZHJtX2JyaWRnZV9hZGQoJml0 NjUwNS0+YnJpZGdlKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBp dDY1MDVfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQo+ICt7Cj4gKwlzdHJ1 Y3QgaXQ2NTA1ICppdDY1MDUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKPiArCj4gKwlk cm1fY29ubmVjdG9yX3VucmVnaXN0ZXIoJml0NjUwNS0+Y29ubmVjdG9yKTsKPiArCWRybV9jb25u ZWN0b3JfY2xlYW51cCgmaXQ2NTA1LT5jb25uZWN0b3IpOwo+ICsJZHJtX2JyaWRnZV9yZW1vdmUo Jml0NjUwNS0+YnJpZGdlKTsKPiArCWRybV9kcF9hdXhfdW5yZWdpc3RlcigmaXQ2NTA1LT5hdXgp Owo+ICsJc3lzZnNfcmVtb3ZlX2ZpbGVzKCZjbGllbnQtPmRldi5rb2JqLCBpdDY1MDVfYXR0cnMp Owo+ICsJaXQ2NTA1X3Bvd2Vyb2ZmKGl0NjUwNSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiAr Cj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBpdDY1MDVfaWRbXSA9IHsKPiAr CXsgIml0NjUwNSIsIDAgfSwKPiArCXsgfQo+ICt9Owo+ICsKPiArTU9EVUxFX0RFVklDRV9UQUJM RShpMmMsIGl0NjUwNV9pZCk7Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9p ZCBpdDY1MDVfb2ZfbWF0Y2hbXSA9IHsKPiArCXsgLmNvbXBhdGlibGUgPSAiaXRlLGl0NjUwNSIg fSwKPiArCXsgfQo+ICt9Owo+ICsKPiArc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGl0NjUwNV9p MmNfZHJpdmVyID0gewo+ICsJLmRyaXZlciA9IHsKPiArCQkubmFtZSA9ICJpdDY1MDUiLAo+ICsJ CS5vZl9tYXRjaF90YWJsZSA9IGl0NjUwNV9vZl9tYXRjaCwKPiArCQkucG0gPSAmaXQ2NTA1X2Jy aWRnZV9wbV9vcHMsCj4gKwl9LAo+ICsJLnByb2JlID0gaXQ2NTA1X2kyY19wcm9iZSwKPiArCS5y ZW1vdmUgPSBpdDY1MDVfaTJjX3JlbW92ZSwKPiArCS5pZF90YWJsZSA9IGl0NjUwNV9pZCwKPiAr fTsKPiArCj4gK21vZHVsZV9pMmNfZHJpdmVyKGl0NjUwNV9pMmNfZHJpdmVyKTsKPiArCj4gK01P RFVMRV9BVVRIT1IoIkhlcm1lcyBXdSA8aGVybWVzLnd1QGl0ZS5jb20udHc+Iik7Cj4gK01PRFVM RV9ERVNDUklQVElPTigiSVQ2NTA1IERpc3BsYXlQb3J0IFRyYW5zbWl0dGVyIGRyaXZlciIpOwo+ ICtNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cj4gLS0gCj4gMS45LjEKPiAKPiBfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+IGRyaS1kZXZlbCBtYWlsaW5n IGxpc3QKPiBkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gaHR0cHM6Ly9saXN0cy5m cmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGlu ZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMu aW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.0 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D87C7C433E0 for ; Mon, 10 Aug 2020 18:16:04 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A6C2C207FF for ; Mon, 10 Aug 2020 18:16:04 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A6C2C207FF Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ravnborg.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8BD0789DA5; Mon, 10 Aug 2020 18:16:03 +0000 (UTC) Received: from asavdk3.altibox.net (asavdk3.altibox.net [109.247.116.14]) by gabe.freedesktop.org (Postfix) with ESMTPS id 66DBE89D84 for ; Mon, 10 Aug 2020 18:16:01 +0000 (UTC) Received: from ravnborg.org (unknown [188.228.123.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by asavdk3.altibox.net (Postfix) with ESMTPS id 9020B20023; Mon, 10 Aug 2020 20:15:55 +0200 (CEST) Date: Mon, 10 Aug 2020 20:15:54 +0200 From: Sam Ravnborg To: allen Subject: Re: [PATCH v10] drm/bridge: add it6505 driver Message-ID: <20200810181554.GE292825@ravnborg.org> References: <1594892860-6569-1-git-send-email-allen.chen@ite.com.tw> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1594892860-6569-1-git-send-email-allen.chen@ite.com.tw> X-CMAE-Score: 0 X-CMAE-Analysis: v=2.3 cv=f+hm+t6M c=1 sm=1 tr=0 a=S6zTFyMACwkrwXSdXUNehg==:117 a=S6zTFyMACwkrwXSdXUNehg==:17 a=IkcTkHD0fZMA:10 a=mpaa-ttXAAAA:8 a=cm27Pg_UAAAA:8 a=1XWaLZrsAAAA:8 a=Ns9eNvu6AAAA:8 a=e5mUnYsNAAAA:8 a=L8YDfXaSqtconZh9qGgA:9 a=6YHz0X6AXIijI_lZ:21 a=OhsBIkaczIQ1SNPw:21 a=QEXdDO2ut3YA:10 a=6heAxKwa5pAsJatQ0mat:22 a=xmb-EsYY8bH0VWELuYED:22 a=LZLx1i01EnjtqRv10NxV:22 a=Vxmtnl_E_bksehYqCbjh:22 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jernej Skrabec , Jitao Shi , Neil Armstrong , Yilun Lin , Jau-Chih Tseng , open list , "open list:DRM DRIVERS" , Andrzej Hajda , David Airlie , Hermes Wu , "moderated list:ARM/Mediatek SoC support" , Laurent Pinchart , Pi-Hsun Shih , Matthias Brugger , "moderated list:ARM/Mediatek SoC support" , Jonas Karlman Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" SGkgYWxsZW4uCgpPbiBUaHUsIEp1bCAxNiwgMjAyMCBhdCAwNTo0NzozMVBNICswODAwLCBhbGxl biB3cm90ZToKPiBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgdGhlIGlURSBJVDY1MDUuCj4gVGhpcyBk ZXZpY2UgY2FuIGNvbnZlcnQgRFBJIHNpZ25hbCB0byBEUCBvdXRwdXQuCj4gCj4gU2lnbmVkLW9m Zi1ieTogSml0YW8gU2hpIDxqaXRhby5zaGlAbWVkaWF0ZWsuY29tPgo+IFNpZ25lZC1vZmYtYnk6 IFBpLUhzdW4gU2hpaCA8cGloc3VuQGNocm9taXVtLm9yZz4KPiBTaWduZWQtb2ZmLWJ5OiBZaWx1 biBMaW4gPHlsbGluQGdvb2dsZS5jb20+Cj4gU2lnbmVkLW9mZi1ieTogSGVybWVzIFd1IDxoZXJt ZXMud3VAaXRlLmNvbS50dz4KPiBTaWduZWQtb2ZmLWJ5OiBBbGxlbiBDaGVuIDxhbGxlbi5jaGVu QGl0ZS5jb20udHc+Cj4gLS0tCkNhbiB5b3UgcGxlYXNlIGFkZCBhIEZyb206IGxpbmUgc28gaXQg aXMgcG9zc2libGUgZm9yIHRoZSB0b29scyB0byBwaWNrCndobyBpcyB0aGUgYXV0aG9yLgpSaWdo dCBub3cgeW91IGFyZSBwaWNrZWQgLSB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBPSy4KCgpJIHRy aWVkIHRvIGFwcGx5IHRoZSBwYXRjaCAtIGJ1dCB0aGVyZSBpcyBhIGZldyB0aGluZ3MgdG8gbG9v ayBhdDoKCkkgZ290IHRoaXMgd2l0aCBvbmUgb2YgbXkgY29uZmlncyAoYWxseWVzIG9yIGFsbG1v ZGNvbmZpZ3MpOgogQ0MgW01dICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY1MDUubwov aG9tZS9zYW0vZHJtL2xpbnV4LmdpdC9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY1MDUu YzoyNTg5OjEyOiB3YXJuaW5nOiDigJhpdDY1MDVfYnJpZGdlX3N1c3BlbmTigJkgZGVmaW5lZCBi dXQgbm90IHVzZWQgWy1XdW51c2VkLWZ1bmN0aW9uXQogMjU4OSB8IHN0YXRpYyBpbnQgaXQ2NTA1 X2JyaWRnZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKICAgICAgfCAgICAgICAgICAgIF5+ fn5+fn5+fn5+fn5+fn5+fn5+fgovaG9tZS9zYW0vZHJtL2xpbnV4LmdpdC9kcml2ZXJzL2dwdS9k cm0vYnJpZGdlL2l0ZS1pdDY1MDUuYzoyNTgyOjEyOiB3YXJuaW5nOiDigJhpdDY1MDVfYnJpZGdl X3Jlc3VtZeKAmSBkZWZpbmVkIGJ1dCBub3QgdXNlZCBbLVd1bnVzZWQtZnVuY3Rpb25dCiAyNTgy IHwgc3RhdGljIGludCBpdDY1MDVfYnJpZGdlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiAg ICAgIHwgICAgICAgICAgICBefn5+fn5+fn5+fn5+fn5+fn5+fgoKUGxlYXNlIGZpeC4KCgpQbGVh c2UgdHJ5IHRvIHJ1biBpdCB0aHJvdWdoIGNoZWNrcGF0Y2ggd2l0aCB0aGUgZm9sbG93aW5nIG9w dGlvbnM6Ci4vc2NyaXB0cy9jaGVja3BhdGNoIC1xIC0tZW1hY3MgLS1zdHJpY3QgLS1zaG93LXR5 cGVzIC0tY29kZXNwZWxsCgpEcm9wIGNvZGVzcGVsbCBpZiBpdCBkb2VzIG5vdCB3b3JrIGZvciB5 b3UuCgpDb2Rlc3BlbGwgZGlkIG5vdCBsaWtlIGFmZSAtIHNlZW1zIHRoYXQgaXQgZG9lcyBub3Qg a25vdyB0aGlzIGlzIGEKc2hvcnRoYW5kIGZvciAiYW5hbG9nIGZyb250IGVuZCIuIFRoaXMgaXMg b25lIG9mIHRoZSB3YXJuaW5ncyB0byBpZ25vcmUuCgpUaGVyZSBhcmUgc2V2ZXJhbCB2YWxpZCB3 YXJuaW5ncyB0aGF0IG5lZWRzIGZpeGluZy4gRm9yIGV4YW1wbGUgaW5kZW50LgoKClRoZSBkcml2 ZXIgbmVlZHMgdG8gc3VwcG9ydCAiZmxhZ3MiIGluIGF0dGFjaCB0byBtYWtlIGNvbm5lY3RvciBj cmVhdGlvbgpvcHRpb25hbCAtIHN1cHBvcnQgZm9yIHRoaXMgaXMgbWFuZGF0b3J5IGluIG5ldyBk cml2ZXJzLgoKVGhlIGRyaXZlciBhbHNvIG5lZWRzIHRvIHN1cHBvcnQgcmVsZXZhbnQgYnJpZGdl IG9wZXJhdGlvbnMuCgkuZ2V0X2VkaWQKCS5kZXRlY3QKCm5lZWRzIHRvIGJlIHN1cHBvcnRlZCwg bWF5YmUgbW9yZS4KClNlZSBvdGhlciBicmlkZ2UgZHJpdmVycyAtIG1vc3Qgb2YgdGhlbSBhcmUg Y29udmVydGVkIHRvZGF5LgoKClBsZWFzZSBmaXggc28gd2UgY2FuIGdldCB0aGlzIGRyaXZlciBh cHBsaWVkLgoKCVNhbQoKCgo+ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tjb25maWcgICAgICB8 ICAgIDcgKwo+ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL01ha2VmaWxlICAgICB8ICAgIDEgKwo+ ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY1MDUuYyB8IDI4OTAgKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysKPiAgMyBmaWxlcyBjaGFuZ2VkLCAyODk4IGluc2VydGlv bnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvaXRlLWl0 NjUwNS5jCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvS2NvbmZpZyBi L2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvS2NvbmZpZwo+IGluZGV4IDQzMjcxYzIuLjU5NzUwYjgg MTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9LY29uZmlnCj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL2JyaWRnZS9LY29uZmlnCj4gQEAgLTU3LDYgKzU3LDEzIEBAIGNvbmZpZyBE Uk1fTFZEU19DT0RFQwo+ICAJICBTdXBwb3J0IGZvciB0cmFuc3BhcmVudCBMVkRTIGVuY29kZXJz IGFuZCBkZWNvZGVycyB0aGF0IGRvbid0Cj4gIAkgIHJlcXVpcmUgYW55IGNvbmZpZ3VyYXRpb24u Cj4gIAo+ICtjb25maWcgRFJNX0lURV9JVDY1MDUKPiArCXRyaXN0YXRlICJJVEUgSVQ2NTA1IERQ IGJyaWRnZSIKPiArCWRlcGVuZHMgb24gT0YKPiArCXNlbGVjdCBEUk1fS01TX0hFTFBFUgo+ICsJ aGVscAo+ICsJICBJVEUgSVQ2NTA1IERQIGJyaWRnZSBjaGlwIGRyaXZlci4KPiArCj4gIGNvbmZp ZyBEUk1fTUVHQUNISVBTX1NURFBYWFhYX0dFX0I4NTBWM19GVwo+ICAJdHJpc3RhdGUgIk1lZ2FD aGlwcyBzdGRwNDAyOC1nZS1iODUwdjMtZncgYW5kIHN0ZHAyNjkwLWdlLWI4NTB2My1mdyIKPiAg CWRlcGVuZHMgb24gT0YKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9NYWtl ZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUKPiBpbmRleCBkNjNkNGI3Li44 NjYxOWM3IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUKPiAr KysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL01ha2VmaWxlCj4gQEAgLTMsNiArMyw3IEBAIG9i ai0kKENPTkZJR19EUk1fQ0ROU19EU0kpICs9IGNkbnMtZHNpLm8KPiAgb2JqLSQoQ09ORklHX0RS TV9DSFJPTlRFTF9DSDcwMzMpICs9IGNocm9udGVsLWNoNzAzMy5vCj4gIG9iai0kKENPTkZJR19E Uk1fRElTUExBWV9DT05ORUNUT1IpICs9IGRpc3BsYXktY29ubmVjdG9yLm8KPiAgb2JqLSQoQ09O RklHX0RSTV9MVkRTX0NPREVDKSArPSBsdmRzLWNvZGVjLm8KPiArb2JqLSQoQ09ORklHX0RSTV9J VEVfSVQ2NTA1KSArPSBpdGUtaXQ2NTA1Lm8KPiAgb2JqLSQoQ09ORklHX0RSTV9NRUdBQ0hJUFNf U1REUFhYWFhfR0VfQjg1MFYzX0ZXKSArPSBtZWdhY2hpcHMtc3RkcHh4eHgtZ2UtYjg1MHYzLWZ3 Lm8KPiAgb2JqLSQoQ09ORklHX0RSTV9OWFBfUFROMzQ2MCkgKz0gbnhwLXB0bjM0NjAubwo+ICBv YmotJChDT05GSUdfRFJNX1BBUkFERV9QUzg2MjIpICs9IHBhcmFkZS1wczg2MjIubwo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY1MDUuYyBiL2RyaXZlcnMvZ3B1 L2RybS9icmlkZ2UvaXRlLWl0NjUwNS5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAw MDAwMDAwMC4uMTJhNTZjZAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0v YnJpZGdlL2l0ZS1pdDY1MDUuYwo+IEBAIC0wLDAgKzEsMjg5MCBAQAo+ICsvLyBTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogKEdQTC0yLjAtb25seSBPUiBCU0QtMi1DbGF1c2UpCj4gKy8qCj4gKyAq IENvcHlyaWdodCAoYykgMjAyMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCj4gKyAqLwo+ICsjaW5jbHVkZSA8bGludXgvYml0cy5oPgo+ICsjaW5jbHVkZSA8bGlu dXgvZGVsYXkuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGlu dXgvZXJyLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9leHRjb24uaD4KPiArI2luY2x1ZGUgPGxpbnV4 L2ZzLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+Cj4gKyNpbmNsdWRlIDxs aW51eC9pMmMuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+ICsjaW5jbHVkZSA8 bGludXgva2VybmVsLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiArI2luY2x1ZGUg PGxpbnV4L3BtX3J1bnRpbWUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgo+ICsjaW5j bHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC90eXBl cy5oPgo+ICsjaW5jbHVkZSA8bGludXgvd2FpdC5oPgo+ICsKPiArI2luY2x1ZGUgPGNyeXB0by9o YXNoLmg+Cj4gKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+Cj4gKwo+ICsjaW5jbHVkZSA8ZHJtL2Ry bV9hdG9taWNfaGVscGVyLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2JyaWRnZS5oPgo+ICsjaW5j bHVkZSA8ZHJtL2RybV9jcnRjLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+ Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2RwX2hlbHBlci5oPgo+ICsjaW5jbHVkZSA8ZHJtL2RybV9l ZGlkLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX3ByaW50Lmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJt X3Byb2JlX2hlbHBlci5oPgo+ICsKPiArI2luY2x1ZGUgPHNvdW5kL2hkbWktY29kZWMuaD4KPiAr Cj4gKyNkZWZpbmUgUkVHX0lDX1ZFUiAweDA0Cj4gKwo+ICsjZGVmaW5lIFJFR19SRVNFVF9DVFJM IDB4MDUKPiArI2RlZmluZSBWSURFT19SRVNFVCBCSVQoMCkKPiArI2RlZmluZSBBVURJT19SRVNF VCBCSVQoMSkKPiArI2RlZmluZSBBTExfTE9HSUNfUkVTRVQgQklUKDIpCj4gKyNkZWZpbmUgQVVY X1JFU0VUIEJJVCgzKQo+ICsjZGVmaW5lIEhEQ1BfUkVTRVQgQklUKDQpCj4gKwo+ICsjZGVmaW5l IElOVF9TVEFUVVNfMDEgMHgwNgo+ICsjZGVmaW5lIElOVF9NQVNLXzAxIDB4MDkKPiArI2RlZmlu ZSBJTlRfSFBEX0NIQU5HRSBCSVQoMCkKPiArI2RlZmluZSBJTlRfUkVDRUlWRV9IUERfSVJRIEJJ VCgxKQo+ICsjZGVmaW5lIElOVF9TQ0RUX0NIQU5HRSBCSVQoMikKPiArCj4gKyNkZWZpbmUgSU5U X1NUQVRVU18wMiAweDA3Cj4gKyNkZWZpbmUgSU5UX01BU0tfMDIgMHgwQQo+ICsjZGVmaW5lIElO VF9BVVhfQ01EX0ZBSUwgQklUKDApCj4gKyNkZWZpbmUgSU5UX0FVRElPX0ZJRk9fRVJST1IgQklU KDIpCj4gKwo+ICsjZGVmaW5lIElOVF9TVEFUVVNfMDMgMHgwOAo+ICsjZGVmaW5lIElOVF9NQVNL XzAzIDB4MEIKPiArI2RlZmluZSBJTlRfTElOS19UUkFJTl9GQUlMIEJJVCg0KQo+ICsjZGVmaW5l IElOVF9WSURfRklGT19FUlJPUiBCSVQoNSkKPiArI2RlZmluZSBJTlRfSU9fTEFUQ0hfRklGT19P VkVSRkxPVyBCSVQoNykKPiArCj4gKyNkZWZpbmUgUkVHX1NZU1RFTV9TVFMgMHgwRAo+ICsjZGVm aW5lIElOVF9TVFMgQklUKDApCj4gKyNkZWZpbmUgSFBEX1NUUyBCSVQoMSkKPiArI2RlZmluZSBW SURFT19TVEIgQklUKDIpCj4gKwo+ICsjZGVmaW5lIFJFR19MSU5LX1RSQUlOX1NUUyAweDBFCj4g KyNkZWZpbmUgTElOS19TVEFURV9DUiBCSVQoMikKPiArI2RlZmluZSBMSU5LX1NUQVRFX0VRIEJJ VCgzKQo+ICsjZGVmaW5lIExJTktfU1RBVEVfTk9SUCBCSVQoNCkKPiArCj4gKyNkZWZpbmUgUkVH X0JBTktfU0VMIDB4MEYKPiArI2RlZmluZSBSRUdfQ0xLX0NUUkwwIDB4MTAKPiArI2RlZmluZSBN X1BDTEtfREVMQVkgMHgwMwo+ICsKPiArI2RlZmluZSBSRUdfQVVYX09QVCAweDExCj4gKyNkZWZp bmUgQVVYX0FVVE9fUlNUIEJJVCgwKQo+ICsjZGVmaW5lIEFVWF9GSVhfRlJFUSBCSVQoMykKPiAr Cj4gKyNkZWZpbmUgUkVHX0RBVEFfQ1RSTDAgMHgxMgo+ICsjZGVmaW5lIFZJREVPX0xBVENIX0VE R0UgQklUKDQpCj4gKyNkZWZpbmUgRU5BQkxFX1BDTEtfQ09VTlRFUiBCSVQoNykKPiArCj4gKyNk ZWZpbmUgUkVHX1BDTEtfQ09VTlRFUl9WQUxVRSAweDEzCj4gKwo+ICsjZGVmaW5lIFJFR181MDFf RklGT19DVFJMIDB4MTUKPiArI2RlZmluZSBSU1RfNTAxX0ZJRk8gQklUKDEpCj4gKwo+ICsjZGVm aW5lIFJFR19UUkFJTl9DVFJMMCAweDE2Cj4gKyNkZWZpbmUgRk9SQ0VfTEJSIEJJVCgwKQo+ICsj ZGVmaW5lIExBTkVfQ09VTlRfTUFTSyAweDA2Cj4gKyNkZWZpbmUgTEFORV9TV0FQIEJJVCgzKQo+ ICsjZGVmaW5lIFNQUkVBRF9BTVBfNSBCSVQoNCkKPiArI2RlZmluZSBGT1JDRV9DUl9ET05FIEJJ VCg1KQo+ICsjZGVmaW5lIEZPUkNFX0VRX0RPTkUgQklUKDYpCj4gKwo+ICsjZGVmaW5lIFJFR19U UkFJTl9DVFJMMSAweDE3Cj4gKyNkZWZpbmUgQVVUT19UUkFJTiBCSVQoMCkKPiArI2RlZmluZSBN QU5VQUxfVFJBSU4gQklUKDEpCj4gKyNkZWZpbmUgRk9SQ0VfUkVUUkFJTiBCSVQoMikKPiArCj4g KyNkZWZpbmUgUkVHX0FVWF9DVFJMIDB4MjMKPiArI2RlZmluZSBDTFJfRURJRF9GSUZPIEJJVCgw KQo+ICsjZGVmaW5lIEFVWF9VU0VSX01PREUgQklUKDEpCj4gKyNkZWZpbmUgQVVYX05PX1NFR01F TlRfV1IgQklUKDYpCj4gKyNkZWZpbmUgQVVYX0VOX0ZJRk9fUkVBRCBCSVQoNykKPiArCj4gKyNk ZWZpbmUgUkVHX0FVWF9BRFJfMF83IDB4MjQKPiArI2RlZmluZSBSRUdfQVVYX0FEUl84XzE1IDB4 MjUKPiArI2RlZmluZSBSRUdfQVVYX0FEUl8xNl8xOSAweDI2Cj4gKyNkZWZpbmUgUkVHX0FVWF9P VVRfREFUQTAgMHgyNwo+ICsKPiArI2RlZmluZSBSRUdfQVVYX0NNRF9SRVEgMHgyQgo+ICsjZGVm aW5lIEFVWF9CVVNZIEJJVCg1KQo+ICsKPiArI2RlZmluZSBSRUdfQVVYX0RBVEFfMF83IDB4MkMK PiArI2RlZmluZSBSRUdfQVVYX0RBVEFfOF8xNSAweDJECj4gKyNkZWZpbmUgUkVHX0FVWF9EQVRB XzE2XzIzIDB4MkUKPiArI2RlZmluZSBSRUdfQVVYX0RBVEFfMjRfMzEgMHgyRgo+ICsKPiArI2Rl ZmluZSBSRUdfQVVYX0RBVEFfRklGTyAweDJGCj4gKwo+ICsjZGVmaW5lIFJFR19BVVhfRVJST1Jf U1RTIDB4OUYKPiArI2RlZmluZSBNX0FVWF9SRVFfRkFJTCAweDAzCj4gKwo+ICsjZGVmaW5lIFJF R19IRENQX0NUUkwxIDB4MzgKPiArI2RlZmluZSBIRENQX0NQX0VOQUJMRSBCSVQoMCkKPiArCj4g KyNkZWZpbmUgUkVHX0hEQ1BfQ1RSTDIgMHgzQQo+ICsjZGVmaW5lIEhEQ1BfQU5fU0VMIEJJVCgw KQo+ICsjZGVmaW5lIEhEQ1BfSFdfSFBESVJRX0FDVCBCSVQoMikKPiArCj4gKyNkZWZpbmUgUkVH X00wXzBfNyAweDRDCj4gKyNkZWZpbmUgUkVHX0FOXzBfNyAweDRDCj4gKyNkZWZpbmUgUkVHX1NQ X0NUUkwwIDB4NTgKPiArI2RlZmluZSBSRUdfSVBfQ1RSTDEgMHg1OQo+ICsjZGVmaW5lIFJFR19J UF9DVFJMMiAweDVBCj4gKwo+ICsjZGVmaW5lIFJFR19MSU5LX0RSViAweDVDCj4gKyNkZWZpbmUg RFJWX0hTIEJJVCgxKQo+ICsKPiArI2RlZmluZSBSRUdfRFJWX0xOX0RBVEFfU0VMIDB4NUQKPiAr Cj4gKyNkZWZpbmUgUkVHX0FVWCAweDVFCj4gKwo+ICsjZGVmaW5lIFJFR19WSURfQlVTX0NUUkww IDB4NjAKPiArI2RlZmluZSBJTl9ERFIgQklUKDIpCj4gKyNkZWZpbmUgRERSX0NEICgweDAxIDw8 IDYpCj4gKwo+ICsjZGVmaW5lIFJFR19WSURfQlVTX0NUUkwxIDB4NjEKPiArI2RlZmluZSBUWF9G SUZPX1JFU0VUIEJJVCgxKQo+ICsKPiArI2RlZmluZSBSRUdfSU5QVVRfQ1RSTCAweEEwCj4gKyNk ZWZpbmUgSU5QVVRfSFNZTkNfUE9MIEJJVCgwKQo+ICsjZGVmaW5lIElOUFVUX1ZTWU5DX1BPTCBC SVQoMikKPiArI2RlZmluZSBJTlBVVF9JTlRFUkxBQ0VEIEJJVCg0KQo+ICsKPiArI2RlZmluZSBS RUdfSU5QVVRfSFRPVEFMIDB4QTEKPiArI2RlZmluZSBSRUdfSU5QVVRfSEFDVElWRV9TVEFSVCAw eEEzCj4gKyNkZWZpbmUgUkVHX0lOUFVUX0hBQ1RJVkVfV0lEVEggMHhBNQo+ICsjZGVmaW5lIFJF R19JTlBVVF9IRlJPTlRfUE9SQ0ggMHhBNwo+ICsjZGVmaW5lIFJFR19JTlBVVF9IU1lOQ19XSURU SCAweEE5Cj4gKyNkZWZpbmUgUkVHX0lOUFVUX1ZUT1RBTCAweEFCCj4gKyNkZWZpbmUgUkVHX0lO UFVUX1ZBQ1RJVkVfU1RBUlQgMHhBRAo+ICsjZGVmaW5lIFJFR19JTlBVVF9WQUNUSVZFX1dJRFRI IDB4QUYKPiArI2RlZmluZSBSRUdfSU5QVVRfVkZST05UX1BPUkNIIDB4QjEKPiArI2RlZmluZSBS RUdfSU5QVVRfVlNZTkNfV0lEVEggMHhCMwo+ICsKPiArI2RlZmluZSBSRUdfQVVESU9fU1JDX0NU UkwgMHhCOAo+ICsjZGVmaW5lIE1fQVVESU9fSTJTX0VOIDB4MEYKPiArI2RlZmluZSBFTl9JMlMw IEJJVCgwKQo+ICsjZGVmaW5lIEVOX0kyUzEgQklUKDEpCj4gKyNkZWZpbmUgRU5fSTJTMiBCSVQo MikKPiArI2RlZmluZSBFTl9JMlMzIEJJVCgzKQo+ICsjZGVmaW5lIEFVRElPX0ZJRk9fUkVTRVQg QklUKDcpCj4gKwo+ICsjZGVmaW5lIFJFR19BVURJT19GTVQgMHhCOQo+ICsjZGVmaW5lIFJFR19B VURJT19GSUZPX1NFTCAweEJBCj4gKwo+ICsjZGVmaW5lIFJFR19BVURJT19DVFJMMCAweEJCCj4g KyNkZWZpbmUgQVVESU9fRlVMTF9QS1QgQklUKDQpCj4gKyNkZWZpbmUgQVVESU9fMTZCX0JPVU5E IEJJVCg1KQo+ICsKPiArI2RlZmluZSBSRUdfQVVESU9fQ1RSTDEgMHhCQwo+ICsjZGVmaW5lIFJF R19BVURJT19JTlBVVF9GUkVRIDB4QkUKPiArCj4gKyNkZWZpbmUgUkVHX0lFQzk1OF9TVFMwIDB4 QkYKPiArI2RlZmluZSBSRUdfSUVDOTU4X1NUUzEgMHhDMAo+ICsjZGVmaW5lIFJFR19JRUM5NThf U1RTMiAweEMxCj4gKyNkZWZpbmUgUkVHX0lFQzk1OF9TVFMzIDB4QzIKPiArI2RlZmluZSBSRUdf SUVDOTU4X1NUUzQgMHhDMwo+ICsKPiArI2RlZmluZSBSRUdfSFBEX0lSUV9USU1FIDB4QzkKPiAr I2RlZmluZSBSRUdfQVVYX0RFQlVHX01PREUgMHhDQQo+ICsjZGVmaW5lIFJFR19BVVhfT1BUMiAw eENCCj4gKyNkZWZpbmUgUkVHX0hEQ1BfT1BUIDB4Q0UKPiArCj4gKyNkZWZpbmUgUkVHX0RBVEFf TVVURV9DVFJMIDB4RDMKPiArI2RlZmluZSBFTkFCTEVfRU5IQU5DRURfRlJBTUUgQklUKDApCj4g KyNkZWZpbmUgRU5BQkxFX0FVVE9fVklERU9fRklGT19SRVNFVCBCSVQoMSkKPiArI2RlZmluZSBF Tl9WSURfTVVURSBCSVQoNCkKPiArI2RlZmluZSBFTl9BVURfTVVURSBCSVQoNSkKPiArCj4gKyNk ZWZpbmUgUkVHX1RJTUVfU1RNUF9DVFJMIDB4RDQKPiArI2RlZmluZSBFTl9FTkhBTkNFX1ZJRF9T VE1QIEJJVCgwKQo+ICsjZGVmaW5lIEVOX0VOSEFOQ0VfQVVEX1NUTVAgQklUKDIpCj4gKyNkZWZp bmUgTV9TVEFNUF9TVEVQIDB4MzAKPiArI2RlZmluZSBFTl9TU0NfR0FUIEJJVCg2KQo+ICsKPiAr I2RlZmluZSBSRUdfSU5GT0ZSQU1FX0NUUkwgMHhFOAo+ICsjZGVmaW5lIEVOX0FWSV9QS1QgQklU KDApCj4gKyNkZWZpbmUgRU5fQVVEX1BLVCBCSVQoMSkKPiArI2RlZmluZSBFTl9NUEdfUEtUIEJJ VCgyKQo+ICsjZGVmaW5lIEVOX0dFTl9QS1QgQklUKDMpCj4gKyNkZWZpbmUgRU5fVklEX1RJTUVf U1RNUCBCSVQoNCkKPiArI2RlZmluZSBFTl9BVURfVElNRV9TVE1QIEJJVCg1KQo+ICsjZGVmaW5l IEVOX1ZJRF9DVFJMX1BLVCAoRU5fQVZJX1BLVCB8IEVOX1ZJRF9USU1FX1NUTVApCj4gKyNkZWZp bmUgRU5fQVVEX0NUUkxfUEtUIChFTl9BVURfUEtUIHwgRU5fQVVEX1RJTUVfU1RNUCkKPiArCj4g KyNkZWZpbmUgUkVHX0FVRElPX05fMF83IDB4REUKPiArI2RlZmluZSBSRUdfQVVESU9fTl84XzE1 IDB4REYKPiArI2RlZmluZSBSRUdfQVVESU9fTl8xNl8yMyAweEUwCj4gKwo+ICsjZGVmaW5lIFJF R19BVklfSU5GT19EQjEgMHhFOQo+ICsjZGVmaW5lIFJFR19BVklfSU5GT19EQjIgMHhFQQo+ICsj ZGVmaW5lIFJFR19BVklfSU5GT19EQjMgMHhFQgo+ICsjZGVmaW5lIFJFR19BVklfSU5GT19EQjQg MHhFQwo+ICsjZGVmaW5lIFJFR19BVklfSU5GT19EQjUgMHhFRAo+ICsjZGVmaW5lIFJFR19BVklf SU5GT19TVU0gMHhGNgo+ICsKPiArI2RlZmluZSBSRUdfQVVEX0lORk9GUkFNX0RCMSAweEY3Cj4g KyNkZWZpbmUgUkVHX0FVRF9JTkZPRlJBTV9EQjIgMHhGOAo+ICsjZGVmaW5lIFJFR19BVURfSU5G T0ZSQU1fREIzIDB4RjkKPiArI2RlZmluZSBSRUdfQVVEX0lORk9GUkFNX0RCNCAweEZBCj4gKyNk ZWZpbmUgUkVHX0FVRF9JTkZPRlJBTV9TVU0gMHhGQgo+ICsKPiArLyogdGhlIGZvbGxvd2luZyBz aXggcmVnaXN0ZXJzIGFyZSBpbiBiYW5rMSAqLwo+ICsjZGVmaW5lIFJFR19EUlZfMF9EQl84MDBf TVYgMHg3RQo+ICsjZGVmaW5lIFJFR19QUkVfMF9EQl84MDBfTVYgMHg3Rgo+ICsjZGVmaW5lIFJF R19QUkVfM1A1X0RCXzgwMF9NViAweDgxCj4gKyNkZWZpbmUgUkVHX1NTQ19DVFJMMCAweDg4Cj4g KyNkZWZpbmUgUkVHX1NTQ19DVFJMMSAweDg5Cj4gKyNkZWZpbmUgUkVHX1NTQ19DVFJMMiAweDhB Cj4gKwo+ICsjZGVmaW5lIFJCUiBEUF9MSU5LX0JXXzFfNjIKPiArI2RlZmluZSBIQlIgRFBfTElO S19CV18yXzcKPiArI2RlZmluZSBIQlIyIERQX0xJTktfQldfNV80Cj4gKyNkZWZpbmUgSEJSMyBE UF9MSU5LX0JXXzhfMQo+ICsKPiArLyogVmVuZG9yIG9wdGlvbiAqLwo+ICsjZGVmaW5lIE1BWF9M QU5FX0NPVU5UIDQKPiArI2RlZmluZSBNQVhfTElOS19SQVRFIEhCUgo+ICsjZGVmaW5lIEFVVE9f VFJBSU5fUkVUUlkgMwo+ICsjZGVmaW5lIE1BWF9DUl9MRVZFTCAweDAzCj4gKyNkZWZpbmUgTUFY X0VRX0xFVkVMIDB4MDMKPiArI2RlZmluZSBBVVhfV0FJVF9USU1FT1VUX01TIDE1Cj4gKyNkZWZp bmUgQVVYX0ZJRk9fTUFYX1NJWkUgMzIKPiArI2RlZmluZSBQSVhFTF9DTEtfREVMQVkgMQo+ICsj ZGVmaW5lIFBJWEVMX0NMS19JTlZFUlNFIDAKPiArI2RlZmluZSBBREpVU1RfUEhBU0VfVEhSRVNI T0xEIDgwMDAwCj4gKyNkZWZpbmUgRFBJX1BJWEVMX0NMS19NQVggOTUwMDAKPiArI2RlZmluZSBE RUZBVUxUX1BXUl9PTiAwCj4gKyNkZWZpbmUgREVGQVVMVF9EUlZfSE9MRCAwCj4gKwo+ICsjZGVm aW5lIEFVRElPX1NFTEVDVCBJMlMKPiArI2RlZmluZSBBVURJT19UWVBFIExQQ00KPiArI2RlZmlu ZSBBVURJT19TQU1QTEVfUkFURSBTQU1QTEVfUkFURV80OEsKPiArI2RlZmluZSBBVURJT19DSEFO TkVMX0NPVU5UIDIKPiArCj4gKy8qCj4gKyAqIDA6IFN0YW5kYXJkIEkyUwo+ICsgKiAxOiAzMmJp dCBJMlMKPiArICovCj4gKyNkZWZpbmUgSTJTX0lOUFVUX0ZPUk1BVCAxCj4gKwo+ICsvKgo+ICsg KiAwOiBMZWZ0LWp1c3RpZmllZAo+ICsgKiAxOiBSaWdodC1qdXN0aWZpZWQKPiArICovCj4gKyNk ZWZpbmUgSTJTX0pVU1RJRklFRCAwCj4gKwo+ICsvKgo+ICsgKiAwOiBEYXRhIGRlbGF5IDFUIGNv cnJlc3BvbmQgdG8gV1MKPiArICogMTogTm8gZGF0YSBkZWxheSBjb3JyZXNwb25kIHRvIFdTCj4g KyAqLwo+ICsjZGVmaW5lIEkyU19EQVRBX0RFTEFZIDAKPiArCj4gKy8qCj4gKyAqIDA6IExlZnQg Y2hhbm5lbAo+ICsgKiAxOiBSaWdodCBjaGFubmVsCj4gKyAqLwo+ICsjZGVmaW5lIEkyU19XU19D SEFOTkVMIDAKPiArCj4gKy8qCj4gKyAqIDA6IE1TQiBzaGlmdCBmaXJzdAo+ICsgKiAxOiBMU0Ig c2hpZnQgZmlyc3QKPiArICovCj4gKyNkZWZpbmUgSTJTX0RBVEFfU0VRVUVOQ0UgMAo+ICsKPiAr LyoKPiArICogQXVkaW8gU2FtcGxlIFdvcmQgTGVuZ3RoCj4gKyAqIFdPUkRfTEVOR1RIXzE2QklU Cj4gKyAqIFdPUkRfTEVOR1RIXzE4QklUCj4gKyAqIFdPUkRfTEVOR1RIXzIwQklUCj4gKyAqIFdP UkRfTEVOR1RIXzI0QklUCj4gKyAqLwo+ICsjZGVmaW5lIEFVRElPX1dPUkRfTEVOR1RIIFdPUkRf TEVOR1RIXzI0QklUCj4gKwo+ICtlbnVtIGF1eF9jbWRfdHlwZSB7Cj4gKwlDTURfQVVYX05BVElW RV9SRUFEID0gMHgwLAo+ICsJQ01EX0FVWF9OQVRJVkVfV1JJVEUgPSAweDUsCj4gKwlDTURfQVVY X0kyQ19FRElEX1JFQUQgPSAweEIsCj4gK307Cj4gKwo+ICtlbnVtIGF1eF9jbWRfcmVwbHkgewo+ ICsJUkVQTFlfQUNLLAo+ICsJUkVQTFlfTkFDSywKPiArCVJFUExZX0RFRkVSLAo+ICt9Owo+ICsK PiArZW51bSBsaW5rX3RyYWluX3N0YXR1cyB7Cj4gKwlMSU5LX0lETEUsCj4gKwlMSU5LX0JVU1ks Cj4gKwlMSU5LX09LLAo+ICt9Owo+ICsKPiArZW51bSBtYXhfdmFsdWVfY2hlY2sgewo+ICsJVk9M VEFHRV9TV0lORywKPiArCVBSRV9FTVBIQVNJUywKPiArfTsKPiArCj4gK3N0cnVjdCBpdDY1MDVf cGxhdGZvcm1fZGF0YSB7Cj4gKwlzdHJ1Y3QgcmVndWxhdG9yICpwd3IxODsKPiArCXN0cnVjdCBy ZWd1bGF0b3IgKm92ZGQ7Cj4gKwlzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvZF9yZXNldDsKPiArfTsK PiArCj4gK2VudW0gaXQ2NTA1X2F1ZGlvX3NlbGVjdCB7Cj4gKwlJMlMgPSAwLAo+ICsJU1BESUYs Cj4gK307Cj4gKwo+ICtlbnVtIGl0NjUwNV9hdWRpb19zYW1wbGVfcmF0ZSB7Cj4gKwlTQU1QTEVf UkFURV8yNEsgPSAweDYsCj4gKwlTQU1QTEVfUkFURV8zMksgPSAweDMsCj4gKwlTQU1QTEVfUkFU RV80OEsgPSAweDIsCj4gKwlTQU1QTEVfUkFURV85NksgPSAweEEsCj4gKwlTQU1QTEVfUkFURV8x OTJLID0gMHhFLAo+ICsJU0FNUExFX1JBVEVfNDRfMUsgPSAweDAsCj4gKwlTQU1QTEVfUkFURV84 OF8ySyA9IDB4OCwKPiArCVNBTVBMRV9SQVRFXzE3Nl80SyA9IDB4QywKPiArfTsKPiArCj4gK2Vu dW0gaXQ2NTA1X2F1ZGlvX3R5cGUgewo+ICsJTFBDTSA9IDAsCj4gKwlOTFBDTSwKPiArCURTUywK PiArfTsKPiArCj4gK2VudW0gaXQ2NTA1X2F1ZGlvX3dvcmRfbGVuZ3RoIHsKPiArCVdPUkRfTEVO R1RIXzE2QklUID0gMCwKPiArCVdPUkRfTEVOR1RIXzE4QklULAo+ICsJV09SRF9MRU5HVEhfMjBC SVQsCj4gKwlXT1JEX0xFTkdUSF8yNEJJVCwKPiArfTsKPiArCj4gK3N0cnVjdCBpdDY1MDVfYXVk aW9fZGF0YSB7Cj4gKwllbnVtIGl0NjUwNV9hdWRpb19zZWxlY3Qgc2VsZWN0Owo+ICsJZW51bSBp dDY1MDVfYXVkaW9fc2FtcGxlX3JhdGUgc2FtcGxlX3JhdGU7Cj4gKwllbnVtIGl0NjUwNV9hdWRp b190eXBlIHR5cGU7Cj4gKwllbnVtIGl0NjUwNV9hdWRpb193b3JkX2xlbmd0aCB3b3JkX2xlbmd0 aDsKPiArCXU4IGNoYW5uZWxfY291bnQ7Cj4gKwl1OCBpMnNfaW5wdXRfZm9ybWF0Owo+ICsJdTgg aTJzX2p1c3RpZmllZDsKPiArCXU4IGkyc19kYXRhX2RlbGF5Owo+ICsJdTggaTJzX3dzX2NoYW5u ZWw7Cj4gKwl1OCBpMnNfZGF0YV9zZXF1ZW5jZTsKPiArfTsKPiArCj4gK3N0cnVjdCBpdDY1MDVf YXVkaW9fc2FtcGxlX3JhdGVfbWFwIHsKPiArCWVudW0gaXQ2NTA1X2F1ZGlvX3NhbXBsZV9yYXRl IHJhdGU7Cj4gKwlpbnQgc2FtcGxlX3JhdGVfdmFsdWU7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgaXQ2 NTA1X2RybV9kcF9saW5rIHsKPiArCXVuc2lnbmVkIGNoYXIgcmV2aXNpb247Cj4gKwl1bnNpZ25l ZCBpbnQgcmF0ZTsKPiArCXVuc2lnbmVkIGludCBudW1fbGFuZXM7Cj4gKwl1bnNpZ25lZCBsb25n IGNhcGFiaWxpdGllczsKPiArfTsKPiArCj4gK3N0cnVjdCBpdDY1MDUgewo+ICsJc3RydWN0IGRy bV9kcF9hdXggYXV4Owo+ICsJc3RydWN0IGRybV9icmlkZ2UgYnJpZGdlOwo+ICsJc3RydWN0IGky Y19jbGllbnQgKmNsaWVudDsKPiArCXN0cnVjdCBlZGlkICplZGlkOwo+ICsJc3RydWN0IGRybV9j b25uZWN0b3IgY29ubmVjdG9yOwo+ICsJc3RydWN0IGl0NjUwNV9kcm1fZHBfbGluayBsaW5rOwo+ ICsJc3RydWN0IGl0NjUwNV9wbGF0Zm9ybV9kYXRhIHBkYXRhOwo+ICsJc3RydWN0IG11dGV4IGV4 dGNvbl9sb2NrOwo+ICsJc3RydWN0IG11dGV4IG1vZGVfbG9jazsKPiArCXN0cnVjdCBtdXRleCBh dXhfbG9jazsKPiArCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKPiArCXN0cnVjdCBkcm1fZGlzcGxh eV9tb2RlIHZpZGVvX2luZm87Cj4gKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZXZlbnRfbmI7Cj4g KwlzdHJ1Y3QgZXh0Y29uX2RldiAqZXh0Y29uOwo+ICsJc3RydWN0IHdvcmtfc3RydWN0IGV4dGNv bl93cTsKPiArCWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgY29ubmVjdG9yX3N0YXR1czsKPiAr CWludCByZXZpc2lvbjsKPiArCWVudW0gbGlua190cmFpbl9zdGF0dXMgbGlua19zdGF0ZTsKPiAr CXN0cnVjdCB3b3JrX3N0cnVjdCBsaW5rX3dvcmtzOwo+ICsJdTggZHBjZFtEUF9SRUNFSVZFUl9D QVBfU0laRV07Cj4gKwl1OCBsYW5lX2NvdW50Owo+ICsJdTggbGlua19yYXRlX2J3X2NvZGU7Cj4g Kwl1OCBzaW5rX2NvdW50Owo+ICsJYm9vbCBzdGVwX3RyYWluOwo+ICsJYm9vbCBicmFuY2hfZGV2 aWNlOwo+ICsJYm9vbCBlbmFibGVfc3NjOwo+ICsJYm9vbCBsYW5lX3N3YXBfZGlzYWJsZWQ7Cj4g Kwlib29sIGxhbmVfc3dhcDsKPiArCWJvb2wgcG93ZXJlZDsKPiArCXUzMiBhZmVfc2V0dGluZzsK PiArCXN0cnVjdCBjb21wbGV0aW9uIHdhaXRfZWRpZF9jb21wbGV0ZTsKPiArCXU4IGF1dG9fdHJh aW5fcmV0cnk7Cj4gKwlib29sIGlzX3JlcGVhdGVyOwo+ICsJYm9vbCBlbmFibGVfZW5oYW5jZWRf ZnJhbWU7Cj4gKwloZG1pX2NvZGVjX3BsdWdnZWRfY2IgcGx1Z2dlZF9jYjsKPiArCXN0cnVjdCBk ZXZpY2UgKmNvZGVjX2RldjsKPiArCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF9hdWRpbzsK PiArCWJvb2wgZW5hYmxlX2F1ZGlvOwo+ICsJc3RydWN0IGl0NjUwNV9hdWRpb19kYXRhIGF1ZGlv Owo+ICsKPiArCS8qIGl0NjUwNSBkcml2ZXIgaG9sZCBvcHRpb24gKi8KPiArCWJvb2wgZW5hYmxl X2Rydl9ob2xkOwo+ICt9Owo+ICsKPiArc3RydWN0IGl0NjUwNV9zdGVwX3RyYWluX3BhcmEgewo+ ICsJdTggdm9sdGFnZV9zd2luZ1tNQVhfTEFORV9DT1VOVF07Cj4gKwl1OCBwcmVfZW1waGFzaXNb TUFYX0xBTkVfQ09VTlRdOwo+ICt9Owo+ICsKPiArLyoKPiArICogVmVuZG9yIG9wdGlvbiBhZmUg c2V0dGluZ3MgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMKPiArICogMDogZm9yIGJpdGxhbmQgMTBl LCBxdWFudGEgemRlCj4gKyAqIDE6IGZvciBnb29nbGUga3VrdWkgcDEvcDIsIGh1YXFpbiBrcmFu ZQo+ICsgKi8KPiArCj4gK3N0YXRpYyB1OCBjb25zdCBhZmVfc2V0dGluZ190YWJsZVtdWzNdID0g ewo+ICsJezB4ODIsIDB4MDAsIDB4QTZ9LAo+ICsJezB4OTMsIDB4MkEsIDB4ODV9Cj4gK307Cj4g Kwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGl0NjUwNV9hdWRpb19zYW1wbGVfcmF0ZV9tYXAgYXVk aW9fc2FtcGxlX3JhdGVfbWFwW10gPSB7Cj4gKwl7U0FNUExFX1JBVEVfMjRLLCAyNDAwMH0sCj4g Kwl7U0FNUExFX1JBVEVfMzJLLCAzMjAwMH0sCj4gKwl7U0FNUExFX1JBVEVfNDhLLCA0ODAwMH0s Cj4gKwl7U0FNUExFX1JBVEVfOTZLLCA5NjAwMH0sCj4gKwl7U0FNUExFX1JBVEVfMTkySywgMTky MDAwfSwKPiArCXtTQU1QTEVfUkFURV80NF8xSywgNDQxMDB9LAo+ICsJe1NBTVBMRV9SQVRFXzg4 XzJLLCA4ODIwMH0sCj4gKwl7U0FNUExFX1JBVEVfMTc2XzRLLCAxNzY0MDB9LAo+ICt9Owo+ICsK PiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfcmFuZ2UgaXQ2NTA1X2JyaWRnZV92b2xhdGls ZV9yYW5nZXNbXSA9IHsKPiArCXsgLnJhbmdlX21pbiA9IDAsIC5yYW5nZV9tYXggPSAweEZGIH0s Cj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaXQ2 NTA1X2JyaWRnZV92b2xhdGlsZV90YWJsZSA9IHsKPiArCS55ZXNfcmFuZ2VzID0gaXQ2NTA1X2Jy aWRnZV92b2xhdGlsZV9yYW5nZXMsCj4gKwkubl95ZXNfcmFuZ2VzID0gQVJSQVlfU0laRShpdDY1 MDVfYnJpZGdlX3ZvbGF0aWxlX3JhbmdlcyksCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IHJlZ21hcF9jb25maWcgaXQ2NTA1X3JlZ21hcF9jb25maWcgPSB7Cj4gKwkucmVnX2JpdHMg PSA4LAo+ICsJLnZhbF9iaXRzID0gOCwKPiArCS52b2xhdGlsZV90YWJsZSA9ICZpdDY1MDVfYnJp ZGdlX3ZvbGF0aWxlX3RhYmxlLAo+ICsJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9OT05FLAo+ICt9 Owo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfcmVhZChzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVu c2lnbmVkIGludCByZWdfYWRkcikKPiArewo+ICsJdW5zaWduZWQgaW50IHZhbHVlOwo+ICsJaW50 IGVycjsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsK PiArCWVyciA9IHJlZ21hcF9yZWFkKGl0NjUwNS0+cmVnbWFwLCByZWdfYWRkciwgJnZhbHVlKTsK PiArCWlmIChlcnIgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJyZWFkIGZhaWxlZCBy ZWdbMHgleF0gZXJyOiAlZCIsIHJlZ19hZGRyLAo+ICsJCQkgICAgICBlcnIpOwo+ICsJCXJldHVy biBlcnI7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHZhbHVlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IGl0NjUwNV93cml0ZShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVuc2lnbmVkIGludCByZWdfYWRk ciwKPiArCQkgICAgICB1bnNpZ25lZCBpbnQgcmVnX3ZhbCkKPiArewo+ICsJaW50IGVycjsKPiAr CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsKPiArCWVyciA9 IHJlZ21hcF93cml0ZShpdDY1MDUtPnJlZ21hcCwgcmVnX2FkZHIsIHJlZ192YWwpOwo+ICsKPiAr CWlmIChlcnIgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJ3cml0ZSBmYWlsZWQgcmVn WzB4JXhdID0gMHgleCBlcnIgPSAlZCIsCj4gKwkJCSAgICAgIHJlZ19hZGRyLCByZWdfdmFsLCBl cnIpOwo+ICsJCXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgaXQ2NTA1X3NldF9iaXRzKHN0cnVjdCBpdDY1MDUgKml0NjUwNSwgdW5zaWdu ZWQgaW50IHJlZywKPiArCQkJIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsdWUp Cj4gK3sKPiArCWludCBlcnI7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGll bnQtPmRldjsKPiArCj4gKwllcnIgPSByZWdtYXBfdXBkYXRlX2JpdHMoaXQ2NTA1LT5yZWdtYXAs IHJlZywgbWFzaywgdmFsdWUpOwo+ICsJaWYgKGVyciA8IDApIHsKPiArCQlEUk1fREVWX0VSUk9S KAo+ICsJCQlkZXYsICJ3cml0ZSByZWdbMHgleF0gPSAweCV4IG1hc2sgPSAweCV4IGZhaWxlZCBl cnIgJWQiLAo+ICsJCQlyZWcsIHZhbHVlLCBtYXNrLCBlcnIpOwo+ICsJCXJldHVybiBlcnI7Cj4g Kwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaXQ2NTA1X2RwY2Rf cmVhZChzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQo+ICt7Cj4g Kwl1OCB2YWx1ZTsKPiArCWludCByZXQ7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1 LT5jbGllbnQtPmRldjsKPiArCj4gKwlyZXQgPSBkcm1fZHBfZHBjZF9yZWFkYigmaXQ2NTA1LT5h dXgsIG9mZnNldCwgJnZhbHVlKTsKPiArCWlmIChyZXQgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJP UihkZXYsICJEUENEIHJlYWQgZmFpbGVkIFsweCVseF0gcmV0OiAlZCIsIG9mZnNldCwKPiArCQkJ ICAgICAgcmV0KTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsJcmV0dXJuIHZhbHVlOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IGl0NjUwNV9kcGNkX3dyaXRlKHN0cnVjdCBpdDY1MDUgKml0NjUw NSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCj4gKwkJCSAgICAgdW5zaWduZWQgbG9uZyBkYXRhaW4p Cj4gK3sKPiArCWludCByZXQ7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGll bnQtPmRldjsKPiArCj4gKwlyZXQgPSBkcm1fZHBfZHBjZF93cml0ZWIoJml0NjUwNS0+YXV4LCBv ZmZzZXQsIGRhdGFpbik7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCURSTV9ERVZfRVJST1IoZGV2 LCAiRFBDRCB3cml0ZSBmYWlsZWQgWzB4JWx4XSByZXQ6ICVkIiwgb2Zmc2V0LAo+ICsJCQkgICAg ICByZXQpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiAr c3RhdGljIGludCBpdDY1MDVfZ2V0X2RwY2Qoc3RydWN0IGl0NjUwNSAqaXQ2NTA1LCBpbnQgb2Zm c2V0LCB1OCAqZHBjZCwgaW50IG51bSkKPiArewo+ICsJaW50IHJldDsKPiArCXN0cnVjdCBkZXZp Y2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsKPiArCXJldCA9IGRybV9kcF9kcGNk X3JlYWQoJml0NjUwNS0+YXV4LCBvZmZzZXQsIGRwY2QsIG51bSk7Cj4gKwo+ICsJaWYgKHJldCA8 IDApCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJy ZXQgPSAlZCBEUENEWzB4JXhdID0gMHglKnBoIiwgcmV0LCBvZmZzZXQsCj4gKwkJCSAgICAgbnVt LCBkcGNkKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1 X2R1bXAoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwl1bnNpZ25lZCBpbnQgaSwgajsK PiArCXU4IHJlZ3NbMTZdOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUwNS0+Y2xpZW50 LT5kZXY7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8PSAweGZmOyBpICs9IDE2KSB7Cj4gKwkJZm9y IChqID0gMDsgaiA8IDE2OyBqKyspCj4gKwkJCXJlZ3Nbal0gPSBpdDY1MDVfcmVhZChpdDY1MDUs IGkgKyBqKTsKPiArCj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiWzB4JTAyeF0gPSAl MTZwaCIsIGksIHJlZ3MpOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgYm9vbCBpdDY1MDVfZ2V0 X3NpbmtfaHBkX3N0YXR1cyhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWludCByZWdf MGQ7Cj4gKwo+ICsJcmVnXzBkID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBSRUdfU1lTVEVNX1NUUyk7 Cj4gKwo+ICsJaWYgKHJlZ18wZCA8IDApCj4gKwkJcmV0dXJuIGZhbHNlOwo+ICsKPiArCXJldHVy biAocmVnXzBkICYgSFBEX1NUUykgPyB0cnVlIDogZmFsc2U7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgaXQ2NTA1X3JlYWRfd29yZChzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVuc2lnbmVkIGludCBy ZWcpCj4gK3sKPiArCWludCB2YWwwLCB2YWwxOwo+ICsKPiArCXZhbDAgPSBpdDY1MDVfcmVhZChp dDY1MDUsIHJlZyk7Cj4gKwlpZiAodmFsMCA8IDApCj4gKwkJcmV0dXJuIHZhbDA7Cj4gKwo+ICsJ dmFsMSA9IGl0NjUwNV9yZWFkKGl0NjUwNSwgcmVnICsgMSk7Cj4gKwlpZiAodmFsMSA8IDApCj4g KwkJcmV0dXJuIHZhbDE7Cj4gKwo+ICsJcmV0dXJuICh2YWwxIDw8IDgpIHwgdmFsMDsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2NhbGNfdmlkZW9faW5mbyhzdHJ1Y3QgaXQ2NTA1ICpp dDY1MDUpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2 Owo+ICsJaW50IGhzeW5jX3BvbCwgdnN5bmNfcG9sLCBpbnRlcmxhY2VkOwo+ICsJaW50IGh0b3Rh bCwgaGRlcywgaGRldywgaGZwaCwgaHN5bmN3Owo+ICsJaW50IHZ0b3RhbCwgdmRlcywgdmRldywg dmZwaCwgdnN5bmN3Owo+ICsJaW50IHJkZGF0YSwgaSwgcGNsaywgc3VtOwo+ICsKPiArCXVzbGVl cF9yYW5nZSgxMDAwMCwgMTUwMDApOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0JBTktf U0VMLCAweDAwKTsKPiArCXJkZGF0YSA9IGl0NjUwNV9yZWFkKGl0NjUwNSwgUkVHX0lOUFVUX0NU UkwpOwo+ICsJaHN5bmNfcG9sID0gcmRkYXRhICYgSU5QVVRfSFNZTkNfUE9MOwo+ICsJdnN5bmNf cG9sID0gKHJkZGF0YSAmIElOUFVUX1ZTWU5DX1BPTCkgPj4gMjsKPiArCWludGVybGFjZWQgPSAo cmRkYXRhICYgSU5QVVRfSU5URVJMQUNFRCkgPj4gNDsKPiArCj4gKwlodG90YWwgPSBpdDY1MDVf cmVhZF93b3JkKGl0NjUwNSwgUkVHX0lOUFVUX0hUT1RBTCkgJiAweDFGRkY7Cj4gKwloZGVzID0g aXQ2NTA1X3JlYWRfd29yZChpdDY1MDUsIFJFR19JTlBVVF9IQUNUSVZFX1NUQVJUKSAmIDB4MUZG RjsKPiArCWhkZXcgPSBpdDY1MDVfcmVhZF93b3JkKGl0NjUwNSwgUkVHX0lOUFVUX0hBQ1RJVkVf V0lEVEgpICYgMHgxRkZGOwo+ICsJaGZwaCA9IGl0NjUwNV9yZWFkX3dvcmQoaXQ2NTA1LCBSRUdf SU5QVVRfSEZST05UX1BPUkNIKSAmIDB4MUZGRjsKPiArCWhzeW5jdyA9IGl0NjUwNV9yZWFkX3dv cmQoaXQ2NTA1LCBSRUdfSU5QVVRfSFNZTkNfV0lEVEgpICYgMHgxRkZGOwo+ICsKPiArCXZ0b3Rh bCA9IGl0NjUwNV9yZWFkX3dvcmQoaXQ2NTA1LCBSRUdfSU5QVVRfVlRPVEFMKSAmIDB4RkZGOwo+ ICsJdmRlcyA9IGl0NjUwNV9yZWFkX3dvcmQoaXQ2NTA1LCBSRUdfSU5QVVRfVkFDVElWRV9TVEFS VCkgJiAweEZGRjsKPiArCXZkZXcgPSBpdDY1MDVfcmVhZF93b3JkKGl0NjUwNSwgUkVHX0lOUFVU X1ZBQ1RJVkVfV0lEVEgpICYgMHhGRkY7Cj4gKwl2ZnBoID0gaXQ2NTA1X3JlYWRfd29yZChpdDY1 MDUsIFJFR19JTlBVVF9WRlJPTlRfUE9SQ0gpICYgMHhGRkY7Cj4gKwl2c3luY3cgPSBpdDY1MDVf cmVhZF93b3JkKGl0NjUwNSwgUkVHX0lOUFVUX1ZTWU5DX1dJRFRIKSAmIDB4RkZGOwo+ICsKPiAr CXN1bSA9IDA7Cj4gKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewo+ICsJCWl0NjUwNV9zZXRf Yml0cyhpdDY1MDUsIFJFR19EQVRBX0NUUkwwLCBFTkFCTEVfUENMS19DT1VOVEVSLAo+ICsJCQkJ RU5BQkxFX1BDTEtfQ09VTlRFUik7Cj4gKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxNTAwMCk7Cj4g KwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RBVEFfQ1RSTDAsIEVOQUJMRV9QQ0xLX0NP VU5URVIsCj4gKwkJCQkweDAwKTsKPiArCQlyZGRhdGEgPSBpdDY1MDVfcmVhZF93b3JkKGl0NjUw NSwgUkVHX1BDTEtfQ09VTlRFUl9WQUxVRSkgJgo+ICsJCQkgMHhGRkY7Cj4gKwo+ICsJCXN1bSAr PSByZGRhdGE7Cj4gKwl9Cj4gKwo+ICsJaWYgKHN1bSA9PSAwKSB7Cj4gKwkJRFJNX0RFVl9ERUJV R19EUklWRVIoZGV2LCAiY2FsYyB2aWRlbyB0aW1pbmcgZXJyb3IiKTsKPiArCQlyZXR1cm47Cj4g Kwl9Cj4gKwo+ICsJc3VtIC89IDEwOwo+ICsJcGNsayA9IDEzNTAwICogMjA0OCAvIHN1bTsKPiAr CWl0NjUwNS0+dmlkZW9faW5mby5jbG9jayA9IHBjbGs7Cj4gKwlpdDY1MDUtPnZpZGVvX2luZm8u aGRpc3BsYXkgPSBoZGV3Owo+ICsJaXQ2NTA1LT52aWRlb19pbmZvLmhzeW5jX3N0YXJ0ID0gaGRl dyArIGhmcGg7Cj4gKwlpdDY1MDUtPnZpZGVvX2luZm8uaHN5bmNfZW5kID0gaGRldyArIGhmcGgg KyBoc3luY3c7Cj4gKwlpdDY1MDUtPnZpZGVvX2luZm8uaHRvdGFsID0gaHRvdGFsOwo+ICsJaXQ2 NTA1LT52aWRlb19pbmZvLnZkaXNwbGF5ID0gdmRldzsKPiArCWl0NjUwNS0+dmlkZW9faW5mby52 c3luY19zdGFydCA9IHZkZXcgKyB2ZnBoOwo+ICsJaXQ2NTA1LT52aWRlb19pbmZvLnZzeW5jX2Vu ZCA9IHZkZXcgKyB2ZnBoICsgdnN5bmN3Owo+ICsJaXQ2NTA1LT52aWRlb19pbmZvLnZ0b3RhbCA9 IHZ0b3RhbDsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsIERSTV9NT0RFX0ZNVCwK PiArCQkJICAgICBEUk1fTU9ERV9BUkcoJml0NjUwNS0+dmlkZW9faW5mbykpOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgaW50IGl0NjUwNV9kcm1fZHBfbGlua19wcm9iZShzdHJ1Y3QgZHJtX2RwX2F1eCAq YXV4LAo+ICsJCQkJICAgIHN0cnVjdCBpdDY1MDVfZHJtX2RwX2xpbmsgKmxpbmspCj4gK3sKPiAr CXU4IHZhbHVlc1szXTsKPiArCWludCBlcnI7Cj4gKwo+ICsJbWVtc2V0KGxpbmssIDAsIHNpemVv ZigqbGluaykpOwo+ICsKPiArCWVyciA9IGRybV9kcF9kcGNkX3JlYWQoYXV4LCBEUF9EUENEX1JF ViwgdmFsdWVzLCBzaXplb2YodmFsdWVzKSk7Cj4gKwlpZiAoZXJyIDwgMCkKPiArCQlyZXR1cm4g ZXJyOwo+ICsKPiArCWxpbmstPnJldmlzaW9uID0gdmFsdWVzWzBdOwo+ICsJbGluay0+cmF0ZSA9 IGRybV9kcF9id19jb2RlX3RvX2xpbmtfcmF0ZSh2YWx1ZXNbMV0pOwo+ICsJbGluay0+bnVtX2xh bmVzID0gdmFsdWVzWzJdICYgRFBfTUFYX0xBTkVfQ09VTlRfTUFTSzsKPiArCj4gKwlpZiAodmFs dWVzWzJdICYgRFBfRU5IQU5DRURfRlJBTUVfQ0FQKQo+ICsJCWxpbmstPmNhcGFiaWxpdGllcyA9 IDE7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaXQ2NTA1X2RybV9k cF9saW5rX3Bvd2VyX3VwKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsCj4gKwkJCQkgICAgICAgc3Ry dWN0IGl0NjUwNV9kcm1fZHBfbGluayAqbGluaykKPiArewo+ICsJdTggdmFsdWU7Cj4gKwlpbnQg ZXJyOwo+ICsKPiArCS8qIERQX1NFVF9QT1dFUiByZWdpc3RlciBpcyBvbmx5IGF2YWlsYWJsZSBv biBEUENEIHYxLjEgYW5kIGxhdGVyICovCj4gKwlpZiAobGluay0+cmV2aXNpb24gPCAweDExKQo+ ICsJCXJldHVybiAwOwo+ICsKPiArCWVyciA9IGRybV9kcF9kcGNkX3JlYWRiKGF1eCwgRFBfU0VU X1BPV0VSLCAmdmFsdWUpOwo+ICsJaWYgKGVyciA8IDApCj4gKwkJcmV0dXJuIGVycjsKPiArCj4g Kwl2YWx1ZSAmPSB+RFBfU0VUX1BPV0VSX01BU0s7Cj4gKwl2YWx1ZSB8PSBEUF9TRVRfUE9XRVJf RDA7Cj4gKwo+ICsJZXJyID0gZHJtX2RwX2RwY2Rfd3JpdGViKGF1eCwgRFBfU0VUX1BPV0VSLCB2 YWx1ZSk7Cj4gKwlpZiAoZXJyIDwgMCkKPiArCQlyZXR1cm4gZXJyOwo+ICsKPiArCS8qCj4gKwkg KiBBY2NvcmRpbmcgdG8gdGhlIERQIDEuMSBzcGVjaWZpY2F0aW9uLCBhICJTaW5rIERldmljZSBt dXN0IGV4aXQgdGhlCj4gKwkgKiBwb3dlciBzYXZpbmcgc3RhdGUgd2l0aGluIDEgbXMiIChTZWN0 aW9uIDIuNS4zLjEsIFRhYmxlIDUtNTIsICJTaW5rCj4gKwkgKiBDb250cm9sIEZpZWxkIiAocmVn aXN0ZXIgMHg2MDApLgo+ICsJICovCj4gKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Cj4gKwo+ ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9jbGVhcl9pbnQoc3Ry dWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQkFO S19TRUwsIDB4MDApOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgSU5UX1NUQVRVU18wMSwgMHhG Rik7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBJTlRfU1RBVFVTXzAyLCAweEZGKTsKPiArCWl0 NjUwNV93cml0ZShpdDY1MDUsIElOVF9TVEFUVVNfMDMsIDB4RkYpOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgdm9pZCBpdDY1MDVfaW50X21hc2tfZW5hYmxlKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiAr ewo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0JBTktfU0VMLCAweDAwKTsKPiArCWl0NjUw NV93cml0ZShpdDY1MDUsIElOVF9NQVNLXzAxLCAweDFGKTsKPiArCWl0NjUwNV93cml0ZShpdDY1 MDUsIElOVF9NQVNLXzAyLCAweDA3KTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIElOVF9NQVNL XzAzLCAweEIwKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2ludF9tYXNrX2Rpc2Fi bGUoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBS RUdfQkFOS19TRUwsIDB4MDApOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgSU5UX01BU0tfMDEs IDB4MDApOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgSU5UX01BU0tfMDIsIDB4MDApOwo+ICsJ aXQ2NTA1X3dyaXRlKGl0NjUwNSwgSU5UX01BU0tfMDMsIDB4MDApOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgdm9pZCBpdDY1MDVfbGFuZV90ZXJtaW5hdGlvbl9vbihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUp Cj4gK3sKPiArCWlmIChpdDY1MDVfcmVhZChpdDY1MDUsIDB4Q0YpID09IDB4RjApCj4gKwkJaXQ2 NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RSVl9MTl9EQVRBX1NFTCwgMHg4MCwgMHgwMCk7Cj4g Kwo+ICsJaWYgKGl0NjUwNV9yZWFkKGl0NjUwNSwgMHhDRikgPT0gMHg3MCkgewo+ICsJCWlmIChp dDY1MDUtPmxhbmVfc3dhcCkgewo+ICsJCQlzd2l0Y2ggKGl0NjUwNS0+bGFuZV9jb3VudCkgewo+ ICsJCQljYXNlIDE6Cj4gKwkJCWNhc2UgMjoKPiArCQkJCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUs IFJFR19EUlZfTE5fREFUQV9TRUwsCj4gKwkJCQkJCTB4MEMsIDB4MDgpOwo+ICsJCQkJYnJlYWs7 Cj4gKwkJCWRlZmF1bHQ6Cj4gKwkJCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfRFJWX0xO X0RBVEFfU0VMLAo+ICsJCQkJCQkweDBDLCAweDBDKTsKPiArCQkJCWJyZWFrOwo+ICsJCQl9Cj4g KwkJfSBlbHNlIHsKPiArCQkJc3dpdGNoIChpdDY1MDUtPmxhbmVfY291bnQpIHsKPiArCQkJY2Fz ZSAxOgo+ICsJCQljYXNlIDI6Cj4gKwkJCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfRFJW X0xOX0RBVEFfU0VMLAo+ICsJCQkJCQkweDBDLCAweDA0KTsKPiArCQkJCWJyZWFrOwo+ICsJCQlk ZWZhdWx0Ogo+ICsJCQkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RSVl9MTl9EQVRBX1NF TCwKPiArCQkJCQkJMHgwQywgMHgwQyk7Cj4gKwkJCQlicmVhazsKPiArCQkJfQo+ICsJCX0KPiAr CX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2xhbmVfdGVybWluYXRpb25fb2ZmKHN0 cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJaWYgKGl0NjUwNV9yZWFkKGl0NjUwNSwgMHhD RikgPT0gMHhGMCkKPiArCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfRFJWX0xOX0RBVEFf U0VMLCAweDgwLCAweDgwKTsKPiArCj4gKwlpZiAoaXQ2NTA1X3JlYWQoaXQ2NTA1LCAweENGKSA9 PSAweDcwKQo+ICsJCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19EUlZfTE5fREFUQV9TRUws IDB4MEMsIDB4MDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfbGFuZV9wb3dlcl9v bihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWl0NjUwNV9zZXRfYml0cygKPiArCQlp dDY1MDUsIFJFR19MSU5LX0RSViwgMHhGMSwKPiArCQkoKEJJVChpdDY1MDUtPmxhbmVfY291bnQp IC0gMSkKPiArCQkgPDwgKGl0NjUwNS0+bGFuZV9zd2FwID8gKDggLSBpdDY1MDUtPmxhbmVfY291 bnQpIDogNCkpIHwKPiArCQkJMHgwMSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9s YW5lX3Bvd2VyX29mZihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWl0NjUwNV9zZXRf Yml0cyhpdDY1MDUsIFJFR19MSU5LX0RSViwgMHhGMCwgMHgwMCk7Cj4gK30KPiArCj4gK3N0YXRp YyB2b2lkIGl0NjUwNV9sYW5lX29mZihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWl0 NjUwNV9sYW5lX3Bvd2VyX29mZihpdDY1MDUpOwo+ICsJaXQ2NTA1X2xhbmVfdGVybWluYXRpb25f b2ZmKGl0NjUwNSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9hdXhfdGVybWluYXRp b25fb24oc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpZiAoaXQ2NTA1X3JlYWQoaXQ2 NTA1LCAweENGKSA9PSAweEYwKQo+ICsJCWl0NjUwNV9sYW5lX3Rlcm1pbmF0aW9uX29uKGl0NjUw NSk7Cj4gKwo+ICsJaWYgKGl0NjUwNV9yZWFkKGl0NjUwNSwgMHhDRikgPT0gMHg3MCkKPiArCQlp dDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfRFJWX0xOX0RBVEFfU0VMLCAweDgwLCAweDgwKTsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2F1eF9wb3dlcl9vbihzdHJ1Y3QgaXQ2NTA1 ICppdDY1MDUpCj4gK3sKPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19BVVgsIDB4MDIs IDB4MDIpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfYXV4X29uKHN0cnVjdCBpdDY1 MDUgKml0NjUwNSkKPiArewo+ICsJaXQ2NTA1X2F1eF9wb3dlcl9vbihpdDY1MDUpOwo+ICsJaXQ2 NTA1X2F1eF90ZXJtaW5hdGlvbl9vbihpdDY1MDUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBp dDY1MDVfYXV4X3Jlc2V0KHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJaXQ2NTA1X3Nl dF9iaXRzKGl0NjUwNSwgUkVHX1JFU0VUX0NUUkwsIEFVWF9SRVNFVCwgQVVYX1JFU0VUKTsKPiAr CWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19SRVNFVF9DVFJMLCBBVVhfUkVTRVQsIDB4MDAp Owo+ICt9Cj4gKwo+ICtzdGF0aWMgYm9vbCBpdDY1MDVfcmVzZXRfbG9naWMoc3RydWN0IGl0NjUw NSAqaXQ2NTA1KQo+ICt7Cj4gKwlyZWdtYXBfd3JpdGUoaXQ2NTA1LT5yZWdtYXAsIFJFR19SRVNF VF9DVFJMLCBBTExfTE9HSUNfUkVTRVQpOwo+ICsJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwo+ ICsKPiArCWl0NjUwNS0+cmV2aXNpb24gPSBpdDY1MDVfcmVhZChpdDY1MDUsIFJFR19JQ19WRVIp Owo+ICsKPiArCWlmIChpdDY1MDUtPnJldmlzaW9uIDwgMCkKPiArCQlyZXR1cm4gZmFsc2U7Cj4g Kwo+ICsJcmV0dXJuIHRydWU7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGl0NjUwNV9hdXhfb3Bf ZmluaXNoZWQoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpbnQgcmVnMmIgPSBpdDY1 MDVfcmVhZChpdDY1MDUsIFJFR19BVVhfQ01EX1JFUSk7Cj4gKwo+ICsJaWYgKHJlZzJiIDwgMCkK PiArCQlyZXR1cm4gZmFsc2U7Cj4gKwo+ICsJcmV0dXJuIChyZWcyYiAmIEFVWF9CVVNZKSA9PSAw Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGl0NjUwNV9hdXhfd2FpdChzdHJ1Y3QgaXQ2NTA1ICpp dDY1MDUpCj4gK3sKPiArCWludCBzdGF0dXM7Cj4gKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Cj4g KwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCj4gKwl0aW1l b3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQVVYX1dBSVRfVElNRU9VVF9NUykgKyAx Owo+ICsKPiArCXdoaWxlICghaXQ2NTA1X2F1eF9vcF9maW5pc2hlZChpdDY1MDUpKSB7Cj4gKwkJ aWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKPiArCQkJRFJNX0RFVl9FUlJPUihk ZXYsICJUaW1lZCBvdXQgd2FpdGluZyBBVVggdG8gZmluaXNoIik7Cj4gKwkJCXJldHVybiAtRVRJ TUVET1VUOwo+ICsJCX0KPiArCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Cj4gKwl9Cj4gKwo+ ICsJc3RhdHVzID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBSRUdfQVVYX0VSUk9SX1NUUyk7Cj4gKwlp ZiAoc3RhdHVzIDwgMCkgewo+ICsJCURSTV9ERVZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIHJlYWQg QVVYIGNoYW5uZWw6ICVkIiwgc3RhdHVzKTsKPiArCQlyZXR1cm4gc3RhdHVzOwo+ICsJfQo+ICsK PiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3NpemVfdCBpdDY1MDVfYXV4X29wZXJh dGlvbihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsCj4gKwkJCQkgICAgZW51bSBhdXhfY21kX3R5cGUg Y21kLAo+ICsJCQkJICAgIHVuc2lnbmVkIGludCBhZGRyZXNzLCB1OCAqYnVmZmVyLAo+ICsJCQkJ ICAgIHNpemVfdCBzaXplLCBlbnVtIGF1eF9jbWRfcmVwbHkgKnJlcGx5KQo+ICt7Cj4gKwlpbnQg aSwgc3RhdHVzOwo+ICsJYm9vbCBhdXhfd3JpdGVfY2hlY2sgPSBmYWxzZTsKPiArCj4gKwlpZiAo IWl0NjUwNV9nZXRfc2lua19ocGRfc3RhdHVzKGl0NjUwNSkpCj4gKwkJcmV0dXJuIC1FSU87Cj4g Kwo+ICsJLyogc2V0IEFVWCB1c2VyIG1vZGUgKi8KPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUs IFJFR19BVVhfQ1RSTCwgQVVYX1VTRVJfTU9ERSwgQVVYX1VTRVJfTU9ERSk7Cj4gKwo+ICthdXhf b3Bfc3RhcnQ6Cj4gKwo+ICsJaWYgKGNtZCA9PSBDTURfQVVYX0kyQ19FRElEX1JFQUQpIHsKPiAr CQkvKiBEUCBBVVggRURJRCBGSUZPIGhhcyBtYXhpbXVtIGxlbmd0aCBvZiBuIGJ5dGVzLiAqLwo+ ICsJCXNpemUgPSBtaW5fdChzaXplX3QsIHNpemUsIEFVWF9GSUZPX01BWF9TSVpFKTsKPiArCQkv KiBFbmFibGUgQVVYIEZJRk8gcmVhZCBiYWNrIGFuZCBjbGVhciBGSUZPICovCj4gKwkJaXQ2NTA1 X3NldF9iaXRzKGl0NjUwNSwgUkVHX0FVWF9DVFJMLAo+ICsJCQkJQVVYX0VOX0ZJRk9fUkVBRCB8 IENMUl9FRElEX0ZJRk8sCj4gKwkJCQlBVVhfRU5fRklGT19SRUFEIHwgQ0xSX0VESURfRklGTyk7 Cj4gKwo+ICsJCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19BVVhfQ1RSTCwKPiArCQkJCUFV WF9FTl9GSUZPX1JFQUQgfCBDTFJfRURJRF9GSUZPLAo+ICsJCQkJQVVYX0VOX0ZJRk9fUkVBRCk7 Cj4gKwl9IGVsc2Ugewo+ICsJCS8qIFRoZSBEUCBBVVggdHJhbnNtaXQgYnVmZmVyIGhhcyA0IGJ5 dGVzLiAqLwo+ICsJCXNpemUgPSBtaW5fdChzaXplX3QsIHNpemUsIDQpOwo+ICsJCWl0NjUwNV9z ZXRfYml0cyhpdDY1MDUsIFJFR19BVVhfQ1RSTCwgQVVYX05PX1NFR01FTlRfV1IsCj4gKwkJCQlB VVhfTk9fU0VHTUVOVF9XUik7Cj4gKwl9Cj4gKwo+ICsJLyogU3RhcnQgQWRkcmVzc1s3OjBdICov Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVYX0FEUl8wXzcsIChhZGRyZXNzID4+IDAp ICYgMHhGRik7Cj4gKwkvKiBTdGFydCBBZGRyZXNzWzE1OjhdICovCj4gKwlpdDY1MDVfd3JpdGUo aXQ2NTA1LCBSRUdfQVVYX0FEUl84XzE1LCAoYWRkcmVzcyA+PiA4KSAmIDB4RkYpOwo+ICsJLyog V3JpdGVOdW1bMzowXStTdGFydEFkclsxOToxNl0gKi8KPiArCWl0NjUwNV93cml0ZShpdDY1MDUs IFJFR19BVVhfQURSXzE2XzE5LAo+ICsJCSAgICAgKChhZGRyZXNzID4+IDE2KSAmIDB4MEYpIHwg KChzaXplIC0gMSkgPDwgNCkpOwo+ICsKPiArCWlmIChjbWQgPT0gQ01EX0FVWF9OQVRJVkVfV1JJ VEUpCj4gKwkJcmVnbWFwX2J1bGtfd3JpdGUoaXQ2NTA1LT5yZWdtYXAsIFJFR19BVVhfT1VUX0RB VEEwLCBidWZmZXIsCj4gKwkJCQkgIHNpemUpOwo+ICsKPiArCS8qIEF1eCBGaXJlICovCj4gKwlp dDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVYX0NNRF9SRVEsIGNtZCk7Cj4gKwo+ICsJc3RhdHVz ID0gaXQ2NTA1X2F1eF93YWl0KGl0NjUwNSk7Cj4gKwlpZiAoc3RhdHVzIDwgMCkKPiArCQlnb3Rv IGF1eF9vcF9lcnI7Cj4gKwo+ICsJc3RhdHVzID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBSRUdfQVVY X0VSUk9SX1NUUyk7Cj4gKwlpZiAoc3RhdHVzIDwgMCkKPiArCQlnb3RvIGF1eF9vcF9lcnI7Cj4g Kwo+ICsJc3dpdGNoICgoc3RhdHVzID4+IDYpICYgMHgzKSB7Cj4gKwljYXNlIDA6Cj4gKwkJKnJl cGx5ID0gUkVQTFlfQUNLOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSAxOgo+ICsJCSpyZXBseSA9IFJF UExZX0RFRkVSOwo+ICsJCXN0YXR1cyA9IC1FQUdBSU47Cj4gKwkJZ290byBhdXhfb3BfZXJyOwo+ ICsJY2FzZSAyOgo+ICsJCSpyZXBseSA9IFJFUExZX05BQ0s7Cj4gKwkJc3RhdHVzID0gLUVJTzsK PiArCQlnb3RvIGF1eF9vcF9lcnI7Cj4gKwljYXNlIDM6Cj4gKwkJc3RhdHVzID0gLUVUSU1FRE9V VDsKPiArCQlnb3RvIGF1eF9vcF9lcnI7Cj4gKwl9Cj4gKwo+ICsJLyogUmVhZCBiYWNrIE5hdGl2 ZSBXcml0ZSBkYXRhICovCj4gKwlpZiAoY21kID09IENNRF9BVVhfTkFUSVZFX1dSSVRFKSB7Cj4g KwkJYXV4X3dyaXRlX2NoZWNrID0gdHJ1ZTsKPiArCQljbWQgPSBDTURfQVVYX05BVElWRV9SRUFE Owo+ICsJCWdvdG8gYXV4X29wX3N0YXJ0Owo+ICsJfQo+ICsKPiArCWlmIChjbWQgPT0gQ01EX0FV WF9JMkNfRURJRF9SRUFEKSB7Cj4gKwkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewo+ICsJ CQlzdGF0dXMgPSBpdDY1MDVfcmVhZChpdDY1MDUsIFJFR19BVVhfREFUQV9GSUZPKTsKPiArCQkJ aWYgKHN0YXR1cyA8IDApCj4gKwkJCQlnb3RvIGF1eF9vcF9lcnI7Cj4gKwkJCWJ1ZmZlcltpXSA9 IHN0YXR1czsKPiArCQl9Cj4gKwl9IGVsc2Ugewo+ICsJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBp KyspIHsKPiArCQkJc3RhdHVzID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBSRUdfQVVYX0RBVEFfMF83 ICsgaSk7Cj4gKwkJCWlmIChzdGF0dXMgPCAwKQo+ICsJCQkJZ290byBhdXhfb3BfZXJyOwo+ICsK PiArCQkJaWYgKGF1eF93cml0ZV9jaGVjayAmJiBidWZmZXJbc2l6ZSAtIDEgLSBpXSAhPSBzdGF0 dXMpCj4gKwkJCQlicmVhazsKPiArCj4gKwkJCWJ1ZmZlcltzaXplIC0gMSAtIGldID0gc3RhdHVz Owo+ICsJCX0KPiArCX0KPiArCj4gKwlzdGF0dXMgPSBpOwo+ICsKPiArYXV4X29wX2VycjoKPiAr Cj4gKwlpZiAoY21kID09IENNRF9BVVhfSTJDX0VESURfUkVBRCkgewo+ICsJCS8qY2xlYXIgQVVY IEZJRk8gKi8KPiArCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfQVVYX0NUUkwsCj4gKwkJ CQlBVVhfRU5fRklGT19SRUFEIHwgQ0xSX0VESURfRklGTywKPiArCQkJCUFVWF9FTl9GSUZPX1JF QUQgfCBDTFJfRURJRF9GSUZPKTsKPiArCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfQVVY X0NUUkwsCj4gKwkJCQlBVVhfRU5fRklGT19SRUFEIHwgQ0xSX0VESURfRklGTywgMHgwMCk7Cj4g Kwl9Cj4gKwo+ICsJLyogTGVhdmUgQVVYIHVzZXIgbW9kZSAqLwo+ICsJaXQ2NTA1X3NldF9iaXRz KGl0NjUwNSwgUkVHX0FVWF9DVFJMLCBBVVhfVVNFUl9NT0RFLCAwKTsKPiArCj4gKwlyZXR1cm4g c3RhdHVzOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3NpemVfdCBpdDY1MDVfYXV4X2RvX3RyYW5zZmVy KHN0cnVjdCBpdDY1MDUgKml0NjUwNSwKPiArCQkJCSAgICAgIGVudW0gYXV4X2NtZF90eXBlIGNt ZCwKPiArCQkJCSAgICAgIHVuc2lnbmVkIGludCBhZGRyZXNzLCB1OCAqYnVmZmVyLAo+ICsJCQkJ ICAgICAgc2l6ZV90IHNpemUsIGVudW0gYXV4X2NtZF9yZXBseSAqcmVwbHkpCj4gK3sKPiArCWlu dCBpLCByZXQsIHJldF9zaXplID0gMCwgcmVxdWVzdF9zaXplOwo+ICsKPiArCW11dGV4X2xvY2so Jml0NjUwNS0+YXV4X2xvY2spOwo+ICsJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkgewo+ ICsJCXJlcXVlc3Rfc2l6ZSA9IG1pbigoaW50KXNpemUgLSBpLCA0KTsKPiArCQlyZXQgPSBpdDY1 MDVfYXV4X29wZXJhdGlvbihpdDY1MDUsIGNtZCwgYWRkcmVzcyArIGksCj4gKwkJCQkJICAgYnVm ZmVyICsgaSwgcmVxdWVzdF9zaXplLCByZXBseSk7Cj4gKwkJaWYgKHJldCA8IDApIHsKPiArCQkJ cmV0X3NpemUgPSByZXQ7Cj4gKwkJCWdvdG8gYXV4X29wX2VycjsKPiArCQl9Cj4gKwo+ICsJCXJl dF9zaXplICs9ICByZXQ7Cj4gKwl9Cj4gK2F1eF9vcF9lcnI6Cj4gKwo+ICsJbXV0ZXhfdW5sb2Nr KCZpdDY1MDUtPmF1eF9sb2NrKTsKPiArCXJldHVybiByZXRfc2l6ZTsKPiArfQo+ICsKPiArc3Rh dGljIHNzaXplX3QgaXQ2NTA1X2F1eF90cmFuc2ZlcihzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LAo+ ICsJCQkJICAgc3RydWN0IGRybV9kcF9hdXhfbXNnICptc2cpCj4gK3sKPiArCXN0cnVjdCBpdDY1 MDUgKml0NjUwNSA9IGNvbnRhaW5lcl9vZihhdXgsIHN0cnVjdCBpdDY1MDUsIGF1eCk7Cj4gKwl1 OCBjbWQ7Cj4gKwlib29sIGlzX2kyYyA9ICEobXNnLT5yZXF1ZXN0ICYgRFBfQVVYX05BVElWRV9X UklURSk7Cj4gKwlpbnQgcmV0Owo+ICsJZW51bSBhdXhfY21kX3JlcGx5IHJlcGx5Owo+ICsKPiAr CS8qIElUNjUwNSBkb2Vzbid0IHN1cHBvcnQgYXJiaXRyYXJ5IEkyQyByZWFkIC8gd3JpdGUuICov Cj4gKwlpZiAoaXNfaTJjKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCXN3aXRjaCAobXNn LT5yZXF1ZXN0KSB7Cj4gKwljYXNlIERQX0FVWF9OQVRJVkVfUkVBRDoKPiArCQljbWQgPSBDTURf QVVYX05BVElWRV9SRUFEOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBEUF9BVVhfTkFUSVZFX1dSSVRF Ogo+ICsJCWNtZCA9IENNRF9BVVhfTkFUSVZFX1dSSVRFOwo+ICsJCWJyZWFrOwo+ICsJZGVmYXVs dDoKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlyZXQgPSBpdDY1MDVfYXV4X2Rv X3RyYW5zZmVyKGl0NjUwNSwgY21kLCBtc2ctPmFkZHJlc3MsIG1zZy0+YnVmZmVyLAo+ICsJCQkJ ICAgICBtc2ctPnNpemUsICZyZXBseSk7Cj4gKwlpZiAocmV0IDwgMCkKPiArCQlyZXR1cm4gcmV0 Owo+ICsKPiArCXN3aXRjaCAocmVwbHkpIHsKPiArCWNhc2UgUkVQTFlfQUNLOgo+ICsJCW1zZy0+ cmVwbHkgPSBEUF9BVVhfTkFUSVZFX1JFUExZX0FDSzsKPiArCQlicmVhazsKPiArCWNhc2UgUkVQ TFlfTkFDSzoKPiArCQltc2ctPnJlcGx5ID0gRFBfQVVYX05BVElWRV9SRVBMWV9OQUNLOwo+ICsJ CWJyZWFrOwo+ICsJY2FzZSBSRVBMWV9ERUZFUjoKPiArCQltc2ctPnJlcGx5ID0gRFBfQVVYX05B VElWRV9SRVBMWV9ERUZFUjsKPiArCQlicmVhazsKPiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGl0NjUwNV9nZXRfZWRpZF9ibG9jayh2b2lkICpkYXRhLCB1 OCAqYnVmLCB1bnNpZ25lZCBpbnQgYmxvY2ssCj4gKwkJCQkgc2l6ZV90IGxlbikKPiArewo+ICsJ c3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gZGF0YTsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZp dDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsJZW51bSBhdXhfY21kX3JlcGx5IHJlcGx5Owo+ICsJaW50 IG9mZnNldCwgcmV0LCBhdXhfcmV0cnkgPSAxMDA7Cj4gKwo+ICsJaXQ2NTA1X2F1eF9yZXNldChp dDY1MDUpOwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiYmxvY2sgbnVtYmVyID0gJWQi LCBibG9jayk7Cj4gKwo+ICsJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBFRElEX0xFTkdUSDsp IHsKPiArCQlyZXQgPSBpdDY1MDVfYXV4X2RvX3RyYW5zZmVyKGl0NjUwNSwgQ01EX0FVWF9JMkNf RURJRF9SRUFELAo+ICsJCQkJCSAgICAgYmxvY2sgKiBFRElEX0xFTkdUSCArIG9mZnNldCwKPiAr CQkJCQkgICAgIGJ1ZiArIG9mZnNldCwgOCwgJnJlcGx5KTsKPiArCj4gKwkJaWYgKHJldCA8IDAg JiYgcmV0ICE9IC1FQUdBSU4pCj4gKwkJCXJldHVybiByZXQ7Cj4gKwo+ICsJCXN3aXRjaCAocmVw bHkpIHsKPiArCQljYXNlIFJFUExZX0FDSzoKPiArCQkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2 LCAiWzB4JTAyeF06ICU4cGgiLCBvZmZzZXQsCj4gKwkJCQkJICAgICBidWYgKyBvZmZzZXQpOwo+ ICsJCQlvZmZzZXQgKz0gODsKPiArCQkJYXV4X3JldHJ5ID0gMTAwOwo+ICsJCQlicmVhazsKPiAr CQljYXNlIFJFUExZX05BQ0s6Cj4gKwkJCXJldHVybiAtRUlPOwo+ICsJCWNhc2UgUkVQTFlfREVG RVI6Cj4gKwkJCW1zbGVlcCgyMCk7Cj4gKwkJCWlmICghKC0tYXV4X3JldHJ5KSkKPiArCQkJCXJl dHVybiAtRUlPOwo+ICsJCX0KPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgaXQ2NTA1X3ZhcmlhYmxlX2NvbmZpZyhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4g K3sKPiArCWl0NjUwNS0+bGlua19yYXRlX2J3X2NvZGUgPSBIQlI7Cj4gKwlpdDY1MDUtPmxhbmVf Y291bnQgPSBNQVhfTEFORV9DT1VOVDsKPiArCWl0NjUwNS0+bGlua19zdGF0ZSA9IExJTktfSURM RTsKPiArCWl0NjUwNS0+YXV0b190cmFpbl9yZXRyeSA9IEFVVE9fVFJBSU5fUkVUUlk7Cj4gKwlp dDY1MDUtPmF1ZGlvLnNlbGVjdCA9IEFVRElPX1NFTEVDVDsKPiArCWl0NjUwNS0+YXVkaW8uc2Ft cGxlX3JhdGUgPSBBVURJT19TQU1QTEVfUkFURTsKPiArCWl0NjUwNS0+YXVkaW8uY2hhbm5lbF9j b3VudCA9IEFVRElPX0NIQU5ORUxfQ09VTlQ7Cj4gKwlpdDY1MDUtPmF1ZGlvLnR5cGUgPSBBVURJ T19UWVBFOwo+ICsJaXQ2NTA1LT5hdWRpby5pMnNfaW5wdXRfZm9ybWF0ID0gSTJTX0lOUFVUX0ZP Uk1BVDsKPiArCWl0NjUwNS0+YXVkaW8uaTJzX2p1c3RpZmllZCA9IEkyU19KVVNUSUZJRUQ7Cj4g KwlpdDY1MDUtPmF1ZGlvLmkyc19kYXRhX2RlbGF5ID0gSTJTX0RBVEFfREVMQVk7Cj4gKwlpdDY1 MDUtPmF1ZGlvLmkyc193c19jaGFubmVsID0gSTJTX1dTX0NIQU5ORUw7Cj4gKwlpdDY1MDUtPmF1 ZGlvLmkyc19kYXRhX3NlcXVlbmNlID0gSTJTX0RBVEFfU0VRVUVOQ0U7Cj4gKwlpdDY1MDUtPmF1 ZGlvLndvcmRfbGVuZ3RoID0gQVVESU9fV09SRF9MRU5HVEg7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgaXQ2NTA1X3NlbmRfdmlkZW9faW5mb2ZyYW1lKHN0cnVjdCBpdDY1MDUgKml0NjUwNSwKPiAr CQkJCSAgICAgICBzdHJ1Y3QgaGRtaV9hdmlfaW5mb2ZyYW1lICpmcmFtZSkKPiArewo+ICsJdTgg YnVmZmVyW0hETUlfSU5GT0ZSQU1FX0hFQURFUl9TSVpFICsgSERNSV9BVklfSU5GT0ZSQU1FX1NJ WkVdOwo+ICsJaW50IGVycjsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVu dC0+ZGV2Owo+ICsKPiArCWVyciA9IGhkbWlfYXZpX2luZm9mcmFtZV9wYWNrKGZyYW1lLCBidWZm ZXIsIHNpemVvZihidWZmZXIpKTsKPiArCWlmIChlcnIgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJP UihkZXYsICJGYWlsZWQgdG8gcGFjayBBVkkgaW5mb2ZyYW1lOiAlZCIsIGVycik7Cj4gKwkJcmV0 dXJuIGVycjsKPiArCX0KPiArCj4gKwllcnIgPSBpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdf SU5GT0ZSQU1FX0NUUkwsIEVOX0FWSV9QS1QsIDB4MDApOwo+ICsJaWYgKGVycikKPiArCQlyZXR1 cm4gZXJyOwo+ICsKPiArCWVyciA9IHJlZ21hcF9idWxrX3dyaXRlKGl0NjUwNS0+cmVnbWFwLCBS RUdfQVZJX0lORk9fREIxLAo+ICsJCQkJYnVmZmVyICsgSERNSV9JTkZPRlJBTUVfSEVBREVSX1NJ WkUsCj4gKwkJCQlmcmFtZS0+bGVuZ3RoKTsKPiArCWlmIChlcnIpCj4gKwkJcmV0dXJuIGVycjsK PiArCj4gKwllcnIgPSBpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfSU5GT0ZSQU1FX0NUUkws IEVOX0FWSV9QS1QsCj4gKwkJCSAgICAgIEVOX0FWSV9QS1QpOwo+ICsJaWYgKGVycikKPiArCQly ZXR1cm4gZXJyOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1 MDVfZ2V0X2V4dGNvbl9wcm9wZXJ0eShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWlu dCBlcnI7Cj4gKwl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgcHJvcGVydHk7Cj4gKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCj4gKwlpZiAoaXQ2NTA1 LT5leHRjb24gJiYgIWl0NjUwNS0+bGFuZV9zd2FwX2Rpc2FibGVkKSB7Cj4gKwkJZXJyID0gZXh0 Y29uX2dldF9wcm9wZXJ0eShpdDY1MDUtPmV4dGNvbiwgRVhUQ09OX0RJU1BfRFAsCj4gKwkJCQkJ ICBFWFRDT05fUFJPUF9VU0JfVFlQRUNfUE9MQVJJVFksCj4gKwkJCQkJICAmcHJvcGVydHkpOwo+ ICsJCWlmIChlcnIpIHsKPiArCQkJRFJNX0RFVl9FUlJPUihkZXYsICJnZXQgcHJvcGVydHkgZmFp bCEiKTsKPiArCQkJcmV0dXJuOwo+ICsJCX0KPiArCQlpdDY1MDUtPmxhbmVfc3dhcCA9IHByb3Bl cnR5LmludHZhbDsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2Nsa19waGFz ZV9hZGp1c3RtZW50KHN0cnVjdCBpdDY1MDUgKml0NjUwNSwKPiArCQkJCQljb25zdCBzdHJ1Y3Qg ZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiArewo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwg UkVHX0NMS19DVFJMMCwgTV9QQ0xLX0RFTEFZLAo+ICsJCW1vZGUtPmNsb2NrIDwgQURKVVNUX1BI QVNFX1RIUkVTSE9MRCA/IFBJWEVMX0NMS19ERUxBWSA6IDApOwo+ICsJaXQ2NTA1X3NldF9iaXRz KGl0NjUwNSwgUkVHX0RBVEFfQ1RSTDAsIFZJREVPX0xBVENIX0VER0UsCj4gKwkJCVBJWEVMX0NM S19JTlZFUlNFIDw8IDQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfaW5pdChzdHJ1 Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19CQU5L X1NFTCwgMHgwMCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVYX09QVCwgQVVYX0FV VE9fUlNUIHwgQVVYX0ZJWF9GUkVRKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19BVVhf Q1RSTCwgQVVYX05PX1NFR01FTlRfV1IpOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0hE Q1BfQ1RSTDIsIEhEQ1BfQU5fU0VMIHwgSERDUF9IV19IUERJUlFfQUNUKTsKPiArCWl0NjUwNV93 cml0ZShpdDY1MDUsIFJFR19WSURfQlVTX0NUUkwwLCBJTl9ERFIgfCBERFJfQ0QpOwo+ICsJaXQ2 NTA1X3dyaXRlKGl0NjUwNSwgUkVHX1ZJRF9CVVNfQ1RSTDEsIDB4MDEpOwo+ICsJaXQ2NTA1X3dy aXRlKGl0NjUwNSwgUkVHX0FVRElPX0NUUkwwLCBBVURJT18xNkJfQk9VTkQpOwo+ICsKPiArCS8q IGNoaXAgaW50ZXJuYWwgc2V0dGluZywgZG9uJ3QgbW9kaWZ5ICovCj4gKwlpdDY1MDVfd3JpdGUo aXQ2NTA1LCBSRUdfSFBEX0lSUV9USU1FLCAweEY1KTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUs IFJFR19BVVhfREVCVUdfTU9ERSwgMHg0RCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdf QVVYX09QVDIsIDB4MTcpOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0hEQ1BfT1BULCAw eDYwKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19EQVRBX01VVEVfQ1RSTCwKPiArCQkg ICAgIEVOX1ZJRF9NVVRFIHwgRU5fQVVEX01VVEUgfCBFTkFCTEVfQVVUT19WSURFT19GSUZPX1JF U0VUKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19USU1FX1NUTVBfQ1RSTCwKPiArCQkg ICAgIEVOX1NTQ19HQVQgfCBFTl9FTkhBTkNFX1ZJRF9TVE1QIHwgRU5fRU5IQU5DRV9BVURfU1RN UCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfSU5GT0ZSQU1FX0NUUkwsIDB4MDApOwo+ ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0JBTktfU0VMLCAweDAxKTsKPiArCWl0NjUwNV93 cml0ZShpdDY1MDUsIFJFR19EUlZfMF9EQl84MDBfTVYsCj4gKwkJICAgICBhZmVfc2V0dGluZ190 YWJsZVtpdDY1MDUtPmFmZV9zZXR0aW5nXVswXSk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBS RUdfUFJFXzBfREJfODAwX01WLAo+ICsJCSAgICAgYWZlX3NldHRpbmdfdGFibGVbaXQ2NTA1LT5h ZmVfc2V0dGluZ11bMV0pOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX1BSRV8zUDVfREJf ODAwX01WLAo+ICsJCSAgICAgYWZlX3NldHRpbmdfdGFibGVbaXQ2NTA1LT5hZmVfc2V0dGluZ11b Ml0pOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX1NTQ19DVFJMMCwgMHg5RSk7Cj4gKwlp dDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfU1NDX0NUUkwxLCAweDFDKTsKPiArCWl0NjUwNV93cml0 ZShpdDY1MDUsIFJFR19TU0NfQ1RSTDIsIDB4NDIpOwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwg UkVHX0JBTktfU0VMLCAweDAwKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X3ZpZGVv X2Rpc2FibGUoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfc2V0X2JpdHMo aXQ2NTA1LCBSRUdfREFUQV9NVVRFX0NUUkwsIEVOX1ZJRF9NVVRFLCBFTl9WSURfTVVURSk7Cj4g KwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfSU5GT0ZSQU1FX0NUUkwsIEVOX1ZJRF9DVFJM X1BLVCwgMHgwMCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfUkVTRVRfQ1RSTCwg VklERU9fUkVTRVQsIFZJREVPX1JFU0VUKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1 X3ZpZGVvX3Jlc2V0KHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJaXQ2NTA1X3NldF9i aXRzKGl0NjUwNSwgUkVHX0RBVEFfTVVURV9DVFJMLCBFTl9WSURfTVVURSwgRU5fVklEX01VVEUp Owo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0lORk9GUkFNRV9DVFJMLCBFTl9WSURf Q1RSTF9QS1QsIDB4MDApOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1JFU0VUX0NU UkwsIFZJREVPX1JFU0VULCBWSURFT19SRVNFVCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1 LCBSRUdfNTAxX0ZJRk9fQ1RSTCwgUlNUXzUwMV9GSUZPLCBSU1RfNTAxX0ZJRk8pOwo+ICsJaXQ2 NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHXzUwMV9GSUZPX0NUUkwsIFJTVF81MDFfRklGTywgMHgw MCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfUkVTRVRfQ1RSTCwgVklERU9fUkVT RVQsIDB4MDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfdXBkYXRlX3ZpZGVvX3By YXJtZXRlcihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsCj4gKwkJCQkJICBjb25zdCBzdHJ1Y3QgZHJt X2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiArewo+ICsJaXQ2NTA1X2Nsa19waGFzZV9hZGp1c3RtZW50 KGl0NjUwNSwgbW9kZSk7Cj4gKwlpdDY1MDVfdmlkZW9fZGlzYWJsZShpdDY1MDUpOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgYm9vbCBpdDY1MDVfYXVkaW9faW5wdXQoc3RydWN0IGl0NjUwNSAqaXQ2NTA1 KQo+ICt7Cj4gKwlpbnQgcmVnMDUsIHJlZ2JlOwo+ICsKPiArCXJlZzA1ID0gaXQ2NTA1X3JlYWQo aXQ2NTA1LCBSRUdfUkVTRVRfQ1RSTCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdf UkVTRVRfQ1RSTCwgQVVESU9fUkVTRVQsIDB4MDApOwo+ICsJdXNsZWVwX3JhbmdlKDMwMDAsIDQw MDApOwo+ICsJcmVnYmUgPSBpdDY1MDVfcmVhZChpdDY1MDUsIFJFR19BVURJT19JTlBVVF9GUkVR KTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19SRVNFVF9DVFJMLCByZWcwNSk7Cj4gKwo+ ICsJcmV0dXJuIHJlZ2JlICE9IDB4RkY7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9z ZXR1cF9hdWRpb19jaGFubmVsX3N0YXR1cyhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiAr CWVudW0gaXQ2NTA1X2F1ZGlvX3NhbXBsZV9yYXRlIHNhbXBsZV9yYXRlID0gaXQ2NTA1LT5hdWRp by5zYW1wbGVfcmF0ZTsKPiArCXU4IGF1ZGlvX3dvcmRfbGVuZ3RoX21hcFtdID0gezB4MDIsIDB4 MDQsIDB4MDMsIDB4MEJ9Owo+ICsKPiArCS8qIENoYW5uZWwgU3RhdHVzICovCj4gKwlpdDY1MDVf d3JpdGUoaXQ2NTA1LCBSRUdfSUVDOTU4X1NUUzAsIGl0NjUwNS0+YXVkaW8udHlwZSA8PCAxKTsK PiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19JRUM5NThfU1RTMSwgMHgwMCk7Cj4gKwlpdDY1 MDVfd3JpdGUoaXQ2NTA1LCBSRUdfSUVDOTU4X1NUUzIsIDB4MDApOwo+ICsJaXQ2NTA1X3dyaXRl KGl0NjUwNSwgUkVHX0lFQzk1OF9TVFMzLCBzYW1wbGVfcmF0ZSk7Cj4gKwlpdDY1MDVfd3JpdGUo aXQ2NTA1LCBSRUdfSUVDOTU4X1NUUzQsICh+c2FtcGxlX3JhdGUgPDwgNCkgfAo+ICsJCSAgICAg YXVkaW9fd29yZF9sZW5ndGhfbWFwW2l0NjUwNS0+YXVkaW8ud29yZF9sZW5ndGhdKTsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X3NldHVwX2F1ZGlvX2Zvcm1hdChzdHJ1Y3QgaXQ2NTA1 ICppdDY1MDUpCj4gK3sKPiArCS8qIEkyUyBNT0RFICovCj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1 LCBSRUdfQVVESU9fRk1ULAo+ICsJCSAgICAgKGl0NjUwNS0+YXVkaW8ud29yZF9sZW5ndGggPDwg NSkgfAo+ICsJCSAgICAgKGl0NjUwNS0+YXVkaW8uaTJzX2RhdGFfc2VxdWVuY2UgPDwgNCkgfAo+ ICsJCSAgICAgKGl0NjUwNS0+YXVkaW8uaTJzX3dzX2NoYW5uZWwgPDwgMykgfAo+ICsJCSAgICAg KGl0NjUwNS0+YXVkaW8uaTJzX2RhdGFfZGVsYXkgPDwgMikgfAo+ICsJCSAgICAgKGl0NjUwNS0+ YXVkaW8uaTJzX2p1c3RpZmllZCA8PCAxKSB8Cj4gKwkJICAgICBpdDY1MDUtPmF1ZGlvLmkyc19p bnB1dF9mb3JtYXQpOwo+ICsJaWYgKGl0NjUwNS0+YXVkaW8uc2VsZWN0ID09IFNQRElGKSB7Cj4g KwkJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0FVRElPX0ZJRk9fU0VMLCAweDAwKTsKPiArCQkv KiAweDMwID0gMTI4KkZTICovCj4gKwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0FVWF9P UFQsIDB4RjAsIDB4MzApOwo+ICsJfSBlbHNlIHsKPiArCQlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBS RUdfQVVESU9fRklGT19TRUwsIDB4RTQpOwo+ICsJfQo+ICsKPiArCWl0NjUwNV93cml0ZShpdDY1 MDUsIFJFR19BVURJT19DVFJMMCwgMHgyMCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdf QVVESU9fQ1RSTDEsIDB4MDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfZW5hYmxl X2F1ZGlvX3NvdXJjZShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCXVuc2lnbmVkIGlu dCBhdWRpb19zb3VyY2VfY291bnQ7Cj4gKwo+ICsJYXVkaW9fc291cmNlX2NvdW50ID0gQklUKERJ Vl9ST1VORF9VUChpdDY1MDUtPmF1ZGlvLmNoYW5uZWxfY291bnQsIDIpKQo+ICsJCQkJIC0gMTsK PiArCj4gKwlhdWRpb19zb3VyY2VfY291bnQgfD0gaXQ2NTA1LT5hdWRpby5zZWxlY3QgPDwgNDsK PiArCj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVESU9fU1JDX0NUUkwsIGF1ZGlvX3Nv dXJjZV9jb3VudCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9lbmFibGVfYXVkaW9f aW5mb2ZyYW1lKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJc3RydWN0IGRldmljZSAq ZGV2ID0gJml0NjUwNS0+Y2xpZW50LT5kZXY7Cj4gKwl1OCBhdWRpb19pbmZvX2NhW10gPSB7IDB4 MDAsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDcsIDB4MEIsIDB4MEYsIDB4MUYgfTsKPiArCj4gKwlE Uk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJpbmZvZnJhbWUgY2hhbm5lbF9hbGxvY2F0aW9uOjB4 JTAyeCIsCj4gKwkJCSAgICAgYXVkaW9faW5mb19jYVtpdDY1MDUtPmF1ZGlvLmNoYW5uZWxfY291 bnQgLSAxXSk7Cj4gKwo+ICsJaXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0FVRF9JTkZPRlJBTV9E QjEsIGl0NjUwNS0+YXVkaW8uY2hhbm5lbF9jb3VudAo+ICsJCSAgICAgLSAxKTsKPiArCWl0NjUw NV93cml0ZShpdDY1MDUsIFJFR19BVURfSU5GT0ZSQU1fREIyLCAweDAwKTsKPiArCWl0NjUwNV93 cml0ZShpdDY1MDUsIFJFR19BVURfSU5GT0ZSQU1fREIzLAo+ICsJCSAgICAgYXVkaW9faW5mb19j YVtpdDY1MDUtPmF1ZGlvLmNoYW5uZWxfY291bnQgLSAxXSk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2 NTA1LCBSRUdfQVVEX0lORk9GUkFNX0RCNCwgMHgwMCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1 LCBSRUdfQVVEX0lORk9GUkFNX1NVTSwgMHgwMCk7Cj4gKwo+ICsJLyogRW5hYmxlIEF1ZGlvIElu Zm9GcmFtZSAqLwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0lORk9GUkFNRV9DVFJM LCBFTl9BVURfQ1RSTF9QS1QsCj4gKwkJCUVOX0FVRF9DVFJMX1BLVCk7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIGl0NjUwNV9kaXNhYmxlX2F1ZGlvKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiAr ewo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RBVEFfTVVURV9DVFJMLCBFTl9BVURf TVVURSwgRU5fQVVEX01VVEUpOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0FVRElP X1NSQ19DVFJMLCBNX0FVRElPX0kyU19FTiwgMHgwMCk7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2 NTA1LCBSRUdfSU5GT0ZSQU1FX0NUUkwsIEVOX0FVRF9DVFJMX1BLVCwgMHgwMCk7Cj4gKwlpdDY1 MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfUkVTRVRfQ1RSTCwgQVVESU9fUkVTRVQsIEFVRElPX1JF U0VUKTsKPiArCWl0NjUwNS0+ZW5hYmxlX2F1ZGlvID0gZmFsc2U7Cj4gK30KPiArCj4gK3N0YXRp YyB2b2lkIGl0NjUwNV9lbmFibGVfYXVkaW8oc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4g KwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCWludCByZWdi ZTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJzdGFydCIpOwo+ICsJaXQ2NTA1 X2Rpc2FibGVfYXVkaW8oaXQ2NTA1KTsKPiArCj4gKwlpdDY1MDVfc2V0dXBfYXVkaW9fY2hhbm5l bF9zdGF0dXMoaXQ2NTA1KTsKPiArCWl0NjUwNV9zZXR1cF9hdWRpb19mb3JtYXQoaXQ2NTA1KTsK PiArCWl0NjUwNV9lbmFibGVfYXVkaW9fc291cmNlKGl0NjUwNSk7Cj4gKwlpdDY1MDVfZW5hYmxl X2F1ZGlvX2luZm9mcmFtZShpdDY1MDUpOwo+ICsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJF R19BVURJT19OXzBfNywgMHgwMCk7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQVVESU9f Tl84XzE1LCAweDgwKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19BVURJT19OXzE2XzIz LCAweDAwKTsKPiArCj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfQVVESU9fU1JDX0NU UkwsIEFVRElPX0ZJRk9fUkVTRVQsCj4gKwkJCUFVRElPX0ZJRk9fUkVTRVQpOwo+ICsJaXQ2NTA1 X3NldF9iaXRzKGl0NjUwNSwgUkVHX0FVRElPX1NSQ19DVFJMLCBBVURJT19GSUZPX1JFU0VULCAw eDAwKTsKPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsIFJFR19SRVNFVF9DVFJMLCBBVURJT19S RVNFVCwgMHgwMCk7Cj4gKwlyZWdiZSA9IGl0NjUwNV9yZWFkKGl0NjUwNSwgUkVHX0FVRElPX0lO UFVUX0ZSRVEpOwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAicmVnYmU6MHglMDJ4IGF1 ZGlvIGlucHV0IGZzOiAlZC4lZCBrSHoiLAo+ICsJCQkgICAgIHJlZ2JlLCA2NzUwIC8gcmVnYmUs IDY3NTAwICUgcmVnYmUpOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0RBVEFfTVVU RV9DVFJMLCBFTl9BVURfTVVURSwgMHgwMCk7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGl0NjUw NV91c2Vfc3RlcF90cmFpbl9jaGVjayhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWlm IChpdDY1MDUtPmxpbmsucmV2aXNpb24gPj0gMHgxMikKPiArCQlyZXR1cm4gaXQ2NTA1LT5kcGNk W0RQX1RSQUlOSU5HX0FVWF9SRF9JTlRFUlZBTF0gPj0gMHgwMTsKPiArCj4gKwlyZXR1cm4gdHJ1 ZTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X3BhcnNlX2xpbmtfY2FwYWJpbGl0aWVz KHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0 NjUwNS0+Y2xpZW50LT5kZXY7Cj4gKwlzdHJ1Y3QgaXQ2NTA1X2RybV9kcF9saW5rICpsaW5rID0g Jml0NjUwNS0+bGluazsKPiArCWludCBiY2FwczsKPiArCj4gKwlpZiAoaXQ2NTA1LT5kcGNkWzBd ID09IDApIHsKPiArCQlpdDY1MDVfYXV4X29uKGl0NjUwNSk7Cj4gKwkJaXQ2NTA1X2dldF9kcGNk KGl0NjUwNSwgRFBfRFBDRF9SRVYsIGl0NjUwNS0+ZHBjZCwKPiArCQkJCUFSUkFZX1NJWkUoaXQ2 NTA1LT5kcGNkKSk7Cj4gKwl9Cj4gKwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiRFBD RCBSZXYuOiAlZC4lZCIsCj4gKwkJCSAgICAgbGluay0+cmV2aXNpb24gPj4gNCwgbGluay0+cmV2 aXNpb24gJiAweDBGKTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJTaW5rIG1h eCBsaW5rIHJhdGU6ICVkLiVkIEdicHMgcGVyIGxhbmUiLAo+ICsJCQkgICAgIGxpbmstPnJhdGUg LyAxMDAwMDAsIGxpbmstPnJhdGUgLyAxMDAwICUgMTAwKTsKPiArCj4gKwlpdDY1MDUtPmxpbmtf cmF0ZV9id19jb2RlID0gZHJtX2RwX2xpbmtfcmF0ZV90b19id19jb2RlKGxpbmstPnJhdGUpOwo+ ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAibGluayByYXRlIGJ3IGNvZGU6MHglMDJ4IiwK PiArCQkJICAgICBpdDY1MDUtPmxpbmtfcmF0ZV9id19jb2RlKTsKPiArCWl0NjUwNS0+bGlua19y YXRlX2J3X2NvZGUgPSBtaW4oKGludClpdDY1MDUtPmxpbmtfcmF0ZV9id19jb2RlLAo+ICsJCQkJ CU1BWF9MSU5LX1JBVEUpOwo+ICsKPiArCWl0NjUwNS0+bGFuZV9jb3VudCA9IGxpbmstPm51bV9s YW5lczsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIlNpbmsgc3VwcG9ydCAlZCBsYW5l cyB0cmFpbmluZyIsCj4gKwkJCSAgICAgaXQ2NTA1LT5sYW5lX2NvdW50KTsKPiArCWl0NjUwNS0+ bGFuZV9jb3VudCA9IG1pbigoaW50KWl0NjUwNS0+bGFuZV9jb3VudCwgTUFYX0xBTkVfQ09VTlQp Owo+ICsKPiArCWl0NjUwNS0+YnJhbmNoX2RldmljZSA9IGRybV9kcF9pc19icmFuY2goaXQ2NTA1 LT5kcGNkKTsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIlNpbmsgJXNicmFuY2ggZGV2 aWNlIiwKPiArCQkJICAgICBpdDY1MDUtPmJyYW5jaF9kZXZpY2UgPyAiIiA6ICJOb3QgIik7Cj4g Kwo+ICsJaXQ2NTA1LT5lbmFibGVfZW5oYW5jZWRfZnJhbWUgPSAhIWxpbmstPmNhcGFiaWxpdGll czsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIlNpbmsgJXNTdXBwb3J0IEVuaGFuY2Vk IEZyYW1pbmciLAo+ICsJCQkgICAgIGl0NjUwNS0+ZW5hYmxlX2VuaGFuY2VkX2ZyYW1lID8gIiIg OiAiTm90ICIpOwo+ICsKPiArCWl0NjUwNS0+ZW5hYmxlX3NzYyA9ICEhKGl0NjUwNS0+ZHBjZFtE UF9NQVhfRE9XTlNQUkVBRF0gJgo+ICsJCQkJRFBfTUFYX0RPV05TUFJFQURfMF81KTsKPiArCURS TV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIk1heGltdW0gRG93bi1TcHJlYWQ6ICVzLCAlc3N1cHBv cnQgU1NDISIsCj4gKwkJCSAgICAgaXQ2NTA1LT5lbmFibGVfc3NjID8gIjAuNSIgOiAiMCIsCj4g KwkJCSAgICAgaXQ2NTA1LT5lbmFibGVfc3NjID8gIiIgOiAiTm90ICIpOwo+ICsKPiArCWl0NjUw NS0+c3RlcF90cmFpbiA9IGl0NjUwNV91c2Vfc3RlcF90cmFpbl9jaGVjayhpdDY1MDUpOwo+ICsJ aWYgKGl0NjUwNS0+c3RlcF90cmFpbikKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJh dXRvIHRyYWluIGZhaWwsIHdpbGwgc3RlcCB0cmFpbiIpOwo+ICsKPiArCWJjYXBzID0gaXQ2NTA1 X2RwY2RfcmVhZChpdDY1MDUsIERQX0FVWF9IRENQX0JDQVBTKTsKPiArCURSTV9ERVZfREVCVUdf RFJJVkVSKGRldiwgImJjYXBzOjB4JTAyeCIsIGJjYXBzKTsKPiArCWlmIChiY2FwcyAmIERQX0JD QVBTX0hEQ1BfQ0FQQUJMRSkgewo+ICsJCWl0NjUwNS0+aXNfcmVwZWF0ZXIgPSAhIShiY2FwcyAm IERQX0JDQVBTX1JFUEVBVEVSX1BSRVNFTlQpOwo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRl diwgIlN1cHBvcnQgSERDUCEgRG93bnN0cmVhbSBpcyAlcyEiLAo+ICsJCQkJICAgICBpdDY1MDUt PmlzX3JlcGVhdGVyID8gInJlcGVhdGVyIiA6Cj4gKwkJCQkgICAgICJyZWNlaXZlciIpOwo+ICsJ fSBlbHNlIHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJTaW5rIG5vdCBzdXBwb3J0 IEhEQ1AhIik7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9zZXR1cF9zc2Mo c3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBS RUdfVFJBSU5fQ1RSTDAsIFNQUkVBRF9BTVBfNSwKPiArCQkJaXQ2NTA1LT5lbmFibGVfc3NjID8g U1BSRUFEX0FNUF81IDogMHgwMCk7Cj4gKwlpZiAoaXQ2NTA1LT5lbmFibGVfc3NjKSB7Cj4gKwkJ aXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0JBTktfU0VMLCAweDAxKTsKPiArCQlpdDY1MDVfd3Jp dGUoaXQ2NTA1LCBSRUdfU1NDX0NUUkwwLCAweDlFKTsKPiArCQlpdDY1MDVfd3JpdGUoaXQ2NTA1 LCBSRUdfU1NDX0NUUkwxLCAweDFDKTsKPiArCQlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfU1ND X0NUUkwyLCAweDQyKTsKPiArCQlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfQkFOS19TRUwsIDB4 MDApOwo+ICsJCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19TUF9DVFJMMCwgMHgwNyk7Cj4gKwkJ aXQ2NTA1X3dyaXRlKGl0NjUwNSwgUkVHX0lQX0NUUkwxLCAweDI5KTsKPiArCQlpdDY1MDVfd3Jp dGUoaXQ2NTA1LCBSRUdfSVBfQ1RSTDIsIDB4MDMpOwo+ICsJCS8qIFN0YW1wIEludGVycnVwdCBT dGVwICovCj4gKwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1RJTUVfU1RNUF9DVFJMLCBN X1NUQU1QX1NURVAsCj4gKwkJCQkweDEwKTsKPiArCQlpdDY1MDVfZHBjZF93cml0ZShpdDY1MDUs IERQX0RPV05TUFJFQURfQ1RSTCwKPiArCQkJCSAgRFBfU1BSRUFEX0FNUF8wXzUpOwo+ICsJfSBl bHNlIHsKPiArCQlpdDY1MDVfZHBjZF93cml0ZShpdDY1MDUsIERQX0RPV05TUFJFQURfQ1RSTCwg MHgwMCk7Cj4gKwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1RJTUVfU1RNUF9DVFJMLCBN X1NUQU1QX1NURVAsCj4gKwkJCQkweDAwKTsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIGlubGlu ZSB2b2lkIGl0NjUwNV9saW5rX3JhdGVfc2V0dXAoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7 Cj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfVFJBSU5fQ1RSTDAsIEZPUkNFX0xCUiwK PiArCQkJKGl0NjUwNS0+bGlua19yYXRlX2J3X2NvZGUgPT0gUkJSKSA/IEZPUkNFX0xCUiA6IDB4 MDApOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX0xJTktfRFJWLCBEUlZfSFMsCj4g KwkJCShpdDY1MDUtPmxpbmtfcmF0ZV9id19jb2RlID09IFJCUikgPyAweDAwIDogRFJWX0hTKTsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2xhbmVfY291bnRfc2V0dXAoc3RydWN0IGl0 NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpdDY1MDVfZ2V0X2V4dGNvbl9wcm9wZXJ0eShpdDY1MDUp Owo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1RSQUlOX0NUUkwwLCBMQU5FX1NXQVAs Cj4gKwkJCWl0NjUwNS0+bGFuZV9zd2FwID8gTEFORV9TV0FQIDogMHgwMCk7Cj4gKwlpdDY1MDVf c2V0X2JpdHMoaXQ2NTA1LCBSRUdfVFJBSU5fQ1RSTDAsIExBTkVfQ09VTlRfTUFTSywKPiArCQkJ KGl0NjUwNS0+bGFuZV9jb3VudCAtIDEpIDw8IDEpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBp dDY1MDVfbGlua190cmFpbmluZ19zZXR1cChzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiAr CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsKPiArCWlmIChp dDY1MDUtPmVuYWJsZV9lbmhhbmNlZF9mcmFtZSkKPiArCQlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1 LCBSRUdfREFUQV9NVVRFX0NUUkwsCj4gKwkJCQlFTkFCTEVfRU5IQU5DRURfRlJBTUUsIEVOQUJM RV9FTkhBTkNFRF9GUkFNRSk7Cj4gKwo+ICsJaXQ2NTA1X2xpbmtfcmF0ZV9zZXR1cChpdDY1MDUp Owo+ICsJaXQ2NTA1X2xhbmVfY291bnRfc2V0dXAoaXQ2NTA1KTsKPiArCWl0NjUwNV9zZXR1cF9z c2MoaXQ2NTA1KTsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwKPiArCQkJICAgICAiJXMs ICVkIGxhbmVzLCAlc2FibGUgc3NjLCAlc2FibGUgZW5oYW5jZWQgZnJhbWUiLAo+ICsJCQkgICAg IGl0NjUwNS0+bGlua19yYXRlX2J3X2NvZGUgIT0gUkJSID8gIkhCUiIgOiAiUkJSIiwKPiArCQkJ ICAgICBpdDY1MDUtPmxhbmVfY291bnQsCj4gKwkJCSAgICAgaXQ2NTA1LT5lbmFibGVfc3NjID8g ImVuIiA6ICJkaXMiLAo+ICsJCQkgICAgIGl0NjUwNS0+ZW5hYmxlX2VuaGFuY2VkX2ZyYW1lID8g ImVuIiA6ICJkaXMiKTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgaXQ2NTA1X2xpbmtfc3RhcnRf YXV0b190cmFpbihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWludCB0aW1lb3V0ID0g NTAwLCBsaW5rX3RyYWluaW5nX3N0YXRlOwo+ICsKPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUs IFJFR19UUkFJTl9DVFJMMCwKPiArCQkJCUZPUkNFX0NSX0RPTkUgfCBGT1JDRV9FUV9ET05FLCAw eDAwKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19UUkFJTl9DVFJMMSwgRk9SQ0VfUkVU UkFJTik7Cj4gKwlpdDY1MDVfd3JpdGUoaXQ2NTA1LCBSRUdfVFJBSU5fQ1RSTDEsIEFVVE9fVFJB SU4pOwo+ICsKPiArCXdoaWxlICh0aW1lb3V0ID4gMCkgewo+ICsJCXVzbGVlcF9yYW5nZSgxMDAw LCAyMDAwKTsKPiArCQlsaW5rX3RyYWluaW5nX3N0YXRlID0gaXQ2NTA1X3JlYWQoaXQ2NTA1LCBS RUdfTElOS19UUkFJTl9TVFMpOwo+ICsKPiArCQlpZiAoKGxpbmtfdHJhaW5pbmdfc3RhdGUgPiAw KSAmJgo+ICsJCSAgICAobGlua190cmFpbmluZ19zdGF0ZSAmIExJTktfU1RBVEVfTk9SUCkpCj4g KwkJCXJldHVybiB0cnVlOwo+ICsKPiArCQl0aW1lb3V0LS07Cj4gKwl9Cj4gKwo+ICsJcmV0dXJu IGZhbHNlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGl0NjUwNV9kcm1fZHBfbGlua19jb25maWd1 cmUoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwl1OCB2YWx1ZXNbMl07Cj4gKwlpbnQg ZXJyOwo+ICsJc3RydWN0IGRybV9kcF9hdXggKmF1eCA9ICZpdDY1MDUtPmF1eDsKPiArCj4gKwl2 YWx1ZXNbMF0gPSBpdDY1MDUtPmxpbmtfcmF0ZV9id19jb2RlOwo+ICsJdmFsdWVzWzFdID0gaXQ2 NTA1LT5sYW5lX2NvdW50Owo+ICsKPiArCWlmIChpdDY1MDUtPmVuYWJsZV9lbmhhbmNlZF9mcmFt ZSkKPiArCQl2YWx1ZXNbMV0gfD0gRFBfTEFORV9DT1VOVF9FTkhBTkNFRF9GUkFNRV9FTjsKPiAr Cj4gKwllcnIgPSBkcm1fZHBfZHBjZF93cml0ZShhdXgsIERQX0xJTktfQldfU0VULCB2YWx1ZXMs IHNpemVvZih2YWx1ZXMpKTsKPiArCWlmIChlcnIgPCAwKQo+ICsJCXJldHVybiBlcnI7Cj4gKwo+ ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB1OCBkcF9saW5rX3N0YXR1cyhjb25zdCB1 OCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXSwgaW50IHIpCj4gK3sKPiArCXJldHVy biBsaW5rX3N0YXR1c1tyIC0gRFBfTEFORTBfMV9TVEFUVVNdOwo+ICt9Cj4gKwo+ICtzdGF0aWMg Ym9vbCBpdDY1MDVfY2hlY2tfbWF4X3ZhbHVlKGVudW0gbWF4X3ZhbHVlX2NoZWNrIHR5cGUsCj4g KwkJCQkgICB1OCBsYW5lX3ZvbHRhZ2Vfc3dpbmdfcHJlX2VtcGhhc2lzKQo+ICt7Cj4gKwlpZiAo dHlwZSA9PSBWT0xUQUdFX1NXSU5HKQo+ICsJCXJldHVybiAoKGxhbmVfdm9sdGFnZV9zd2luZ19w cmVfZW1waGFzaXMgJiAweDAzKSA9PQo+ICsJCQlNQVhfQ1JfTEVWRUwpOwo+ICsJZWxzZQo+ICsJ CXJldHVybiAoKGxhbmVfdm9sdGFnZV9zd2luZ19wcmVfZW1waGFzaXMgJiAweDAzKSA9PQo+ICsJ CQlNQVhfRVFfTEVWRUwpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgYm9vbCBpdDY1MDVfY2hlY2tfbWF4 X3ZvbHRhZ2Vfc3dpbmdfcmVhY2hlZCh1OCAqbGFuZV92b2x0YWdlX3N3aW5nLAo+ICsJCQkJCQkg ICB1OCBsYW5lX2NvdW50KQo+ICt7Cj4gKwl1OCBpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBs YW5lX2NvdW50OyBpKyspIHsKPiArCQlpZiAobGFuZV92b2x0YWdlX3N3aW5nW2ldICYgRFBfVFJB SU5fTUFYX1NXSU5HX1JFQUNIRUQpCj4gKwkJCXJldHVybiB0cnVlOwo+ICsJfQo+ICsKPiArCXJl dHVybiBmYWxzZTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgaXQ2NTA1X3N0ZXBfdHJhaW5fbGFu ZV92b2x0YWdlX3ByZV9lbXBoYXNpc19zZXQoCj4gKwlzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsCj4g KwlzdHJ1Y3QgaXQ2NTA1X3N0ZXBfdHJhaW5fcGFyYSAqbGFuZV92b2x0YWdlX3ByZV9lbXBoYXNp cywKPiArCXU4ICpsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzX3NldCkKPiArewo+ICsJdTggaTsK PiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgaXQ2NTA1LT5sYW5lX2NvdW50OyBpKyspIHsKPiArCQls YW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2ldICY9IDB4MDM7Cj4gKwkJ bGFuZV92b2x0YWdlX3ByZV9lbXBoYXNpc19zZXRbaV0gPQo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJl X2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2ldOwo+ICsJCWlmIChpdDY1MDVfY2hlY2tfbWF4X3Zh bHVlKAo+ICsJCQkgICAgVk9MVEFHRV9TV0lORywKPiArCQkJICAgIGxhbmVfdm9sdGFnZV9wcmVf ZW1waGFzaXMtPnZvbHRhZ2Vfc3dpbmdbaV0pKQo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhh c2lzX3NldFtpXSB8PQo+ICsJCQkJRFBfVFJBSU5fTUFYX1NXSU5HX1JFQUNIRUQ7Cj4gKwo+ICsJ CWxhbmVfdm9sdGFnZV9wcmVfZW1waGFzaXMtPnByZV9lbXBoYXNpc1tpXSAmPSAweDAzOwo+ICsJ CWxhbmVfdm9sdGFnZV9wcmVfZW1waGFzaXNfc2V0W2ldIHw9Cj4gKwkJCWxhbmVfdm9sdGFnZV9w cmVfZW1waGFzaXMtPnByZV9lbXBoYXNpc1tpXQo+ICsJCQk8PCBEUF9UUkFJTl9QUkVfRU1QSEFT SVNfU0hJRlQ7Cj4gKwkJaWYgKGl0NjUwNV9jaGVja19tYXhfdmFsdWUoCj4gKwkJCSAgICBQUkVf RU1QSEFTSVMsCj4gKwkJCSAgICBsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT5wcmVfZW1waGFz aXNbaV0pKQo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzX3NldFtpXSB8PQo+ICsJCQkJ RFBfVFJBSU5fTUFYX1BSRV9FTVBIQVNJU19SRUFDSEVEOwo+ICsJCWl0NjUwNV9kcGNkX3dyaXRl KGl0NjUwNSwgRFBfVFJBSU5JTkdfTEFORTBfU0VUICsgaSwKPiArCQkJCSAgbGFuZV92b2x0YWdl X3ByZV9lbXBoYXNpc19zZXRbaV0pOwo+ICsKPiArCQlpZiAobGFuZV92b2x0YWdlX3ByZV9lbXBo YXNpc19zZXRbaV0gIT0KPiArCQkgICAgaXQ2NTA1X2RwY2RfcmVhZChpdDY1MDUsIERQX1RSQUlO SU5HX0xBTkUwX1NFVCArIGkpKQo+ICsJCQlyZXR1cm4gZmFsc2U7Cj4gKwl9Cj4gKwo+ICsJcmV0 dXJuIHRydWU7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sCj4gK2l0NjUwNV9zdGVwX2NyX3RyYWlu KHN0cnVjdCBpdDY1MDUgKml0NjUwNSwKPiArCQkgICAgIHN0cnVjdCBpdDY1MDVfc3RlcF90cmFp bl9wYXJhICpsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzKQo+ICt7Cj4gKwl1OCBsb29wX2NvdW50 ID0gMCwgaSA9IDAsIGo7Cj4gKwl1OCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXSA9 IHsgMCB9Owo+ICsJdTggbGFuZV9sZXZlbF9jb25maWdbTUFYX0xBTkVfQ09VTlRdID0geyAwIH07 Cj4gKwlpbnQgcHJlX2VtcGhhc2lzX2FkanVzdCA9IC0xLCB2b2x0YWdlX3N3aW5nX2FkanVzdCA9 IC0xOwo+ICsKPiArCWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwgRFBfRE9XTlNQUkVBRF9DVFJM LAo+ICsJCQkgIGl0NjUwNS0+ZW5hYmxlX3NzYyA/IERQX1NQUkVBRF9BTVBfMF81IDogMHgwMCk7 Cj4gKwlpdDY1MDVfZHBjZF93cml0ZShpdDY1MDUsIERQX1RSQUlOSU5HX1BBVFRFUk5fU0VULAo+ ICsJCQkgIERQX1RSQUlOSU5HX1BBVFRFUk5fMSk7Cj4gKwo+ICsJd2hpbGUgKGxvb3BfY291bnQg PCA1ICYmIGkgPCAxMCkgewo+ICsJCWkrKzsKPiArCQlpZiAoIWl0NjUwNV9zdGVwX3RyYWluX2xh bmVfdm9sdGFnZV9wcmVfZW1waGFzaXNfc2V0KAo+ICsJCQkgICAgaXQ2NTA1LCBsYW5lX3ZvbHRh Z2VfcHJlX2VtcGhhc2lzLAo+ICsJCQkgICAgbGFuZV9sZXZlbF9jb25maWcpKQo+ICsJCQljb250 aW51ZTsKPiArCQlkcm1fZHBfbGlua190cmFpbl9jbG9ja19yZWNvdmVyeV9kZWxheShpdDY1MDUt PmRwY2QpOwo+ICsJCWRybV9kcF9kcGNkX3JlYWRfbGlua19zdGF0dXMoJml0NjUwNS0+YXV4LCBs aW5rX3N0YXR1cyk7Cj4gKwo+ICsJCWlmIChkcm1fZHBfY2xvY2tfcmVjb3Zlcnlfb2sobGlua19z dGF0dXMsIGl0NjUwNS0+bGFuZV9jb3VudCkpIHsKPiArCQkJaXQ2NTA1X3NldF9iaXRzKGl0NjUw NSwgUkVHX1RSQUlOX0NUUkwwLCBGT1JDRV9DUl9ET05FLAo+ICsJCQkJCUZPUkNFX0NSX0RPTkUp Owo+ICsJCQlyZXR1cm4gdHJ1ZTsKPiArCQl9Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoJml0 NjUwNS0+Y2xpZW50LT5kZXYsICJjciBub3QgZG9uZSIpOwo+ICsKPiArCQlpZiAoaXQ2NTA1X2No ZWNrX21heF92b2x0YWdlX3N3aW5nX3JlYWNoZWQobGFuZV9sZXZlbF9jb25maWcsCj4gKwkJCQkJ CQkgICBpdDY1MDUtPmxhbmVfY291bnQpKQo+ICsJCQlnb3RvIGNyX3RyYWluX2ZhaWw7Cj4gKwo+ ICsJCWZvciAoaiA9IDA7IGogPCBpdDY1MDUtPmxhbmVfY291bnQ7IGorKykgewo+ICsJCQlsYW5l X3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2pdID0KPiArCQkJCWRybV9kcF9n ZXRfYWRqdXN0X3JlcXVlc3Rfdm9sdGFnZShsaW5rX3N0YXR1cywKPiArCQkJCQkJCQkgIGopID4+ Cj4gKwkJCQlEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX1NISUZUOwo+ICsJCQlsYW5lX3ZvbHRhZ2Vf cHJlX2VtcGhhc2lzLT5wcmVfZW1waGFzaXNbal0gPQo+ICsJCQkJZHJtX2RwX2dldF9hZGp1c3Rf cmVxdWVzdF9wcmVfZW1waGFzaXMoCj4gKwkJCQkJbGlua19zdGF0dXMsIGopID4+Cj4gKwkJCQlE UF9UUkFJTl9QUkVfRU1QSEFTSVNfU0hJRlQ7Cj4gKwkJCWlmICgodm9sdGFnZV9zd2luZ19hZGp1 c3QgPT0KPiArCQkJICAgICBsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT52b2x0YWdlX3N3aW5n W2pdKSAmJgo+ICsJCQkgICAgKHByZV9lbXBoYXNpc19hZGp1c3QgPT0KPiArCQkJICAgICBsYW5l X3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT5wcmVfZW1waGFzaXNbal0pKSB7Cj4gKwkJCQlsb29wX2Nv dW50Kys7Cj4gKwkJCQljb250aW51ZTsKPiArCQkJfQo+ICsKPiArCQkJdm9sdGFnZV9zd2luZ19h ZGp1c3QgPQo+ICsJCQkJbGFuZV92b2x0YWdlX3ByZV9lbXBoYXNpcy0+dm9sdGFnZV9zd2luZ1tq XTsKPiArCQkJcHJlX2VtcGhhc2lzX2FkanVzdCA9Cj4gKwkJCQlsYW5lX3ZvbHRhZ2VfcHJlX2Vt cGhhc2lzLT5wcmVfZW1waGFzaXNbal07Cj4gKwkJCWxvb3BfY291bnQgPSAwOwo+ICsKPiArCQkJ aWYgKHZvbHRhZ2Vfc3dpbmdfYWRqdXN0ICsgcHJlX2VtcGhhc2lzX2FkanVzdCA+IDB4MDMpCj4g KwkJCQlsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2pdID0KPiArCQkJ CQlNQVhfRVFfTEVWRUwgLQo+ICsJCQkJCWxhbmVfdm9sdGFnZV9wcmVfZW1waGFzaXMKPiArCQkJ CQkJLT5wcmVfZW1waGFzaXNbal07Cj4gKwkJfQo+ICsJfQo+ICsKPiArY3JfdHJhaW5fZmFpbDoK PiArCWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4g KwkJCSAgRFBfVFJBSU5JTkdfUEFUVEVSTl9ESVNBQkxFKTsKPiArCj4gKwlyZXR1cm4gZmFsc2U7 Cj4gK30KPiArCj4gK3N0YXRpYyBib29sCj4gK2l0NjUwNV9zdGVwX2VxX3RyYWluKHN0cnVjdCBp dDY1MDUgKml0NjUwNSwKPiArCQkgICAgIHN0cnVjdCBpdDY1MDVfc3RlcF90cmFpbl9wYXJhICps YW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzKQo+ICt7Cj4gKwl1OCBsb29wX2NvdW50ID0gMCwgaSwg bGlua19zdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRV0gPSB7IDAgfTsKPiArCXU4IGxhbmVfbGV2 ZWxfY29uZmlnW01BWF9MQU5FX0NPVU5UXSA9IHsgMCB9Owo+ICsKPiArCWl0NjUwNV9kcGNkX3dy aXRlKGl0NjUwNSwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4gKwkJCSAgRFBfVFJBSU5JTkdf UEFUVEVSTl8yKTsKPiArCj4gKwl3aGlsZSAobG9vcF9jb3VudCA8IDYpIHsKPiArCQlsb29wX2Nv dW50Kys7Cj4gKwo+ICsJCWlmICghaXQ2NTA1X3N0ZXBfdHJhaW5fbGFuZV92b2x0YWdlX3ByZV9l bXBoYXNpc19zZXQoCj4gKwkJCSAgICBpdDY1MDUsIGxhbmVfdm9sdGFnZV9wcmVfZW1waGFzaXMs Cj4gKwkJCSAgICBsYW5lX2xldmVsX2NvbmZpZykpCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQlk cm1fZHBfbGlua190cmFpbl9jaGFubmVsX2VxX2RlbGF5KGl0NjUwNS0+ZHBjZCk7Cj4gKwkJZHJt X2RwX2RwY2RfcmVhZF9saW5rX3N0YXR1cygmaXQ2NTA1LT5hdXgsIGxpbmtfc3RhdHVzKTsKPiAr Cj4gKwkJaWYgKCFkcm1fZHBfY2xvY2tfcmVjb3Zlcnlfb2sobGlua19zdGF0dXMsIGl0NjUwNS0+ bGFuZV9jb3VudCkpCj4gKwkJCWdvdG8gZXFfdHJhaW5fZmFpbDsKPiArCj4gKwkJaWYgKGRybV9k cF9jaGFubmVsX2VxX29rKGxpbmtfc3RhdHVzLCBpdDY1MDUtPmxhbmVfY291bnQpKSB7Cj4gKwkJ CWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4gKwkJ CQkJICBEUF9UUkFJTklOR19QQVRURVJOX0RJU0FCTEUpOwo+ICsJCQlpdDY1MDVfc2V0X2JpdHMo aXQ2NTA1LCBSRUdfVFJBSU5fQ1RSTDAsIEZPUkNFX0VRX0RPTkUsCj4gKwkJCQkJRk9SQ0VfRVFf RE9ORSk7Cj4gKwkJCXJldHVybiB0cnVlOwo+ICsJCX0KPiArCQlEUk1fREVWX0RFQlVHX0RSSVZF UigmaXQ2NTA1LT5jbGllbnQtPmRldiwgImVxIG5vdCBkb25lIik7Cj4gKwo+ICsJCWZvciAoaSA9 IDA7IGkgPCBpdDY1MDUtPmxhbmVfY291bnQ7IGkrKykgewo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJl X2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2ldID0KPiArCQkJCWRybV9kcF9nZXRfYWRqdXN0X3Jl cXVlc3Rfdm9sdGFnZShsaW5rX3N0YXR1cywKPiArCQkJCQkJCQkgIGkpID4+Cj4gKwkJCQlEUF9U UkFJTl9WT0xUQUdFX1NXSU5HX1NISUZUOwo+ICsJCQlsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lz LT5wcmVfZW1waGFzaXNbaV0gPQo+ICsJCQkJZHJtX2RwX2dldF9hZGp1c3RfcmVxdWVzdF9wcmVf ZW1waGFzaXMoCj4gKwkJCQkJbGlua19zdGF0dXMsIGkpID4+Cj4gKwkJCQlEUF9UUkFJTl9QUkVf RU1QSEFTSVNfU0hJRlQ7Cj4gKwo+ICsJCQlpZiAobGFuZV92b2x0YWdlX3ByZV9lbXBoYXNpcy0+ dm9sdGFnZV9zd2luZ1tpXSArCj4gKwkJCQkgICAgbGFuZV92b2x0YWdlX3ByZV9lbXBoYXNpcy0+ cHJlX2VtcGhhc2lzW2ldID4KPiArCQkJICAgIDB4MDMpCj4gKwkJCQlsYW5lX3ZvbHRhZ2VfcHJl X2VtcGhhc2lzLT52b2x0YWdlX3N3aW5nW2ldID0KPiArCQkJCQkweDAzIC0gbGFuZV92b2x0YWdl X3ByZV9lbXBoYXNpcwo+ICsJCQkJCQkgICAgICAgLT5wcmVfZW1waGFzaXNbaV07Cj4gKwkJfQo+ ICsJfQo+ICsKPiArZXFfdHJhaW5fZmFpbDoKPiArCWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwg RFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4gKwkJCSAgRFBfVFJBSU5JTkdfUEFUVEVSTl9ESVNB QkxFKTsKPiArCXJldHVybiBmYWxzZTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgaXQ2NTA1X2xp bmtfc3RhcnRfc3RlcF90cmFpbihzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWludCBl cnI7Cj4gKwlzdHJ1Y3QgaXQ2NTA1X3N0ZXBfdHJhaW5fcGFyYSBsYW5lX3ZvbHRhZ2VfcHJlX2Vt cGhhc2lzID0gewo+ICsJCS52b2x0YWdlX3N3aW5nID0geyAwIH0sCj4gKwkJLnByZV9lbXBoYXNp cyA9IHsgMCB9LAo+ICsJfTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUigmaXQ2NTA1LT5j bGllbnQtPmRldiwgInN0YXJ0Iik7Cj4gKwllcnIgPSBpdDY1MDVfZHJtX2RwX2xpbmtfY29uZmln dXJlKGl0NjUwNSk7Cj4gKwo+ICsJaWYgKGVyciAhPSAwKQo+ICsJCXJldHVybiBmYWxzZTsKPiAr CWlmICghaXQ2NTA1X3N0ZXBfY3JfdHJhaW4oaXQ2NTA1LCAmbGFuZV92b2x0YWdlX3ByZV9lbXBo YXNpcykpCj4gKwkJcmV0dXJuIGZhbHNlOwo+ICsJaWYgKCFpdDY1MDVfc3RlcF9lcV90cmFpbihp dDY1MDUsICZsYW5lX3ZvbHRhZ2VfcHJlX2VtcGhhc2lzKSkKPiArCQlyZXR1cm4gZmFsc2U7Cj4g KwlyZXR1cm4gdHJ1ZTsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgaXQ2NTA1X2dldF92aWRlb19z dGF0dXMoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpbnQgcmVnXzBkOwo+ICsKPiAr CXJlZ18wZCA9IGl0NjUwNV9yZWFkKGl0NjUwNSwgUkVHX1NZU1RFTV9TVFMpOwo+ICsKPiArCWlm IChyZWdfMGQgPCAwKQo+ICsJCXJldHVybiBmYWxzZTsKPiArCj4gKwlyZXR1cm4gKHJlZ18wZCAm IFZJREVPX1NUQikgPyB0cnVlIDogZmFsc2U7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUw NV9yZXNldF9oZGNwKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJLyogRGlzYWJsZSBD UF9EZXNpcmVkICovCj4gKwlpdDY1MDVfc2V0X2JpdHMoaXQ2NTA1LCBSRUdfSERDUF9DVFJMMSwg SERDUF9DUF9FTkFCTEUsIDB4MDApOwo+ICsJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1JF U0VUX0NUUkwsIEhEQ1BfUkVTRVQsIEhEQ1BfUkVTRVQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9p ZCBpdDY1MDVfc3RvcF9saW5rX3RyYWluKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiArewo+ICsJ aXQ2NTA1LT5saW5rX3N0YXRlID0gTElOS19JRExFOwo+ICsJY2FuY2VsX3dvcmtfc3luYygmaXQ2 NTA1LT5saW5rX3dvcmtzKTsKPiArCWl0NjUwNV93cml0ZShpdDY1MDUsIFJFR19UUkFJTl9DVFJM MSwgRk9SQ0VfUkVUUkFJTik7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9saW5rX3Ry YWluaW5nX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICt7Cj4gKwlzdHJ1Y3QgaXQ2 NTA1ICppdDY1MDUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGl0NjUwNSwgbGlua193b3Jr cyk7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCWlu dCBlcnIsIGksIHN0ZXBfcmV0cnkgPSAzOwo+ICsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRl diwgIml0NjUwNS0+c2lua19jb3VudDogJWQiLAo+ICsJCQkgICAgIGl0NjUwNS0+c2lua19jb3Vu dCk7Cj4gKwo+ICsKPiArCWlmICghaXQ2NTA1X2dldF9zaW5rX2hwZF9zdGF0dXMoaXQ2NTA1KSkK PiArCQlyZXR1cm47Cj4gKwo+ICsJaXQ2NTA1X2xpbmtfdHJhaW5pbmdfc2V0dXAoaXQ2NTA1KTsK PiArCj4gKwlpZiAoaXQ2NTA1LT5hdXRvX3RyYWluX3JldHJ5IDwgMSkKPiArCQlnb3RvIHN0ZXBf dHJhaW47Cj4gKwo+ICsJaXQ2NTA1X3Jlc2V0X2hkY3AoaXQ2NTA1KTsKPiArCWl0NjUwNV9hdXhf cmVzZXQoaXQ2NTA1KTsKPiArCWVyciA9IGl0NjUwNV9saW5rX3N0YXJ0X2F1dG9fdHJhaW4oaXQ2 NTA1KTsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgImF1dG8gdHJhaW4gJXMsIGF1dG9f dHJhaW5fcmV0cnk6ICVkIiwKPiArCQkJICAgICBlcnIgPyAicGFzcyIgOiAiZmFpbGVkIiwgaXQ2 NTA1LT5hdXRvX3RyYWluX3JldHJ5KTsKPiArCWl0NjUwNS0+YXV0b190cmFpbl9yZXRyeS0tOwo+ ICsKPiArCWlmIChlcnIpCj4gKwkJZ290byBsaW5rX3RyYWluX29rOwo+ICsKPiArCWl0NjUwNV9k dW1wKGl0NjUwNSk7Cj4gKwlyZXR1cm47Cj4gKwo+ICtzdGVwX3RyYWluOgo+ICsJRFJNX0RFVl9E RUJVR19EUklWRVIoZGV2LCAiU3RhcnQgc3RlcCB0cmFpbiIpOwo+ICsKPiArCWlmIChpdDY1MDUt PnNpbmtfY291bnQgPT0gMCkgewo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIml0NjUw NS0+c2lua19jb3VudDolZCwgZm9yY2UgZXEiLAo+ICsJCQkJICAgICBpdDY1MDUtPnNpbmtfY291 bnQpOwo+ICsJCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUsCVJFR19UUkFJTl9DVFJMMCwgRk9SQ0Vf RVFfRE9ORSwKPiArCQkJCUZPUkNFX0VRX0RPTkUpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4g KwlpZiAoIWl0NjUwNS0+c3RlcF90cmFpbikKPiArCQlnb3RvIGxpbmtfdHJhaW5fZXJyb3I7Cj4g Kwo+ICsJLyogc2V0cCB0cmFpbmluZyBzdGFydCBoZXJlICovCj4gKwlmb3IgKGkgPSAwOyBpIDwg c3RlcF9yZXRyeTsgaSsrKSB7Cj4gKwkJaXQ2NTA1X3NldF9iaXRzKGl0NjUwNSwgUkVHX1RSQUlO X0NUUkwwLAo+ICsJCQkJRk9SQ0VfQ1JfRE9ORSB8IEZPUkNFX0VRX0RPTkUsIDB4MDApOwo+ICsJ CWl0NjUwNV9kcGNkX3dyaXRlKGl0NjUwNSwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsCj4gKwkJ CQkgIERQX1RSQUlOSU5HX1BBVFRFUk5fRElTQUJMRSk7Cj4gKwkJZXJyID0gaXQ2NTA1X2xpbmtf c3RhcnRfc3RlcF90cmFpbihpdDY1MDUpOwo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwg InN0ZXAgdHJhaW4gJXMsIHJldHJ5OiVkIHRpbWVzIiwKPiArCQkJCSAgICAgZXJyID8gInBhc3Mi IDogImZhaWxlZCIsIGkgKyAxKTsKPiArCQlpZiAoZXJyKQo+ICsJCQlnb3RvIGxpbmtfdHJhaW5f b2s7Cj4gKwl9Cj4gKwo+ICtsaW5rX3RyYWluX2Vycm9yOgo+ICsJRFJNX0RFVl9ERUJVR19EUklW RVIoZGV2LCAidHJhaW5pbmcgZmFpbCIpOwo+ICsJaXQ2NTA1LT5saW5rX3N0YXRlID0gTElOS19J RExFOwo+ICsKPiArCWlmICghaXQ2NTA1X2dldF92aWRlb19zdGF0dXMoaXQ2NTA1KSkKPiArCQlp dDY1MDVfdmlkZW9fcmVzZXQoaXQ2NTA1KTsKPiArCXJldHVybjsKPiArCj4gK2xpbmtfdHJhaW5f b2s6Cj4gKwo+ICsJaXQ2NTA1LT5saW5rX3N0YXRlID0gTElOS19PSzsKPiArCS8qIGRpc2FsYmUg bXV0ZSBlbmFibGUgYXZpIGluZm8gZnJhbWUgKi8KPiArCWl0NjUwNV9zZXRfYml0cyhpdDY1MDUs IFJFR19EQVRBX01VVEVfQ1RSTCwgRU5fVklEX01VVEUsIDB4MDApOwo+ICsJaXQ2NTA1X3NldF9i aXRzKGl0NjUwNSwgUkVHX0lORk9GUkFNRV9DVFJMLAo+ICsJCQlFTl9WSURfQ1RSTF9QS1QsIEVO X1ZJRF9DVFJMX1BLVCk7Cj4gKwo+ICsJaWYgKGl0NjUwNV9hdWRpb19pbnB1dChpdDY1MDUpKSB7 Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiRW5hYmxlIGF1ZGlvISIpOwo+ICsJCWl0 NjUwNV9lbmFibGVfYXVkaW8oaXQ2NTA1KTsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQg aXQ2NTA1X3BsdWdnZWRfc3RhdHVzX3RvX2NvZGVjKHN0cnVjdCBpdDY1MDUgKml0NjUwNSkKPiAr ewo+ICsJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXMgPSBpdDY1MDUtPmNvbm5lY3Rv cl9zdGF0dXM7Cj4gKwo+ICsJaWYgKGl0NjUwNS0+cGx1Z2dlZF9jYiAmJiBpdDY1MDUtPmNvZGVj X2RldikKPiArCQlpdDY1MDUtPnBsdWdnZWRfY2IoaXQ2NTA1LT5jb2RlY19kZXYsCj4gKwkJCQkg ICBzdGF0dXMgPT0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQpOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50IGl0NjUwNV9wcm9jc3NfaHBkX2lycShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sK PiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsJaW50IHJl dCwgZHBjZF9zaW5rX2NvdW50LCBkcF9pcnFfdmVjdG9yOwo+ICsJdTggbGlua19zdGF0dXNbRFBf TElOS19TVEFUVVNfU0laRV07Cj4gKwo+ICsJaWYgKCFpdDY1MDVfZ2V0X3NpbmtfaHBkX3N0YXR1 cyhpdDY1MDUpKSB7Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiSFBEX0lSUSBIUEQg bG93Iik7Cj4gKwkJaXQ2NTA1LT5zaW5rX2NvdW50ID0gMDsKPiArCQlyZXR1cm4gMDsKPiArCX0K PiArCj4gKwlyZXQgPSBpdDY1MDVfZHBjZF9yZWFkKGl0NjUwNSwgRFBfU0lOS19DT1VOVCk7Cj4g KwlpZiAocmV0IDwgMCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCWRwY2Rfc2lua19jb3VudCA9 IERQX0dFVF9TSU5LX0NPVU5UKHJldCk7Cj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJk cGNkX3NpbmtfY291bnQ6ICVkIGl0NjUwNS0+c2lua19jb3VudDolZCIsCj4gKwkJCSAgICAgZHBj ZF9zaW5rX2NvdW50LCBpdDY1MDUtPnNpbmtfY291bnQpOwo+ICsKPiArCWlmIChpdDY1MDUtPmJy YW5jaF9kZXZpY2UgJiYgZHBjZF9zaW5rX2NvdW50ICE9IGl0NjUwNS0+c2lua19jb3VudCkgewo+ ICsJCW1lbXNldChpdDY1MDUtPmRwY2QsIDAsIHNpemVvZihpdDY1MDUtPmRwY2QpKTsKPiArCQlp dDY1MDUtPnNpbmtfY291bnQgPSBkcGNkX3NpbmtfY291bnQ7Cj4gKwkJa2ZyZWUoaXQ2NTA1LT5l ZGlkKTsKPiArCQlpdDY1MDUtPmVkaWQgPSBOVUxMOwo+ICsJCWl0NjUwNV9yZXNldF9sb2dpYyhp dDY1MDUpOwo+ICsJCWl0NjUwNV9pbnRfbWFza19lbmFibGUoaXQ2NTA1KTsKPiArCQlpdDY1MDVf aW5pdChpdDY1MDUpOwo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICsKPiArCWRwX2lycV92ZWN0b3Ig PSBpdDY1MDVfZHBjZF9yZWFkKGl0NjUwNSwgRFBfREVWSUNFX1NFUlZJQ0VfSVJRX1ZFQ1RPUik7 Cj4gKwlpZiAoZHBfaXJxX3ZlY3RvciA8IDApCj4gKwkJcmV0dXJuIGRwX2lycV92ZWN0b3I7Cj4g Kwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiZHBfaXJxX3ZlY3RvciA9IDB4JTAyeCIs IGRwX2lycV92ZWN0b3IpOwo+ICsKPiArCS8qIG5vIG5lZWQgdG8gY2hlY2sgbGluayBzdGF0dXMg aWYgbm8gdHJhaW5pbmcgKi8KPiArCWlmIChpdDY1MDUtPmxpbmtfc3RhdGUgPT0gTElOS19PSykg ewo+ICsJCXJldCA9IGRybV9kcF9kcGNkX3JlYWRfbGlua19zdGF0dXMoJml0NjUwNS0+YXV4LCBs aW5rX3N0YXR1cyk7Cj4gKwkJaWYgKHJldCA8IDApIHsKPiArCQkJRFJNX0RFVl9FUlJPUihkZXYs ICJGYWlsIHRvIHJlYWQgbGluayBzdGF0dXMgcmV0OiAlZCIsCj4gKwkJCQkgICAgICByZXQpOwo+ ICsJCQlyZXR1cm4gcmV0Owo+ICsJCX0KPiArCj4gKwkJaWYgKGRwX2xpbmtfc3RhdHVzKGxpbmtf c3RhdHVzLCBEUF9MQU5FX0FMSUdOX1NUQVRVU19VUERBVEVEKSAmCj4gKwkJICAgIERQX0xJTktf U1RBVFVTX1VQREFURUQpIHsKPiArCQkJaWYgKCFkcm1fZHBfY2hhbm5lbF9lcV9vayhsaW5rX3N0 YXR1cywKPiArCQkJCQkJICBpdDY1MDUtPmxhbmVfY291bnQpKQo+ICsJCQkJaXQ2NTA1X3ZpZGVv X3Jlc2V0KGl0NjUwNSk7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBpdDY1MDVfY2hlY2tfcmVnMDYoc3RydWN0IGl0NjUwNSAqaXQ2NTA1LCB1 bnNpZ25lZCBpbnQgcmVnMDYpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUt PmNsaWVudC0+ZGV2Owo+ICsJYm9vbCBkYXRhOwo+ICsKPiArCWlmIChyZWcwNiAmIElOVF9IUERf Q0hBTkdFKSB7Cj4gKwkJZGF0YSA9IGl0NjUwNV9nZXRfc2lua19ocGRfc3RhdHVzKGl0NjUwNSk7 Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiaHBkIGNoYW5nZSBpbnRlcnJ1cHQsIGNo YW5nZSB0byAlcyIsCj4gKwkJCQkgICAgIGRhdGEgPyAiaGlnaCIgOiAibG93Iik7Cj4gKwo+ICsJ CWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChpdDY1MDUtPmNvbm5lY3Rvci5kZXYpOwo+ICsJCURS TV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIml0NjUwNS0+c2lua19jb3VudDogJWQiLAo+ICsJCQkJ ICAgICBpdDY1MDUtPnNpbmtfY291bnQpOwo+ICsKPiArCQlpZiAoZGF0YSkgewo+ICsJCQl3YWl0 X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJml0NjUwNS0+d2FpdF9lZGlkX2NvbXBsZXRlLAo+ICsJ CQkJCQkgICAgbXNlY3NfdG9famlmZmllcyg2MDAwKSk7Cj4gKwkJCWl0NjUwNV9sYW5lX3Rlcm1p bmF0aW9uX29uKGl0NjUwNSk7Cj4gKwkJCWl0NjUwNV9sYW5lX3Bvd2VyX29uKGl0NjUwNSk7Cj4g Kwo+ICsJCQkvKgo+ICsJCQkgKiBmb3Igc29tZSBkb25nbGUgd2hpY2ggaXNzdWUgSFBEX2lycQo+ ICsJCQkgKiB3aGVuIHNpbmsgY291bm50IGNoYW5nZSBmcm9tICAwLT4xCj4gKwkJCSAqIGl0NjUw NSBub3QgYWJsZSB0byByZWNlaXZlIEhQRF9JUlEKPiArCQkJICogaWYgSFcgbmV2ZXIgZ28gaW50 byB0cmFpbmlnIGRvbmUKPiArCQkJICovCj4gKwo+ICsJCQlpZiAoaXQ2NTA1LT5icmFuY2hfZGV2 aWNlICYmIGl0NjUwNS0+c2lua19jb3VudCA9PSAwKQo+ICsJCQkJc2NoZWR1bGVfd29yaygmaXQ2 NTA1LT5saW5rX3dvcmtzKTsKPiArCj4gKwkJCWlmICghaXQ2NTA1X2dldF92aWRlb19zdGF0dXMo aXQ2NTA1KSkKPiArCQkJCWl0NjUwNV92aWRlb19yZXNldChpdDY1MDUpOwo+ICsKPiArCQkJaXQ2 NTA1X2NhbGNfdmlkZW9faW5mbyhpdDY1MDUpOwo+ICsJCX0gZWxzZSB7Cj4gKwkJCWtmcmVlKGl0 NjUwNS0+ZWRpZCk7Cj4gKwkJCWl0NjUwNS0+ZWRpZCA9IE5VTEw7Cj4gKwkJCW1lbXNldChpdDY1 MDUtPmRwY2QsIDAsIHNpemVvZihpdDY1MDUtPmRwY2QpKTsKPiArCj4gKwkJCWl0NjUwNV92aWRl b19kaXNhYmxlKGl0NjUwNSk7Cj4gKwkJCWl0NjUwNV9kaXNhYmxlX2F1ZGlvKGl0NjUwNSk7Cj4g KwkJCWl0NjUwNV9zdG9wX2xpbmtfdHJhaW4oaXQ2NTA1KTsKPiArCQkJaXQ2NTA1X2xhbmVfb2Zm KGl0NjUwNSk7Cj4gKwkJCXJldHVybjsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJaWYgKHJlZzA2ICYg SU5UX1JFQ0VJVkVfSFBEX0lSUSkgewo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgImhw ZF9pcnEgaW50ZXJydXB0Iik7Cj4gKwo+ICsJCWlmIChpdDY1MDVfcHJvY3NzX2hwZF9pcnEoaXQ2 NTA1KSA8IDApCj4gKwkJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgInByb2Nlc3MgaHBkX2ly cSBmYWlsISIpOwo+ICsJfQo+ICsKPiArCWlmIChyZWcwNiAmIElOVF9TQ0RUX0NIQU5HRSkgewo+ ICsJCWRhdGEgPSBpdDY1MDVfZ2V0X3ZpZGVvX3N0YXR1cyhpdDY1MDUpOwo+ICsJCURSTV9ERVZf REVCVUdfRFJJVkVSKGRldiwgInZpZGVvIHN0YWJsZSBjaGFuZ2UgaW50ZXJydXB0LCAlcyIsCj4g KwkJCQkgICAgIGRhdGEgPyAic3RhYmxlIiA6ICJ1bnN0YWJsZSIpOwo+ICsJCWl0NjUwNV9jYWxj X3ZpZGVvX2luZm8oaXQ2NTA1KTsKPiArCj4gKwkJaWYgKGRhdGEpCj4gKwkJCXNjaGVkdWxlX3dv cmsoJml0NjUwNS0+bGlua193b3Jrcyk7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0 NjUwNV9jaGVja19yZWcwNyhzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUsIHVuc2lnbmVkIGludCByZWcw NykKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUwNS0+Y2xpZW50LT5kZXY7Cj4g Kwo+ICsJaWYgKHJlZzA3ICYgSU5UX0FVWF9DTURfRkFJTCkKPiArCQlEUk1fREVWX0RFQlVHX0RS SVZFUihkZXYsICJBVVggUEMgUmVxdWVzdCBGYWlsIEludGVycnVwdCIpOwo+ICsKPiArCWlmIChy ZWcwNyAmIElOVF9BVURJT19GSUZPX0VSUk9SKSB7Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIo ZGV2LCAiYXVkaW8gZmlmbyBlcnJvciBJbnRlcnJ1cHQiKTsKPiArCj4gKwkJaWYgKGl0NjUwNV9h dWRpb19pbnB1dChpdDY1MDUpKQo+ICsJCQlpdDY1MDVfZW5hYmxlX2F1ZGlvKGl0NjUwNSk7Cj4g Kwl9Cj4gKwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfY2hlY2tfcmVnMDgoc3RydWN0 IGl0NjUwNSAqaXQ2NTA1LCB1bnNpZ25lZCBpbnQgcmVnMDgpCj4gK3sKPiArCXN0cnVjdCBkZXZp Y2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsKPiArCWlmIChyZWcwOCAmIElOVF9M SU5LX1RSQUlOX0ZBSUwpIHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJsaW5rIHRy YWluaW5nIGZhaWwgaW50ZXJydXB0Iik7Cj4gKwkJc2NoZWR1bGVfd29yaygmaXQ2NTA1LT5saW5r X3dvcmtzKTsKPiArCX0KPiArCj4gKwlpZiAocmVnMDggJiBJTlRfVklEX0ZJRk9fRVJST1IpIHsK PiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJ2aWRlbyBmaWZvIG92ZXJmbG93IGludGVy cnVwdCIpOwo+ICsJCWl0NjUwNV92aWRlb19yZXNldChpdDY1MDUpOwo+ICsJCWl0NjUwNS0+YXV0 b190cmFpbl9yZXRyeSA9IEFVVE9fVFJBSU5fUkVUUlk7Cj4gKwl9Cj4gKwo+ICsJaWYgKHJlZzA4 ICYgSU5UX0lPX0xBVENIX0ZJRk9fT1ZFUkZMT1cpIHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZF UihkZXYsICJJTyBsYXRjaCBmaWZvIG92ZXJmbG93IGludGVycnVwdCIpOwo+ICsJCWl0NjUwNV92 aWRlb19yZXNldChpdDY1MDUpOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgaXJxcmV0dXJuX3Qg aXQ2NTA1X2ludF90aHJlYWRlZF9oYW5kbGVyKGludCB1bnVzZWQsIHZvaWQgKmRhdGEpCj4gK3sK PiArCXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGRhdGE7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYg PSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCWludCByZWcwNiwgcmVnMDcsIHJlZzA4Owo+ICsK PiArCW1zbGVlcCgxMDApOwo+ICsJbXV0ZXhfbG9jaygmaXQ2NTA1LT5leHRjb25fbG9jayk7Cj4g Kwo+ICsJaWYgKGl0NjUwNS0+ZW5hYmxlX2Rydl9ob2xkIHx8ICFpdDY1MDUtPnBvd2VyZWQpCj4g KwkJZ290byB1bmxvY2s7Cj4gKwo+ICsJcmVnMDYgPSBpdDY1MDVfcmVhZChpdDY1MDUsIElOVF9T VEFUVVNfMDEpOwo+ICsJcmVnMDcgPSBpdDY1MDVfcmVhZChpdDY1MDUsIElOVF9TVEFUVVNfMDIp Owo+ICsJcmVnMDggPSBpdDY1MDVfcmVhZChpdDY1MDUsIElOVF9TVEFUVVNfMDMpOwo+ICsKPiAr CWl0NjUwNV93cml0ZShpdDY1MDUsIElOVF9TVEFUVVNfMDEsIHJlZzA2KTsKPiArCWl0NjUwNV93 cml0ZShpdDY1MDUsIElOVF9TVEFUVVNfMDIsIHJlZzA3KTsKPiArCWl0NjUwNV93cml0ZShpdDY1 MDUsIElOVF9TVEFUVVNfMDMsIHJlZzA4KTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihk ZXYsICJyZWcwNiA9IDB4JTAyeCIsIHJlZzA2KTsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRl diwgInJlZzA3ID0gMHglMDJ4IiwgcmVnMDcpOwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2 LCAicmVnMDggPSAweCUwMngiLCByZWcwOCk7Cj4gKwo+ICsJaWYgKHJlZzA2ICE9IDApCj4gKwkJ aXQ2NTA1X2NoZWNrX3JlZzA2KGl0NjUwNSwgcmVnMDYpOwo+ICsKPiArCWlmIChyZWcwNyAhPSAw KQo+ICsJCWl0NjUwNV9jaGVja19yZWcwNyhpdDY1MDUsIHJlZzA3KTsKPiArCj4gKwlpZiAocmVn MDggIT0gMCkKPiArCQlpdDY1MDVfY2hlY2tfcmVnMDgoaXQ2NTA1LCByZWcwOCk7Cj4gKwo+ICt1 bmxvY2s6Cj4gKwltdXRleF91bmxvY2soJml0NjUwNS0+ZXh0Y29uX2xvY2spOwo+ICsKPiArCXJl dHVybiBJUlFfSEFORExFRDsKPiArfQo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfcG93ZXJvbihz dHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1 MDUtPmNsaWVudC0+ZGV2Owo+ICsJc3RydWN0IGl0NjUwNV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9 ICZpdDY1MDUtPnBkYXRhOwo+ICsJaW50IGVycjsKPiArCj4gKwlpZiAoaXQ2NTA1LT5wb3dlcmVk KSB7Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiaXQ2NTA1IGFscmVhZHkgcG93ZXJl ZCBvbiIpOwo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICsKPiArCWlmIChwZGF0YS0+cHdyMTgpIHsK PiArCQllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHBkYXRhLT5wd3IxOCk7Cj4gKwkJaWYgKGVycikg ewo+ICsJCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIFZERDE4 OiAlZCIsCj4gKwkJCQkJICAgICBlcnIpOwo+ICsJCQlyZXR1cm4gZXJyOwo+ICsJCX0KPiArCX0K PiArCj4gKwlpZiAocGRhdGEtPm92ZGQpIHsKPiArCQkvKiB0aW1lIGludGVydmFsIGJldHdlZW4g SVZERCBhbmQgT1ZERCBhdCBsZWFzdCBiZSAxbXMgKi8KPiArCQl1c2xlZXBfcmFuZ2UoMTAwMCwg MjAwMCk7Cj4gKwkJZXJyID0gcmVndWxhdG9yX2VuYWJsZShwZGF0YS0+b3ZkZCk7Cj4gKwkJaWYg KGVycikgewo+ICsJCQlyZWd1bGF0b3JfZGlzYWJsZShwZGF0YS0+cHdyMTgpOwo+ICsJCQlyZXR1 cm4gZXJyOwo+ICsJCX0KPiArCX0KPiArCS8qIHRpbWUgaW50ZXJ2YWwgYmV0d2VlbiBPVkREIGFu ZCBTWVNSU1ROIGF0IGxlYXN0IGJlIDEwbXMgKi8KPiArCWlmIChwZGF0YS0+Z3Bpb2RfcmVzZXQp IHsKPiArCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKPiArCQlncGlvZF9zZXRfdmFsdWVf Y2Fuc2xlZXAocGRhdGEtPmdwaW9kX3Jlc2V0LCAwKTsKPiArCQl1c2xlZXBfcmFuZ2UoMTAwMCwg MjAwMCk7Cj4gKwkJZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKHBkYXRhLT5ncGlvZF9yZXNldCwg MSk7Cj4gKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7Cj4gKwl9Cj4gKwo+ICsJaXQ2NTA1 X3Jlc2V0X2xvZ2ljKGl0NjUwNSk7Cj4gKwlpdDY1MDVfaW50X21hc2tfZW5hYmxlKGl0NjUwNSk7 Cj4gKwlpdDY1MDVfaW5pdChpdDY1MDUpOwo+ICsJaXQ2NTA1X2xhbmVfb2ZmKGl0NjUwNSk7Cj4g Kwo+ICsJaXQ2NTA1LT5wb3dlcmVkID0gdHJ1ZTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsK PiArc3RhdGljIGludCBpdDY1MDVfcG93ZXJvZmYoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7 Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCXN0cnVj dCBpdDY1MDVfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSAmaXQ2NTA1LT5wZGF0YTsKPiArCWludCBl cnI7Cj4gKwo+ICsJaWYgKCFpdDY1MDUtPnBvd2VyZWQpIHsKPiArCQlEUk1fREVWX0RFQlVHX0RS SVZFUihkZXYsICJwb3dlciBoYWQgYmVlbiBhbHJlYWR5IG9mZiIpOwo+ICsJCXJldHVybiAwOwo+ ICsJfQo+ICsKPiArCWlmIChwZGF0YS0+Z3Bpb2RfcmVzZXQpCj4gKwkJZ3Bpb2Rfc2V0X3ZhbHVl X2NhbnNsZWVwKHBkYXRhLT5ncGlvZF9yZXNldCwgMCk7Cj4gKwo+ICsJaWYgKHBkYXRhLT5wd3Ix OCkgewo+ICsJCWVyciA9IHJlZ3VsYXRvcl9kaXNhYmxlKHBkYXRhLT5wd3IxOCk7Cj4gKwkJaWYg KGVycikKPiArCQkJcmV0dXJuIGVycjsKPiArCX0KPiArCj4gKwlpZiAocGRhdGEtPm92ZGQpIHsK PiArCQllcnIgPSByZWd1bGF0b3JfZGlzYWJsZShwZGF0YS0+b3ZkZCk7Cj4gKwkJaWYgKGVycikK PiArCQkJcmV0dXJuIGVycjsKPiArCX0KPiArCj4gKwlpdDY1MDUtPnBvd2VyZWQgPSBmYWxzZTsK PiArCWtmcmVlKGl0NjUwNS0+ZWRpZCk7Cj4gKwlpdDY1MDUtPmVkaWQgPSBOVUxMOwo+ICsJaXQ2 NTA1LT5zaW5rX2NvdW50ID0gMDsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGlj IGlubGluZSBzdHJ1Y3QgaXQ2NTA1ICpjb25uZWN0b3JfdG9faXQ2NTA1KHN0cnVjdCBkcm1fY29u bmVjdG9yICpjKQo+ICt7Cj4gKwlyZXR1cm4gY29udGFpbmVyX29mKGMsIHN0cnVjdCBpdDY1MDUs IGNvbm5lY3Rvcik7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaXQ2NTA1X2dldF9tb2RlcyhzdHJ1 Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ICt7Cj4gKwlzdHJ1Y3QgaXQ2NTA1ICppdDY1 MDUgPSBjb25uZWN0b3JfdG9faXQ2NTA1KGNvbm5lY3Rvcik7Cj4gKwlpbnQgZXJyLCBudW1fbW9k ZXMgPSAwLCBpOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUwNS0+Y2xpZW50LT5kZXY7 Cj4gKwo+ICsJaWYgKGl0NjUwNS0+ZWRpZCkKPiArCQlyZXR1cm4gZHJtX2FkZF9lZGlkX21vZGVz KGNvbm5lY3RvciwgaXQ2NTA1LT5lZGlkKTsKPiArCj4gKwltdXRleF9sb2NrKCZpdDY1MDUtPm1v ZGVfbG9jayk7Cj4gKwlpbml0X2NvbXBsZXRpb24oJml0NjUwNS0+d2FpdF9lZGlkX2NvbXBsZXRl KTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Cj4gKwkJaWYgKCFpdDY1MDVfZ2V0 X3NpbmtfaHBkX3N0YXR1cyhpdDY1MDUpKQo+ICsJCQlnb3RvIHVubG9jazsKPiArCj4gKwkJaXQ2 NTA1LT5lZGlkID0KPiArCQlkcm1fZG9fZ2V0X2VkaWQoJml0NjUwNS0+Y29ubmVjdG9yLCBpdDY1 MDVfZ2V0X2VkaWRfYmxvY2ssCj4gKwkJCQlpdDY1MDUpOwo+ICsKPiArCQlpZiAoaXQ2NTA1LT5l ZGlkKQo+ICsJCQlicmVhazsKPiArCX0KPiArCWlmICghaXQ2NTA1LT5lZGlkKSB7Cj4gKwkJRFJN X0RFVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gcmVhZCBFRElEIik7Cj4gKwkJZ290byB1bmxvY2s7 Cj4gKwl9Cj4gKwo+ICsJZXJyID0gZHJtX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShj b25uZWN0b3IsIGl0NjUwNS0+ZWRpZCk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJRFJNX0RFVl9FUlJP UihkZXYsICJGYWlsZWQgdG8gdXBkYXRlIEVESUQgcHJvcGVydHk6ICVkIiwgZXJyKTsKPiArCQln b3RvIHVubG9jazsKPiArCX0KPiArCj4gKwludW1fbW9kZXMgPSBkcm1fYWRkX2VkaWRfbW9kZXMo Y29ubmVjdG9yLCBpdDY1MDUtPmVkaWQpOwo+ICsKPiArdW5sb2NrOgo+ICsJY29tcGxldGUoJml0 NjUwNS0+d2FpdF9lZGlkX2NvbXBsZXRlKTsKPiArCW11dGV4X3VubG9jaygmaXQ2NTA1LT5tb2Rl X2xvY2spOwo+ICsKPiArCXJldHVybiBudW1fbW9kZXM7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25z dCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgaXQ2NTA1X2Nvbm5lY3Rvcl9oZWxw ZXJfZnVuY3MgPSB7Cj4gKwkuZ2V0X21vZGVzID0gaXQ2NTA1X2dldF9tb2RlcywKPiArfTsKPiAr Cj4gK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGl0NjUwNV9kZXRlY3Qoc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiArCQkJCQkgICAgICAgYm9vbCBmb3JjZSkKPiAr ewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gY29ubmVjdG9yX3RvX2l0NjUwNShjb25uZWN0 b3IpOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUwNS0+Y2xpZW50LT5kZXY7Cj4gKwll bnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29u bmVjdGVkOwo+ICsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIml0NjUwNS0+c2lua19j b3VudDolZCBwb3dlcmVkOiVkIiwKPiArCQkJICAgICBpdDY1MDUtPnNpbmtfY291bnQsIGl0NjUw NS0+cG93ZXJlZCk7Cj4gKwo+ICsJbXV0ZXhfbG9jaygmaXQ2NTA1LT5tb2RlX2xvY2spOwo+ICsK PiArCWlmICghaXQ2NTA1LT5wb3dlcmVkKQo+ICsJCWdvdG8gdW5sb2NrOwo+ICsKPiArCWlmIChp dDY1MDUtPmVuYWJsZV9kcnZfaG9sZCkgewo+ICsJCXN0YXR1cyA9IGl0NjUwNV9nZXRfc2lua19o cGRfc3RhdHVzKGl0NjUwNSkgPwo+ICsJCQkJCWNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkIDoK PiArCQkJCQljb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKPiArCQlnb3RvIHVubG9jazsK PiArCX0KPiArCj4gKwlpZiAoaXQ2NTA1X2dldF9zaW5rX2hwZF9zdGF0dXMoaXQ2NTA1KSkgewo+ ICsJCWl0NjUwNV9hdXhfb24oaXQ2NTA1KTsKPiArCQlpdDY1MDVfZHJtX2RwX2xpbmtfcHJvYmUo Jml0NjUwNS0+YXV4LCAmaXQ2NTA1LT5saW5rKTsKPiArCQlpdDY1MDVfZHJtX2RwX2xpbmtfcG93 ZXJfdXAoJml0NjUwNS0+YXV4LCAmaXQ2NTA1LT5saW5rKTsKPiArCQlpdDY1MDUtPmF1dG9fdHJh aW5fcmV0cnkgPSBBVVRPX1RSQUlOX1JFVFJZOwo+ICsKPiArCQlpZiAoaXQ2NTA1LT5kcGNkWzBd ID09IDApIHsKPiArCQkJaXQ2NTA1X2dldF9kcGNkKGl0NjUwNSwgRFBfRFBDRF9SRVYsIGl0NjUw NS0+ZHBjZCwKPiArCQkJCQlBUlJBWV9TSVpFKGl0NjUwNS0+ZHBjZCkpOwo+ICsJCQlpdDY1MDVf dmFyaWFibGVfY29uZmlnKGl0NjUwNSk7Cj4gKwkJCWl0NjUwNV9wYXJzZV9saW5rX2NhcGFiaWxp dGllcyhpdDY1MDUpOwo+ICsJCX0KPiArCj4gKwkJaXQ2NTA1LT5zaW5rX2NvdW50ID0gRFBfR0VU X1NJTktfQ09VTlQoaXQ2NTA1X2RwY2RfcmVhZChpdDY1MDUsCj4gKwkJCQkJCSAgICAgICBEUF9T SU5LX0NPVU5UKSk7Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiaXQ2NTA1LT5zaW5r X2NvdW50OiVkIGJyYW5jaDolZCIsCj4gKwkJCQkgICAgIGl0NjUwNS0+c2lua19jb3VudCwgaXQ2 NTA1LT5icmFuY2hfZGV2aWNlKTsKPiArCj4gKwkJaWYgKGl0NjUwNS0+YnJhbmNoX2RldmljZSkg ewo+ICsJCQlzdGF0dXMgPSAoaXQ2NTA1LT5zaW5rX2NvdW50ICE9IDApID8KPiArCQkJCSBjb25u ZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCA6Cj4gKwkJCQkgY29ubmVjdG9yX3N0YXR1c19kaXNjb25u ZWN0ZWQ7Cj4gKwkJfSBlbHNlIHsKPiArCQkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25u ZWN0ZWQ7Cj4gKwkJfQo+ICsJfSBlbHNlIHsKPiArCQlpdDY1MDUtPnNpbmtfY291bnQgPSAwOwo+ ICsJCW1lbXNldChpdDY1MDUtPmRwY2QsIDAsIHNpemVvZihpdDY1MDUtPmRwY2QpKTsKPiArCX0K PiArCj4gK3VubG9jazoKPiArCWlmIChpdDY1MDUtPmNvbm5lY3Rvcl9zdGF0dXMgIT0gc3RhdHVz KSB7Cj4gKwkJaXQ2NTA1LT5jb25uZWN0b3Jfc3RhdHVzID0gc3RhdHVzOwo+ICsJCWl0NjUwNV9w bHVnZ2VkX3N0YXR1c190b19jb2RlYyhpdDY1MDUpOwo+ICsJfQo+ICsKPiArCW11dGV4X3VubG9j aygmaXQ2NTA1LT5tb2RlX2xvY2spOwo+ICsKPiArCXJldHVybiBzdGF0dXM7Cj4gK30KPiArCj4g K3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyBpdDY1MDVfY29ubmVjdG9y X2Z1bmNzID0gewo+ICsJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25u ZWN0b3JfbW9kZXMsCj4gKwkuZGV0ZWN0ID0gaXQ2NTA1X2RldGVjdCwKPiArCS5kZXN0cm95ID0g ZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwLAo+ICsJLnJlc2V0ID0gZHJtX2F0b21pY19oZWxwZXJfY29u bmVjdG9yX3Jlc2V0LAo+ICsJLmF0b21pY19kdXBsaWNhdGVfc3RhdGUgPSBkcm1fYXRvbWljX2hl bHBlcl9jb25uZWN0b3JfZHVwbGljYXRlX3N0YXRlLAo+ICsJLmF0b21pY19kZXN0cm95X3N0YXRl ID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2Rlc3Ryb3lfc3RhdGUsCj4gK307Cj4gKwo+ ICtzdGF0aWMgaW50IGl0NjUwNV9leHRjb25fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2Nr ICpzZWxmLAo+ICsJCQkJICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCj4gK3sKPiAr CXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGNvbnRhaW5lcl9vZihzZWxmLCBzdHJ1Y3QgaXQ2NTA1 LCBldmVudF9uYik7Cj4gKwo+ICsJc2NoZWR1bGVfd29yaygmaXQ2NTA1LT5leHRjb25fd3EpOwo+ ICsJcmV0dXJuIE5PVElGWV9ET05FOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfZXh0 Y29uX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICt7Cj4gKwlzdHJ1Y3QgaXQ2NTA1 ICppdDY1MDUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGl0NjUwNSwgZXh0Y29uX3dxKTsK PiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpdDY1MDUtPmNsaWVudC0+ZGV2Owo+ICsJaW50IHN0 YXRlID0gZXh0Y29uX2dldF9zdGF0ZShpdDY1MDUtPmV4dGNvbiwgRVhUQ09OX0RJU1BfRFApOwo+ ICsJdW5zaWduZWQgaW50IHB3cm9mZnJldHJ5ID0gMDsKPiArCj4gKwlpZiAoaXQ2NTA1LT5lbmFi bGVfZHJ2X2hvbGQpCj4gKwkJcmV0dXJuOwo+ICsKPiArCW11dGV4X2xvY2soJml0NjUwNS0+ZXh0 Y29uX2xvY2spOwo+ICsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIkVYVENPTl9ESVNQ X0RQID0gMHglMDJ4Iiwgc3RhdGUpOwo+ICsJaWYgKHN0YXRlID4gMCkgewo+ICsJCURSTV9ERVZf REVCVUdfRFJJVkVSKGRldiwgInN0YXJ0IHRvIHBvd2VyIG9uIik7Cj4gKwkJbXNsZWVwKDEwMCk7 Cj4gKwkJaXQ2NTA1X3Bvd2Vyb24oaXQ2NTA1KTsKPiArCX0gZWxzZSB7Cj4gKwkJRFJNX0RFVl9E RUJVR19EUklWRVIoZGV2LCAic3RhcnQgdG8gcG93ZXIgb2ZmIik7Cj4gKwkJd2hpbGUgKGl0NjUw NV9wb3dlcm9mZihpdDY1MDUpICYmIHB3cm9mZnJldHJ5KysgPCA1KSB7Cj4gKwkJCURSTV9ERVZf REVCVUdfRFJJVkVSKGRldiwgInBvd2VyIG9mZiBmYWlsICVkIHRpbWVzIiwKPiArCQkJCQkgICAg IHB3cm9mZnJldHJ5KTsKPiArCQl9Cj4gKwo+ICsJCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChp dDY1MDUtPmNvbm5lY3Rvci5kZXYpOwo+ICsJCW1lbXNldChpdDY1MDUtPmRwY2QsIDAsIHNpemVv ZihpdDY1MDUtPmRwY2QpKTsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJwb3dlciBv ZmYgaXQ2NTA1IHN1Y2Nlc3MhIik7Cj4gKwl9Cj4gKwo+ICsJbXV0ZXhfdW5sb2NrKCZpdDY1MDUt PmV4dGNvbl9sb2NrKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfdXNlX25vdGlmaWVy X21vZHVsZShzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUpCj4gK3sKPiArCWludCByZXQ7Cj4gKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCj4gKwlpdDY1MDUtPmV2 ZW50X25iLm5vdGlmaWVyX2NhbGwgPSBpdDY1MDVfZXh0Y29uX25vdGlmaWVyOwo+ICsJSU5JVF9X T1JLKCZpdDY1MDUtPmV4dGNvbl93cSwgaXQ2NTA1X2V4dGNvbl93b3JrKTsKPiArCXJldCA9IGRl dm1fZXh0Y29uX3JlZ2lzdGVyX25vdGlmaWVyKCZpdDY1MDUtPmNsaWVudC0+ZGV2LAo+ICsJCQkJ CSAgICBpdDY1MDUtPmV4dGNvbiwgRVhUQ09OX0RJU1BfRFAsCj4gKwkJCQkJICAgICZpdDY1MDUt PmV2ZW50X25iKTsKPiArCWlmIChyZXQpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwgImZhaWxl ZCB0byByZWdpc3RlciBub3RpZmllciBmb3IgRFAiKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ ICsKPiArCXNjaGVkdWxlX3dvcmsoJml0NjUwNS0+ZXh0Y29uX3dxKTsKPiArCj4gKwlyZXR1cm4g MDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X3JlbW92ZV9ub3RpZmllcl9tb2R1bGUo c3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlpZiAoaXQ2NTA1LT5leHRjb24pIHsKPiAr CQlkZXZtX2V4dGNvbl91bnJlZ2lzdGVyX25vdGlmaWVyKCZpdDY1MDUtPmNsaWVudC0+ZGV2LAo+ ICsJCQkJCQlpdDY1MDUtPmV4dGNvbiwJRVhUQ09OX0RJU1BfRFAsCj4gKwkJCQkJCSZpdDY1MDUt PmV2ZW50X25iKTsKPiArCj4gKwkJZmx1c2hfd29yaygmaXQ2NTA1LT5leHRjb25fd3EpOwo+ICsJ fQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBpdDY1MDVfZGVsYXllZF9h dWRpbyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCj4gK3sKPiArCXN0cnVjdCBpdDY1MDUgKml0 NjUwNSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXQ2NTA1LAo+ICsJCQkJCSAgICAgZGVs YXllZF9hdWRpby53b3JrKTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUigmaXQ2NTA1LT5j bGllbnQtPmRldiwgInN0YXJ0Iik7Cj4gKwo+ICsJaWYgKCFpdDY1MDUtPnBvd2VyZWQpCj4gKwkJ cmV0dXJuOwo+ICsKPiArCWlmICghaXQ2NTA1LT5lbmFibGVfZHJ2X2hvbGQpCj4gKwkJaXQ2NTA1 X2VuYWJsZV9hdWRpbyhpdDY1MDUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IF9fbWF5YmVfdW51 c2VkIGl0NjUwNV9hdWRpb19zZXR1cF9od19wYXJhbXMoc3RydWN0IGl0NjUwNSAqaXQ2NTA1LAo+ ICsJCQkJCXN0cnVjdCBoZG1pX2NvZGVjX3BhcmFtcyAqcGFyYW1zKQo+ICt7Cj4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCWludCBpID0gMDsKPiArCj4g KwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICIlcyAlZCBIeiwgJWQgYml0LCAlZCBjaGFubmVs c1xuIiwgX19mdW5jX18sCj4gKwkJCSAgICAgcGFyYW1zLT5zYW1wbGVfcmF0ZSwgcGFyYW1zLT5z YW1wbGVfd2lkdGgsCj4gKwkJCSAgICAgcGFyYW1zLT5jZWEuY2hhbm5lbHMpOwo+ICsKPiArCWlm ICghaXQ2NTA1LT5icmlkZ2UuZW5jb2RlcikKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCj4gKwlp ZiAocGFyYW1zLT5jZWEuY2hhbm5lbHMgPD0gMSB8fCBwYXJhbXMtPmNlYS5jaGFubmVscyA+IDgp IHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJjaGFubmVsIG51bWJlcjogJWQgbm90 IHN1cHBvcnQiLAo+ICsJCQkJICAgICBpdDY1MDUtPmF1ZGlvLmNoYW5uZWxfY291bnQpOwo+ICsJ CXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCWl0NjUwNS0+YXVkaW8uY2hhbm5lbF9jb3Vu dCA9IHBhcmFtcy0+Y2VhLmNoYW5uZWxzOwo+ICsKPiArCXdoaWxlIChpIDwgQVJSQVlfU0laRShh dWRpb19zYW1wbGVfcmF0ZV9tYXApICYmCj4gKwkgICAgICAgcGFyYW1zLT5zYW1wbGVfcmF0ZSAh PQo+ICsJCSAgICAgICBhdWRpb19zYW1wbGVfcmF0ZV9tYXBbaV0uc2FtcGxlX3JhdGVfdmFsdWUp IHsKPiArCQlpKys7Cj4gKwl9Cj4gKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGF1ZGlvX3NhbXBsZV9y YXRlX21hcCkpIHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJzYW1wbGUgcmF0ZTog JWQgSHogbm90IHN1cHBvcnQiLAo+ICsJCQkJICAgICBwYXJhbXMtPnNhbXBsZV9yYXRlKTsKPiAr CQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCWl0NjUwNS0+YXVkaW8uc2FtcGxlX3JhdGUgPSBh dWRpb19zYW1wbGVfcmF0ZV9tYXBbaV0ucmF0ZTsKPiArCj4gKwlzd2l0Y2ggKHBhcmFtcy0+c2Ft cGxlX3dpZHRoKSB7Cj4gKwljYXNlIDE2Ogo+ICsJCWl0NjUwNS0+YXVkaW8ud29yZF9sZW5ndGgg PSBXT1JEX0xFTkdUSF8xNkJJVDsKPiArCQlicmVhazsKPiArCWNhc2UgMTg6Cj4gKwkJaXQ2NTA1 LT5hdWRpby53b3JkX2xlbmd0aCA9IFdPUkRfTEVOR1RIXzE4QklUOwo+ICsJCWJyZWFrOwo+ICsJ Y2FzZSAyMDoKPiArCQlpdDY1MDUtPmF1ZGlvLndvcmRfbGVuZ3RoID0gV09SRF9MRU5HVEhfMjBC SVQ7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIDI0Ogo+ICsJY2FzZSAzMjoKPiArCQlpdDY1MDUtPmF1 ZGlvLndvcmRfbGVuZ3RoID0gV09SRF9MRU5HVEhfMjRCSVQ7Cj4gKwkJYnJlYWs7Cj4gKwlkZWZh dWx0Ogo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIndvcmRsZW5ndGg6ICVkIGJpdCBu b3Qgc3VwcG9ydCIsCj4gKwkJCQkgICAgIHBhcmFtcy0+c2FtcGxlX3dpZHRoKTsKPiArCQlyZXR1 cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZv aWQgX19tYXliZV91bnVzZWQgaXQ2NTA1X2F1ZGlvX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRl diwgdm9pZCAqZGF0YSkKPiArewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gZGV2X2dldF9k cnZkYXRhKGRldik7Cj4gKwo+ICsJaWYgKGl0NjUwNS0+cG93ZXJlZCkKPiArCQlpdDY1MDVfZGlz YWJsZV9hdWRpbyhpdDY1MDUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IF9fbWF5YmVfdW51c2Vk IGl0NjUwNV9hdWRpb19ob29rX3BsdWdnZWRfY2Ioc3RydWN0IGRldmljZSAqZGV2LAo+ICsJCQkJ CQkgICAgICAgdm9pZCAqZGF0YSwKPiArCQkJCQkJICAgICAgIGhkbWlfY29kZWNfcGx1Z2dlZF9j YiBmbiwKPiArCQkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmNvZGVjX2RldikKPiArewo+ICsJ c3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gZGF0YTsKPiArCj4gKwlpdDY1MDUtPnBsdWdnZWRfY2Ig PSBmbjsKPiArCWl0NjUwNS0+Y29kZWNfZGV2ID0gY29kZWNfZGV2Owo+ICsJaXQ2NTA1X3BsdWdn ZWRfc3RhdHVzX3RvX2NvZGVjKGl0NjUwNSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4g K3N0YXRpYyBpbmxpbmUgc3RydWN0IGl0NjUwNSAqYnJpZGdlX3RvX2l0NjUwNShzdHJ1Y3QgZHJt X2JyaWRnZSAqYnJpZGdlKQo+ICt7Cj4gKwlyZXR1cm4gY29udGFpbmVyX29mKGJyaWRnZSwgc3Ry dWN0IGl0NjUwNSwgYnJpZGdlKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2JyaWRn ZV9tb2RlX3NldChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+ICsJCQkJICAgY29uc3Qgc3Ry dWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCj4gKwkJCQkgICBjb25zdCBzdHJ1Y3QgZHJtX2Rp c3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKPiArewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1 ID0gYnJpZGdlX3RvX2l0NjUwNShicmlkZ2UpOwo+ICsJc3RydWN0IGhkbWlfYXZpX2luZm9mcmFt ZSBmcmFtZTsKPiArCWludCBlcnI7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5j bGllbnQtPmRldjsKPiArCj4gKwlpZiAoV0FSTl9PTighaXQ2NTA1LT5wb3dlcmVkKSkKPiArCQly ZXR1cm47Cj4gKwo+ICsJbXV0ZXhfbG9jaygmaXQ2NTA1LT5tb2RlX2xvY2spOwo+ICsKPiArCWVy ciA9IGRybV9oZG1pX2F2aV9pbmZvZnJhbWVfZnJvbV9kaXNwbGF5X21vZGUoJmZyYW1lLAo+ICsJ CQkJCQkgICAgICAgJml0NjUwNS0+Y29ubmVjdG9yLAo+ICsJCQkJCQkgICAgICAgYWRqdXN0ZWRf bW9kZSk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJGYWlsZWQgdG8g c2V0dXAgQVZJIGluZm9mcmFtZTogJWQiLCBlcnIpOwo+ICsJCWdvdG8gdW5sb2NrOwo+ICsJfQo+ ICsKPiArCWl0NjUwNV91cGRhdGVfdmlkZW9fcHJhcm1ldGVyKGl0NjUwNSwgYWRqdXN0ZWRfbW9k ZSk7Cj4gKwo+ICsJZXJyID0gaXQ2NTA1X3NlbmRfdmlkZW9faW5mb2ZyYW1lKGl0NjUwNSwgJmZy YW1lKTsKPiArCWlmIChlcnIpCj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gc2Vu ZCBBVkkgaW5mb2ZyYW1lOiAlZCIsIGVycik7Cj4gKwo+ICt1bmxvY2s6Cj4gKwltdXRleF91bmxv Y2soJml0NjUwNS0+bW9kZV9sb2NrKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfYnJp ZGdlX2F0dGFjaChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+ICsJCQkJZW51bSBkcm1fYnJp ZGdlX2F0dGFjaF9mbGFncyBmbGFncykKPiArewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0g YnJpZGdlX3RvX2l0NjUwNShicmlkZ2UpOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJml0NjUw NS0+Y2xpZW50LT5kZXY7Cj4gKwlpbnQgZXJyOwo+ICsKPiArCWlmICghYnJpZGdlLT5lbmNvZGVy KSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJQYXJlbnQgZW5jb2RlciBvYmplY3Qgbm90IGZv dW5kIik7Cj4gKwkJcmV0dXJuIC1FTk9ERVY7Cj4gKwl9Cj4gKwo+ICsJZXJyID0gZHJtX2Nvbm5l Y3Rvcl9pbml0KGJyaWRnZS0+ZGV2LCAmaXQ2NTA1LT5jb25uZWN0b3IsCj4gKwkJCQkgJml0NjUw NV9jb25uZWN0b3JfZnVuY3MsCj4gKwkJCQkgRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0 KTsKPiArCWlmIChlcnIgPCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJGYWlsZWQgdG8g aW5pdGlhbGl6ZSBjb25uZWN0b3I6ICVkIiwgZXJyKTsKPiArCQlyZXR1cm4gZXJyOwo+ICsJfQo+ ICsKPiArCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmaXQ2NTA1LT5jb25uZWN0b3IsCj4gKwkJ CQkgJml0NjUwNV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKPiArCj4gKwlpdDY1MDUtPmNvbm5l Y3Rvci5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfSFBEOwo+ICsKPiArCWVyciA9IGRybV9j b25uZWN0b3JfYXR0YWNoX2VuY29kZXIoJml0NjUwNS0+Y29ubmVjdG9yLCBicmlkZ2UtPmVuY29k ZXIpOwo+ICsJaWYgKGVyciA8IDApIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwgIkZhaWxlZCB0 byBsaW5rIHVwIGNvbm5lY3RvciB0byBlbmNvZGVyOiAlZCIsCj4gKwkJCSAgICAgIGVycik7Cj4g KwkJZ290byBjbGVhbnVwX2Nvbm5lY3RvcjsKPiArCX0KPiArCj4gKwllcnIgPSBkcm1fY29ubmVj dG9yX3JlZ2lzdGVyKCZpdDY1MDUtPmNvbm5lY3Rvcik7Cj4gKwlpZiAoZXJyIDwgMCkgewo+ICsJ CURSTV9ERVZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNvbm5lY3RvcjogJWQiLCBl cnIpOwo+ICsJCWdvdG8gY2xlYW51cF9jb25uZWN0b3I7Cj4gKwl9Cj4gKwo+ICsJaWYgKGl0NjUw NS0+ZXh0Y29uKSB7Cj4gKwkJZXJyID0gaXQ2NTA1X3VzZV9ub3RpZmllcl9tb2R1bGUoaXQ2NTA1 KTsKPiArCQlpZiAoZXJyIDwgMCkgewo+ICsJCQlkcm1fY29ubmVjdG9yX3VucmVnaXN0ZXIoJml0 NjUwNS0+Y29ubmVjdG9yKTsKPiArCQkJZ290byBjbGVhbnVwX2Nvbm5lY3RvcjsKPiArCQl9Cj4g Kwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gKwo+ICtjbGVhbnVwX2Nvbm5lY3RvcjoKPiArCWRybV9j b25uZWN0b3JfY2xlYW51cCgmaXQ2NTA1LT5jb25uZWN0b3IpOwo+ICsJcmV0dXJuIGVycjsKPiAr fQo+ICsKPiArc3RhdGljIHZvaWQgaXQ2NTA1X2JyaWRnZV9kZXRhY2goc3RydWN0IGRybV9icmlk Z2UgKmJyaWRnZSkKPiArewo+ICsJc3RydWN0IGl0NjUwNSAqaXQ2NTA1ID0gYnJpZGdlX3RvX2l0 NjUwNShicmlkZ2UpOwo+ICsKPiArCWZsdXNoX3dvcmsoJml0NjUwNS0+bGlua193b3Jrcyk7Cj4g KwlpdDY1MDVfcmVtb3ZlX25vdGlmaWVyX21vZHVsZShpdDY1MDUpOwo+ICsJZHJtX2Nvbm5lY3Rv cl91bnJlZ2lzdGVyKCZpdDY1MDUtPmNvbm5lY3Rvcik7Cj4gKwlkcm1fY29ubmVjdG9yX2NsZWFu dXAoJml0NjUwNS0+Y29ubmVjdG9yKTsKPiArfQo+ICsKPiArc3RhdGljIGVudW0gZHJtX21vZGVf c3RhdHVzCj4gK2l0NjUwNV9icmlkZ2VfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJp ZGdlLAo+ICsJCQkgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X2luZm8gKmluZm8sCj4gKwkJCSBj b25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiArewo+ICsJc3RydWN0IGl0NjUw NSAqaXQ2NTA1ID0gYnJpZGdlX3RvX2l0NjUwNShicmlkZ2UpOwo+ICsKPiArCWlmIChtb2RlLT5m bGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKQo+ICsJCXJldHVybiBNT0RFX05PX0lOVEVS TEFDRTsKPiArCj4gKwlpZiAobW9kZS0+Y2xvY2sgPiBEUElfUElYRUxfQ0xLX01BWCkKPiArCQly ZXR1cm4gTU9ERV9DTE9DS19ISUdIOwo+ICsKPiArCWl0NjUwNS0+dmlkZW9faW5mby5jbG9jayA9 IG1vZGUtPmNsb2NrOwo+ICsKPiArCXJldHVybiBNT0RFX09LOwo+ICt9Cj4gKwo+ICtzdGF0aWMg dm9pZCBpdDY1MDVfYnJpZGdlX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ICt7 Cj4gKwlzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUgPSBicmlkZ2VfdG9faXQ2NTA1KGJyaWRnZSk7Cj4g Kwo+ICsJaXQ2NTA1X2ludF9tYXNrX2VuYWJsZShpdDY1MDUpOwo+ICsJaXQ2NTA1X3ZpZGVvX3Jl c2V0KGl0NjUwNSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGl0NjUwNV9icmlkZ2VfZGlzYWJs ZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ICt7Cj4gKwlzdHJ1Y3QgaXQ2NTA1ICppdDY1 MDUgPSBicmlkZ2VfdG9faXQ2NTA1KGJyaWRnZSk7Cj4gKwo+ICsJaWYgKGl0NjUwNS0+cG93ZXJl ZCkKPiArCQlpdDY1MDVfdmlkZW9fZGlzYWJsZShpdDY1MDUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGRybV9icmlkZ2VfZnVuY3MgaXQ2NTA1X2JyaWRnZV9mdW5jcyA9IHsKPiAr CS5hdHRhY2ggPSBpdDY1MDVfYnJpZGdlX2F0dGFjaCwKPiArCS5kZXRhY2ggPSBpdDY1MDVfYnJp ZGdlX2RldGFjaCwKPiArCS5tb2RlX3ZhbGlkID0gaXQ2NTA1X2JyaWRnZV9tb2RlX3ZhbGlkLAo+ ICsJLm1vZGVfc2V0ID0gaXQ2NTA1X2JyaWRnZV9tb2RlX3NldCwKPiArCS5lbmFibGUgPSBpdDY1 MDVfYnJpZGdlX2VuYWJsZSwKPiArCS5kaXNhYmxlID0gaXQ2NTA1X2JyaWRnZV9kaXNhYmxlLAo+ ICt9Owo+ICsKPiArc3RhdGljIGludCBpdDY1MDVfYnJpZGdlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNl ICpkZXYpCj4gK3sKPiArCXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGRldl9nZXRfZHJ2ZGF0YShk ZXYpOwo+ICsKPiArCXJldHVybiBpdDY1MDVfcG93ZXJvbihpdDY1MDUpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IGl0NjUwNV9icmlkZ2Vfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gK3sK PiArCXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsKPiAr CXJldHVybiBpdDY1MDVfcG93ZXJvZmYoaXQ2NTA1KTsKPiArfQo+ICsKPiArc3RhdGljIFNJTVBM RV9ERVZfUE1fT1BTKGl0NjUwNV9icmlkZ2VfcG1fb3BzLCBpdDY1MDVfYnJpZGdlX3N1c3BlbmQs Cj4gKwkJCSBpdDY1MDVfYnJpZGdlX3Jlc3VtZSk7Cj4gKwo+ICsKPiArCj4gK3N0YXRpYyBpbnQg aXQ2NTA1X2luaXRfcGRhdGEoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ICt7Cj4gKwlzdHJ1Y3Qg aXQ2NTA1X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gJml0NjUwNS0+cGRhdGE7Cj4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCj4gKwkvKiAxLjBWIGRpZ2l0 YWwgY29yZSBwb3dlciByZWd1bGF0b3IgICovCj4gKwlwZGF0YS0+cHdyMTggPSBkZXZtX3JlZ3Vs YXRvcl9nZXQoZGV2LCAicHdyMTgiKTsKPiArCWlmIChJU19FUlIocGRhdGEtPnB3cjE4KSkgewo+ ICsJCURSTV9ERVZfRVJST1IoZGV2LCAicHdyMTggcmVndWxhdG9yIG5vdCBmb3VuZCIpOwo+ICsJ CXJldHVybiBQVFJfRVJSKHBkYXRhLT5wd3IxOCk7Cj4gKwl9Cj4gKwo+ICsJcGRhdGEtPm92ZGQg PSBkZXZtX3JlZ3VsYXRvcl9nZXQoZGV2LCAib3ZkZCIpOwo+ICsJaWYgKElTX0VSUihwZGF0YS0+ b3ZkZCkpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwgIm92ZGQgcmVndWxhdG9yIG5vdCBmb3Vu ZCIpOwo+ICsJCXJldHVybiBQVFJfRVJSKHBkYXRhLT5vdmRkKTsKPiArCX0KPiArCj4gKwlwZGF0 YS0+Z3Bpb2RfcmVzZXQgPSBkZXZtX2dwaW9kX2dldChkZXYsICJyZXNldCIsIEdQSU9EX09VVF9I SUdIKTsKPiArCWlmIChJU19FUlIocGRhdGEtPmdwaW9kX3Jlc2V0KSkgewo+ICsJCURSTV9ERVZf RVJST1IoZGV2LCAiZ3Bpb2RfcmVzZXQgZ3BpbyBub3QgZm91bmQiKTsKPiArCQlyZXR1cm4gUFRS X0VSUihwZGF0YS0+Z3Bpb2RfcmVzZXQpOwo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgdm9pZCBpdDY1MDVfcGFyc2VfZHQoc3RydWN0IGl0NjUwNSAqaXQ2NTA1KQo+ ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXQ2NTA1LT5jbGllbnQtPmRldjsKPiArCXUz MiBhZmVfc2V0dGluZyA9IDA7Cj4gKwo+ICsJaXQ2NTA1LT5sYW5lX3N3YXBfZGlzYWJsZWQgPSB0 cnVlOwo+ICsJaXQ2NTA1LT5hZmVfc2V0dGluZyA9IDA7Cj4gKwo+ICsJaXQ2NTA1LT5sYW5lX3N3 YXBfZGlzYWJsZWQgPQo+ICsJCWRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAibm8tbGFu ZXN3YXAiKTsKPiArCj4gKwlpZiAoaXQ2NTA1LT5sYW5lX3N3YXBfZGlzYWJsZWQpCj4gKwkJaXQ2 NTA1LT5sYW5lX3N3YXAgPSBmYWxzZTsKPiArCj4gKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRf dTMyKGRldiwgImFmZS1zZXR0aW5nIiwgJmFmZV9zZXR0aW5nKSA9PSAwKQo+ICsJCWlmIChhZmVf c2V0dGluZyA+PSBBUlJBWV9TSVpFKGFmZV9zZXR0aW5nX3RhYmxlKSkgewo+ICsJCQlEUk1fREVW X0VSUk9SKGRldiwgImFmZSBzZXR0aW5nIGVycm9yLCB1c2UgZGVmYXVsdCIpOwo+ICsJCQlhZmVf c2V0dGluZyA9IDA7Cj4gKwkJfQo+ICsKPiArCWl0NjUwNS0+YWZlX3NldHRpbmcgPSBhZmVfc2V0 dGluZzsKPiArfQo+ICsKPiArc3RhdGljIHNzaXplX3QgcHJpbnRfdGltaW5nX3Nob3coc3RydWN0 IGRldmljZSAqZGV2LAo+ICsJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFy ICpidWYpCj4gK3sKPiArCXN0cnVjdCBpdDY1MDUgKml0NjUwNSA9IGRldl9nZXRfZHJ2ZGF0YShk ZXYpOwo+ICsJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnZpZCA9ICZpdDY1MDUtPnZpZGVvX2lu Zm87Cj4gKwljaGFyICpzdHIgPSBidWYsICplbmQgPSBidWYgKyBQQUdFX1NJWkU7Cj4gKwo+ICsJ aXQ2NTA1X2NhbGNfdmlkZW9faW5mbyhpdDY1MDUpOwo+ICsJc3RyICs9IHNjbnByaW50ZihzdHIs IGVuZCAtIHN0ciwgIi0tLXZpZGVvIHRpbWluZy0tLVxuIik7Cj4gKwlzdHIgKz0gc2NucHJpbnRm KHN0ciwgZW5kIC0gc3RyLCAiUENMSzolZC4lMDNkTUh6XG4iLAo+ICsJCQkgdmlkLT5jbG9jayAv IDEwMDAsIHZpZC0+Y2xvY2sgJSAxMDAwKTsKPiArCXN0ciArPSBzY25wcmludGYoc3RyLCBlbmQg LSBzdHIsICJIVG90YWw6JWRcbiIsIHZpZC0+aHRvdGFsKTsKPiArCXN0ciArPSBzY25wcmludGYo c3RyLCBlbmQgLSBzdHIsICJIQWN0aXZlOiVkXG4iLCB2aWQtPmhkaXNwbGF5KTsKPiArCXN0ciAr PSBzY25wcmludGYoc3RyLCBlbmQgLSBzdHIsICJIRnJvbnRQb3JjaDolZFxuIiwKPiArCQkJIHZp ZC0+aHN5bmNfc3RhcnQgLSB2aWQtPmhkaXNwbGF5KTsKPiArCXN0ciArPSBzY25wcmludGYoc3Ry LCBlbmQgLSBzdHIsICJIU3luY1dpZHRoOiVkXG4iLAo+ICsJCQkgdmlkLT5oc3luY19lbmQgLSB2 aWQtPmhzeW5jX3N0YXJ0KTsKPiArCXN0ciArPSBzY25wcmludGYoc3RyLCBlbmQgLSBzdHIsICJI QmFja1BvcmNoOiVkXG4iLAo+ICsJCQkgdmlkLT5odG90YWwgLSB2aWQtPmhzeW5jX2VuZCk7Cj4g KwlzdHIgKz0gc2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAiVlRvdGFsOiVkXG4iLCB2aWQtPnZ0 b3RhbCk7Cj4gKwlzdHIgKz0gc2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAiVkFjdGl2ZTolZFxu IiwgdmlkLT52ZGlzcGxheSk7Cj4gKwlzdHIgKz0gc2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAi VkZyb250UG9yY2g6JWRcbiIsCj4gKwkJCSB2aWQtPnZzeW5jX3N0YXJ0IC0gdmlkLT52ZGlzcGxh eSk7Cj4gKwlzdHIgKz0gc2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAiVlN5bmNXaWR0aDolZFxu IiwKPiArCQkJIHZpZC0+dnN5bmNfZW5kIC0gdmlkLT52c3luY19zdGFydCk7Cj4gKwlzdHIgKz0g c2NucHJpbnRmKHN0ciwgZW5kIC0gc3RyLCAiVkJhY2tQb3JjaDolZFxuIiwKPiArCQkJIHZpZC0+ dnRvdGFsIC0gdmlkLT52c3luY19lbmQpOwo+ICsKPiArCXJldHVybiBzdHIgLSBidWY7Cj4gK30K PiArCj4gK3N0YXRpYyBzc2l6ZV90IGZvcmNlX3B3cm9ub2ZmX3N0b3JlKHN0cnVjdCBkZXZpY2Ug KmRldiwKPiArCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKPiArCQkJCSAg ICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKPiArewo+ICsJc3RydWN0IGl0NjUwNSAq aXQ2NTA1ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gKwlpbnQgcHdyOwo+ICsKPiArCWlmIChr c3RydG9pbnQoYnVmLCAxMCwgJnB3cikgPCAwKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiAr CWlmIChwd3IpCj4gKwkJaXQ2NTA1X3Bvd2Vyb24oaXQ2NTA1KTsKPiArCWVsc2UKPiArCQlpdDY1 MDVfcG93ZXJvZmYoaXQ2NTA1KTsKPiArCj4gKwlyZXR1cm4gY291bnQ7Cj4gK30KPiArCj4gK3N0 YXRpYyBzc2l6ZV90IGVuYWJsZV9kcnZfaG9sZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKPiAr CQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQo+ICt7Cj4g KwlzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiArCj4gKwly ZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGl0NjUwNS0+ZW5hYmxlX2Ry dl9ob2xkKTsKPiArfQo+ICsKPiArc3RhdGljIHNzaXplX3QgZW5hYmxlX2Rydl9ob2xkX3N0b3Jl KHN0cnVjdCBkZXZpY2UgKmRldiwKPiArCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUg KmF0dHIsCj4gKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQo+ICt7Cj4g KwlzdHJ1Y3QgaXQ2NTA1ICppdDY1MDUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiArCXVuc2ln bmVkIGludCBkcnZfaG9sZDsKPiArCj4gKwlpZiAoa3N0cnRvaW50KGJ1ZiwgMTAsICZkcnZfaG9s ZCkgPCAwKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCWl0NjUwNS0+ZW5hYmxlX2Rydl9o b2xkID0gISFkcnZfaG9sZDsKPiArCj4gKwlpZiAoaXQ2NTA1LT5lbmFibGVfZHJ2X2hvbGQpIHsK PiArCQlpdDY1MDVfaW50X21hc2tfZGlzYWJsZShpdDY1MDUpOwo+ICsJfSBlbHNlIHsKPiArCQlp dDY1MDVfY2xlYXJfaW50KGl0NjUwNSk7Cj4gKwkJaXQ2NTA1X2ludF9tYXNrX2VuYWJsZShpdDY1 MDUpOwo+ICsKPiArCQlpZiAoaXQ2NTA1LT5wb3dlcmVkKSB7Cj4gKwkJCWl0NjUwNS0+Y29ubmVj dG9yX3N0YXR1cyA9Cj4gKwkJCQkJaXQ2NTA1X2dldF9zaW5rX2hwZF9zdGF0dXMoaXQ2NTA1KSA/ Cj4gKwkJCQkJY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQgOgo+ICsJCQkJCWNvbm5lY3Rvcl9z dGF0dXNfZGlzY29ubmVjdGVkOwo+ICsJCX0gZWxzZSB7Cj4gKwkJCWl0NjUwNS0+Y29ubmVjdG9y X3N0YXR1cyA9Cj4gKwkJCQkJY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cj4gKwkJfQo+ ICsJfQo+ICsJcmV0dXJuIGNvdW50Owo+ICt9Cj4gKwo+ICtzdGF0aWMgREVWSUNFX0FUVFJfUk8o cHJpbnRfdGltaW5nKTsKPiArc3RhdGljIERFVklDRV9BVFRSX1dPKGZvcmNlX3B3cm9ub2ZmKTsK PiArc3RhdGljIERFVklDRV9BVFRSX1JXKGVuYWJsZV9kcnZfaG9sZCk7Cj4gKwo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqaXQ2NTA1X2F0dHJzW10gPSB7Cj4gKwkmZGV2X2F0dHJf cHJpbnRfdGltaW5nLmF0dHIsCj4gKwkmZGV2X2F0dHJfZm9yY2VfcHdyb25vZmYuYXR0ciwKPiAr CSZkZXZfYXR0cl9lbmFibGVfZHJ2X2hvbGQuYXR0ciwKPiArCU5VTEwsCj4gK307Cj4gKwo+ICtz dGF0aWMgaW50IGl0NjUwNV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKPiAr CQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKPiArewo+ICsJc3RydWN0IGl0 NjUwNSAqaXQ2NTA1Owo+ICsJc3RydWN0IGl0NjUwNV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKPiAr CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKPiArCXN0cnVjdCBleHRjb25fZGV2 ICpleHRjb247Cj4gKwlpbnQgZXJyLCBpbnRwX2lycTsKPiArCj4gKwlpdDY1MDUgPSBkZXZtX2t6 YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKml0NjUwNSksIEdGUF9LRVJORUwpOwo+ICsJaWYg KCFpdDY1MDUpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJbXV0ZXhfaW5pdCgmaXQ2NTA1 LT5leHRjb25fbG9jayk7Cj4gKwltdXRleF9pbml0KCZpdDY1MDUtPm1vZGVfbG9jayk7Cj4gKwlt dXRleF9pbml0KCZpdDY1MDUtPmF1eF9sb2NrKTsKPiArCj4gKwlwZGF0YSA9ICZpdDY1MDUtPnBk YXRhOwo+ICsKPiArCWl0NjUwNS0+YnJpZGdlLm9mX25vZGUgPSBjbGllbnQtPmRldi5vZl9ub2Rl Owo+ICsJaXQ2NTA1LT5jb25uZWN0b3Jfc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25u ZWN0ZWQ7Cj4gKwlpdDY1MDUtPmNsaWVudCA9IGNsaWVudDsKPiArCWkyY19zZXRfY2xpZW50ZGF0 YShjbGllbnQsIGl0NjUwNSk7Cj4gKwo+ICsJLyogZ2V0IGV4dGNvbiBkZXZpY2UgZnJvbSBEVFMg Ki8KPiArCWV4dGNvbiA9IGV4dGNvbl9nZXRfZWRldl9ieV9waGFuZGxlKGRldiwgMCk7Cj4gKwlp ZiAoUFRSX0VSUihleHRjb24pID09IC1FUFJPQkVfREVGRVIpCj4gKwkJcmV0dXJuIC1FUFJPQkVf REVGRVI7Cj4gKwlpZiAoSVNfRVJSKGV4dGNvbikpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwg ImNhbiBub3QgZ2V0IGV4dGNvbiBkZXZpY2UhIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9 Cj4gKwo+ICsJaXQ2NTA1LT5leHRjb24gPSBleHRjb247Cj4gKwo+ICsJaXQ2NTA1LT5yZWdtYXAg PSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZpdDY1MDVfcmVnbWFwX2NvbmZpZyk7Cj4g KwlpZiAoSVNfRVJSKGl0NjUwNS0+cmVnbWFwKSkgewo+ICsJCURSTV9ERVZfRVJST1IoZGV2LCAi cmVnbWFwIGkyYyBpbml0IGZhaWxlZCIpOwo+ICsJCWVyciA9IFBUUl9FUlIoaXQ2NTA1LT5yZWdt YXApOwo+ICsJCXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJZXJyID0gaXQ2NTA1X2luaXRfcGRh dGEoaXQ2NTA1KTsKPiArCWlmIChlcnIpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwgIkZhaWxl ZCB0byBpbml0aWFsaXplIHBkYXRhOiAlZCIsIGVycik7Cj4gKwkJcmV0dXJuIGVycjsKPiArCX0K PiArCj4gKwlpdDY1MDVfcGFyc2VfZHQoaXQ2NTA1KTsKPiArCj4gKwlpbnRwX2lycSA9IGNsaWVu dC0+aXJxOwo+ICsKPiArCWlmICghaW50cF9pcnEpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwg IkZhaWxlZCB0byBnZXQgSU5UUCBJUlEiKTsKPiArCQllcnIgPSAtRU5PREVWOwo+ICsJCXJldHVy biBlcnI7Cj4gKwl9Cj4gKwo+ICsJZXJyID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmY2xp ZW50LT5kZXYsIGludHBfaXJxLCBOVUxMLAo+ICsJCQkJCWl0NjUwNV9pbnRfdGhyZWFkZWRfaGFu ZGxlciwKPiArCQkJCQlJUlFGX1RSSUdHRVJfTE9XIHwgSVJRRl9PTkVTSE9ULAo+ICsJCQkJCSJp dDY1MDUtaW50cCIsIGl0NjUwNSk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihk ZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBJTlRQIHRocmVhZGVkIElSUTogJWQiLAo+ICsJCQkgICAg ICBlcnIpOwo+ICsJCXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJLyogUmVnaXN0ZXIgYXV4IGNo YW5uZWwgKi8KPiArCWl0NjUwNS0+YXV4Lm5hbWUgPSAiRFAtQVVYIjsKPiArCWl0NjUwNS0+YXV4 LmRldiA9IGRldjsKPiArCWl0NjUwNS0+YXV4LnRyYW5zZmVyID0gaXQ2NTA1X2F1eF90cmFuc2Zl cjsKPiArCj4gKwllcnIgPSBkcm1fZHBfYXV4X3JlZ2lzdGVyKCZpdDY1MDUtPmF1eCk7Cj4gKwlp ZiAoZXJyIDwgMCkgewo+ICsJCURSTV9ERVZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVy IGF1eDogJWQiLCBlcnIpOwo+ICsJCXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJSU5JVF9XT1JL KCZpdDY1MDUtPmxpbmtfd29ya3MsIGl0NjUwNV9saW5rX3RyYWluaW5nX3dvcmspOwo+ICsJaW5p dF9jb21wbGV0aW9uKCZpdDY1MDUtPndhaXRfZWRpZF9jb21wbGV0ZSk7Cj4gKwlpdDY1MDUtPnBv d2VyZWQgPSBmYWxzZTsKPiArCWl0NjUwNS0+ZW5hYmxlX2Rydl9ob2xkID0gREVGQVVMVF9EUlZf SE9MRDsKPiArCj4gKwlpZiAoREVGQVVMVF9QV1JfT04pCj4gKwkJaXQ2NTA1X3Bvd2Vyb24oaXQ2 NTA1KTsKPiArCj4gKwllcnIgPSBzeXNmc19jcmVhdGVfZmlsZXMoJmNsaWVudC0+ZGV2LmtvYmos IGl0NjUwNV9hdHRycyk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJZHJtX2RwX2F1eF91bnJlZ2lzdGVy KCZpdDY1MDUtPmF1eCk7Cj4gKwkJcmV0dXJuIGVycjsKPiArCX0KPiArCj4gKwlpdDY1MDUtPmJy aWRnZS5mdW5jcyA9ICZpdDY1MDVfYnJpZGdlX2Z1bmNzOwo+ICsJZHJtX2JyaWRnZV9hZGQoJml0 NjUwNS0+YnJpZGdlKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBp dDY1MDVfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQo+ICt7Cj4gKwlzdHJ1 Y3QgaXQ2NTA1ICppdDY1MDUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKPiArCj4gKwlk cm1fY29ubmVjdG9yX3VucmVnaXN0ZXIoJml0NjUwNS0+Y29ubmVjdG9yKTsKPiArCWRybV9jb25u ZWN0b3JfY2xlYW51cCgmaXQ2NTA1LT5jb25uZWN0b3IpOwo+ICsJZHJtX2JyaWRnZV9yZW1vdmUo Jml0NjUwNS0+YnJpZGdlKTsKPiArCWRybV9kcF9hdXhfdW5yZWdpc3RlcigmaXQ2NTA1LT5hdXgp Owo+ICsJc3lzZnNfcmVtb3ZlX2ZpbGVzKCZjbGllbnQtPmRldi5rb2JqLCBpdDY1MDVfYXR0cnMp Owo+ICsJaXQ2NTA1X3Bvd2Vyb2ZmKGl0NjUwNSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiAr Cj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBpdDY1MDVfaWRbXSA9IHsKPiAr CXsgIml0NjUwNSIsIDAgfSwKPiArCXsgfQo+ICt9Owo+ICsKPiArTU9EVUxFX0RFVklDRV9UQUJM RShpMmMsIGl0NjUwNV9pZCk7Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9p ZCBpdDY1MDVfb2ZfbWF0Y2hbXSA9IHsKPiArCXsgLmNvbXBhdGlibGUgPSAiaXRlLGl0NjUwNSIg fSwKPiArCXsgfQo+ICt9Owo+ICsKPiArc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGl0NjUwNV9p MmNfZHJpdmVyID0gewo+ICsJLmRyaXZlciA9IHsKPiArCQkubmFtZSA9ICJpdDY1MDUiLAo+ICsJ CS5vZl9tYXRjaF90YWJsZSA9IGl0NjUwNV9vZl9tYXRjaCwKPiArCQkucG0gPSAmaXQ2NTA1X2Jy aWRnZV9wbV9vcHMsCj4gKwl9LAo+ICsJLnByb2JlID0gaXQ2NTA1X2kyY19wcm9iZSwKPiArCS5y ZW1vdmUgPSBpdDY1MDVfaTJjX3JlbW92ZSwKPiArCS5pZF90YWJsZSA9IGl0NjUwNV9pZCwKPiAr fTsKPiArCj4gK21vZHVsZV9pMmNfZHJpdmVyKGl0NjUwNV9pMmNfZHJpdmVyKTsKPiArCj4gK01P RFVMRV9BVVRIT1IoIkhlcm1lcyBXdSA8aGVybWVzLnd1QGl0ZS5jb20udHc+Iik7Cj4gK01PRFVM RV9ERVNDUklQVElPTigiSVQ2NTA1IERpc3BsYXlQb3J0IFRyYW5zbWl0dGVyIGRyaXZlciIpOwo+ ICtNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cj4gLS0gCj4gMS45LjEKPiAKPiBfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+IGRyaS1kZXZlbCBtYWlsaW5n IGxpc3QKPiBkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gaHR0cHM6Ly9saXN0cy5m cmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApk cmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Au b3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==