From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793675496; b=C9A1LHR1aXCNzyx/WQLj0esX8S1VxzP4Jfya8cAp7l9ikvNkXaVOYqnYDBxY60uy4XCR 9nTXjCpn13K3ypl58zt/WVcrLVSvS8trbMz2b8aE6kqc7gAB5plI0aKJ5oYM9+uaUinLH /Sle3TB4QzhPw/LW7WrmVP55gn8gPIN3K9TYzkKtMAYc7gbkZOcUpp/8DxvAJ9i/s0v39 zex9w9VzU7Ug/70RzCU5EZ9gEu2tzFElTNz9wukBED9i4MajMT12nefd0XRZYu9EFV3Qq sR3Ng73LRNKh8JOuK087OfNNmtBN7V/9nZCpEbsjr4xw+TfcXH5DZjOZY0+shmXdHYw== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793675496; h=Received:DKIM-Signature:Message-ID:From:Subject:Reply-To:To:Cc: In-Reply-To:References:Content-Type:Content-Transfer-Encoding:Date; bh=34lnL3/2E9Q5qWjt9BFmVHAcQcUIN41uKsm9o3mcoSM=; b=fmy4ELq6IHoow+wf0x7SynHz+ype6nDdkY8MjuR86kpWMgUR15CipPRoXePhxfCoT5fl 79EIWZJHsfR2spya0Y4UBvL9NfxcRTdNN8f6O2KCnEKPdCQ02+8XVIwecIn/D+Qzpv7Xf PwUM4q8KvmeeqMmusROGNAnJTJ2JSoC41X5mTA2ETzFBkDiD0W1hAhBW8RRsZ9BCZNE+p rzXXsX3/iNiClSlJRWT49UiexqwJZyDrR6a8DRqPAp7OHZLm4bIv9SioAR9suraBwcFNv +zS/WCNE1HXtFsld6LChveBTvTiwBgcNshDtdqjjEQ0XX3cDLdXh55RMeqX1wrt7Gnw== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=BTBiybBE; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AA04D606A324 for ; Tue, 3 Nov 2026 03:11:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=BTBiybBE Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1014A1F000C1; Tue, 3 Nov 2026 03:11:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793675495; bh=34lnL3/2E9Q5qWjt9BFmVHAcQcUIN41uKsm9o3mcoSM=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=BTBiybBEn7bRifcH6jStCBbkTpuDM3ENzXX45ng2tJ8dDDTcLiv1rnfiNARW5EgJg /BjyS9kNqZ8wdtdEFRabBYcRdmBNH1Hn/4CIU4ygjLsBb7iszrfu7t/aGdFoDSJLWH 75gu2bI4KfprtTDuU7h19M8xSik7Ep0mGidsiFeEbJPT0KFsjzzvuLauJzyGld/s1b 8wtGk0Cjbb4ezxFTFSCj1UJPjj/2Ejo2TGIafJxtHresLT9lEsTH/6h73BMogtMOsB VwIPmJKBfcSQY74LpLav3KtflJn/g+oesJ+OUr2OjDn10hZgNgo6abvhrp4/AJFkra NpYzg8qvbpIXw== Message-ID: From: sashiko-bot@kernel.org Subject: Re: [PATCH v5 2/2] i2c: amlogic: Add Amlogic A9 I2C controller driver Reply-To: sashiko-reviews@lists.linux.dev To: "Xianwei Zhao" Cc: linux-amlogic@lists.infradead.org, devicetree@vger.kernel.org, robh@kernel.org, conor+dt@kernel.org, neil.armstrong@linaro.org In-Reply-To: <20261103-a9-i2c-v5-2-86f2dcd179d8@amlogic.com> References: <20261103-a9-i2c-v5-0-86f2dcd179d8@amlogic.com> <20261103-a9-i2c-v5-2-86f2dcd179d8@amlogic.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Tue, 03 Nov 2026 03:11:34 +0000 X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list Thank you for your contribution! Sashiko AI review found 5 potential issue(= s) to consider: - [High] i2c: amlogic: unstopped hw transfer on timeout in aml_i2c_xfer_msg= () - [Medium] i2c: amlogic-a9: transfer started before IRQ setup in aml_i2c_do= _start() - [Medium] i2c: amlogic-a9: missed completion in aml_i2c_irq() on multi-chu= nk reads - [Low] i2c: amlogic: use of deprecated master_xfer in aml_i2c_algorithm - [Low] i2c: amlogic-a9: off-by-one minimum divider check in aml_i2c_set_cl= k_div() -- commit 0ce6cfd604c34b299eddac3e8d6a46653816e69c Author: Junyi Zhao i2c: amlogic: Add Amlogic A9 I2C controller driver This commit adds a driver for the I2C controller found on Amlogic A9 SoCs, along with the corresponding Kconfig, Makefile, and MAINTAINERS entries. > diff --git a/drivers/i2c/busses/i2c-amlogic-a9.c b/drivers/i2c/busses/i2c= -amlogic-a9.c > new file mode 100644 > index 0000000000000..d7f88d6feb05b > --- /dev/null > +++ b/drivers/i2c/busses/i2c-amlogic-a9.c > @@ -0,0 +1,431 @@ [ ... ] > +/* > + * SCL =3D clk/b_ratio. if b_ratio<=3D8, SCL =3D clk/8 > + */ > +static int aml_i2c_set_clk_div(struct aml_i2c *i2c) > +{ > + unsigned long clk_rate =3D i2c->clk_rate; > + unsigned int div; > + > + div =3D DIV_ROUND_UP(clk_rate, i2c->frequency); > + > + /* clock divider has 12 bits */ > + if (div >=3D (1 << 12)) { > + dev_err(i2c->dev, "requested bus frequency too low\n"); > + return -EINVAL; > + } else if (div <=3D 8) { > + dev_err(i2c->dev, "requested bus frequency too high\n"); > + return -EINVAL; > + } [Severity: Low] In aml_i2c_set_clk_div(), the comment notes that b_ratio <=3D 8 yields SCL =3D clk / 8. Since div =3D=3D 8 is the minimum divider that produces th= e exact clk / 8 frequency without clamping, should this check be div < 8 rather than div <=3D 8 so that a valid divider of 8 is not rejected with -EINVAL? [ ... ] > +static irqreturn_t aml_i2c_irq(int irqno, void *dev_id) > +{ > + struct aml_i2c *i2c =3D dev_id; > + u8 *buf =3D NULL; > + u32 rd_len, i; > + u32 rd_val; > + u32 irq_state; > + > + spin_lock(&i2c->lock); > + > + irq_state =3D readl(i2c->regs + REG_CFG_IRQ_STATE); > + if (i2c->state =3D=3D A9_STATE_IDLE) { > + dev_warn(i2c->dev, "i2c irq triggered abnormally, irq_state:0x%x,irq_e= n:0x%x\n", > + irq_state, readl(i2c->regs + REG_CFG_IRQ_ENABLE)); > + goto complete_irq_out; > + } > + > + if (irq_state & A9_TRANS_ERROR) { > + i2c->error =3D -ENXIO; > + goto complete_irq_out; > + } > + > + switch (i2c->state) { > + case A9_STATE_READ: > + buf =3D i2c->msg->buf; > + rd_len =3D min(i2c->msg->len - i2c->pos, A9_I2C_FIFO_DEPTH); > + for (i =3D 0; i < rd_len; i++) { > + rd_val =3D readl(i2c->regs + REG_CFG_RX); > + buf[i2c->pos++] =3D rd_val & TX_RX_DATA; > + } > + /* Rx must clear thresh after read fifo */ > + clear_irq_status(i2c, A9_RX_THRESH_READ); > + break; > + case A9_STATE_WRITE: > + aml_i2c_prepare_xfer(i2c, A9_FIFO_FILL_HALF); > + if (i2c->pos =3D=3D i2c->msg->len) > + aml_i2c_set_mask(i2c, REG_CFG_IRQ_ENABLE, A9_TX_THRESH_WRITE, 0); > + /* Tx must clear thresh after write fifo */ > + clear_irq_status(i2c, A9_TX_THRESH_WRITE); > + break; > + default: > + break; > + } > + > + if (!(irq_state & A9_TRANS_DONE) || > + (i2c->state =3D=3D A9_STATE_READ && i2c->pos < i2c->msg->len)) > + goto irq_trans_out; > + > +complete_irq_out: > + i2c->state =3D A9_STATE_IDLE; > + reset_fifo_pos(i2c); > + complete(&i2c->done); > + aml_i2c_set_mask(i2c, REG_CFG_IRQ_ENABLE, A9_RX_THRESH_READ | A9_TX_THR= ESH_WRITE, 0); > + clear_irq_status(i2c, IRQ_ALL_MASK); > +irq_trans_out: > + spin_unlock(&i2c->lock); > + > + return IRQ_HANDLED; > +} [Severity: Medium] As reported by Sashiko on v2 [1], can multi-chunk I2C read transfers (msg->len > A9_I2C_FIFO_DEPTH) miss the transfer completion interrupt in aml_i2c_irq()? Unlike A9_STATE_WRITE, which disables A9_TX_THRESH_WRITE once the final byt= es are queued, A9_STATE_READ leaves A9_RX_THRESH_READ enabled and samples REG_CFG_IRQ_STATE only once upon entry. When msg->len is a multiple of 32 (for example, 64), the 32nd byte of the final chunk triggers A9_RX_THRESH_READ before the I2C STOP condition finish= es on the bus. If A9_PHY_DONE asserts while aml_i2c_irq() is draining those 32 bytes from REG_CFG_RX and before A9_RX_THRESH_READ is cleared, the interrupt line remains continuously asserted without generating a new rising edge, wh= ile aml_i2c_irq() takes goto irq_trans_out because the initial irq_state snapsh= ot did not have A9_TRANS_DONE set. Similarly, if both A9_RX_THRESH_READ and A9_PHY_DONE are set when aml_i2c_irq() enters with more than 32 bytes remaining, aml_i2c_irq() drains only 32 bytes, clears only A9_RX_THRESH_READ, and exits via irq_trans_out w= ith i2c->pos < i2c->msg->len. Because A9_PHY_DONE is already asserted and fewer than 32 bytes remain to re-trigger A9_RX_THRESH_READ, no further interrupt = edge occurs, leaving wait_for_completion_timeout() in aml_i2c_xfer_msg() to time out with -ETIMEDOUT. > + > +static void aml_i2c_do_start(struct aml_i2c *i2c, struct i2c_msg *msg) > +{ > + unsigned int reg_val; > + unsigned int trans_len; > + > + trans_len =3D msg->len; > + reg_val =3D (unsigned int)(((msg->addr & 0x7f) << START_SADDR_SHIFT) | > + ((msg->flags & I2C_M_RD) ? START_READ : 0) | > + ((trans_len & 0xfff) << START_LEN_SHIFT) | START_START); > + aml_i2c_set_mask(i2c, REG_CFG_START, > + START_START | START_SLAVE_ADDR | START_READ | START_LEN, reg_val); > + clear_irq_status(i2c, IRQ_ALL_MASK); > + /* enable thresh mode */ > + if (trans_len > A9_I2C_FIFO_DEPTH) { > + reg_val =3D (msg->flags & I2C_M_RD) ? A9_RX_THRESH_READ : A9_TX_THRESH= _WRITE; > + aml_i2c_set_mask(i2c, REG_CFG_IRQ_ENABLE, > + A9_RX_THRESH_READ | A9_TX_THRESH_WRITE, reg_val); > + } > +} [Severity: Medium] As reported by Sashiko on v2 [2], in aml_i2c_do_start(), setting START_START in REG_CFG_START begins the hardware transfer while A9_ENABLE_IRQ_BIT (A9_NCK_ERROR | A9_PHY_DONE) is already enabled in REG_CFG_IRQ_ENABLE, befo= re clear_irq_status(i2c, IRQ_ALL_MASK) is called and before A9_RX_THRESH_READ = or A9_TX_THRESH_WRITE is enabled in REG_CFG_IRQ_ENABLE. If execution is delayed between writing REG_CFG_START and writing REG_CFG_IRQ_STATE (for example, due to task preemption under CONFIG_PREEMPT= _RT, vCPU preemption, or NMI/FIQ latency), the controller can assert A9_NCK_ERROR on an address NACK or A9_PHY_DONE on a short transfer, which is then wiped = out by clear_irq_status(i2c, IRQ_ALL_MASK) before aml_i2c_irq() acquires i2c->l= ock and reads REG_CFG_IRQ_STATE. When aml_i2c_irq() runs, it sees !(irq_state & A9_TRANS_DONE) and exits via irq_trans_out without completing i2c->done, causing aml_i2c_xfer_msg() to time out. Should the interrupt status be cleared and the threshold interrupts enabled before asserting START_START in REG_CFG_START? > + > +static int aml_i2c_xfer_msg(struct aml_i2c *i2c, struct i2c_msg *msg, bo= ol last) > +{ > + unsigned long time_left, flags; > + > + i2c->msg =3D msg; > + i2c->pos =3D 0; > + i2c->error =3D 0; > + > + spin_lock_irqsave(&i2c->lock, flags); > + i2c->state =3D (msg->flags & I2C_M_RD) ? A9_STATE_READ : A9_STATE_WRITE; > + aml_i2c_prepare_xfer(i2c, A9_FIFO_FILL_FULL); > + reinit_completion(&i2c->done); > + > + aml_i2c_set_mask(i2c, REG_CFG_BUS, BUS_NO_STOP, (last ? 0 : BUS_NO_STOP= )); > + > + /* Start the transfer */ > + aml_i2c_do_start(i2c, msg); > + spin_unlock_irqrestore(&i2c->lock, flags); > + > + time_left =3D msecs_to_jiffies(I2C_TIMEOUT_MS); > + time_left =3D wait_for_completion_timeout(&i2c->done, time_left); > + > + /* > + * Protect access to i2c struct and registers from interrupt > + * handlers triggered by a transfer terminated after the > + * timeout period > + */ > + > + if (!time_left) { > + guard(spinlock_irqsave)(&i2c->lock); > + i2c->state =3D A9_STATE_IDLE; > + aml_i2c_set_mask(i2c, REG_CFG_IRQ_ENABLE, > + A9_RX_THRESH_READ | A9_TX_THRESH_WRITE, 0); > + clear_irq_status(i2c, IRQ_ALL_MASK); > + reset_fifo_pos(i2c); > + return -ETIMEDOUT; > + } > + > + return i2c->error; > +} [Severity: High] As reported by Sashiko on v2 [3], when wait_for_completion_timeout() expires (!time_left) in aml_i2c_xfer_msg(), this timeout path sets i2c->state to A9_STATE_IDLE, disables the threshold IRQs, clears REG_CFG_IRQ_STATE, and calls reset_fifo_pos(i2c), but never clears START_START in REG_CFG_START or otherwise aborts the active hardware transfer while A9_ENABLE_IRQ_BIT remai= ns enabled in REG_CFG_IRQ_ENABLE. If the stalled transfer shifts additional bytes after reset_fifo_pos(i2c), = the hardware FIFO pointers become non-zero for the next message. Furthermore, if the stalled transfer finishes or NACKs after a subsequent aml_i2c_xfer_msg() has set i2c->state to A9_STATE_READ or A9_STATE_WRITE, aml_i2c_irq() will process the stale A9_PHY_DONE or A9_NCK_ERROR interrupt against the new i2c->msg, corrupting i2c->msg->buf, i2c->pos, and i2c->error and prematurely completing i2c->done. Even if the late interrupt arrives while i2c->state is still A9_STATE_IDLE, aml_i2c_irq() jumps to complete_irq_out and calls complete(&i2c->done) when no transfer is waiting. Also, this function mixes manual spin_lock_irqsave() / spin_unlock_irqresto= re() with guard(spinlock_irqsave)(&i2c->lock) without directly including linux/cleanup.h. Could the hardware transfer be explicitly halted on timeou= t, the spurious complete(&i2c->done) when A9_STATE_IDLE avoided, and the locki= ng style made consistent across aml_i2c_xfer_msg()? [ ... ] > +static const struct i2c_algorithm aml_i2c_algorithm =3D { > + .master_xfer =3D aml_i2c_xfer, > + .functionality =3D aml_i2c_func, > +}; [Severity: Low] In struct i2c_algorithm, master_xfer is marked deprecated in include/linux/= i2c.h in favor of xfer. Could aml_i2c_algorithm initialize .xfer =3D aml_i2c_xfer instead? [1] https://lore.kernel.org/r/sashiko-outbox-181284@kernel.org [2] https://lore.kernel.org/r/sashiko-outbox-181284@kernel.org [3] https://lore.kernel.org/r/sashiko-outbox-181284@kernel.org --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20261103-a9-i2c-v5-= 0-86f2dcd179d8@amlogic.com?part=3D2 From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 15BE1606A324 for ; Tue, 3 Nov 2026 03:11:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=Oyjn/TKd; dkim=fail reason="signature verification failed" (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=BTBiybBE DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Reply-To:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Date:References: In-Reply-To:Cc:To:Subject:From:Message-ID:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Unsubscribe-Post:List-Owner; bh=b79Hml9EaihlwyL0Dvc/rpFumTdHB+cRcbXij4YftEI=; b=Oyjn/TKdo+MbUmUy4wXKBiSMiY fCbfPEKTntmvMxS0RZ8CKmthGbovDIQGckuDzFro3Ad1ra8rc0lGnCDF3gdiqmRJp8Ux+nrmAkD06 pOBbNQnVQeJdLJagKXiAPfKi01y/sb3A5mmIdQkaCj2YUrCEjQ9Wklo1KyANg4zVJVCk4/l5gQ5Z5 6ljZPQ61WItuaaS7pbHwHvVFza55cku9nzuslXDw7vmoycgDEtSWXlWmrLXJYKKoK7wXWjYnG+Mgh JwPrDUbohS/L2OMkJLuQ9pcr8s6y3tFKr8z6U1H7bvJIyZVxhN1Z1bAYgOC91gqY8fay9goQhB4xL eTE/1vJQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xO4vx-00000000vNA-3mNg; Tue, 03 Nov 2026 03:11:37 +0000 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xO4vw-00000000vMs-00Eq for linux-amlogic@lists.infradead.org; Tue, 03 Nov 2026 03:11:36 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 70FC341A32; Tue, 3 Nov 2026 03:11:35 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1014A1F000C1; Tue, 3 Nov 2026 03:11:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793675495; bh=34lnL3/2E9Q5qWjt9BFmVHAcQcUIN41uKsm9o3mcoSM=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=BTBiybBEn7bRifcH6jStCBbkTpuDM3ENzXX45ng2tJ8dDDTcLiv1rnfiNARW5EgJg /BjyS9kNqZ8wdtdEFRabBYcRdmBNH1Hn/4CIU4ygjLsBb7iszrfu7t/aGdFoDSJLWH 75gu2bI4KfprtTDuU7h19M8xSik7Ep0mGidsiFeEbJPT0KFsjzzvuLauJzyGld/s1b 8wtGk0Cjbb4ezxFTFSCj1UJPjj/2Ejo2TGIafJxtHresLT9lEsTH/6h73BMogtMOsB VwIPmJKBfcSQY74LpLav3KtflJn/g+oesJ+OUr2OjDn10hZgNgo6abvhrp4/AJFkra NpYzg8qvbpIXw== Message-ID: From: sashiko-bot@kernel.org Subject: Re: [PATCH v5 2/2] i2c: amlogic: Add Amlogic A9 I2C controller driver To: "Xianwei Zhao" Cc: linux-amlogic@lists.infradead.org, devicetree@vger.kernel.org, robh@kernel.org, conor+dt@kernel.org, neil.armstrong@linaro.org In-Reply-To: <20261103-a9-i2c-v5-2-86f2dcd179d8@amlogic.com> References: <20261103-a9-i2c-v5-0-86f2dcd179d8@amlogic.com> <20261103-a9-i2c-v5-2-86f2dcd179d8@amlogic.com> Date: Tue, 03 Nov 2026 03:11:34 +0000 X-BeenThere: linux-amlogic@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: sashiko-reviews@lists.linux.dev X-Archived-By: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-amlogic" X-Spam-Status: No, score=-8.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 VGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbiEgU2FzaGlrbyBBSSByZXZpZXcgZm91bmQg NSBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6Ci0gW0hpZ2hdIGkyYzogYW1sb2dpYzog dW5zdG9wcGVkIGh3IHRyYW5zZmVyIG9uIHRpbWVvdXQgaW4gYW1sX2kyY194ZmVyX21zZygpCi0g W01lZGl1bV0gaTJjOiBhbWxvZ2ljLWE5OiB0cmFuc2ZlciBzdGFydGVkIGJlZm9yZSBJUlEgc2V0 dXAgaW4gYW1sX2kyY19kb19zdGFydCgpCi0gW01lZGl1bV0gaTJjOiBhbWxvZ2ljLWE5OiBtaXNz ZWQgY29tcGxldGlvbiBpbiBhbWxfaTJjX2lycSgpIG9uIG11bHRpLWNodW5rIHJlYWRzCi0gW0xv d10gaTJjOiBhbWxvZ2ljOiB1c2Ugb2YgZGVwcmVjYXRlZCBtYXN0ZXJfeGZlciBpbiBhbWxfaTJj X2FsZ29yaXRobQotIFtMb3ddIGkyYzogYW1sb2dpYy1hOTogb2ZmLWJ5LW9uZSBtaW5pbXVtIGRp dmlkZXIgY2hlY2sgaW4gYW1sX2kyY19zZXRfY2xrX2RpdigpCi0tCgpjb21taXQgMGNlNmNmZDYw NGMzNGIyOTllZGRhYzNlOGQ2YTQ2NjUzODE2ZTY5YwpBdXRob3I6IEp1bnlpIFpoYW8gPGp1bnlp LnpoYW9AYW1sb2dpYy5jb20+CgppMmM6IGFtbG9naWM6IEFkZCBBbWxvZ2ljIEE5IEkyQyBjb250 cm9sbGVyIGRyaXZlcgoKVGhpcyBjb21taXQgYWRkcyBhIGRyaXZlciBmb3IgdGhlIEkyQyBjb250 cm9sbGVyIGZvdW5kIG9uIEFtbG9naWMgQTkgU29DcywKYWxvbmcgd2l0aCB0aGUgY29ycmVzcG9u ZGluZyBLY29uZmlnLCBNYWtlZmlsZSwgYW5kIE1BSU5UQUlORVJTIGVudHJpZXMuCgo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtbG9naWMtYTkuYyBiL2RyaXZlcnMvaTJj L2J1c3Nlcy9pMmMtYW1sb2dpYy1hOS5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAw MDAwMDAwMDAwMDAwLi5kN2Y4OGQ2ZmViMDViCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZl cnMvaTJjL2J1c3Nlcy9pMmMtYW1sb2dpYy1hOS5jCj4gQEAgLTAsMCArMSw0MzEgQEAKClsgLi4u IF0KCj4gKy8qCj4gKyAqIFNDTCA9IGNsay9iX3JhdGlvLiBpZiBiX3JhdGlvPD04LCBTQ0wgPSBj bGsvOAo+ICsgKi8KPiArc3RhdGljIGludCBhbWxfaTJjX3NldF9jbGtfZGl2KHN0cnVjdCBhbWxf aTJjICppMmMpCj4gK3sKPiArCXVuc2lnbmVkIGxvbmcgY2xrX3JhdGUgPSBpMmMtPmNsa19yYXRl Owo+ICsJdW5zaWduZWQgaW50IGRpdjsKPiArCj4gKwlkaXYgPSBESVZfUk9VTkRfVVAoY2xrX3Jh dGUsIGkyYy0+ZnJlcXVlbmN5KTsKPiArCj4gKwkvKiBjbG9jayBkaXZpZGVyIGhhcyAxMiBiaXRz ICovCj4gKwlpZiAoZGl2ID49ICgxIDw8IDEyKSkgewo+ICsJCWRldl9lcnIoaTJjLT5kZXYsICJy ZXF1ZXN0ZWQgYnVzIGZyZXF1ZW5jeSB0b28gbG93XG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsK PiArCX0gZWxzZSBpZiAoZGl2IDw9IDgpIHsKPiArCQlkZXZfZXJyKGkyYy0+ZGV2LCAicmVxdWVz dGVkIGJ1cyBmcmVxdWVuY3kgdG9vIGhpZ2hcbiIpOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJ fQoKW1NldmVyaXR5OiBMb3ddCkluIGFtbF9pMmNfc2V0X2Nsa19kaXYoKSwgdGhlIGNvbW1lbnQg bm90ZXMgdGhhdCBiX3JhdGlvIDw9IDggeWllbGRzClNDTCA9IGNsayAvIDguIFNpbmNlIGRpdiA9 PSA4IGlzIHRoZSBtaW5pbXVtIGRpdmlkZXIgdGhhdCBwcm9kdWNlcyB0aGUgZXhhY3QKY2xrIC8g OCBmcmVxdWVuY3kgd2l0aG91dCBjbGFtcGluZywgc2hvdWxkIHRoaXMgY2hlY2sgYmUgZGl2IDwg OCByYXRoZXIgdGhhbgpkaXYgPD0gOCBzbyB0aGF0IGEgdmFsaWQgZGl2aWRlciBvZiA4IGlzIG5v dCByZWplY3RlZCB3aXRoIC1FSU5WQUw/CgpbIC4uLiBdCgo+ICtzdGF0aWMgaXJxcmV0dXJuX3Qg YW1sX2kyY19pcnEoaW50IGlycW5vLCB2b2lkICpkZXZfaWQpCj4gK3sKPiArCXN0cnVjdCBhbWxf aTJjICppMmMgPSBkZXZfaWQ7Cj4gKwl1OCAqYnVmID0gTlVMTDsKPiArCXUzMiByZF9sZW4sIGk7 Cj4gKwl1MzIgcmRfdmFsOwo+ICsJdTMyIGlycV9zdGF0ZTsKPiArCj4gKwlzcGluX2xvY2soJmky Yy0+bG9jayk7Cj4gKwo+ICsJaXJxX3N0YXRlID0gcmVhZGwoaTJjLT5yZWdzICsgUkVHX0NGR19J UlFfU1RBVEUpOwo+ICsJaWYgKGkyYy0+c3RhdGUgPT0gQTlfU1RBVEVfSURMRSkgewo+ICsJCWRl dl93YXJuKGkyYy0+ZGV2LCAiaTJjIGlycSB0cmlnZ2VyZWQgYWJub3JtYWxseSwgaXJxX3N0YXRl OjB4JXgsaXJxX2VuOjB4JXhcbiIsCj4gKwkJCSBpcnFfc3RhdGUsIHJlYWRsKGkyYy0+cmVncyAr IFJFR19DRkdfSVJRX0VOQUJMRSkpOwo+ICsJCWdvdG8gY29tcGxldGVfaXJxX291dDsKPiArCX0K PiArCj4gKwlpZiAoaXJxX3N0YXRlICYgQTlfVFJBTlNfRVJST1IpIHsKPiArCQlpMmMtPmVycm9y ID0gLUVOWElPOwo+ICsJCWdvdG8gY29tcGxldGVfaXJxX291dDsKPiArCX0KPiArCj4gKwlzd2l0 Y2ggKGkyYy0+c3RhdGUpIHsKPiArCWNhc2UgQTlfU1RBVEVfUkVBRDoKPiArCQlidWYgPSBpMmMt Pm1zZy0+YnVmOwo+ICsJCXJkX2xlbiA9IG1pbihpMmMtPm1zZy0+bGVuIC0gaTJjLT5wb3MsIEE5 X0kyQ19GSUZPX0RFUFRIKTsKPiArCQlmb3IgKGkgPSAwOyBpIDwgcmRfbGVuOyBpKyspIHsKPiAr CQkJcmRfdmFsID0gcmVhZGwoaTJjLT5yZWdzICsgUkVHX0NGR19SWCk7Cj4gKwkJCWJ1ZltpMmMt PnBvcysrXSA9IHJkX3ZhbCAmIFRYX1JYX0RBVEE7Cj4gKwkJfQo+ICsJCS8qIFJ4IG11c3QgY2xl YXIgdGhyZXNoIGFmdGVyIHJlYWQgZmlmbyAqLwo+ICsJCWNsZWFyX2lycV9zdGF0dXMoaTJjLCBB OV9SWF9USFJFU0hfUkVBRCk7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIEE5X1NUQVRFX1dSSVRFOgo+ ICsJCWFtbF9pMmNfcHJlcGFyZV94ZmVyKGkyYywgQTlfRklGT19GSUxMX0hBTEYpOwo+ICsJCWlm IChpMmMtPnBvcyA9PSBpMmMtPm1zZy0+bGVuKQo+ICsJCQlhbWxfaTJjX3NldF9tYXNrKGkyYywg UkVHX0NGR19JUlFfRU5BQkxFLCBBOV9UWF9USFJFU0hfV1JJVEUsIDApOwo+ICsJCS8qIFR4IG11 c3QgY2xlYXIgdGhyZXNoIGFmdGVyIHdyaXRlIGZpZm8gKi8KPiArCQljbGVhcl9pcnFfc3RhdHVz KGkyYywgQTlfVFhfVEhSRVNIX1dSSVRFKTsKPiArCQlicmVhazsKPiArCWRlZmF1bHQ6Cj4gKwkJ YnJlYWs7Cj4gKwl9Cj4gKwo+ICsJaWYgKCEoaXJxX3N0YXRlICYgQTlfVFJBTlNfRE9ORSkgfHwK PiArCSAgICAoaTJjLT5zdGF0ZSA9PSBBOV9TVEFURV9SRUFEICYmIGkyYy0+cG9zIDwgaTJjLT5t c2ctPmxlbikpCj4gKwkJZ290byBpcnFfdHJhbnNfb3V0Owo+ICsKPiArY29tcGxldGVfaXJxX291 dDoKPiArCWkyYy0+c3RhdGUgPSBBOV9TVEFURV9JRExFOwo+ICsJcmVzZXRfZmlmb19wb3MoaTJj KTsKPiArCWNvbXBsZXRlKCZpMmMtPmRvbmUpOwo+ICsJYW1sX2kyY19zZXRfbWFzayhpMmMsIFJF R19DRkdfSVJRX0VOQUJMRSwgQTlfUlhfVEhSRVNIX1JFQUQgfCBBOV9UWF9USFJFU0hfV1JJVEUs IDApOwo+ICsJY2xlYXJfaXJxX3N0YXR1cyhpMmMsIElSUV9BTExfTUFTSyk7Cj4gK2lycV90cmFu c19vdXQ6Cj4gKwlzcGluX3VubG9jaygmaTJjLT5sb2NrKTsKPiArCj4gKwlyZXR1cm4gSVJRX0hB TkRMRUQ7Cj4gK30KCltTZXZlcml0eTogTWVkaXVtXQpBcyByZXBvcnRlZCBieSBTYXNoaWtvIG9u IHYyIFsxXSwgY2FuIG11bHRpLWNodW5rIEkyQyByZWFkIHRyYW5zZmVycwoobXNnLT5sZW4gPiBB OV9JMkNfRklGT19ERVBUSCkgbWlzcyB0aGUgdHJhbnNmZXIgY29tcGxldGlvbiBpbnRlcnJ1cHQg aW4KYW1sX2kyY19pcnEoKT8KClVubGlrZSBBOV9TVEFURV9XUklURSwgd2hpY2ggZGlzYWJsZXMg QTlfVFhfVEhSRVNIX1dSSVRFIG9uY2UgdGhlIGZpbmFsIGJ5dGVzCmFyZSBxdWV1ZWQsIEE5X1NU QVRFX1JFQUQgbGVhdmVzIEE5X1JYX1RIUkVTSF9SRUFEIGVuYWJsZWQgYW5kIHNhbXBsZXMKUkVH X0NGR19JUlFfU1RBVEUgb25seSBvbmNlIHVwb24gZW50cnkuCgpXaGVuIG1zZy0+bGVuIGlzIGEg bXVsdGlwbGUgb2YgMzIgKGZvciBleGFtcGxlLCA2NCksIHRoZSAzMm5kIGJ5dGUgb2YgdGhlCmZp bmFsIGNodW5rIHRyaWdnZXJzIEE5X1JYX1RIUkVTSF9SRUFEIGJlZm9yZSB0aGUgSTJDIFNUT1Ag Y29uZGl0aW9uIGZpbmlzaGVzCm9uIHRoZSBidXMuIElmIEE5X1BIWV9ET05FIGFzc2VydHMgd2hp bGUgYW1sX2kyY19pcnEoKSBpcyBkcmFpbmluZyB0aG9zZSAzMgpieXRlcyBmcm9tIFJFR19DRkdf UlggYW5kIGJlZm9yZSBBOV9SWF9USFJFU0hfUkVBRCBpcyBjbGVhcmVkLCB0aGUgaW50ZXJydXB0 CmxpbmUgcmVtYWlucyBjb250aW51b3VzbHkgYXNzZXJ0ZWQgd2l0aG91dCBnZW5lcmF0aW5nIGEg bmV3IHJpc2luZyBlZGdlLCB3aGlsZQphbWxfaTJjX2lycSgpIHRha2VzIGdvdG8gaXJxX3RyYW5z X291dCBiZWNhdXNlIHRoZSBpbml0aWFsIGlycV9zdGF0ZSBzbmFwc2hvdApkaWQgbm90IGhhdmUg QTlfVFJBTlNfRE9ORSBzZXQuCgpTaW1pbGFybHksIGlmIGJvdGggQTlfUlhfVEhSRVNIX1JFQUQg YW5kIEE5X1BIWV9ET05FIGFyZSBzZXQgd2hlbgphbWxfaTJjX2lycSgpIGVudGVycyB3aXRoIG1v cmUgdGhhbiAzMiBieXRlcyByZW1haW5pbmcsIGFtbF9pMmNfaXJxKCkgZHJhaW5zCm9ubHkgMzIg Ynl0ZXMsIGNsZWFycyBvbmx5IEE5X1JYX1RIUkVTSF9SRUFELCBhbmQgZXhpdHMgdmlhIGlycV90 cmFuc19vdXQgd2l0aAppMmMtPnBvcyA8IGkyYy0+bXNnLT5sZW4uIEJlY2F1c2UgQTlfUEhZX0RP TkUgaXMgYWxyZWFkeSBhc3NlcnRlZCBhbmQgZmV3ZXIKdGhhbiAzMiBieXRlcyByZW1haW4gdG8g cmUtdHJpZ2dlciBBOV9SWF9USFJFU0hfUkVBRCwgbm8gZnVydGhlciBpbnRlcnJ1cHQgZWRnZQpv Y2N1cnMsIGxlYXZpbmcgd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCkgaW4gYW1sX2kyY194 ZmVyX21zZygpIHRvIHRpbWUKb3V0IHdpdGggLUVUSU1FRE9VVC4KCj4gKwo+ICtzdGF0aWMgdm9p ZCBhbWxfaTJjX2RvX3N0YXJ0KHN0cnVjdCBhbWxfaTJjICppMmMsIHN0cnVjdCBpMmNfbXNnICpt c2cpCj4gK3sKPiArCXVuc2lnbmVkIGludCByZWdfdmFsOwo+ICsJdW5zaWduZWQgaW50IHRyYW5z X2xlbjsKPiArCj4gKwl0cmFuc19sZW4gPSBtc2ctPmxlbjsKPiArCXJlZ192YWwgPSAodW5zaWdu ZWQgaW50KSgoKG1zZy0+YWRkciAmIDB4N2YpIDw8IFNUQVJUX1NBRERSX1NISUZUKSB8Cj4gKwkJ CQkoKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgPyBTVEFSVF9SRUFEIDogMCkgfAo+ICsJCQkJKCh0 cmFuc19sZW4gJiAweGZmZikgPDwgU1RBUlRfTEVOX1NISUZUKSB8IFNUQVJUX1NUQVJUKTsKPiAr CWFtbF9pMmNfc2V0X21hc2soaTJjLCBSRUdfQ0ZHX1NUQVJULAo+ICsJCQkgU1RBUlRfU1RBUlQg fCBTVEFSVF9TTEFWRV9BRERSIHwgU1RBUlRfUkVBRCB8IFNUQVJUX0xFTiwgcmVnX3ZhbCk7Cj4g KwljbGVhcl9pcnFfc3RhdHVzKGkyYywgSVJRX0FMTF9NQVNLKTsKPiArCS8qIGVuYWJsZSB0aHJl c2ggbW9kZSAqLwo+ICsJaWYgKHRyYW5zX2xlbiA+IEE5X0kyQ19GSUZPX0RFUFRIKSB7Cj4gKwkJ cmVnX3ZhbCA9IChtc2ctPmZsYWdzICYgSTJDX01fUkQpID8gQTlfUlhfVEhSRVNIX1JFQUQgOiBB OV9UWF9USFJFU0hfV1JJVEU7Cj4gKwkJYW1sX2kyY19zZXRfbWFzayhpMmMsIFJFR19DRkdfSVJR X0VOQUJMRSwKPiArCQkJCSBBOV9SWF9USFJFU0hfUkVBRCB8IEE5X1RYX1RIUkVTSF9XUklURSwg cmVnX3ZhbCk7Cj4gKwl9Cj4gK30KCltTZXZlcml0eTogTWVkaXVtXQpBcyByZXBvcnRlZCBieSBT YXNoaWtvIG9uIHYyIFsyXSwgaW4gYW1sX2kyY19kb19zdGFydCgpLCBzZXR0aW5nIFNUQVJUX1NU QVJUCmluIFJFR19DRkdfU1RBUlQgYmVnaW5zIHRoZSBoYXJkd2FyZSB0cmFuc2ZlciB3aGlsZSBB OV9FTkFCTEVfSVJRX0JJVAooQTlfTkNLX0VSUk9SIHwgQTlfUEhZX0RPTkUpIGlzIGFscmVhZHkg ZW5hYmxlZCBpbiBSRUdfQ0ZHX0lSUV9FTkFCTEUsIGJlZm9yZQpjbGVhcl9pcnFfc3RhdHVzKGky YywgSVJRX0FMTF9NQVNLKSBpcyBjYWxsZWQgYW5kIGJlZm9yZSBBOV9SWF9USFJFU0hfUkVBRCBv cgpBOV9UWF9USFJFU0hfV1JJVEUgaXMgZW5hYmxlZCBpbiBSRUdfQ0ZHX0lSUV9FTkFCTEUuCgpJ ZiBleGVjdXRpb24gaXMgZGVsYXllZCBiZXR3ZWVuIHdyaXRpbmcgUkVHX0NGR19TVEFSVCBhbmQg d3JpdGluZwpSRUdfQ0ZHX0lSUV9TVEFURSAoZm9yIGV4YW1wbGUsIGR1ZSB0byB0YXNrIHByZWVt cHRpb24gdW5kZXIgQ09ORklHX1BSRUVNUFRfUlQsCnZDUFUgcHJlZW1wdGlvbiwgb3IgTk1JL0ZJ USBsYXRlbmN5KSwgdGhlIGNvbnRyb2xsZXIgY2FuIGFzc2VydCBBOV9OQ0tfRVJST1IKb24gYW4g YWRkcmVzcyBOQUNLIG9yIEE5X1BIWV9ET05FIG9uIGEgc2hvcnQgdHJhbnNmZXIsIHdoaWNoIGlz IHRoZW4gd2lwZWQgb3V0CmJ5IGNsZWFyX2lycV9zdGF0dXMoaTJjLCBJUlFfQUxMX01BU0spIGJl Zm9yZSBhbWxfaTJjX2lycSgpIGFjcXVpcmVzIGkyYy0+bG9jawphbmQgcmVhZHMgUkVHX0NGR19J UlFfU1RBVEUuIFdoZW4gYW1sX2kyY19pcnEoKSBydW5zLCBpdCBzZWVzCiEoaXJxX3N0YXRlICYg QTlfVFJBTlNfRE9ORSkgYW5kIGV4aXRzIHZpYSBpcnFfdHJhbnNfb3V0IHdpdGhvdXQgY29tcGxl dGluZwppMmMtPmRvbmUsIGNhdXNpbmcgYW1sX2kyY194ZmVyX21zZygpIHRvIHRpbWUgb3V0LgoK U2hvdWxkIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGJlIGNsZWFyZWQgYW5kIHRoZSB0aHJlc2hvbGQg aW50ZXJydXB0cyBlbmFibGVkCmJlZm9yZSBhc3NlcnRpbmcgU1RBUlRfU1RBUlQgaW4gUkVHX0NG R19TVEFSVD8KCj4gKwo+ICtzdGF0aWMgaW50IGFtbF9pMmNfeGZlcl9tc2coc3RydWN0IGFtbF9p MmMgKmkyYywgc3RydWN0IGkyY19tc2cgKm1zZywgYm9vbCBsYXN0KQo+ICt7Cj4gKwl1bnNpZ25l ZCBsb25nIHRpbWVfbGVmdCwgZmxhZ3M7Cj4gKwo+ICsJaTJjLT5tc2cgPSBtc2c7Cj4gKwlpMmMt PnBvcyA9IDA7Cj4gKwlpMmMtPmVycm9yID0gMDsKPiArCj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgm aTJjLT5sb2NrLCBmbGFncyk7Cj4gKwlpMmMtPnN0YXRlID0gKG1zZy0+ZmxhZ3MgJiBJMkNfTV9S RCkgPyBBOV9TVEFURV9SRUFEIDogQTlfU1RBVEVfV1JJVEU7Cj4gKwlhbWxfaTJjX3ByZXBhcmVf eGZlcihpMmMsIEE5X0ZJRk9fRklMTF9GVUxMKTsKPiArCXJlaW5pdF9jb21wbGV0aW9uKCZpMmMt PmRvbmUpOwo+ICsKPiArCWFtbF9pMmNfc2V0X21hc2soaTJjLCBSRUdfQ0ZHX0JVUywgQlVTX05P X1NUT1AsIChsYXN0ID8gMCA6IEJVU19OT19TVE9QKSk7Cj4gKwo+ICsJLyogU3RhcnQgdGhlIHRy YW5zZmVyICovCj4gKwlhbWxfaTJjX2RvX3N0YXJ0KGkyYywgbXNnKTsKPiArCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJmkyYy0+bG9jaywgZmxhZ3MpOwo+ICsKPiArCXRpbWVfbGVmdCA9IG1zZWNz X3RvX2ppZmZpZXMoSTJDX1RJTUVPVVRfTVMpOwo+ICsJdGltZV9sZWZ0ID0gd2FpdF9mb3JfY29t cGxldGlvbl90aW1lb3V0KCZpMmMtPmRvbmUsIHRpbWVfbGVmdCk7Cj4gKwo+ICsJLyoKPiArCSAq IFByb3RlY3QgYWNjZXNzIHRvIGkyYyBzdHJ1Y3QgYW5kIHJlZ2lzdGVycyBmcm9tIGludGVycnVw dAo+ICsJICogaGFuZGxlcnMgdHJpZ2dlcmVkIGJ5IGEgdHJhbnNmZXIgdGVybWluYXRlZCBhZnRl ciB0aGUKPiArCSAqIHRpbWVvdXQgcGVyaW9kCj4gKwkgKi8KPiArCj4gKwlpZiAoIXRpbWVfbGVm dCkgewo+ICsJCWd1YXJkKHNwaW5sb2NrX2lycXNhdmUpKCZpMmMtPmxvY2spOwo+ICsJCWkyYy0+ c3RhdGUgPSBBOV9TVEFURV9JRExFOwo+ICsJCWFtbF9pMmNfc2V0X21hc2soaTJjLCBSRUdfQ0ZH X0lSUV9FTkFCTEUsCj4gKwkJCQkgQTlfUlhfVEhSRVNIX1JFQUQgfCBBOV9UWF9USFJFU0hfV1JJ VEUsIDApOwo+ICsJCWNsZWFyX2lycV9zdGF0dXMoaTJjLCBJUlFfQUxMX01BU0spOwo+ICsJCXJl c2V0X2ZpZm9fcG9zKGkyYyk7Cj4gKwkJcmV0dXJuIC1FVElNRURPVVQ7Cj4gKwl9Cj4gKwo+ICsJ cmV0dXJuIGkyYy0+ZXJyb3I7Cj4gK30KCltTZXZlcml0eTogSGlnaF0KQXMgcmVwb3J0ZWQgYnkg U2FzaGlrbyBvbiB2MiBbM10sIHdoZW4gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCkgZXhw aXJlcwooIXRpbWVfbGVmdCkgaW4gYW1sX2kyY194ZmVyX21zZygpLCB0aGlzIHRpbWVvdXQgcGF0 aCBzZXRzIGkyYy0+c3RhdGUgdG8KQTlfU1RBVEVfSURMRSwgZGlzYWJsZXMgdGhlIHRocmVzaG9s ZCBJUlFzLCBjbGVhcnMgUkVHX0NGR19JUlFfU1RBVEUsIGFuZApjYWxscyByZXNldF9maWZvX3Bv cyhpMmMpLCBidXQgbmV2ZXIgY2xlYXJzIFNUQVJUX1NUQVJUIGluIFJFR19DRkdfU1RBUlQgb3IK b3RoZXJ3aXNlIGFib3J0cyB0aGUgYWN0aXZlIGhhcmR3YXJlIHRyYW5zZmVyIHdoaWxlIEE5X0VO QUJMRV9JUlFfQklUIHJlbWFpbnMKZW5hYmxlZCBpbiBSRUdfQ0ZHX0lSUV9FTkFCTEUuCgpJZiB0 aGUgc3RhbGxlZCB0cmFuc2ZlciBzaGlmdHMgYWRkaXRpb25hbCBieXRlcyBhZnRlciByZXNldF9m aWZvX3BvcyhpMmMpLCB0aGUKaGFyZHdhcmUgRklGTyBwb2ludGVycyBiZWNvbWUgbm9uLXplcm8g Zm9yIHRoZSBuZXh0IG1lc3NhZ2UuIEZ1cnRoZXJtb3JlLCBpZgp0aGUgc3RhbGxlZCB0cmFuc2Zl ciBmaW5pc2hlcyBvciBOQUNLcyBhZnRlciBhIHN1YnNlcXVlbnQgYW1sX2kyY194ZmVyX21zZygp CmhhcyBzZXQgaTJjLT5zdGF0ZSB0byBBOV9TVEFURV9SRUFEIG9yIEE5X1NUQVRFX1dSSVRFLCBh bWxfaTJjX2lycSgpIHdpbGwKcHJvY2VzcyB0aGUgc3RhbGUgQTlfUEhZX0RPTkUgb3IgQTlfTkNL X0VSUk9SIGludGVycnVwdCBhZ2FpbnN0IHRoZSBuZXcKaTJjLT5tc2csIGNvcnJ1cHRpbmcgaTJj LT5tc2ctPmJ1ZiwgaTJjLT5wb3MsIGFuZCBpMmMtPmVycm9yIGFuZCBwcmVtYXR1cmVseQpjb21w bGV0aW5nIGkyYy0+ZG9uZS4gRXZlbiBpZiB0aGUgbGF0ZSBpbnRlcnJ1cHQgYXJyaXZlcyB3aGls ZSBpMmMtPnN0YXRlIGlzCnN0aWxsIEE5X1NUQVRFX0lETEUsIGFtbF9pMmNfaXJxKCkganVtcHMg dG8gY29tcGxldGVfaXJxX291dCBhbmQgY2FsbHMKY29tcGxldGUoJmkyYy0+ZG9uZSkgd2hlbiBu byB0cmFuc2ZlciBpcyB3YWl0aW5nLgoKQWxzbywgdGhpcyBmdW5jdGlvbiBtaXhlcyBtYW51YWwg c3Bpbl9sb2NrX2lycXNhdmUoKSAvIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKQp3aXRoIGd1YXJk KHNwaW5sb2NrX2lycXNhdmUpKCZpMmMtPmxvY2spIHdpdGhvdXQgZGlyZWN0bHkgaW5jbHVkaW5n CmxpbnV4L2NsZWFudXAuaC4gQ291bGQgdGhlIGhhcmR3YXJlIHRyYW5zZmVyIGJlIGV4cGxpY2l0 bHkgaGFsdGVkIG9uIHRpbWVvdXQsCnRoZSBzcHVyaW91cyBjb21wbGV0ZSgmaTJjLT5kb25lKSB3 aGVuIEE5X1NUQVRFX0lETEUgYXZvaWRlZCwgYW5kIHRoZSBsb2NraW5nCnN0eWxlIG1hZGUgY29u c2lzdGVudCBhY3Jvc3MgYW1sX2kyY194ZmVyX21zZygpPwoKWyAuLi4gXQoKPiArc3RhdGljIGNv bnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIGFtbF9pMmNfYWxnb3JpdGhtID0gewo+ICsJLm1hc3Rl cl94ZmVyCT0gYW1sX2kyY194ZmVyLAo+ICsJLmZ1bmN0aW9uYWxpdHkJPSBhbWxfaTJjX2Z1bmMs Cj4gK307CgpbU2V2ZXJpdHk6IExvd10KSW4gc3RydWN0IGkyY19hbGdvcml0aG0sIG1hc3Rlcl94 ZmVyIGlzIG1hcmtlZCBkZXByZWNhdGVkIGluIGluY2x1ZGUvbGludXgvaTJjLmgKaW4gZmF2b3Ig b2YgeGZlci4gQ291bGQgYW1sX2kyY19hbGdvcml0aG0gaW5pdGlhbGl6ZSAueGZlciA9IGFtbF9p MmNfeGZlcgppbnN0ZWFkPwoKWzFdIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL3Ivc2FzaGlrby1v dXRib3gtMTgxMjg0QGtlcm5lbC5vcmcKWzJdIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL3Ivc2Fz aGlrby1vdXRib3gtMTgxMjg0QGtlcm5lbC5vcmcKWzNdIGh0dHBzOi8vbG9yZS5rZXJuZWwub3Jn L3Ivc2FzaGlrby1vdXRib3gtMTgxMjg0QGtlcm5lbC5vcmcKCi0tIApTYXNoaWtvIEFJIHJldmll dyDCtyBodHRwczovL3Nhc2hpa28uZGV2LyMvcGF0Y2hzZXQvMjAyNjExMDMtYTktaTJjLXY1LTAt ODZmMmRjZDE3OWQ4QGFtbG9naWMuY29tP3BhcnQ9MgoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYW1sb2dpYyBtYWlsaW5nIGxpc3QKbGludXgt YW1sb2dpY0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21h aWxtYW4vbGlzdGluZm8vbGludXgtYW1sb2dpYwo=