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=-8.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS 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 89B51C47404 for ; Wed, 9 Oct 2019 14:44:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 502FE206B6 for ; Wed, 9 Oct 2019 14:44:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731463AbfJIOok convert rfc822-to-8bit (ORCPT ); Wed, 9 Oct 2019 10:44:40 -0400 Received: from mailoutvs60.siol.net ([185.57.226.251]:44801 "EHLO mail.siol.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1730674AbfJIOoj (ORCPT ); Wed, 9 Oct 2019 10:44:39 -0400 Received: from localhost (localhost [127.0.0.1]) by mail.siol.net (Zimbra) with ESMTP id 9E06C524BC9; Wed, 9 Oct 2019 16:44:32 +0200 (CEST) X-Virus-Scanned: amavisd-new at psrvmta12.zcs-production.pri Received: from mail.siol.net ([127.0.0.1]) by localhost (psrvmta12.zcs-production.pri [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id TfScaFaVbSPy; Wed, 9 Oct 2019 16:44:31 +0200 (CEST) Received: from mail.siol.net (localhost [127.0.0.1]) by mail.siol.net (Zimbra) with ESMTPS id 7EFFF524C3C; Wed, 9 Oct 2019 16:44:31 +0200 (CEST) Received: from jernej-laptop.localnet (cpe-86-58-59-25.static.triera.net [86.58.59.25]) (Authenticated sender: jernej.skrabec@siol.net) by mail.siol.net (Zimbra) with ESMTPA id 0BADC524BC9; Wed, 9 Oct 2019 16:44:30 +0200 (CEST) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: Hans Verkuil Cc: mchehab@kernel.org, paul.kocialkowski@bootlin.com, mripard@kernel.org, pawel@osciak.com, m.szyprowski@samsung.com, kyungmin.park@samsung.com, tfiga@chromium.org, wens@csie.org, gregkh@linuxfoundation.org, boris.brezillon@collabora.com, linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devel@driverdev.osuosl.org, linux-arm-kernel@lists.infradead.org, ezequiel@collabora.com, jonas@kwiboo.se Subject: Re: [PATCH v2 0/6] media: cedrus: h264: Support multi-slice frames Date: Wed, 09 Oct 2019 16:44:29 +0200 Message-ID: <2146778.PlJYLztgos@jernej-laptop> In-Reply-To: References: <20190929200023.215831-1-jernej.skrabec@siol.net> <2785635.uIalc63MVP@jernej-laptop> MIME-Version: 1.0 Content-Transfer-Encoding: 8BIT Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Dne sreda, 09. oktober 2019 ob 12:18:45 CEST je Hans Verkuil napisal(a): > On 10/7/19 9:01 PM, Jernej Škrabec wrote: > > Dne ponedeljek, 07. oktober 2019 ob 12:44:24 CEST je Hans Verkuil napisal(a): > >> Hi Jernej, > >> > >> On 9/29/19 10:00 PM, Jernej Skrabec wrote: > >>> This series adds support for decoding multi-slice H264 frames along with > >>> support for V4L2_DEC_CMD_FLUSH and V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF. > >>> > >>> Code was tested by modified ffmpeg, which can be found here: > >>> https://github.com/jernejsk/FFmpeg, branch mainline-test > >>> It has to be configured with at least following options: > >>> --enable-v4l2-request --enable-libudev --enable-libdrm > >>> > >>> Samples used for testing: > >>> http://jernej.libreelec.tv/videos/h264/BA1_FT_C.mp4 > >>> http://jernej.libreelec.tv/videos/h264/h264.mp4 > >>> > >>> Command line used for testing: > >>> ffmpeg -hwaccel drm -hwaccel_device /dev/dri/card0 -i h264.mp4 -pix_fmt > >>> bgra -f fbdev /dev/fb0 > >>> > >>> Please note that V4L2_DEC_CMD_FLUSH was not tested because I'm > >>> not sure how. ffmpeg follows exactly which slice is last in frame > >>> and sets hold flag accordingly. Improper usage of hold flag would > >>> corrupt ffmpeg assumptions and it would probably crash. Any ideas > >>> how to test this are welcome! > >>> > >>> Thanks to Jonas for adjusting ffmpeg. > >>> > >>> Please let me know what you think. > >>> > >>> Best regards, > >>> Jernej > >>> > >>> Changes from v1: > >>> - added Rb tags > >>> - updated V4L2_DEC_CMD_FLUSH documentation > >>> - updated first slice detection in Cedrus > >>> - hold capture buffer flag is set according to source format > >>> - added v4l m2m stateless_(try_)decoder_cmd ioctl helpers > >>> > >>> Hans Verkuil (2): > >>> vb2: add V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF > >>> videodev2.h: add V4L2_DEC_CMD_FLUSH > >>> > >>> Jernej Skrabec (4): > >>> media: v4l2-mem2mem: add stateless_(try_)decoder_cmd ioctl helpers > >>> media: cedrus: Detect first slice of a frame > >>> media: cedrus: h264: Support multiple slices per frame > >>> media: cedrus: Add support for holding capture buffer > >>> > >>> Documentation/media/uapi/v4l/buffer.rst | 13 ++++++ > >>> .../media/uapi/v4l/vidioc-decoder-cmd.rst | 10 +++- > >>> .../media/uapi/v4l/vidioc-reqbufs.rst | 6 +++ > >>> .../media/videodev2.h.rst.exceptions | 1 + > >>> .../media/common/videobuf2/videobuf2-v4l2.c | 8 +++- > >>> drivers/media/v4l2-core/v4l2-mem2mem.c | 35 ++++++++++++++ > >>> drivers/staging/media/sunxi/cedrus/cedrus.h | 1 + > >>> .../staging/media/sunxi/cedrus/cedrus_dec.c | 11 +++++ > >>> .../staging/media/sunxi/cedrus/cedrus_h264.c | 11 ++++- > >>> .../staging/media/sunxi/cedrus/cedrus_hw.c | 8 ++-- > >>> .../staging/media/sunxi/cedrus/cedrus_video.c | 14 ++++++ > >>> include/media/v4l2-mem2mem.h | 46 +++++++++++++++++++ > >>> include/media/videobuf2-core.h | 3 ++ > >>> include/media/videobuf2-v4l2.h | 5 ++ > >>> include/uapi/linux/videodev2.h | 14 ++++-- > >>> 15 files changed, 175 insertions(+), 11 deletions(-) > >> > >> I didn't want to make a v3 of this series, instead I hacked this patch > >> that > >> will hopefully do all the locking right. > >> > >> Basically I moved all the 'held' related code into v4l2-mem2mem under > >> job_spinlock. This simplifies the driver code as well. > >> > >> But this is a hack that sits on top of this series. If your ffmpeg tests > >> are now successful, then I'll turn this into a proper series with > >> correct documentation (a lot of the comments are now wrong with this > >> patch, so just ignore that). > > > > Thanks for looking into this! With small fix mentioned below, it works! > > Note that both scenarios I tested (flushing during decoding and flushing > > after decoding is finished) are focused on capture queue. In order to > > trigger output queue flush, ffmpeg would need to queue multiple jobs and > > call flush before they are all processed. This is not something I can do > > at this time. Maybe Jonas can help with modifying ffmpeg appropriately. > > However, code for case seems correct to me. > > > >> Regards, > >> > >> Hans > >> > >> diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c > >> b/drivers/media/v4l2-core/v4l2-mem2mem.c index 2677a07e4c9b..f81a8f2465ab > >> 100644 > >> --- a/drivers/media/v4l2-core/v4l2-mem2mem.c > >> +++ b/drivers/media/v4l2-core/v4l2-mem2mem.c > >> @@ -412,25 +412,24 @@ static void v4l2_m2m_cancel_job(struct v4l2_m2m_ctx > >> *m2m_ctx) } > >> > >> } > >> > >> -void v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev, > >> - struct v4l2_m2m_ctx *m2m_ctx) > >> +static bool _v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev, > >> + struct v4l2_m2m_ctx *m2m_ctx) > >> > >> { > >> > >> - unsigned long flags; > >> - > >> - spin_lock_irqsave(&m2m_dev->job_spinlock, flags); > >> > >> if (!m2m_dev->curr_ctx || m2m_dev->curr_ctx != m2m_ctx) { > >> > >> - spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); > >> > >> dprintk("Called by an instance not currently > > > > running\n"); > > > >> - return; > >> + return false; > >> > >> } > >> > >> list_del(&m2m_dev->curr_ctx->queue); > >> m2m_dev->curr_ctx->job_flags &= ~(TRANS_QUEUED | TRANS_RUNNING); > >> wake_up(&m2m_dev->curr_ctx->finished); > >> m2m_dev->curr_ctx = NULL; > >> > >> + return true; > >> +} > >> > >> - spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); > >> - > >> +static void v4l2_m2m_job_next(struct v4l2_m2m_dev *m2m_dev, > >> + struct v4l2_m2m_ctx *m2m_ctx) > >> +{ > >> > >> /* This instance might have more buffers ready, but since we do not > >> > >> * allow more than one job on the job_queue per instance, each has > >> * to be scheduled separately after the previous one finishes. */ > >> > >> @@ -441,8 +440,113 @@ void v4l2_m2m_job_finish(struct v4l2_m2m_dev > >> *m2m_dev, */ > >> > >> schedule_work(&m2m_dev->job_work); > >> > >> } > >> > >> + > >> +void v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev, > >> + struct v4l2_m2m_ctx *m2m_ctx) > >> +{ > >> + unsigned long flags; > >> + > >> + spin_lock_irqsave(&m2m_dev->job_spinlock, flags); > >> + if (!_v4l2_m2m_job_finish(m2m_dev, m2m_ctx)) { > >> + spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); > >> + return; > >> + } > >> + spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); > >> + > >> + v4l2_m2m_job_next(m2m_dev, m2m_ctx); > >> +} > >> > >> EXPORT_SYMBOL(v4l2_m2m_job_finish); > >> > >> +void v4l2_m2m_job_finish_held(struct v4l2_m2m_dev *m2m_dev, > >> + struct v4l2_m2m_ctx *m2m_ctx, > >> + enum vb2_buffer_state state) > >> +{ > >> + struct vb2_v4l2_buffer *src_buf, *dst_buf; > >> + unsigned long flags; > >> + > >> + spin_lock_irqsave(&m2m_dev->job_spinlock, flags); > >> + src_buf = v4l2_m2m_src_buf_remove(m2m_ctx); > >> + dst_buf = v4l2_m2m_next_dst_buf(m2m_ctx); > >> + > >> + if (!src_buf || !dst_buf) { > >> + pr_err("Missing source and/or destination buffers\n"); > >> + spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); > >> + return; > >> + } > >> + v4l2_m2m_buf_done(src_buf, state); > >> + if (!dst_buf->is_held) { > >> + v4l2_m2m_dst_buf_remove(m2m_ctx); > >> + v4l2_m2m_buf_done(dst_buf, state); > >> + } > >> + if (!_v4l2_m2m_job_finish(m2m_dev, m2m_ctx)) { > >> + spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); > >> + return; > >> + } > >> + spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); > >> + > >> + v4l2_m2m_job_next(m2m_dev, m2m_ctx); > >> +} > >> +EXPORT_SYMBOL(v4l2_m2m_job_finish_held); > >> + > >> +/** > >> + * v4l2_m2m_release_capture_buf() - check if the capture buffer should > >> be > >> + * released > >> + * > >> + * @out_vb: the output buffer > >> + * @cap_vb: the capture buffer > >> + * > >> + * This helper function returns true if the current capture buffer > >> should > >> + * be released to vb2. This is the case if the output buffer specified > >> that + * the capture buffer should be held (i.e. not returned to vb2) > >> AND if the + * timestamp of the capture buffer differs from the output > >> buffer timestamp. + * > >> + * This helper is to be called at the start of the device_run callback: > >> + * > >> + * .. code-block:: c > >> + * > >> + * if (v4l2_m2m_release_capture_buf(out_vb, cap_vb)) { > >> + * v4l2_m2m_dst_buf_remove(m2m_ctx); > >> + * v4l2_m2m_buf_done(cap_vb, VB2_BUF_STATE_DONE); > >> + * cap_vb = v4l2_m2m_next_dst_buf(m2m_ctx); > >> + * } > >> + * cap_vb->is_held = out_vb->flags & > > > > V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF; > > > >> + * > >> + * ... > >> + * > >> + * v4l2_m2m_buf_done(out_vb, VB2_BUF_STATE_DONE); > >> + * if (!cap_vb->is_held) { > >> + * v4l2_m2m_dst_buf_remove(m2m_ctx); > >> + * v4l2_m2m_buf_done(cap_vb, VB2_BUF_STATE_DONE); > >> + * } > >> + * > >> + * This allows for multiple output buffers to be used to fill in a > >> single > >> + * capture buffer. This is typically used by stateless decoders where > >> + * multiple e.g. H.264 slices contribute to a single decoded frame. > >> + */ > >> +struct vb2_v4l2_buffer *v4l2_m2m_release_capture_buf(struct v4l2_m2m_ctx > >> *m2m_ctx) +{ > >> + struct v4l2_m2m_dev *m2m_dev = m2m_ctx->m2m_dev; > >> + struct vb2_v4l2_buffer *src, *dst; > >> + unsigned long flags; > >> + > >> + spin_lock_irqsave(&m2m_dev->job_spinlock, flags); > >> + src = v4l2_m2m_next_src_buf(m2m_ctx); > >> + dst = v4l2_m2m_next_dst_buf(m2m_ctx); > >> + > >> + if (dst->is_held && dst->vb2_buf.copied_timestamp && > >> + src->vb2_buf.timestamp != dst->vb2_buf.timestamp) { > >> + dst->is_held = false; > >> + v4l2_m2m_dst_buf_remove(m2m_ctx); > >> + v4l2_m2m_buf_done(dst, VB2_BUF_STATE_DONE); > >> + dst = v4l2_m2m_next_dst_buf(m2m_ctx); > >> + } > >> + dst->is_held = src->flags & V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF; > >> + src->flags &= ~V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF; > >> + spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); > >> + return dst; > >> +} > >> +EXPORT_SYMBOL(v4l2_m2m_release_capture_buf); > >> + > >> > >> int v4l2_m2m_reqbufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, > >> > >> struct v4l2_requestbuffers *reqbufs) > >> > >> { > >> > >> @@ -1171,19 +1275,28 @@ int v4l2_m2m_ioctl_stateless_decoder_cmd(struct > >> file *file, void *priv, { > >> > >> struct v4l2_fh *fh = file->private_data; > >> struct vb2_v4l2_buffer *out_vb, *cap_vb; > >> > >> + struct v4l2_m2m_dev *m2m_dev = fh->m2m_ctx->m2m_dev; > >> + unsigned long flags; > >> > >> int ret; > >> > >> ret = v4l2_m2m_ioctl_stateless_try_decoder_cmd(file, priv, dc); > >> if (ret < 0) > >> > >> return ret; > >> > >> + spin_lock_irqsave(&m2m_dev->job_spinlock, flags); > >> > >> out_vb = v4l2_m2m_last_src_buf(fh->m2m_ctx); > >> cap_vb = v4l2_m2m_last_dst_buf(fh->m2m_ctx); > >> > >> - if (out_vb) > >> + if (out_vb && (out_vb->flags & V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF)) > > > > { > > > >> out_vb->flags &= ~V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF; > >> > >> - else if (cap_vb && cap_vb->is_held) > >> - v4l2_m2m_buf_done(cap_vb, VB2_BUF_STATE_DONE); > >> + } else if (cap_vb && cap_vb->is_held) { > >> + cap_vb->is_held = false; > >> + if (m2m_dev->curr_ctx) { > > > > Above condition should be negated. > > Close. It should check that this buffer isn't currently being processed. > So: > > if (m2m_dev->curr_ctx != fh->m2m_ctx) { > > Can you test with this change? If this works, then I'll post a proper > series for this. I confirm that it works. Best regards, Jernej > > Thanks! > > Hans > > > Best regards, > > Jernej > > > >> + v4l2_m2m_dst_buf_remove(fh->m2m_ctx); > >> + v4l2_m2m_buf_done(cap_vb, > > > > VB2_BUF_STATE_DONE); > > > >> + } > >> + } > >> + spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); > >> > >> return 0; > >> > >> } > >> > >> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c > >> b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c index > >> 67f7d4326fc1..4e30f263b427 100644 > >> --- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c > >> +++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c > >> @@ -30,14 +30,7 @@ void cedrus_device_run(void *priv) > >> > >> struct media_request *src_req; > >> > >> run.src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); > >> > >> - run.dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); > >> - > >> - if (v4l2_m2m_release_capture_buf(run.src, run.dst)) { > >> - v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); > >> - v4l2_m2m_buf_done(run.dst, VB2_BUF_STATE_DONE); > >> - run.dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); > >> - } > >> - run.dst->is_held = run.src->flags & > > > > V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF; > > > >> + run.dst = v4l2_m2m_release_capture_buf(ctx->fh.m2m_ctx); > >> > >> run.first_slice = !run.dst->vb2_buf.copied_timestamp || > >> > >> run.src->vb2_buf.timestamp != run.dst- > >> > >> vb2_buf.timestamp; > >> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c > >> b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c index > >> 99fedec80224..242cad82cc8c 100644 > >> --- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c > >> +++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c > >> @@ -103,7 +103,6 @@ static irqreturn_t cedrus_irq(int irq, void *data) > >> > >> { > >> > >> struct cedrus_dev *dev = data; > >> struct cedrus_ctx *ctx; > >> > >> - struct vb2_v4l2_buffer *src_buf, *dst_buf; > >> > >> enum vb2_buffer_state state; > >> enum cedrus_irq_status status; > >> > >> @@ -121,26 +120,12 @@ static irqreturn_t cedrus_irq(int irq, void *data) > >> > >> dev->dec_ops[ctx->current_codec]->irq_disable(ctx); > >> dev->dec_ops[ctx->current_codec]->irq_clear(ctx); > >> > >> - src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); > >> - dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); > >> - > >> - if (!src_buf || !dst_buf) { > >> - v4l2_err(&dev->v4l2_dev, > >> - "Missing source and/or destination > > > > buffers\n"); > > > >> - return IRQ_HANDLED; > >> - } > >> - > >> > >> if (status == CEDRUS_IRQ_ERROR) > >> > >> state = VB2_BUF_STATE_ERROR; > >> > >> else > >> > >> state = VB2_BUF_STATE_DONE; > >> > >> - v4l2_m2m_buf_done(src_buf, state); > >> - if (!dst_buf->is_held) { > >> - v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); > >> - v4l2_m2m_buf_done(dst_buf, state); > >> - } > >> - v4l2_m2m_job_finish(ctx->dev->m2m_dev, ctx->fh.m2m_ctx); > >> + v4l2_m2m_job_finish_held(ctx->dev->m2m_dev, ctx->fh.m2m_ctx, state); > >> > >> return IRQ_HANDLED; > >> > >> } > >> > >> diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h > >> index 8ae2f56c7fa3..48ca7d3eaa3d 100644 > >> --- a/include/media/v4l2-mem2mem.h > >> +++ b/include/media/v4l2-mem2mem.h > >> @@ -173,6 +173,10 @@ void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx > >> *m2m_ctx); void v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev, > >> > >> struct v4l2_m2m_ctx *m2m_ctx); > >> > >> +void v4l2_m2m_job_finish_held(struct v4l2_m2m_dev *m2m_dev, > >> + struct v4l2_m2m_ctx *m2m_ctx, > >> + enum vb2_buffer_state state); > >> + > >> > >> static inline void > >> v4l2_m2m_buf_done(struct vb2_v4l2_buffer *buf, enum vb2_buffer_state > >> state) > >> > >> { > >> @@ -644,47 +648,7 @@ void v4l2_m2m_buf_copy_metadata(const struct > >> vb2_v4l2_buffer *out_vb, struct vb2_v4l2_buffer *cap_vb, > >> > >> bool copy_frame_flags); > >> > >> -/** > >> - * v4l2_m2m_release_capture_buf() - check if the capture buffer should > >> be > >> - * released > >> - * > >> - * @out_vb: the output buffer > >> - * @cap_vb: the capture buffer > >> - * > >> - * This helper function returns true if the current capture buffer > >> should > >> - * be released to vb2. This is the case if the output buffer specified > >> that - * the capture buffer should be held (i.e. not returned to vb2) > >> AND if the - * timestamp of the capture buffer differs from the output > >> buffer timestamp. - * > >> - * This helper is to be called at the start of the device_run callback: > >> - * > >> - * .. code-block:: c > >> - * > >> - * if (v4l2_m2m_release_capture_buf(out_vb, cap_vb)) { > >> - * v4l2_m2m_dst_buf_remove(m2m_ctx); > >> - * v4l2_m2m_buf_done(cap_vb, VB2_BUF_STATE_DONE); > >> - * cap_vb = v4l2_m2m_next_dst_buf(m2m_ctx); > >> - * } > >> - * cap_vb->is_held = out_vb->flags & > > > > V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF; > > > >> - * > >> - * ... > >> - * > >> - * v4l2_m2m_buf_done(out_vb, VB2_BUF_STATE_DONE); > >> - * if (!cap_vb->is_held) { > >> - * v4l2_m2m_dst_buf_remove(m2m_ctx); > >> - * v4l2_m2m_buf_done(cap_vb, VB2_BUF_STATE_DONE); > >> - * } > >> - * > >> - * This allows for multiple output buffers to be used to fill in a > >> single > >> - * capture buffer. This is typically used by stateless decoders where > >> - * multiple e.g. H.264 slices contribute to a single decoded frame. > >> - */ > >> -static inline bool v4l2_m2m_release_capture_buf(const struct > >> vb2_v4l2_buffer *out_vb, - > >> > > const struct vb2_v4l2_buffer *cap_vb) > > > >> -{ > >> - return cap_vb->is_held && cap_vb->vb2_buf.copied_timestamp && > >> - out_vb->vb2_buf.timestamp != cap_vb->vb2_buf.timestamp; > >> -} > >> +struct vb2_v4l2_buffer *v4l2_m2m_release_capture_buf(struct v4l2_m2m_ctx > >> *m2m_ctx); > >> > >> /* v4l2 request helper */ 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=-8.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,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 0A429ECE58D for ; Wed, 9 Oct 2019 14:44:44 +0000 (UTC) Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (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 DC844206B6 for ; Wed, 9 Oct 2019 14:44:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DC844206B6 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=siol.net Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=driverdev-devel-bounces@linuxdriverproject.org Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id A907F878E5; Wed, 9 Oct 2019 14:44:43 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id lH+OlN4caQuk; Wed, 9 Oct 2019 14:44:39 +0000 (UTC) Received: from ash.osuosl.org (ash.osuosl.org [140.211.166.34]) by whitealder.osuosl.org (Postfix) with ESMTP id 2D2E0876D9; Wed, 9 Oct 2019 14:44:39 +0000 (UTC) Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by ash.osuosl.org (Postfix) with ESMTP id 6D4471BF423 for ; Wed, 9 Oct 2019 14:44:38 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 69D5884828 for ; Wed, 9 Oct 2019 14:44:38 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 2jJRzNWfD2Ze for ; Wed, 9 Oct 2019 14:44:35 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from mail.siol.net (mailoutvs4.siol.net [185.57.226.195]) by fraxinus.osuosl.org (Postfix) with ESMTPS id 87E18847C3 for ; Wed, 9 Oct 2019 14:44:35 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by mail.siol.net (Zimbra) with ESMTP id 9E06C524BC9; Wed, 9 Oct 2019 16:44:32 +0200 (CEST) X-Virus-Scanned: amavisd-new at psrvmta12.zcs-production.pri Received: from mail.siol.net ([127.0.0.1]) by localhost (psrvmta12.zcs-production.pri [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id TfScaFaVbSPy; Wed, 9 Oct 2019 16:44:31 +0200 (CEST) Received: from mail.siol.net (localhost [127.0.0.1]) by mail.siol.net (Zimbra) with ESMTPS id 7EFFF524C3C; Wed, 9 Oct 2019 16:44:31 +0200 (CEST) Received: from jernej-laptop.localnet (cpe-86-58-59-25.static.triera.net [86.58.59.25]) (Authenticated sender: jernej.skrabec@siol.net) by mail.siol.net (Zimbra) with ESMTPA id 0BADC524BC9; Wed, 9 Oct 2019 16:44:30 +0200 (CEST) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: Hans Verkuil Subject: Re: [PATCH v2 0/6] media: cedrus: h264: Support multi-slice frames Date: Wed, 09 Oct 2019 16:44:29 +0200 Message-ID: <2146778.PlJYLztgos@jernej-laptop> In-Reply-To: References: <20190929200023.215831-1-jernej.skrabec@siol.net> <2785635.uIalc63MVP@jernej-laptop> MIME-Version: 1.0 X-BeenThere: driverdev-devel@linuxdriverproject.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux Driver Project Developer List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devel@driverdev.osuosl.org, linux-media@vger.kernel.org, pawel@osciak.com, jonas@kwiboo.se, gregkh@linuxfoundation.org, wens@csie.org, mripard@kernel.org, tfiga@chromium.org, paul.kocialkowski@bootlin.com, kyungmin.park@samsung.com, boris.brezillon@collabora.com, linux-arm-kernel@lists.infradead.org, mchehab@kernel.org, ezequiel@collabora.com, linux-kernel@vger.kernel.org, m.szyprowski@samsung.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: driverdev-devel-bounces@linuxdriverproject.org Sender: "devel" RG5lIHNyZWRhLCAwOS4gb2t0b2JlciAyMDE5IG9iIDEyOjE4OjQ1IENFU1QgamUgSGFucyBWZXJr dWlsIG5hcGlzYWwoYSk6Cj4gT24gMTAvNy8xOSA5OjAxIFBNLCBKZXJuZWogxaBrcmFiZWMgd3Jv dGU6Cj4gPiBEbmUgcG9uZWRlbGplaywgMDcuIG9rdG9iZXIgMjAxOSBvYiAxMjo0NDoyNCBDRVNU IGplIEhhbnMgVmVya3VpbCAKbmFwaXNhbChhKToKPiA+PiBIaSBKZXJuZWosCj4gPj4gCj4gPj4g T24gOS8yOS8xOSAxMDowMCBQTSwgSmVybmVqIFNrcmFiZWMgd3JvdGU6Cj4gPj4+IFRoaXMgc2Vy aWVzIGFkZHMgc3VwcG9ydCBmb3IgZGVjb2RpbmcgbXVsdGktc2xpY2UgSDI2NCBmcmFtZXMgYWxv bmcgd2l0aAo+ID4+PiBzdXBwb3J0IGZvciBWNEwyX0RFQ19DTURfRkxVU0ggYW5kIFY0TDJfQlVG X0ZMQUdfTTJNX0hPTERfQ0FQVFVSRV9CVUYuCj4gPj4+IAo+ID4+PiBDb2RlIHdhcyB0ZXN0ZWQg YnkgbW9kaWZpZWQgZmZtcGVnLCB3aGljaCBjYW4gYmUgZm91bmQgaGVyZToKPiA+Pj4gaHR0cHM6 Ly9naXRodWIuY29tL2plcm5lanNrL0ZGbXBlZywgYnJhbmNoIG1haW5saW5lLXRlc3QKPiA+Pj4g SXQgaGFzIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCBhdCBsZWFzdCBmb2xsb3dpbmcgb3B0aW9uczoK PiA+Pj4gLS1lbmFibGUtdjRsMi1yZXF1ZXN0IC0tZW5hYmxlLWxpYnVkZXYgLS1lbmFibGUtbGli ZHJtCj4gPj4+IAo+ID4+PiBTYW1wbGVzIHVzZWQgZm9yIHRlc3Rpbmc6Cj4gPj4+IGh0dHA6Ly9q ZXJuZWoubGlicmVlbGVjLnR2L3ZpZGVvcy9oMjY0L0JBMV9GVF9DLm1wNAo+ID4+PiBodHRwOi8v amVybmVqLmxpYnJlZWxlYy50di92aWRlb3MvaDI2NC9oMjY0Lm1wNAo+ID4+PiAKPiA+Pj4gQ29t bWFuZCBsaW5lIHVzZWQgZm9yIHRlc3Rpbmc6Cj4gPj4+IGZmbXBlZyAtaHdhY2NlbCBkcm0gLWh3 YWNjZWxfZGV2aWNlIC9kZXYvZHJpL2NhcmQwIC1pIGgyNjQubXA0IC1waXhfZm10Cj4gPj4+IGJn cmEgLWYgZmJkZXYgL2Rldi9mYjAKPiA+Pj4gCj4gPj4+IFBsZWFzZSBub3RlIHRoYXQgVjRMMl9E RUNfQ01EX0ZMVVNIIHdhcyBub3QgdGVzdGVkIGJlY2F1c2UgSSdtCj4gPj4+IG5vdCBzdXJlIGhv dy4gZmZtcGVnIGZvbGxvd3MgZXhhY3RseSB3aGljaCBzbGljZSBpcyBsYXN0IGluIGZyYW1lCj4g Pj4+IGFuZCBzZXRzIGhvbGQgZmxhZyBhY2NvcmRpbmdseS4gSW1wcm9wZXIgdXNhZ2Ugb2YgaG9s ZCBmbGFnIHdvdWxkCj4gPj4+IGNvcnJ1cHQgZmZtcGVnIGFzc3VtcHRpb25zIGFuZCBpdCB3b3Vs ZCBwcm9iYWJseSBjcmFzaC4gQW55IGlkZWFzCj4gPj4+IGhvdyB0byB0ZXN0IHRoaXMgYXJlIHdl bGNvbWUhCj4gPj4+IAo+ID4+PiBUaGFua3MgdG8gSm9uYXMgZm9yIGFkanVzdGluZyBmZm1wZWcu Cj4gPj4+IAo+ID4+PiBQbGVhc2UgbGV0IG1lIGtub3cgd2hhdCB5b3UgdGhpbmsuCj4gPj4+IAo+ ID4+PiBCZXN0IHJlZ2FyZHMsCj4gPj4+IEplcm5lago+ID4+PiAKPiA+Pj4gQ2hhbmdlcyBmcm9t IHYxOgo+ID4+PiAtIGFkZGVkIFJiIHRhZ3MKPiA+Pj4gLSB1cGRhdGVkIFY0TDJfREVDX0NNRF9G TFVTSCBkb2N1bWVudGF0aW9uCj4gPj4+IC0gdXBkYXRlZCBmaXJzdCBzbGljZSBkZXRlY3Rpb24g aW4gQ2VkcnVzCj4gPj4+IC0gaG9sZCBjYXB0dXJlIGJ1ZmZlciBmbGFnIGlzIHNldCBhY2NvcmRp bmcgdG8gc291cmNlIGZvcm1hdAo+ID4+PiAtIGFkZGVkIHY0bCBtMm0gc3RhdGVsZXNzXyh0cnlf KWRlY29kZXJfY21kIGlvY3RsIGhlbHBlcnMKPiA+Pj4gCj4gPj4+IEhhbnMgVmVya3VpbCAoMik6 Cj4gPj4+ICAgdmIyOiBhZGQgVjRMMl9CVUZfRkxBR19NMk1fSE9MRF9DQVBUVVJFX0JVRgo+ID4+ PiAgIHZpZGVvZGV2Mi5oOiBhZGQgVjRMMl9ERUNfQ01EX0ZMVVNICj4gPj4+IAo+ID4+PiBKZXJu ZWogU2tyYWJlYyAoNCk6Cj4gPj4+ICAgbWVkaWE6IHY0bDItbWVtMm1lbTogYWRkIHN0YXRlbGVz c18odHJ5XylkZWNvZGVyX2NtZCBpb2N0bCBoZWxwZXJzCj4gPj4+ICAgbWVkaWE6IGNlZHJ1czog RGV0ZWN0IGZpcnN0IHNsaWNlIG9mIGEgZnJhbWUKPiA+Pj4gICBtZWRpYTogY2VkcnVzOiBoMjY0 OiBTdXBwb3J0IG11bHRpcGxlIHNsaWNlcyBwZXIgZnJhbWUKPiA+Pj4gICBtZWRpYTogY2VkcnVz OiBBZGQgc3VwcG9ydCBmb3IgaG9sZGluZyBjYXB0dXJlIGJ1ZmZlcgo+ID4+PiAgCj4gPj4+ICBE b2N1bWVudGF0aW9uL21lZGlhL3VhcGkvdjRsL2J1ZmZlci5yc3QgICAgICAgfCAxMyArKysrKysK PiA+Pj4gIC4uLi9tZWRpYS91YXBpL3Y0bC92aWRpb2MtZGVjb2Rlci1jbWQucnN0ICAgICB8IDEw ICsrKy0KPiA+Pj4gIC4uLi9tZWRpYS91YXBpL3Y0bC92aWRpb2MtcmVxYnVmcy5yc3QgICAgICAg ICB8ICA2ICsrKwo+ID4+PiAgLi4uL21lZGlhL3ZpZGVvZGV2Mi5oLnJzdC5leGNlcHRpb25zICAg ICAgICAgIHwgIDEgKwo+ID4+PiAgLi4uL21lZGlhL2NvbW1vbi92aWRlb2J1ZjIvdmlkZW9idWYy LXY0bDIuYyAgIHwgIDggKysrLQo+ID4+PiAgZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1t ZW0ybWVtLmMgICAgICAgIHwgMzUgKysrKysrKysrKysrKysKPiA+Pj4gIGRyaXZlcnMvc3RhZ2lu Zy9tZWRpYS9zdW54aS9jZWRydXMvY2VkcnVzLmggICB8ICAxICsKPiA+Pj4gIC4uLi9zdGFnaW5n L21lZGlhL3N1bnhpL2NlZHJ1cy9jZWRydXNfZGVjLmMgICB8IDExICsrKysrCj4gPj4+ICAuLi4v c3RhZ2luZy9tZWRpYS9zdW54aS9jZWRydXMvY2VkcnVzX2gyNjQuYyAgfCAxMSArKysrLQo+ID4+ PiAgLi4uL3N0YWdpbmcvbWVkaWEvc3VueGkvY2VkcnVzL2NlZHJ1c19ody5jICAgIHwgIDggKyst LQo+ID4+PiAgLi4uL3N0YWdpbmcvbWVkaWEvc3VueGkvY2VkcnVzL2NlZHJ1c192aWRlby5jIHwg MTQgKysrKysrCj4gPj4+ICBpbmNsdWRlL21lZGlhL3Y0bDItbWVtMm1lbS5oICAgICAgICAgICAg ICAgICAgfCA0NiArKysrKysrKysrKysrKysrKysrCj4gPj4+ICBpbmNsdWRlL21lZGlhL3ZpZGVv YnVmMi1jb3JlLmggICAgICAgICAgICAgICAgfCAgMyArKwo+ID4+PiAgaW5jbHVkZS9tZWRpYS92 aWRlb2J1ZjItdjRsMi5oICAgICAgICAgICAgICAgIHwgIDUgKysKPiA+Pj4gIGluY2x1ZGUvdWFw aS9saW51eC92aWRlb2RldjIuaCAgICAgICAgICAgICAgICB8IDE0ICsrKystLQo+ID4+PiAgMTUg ZmlsZXMgY2hhbmdlZCwgMTc1IGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9ucygtKQo+ID4+IAo+ ID4+IEkgZGlkbid0IHdhbnQgdG8gbWFrZSBhIHYzIG9mIHRoaXMgc2VyaWVzLCBpbnN0ZWFkIEkg aGFja2VkIHRoaXMgcGF0Y2gKPiA+PiB0aGF0Cj4gPj4gd2lsbCBob3BlZnVsbHkgZG8gYWxsIHRo ZSBsb2NraW5nIHJpZ2h0Lgo+ID4+IAo+ID4+IEJhc2ljYWxseSBJIG1vdmVkIGFsbCB0aGUgJ2hl bGQnIHJlbGF0ZWQgY29kZSBpbnRvIHY0bDItbWVtMm1lbSB1bmRlcgo+ID4+IGpvYl9zcGlubG9j ay4gVGhpcyBzaW1wbGlmaWVzIHRoZSBkcml2ZXIgY29kZSBhcyB3ZWxsLgo+ID4+IAo+ID4+IEJ1 dCB0aGlzIGlzIGEgaGFjayB0aGF0IHNpdHMgb24gdG9wIG9mIHRoaXMgc2VyaWVzLiBJZiB5b3Vy IGZmbXBlZyB0ZXN0cwo+ID4+IGFyZSBub3cgc3VjY2Vzc2Z1bCwgdGhlbiBJJ2xsIHR1cm4gdGhp cyBpbnRvIGEgcHJvcGVyIHNlcmllcyB3aXRoCj4gPj4gY29ycmVjdCBkb2N1bWVudGF0aW9uIChh IGxvdCBvZiB0aGUgY29tbWVudHMgYXJlIG5vdyB3cm9uZyB3aXRoIHRoaXMKPiA+PiBwYXRjaCwg c28ganVzdCBpZ25vcmUgdGhhdCkuCj4gPiAKPiA+IFRoYW5rcyBmb3IgbG9va2luZyBpbnRvIHRo aXMhIFdpdGggc21hbGwgZml4IG1lbnRpb25lZCBiZWxvdywgaXQgd29ya3MhCj4gPiBOb3RlIHRo YXQgYm90aCBzY2VuYXJpb3MgSSB0ZXN0ZWQgKGZsdXNoaW5nIGR1cmluZyBkZWNvZGluZyBhbmQg Zmx1c2hpbmcKPiA+IGFmdGVyIGRlY29kaW5nIGlzIGZpbmlzaGVkKSBhcmUgZm9jdXNlZCBvbiBj YXB0dXJlIHF1ZXVlLiBJbiBvcmRlciB0bwo+ID4gdHJpZ2dlciBvdXRwdXQgcXVldWUgZmx1c2gs IGZmbXBlZyB3b3VsZCBuZWVkIHRvIHF1ZXVlIG11bHRpcGxlIGpvYnMgYW5kCj4gPiBjYWxsIGZs dXNoIGJlZm9yZSB0aGV5IGFyZSBhbGwgcHJvY2Vzc2VkLiBUaGlzIGlzIG5vdCBzb21ldGhpbmcg SSBjYW4gZG8KPiA+IGF0IHRoaXMgdGltZS4gTWF5YmUgSm9uYXMgY2FuIGhlbHAgd2l0aCBtb2Rp ZnlpbmcgZmZtcGVnIGFwcHJvcHJpYXRlbHkuCj4gPiBIb3dldmVyLCBjb2RlIGZvciBjYXNlIHNl ZW1zIGNvcnJlY3QgdG8gbWUuCj4gPiAKPiA+PiBSZWdhcmRzLAo+ID4+IAo+ID4+IAlIYW5zCj4g Pj4gCj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItbWVtMm1l bS5jCj4gPj4gYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLW1lbTJtZW0uYyBpbmRleCAy Njc3YTA3ZTRjOWIuLmY4MWE4ZjI0NjVhYgo+ID4+IDEwMDY0NAo+ID4+IC0tLSBhL2RyaXZlcnMv bWVkaWEvdjRsMi1jb3JlL3Y0bDItbWVtMm1lbS5jCj4gPj4gKysrIGIvZHJpdmVycy9tZWRpYS92 NGwyLWNvcmUvdjRsMi1tZW0ybWVtLmMKPiA+PiBAQCAtNDEyLDI1ICs0MTIsMjQgQEAgc3RhdGlj IHZvaWQgdjRsMl9tMm1fY2FuY2VsX2pvYihzdHJ1Y3QgdjRsMl9tMm1fY3R4Cj4gPj4gKm0ybV9j dHgpIH0KPiA+PiAKPiA+PiAgfQo+ID4+IAo+ID4+IC12b2lkIHY0bDJfbTJtX2pvYl9maW5pc2go c3RydWN0IHY0bDJfbTJtX2RldiAqbTJtX2RldiwKPiA+PiAtCQkJIHN0cnVjdCB2NGwyX20ybV9j dHggKm0ybV9jdHgpCj4gPj4gK3N0YXRpYyBib29sIF92NGwyX20ybV9qb2JfZmluaXNoKHN0cnVj dCB2NGwyX20ybV9kZXYgKm0ybV9kZXYsCj4gPj4gKwkJCSAgc3RydWN0IHY0bDJfbTJtX2N0eCAq bTJtX2N0eCkKPiA+PiAKPiA+PiAgewo+ID4+IAo+ID4+IC0JdW5zaWduZWQgbG9uZyBmbGFnczsK PiA+PiAtCj4gPj4gLQlzcGluX2xvY2tfaXJxc2F2ZSgmbTJtX2Rldi0+am9iX3NwaW5sb2NrLCBm bGFncyk7Cj4gPj4gCj4gPj4gIAlpZiAoIW0ybV9kZXYtPmN1cnJfY3R4IHx8IG0ybV9kZXYtPmN1 cnJfY3R4ICE9IG0ybV9jdHgpIHsKPiA+PiAKPiA+PiAtCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZtMm1fZGV2LT5qb2Jfc3BpbmxvY2ssIGZsYWdzKTsKPiA+PiAKPiA+PiAgCQlkcHJpbnRrKCJD YWxsZWQgYnkgYW4gaW5zdGFuY2Ugbm90IGN1cnJlbnRseQo+ID4gCj4gPiBydW5uaW5nXG4iKTsK PiA+IAo+ID4+IC0JCXJldHVybjsKPiA+PiArCQlyZXR1cm4gZmFsc2U7Cj4gPj4gCj4gPj4gIAl9 Cj4gPj4gIAkKPiA+PiAgCWxpc3RfZGVsKCZtMm1fZGV2LT5jdXJyX2N0eC0+cXVldWUpOwo+ID4+ ICAJbTJtX2Rldi0+Y3Vycl9jdHgtPmpvYl9mbGFncyAmPSB+KFRSQU5TX1FVRVVFRCB8IFRSQU5T X1JVTk5JTkcpOwo+ID4+ICAJd2FrZV91cCgmbTJtX2Rldi0+Y3Vycl9jdHgtPmZpbmlzaGVkKTsK PiA+PiAgCW0ybV9kZXYtPmN1cnJfY3R4ID0gTlVMTDsKPiA+PiAKPiA+PiArCXJldHVybiB0cnVl Owo+ID4+ICt9Cj4gPj4gCj4gPj4gLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtMm1fZGV2LT5q b2Jfc3BpbmxvY2ssIGZsYWdzKTsKPiA+PiAtCj4gPj4gK3N0YXRpYyB2b2lkIHY0bDJfbTJtX2pv Yl9uZXh0KHN0cnVjdCB2NGwyX20ybV9kZXYgKm0ybV9kZXYsCj4gPj4gKwkJICAgICAgIHN0cnVj dCB2NGwyX20ybV9jdHggKm0ybV9jdHgpCj4gPj4gK3sKPiA+PiAKPiA+PiAgCS8qIFRoaXMgaW5z dGFuY2UgbWlnaHQgaGF2ZSBtb3JlIGJ1ZmZlcnMgcmVhZHksIGJ1dCBzaW5jZSB3ZSBkbyBub3QK PiA+PiAgCQo+ID4+ICAJICogYWxsb3cgbW9yZSB0aGFuIG9uZSBqb2Igb24gdGhlIGpvYl9xdWV1 ZSBwZXIgaW5zdGFuY2UsIGVhY2ggaGFzCj4gPj4gIAkgKiB0byBiZSBzY2hlZHVsZWQgc2VwYXJh dGVseSBhZnRlciB0aGUgcHJldmlvdXMgb25lIGZpbmlzaGVzLiAqLwo+ID4+IAo+ID4+IEBAIC00 NDEsOCArNDQwLDExMyBAQCB2b2lkIHY0bDJfbTJtX2pvYl9maW5pc2goc3RydWN0IHY0bDJfbTJt X2Rldgo+ID4+ICptMm1fZGV2LCAqLwo+ID4+IAo+ID4+ICAJc2NoZWR1bGVfd29yaygmbTJtX2Rl di0+am9iX3dvcmspOwo+ID4+ICAKPiA+PiAgfQo+ID4+IAo+ID4+ICsKPiA+PiArdm9pZCB2NGwy X20ybV9qb2JfZmluaXNoKHN0cnVjdCB2NGwyX20ybV9kZXYgKm0ybV9kZXYsCj4gPj4gKwkJCSBz dHJ1Y3QgdjRsMl9tMm1fY3R4ICptMm1fY3R4KQo+ID4+ICt7Cj4gPj4gKwl1bnNpZ25lZCBsb25n IGZsYWdzOwo+ID4+ICsKPiA+PiArCXNwaW5fbG9ja19pcnFzYXZlKCZtMm1fZGV2LT5qb2Jfc3Bp bmxvY2ssIGZsYWdzKTsKPiA+PiArCWlmICghX3Y0bDJfbTJtX2pvYl9maW5pc2gobTJtX2Rldiwg bTJtX2N0eCkpIHsKPiA+PiArCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtMm1fZGV2LT5qb2Jf c3BpbmxvY2ssIGZsYWdzKTsKPiA+PiArCQlyZXR1cm47Cj4gPj4gKwl9Cj4gPj4gKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZtMm1fZGV2LT5qb2Jfc3BpbmxvY2ssIGZsYWdzKTsKPiA+PiArCj4g Pj4gKwl2NGwyX20ybV9qb2JfbmV4dChtMm1fZGV2LCBtMm1fY3R4KTsKPiA+PiArfQo+ID4+IAo+ ID4+ICBFWFBPUlRfU1lNQk9MKHY0bDJfbTJtX2pvYl9maW5pc2gpOwo+ID4+IAo+ID4+ICt2b2lk IHY0bDJfbTJtX2pvYl9maW5pc2hfaGVsZChzdHJ1Y3QgdjRsMl9tMm1fZGV2ICptMm1fZGV2LAo+ ID4+ICsJCQkgc3RydWN0IHY0bDJfbTJtX2N0eCAqbTJtX2N0eCwKPiA+PiArCQkJIGVudW0gdmIy X2J1ZmZlcl9zdGF0ZSBzdGF0ZSkKPiA+PiArewo+ID4+ICsJc3RydWN0IHZiMl92NGwyX2J1ZmZl ciAqc3JjX2J1ZiwgKmRzdF9idWY7Cj4gPj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ID4+ICsK PiA+PiArCXNwaW5fbG9ja19pcnFzYXZlKCZtMm1fZGV2LT5qb2Jfc3BpbmxvY2ssIGZsYWdzKTsK PiA+PiArCXNyY19idWYgPSB2NGwyX20ybV9zcmNfYnVmX3JlbW92ZShtMm1fY3R4KTsKPiA+PiAr CWRzdF9idWYgPSB2NGwyX20ybV9uZXh0X2RzdF9idWYobTJtX2N0eCk7Cj4gPj4gKwo+ID4+ICsJ aWYgKCFzcmNfYnVmIHx8ICFkc3RfYnVmKSB7Cj4gPj4gKwkJcHJfZXJyKCJNaXNzaW5nIHNvdXJj ZSBhbmQvb3IgZGVzdGluYXRpb24gYnVmZmVyc1xuIik7Cj4gPj4gKwkJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmbTJtX2Rldi0+am9iX3NwaW5sb2NrLCBmbGFncyk7Cj4gPj4gKwkJcmV0dXJuOwo+ ID4+ICsJfQo+ID4+ICsJdjRsMl9tMm1fYnVmX2RvbmUoc3JjX2J1Ziwgc3RhdGUpOwo+ID4+ICsJ aWYgKCFkc3RfYnVmLT5pc19oZWxkKSB7Cj4gPj4gKwkJdjRsMl9tMm1fZHN0X2J1Zl9yZW1vdmUo bTJtX2N0eCk7Cj4gPj4gKwkJdjRsMl9tMm1fYnVmX2RvbmUoZHN0X2J1Ziwgc3RhdGUpOwo+ID4+ ICsJfQo+ID4+ICsJaWYgKCFfdjRsMl9tMm1fam9iX2ZpbmlzaChtMm1fZGV2LCBtMm1fY3R4KSkg ewo+ID4+ICsJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0ybV9kZXYtPmpvYl9zcGlubG9jaywg ZmxhZ3MpOwo+ID4+ICsJCXJldHVybjsKPiA+PiArCX0KPiA+PiArCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJm0ybV9kZXYtPmpvYl9zcGlubG9jaywgZmxhZ3MpOwo+ID4+ICsKPiA+PiArCXY0bDJf bTJtX2pvYl9uZXh0KG0ybV9kZXYsIG0ybV9jdHgpOwo+ID4+ICt9Cj4gPj4gK0VYUE9SVF9TWU1C T0wodjRsMl9tMm1fam9iX2ZpbmlzaF9oZWxkKTsKPiA+PiArCj4gPj4gKy8qKgo+ID4+ICsgKiB2 NGwyX20ybV9yZWxlYXNlX2NhcHR1cmVfYnVmKCkgLSBjaGVjayBpZiB0aGUgY2FwdHVyZSBidWZm ZXIgc2hvdWxkCj4gPj4gYmUKPiA+PiArICogcmVsZWFzZWQKPiA+PiArICoKPiA+PiArICogQG91 dF92YjogdGhlIG91dHB1dCBidWZmZXIKPiA+PiArICogQGNhcF92YjogdGhlIGNhcHR1cmUgYnVm ZmVyCj4gPj4gKyAqCj4gPj4gKyAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBp ZiB0aGUgY3VycmVudCBjYXB0dXJlIGJ1ZmZlcgo+ID4+IHNob3VsZAo+ID4+ICsgKiBiZSByZWxl YXNlZCB0byB2YjIuIFRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIG91dHB1dCBidWZmZXIgc3BlY2lm aWVkCj4gPj4gdGhhdCArICogdGhlIGNhcHR1cmUgYnVmZmVyIHNob3VsZCBiZSBoZWxkIChpLmUu IG5vdCByZXR1cm5lZCB0byB2YjIpCj4gPj4gQU5EIGlmIHRoZSArICogdGltZXN0YW1wIG9mIHRo ZSBjYXB0dXJlIGJ1ZmZlciBkaWZmZXJzIGZyb20gdGhlIG91dHB1dAo+ID4+IGJ1ZmZlciB0aW1l c3RhbXAuICsgKgo+ID4+ICsgKiBUaGlzIGhlbHBlciBpcyB0byBiZSBjYWxsZWQgYXQgdGhlIHN0 YXJ0IG9mIHRoZSBkZXZpY2VfcnVuIGNhbGxiYWNrOgo+ID4+ICsgKgo+ID4+ICsgKiAuLiBjb2Rl LWJsb2NrOjogYwo+ID4+ICsgKgo+ID4+ICsgKglpZiAodjRsMl9tMm1fcmVsZWFzZV9jYXB0dXJl X2J1ZihvdXRfdmIsIGNhcF92YikpIHsKPiA+PiArICoJCXY0bDJfbTJtX2RzdF9idWZfcmVtb3Zl KG0ybV9jdHgpOwo+ID4+ICsgKgkJdjRsMl9tMm1fYnVmX2RvbmUoY2FwX3ZiLCBWQjJfQlVGX1NU QVRFX0RPTkUpOwo+ID4+ICsgKgkJY2FwX3ZiID0gdjRsMl9tMm1fbmV4dF9kc3RfYnVmKG0ybV9j dHgpOwo+ID4+ICsgKgl9Cj4gPj4gKyAqCWNhcF92Yi0+aXNfaGVsZCA9IG91dF92Yi0+ZmxhZ3Mg Jgo+ID4gCj4gPiBWNEwyX0JVRl9GTEFHX00yTV9IT0xEX0NBUFRVUkVfQlVGOwo+ID4gCj4gPj4g KyAqCj4gPj4gKyAqCS4uLgo+ID4+ICsgKgo+ID4+ICsgKgl2NGwyX20ybV9idWZfZG9uZShvdXRf dmIsIFZCMl9CVUZfU1RBVEVfRE9ORSk7Cj4gPj4gKyAqCWlmICghY2FwX3ZiLT5pc19oZWxkKSB7 Cj4gPj4gKyAqCQl2NGwyX20ybV9kc3RfYnVmX3JlbW92ZShtMm1fY3R4KTsKPiA+PiArICoJCXY0 bDJfbTJtX2J1Zl9kb25lKGNhcF92YiwgVkIyX0JVRl9TVEFURV9ET05FKTsKPiA+PiArICoJfQo+ ID4+ICsgKgo+ID4+ICsgKiBUaGlzIGFsbG93cyBmb3IgbXVsdGlwbGUgb3V0cHV0IGJ1ZmZlcnMg dG8gYmUgdXNlZCB0byBmaWxsIGluIGEKPiA+PiBzaW5nbGUKPiA+PiArICogY2FwdHVyZSBidWZm ZXIuIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgYnkgc3RhdGVsZXNzIGRlY29kZXJzIHdoZXJlCj4g Pj4gKyAqIG11bHRpcGxlIGUuZy4gSC4yNjQgc2xpY2VzIGNvbnRyaWJ1dGUgdG8gYSBzaW5nbGUg ZGVjb2RlZCBmcmFtZS4KPiA+PiArICovCj4gPj4gK3N0cnVjdCB2YjJfdjRsMl9idWZmZXIgKnY0 bDJfbTJtX3JlbGVhc2VfY2FwdHVyZV9idWYoc3RydWN0IHY0bDJfbTJtX2N0eAo+ID4+ICptMm1f Y3R4KSArewo+ID4+ICsJc3RydWN0IHY0bDJfbTJtX2RldiAqbTJtX2RldiA9IG0ybV9jdHgtPm0y bV9kZXY7Cj4gPj4gKwlzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICpzcmMsICpkc3Q7Cj4gPj4gKwl1 bnNpZ25lZCBsb25nIGZsYWdzOwo+ID4+ICsKPiA+PiArCXNwaW5fbG9ja19pcnFzYXZlKCZtMm1f ZGV2LT5qb2Jfc3BpbmxvY2ssIGZsYWdzKTsKPiA+PiArCXNyYyA9IHY0bDJfbTJtX25leHRfc3Jj X2J1ZihtMm1fY3R4KTsKPiA+PiArCWRzdCA9IHY0bDJfbTJtX25leHRfZHN0X2J1ZihtMm1fY3R4 KTsKPiA+PiArCj4gPj4gKwlpZiAoZHN0LT5pc19oZWxkICYmIGRzdC0+dmIyX2J1Zi5jb3BpZWRf dGltZXN0YW1wICYmCj4gPj4gKwkgICAgc3JjLT52YjJfYnVmLnRpbWVzdGFtcCAhPSBkc3QtPnZi Ml9idWYudGltZXN0YW1wKSB7Cj4gPj4gKwkJZHN0LT5pc19oZWxkID0gZmFsc2U7Cj4gPj4gKwkJ djRsMl9tMm1fZHN0X2J1Zl9yZW1vdmUobTJtX2N0eCk7Cj4gPj4gKwkJdjRsMl9tMm1fYnVmX2Rv bmUoZHN0LCBWQjJfQlVGX1NUQVRFX0RPTkUpOwo+ID4+ICsJCWRzdCA9IHY0bDJfbTJtX25leHRf ZHN0X2J1ZihtMm1fY3R4KTsKPiA+PiArCX0KPiA+PiArCWRzdC0+aXNfaGVsZCA9IHNyYy0+Zmxh Z3MgJiBWNEwyX0JVRl9GTEFHX00yTV9IT0xEX0NBUFRVUkVfQlVGOwo+ID4+ICsJc3JjLT5mbGFn cyAmPSB+VjRMMl9CVUZfRkxBR19NMk1fSE9MRF9DQVBUVVJFX0JVRjsKPiA+PiArCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJm0ybV9kZXYtPmpvYl9zcGlubG9jaywgZmxhZ3MpOwo+ID4+ICsJcmV0 dXJuIGRzdDsKPiA+PiArfQo+ID4+ICtFWFBPUlRfU1lNQk9MKHY0bDJfbTJtX3JlbGVhc2VfY2Fw dHVyZV9idWYpOwo+ID4+ICsKPiA+PiAKPiA+PiAgaW50IHY0bDJfbTJtX3JlcWJ1ZnMoc3RydWN0 IGZpbGUgKmZpbGUsIHN0cnVjdCB2NGwyX20ybV9jdHggKm0ybV9jdHgsCj4gPj4gIAo+ID4+ICAJ CSAgICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcWJ1ZnMpCj4gPj4gIAo+ID4+ICB7 Cj4gPj4gCj4gPj4gQEAgLTExNzEsMTkgKzEyNzUsMjggQEAgaW50IHY0bDJfbTJtX2lvY3RsX3N0 YXRlbGVzc19kZWNvZGVyX2NtZChzdHJ1Y3QKPiA+PiBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB7 Cj4gPj4gCj4gPj4gIAlzdHJ1Y3QgdjRsMl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Cj4g Pj4gIAlzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICpvdXRfdmIsICpjYXBfdmI7Cj4gPj4gCj4gPj4g KwlzdHJ1Y3QgdjRsMl9tMm1fZGV2ICptMm1fZGV2ID0gZmgtPm0ybV9jdHgtPm0ybV9kZXY7Cj4g Pj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ID4+IAo+ID4+ICAJaW50IHJldDsKPiA+PiAgCQo+ ID4+ICAJcmV0ID0gdjRsMl9tMm1faW9jdGxfc3RhdGVsZXNzX3RyeV9kZWNvZGVyX2NtZChmaWxl LCBwcml2LCBkYyk7Cj4gPj4gIAlpZiAocmV0IDwgMCkKPiA+PiAgCQo+ID4+ICAJCXJldHVybiBy ZXQ7Cj4gPj4gCj4gPj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTJtX2Rldi0+am9iX3NwaW5sb2Nr LCBmbGFncyk7Cj4gPj4gCj4gPj4gIAlvdXRfdmIgPSB2NGwyX20ybV9sYXN0X3NyY19idWYoZmgt Pm0ybV9jdHgpOwo+ID4+ICAJY2FwX3ZiID0gdjRsMl9tMm1fbGFzdF9kc3RfYnVmKGZoLT5tMm1f Y3R4KTsKPiA+PiAKPiA+PiAtCWlmIChvdXRfdmIpCj4gPj4gKwlpZiAob3V0X3ZiICYmIChvdXRf dmItPmZsYWdzICYgVjRMMl9CVUZfRkxBR19NMk1fSE9MRF9DQVBUVVJFX0JVRikpCj4gPiAKPiA+ IHsKPiA+IAo+ID4+ICAJCW91dF92Yi0+ZmxhZ3MgJj0gflY0TDJfQlVGX0ZMQUdfTTJNX0hPTERf Q0FQVFVSRV9CVUY7Cj4gPj4gCj4gPj4gLQllbHNlIGlmIChjYXBfdmIgJiYgY2FwX3ZiLT5pc19o ZWxkKQo+ID4+IC0JCXY0bDJfbTJtX2J1Zl9kb25lKGNhcF92YiwgVkIyX0JVRl9TVEFURV9ET05F KTsKPiA+PiArCX0gZWxzZSBpZiAoY2FwX3ZiICYmIGNhcF92Yi0+aXNfaGVsZCkgewo+ID4+ICsJ CWNhcF92Yi0+aXNfaGVsZCA9IGZhbHNlOwo+ID4+ICsJCWlmIChtMm1fZGV2LT5jdXJyX2N0eCkg ewo+ID4gCj4gPiBBYm92ZSBjb25kaXRpb24gc2hvdWxkIGJlIG5lZ2F0ZWQuCj4gCj4gQ2xvc2Uu IEl0IHNob3VsZCBjaGVjayB0aGF0IHRoaXMgYnVmZmVyIGlzbid0IGN1cnJlbnRseSBiZWluZyBw cm9jZXNzZWQuCj4gU286Cj4gCj4gCQlpZiAobTJtX2Rldi0+Y3Vycl9jdHggIT0gZmgtPm0ybV9j dHgpIHsKPiAKPiBDYW4geW91IHRlc3Qgd2l0aCB0aGlzIGNoYW5nZT8gSWYgdGhpcyB3b3Jrcywg dGhlbiBJJ2xsIHBvc3QgYSBwcm9wZXIKPiBzZXJpZXMgZm9yIHRoaXMuCgpJIGNvbmZpcm0gdGhh dCBpdCB3b3Jrcy4KCkJlc3QgcmVnYXJkcywKSmVybmVqCgo+IAo+IFRoYW5rcyEKPiAKPiAJSGFu cwo+IAo+ID4gQmVzdCByZWdhcmRzLAo+ID4gSmVybmVqCj4gPiAKPiA+PiArCQkJdjRsMl9tMm1f ZHN0X2J1Zl9yZW1vdmUoZmgtPm0ybV9jdHgpOwo+ID4+ICsJCQl2NGwyX20ybV9idWZfZG9uZShj YXBfdmIsCj4gPiAKPiA+IFZCMl9CVUZfU1RBVEVfRE9ORSk7Cj4gPiAKPiA+PiArCQl9Cj4gPj4g Kwl9Cj4gPj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtMm1fZGV2LT5qb2Jfc3BpbmxvY2ss IGZsYWdzKTsKPiA+PiAKPiA+PiAgCXJldHVybiAwOwo+ID4+ICAKPiA+PiAgfQo+ID4+IAo+ID4+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc3VueGkvY2VkcnVzL2NlZHJ1c19k ZWMuYwo+ID4+IGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3N1bnhpL2NlZHJ1cy9jZWRydXNfZGVj LmMgaW5kZXgKPiA+PiA2N2Y3ZDQzMjZmYzEuLjRlMzBmMjYzYjQyNyAxMDA2NDQKPiA+PiAtLS0g YS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc3VueGkvY2VkcnVzL2NlZHJ1c19kZWMuYwo+ID4+ICsr KyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zdW54aS9jZWRydXMvY2VkcnVzX2RlYy5jCj4gPj4g QEAgLTMwLDE0ICszMCw3IEBAIHZvaWQgY2VkcnVzX2RldmljZV9ydW4odm9pZCAqcHJpdikKPiA+ PiAKPiA+PiAgCXN0cnVjdCBtZWRpYV9yZXF1ZXN0ICpzcmNfcmVxOwo+ID4+ICAJCj4gPj4gIAly dW4uc3JjID0gdjRsMl9tMm1fbmV4dF9zcmNfYnVmKGN0eC0+ZmgubTJtX2N0eCk7Cj4gPj4gCj4g Pj4gLQlydW4uZHN0ID0gdjRsMl9tMm1fbmV4dF9kc3RfYnVmKGN0eC0+ZmgubTJtX2N0eCk7Cj4g Pj4gLQo+ID4+IC0JaWYgKHY0bDJfbTJtX3JlbGVhc2VfY2FwdHVyZV9idWYocnVuLnNyYywgcnVu LmRzdCkpIHsKPiA+PiAtCQl2NGwyX20ybV9kc3RfYnVmX3JlbW92ZShjdHgtPmZoLm0ybV9jdHgp Owo+ID4+IC0JCXY0bDJfbTJtX2J1Zl9kb25lKHJ1bi5kc3QsIFZCMl9CVUZfU1RBVEVfRE9ORSk7 Cj4gPj4gLQkJcnVuLmRzdCA9IHY0bDJfbTJtX25leHRfZHN0X2J1ZihjdHgtPmZoLm0ybV9jdHgp Owo+ID4+IC0JfQo+ID4+IC0JcnVuLmRzdC0+aXNfaGVsZCA9IHJ1bi5zcmMtPmZsYWdzICYKPiA+ IAo+ID4gVjRMMl9CVUZfRkxBR19NMk1fSE9MRF9DQVBUVVJFX0JVRjsKPiA+IAo+ID4+ICsJcnVu LmRzdCA9IHY0bDJfbTJtX3JlbGVhc2VfY2FwdHVyZV9idWYoY3R4LT5maC5tMm1fY3R4KTsKPiA+ PiAKPiA+PiAgCXJ1bi5maXJzdF9zbGljZSA9ICFydW4uZHN0LT52YjJfYnVmLmNvcGllZF90aW1l c3RhbXAgfHwKPiA+PiAgCQo+ID4+ICAJCXJ1bi5zcmMtPnZiMl9idWYudGltZXN0YW1wICE9IHJ1 bi5kc3QtCj4gPj4gCj4gPj4gdmIyX2J1Zi50aW1lc3RhbXA7Cj4gPj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvc3RhZ2luZy9tZWRpYS9zdW54aS9jZWRydXMvY2VkcnVzX2h3LmMKPiA+PiBiL2RyaXZl cnMvc3RhZ2luZy9tZWRpYS9zdW54aS9jZWRydXMvY2VkcnVzX2h3LmMgaW5kZXgKPiA+PiA5OWZl ZGVjODAyMjQuLjI0MmNhZDgyY2M4YyAxMDA2NDQKPiA+PiAtLS0gYS9kcml2ZXJzL3N0YWdpbmcv bWVkaWEvc3VueGkvY2VkcnVzL2NlZHJ1c19ody5jCj4gPj4gKysrIGIvZHJpdmVycy9zdGFnaW5n L21lZGlhL3N1bnhpL2NlZHJ1cy9jZWRydXNfaHcuYwo+ID4+IEBAIC0xMDMsNyArMTAzLDYgQEAg c3RhdGljIGlycXJldHVybl90IGNlZHJ1c19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+PiAK PiA+PiAgewo+ID4+ICAKPiA+PiAgCXN0cnVjdCBjZWRydXNfZGV2ICpkZXYgPSBkYXRhOwo+ID4+ ICAJc3RydWN0IGNlZHJ1c19jdHggKmN0eDsKPiA+PiAKPiA+PiAtCXN0cnVjdCB2YjJfdjRsMl9i dWZmZXIgKnNyY19idWYsICpkc3RfYnVmOwo+ID4+IAo+ID4+ICAJZW51bSB2YjJfYnVmZmVyX3N0 YXRlIHN0YXRlOwo+ID4+ICAJZW51bSBjZWRydXNfaXJxX3N0YXR1cyBzdGF0dXM7Cj4gPj4gCj4g Pj4gQEAgLTEyMSwyNiArMTIwLDEyIEBAIHN0YXRpYyBpcnFyZXR1cm5fdCBjZWRydXNfaXJxKGlu dCBpcnEsIHZvaWQgKmRhdGEpCj4gPj4gCj4gPj4gIAlkZXYtPmRlY19vcHNbY3R4LT5jdXJyZW50 X2NvZGVjXS0+aXJxX2Rpc2FibGUoY3R4KTsKPiA+PiAgCWRldi0+ZGVjX29wc1tjdHgtPmN1cnJl bnRfY29kZWNdLT5pcnFfY2xlYXIoY3R4KTsKPiA+PiAKPiA+PiAtCXNyY19idWYgPSB2NGwyX20y bV9zcmNfYnVmX3JlbW92ZShjdHgtPmZoLm0ybV9jdHgpOwo+ID4+IC0JZHN0X2J1ZiA9IHY0bDJf bTJtX25leHRfZHN0X2J1ZihjdHgtPmZoLm0ybV9jdHgpOwo+ID4+IC0KPiA+PiAtCWlmICghc3Jj X2J1ZiB8fCAhZHN0X2J1Zikgewo+ID4+IC0JCXY0bDJfZXJyKCZkZXYtPnY0bDJfZGV2LAo+ID4+ IC0JCQkgIk1pc3Npbmcgc291cmNlIGFuZC9vciBkZXN0aW5hdGlvbgo+ID4gCj4gPiBidWZmZXJz XG4iKTsKPiA+IAo+ID4+IC0JCXJldHVybiBJUlFfSEFORExFRDsKPiA+PiAtCX0KPiA+PiAtCj4g Pj4gCj4gPj4gIAlpZiAoc3RhdHVzID09IENFRFJVU19JUlFfRVJST1IpCj4gPj4gIAkKPiA+PiAg CQlzdGF0ZSA9IFZCMl9CVUZfU1RBVEVfRVJST1I7Cj4gPj4gIAkKPiA+PiAgCWVsc2UKPiA+PiAg CQo+ID4+ICAJCXN0YXRlID0gVkIyX0JVRl9TVEFURV9ET05FOwo+ID4+IAo+ID4+IC0JdjRsMl9t Mm1fYnVmX2RvbmUoc3JjX2J1Ziwgc3RhdGUpOwo+ID4+IC0JaWYgKCFkc3RfYnVmLT5pc19oZWxk KSB7Cj4gPj4gLQkJdjRsMl9tMm1fZHN0X2J1Zl9yZW1vdmUoY3R4LT5maC5tMm1fY3R4KTsKPiA+ PiAtCQl2NGwyX20ybV9idWZfZG9uZShkc3RfYnVmLCBzdGF0ZSk7Cj4gPj4gLQl9Cj4gPj4gLQl2 NGwyX20ybV9qb2JfZmluaXNoKGN0eC0+ZGV2LT5tMm1fZGV2LCBjdHgtPmZoLm0ybV9jdHgpOwo+ ID4+ICsJdjRsMl9tMm1fam9iX2ZpbmlzaF9oZWxkKGN0eC0+ZGV2LT5tMm1fZGV2LCBjdHgtPmZo Lm0ybV9jdHgsIApzdGF0ZSk7Cj4gPj4gCj4gPj4gIAlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gPj4g IAo+ID4+ICB9Cj4gPj4gCj4gPj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1tZW0y bWVtLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItbWVtMm1lbS5oCj4gPj4gaW5kZXggOGFlMmY1NmM3 ZmEzLi40OGNhN2QzZWFhM2QgMTAwNjQ0Cj4gPj4gLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLW1l bTJtZW0uaAo+ID4+ICsrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1tZW0ybWVtLmgKPiA+PiBAQCAt MTczLDYgKzE3MywxMCBAQCB2b2lkIHY0bDJfbTJtX3RyeV9zY2hlZHVsZShzdHJ1Y3QgdjRsMl9t Mm1fY3R4Cj4gPj4gKm0ybV9jdHgpOyB2b2lkIHY0bDJfbTJtX2pvYl9maW5pc2goc3RydWN0IHY0 bDJfbTJtX2RldiAqbTJtX2RldiwKPiA+PiAKPiA+PiAgCQkJIHN0cnVjdCB2NGwyX20ybV9jdHgg Km0ybV9jdHgpOwo+ID4+IAo+ID4+ICt2b2lkIHY0bDJfbTJtX2pvYl9maW5pc2hfaGVsZChzdHJ1 Y3QgdjRsMl9tMm1fZGV2ICptMm1fZGV2LAo+ID4+ICsJCQkgc3RydWN0IHY0bDJfbTJtX2N0eCAq bTJtX2N0eCwKPiA+PiArCQkJIGVudW0gdmIyX2J1ZmZlcl9zdGF0ZSBzdGF0ZSk7Cj4gPj4gKwo+ ID4+IAo+ID4+ICBzdGF0aWMgaW5saW5lIHZvaWQKPiA+PiAgdjRsMl9tMm1fYnVmX2RvbmUoc3Ry dWN0IHZiMl92NGwyX2J1ZmZlciAqYnVmLCBlbnVtIHZiMl9idWZmZXJfc3RhdGUKPiA+PiAgc3Rh dGUpCj4gPj4gCj4gPj4gewo+ID4+IEBAIC02NDQsNDcgKzY0OCw3IEBAIHZvaWQgdjRsMl9tMm1f YnVmX2NvcHlfbWV0YWRhdGEoY29uc3Qgc3RydWN0Cj4gPj4gdmIyX3Y0bDJfYnVmZmVyICpvdXRf dmIsIHN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKmNhcF92YiwKPiA+PiAKPiA+PiAgCQkJCWJvb2wg Y29weV9mcmFtZV9mbGFncyk7Cj4gPj4gCj4gPj4gLS8qKgo+ID4+IC0gKiB2NGwyX20ybV9yZWxl YXNlX2NhcHR1cmVfYnVmKCkgLSBjaGVjayBpZiB0aGUgY2FwdHVyZSBidWZmZXIgc2hvdWxkCj4g Pj4gYmUKPiA+PiAtICogcmVsZWFzZWQKPiA+PiAtICoKPiA+PiAtICogQG91dF92YjogdGhlIG91 dHB1dCBidWZmZXIKPiA+PiAtICogQGNhcF92YjogdGhlIGNhcHR1cmUgYnVmZmVyCj4gPj4gLSAq Cj4gPj4gLSAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVu dCBjYXB0dXJlIGJ1ZmZlcgo+ID4+IHNob3VsZAo+ID4+IC0gKiBiZSByZWxlYXNlZCB0byB2YjIu IFRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIG91dHB1dCBidWZmZXIgc3BlY2lmaWVkCj4gPj4gdGhh dCAtICogdGhlIGNhcHR1cmUgYnVmZmVyIHNob3VsZCBiZSBoZWxkIChpLmUuIG5vdCByZXR1cm5l ZCB0byB2YjIpCj4gPj4gQU5EIGlmIHRoZSAtICogdGltZXN0YW1wIG9mIHRoZSBjYXB0dXJlIGJ1 ZmZlciBkaWZmZXJzIGZyb20gdGhlIG91dHB1dAo+ID4+IGJ1ZmZlciB0aW1lc3RhbXAuIC0gKgo+ ID4+IC0gKiBUaGlzIGhlbHBlciBpcyB0byBiZSBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBk ZXZpY2VfcnVuIGNhbGxiYWNrOgo+ID4+IC0gKgo+ID4+IC0gKiAuLiBjb2RlLWJsb2NrOjogYwo+ ID4+IC0gKgo+ID4+IC0gKglpZiAodjRsMl9tMm1fcmVsZWFzZV9jYXB0dXJlX2J1ZihvdXRfdmIs IGNhcF92YikpIHsKPiA+PiAtICoJCXY0bDJfbTJtX2RzdF9idWZfcmVtb3ZlKG0ybV9jdHgpOwo+ ID4+IC0gKgkJdjRsMl9tMm1fYnVmX2RvbmUoY2FwX3ZiLCBWQjJfQlVGX1NUQVRFX0RPTkUpOwo+ ID4+IC0gKgkJY2FwX3ZiID0gdjRsMl9tMm1fbmV4dF9kc3RfYnVmKG0ybV9jdHgpOwo+ID4+IC0g Kgl9Cj4gPj4gLSAqCWNhcF92Yi0+aXNfaGVsZCA9IG91dF92Yi0+ZmxhZ3MgJgo+ID4gCj4gPiBW NEwyX0JVRl9GTEFHX00yTV9IT0xEX0NBUFRVUkVfQlVGOwo+ID4gCj4gPj4gLSAqCj4gPj4gLSAq CS4uLgo+ID4+IC0gKgo+ID4+IC0gKgl2NGwyX20ybV9idWZfZG9uZShvdXRfdmIsIFZCMl9CVUZf U1RBVEVfRE9ORSk7Cj4gPj4gLSAqCWlmICghY2FwX3ZiLT5pc19oZWxkKSB7Cj4gPj4gLSAqCQl2 NGwyX20ybV9kc3RfYnVmX3JlbW92ZShtMm1fY3R4KTsKPiA+PiAtICoJCXY0bDJfbTJtX2J1Zl9k b25lKGNhcF92YiwgVkIyX0JVRl9TVEFURV9ET05FKTsKPiA+PiAtICoJfQo+ID4+IC0gKgo+ID4+ IC0gKiBUaGlzIGFsbG93cyBmb3IgbXVsdGlwbGUgb3V0cHV0IGJ1ZmZlcnMgdG8gYmUgdXNlZCB0 byBmaWxsIGluIGEKPiA+PiBzaW5nbGUKPiA+PiAtICogY2FwdHVyZSBidWZmZXIuIFRoaXMgaXMg dHlwaWNhbGx5IHVzZWQgYnkgc3RhdGVsZXNzIGRlY29kZXJzIHdoZXJlCj4gPj4gLSAqIG11bHRp cGxlIGUuZy4gSC4yNjQgc2xpY2VzIGNvbnRyaWJ1dGUgdG8gYSBzaW5nbGUgZGVjb2RlZCBmcmFt ZS4KPiA+PiAtICovCj4gPj4gLXN0YXRpYyBpbmxpbmUgYm9vbCB2NGwyX20ybV9yZWxlYXNlX2Nh cHR1cmVfYnVmKGNvbnN0IHN0cnVjdAo+ID4+IHZiMl92NGwyX2J1ZmZlciAqb3V0X3ZiLCAtCj4g Pj4gCj4gPiAJY29uc3Qgc3RydWN0IHZiMl92NGwyX2J1ZmZlciAqY2FwX3ZiKQo+ID4gCQo+ID4+ IC17Cj4gPj4gLQlyZXR1cm4gY2FwX3ZiLT5pc19oZWxkICYmIGNhcF92Yi0+dmIyX2J1Zi5jb3Bp ZWRfdGltZXN0YW1wICYmCj4gPj4gLQkgICAgICAgb3V0X3ZiLT52YjJfYnVmLnRpbWVzdGFtcCAh PSBjYXBfdmItPnZiMl9idWYudGltZXN0YW1wOwo+ID4+IC19Cj4gPj4gK3N0cnVjdCB2YjJfdjRs Ml9idWZmZXIgKnY0bDJfbTJtX3JlbGVhc2VfY2FwdHVyZV9idWYoc3RydWN0IHY0bDJfbTJtX2N0 eAo+ID4+ICptMm1fY3R4KTsKPiA+PiAKPiA+PiAgLyogdjRsMiByZXF1ZXN0IGhlbHBlciAqLwoK CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZGV2ZWwg bWFpbGluZyBsaXN0CmRldmVsQGxpbnV4ZHJpdmVycHJvamVjdC5vcmcKaHR0cDovL2RyaXZlcmRl di5saW51eGRyaXZlcnByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8vZHJpdmVyZGV2LWRldmVs Cg== 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=-8.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,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 E9051ECE58D for ; Wed, 9 Oct 2019 14:44:49 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 B63D320B7C for ; Wed, 9 Oct 2019 14:44:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="LVGBWIpu" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B63D320B7C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=siol.net Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-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=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=2kwg3oXhKY4DcFObka1+X1ktAgEG2HBicxZV4cPNuU0=; b=LVGBWIpuELx2Ho ydjNi6nKv+Y9e9J1qcLnP/4RDKSQ83jdogggnMm5lZKlJLyAIWBIvFGcOso500xAYyLlI8IRsQKo6 Xkfv+TjiydXFtOb6GX5PbBz7UGhthlLA/Rj7WQCz6c6BLa+x/5MttG8OvMOw6V4gWsUZVjo91QO6M qtC0uGSkUcUffEAS3+vTXg8U31V7zjX1VdPOjpQj61p2oudBib4+NkUK6j9+DRuXGY6UQE61BMaHX n66BvFwuv7Qg1qdTNsOAwpLVgXFKkpvNTE0NE5Zcg6DPjVHcSuEPq2ZUOJRAOk2I2kuhrcPEgBenm mjKFiVQZkDjBKIOhlCBg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.2 #3 (Red Hat Linux)) id 1iIDCl-00010U-HA; Wed, 09 Oct 2019 14:44:43 +0000 Received: from mailoutvs55.siol.net ([185.57.226.246] helo=mail.siol.net) by bombadil.infradead.org with esmtps (Exim 4.92.2 #3 (Red Hat Linux)) id 1iIDCh-0000zv-4Q for linux-arm-kernel@lists.infradead.org; Wed, 09 Oct 2019 14:44:42 +0000 Received: from localhost (localhost [127.0.0.1]) by mail.siol.net (Zimbra) with ESMTP id 9E06C524BC9; Wed, 9 Oct 2019 16:44:32 +0200 (CEST) X-Virus-Scanned: amavisd-new at psrvmta12.zcs-production.pri Received: from mail.siol.net ([127.0.0.1]) by localhost (psrvmta12.zcs-production.pri [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id TfScaFaVbSPy; Wed, 9 Oct 2019 16:44:31 +0200 (CEST) Received: from mail.siol.net (localhost [127.0.0.1]) by mail.siol.net (Zimbra) with ESMTPS id 7EFFF524C3C; Wed, 9 Oct 2019 16:44:31 +0200 (CEST) Received: from jernej-laptop.localnet (cpe-86-58-59-25.static.triera.net [86.58.59.25]) (Authenticated sender: jernej.skrabec@siol.net) by mail.siol.net (Zimbra) with ESMTPA id 0BADC524BC9; Wed, 9 Oct 2019 16:44:30 +0200 (CEST) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: Hans Verkuil Subject: Re: [PATCH v2 0/6] media: cedrus: h264: Support multi-slice frames Date: Wed, 09 Oct 2019 16:44:29 +0200 Message-ID: <2146778.PlJYLztgos@jernej-laptop> In-Reply-To: References: <20190929200023.215831-1-jernej.skrabec@siol.net> <2785635.uIalc63MVP@jernej-laptop> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191009_074439_493870_FD17D77E X-CRM114-Status: GOOD ( 30.29 ) 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: devel@driverdev.osuosl.org, linux-media@vger.kernel.org, pawel@osciak.com, jonas@kwiboo.se, gregkh@linuxfoundation.org, wens@csie.org, mripard@kernel.org, tfiga@chromium.org, paul.kocialkowski@bootlin.com, kyungmin.park@samsung.com, boris.brezillon@collabora.com, linux-arm-kernel@lists.infradead.org, mchehab@kernel.org, ezequiel@collabora.com, linux-kernel@vger.kernel.org, m.szyprowski@samsung.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org RG5lIHNyZWRhLCAwOS4gb2t0b2JlciAyMDE5IG9iIDEyOjE4OjQ1IENFU1QgamUgSGFucyBWZXJr dWlsIG5hcGlzYWwoYSk6Cj4gT24gMTAvNy8xOSA5OjAxIFBNLCBKZXJuZWogxaBrcmFiZWMgd3Jv dGU6Cj4gPiBEbmUgcG9uZWRlbGplaywgMDcuIG9rdG9iZXIgMjAxOSBvYiAxMjo0NDoyNCBDRVNU IGplIEhhbnMgVmVya3VpbCAKbmFwaXNhbChhKToKPiA+PiBIaSBKZXJuZWosCj4gPj4gCj4gPj4g T24gOS8yOS8xOSAxMDowMCBQTSwgSmVybmVqIFNrcmFiZWMgd3JvdGU6Cj4gPj4+IFRoaXMgc2Vy aWVzIGFkZHMgc3VwcG9ydCBmb3IgZGVjb2RpbmcgbXVsdGktc2xpY2UgSDI2NCBmcmFtZXMgYWxv bmcgd2l0aAo+ID4+PiBzdXBwb3J0IGZvciBWNEwyX0RFQ19DTURfRkxVU0ggYW5kIFY0TDJfQlVG X0ZMQUdfTTJNX0hPTERfQ0FQVFVSRV9CVUYuCj4gPj4+IAo+ID4+PiBDb2RlIHdhcyB0ZXN0ZWQg YnkgbW9kaWZpZWQgZmZtcGVnLCB3aGljaCBjYW4gYmUgZm91bmQgaGVyZToKPiA+Pj4gaHR0cHM6 Ly9naXRodWIuY29tL2plcm5lanNrL0ZGbXBlZywgYnJhbmNoIG1haW5saW5lLXRlc3QKPiA+Pj4g SXQgaGFzIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCBhdCBsZWFzdCBmb2xsb3dpbmcgb3B0aW9uczoK PiA+Pj4gLS1lbmFibGUtdjRsMi1yZXF1ZXN0IC0tZW5hYmxlLWxpYnVkZXYgLS1lbmFibGUtbGli ZHJtCj4gPj4+IAo+ID4+PiBTYW1wbGVzIHVzZWQgZm9yIHRlc3Rpbmc6Cj4gPj4+IGh0dHA6Ly9q ZXJuZWoubGlicmVlbGVjLnR2L3ZpZGVvcy9oMjY0L0JBMV9GVF9DLm1wNAo+ID4+PiBodHRwOi8v amVybmVqLmxpYnJlZWxlYy50di92aWRlb3MvaDI2NC9oMjY0Lm1wNAo+ID4+PiAKPiA+Pj4gQ29t bWFuZCBsaW5lIHVzZWQgZm9yIHRlc3Rpbmc6Cj4gPj4+IGZmbXBlZyAtaHdhY2NlbCBkcm0gLWh3 YWNjZWxfZGV2aWNlIC9kZXYvZHJpL2NhcmQwIC1pIGgyNjQubXA0IC1waXhfZm10Cj4gPj4+IGJn cmEgLWYgZmJkZXYgL2Rldi9mYjAKPiA+Pj4gCj4gPj4+IFBsZWFzZSBub3RlIHRoYXQgVjRMMl9E RUNfQ01EX0ZMVVNIIHdhcyBub3QgdGVzdGVkIGJlY2F1c2UgSSdtCj4gPj4+IG5vdCBzdXJlIGhv dy4gZmZtcGVnIGZvbGxvd3MgZXhhY3RseSB3aGljaCBzbGljZSBpcyBsYXN0IGluIGZyYW1lCj4g Pj4+IGFuZCBzZXRzIGhvbGQgZmxhZyBhY2NvcmRpbmdseS4gSW1wcm9wZXIgdXNhZ2Ugb2YgaG9s ZCBmbGFnIHdvdWxkCj4gPj4+IGNvcnJ1cHQgZmZtcGVnIGFzc3VtcHRpb25zIGFuZCBpdCB3b3Vs ZCBwcm9iYWJseSBjcmFzaC4gQW55IGlkZWFzCj4gPj4+IGhvdyB0byB0ZXN0IHRoaXMgYXJlIHdl bGNvbWUhCj4gPj4+IAo+ID4+PiBUaGFua3MgdG8gSm9uYXMgZm9yIGFkanVzdGluZyBmZm1wZWcu Cj4gPj4+IAo+ID4+PiBQbGVhc2UgbGV0IG1lIGtub3cgd2hhdCB5b3UgdGhpbmsuCj4gPj4+IAo+ ID4+PiBCZXN0IHJlZ2FyZHMsCj4gPj4+IEplcm5lago+ID4+PiAKPiA+Pj4gQ2hhbmdlcyBmcm9t IHYxOgo+ID4+PiAtIGFkZGVkIFJiIHRhZ3MKPiA+Pj4gLSB1cGRhdGVkIFY0TDJfREVDX0NNRF9G TFVTSCBkb2N1bWVudGF0aW9uCj4gPj4+IC0gdXBkYXRlZCBmaXJzdCBzbGljZSBkZXRlY3Rpb24g aW4gQ2VkcnVzCj4gPj4+IC0gaG9sZCBjYXB0dXJlIGJ1ZmZlciBmbGFnIGlzIHNldCBhY2NvcmRp bmcgdG8gc291cmNlIGZvcm1hdAo+ID4+PiAtIGFkZGVkIHY0bCBtMm0gc3RhdGVsZXNzXyh0cnlf KWRlY29kZXJfY21kIGlvY3RsIGhlbHBlcnMKPiA+Pj4gCj4gPj4+IEhhbnMgVmVya3VpbCAoMik6 Cj4gPj4+ICAgdmIyOiBhZGQgVjRMMl9CVUZfRkxBR19NMk1fSE9MRF9DQVBUVVJFX0JVRgo+ID4+ PiAgIHZpZGVvZGV2Mi5oOiBhZGQgVjRMMl9ERUNfQ01EX0ZMVVNICj4gPj4+IAo+ID4+PiBKZXJu ZWogU2tyYWJlYyAoNCk6Cj4gPj4+ICAgbWVkaWE6IHY0bDItbWVtMm1lbTogYWRkIHN0YXRlbGVz c18odHJ5XylkZWNvZGVyX2NtZCBpb2N0bCBoZWxwZXJzCj4gPj4+ICAgbWVkaWE6IGNlZHJ1czog RGV0ZWN0IGZpcnN0IHNsaWNlIG9mIGEgZnJhbWUKPiA+Pj4gICBtZWRpYTogY2VkcnVzOiBoMjY0 OiBTdXBwb3J0IG11bHRpcGxlIHNsaWNlcyBwZXIgZnJhbWUKPiA+Pj4gICBtZWRpYTogY2VkcnVz OiBBZGQgc3VwcG9ydCBmb3IgaG9sZGluZyBjYXB0dXJlIGJ1ZmZlcgo+ID4+PiAgCj4gPj4+ICBE b2N1bWVudGF0aW9uL21lZGlhL3VhcGkvdjRsL2J1ZmZlci5yc3QgICAgICAgfCAxMyArKysrKysK PiA+Pj4gIC4uLi9tZWRpYS91YXBpL3Y0bC92aWRpb2MtZGVjb2Rlci1jbWQucnN0ICAgICB8IDEw ICsrKy0KPiA+Pj4gIC4uLi9tZWRpYS91YXBpL3Y0bC92aWRpb2MtcmVxYnVmcy5yc3QgICAgICAg ICB8ICA2ICsrKwo+ID4+PiAgLi4uL21lZGlhL3ZpZGVvZGV2Mi5oLnJzdC5leGNlcHRpb25zICAg ICAgICAgIHwgIDEgKwo+ID4+PiAgLi4uL21lZGlhL2NvbW1vbi92aWRlb2J1ZjIvdmlkZW9idWYy LXY0bDIuYyAgIHwgIDggKysrLQo+ID4+PiAgZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1t ZW0ybWVtLmMgICAgICAgIHwgMzUgKysrKysrKysrKysrKysKPiA+Pj4gIGRyaXZlcnMvc3RhZ2lu Zy9tZWRpYS9zdW54aS9jZWRydXMvY2VkcnVzLmggICB8ICAxICsKPiA+Pj4gIC4uLi9zdGFnaW5n L21lZGlhL3N1bnhpL2NlZHJ1cy9jZWRydXNfZGVjLmMgICB8IDExICsrKysrCj4gPj4+ICAuLi4v c3RhZ2luZy9tZWRpYS9zdW54aS9jZWRydXMvY2VkcnVzX2gyNjQuYyAgfCAxMSArKysrLQo+ID4+ PiAgLi4uL3N0YWdpbmcvbWVkaWEvc3VueGkvY2VkcnVzL2NlZHJ1c19ody5jICAgIHwgIDggKyst LQo+ID4+PiAgLi4uL3N0YWdpbmcvbWVkaWEvc3VueGkvY2VkcnVzL2NlZHJ1c192aWRlby5jIHwg MTQgKysrKysrCj4gPj4+ICBpbmNsdWRlL21lZGlhL3Y0bDItbWVtMm1lbS5oICAgICAgICAgICAg ICAgICAgfCA0NiArKysrKysrKysrKysrKysrKysrCj4gPj4+ICBpbmNsdWRlL21lZGlhL3ZpZGVv YnVmMi1jb3JlLmggICAgICAgICAgICAgICAgfCAgMyArKwo+ID4+PiAgaW5jbHVkZS9tZWRpYS92 aWRlb2J1ZjItdjRsMi5oICAgICAgICAgICAgICAgIHwgIDUgKysKPiA+Pj4gIGluY2x1ZGUvdWFw aS9saW51eC92aWRlb2RldjIuaCAgICAgICAgICAgICAgICB8IDE0ICsrKystLQo+ID4+PiAgMTUg ZmlsZXMgY2hhbmdlZCwgMTc1IGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9ucygtKQo+ID4+IAo+ ID4+IEkgZGlkbid0IHdhbnQgdG8gbWFrZSBhIHYzIG9mIHRoaXMgc2VyaWVzLCBpbnN0ZWFkIEkg aGFja2VkIHRoaXMgcGF0Y2gKPiA+PiB0aGF0Cj4gPj4gd2lsbCBob3BlZnVsbHkgZG8gYWxsIHRo ZSBsb2NraW5nIHJpZ2h0Lgo+ID4+IAo+ID4+IEJhc2ljYWxseSBJIG1vdmVkIGFsbCB0aGUgJ2hl bGQnIHJlbGF0ZWQgY29kZSBpbnRvIHY0bDItbWVtMm1lbSB1bmRlcgo+ID4+IGpvYl9zcGlubG9j ay4gVGhpcyBzaW1wbGlmaWVzIHRoZSBkcml2ZXIgY29kZSBhcyB3ZWxsLgo+ID4+IAo+ID4+IEJ1 dCB0aGlzIGlzIGEgaGFjayB0aGF0IHNpdHMgb24gdG9wIG9mIHRoaXMgc2VyaWVzLiBJZiB5b3Vy IGZmbXBlZyB0ZXN0cwo+ID4+IGFyZSBub3cgc3VjY2Vzc2Z1bCwgdGhlbiBJJ2xsIHR1cm4gdGhp cyBpbnRvIGEgcHJvcGVyIHNlcmllcyB3aXRoCj4gPj4gY29ycmVjdCBkb2N1bWVudGF0aW9uIChh IGxvdCBvZiB0aGUgY29tbWVudHMgYXJlIG5vdyB3cm9uZyB3aXRoIHRoaXMKPiA+PiBwYXRjaCwg c28ganVzdCBpZ25vcmUgdGhhdCkuCj4gPiAKPiA+IFRoYW5rcyBmb3IgbG9va2luZyBpbnRvIHRo aXMhIFdpdGggc21hbGwgZml4IG1lbnRpb25lZCBiZWxvdywgaXQgd29ya3MhCj4gPiBOb3RlIHRo YXQgYm90aCBzY2VuYXJpb3MgSSB0ZXN0ZWQgKGZsdXNoaW5nIGR1cmluZyBkZWNvZGluZyBhbmQg Zmx1c2hpbmcKPiA+IGFmdGVyIGRlY29kaW5nIGlzIGZpbmlzaGVkKSBhcmUgZm9jdXNlZCBvbiBj YXB0dXJlIHF1ZXVlLiBJbiBvcmRlciB0bwo+ID4gdHJpZ2dlciBvdXRwdXQgcXVldWUgZmx1c2gs IGZmbXBlZyB3b3VsZCBuZWVkIHRvIHF1ZXVlIG11bHRpcGxlIGpvYnMgYW5kCj4gPiBjYWxsIGZs dXNoIGJlZm9yZSB0aGV5IGFyZSBhbGwgcHJvY2Vzc2VkLiBUaGlzIGlzIG5vdCBzb21ldGhpbmcg SSBjYW4gZG8KPiA+IGF0IHRoaXMgdGltZS4gTWF5YmUgSm9uYXMgY2FuIGhlbHAgd2l0aCBtb2Rp ZnlpbmcgZmZtcGVnIGFwcHJvcHJpYXRlbHkuCj4gPiBIb3dldmVyLCBjb2RlIGZvciBjYXNlIHNl ZW1zIGNvcnJlY3QgdG8gbWUuCj4gPiAKPiA+PiBSZWdhcmRzLAo+ID4+IAo+ID4+IAlIYW5zCj4g Pj4gCj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItbWVtMm1l bS5jCj4gPj4gYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLW1lbTJtZW0uYyBpbmRleCAy Njc3YTA3ZTRjOWIuLmY4MWE4ZjI0NjVhYgo+ID4+IDEwMDY0NAo+ID4+IC0tLSBhL2RyaXZlcnMv bWVkaWEvdjRsMi1jb3JlL3Y0bDItbWVtMm1lbS5jCj4gPj4gKysrIGIvZHJpdmVycy9tZWRpYS92 NGwyLWNvcmUvdjRsMi1tZW0ybWVtLmMKPiA+PiBAQCAtNDEyLDI1ICs0MTIsMjQgQEAgc3RhdGlj IHZvaWQgdjRsMl9tMm1fY2FuY2VsX2pvYihzdHJ1Y3QgdjRsMl9tMm1fY3R4Cj4gPj4gKm0ybV9j dHgpIH0KPiA+PiAKPiA+PiAgfQo+ID4+IAo+ID4+IC12b2lkIHY0bDJfbTJtX2pvYl9maW5pc2go c3RydWN0IHY0bDJfbTJtX2RldiAqbTJtX2RldiwKPiA+PiAtCQkJIHN0cnVjdCB2NGwyX20ybV9j dHggKm0ybV9jdHgpCj4gPj4gK3N0YXRpYyBib29sIF92NGwyX20ybV9qb2JfZmluaXNoKHN0cnVj dCB2NGwyX20ybV9kZXYgKm0ybV9kZXYsCj4gPj4gKwkJCSAgc3RydWN0IHY0bDJfbTJtX2N0eCAq bTJtX2N0eCkKPiA+PiAKPiA+PiAgewo+ID4+IAo+ID4+IC0JdW5zaWduZWQgbG9uZyBmbGFnczsK PiA+PiAtCj4gPj4gLQlzcGluX2xvY2tfaXJxc2F2ZSgmbTJtX2Rldi0+am9iX3NwaW5sb2NrLCBm bGFncyk7Cj4gPj4gCj4gPj4gIAlpZiAoIW0ybV9kZXYtPmN1cnJfY3R4IHx8IG0ybV9kZXYtPmN1 cnJfY3R4ICE9IG0ybV9jdHgpIHsKPiA+PiAKPiA+PiAtCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZtMm1fZGV2LT5qb2Jfc3BpbmxvY2ssIGZsYWdzKTsKPiA+PiAKPiA+PiAgCQlkcHJpbnRrKCJD YWxsZWQgYnkgYW4gaW5zdGFuY2Ugbm90IGN1cnJlbnRseQo+ID4gCj4gPiBydW5uaW5nXG4iKTsK PiA+IAo+ID4+IC0JCXJldHVybjsKPiA+PiArCQlyZXR1cm4gZmFsc2U7Cj4gPj4gCj4gPj4gIAl9 Cj4gPj4gIAkKPiA+PiAgCWxpc3RfZGVsKCZtMm1fZGV2LT5jdXJyX2N0eC0+cXVldWUpOwo+ID4+ ICAJbTJtX2Rldi0+Y3Vycl9jdHgtPmpvYl9mbGFncyAmPSB+KFRSQU5TX1FVRVVFRCB8IFRSQU5T X1JVTk5JTkcpOwo+ID4+ICAJd2FrZV91cCgmbTJtX2Rldi0+Y3Vycl9jdHgtPmZpbmlzaGVkKTsK PiA+PiAgCW0ybV9kZXYtPmN1cnJfY3R4ID0gTlVMTDsKPiA+PiAKPiA+PiArCXJldHVybiB0cnVl Owo+ID4+ICt9Cj4gPj4gCj4gPj4gLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtMm1fZGV2LT5q b2Jfc3BpbmxvY2ssIGZsYWdzKTsKPiA+PiAtCj4gPj4gK3N0YXRpYyB2b2lkIHY0bDJfbTJtX2pv Yl9uZXh0KHN0cnVjdCB2NGwyX20ybV9kZXYgKm0ybV9kZXYsCj4gPj4gKwkJICAgICAgIHN0cnVj dCB2NGwyX20ybV9jdHggKm0ybV9jdHgpCj4gPj4gK3sKPiA+PiAKPiA+PiAgCS8qIFRoaXMgaW5z dGFuY2UgbWlnaHQgaGF2ZSBtb3JlIGJ1ZmZlcnMgcmVhZHksIGJ1dCBzaW5jZSB3ZSBkbyBub3QK PiA+PiAgCQo+ID4+ICAJICogYWxsb3cgbW9yZSB0aGFuIG9uZSBqb2Igb24gdGhlIGpvYl9xdWV1 ZSBwZXIgaW5zdGFuY2UsIGVhY2ggaGFzCj4gPj4gIAkgKiB0byBiZSBzY2hlZHVsZWQgc2VwYXJh dGVseSBhZnRlciB0aGUgcHJldmlvdXMgb25lIGZpbmlzaGVzLiAqLwo+ID4+IAo+ID4+IEBAIC00 NDEsOCArNDQwLDExMyBAQCB2b2lkIHY0bDJfbTJtX2pvYl9maW5pc2goc3RydWN0IHY0bDJfbTJt X2Rldgo+ID4+ICptMm1fZGV2LCAqLwo+ID4+IAo+ID4+ICAJc2NoZWR1bGVfd29yaygmbTJtX2Rl di0+am9iX3dvcmspOwo+ID4+ICAKPiA+PiAgfQo+ID4+IAo+ID4+ICsKPiA+PiArdm9pZCB2NGwy X20ybV9qb2JfZmluaXNoKHN0cnVjdCB2NGwyX20ybV9kZXYgKm0ybV9kZXYsCj4gPj4gKwkJCSBz dHJ1Y3QgdjRsMl9tMm1fY3R4ICptMm1fY3R4KQo+ID4+ICt7Cj4gPj4gKwl1bnNpZ25lZCBsb25n IGZsYWdzOwo+ID4+ICsKPiA+PiArCXNwaW5fbG9ja19pcnFzYXZlKCZtMm1fZGV2LT5qb2Jfc3Bp bmxvY2ssIGZsYWdzKTsKPiA+PiArCWlmICghX3Y0bDJfbTJtX2pvYl9maW5pc2gobTJtX2Rldiwg bTJtX2N0eCkpIHsKPiA+PiArCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtMm1fZGV2LT5qb2Jf c3BpbmxvY2ssIGZsYWdzKTsKPiA+PiArCQlyZXR1cm47Cj4gPj4gKwl9Cj4gPj4gKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZtMm1fZGV2LT5qb2Jfc3BpbmxvY2ssIGZsYWdzKTsKPiA+PiArCj4g Pj4gKwl2NGwyX20ybV9qb2JfbmV4dChtMm1fZGV2LCBtMm1fY3R4KTsKPiA+PiArfQo+ID4+IAo+ ID4+ICBFWFBPUlRfU1lNQk9MKHY0bDJfbTJtX2pvYl9maW5pc2gpOwo+ID4+IAo+ID4+ICt2b2lk IHY0bDJfbTJtX2pvYl9maW5pc2hfaGVsZChzdHJ1Y3QgdjRsMl9tMm1fZGV2ICptMm1fZGV2LAo+ ID4+ICsJCQkgc3RydWN0IHY0bDJfbTJtX2N0eCAqbTJtX2N0eCwKPiA+PiArCQkJIGVudW0gdmIy X2J1ZmZlcl9zdGF0ZSBzdGF0ZSkKPiA+PiArewo+ID4+ICsJc3RydWN0IHZiMl92NGwyX2J1ZmZl ciAqc3JjX2J1ZiwgKmRzdF9idWY7Cj4gPj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ID4+ICsK PiA+PiArCXNwaW5fbG9ja19pcnFzYXZlKCZtMm1fZGV2LT5qb2Jfc3BpbmxvY2ssIGZsYWdzKTsK PiA+PiArCXNyY19idWYgPSB2NGwyX20ybV9zcmNfYnVmX3JlbW92ZShtMm1fY3R4KTsKPiA+PiAr CWRzdF9idWYgPSB2NGwyX20ybV9uZXh0X2RzdF9idWYobTJtX2N0eCk7Cj4gPj4gKwo+ID4+ICsJ aWYgKCFzcmNfYnVmIHx8ICFkc3RfYnVmKSB7Cj4gPj4gKwkJcHJfZXJyKCJNaXNzaW5nIHNvdXJj ZSBhbmQvb3IgZGVzdGluYXRpb24gYnVmZmVyc1xuIik7Cj4gPj4gKwkJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmbTJtX2Rldi0+am9iX3NwaW5sb2NrLCBmbGFncyk7Cj4gPj4gKwkJcmV0dXJuOwo+ ID4+ICsJfQo+ID4+ICsJdjRsMl9tMm1fYnVmX2RvbmUoc3JjX2J1Ziwgc3RhdGUpOwo+ID4+ICsJ aWYgKCFkc3RfYnVmLT5pc19oZWxkKSB7Cj4gPj4gKwkJdjRsMl9tMm1fZHN0X2J1Zl9yZW1vdmUo bTJtX2N0eCk7Cj4gPj4gKwkJdjRsMl9tMm1fYnVmX2RvbmUoZHN0X2J1Ziwgc3RhdGUpOwo+ID4+ ICsJfQo+ID4+ICsJaWYgKCFfdjRsMl9tMm1fam9iX2ZpbmlzaChtMm1fZGV2LCBtMm1fY3R4KSkg ewo+ID4+ICsJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0ybV9kZXYtPmpvYl9zcGlubG9jaywg ZmxhZ3MpOwo+ID4+ICsJCXJldHVybjsKPiA+PiArCX0KPiA+PiArCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJm0ybV9kZXYtPmpvYl9zcGlubG9jaywgZmxhZ3MpOwo+ID4+ICsKPiA+PiArCXY0bDJf bTJtX2pvYl9uZXh0KG0ybV9kZXYsIG0ybV9jdHgpOwo+ID4+ICt9Cj4gPj4gK0VYUE9SVF9TWU1C T0wodjRsMl9tMm1fam9iX2ZpbmlzaF9oZWxkKTsKPiA+PiArCj4gPj4gKy8qKgo+ID4+ICsgKiB2 NGwyX20ybV9yZWxlYXNlX2NhcHR1cmVfYnVmKCkgLSBjaGVjayBpZiB0aGUgY2FwdHVyZSBidWZm ZXIgc2hvdWxkCj4gPj4gYmUKPiA+PiArICogcmVsZWFzZWQKPiA+PiArICoKPiA+PiArICogQG91 dF92YjogdGhlIG91dHB1dCBidWZmZXIKPiA+PiArICogQGNhcF92YjogdGhlIGNhcHR1cmUgYnVm ZmVyCj4gPj4gKyAqCj4gPj4gKyAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBp ZiB0aGUgY3VycmVudCBjYXB0dXJlIGJ1ZmZlcgo+ID4+IHNob3VsZAo+ID4+ICsgKiBiZSByZWxl YXNlZCB0byB2YjIuIFRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIG91dHB1dCBidWZmZXIgc3BlY2lm aWVkCj4gPj4gdGhhdCArICogdGhlIGNhcHR1cmUgYnVmZmVyIHNob3VsZCBiZSBoZWxkIChpLmUu IG5vdCByZXR1cm5lZCB0byB2YjIpCj4gPj4gQU5EIGlmIHRoZSArICogdGltZXN0YW1wIG9mIHRo ZSBjYXB0dXJlIGJ1ZmZlciBkaWZmZXJzIGZyb20gdGhlIG91dHB1dAo+ID4+IGJ1ZmZlciB0aW1l c3RhbXAuICsgKgo+ID4+ICsgKiBUaGlzIGhlbHBlciBpcyB0byBiZSBjYWxsZWQgYXQgdGhlIHN0 YXJ0IG9mIHRoZSBkZXZpY2VfcnVuIGNhbGxiYWNrOgo+ID4+ICsgKgo+ID4+ICsgKiAuLiBjb2Rl LWJsb2NrOjogYwo+ID4+ICsgKgo+ID4+ICsgKglpZiAodjRsMl9tMm1fcmVsZWFzZV9jYXB0dXJl X2J1ZihvdXRfdmIsIGNhcF92YikpIHsKPiA+PiArICoJCXY0bDJfbTJtX2RzdF9idWZfcmVtb3Zl KG0ybV9jdHgpOwo+ID4+ICsgKgkJdjRsMl9tMm1fYnVmX2RvbmUoY2FwX3ZiLCBWQjJfQlVGX1NU QVRFX0RPTkUpOwo+ID4+ICsgKgkJY2FwX3ZiID0gdjRsMl9tMm1fbmV4dF9kc3RfYnVmKG0ybV9j dHgpOwo+ID4+ICsgKgl9Cj4gPj4gKyAqCWNhcF92Yi0+aXNfaGVsZCA9IG91dF92Yi0+ZmxhZ3Mg Jgo+ID4gCj4gPiBWNEwyX0JVRl9GTEFHX00yTV9IT0xEX0NBUFRVUkVfQlVGOwo+ID4gCj4gPj4g KyAqCj4gPj4gKyAqCS4uLgo+ID4+ICsgKgo+ID4+ICsgKgl2NGwyX20ybV9idWZfZG9uZShvdXRf dmIsIFZCMl9CVUZfU1RBVEVfRE9ORSk7Cj4gPj4gKyAqCWlmICghY2FwX3ZiLT5pc19oZWxkKSB7 Cj4gPj4gKyAqCQl2NGwyX20ybV9kc3RfYnVmX3JlbW92ZShtMm1fY3R4KTsKPiA+PiArICoJCXY0 bDJfbTJtX2J1Zl9kb25lKGNhcF92YiwgVkIyX0JVRl9TVEFURV9ET05FKTsKPiA+PiArICoJfQo+ ID4+ICsgKgo+ID4+ICsgKiBUaGlzIGFsbG93cyBmb3IgbXVsdGlwbGUgb3V0cHV0IGJ1ZmZlcnMg dG8gYmUgdXNlZCB0byBmaWxsIGluIGEKPiA+PiBzaW5nbGUKPiA+PiArICogY2FwdHVyZSBidWZm ZXIuIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgYnkgc3RhdGVsZXNzIGRlY29kZXJzIHdoZXJlCj4g Pj4gKyAqIG11bHRpcGxlIGUuZy4gSC4yNjQgc2xpY2VzIGNvbnRyaWJ1dGUgdG8gYSBzaW5nbGUg ZGVjb2RlZCBmcmFtZS4KPiA+PiArICovCj4gPj4gK3N0cnVjdCB2YjJfdjRsMl9idWZmZXIgKnY0 bDJfbTJtX3JlbGVhc2VfY2FwdHVyZV9idWYoc3RydWN0IHY0bDJfbTJtX2N0eAo+ID4+ICptMm1f Y3R4KSArewo+ID4+ICsJc3RydWN0IHY0bDJfbTJtX2RldiAqbTJtX2RldiA9IG0ybV9jdHgtPm0y bV9kZXY7Cj4gPj4gKwlzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICpzcmMsICpkc3Q7Cj4gPj4gKwl1 bnNpZ25lZCBsb25nIGZsYWdzOwo+ID4+ICsKPiA+PiArCXNwaW5fbG9ja19pcnFzYXZlKCZtMm1f ZGV2LT5qb2Jfc3BpbmxvY2ssIGZsYWdzKTsKPiA+PiArCXNyYyA9IHY0bDJfbTJtX25leHRfc3Jj X2J1ZihtMm1fY3R4KTsKPiA+PiArCWRzdCA9IHY0bDJfbTJtX25leHRfZHN0X2J1ZihtMm1fY3R4 KTsKPiA+PiArCj4gPj4gKwlpZiAoZHN0LT5pc19oZWxkICYmIGRzdC0+dmIyX2J1Zi5jb3BpZWRf dGltZXN0YW1wICYmCj4gPj4gKwkgICAgc3JjLT52YjJfYnVmLnRpbWVzdGFtcCAhPSBkc3QtPnZi Ml9idWYudGltZXN0YW1wKSB7Cj4gPj4gKwkJZHN0LT5pc19oZWxkID0gZmFsc2U7Cj4gPj4gKwkJ djRsMl9tMm1fZHN0X2J1Zl9yZW1vdmUobTJtX2N0eCk7Cj4gPj4gKwkJdjRsMl9tMm1fYnVmX2Rv bmUoZHN0LCBWQjJfQlVGX1NUQVRFX0RPTkUpOwo+ID4+ICsJCWRzdCA9IHY0bDJfbTJtX25leHRf ZHN0X2J1ZihtMm1fY3R4KTsKPiA+PiArCX0KPiA+PiArCWRzdC0+aXNfaGVsZCA9IHNyYy0+Zmxh Z3MgJiBWNEwyX0JVRl9GTEFHX00yTV9IT0xEX0NBUFRVUkVfQlVGOwo+ID4+ICsJc3JjLT5mbGFn cyAmPSB+VjRMMl9CVUZfRkxBR19NMk1fSE9MRF9DQVBUVVJFX0JVRjsKPiA+PiArCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJm0ybV9kZXYtPmpvYl9zcGlubG9jaywgZmxhZ3MpOwo+ID4+ICsJcmV0 dXJuIGRzdDsKPiA+PiArfQo+ID4+ICtFWFBPUlRfU1lNQk9MKHY0bDJfbTJtX3JlbGVhc2VfY2Fw dHVyZV9idWYpOwo+ID4+ICsKPiA+PiAKPiA+PiAgaW50IHY0bDJfbTJtX3JlcWJ1ZnMoc3RydWN0 IGZpbGUgKmZpbGUsIHN0cnVjdCB2NGwyX20ybV9jdHggKm0ybV9jdHgsCj4gPj4gIAo+ID4+ICAJ CSAgICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcWJ1ZnMpCj4gPj4gIAo+ID4+ICB7 Cj4gPj4gCj4gPj4gQEAgLTExNzEsMTkgKzEyNzUsMjggQEAgaW50IHY0bDJfbTJtX2lvY3RsX3N0 YXRlbGVzc19kZWNvZGVyX2NtZChzdHJ1Y3QKPiA+PiBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB7 Cj4gPj4gCj4gPj4gIAlzdHJ1Y3QgdjRsMl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Cj4g Pj4gIAlzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICpvdXRfdmIsICpjYXBfdmI7Cj4gPj4gCj4gPj4g KwlzdHJ1Y3QgdjRsMl9tMm1fZGV2ICptMm1fZGV2ID0gZmgtPm0ybV9jdHgtPm0ybV9kZXY7Cj4g Pj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ID4+IAo+ID4+ICAJaW50IHJldDsKPiA+PiAgCQo+ ID4+ICAJcmV0ID0gdjRsMl9tMm1faW9jdGxfc3RhdGVsZXNzX3RyeV9kZWNvZGVyX2NtZChmaWxl LCBwcml2LCBkYyk7Cj4gPj4gIAlpZiAocmV0IDwgMCkKPiA+PiAgCQo+ID4+ICAJCXJldHVybiBy ZXQ7Cj4gPj4gCj4gPj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTJtX2Rldi0+am9iX3NwaW5sb2Nr LCBmbGFncyk7Cj4gPj4gCj4gPj4gIAlvdXRfdmIgPSB2NGwyX20ybV9sYXN0X3NyY19idWYoZmgt Pm0ybV9jdHgpOwo+ID4+ICAJY2FwX3ZiID0gdjRsMl9tMm1fbGFzdF9kc3RfYnVmKGZoLT5tMm1f Y3R4KTsKPiA+PiAKPiA+PiAtCWlmIChvdXRfdmIpCj4gPj4gKwlpZiAob3V0X3ZiICYmIChvdXRf dmItPmZsYWdzICYgVjRMMl9CVUZfRkxBR19NMk1fSE9MRF9DQVBUVVJFX0JVRikpCj4gPiAKPiA+ IHsKPiA+IAo+ID4+ICAJCW91dF92Yi0+ZmxhZ3MgJj0gflY0TDJfQlVGX0ZMQUdfTTJNX0hPTERf Q0FQVFVSRV9CVUY7Cj4gPj4gCj4gPj4gLQllbHNlIGlmIChjYXBfdmIgJiYgY2FwX3ZiLT5pc19o ZWxkKQo+ID4+IC0JCXY0bDJfbTJtX2J1Zl9kb25lKGNhcF92YiwgVkIyX0JVRl9TVEFURV9ET05F KTsKPiA+PiArCX0gZWxzZSBpZiAoY2FwX3ZiICYmIGNhcF92Yi0+aXNfaGVsZCkgewo+ID4+ICsJ CWNhcF92Yi0+aXNfaGVsZCA9IGZhbHNlOwo+ID4+ICsJCWlmIChtMm1fZGV2LT5jdXJyX2N0eCkg ewo+ID4gCj4gPiBBYm92ZSBjb25kaXRpb24gc2hvdWxkIGJlIG5lZ2F0ZWQuCj4gCj4gQ2xvc2Uu IEl0IHNob3VsZCBjaGVjayB0aGF0IHRoaXMgYnVmZmVyIGlzbid0IGN1cnJlbnRseSBiZWluZyBw cm9jZXNzZWQuCj4gU286Cj4gCj4gCQlpZiAobTJtX2Rldi0+Y3Vycl9jdHggIT0gZmgtPm0ybV9j dHgpIHsKPiAKPiBDYW4geW91IHRlc3Qgd2l0aCB0aGlzIGNoYW5nZT8gSWYgdGhpcyB3b3Jrcywg dGhlbiBJJ2xsIHBvc3QgYSBwcm9wZXIKPiBzZXJpZXMgZm9yIHRoaXMuCgpJIGNvbmZpcm0gdGhh dCBpdCB3b3Jrcy4KCkJlc3QgcmVnYXJkcywKSmVybmVqCgo+IAo+IFRoYW5rcyEKPiAKPiAJSGFu cwo+IAo+ID4gQmVzdCByZWdhcmRzLAo+ID4gSmVybmVqCj4gPiAKPiA+PiArCQkJdjRsMl9tMm1f ZHN0X2J1Zl9yZW1vdmUoZmgtPm0ybV9jdHgpOwo+ID4+ICsJCQl2NGwyX20ybV9idWZfZG9uZShj YXBfdmIsCj4gPiAKPiA+IFZCMl9CVUZfU1RBVEVfRE9ORSk7Cj4gPiAKPiA+PiArCQl9Cj4gPj4g Kwl9Cj4gPj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtMm1fZGV2LT5qb2Jfc3BpbmxvY2ss IGZsYWdzKTsKPiA+PiAKPiA+PiAgCXJldHVybiAwOwo+ID4+ICAKPiA+PiAgfQo+ID4+IAo+ID4+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc3VueGkvY2VkcnVzL2NlZHJ1c19k ZWMuYwo+ID4+IGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3N1bnhpL2NlZHJ1cy9jZWRydXNfZGVj LmMgaW5kZXgKPiA+PiA2N2Y3ZDQzMjZmYzEuLjRlMzBmMjYzYjQyNyAxMDA2NDQKPiA+PiAtLS0g YS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc3VueGkvY2VkcnVzL2NlZHJ1c19kZWMuYwo+ID4+ICsr KyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zdW54aS9jZWRydXMvY2VkcnVzX2RlYy5jCj4gPj4g QEAgLTMwLDE0ICszMCw3IEBAIHZvaWQgY2VkcnVzX2RldmljZV9ydW4odm9pZCAqcHJpdikKPiA+ PiAKPiA+PiAgCXN0cnVjdCBtZWRpYV9yZXF1ZXN0ICpzcmNfcmVxOwo+ID4+ICAJCj4gPj4gIAly dW4uc3JjID0gdjRsMl9tMm1fbmV4dF9zcmNfYnVmKGN0eC0+ZmgubTJtX2N0eCk7Cj4gPj4gCj4g Pj4gLQlydW4uZHN0ID0gdjRsMl9tMm1fbmV4dF9kc3RfYnVmKGN0eC0+ZmgubTJtX2N0eCk7Cj4g Pj4gLQo+ID4+IC0JaWYgKHY0bDJfbTJtX3JlbGVhc2VfY2FwdHVyZV9idWYocnVuLnNyYywgcnVu LmRzdCkpIHsKPiA+PiAtCQl2NGwyX20ybV9kc3RfYnVmX3JlbW92ZShjdHgtPmZoLm0ybV9jdHgp Owo+ID4+IC0JCXY0bDJfbTJtX2J1Zl9kb25lKHJ1bi5kc3QsIFZCMl9CVUZfU1RBVEVfRE9ORSk7 Cj4gPj4gLQkJcnVuLmRzdCA9IHY0bDJfbTJtX25leHRfZHN0X2J1ZihjdHgtPmZoLm0ybV9jdHgp Owo+ID4+IC0JfQo+ID4+IC0JcnVuLmRzdC0+aXNfaGVsZCA9IHJ1bi5zcmMtPmZsYWdzICYKPiA+ IAo+ID4gVjRMMl9CVUZfRkxBR19NMk1fSE9MRF9DQVBUVVJFX0JVRjsKPiA+IAo+ID4+ICsJcnVu LmRzdCA9IHY0bDJfbTJtX3JlbGVhc2VfY2FwdHVyZV9idWYoY3R4LT5maC5tMm1fY3R4KTsKPiA+ PiAKPiA+PiAgCXJ1bi5maXJzdF9zbGljZSA9ICFydW4uZHN0LT52YjJfYnVmLmNvcGllZF90aW1l c3RhbXAgfHwKPiA+PiAgCQo+ID4+ICAJCXJ1bi5zcmMtPnZiMl9idWYudGltZXN0YW1wICE9IHJ1 bi5kc3QtCj4gPj4gCj4gPj4gdmIyX2J1Zi50aW1lc3RhbXA7Cj4gPj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvc3RhZ2luZy9tZWRpYS9zdW54aS9jZWRydXMvY2VkcnVzX2h3LmMKPiA+PiBiL2RyaXZl cnMvc3RhZ2luZy9tZWRpYS9zdW54aS9jZWRydXMvY2VkcnVzX2h3LmMgaW5kZXgKPiA+PiA5OWZl ZGVjODAyMjQuLjI0MmNhZDgyY2M4YyAxMDA2NDQKPiA+PiAtLS0gYS9kcml2ZXJzL3N0YWdpbmcv bWVkaWEvc3VueGkvY2VkcnVzL2NlZHJ1c19ody5jCj4gPj4gKysrIGIvZHJpdmVycy9zdGFnaW5n L21lZGlhL3N1bnhpL2NlZHJ1cy9jZWRydXNfaHcuYwo+ID4+IEBAIC0xMDMsNyArMTAzLDYgQEAg c3RhdGljIGlycXJldHVybl90IGNlZHJ1c19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+PiAK PiA+PiAgewo+ID4+ICAKPiA+PiAgCXN0cnVjdCBjZWRydXNfZGV2ICpkZXYgPSBkYXRhOwo+ID4+ ICAJc3RydWN0IGNlZHJ1c19jdHggKmN0eDsKPiA+PiAKPiA+PiAtCXN0cnVjdCB2YjJfdjRsMl9i dWZmZXIgKnNyY19idWYsICpkc3RfYnVmOwo+ID4+IAo+ID4+ICAJZW51bSB2YjJfYnVmZmVyX3N0 YXRlIHN0YXRlOwo+ID4+ICAJZW51bSBjZWRydXNfaXJxX3N0YXR1cyBzdGF0dXM7Cj4gPj4gCj4g Pj4gQEAgLTEyMSwyNiArMTIwLDEyIEBAIHN0YXRpYyBpcnFyZXR1cm5fdCBjZWRydXNfaXJxKGlu dCBpcnEsIHZvaWQgKmRhdGEpCj4gPj4gCj4gPj4gIAlkZXYtPmRlY19vcHNbY3R4LT5jdXJyZW50 X2NvZGVjXS0+aXJxX2Rpc2FibGUoY3R4KTsKPiA+PiAgCWRldi0+ZGVjX29wc1tjdHgtPmN1cnJl bnRfY29kZWNdLT5pcnFfY2xlYXIoY3R4KTsKPiA+PiAKPiA+PiAtCXNyY19idWYgPSB2NGwyX20y bV9zcmNfYnVmX3JlbW92ZShjdHgtPmZoLm0ybV9jdHgpOwo+ID4+IC0JZHN0X2J1ZiA9IHY0bDJf bTJtX25leHRfZHN0X2J1ZihjdHgtPmZoLm0ybV9jdHgpOwo+ID4+IC0KPiA+PiAtCWlmICghc3Jj X2J1ZiB8fCAhZHN0X2J1Zikgewo+ID4+IC0JCXY0bDJfZXJyKCZkZXYtPnY0bDJfZGV2LAo+ID4+ IC0JCQkgIk1pc3Npbmcgc291cmNlIGFuZC9vciBkZXN0aW5hdGlvbgo+ID4gCj4gPiBidWZmZXJz XG4iKTsKPiA+IAo+ID4+IC0JCXJldHVybiBJUlFfSEFORExFRDsKPiA+PiAtCX0KPiA+PiAtCj4g Pj4gCj4gPj4gIAlpZiAoc3RhdHVzID09IENFRFJVU19JUlFfRVJST1IpCj4gPj4gIAkKPiA+PiAg CQlzdGF0ZSA9IFZCMl9CVUZfU1RBVEVfRVJST1I7Cj4gPj4gIAkKPiA+PiAgCWVsc2UKPiA+PiAg CQo+ID4+ICAJCXN0YXRlID0gVkIyX0JVRl9TVEFURV9ET05FOwo+ID4+IAo+ID4+IC0JdjRsMl9t Mm1fYnVmX2RvbmUoc3JjX2J1Ziwgc3RhdGUpOwo+ID4+IC0JaWYgKCFkc3RfYnVmLT5pc19oZWxk KSB7Cj4gPj4gLQkJdjRsMl9tMm1fZHN0X2J1Zl9yZW1vdmUoY3R4LT5maC5tMm1fY3R4KTsKPiA+ PiAtCQl2NGwyX20ybV9idWZfZG9uZShkc3RfYnVmLCBzdGF0ZSk7Cj4gPj4gLQl9Cj4gPj4gLQl2 NGwyX20ybV9qb2JfZmluaXNoKGN0eC0+ZGV2LT5tMm1fZGV2LCBjdHgtPmZoLm0ybV9jdHgpOwo+ ID4+ICsJdjRsMl9tMm1fam9iX2ZpbmlzaF9oZWxkKGN0eC0+ZGV2LT5tMm1fZGV2LCBjdHgtPmZo Lm0ybV9jdHgsIApzdGF0ZSk7Cj4gPj4gCj4gPj4gIAlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gPj4g IAo+ID4+ICB9Cj4gPj4gCj4gPj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1tZW0y bWVtLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItbWVtMm1lbS5oCj4gPj4gaW5kZXggOGFlMmY1NmM3 ZmEzLi40OGNhN2QzZWFhM2QgMTAwNjQ0Cj4gPj4gLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLW1l bTJtZW0uaAo+ID4+ICsrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1tZW0ybWVtLmgKPiA+PiBAQCAt MTczLDYgKzE3MywxMCBAQCB2b2lkIHY0bDJfbTJtX3RyeV9zY2hlZHVsZShzdHJ1Y3QgdjRsMl9t Mm1fY3R4Cj4gPj4gKm0ybV9jdHgpOyB2b2lkIHY0bDJfbTJtX2pvYl9maW5pc2goc3RydWN0IHY0 bDJfbTJtX2RldiAqbTJtX2RldiwKPiA+PiAKPiA+PiAgCQkJIHN0cnVjdCB2NGwyX20ybV9jdHgg Km0ybV9jdHgpOwo+ID4+IAo+ID4+ICt2b2lkIHY0bDJfbTJtX2pvYl9maW5pc2hfaGVsZChzdHJ1 Y3QgdjRsMl9tMm1fZGV2ICptMm1fZGV2LAo+ID4+ICsJCQkgc3RydWN0IHY0bDJfbTJtX2N0eCAq bTJtX2N0eCwKPiA+PiArCQkJIGVudW0gdmIyX2J1ZmZlcl9zdGF0ZSBzdGF0ZSk7Cj4gPj4gKwo+ ID4+IAo+ID4+ICBzdGF0aWMgaW5saW5lIHZvaWQKPiA+PiAgdjRsMl9tMm1fYnVmX2RvbmUoc3Ry dWN0IHZiMl92NGwyX2J1ZmZlciAqYnVmLCBlbnVtIHZiMl9idWZmZXJfc3RhdGUKPiA+PiAgc3Rh dGUpCj4gPj4gCj4gPj4gewo+ID4+IEBAIC02NDQsNDcgKzY0OCw3IEBAIHZvaWQgdjRsMl9tMm1f YnVmX2NvcHlfbWV0YWRhdGEoY29uc3Qgc3RydWN0Cj4gPj4gdmIyX3Y0bDJfYnVmZmVyICpvdXRf dmIsIHN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKmNhcF92YiwKPiA+PiAKPiA+PiAgCQkJCWJvb2wg Y29weV9mcmFtZV9mbGFncyk7Cj4gPj4gCj4gPj4gLS8qKgo+ID4+IC0gKiB2NGwyX20ybV9yZWxl YXNlX2NhcHR1cmVfYnVmKCkgLSBjaGVjayBpZiB0aGUgY2FwdHVyZSBidWZmZXIgc2hvdWxkCj4g Pj4gYmUKPiA+PiAtICogcmVsZWFzZWQKPiA+PiAtICoKPiA+PiAtICogQG91dF92YjogdGhlIG91 dHB1dCBidWZmZXIKPiA+PiAtICogQGNhcF92YjogdGhlIGNhcHR1cmUgYnVmZmVyCj4gPj4gLSAq Cj4gPj4gLSAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVu dCBjYXB0dXJlIGJ1ZmZlcgo+ID4+IHNob3VsZAo+ID4+IC0gKiBiZSByZWxlYXNlZCB0byB2YjIu IFRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIG91dHB1dCBidWZmZXIgc3BlY2lmaWVkCj4gPj4gdGhh dCAtICogdGhlIGNhcHR1cmUgYnVmZmVyIHNob3VsZCBiZSBoZWxkIChpLmUuIG5vdCByZXR1cm5l ZCB0byB2YjIpCj4gPj4gQU5EIGlmIHRoZSAtICogdGltZXN0YW1wIG9mIHRoZSBjYXB0dXJlIGJ1 ZmZlciBkaWZmZXJzIGZyb20gdGhlIG91dHB1dAo+ID4+IGJ1ZmZlciB0aW1lc3RhbXAuIC0gKgo+ ID4+IC0gKiBUaGlzIGhlbHBlciBpcyB0byBiZSBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBk ZXZpY2VfcnVuIGNhbGxiYWNrOgo+ID4+IC0gKgo+ID4+IC0gKiAuLiBjb2RlLWJsb2NrOjogYwo+ ID4+IC0gKgo+ID4+IC0gKglpZiAodjRsMl9tMm1fcmVsZWFzZV9jYXB0dXJlX2J1ZihvdXRfdmIs IGNhcF92YikpIHsKPiA+PiAtICoJCXY0bDJfbTJtX2RzdF9idWZfcmVtb3ZlKG0ybV9jdHgpOwo+ ID4+IC0gKgkJdjRsMl9tMm1fYnVmX2RvbmUoY2FwX3ZiLCBWQjJfQlVGX1NUQVRFX0RPTkUpOwo+ ID4+IC0gKgkJY2FwX3ZiID0gdjRsMl9tMm1fbmV4dF9kc3RfYnVmKG0ybV9jdHgpOwo+ID4+IC0g Kgl9Cj4gPj4gLSAqCWNhcF92Yi0+aXNfaGVsZCA9IG91dF92Yi0+ZmxhZ3MgJgo+ID4gCj4gPiBW NEwyX0JVRl9GTEFHX00yTV9IT0xEX0NBUFRVUkVfQlVGOwo+ID4gCj4gPj4gLSAqCj4gPj4gLSAq CS4uLgo+ID4+IC0gKgo+ID4+IC0gKgl2NGwyX20ybV9idWZfZG9uZShvdXRfdmIsIFZCMl9CVUZf U1RBVEVfRE9ORSk7Cj4gPj4gLSAqCWlmICghY2FwX3ZiLT5pc19oZWxkKSB7Cj4gPj4gLSAqCQl2 NGwyX20ybV9kc3RfYnVmX3JlbW92ZShtMm1fY3R4KTsKPiA+PiAtICoJCXY0bDJfbTJtX2J1Zl9k b25lKGNhcF92YiwgVkIyX0JVRl9TVEFURV9ET05FKTsKPiA+PiAtICoJfQo+ID4+IC0gKgo+ID4+ IC0gKiBUaGlzIGFsbG93cyBmb3IgbXVsdGlwbGUgb3V0cHV0IGJ1ZmZlcnMgdG8gYmUgdXNlZCB0 byBmaWxsIGluIGEKPiA+PiBzaW5nbGUKPiA+PiAtICogY2FwdHVyZSBidWZmZXIuIFRoaXMgaXMg dHlwaWNhbGx5IHVzZWQgYnkgc3RhdGVsZXNzIGRlY29kZXJzIHdoZXJlCj4gPj4gLSAqIG11bHRp cGxlIGUuZy4gSC4yNjQgc2xpY2VzIGNvbnRyaWJ1dGUgdG8gYSBzaW5nbGUgZGVjb2RlZCBmcmFt ZS4KPiA+PiAtICovCj4gPj4gLXN0YXRpYyBpbmxpbmUgYm9vbCB2NGwyX20ybV9yZWxlYXNlX2Nh cHR1cmVfYnVmKGNvbnN0IHN0cnVjdAo+ID4+IHZiMl92NGwyX2J1ZmZlciAqb3V0X3ZiLCAtCj4g Pj4gCj4gPiAJY29uc3Qgc3RydWN0IHZiMl92NGwyX2J1ZmZlciAqY2FwX3ZiKQo+ID4gCQo+ID4+ IC17Cj4gPj4gLQlyZXR1cm4gY2FwX3ZiLT5pc19oZWxkICYmIGNhcF92Yi0+dmIyX2J1Zi5jb3Bp ZWRfdGltZXN0YW1wICYmCj4gPj4gLQkgICAgICAgb3V0X3ZiLT52YjJfYnVmLnRpbWVzdGFtcCAh PSBjYXBfdmItPnZiMl9idWYudGltZXN0YW1wOwo+ID4+IC19Cj4gPj4gK3N0cnVjdCB2YjJfdjRs Ml9idWZmZXIgKnY0bDJfbTJtX3JlbGVhc2VfY2FwdHVyZV9idWYoc3RydWN0IHY0bDJfbTJtX2N0 eAo+ID4+ICptMm1fY3R4KTsKPiA+PiAKPiA+PiAgLyogdjRsMiByZXF1ZXN0IGhlbHBlciAqLwoK CgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4 LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFy bS1rZXJuZWwK