From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from perceval.ideasonboard.com ([213.167.242.64]:53142 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759194AbeD1RZ3 (ORCPT ); Sat, 28 Apr 2018 13:25:29 -0400 From: Laurent Pinchart To: Kieran Bingham Cc: Laurent Pinchart , linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-renesas-soc@vger.kernel.org Subject: Re: [PATCH v2 2/8] v4l: vsp1: Share the CLU, LIF and LUT set_fmt pad operation code Date: Sat, 28 Apr 2018 20:25:44 +0300 Message-ID: <13638427.AR7oG9JFQr@avalon> In-Reply-To: <9839f231-f91c-ab54-fdba-f100a98a558d@ideasonboard.com> References: <20180422223430.16407-1-laurent.pinchart+renesas@ideasonboard.com> <20180422223430.16407-3-laurent.pinchart+renesas@ideasonboard.com> <9839f231-f91c-ab54-fdba-f100a98a558d@ideasonboard.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-media-owner@vger.kernel.org List-ID: Hi Kieran, On Saturday, 28 April 2018 20:16:11 EEST Kieran Bingham wrote: > On 22/04/18 23:34, Laurent Pinchart wrote: > > The implementation of the set_fmt pad operation is identical in the > > three modules. Move it to a generic helper function. > > > > Signed-off-by: Laurent Pinchart > > > > Only a minor pair of comments below regarding source/sink pad descriptions. > > If it's not convenient/accurate to define these with an enum then don't > worry about it. It's a good point. There are however other locations in vsp1_entity.c that hardcode pad numbers, so I'll submit a patch on top of this series to fix them all in one go. > Otherwise, > > Reviewed-by: Kieran Bingham > > > --- > > > > drivers/media/platform/vsp1/vsp1_clu.c | 65 +++++------------------- > > drivers/media/platform/vsp1/vsp1_entity.c | 75 ++++++++++++++++++++++++++ > > drivers/media/platform/vsp1/vsp1_entity.h | 6 +++ > > drivers/media/platform/vsp1/vsp1_lif.c | 65 +++++-------------------- > > drivers/media/platform/vsp1/vsp1_lut.c | 65 +++++-------------------- > > 5 files changed, 116 insertions(+), 160 deletions(-) > > That's a nice diffstat :-) > > > diff --git a/drivers/media/platform/vsp1/vsp1_clu.c > > b/drivers/media/platform/vsp1/vsp1_clu.c index 9626b6308585..96a448e1504c > > 100644 > > --- a/drivers/media/platform/vsp1/vsp1_clu.c > > +++ b/drivers/media/platform/vsp1/vsp1_clu.c > > @@ -114,18 +114,18 @@ static const struct v4l2_ctrl_config > > clu_mode_control = {> > > * V4L2 Subdevice Pad Operations > > */ > > > > +static const unsigned int clu_codes[] = { > > + MEDIA_BUS_FMT_ARGB8888_1X32, > > + MEDIA_BUS_FMT_AHSV8888_1X32, > > + MEDIA_BUS_FMT_AYUV8_1X32, > > +}; > > + > > > > static int clu_enum_mbus_code(struct v4l2_subdev *subdev, > > > > struct v4l2_subdev_pad_config *cfg, > > struct v4l2_subdev_mbus_code_enum *code) > > > > { > > > > - static const unsigned int codes[] = { > > - MEDIA_BUS_FMT_ARGB8888_1X32, > > - MEDIA_BUS_FMT_AHSV8888_1X32, > > - MEDIA_BUS_FMT_AYUV8_1X32, > > - }; > > - > > - return vsp1_subdev_enum_mbus_code(subdev, cfg, code, codes, > > - ARRAY_SIZE(codes)); > > + return vsp1_subdev_enum_mbus_code(subdev, cfg, code, clu_codes, > > + ARRAY_SIZE(clu_codes)); > > > > } > > > > static int clu_enum_frame_size(struct v4l2_subdev *subdev, > > > > @@ -141,51 +141,10 @@ static int clu_set_format(struct v4l2_subdev > > *subdev, > > > > struct v4l2_subdev_pad_config *cfg, > > struct v4l2_subdev_format *fmt) > > > > { > > > > - struct vsp1_clu *clu = to_clu(subdev); > > - struct v4l2_subdev_pad_config *config; > > - struct v4l2_mbus_framefmt *format; > > - int ret = 0; > > - > > - mutex_lock(&clu->entity.lock); > > - > > - config = vsp1_entity_get_pad_config(&clu->entity, cfg, fmt->which); > > - if (!config) { > > - ret = -EINVAL; > > - goto done; > > - } > > - > > - /* Default to YUV if the requested format is not supported. */ > > - if (fmt->format.code != MEDIA_BUS_FMT_ARGB8888_1X32 && > > - fmt->format.code != MEDIA_BUS_FMT_AHSV8888_1X32 && > > - fmt->format.code != MEDIA_BUS_FMT_AYUV8_1X32) > > - fmt->format.code = MEDIA_BUS_FMT_AYUV8_1X32; > > - > > - format = vsp1_entity_get_pad_format(&clu->entity, config, fmt->pad); > > - > > - if (fmt->pad == CLU_PAD_SOURCE) { > > - /* The CLU output format can't be modified. */ > > - fmt->format = *format; > > - goto done; > > - } > > - > > - format->code = fmt->format.code; > > - format->width = clamp_t(unsigned int, fmt->format.width, > > - CLU_MIN_SIZE, CLU_MAX_SIZE); > > - format->height = clamp_t(unsigned int, fmt->format.height, > > - CLU_MIN_SIZE, CLU_MAX_SIZE); > > - format->field = V4L2_FIELD_NONE; > > - format->colorspace = V4L2_COLORSPACE_SRGB; > > - > > - fmt->format = *format; > > - > > - /* Propagate the format to the source pad. */ > > - format = vsp1_entity_get_pad_format(&clu->entity, config, > > - CLU_PAD_SOURCE); > > - *format = fmt->format; > > - > > -done: > > - mutex_unlock(&clu->entity.lock); > > - return ret; > > + return vsp1_subdev_set_pad_format(subdev, cfg, fmt, clu_codes, > > + ARRAY_SIZE(clu_codes), > > + CLU_MIN_SIZE, CLU_MIN_SIZE, > > + CLU_MAX_SIZE, CLU_MAX_SIZE); > > > > } > > > > /* > > ------------------------------------------------------------------------ > > -----> > > diff --git a/drivers/media/platform/vsp1/vsp1_entity.c > > b/drivers/media/platform/vsp1/vsp1_entity.c index > > 72354caf5746..239df047efd0 100644 > > --- a/drivers/media/platform/vsp1/vsp1_entity.c > > +++ b/drivers/media/platform/vsp1/vsp1_entity.c > > @@ -307,6 +307,81 @@ int vsp1_subdev_enum_frame_size(struct v4l2_subdev > > *subdev,> > > return ret; > > > > } > > > > +/* > > + * vsp1_subdev_set_pad_format - Subdev pad set_fmt handler > > + * @subdev: V4L2 subdevice > > + * @cfg: V4L2 subdev pad configuration > > + * @fmt: V4L2 subdev format > > + * @codes: Array of supported media bus codes > > + * @ncodes: Number of supported media bus codes > > + * @min_width: Minimum image width > > + * @min_height: Minimum image height > > + * @max_width: Maximum image width > > + * @max_height: Maximum image height > > + * > > + * This function implements the subdev set_fmt pad operation for entities > > that > > + * do not support scaling or cropping. It defaults to the first supplied > > media > > + * bus code if the requested code isn't supported, clamps the size to the > > + * supplied minimum and maximum, and propagates the sink pad format to > > the > > + * source pad. > > + */ > > +int vsp1_subdev_set_pad_format(struct v4l2_subdev *subdev, > > + struct v4l2_subdev_pad_config *cfg, > > + struct v4l2_subdev_format *fmt, > > + const unsigned int *codes, unsigned int ncodes, > > + unsigned int min_width, unsigned int min_height, > > + unsigned int max_width, unsigned int max_height) > > +{ > > + struct vsp1_entity *entity = to_vsp1_entity(subdev); > > + struct v4l2_subdev_pad_config *config; > > + struct v4l2_mbus_framefmt *format; > > + unsigned int i; > > + int ret = 0; > > + > > + mutex_lock(&entity->lock); > > + > > + config = vsp1_entity_get_pad_config(entity, cfg, fmt->which); > > + if (!config) { > > + ret = -EINVAL; > > + goto done; > > + } > > + > > + format = vsp1_entity_get_pad_format(entity, config, fmt->pad); > > + > > + if (fmt->pad != 0) { > > I guess we don't have any clear way to say != *_PAD_SINK here do we .. > > > + /* The output format can't be modified. */ > > + fmt->format = *format; > > + goto done; > > + } > > + > > + /* > > + * Default to the first media bus code if the requested format is not > > + * supported. > > + */ > > + for (i = 0; i < ncodes; ++i) { > > + if (fmt->format.code == codes[i]) > > + break; > > + } > > + > > + format->code = i < ncodes ? codes[i] : codes[0]; > > + format->width = clamp_t(unsigned int, fmt->format.width, > > + min_width, max_width); > > + format->height = clamp_t(unsigned int, fmt->format.height, > > + min_height, max_height); > > + format->field = V4L2_FIELD_NONE; > > + format->colorspace = V4L2_COLORSPACE_SRGB; > > + > > + fmt->format = *format; > > + > > + /* Propagate the format to the source pad. */ > > + format = vsp1_entity_get_pad_format(entity, config, 1); > > If we can guarantee that ENTITY_PAD_SINK == 0 and ENTITY_PAD_SOURCE == 1, > can we put those into an enum ? > > > + *format = fmt->format; > > + > > +done: > > + mutex_unlock(&entity->lock); > > + return ret; > > +} > > + > > > > /* > > ------------------------------------------------------------------------ > > -----> > > * Media Operations > > */ > > > > diff --git a/drivers/media/platform/vsp1/vsp1_entity.h > > b/drivers/media/platform/vsp1/vsp1_entity.h index > > fb20a1578f3b..0839a62cfa71 100644 > > --- a/drivers/media/platform/vsp1/vsp1_entity.h > > +++ b/drivers/media/platform/vsp1/vsp1_entity.h > > @@ -160,6 +160,12 @@ struct media_pad *vsp1_entity_remote_pad(struct > > media_pad *pad);> > > int vsp1_subdev_get_pad_format(struct v4l2_subdev *subdev, > > > > struct v4l2_subdev_pad_config *cfg, > > struct v4l2_subdev_format *fmt); > > > > +int vsp1_subdev_set_pad_format(struct v4l2_subdev *subdev, > > + struct v4l2_subdev_pad_config *cfg, > > + struct v4l2_subdev_format *fmt, > > + const unsigned int *codes, unsigned int ncodes, > > + unsigned int min_width, unsigned int min_height, > > + unsigned int max_width, unsigned int max_height); > > > > int vsp1_subdev_enum_mbus_code(struct v4l2_subdev *subdev, > > > > struct v4l2_subdev_pad_config *cfg, > > struct v4l2_subdev_mbus_code_enum *code, > > > > diff --git a/drivers/media/platform/vsp1/vsp1_lif.c > > b/drivers/media/platform/vsp1/vsp1_lif.c index b20b842f06ba..fbdd5715f829 > > 100644 > > --- a/drivers/media/platform/vsp1/vsp1_lif.c > > +++ b/drivers/media/platform/vsp1/vsp1_lif.c > > @@ -33,17 +33,17 @@ static inline void vsp1_lif_write(struct vsp1_lif > > *lif, struct vsp1_dl_list *dl,> > > * V4L2 Subdevice Operations > > */ > > > > +static const unsigned int lif_codes[] = { > > + MEDIA_BUS_FMT_ARGB8888_1X32, > > + MEDIA_BUS_FMT_AYUV8_1X32, > > +}; > > + > > > > static int lif_enum_mbus_code(struct v4l2_subdev *subdev, > > > > struct v4l2_subdev_pad_config *cfg, > > struct v4l2_subdev_mbus_code_enum *code) > > > > { > > > > - static const unsigned int codes[] = { > > - MEDIA_BUS_FMT_ARGB8888_1X32, > > - MEDIA_BUS_FMT_AYUV8_1X32, > > - }; > > - > > - return vsp1_subdev_enum_mbus_code(subdev, cfg, code, codes, > > - ARRAY_SIZE(codes)); > > + return vsp1_subdev_enum_mbus_code(subdev, cfg, code, lif_codes, > > + ARRAY_SIZE(lif_codes)); > > > > } > > > > static int lif_enum_frame_size(struct v4l2_subdev *subdev, > > > > @@ -59,53 +59,10 @@ static int lif_set_format(struct v4l2_subdev *subdev, > > > > struct v4l2_subdev_pad_config *cfg, > > struct v4l2_subdev_format *fmt) > > > > { > > > > - struct vsp1_lif *lif = to_lif(subdev); > > - struct v4l2_subdev_pad_config *config; > > - struct v4l2_mbus_framefmt *format; > > - int ret = 0; > > - > > - mutex_lock(&lif->entity.lock); > > - > > - config = vsp1_entity_get_pad_config(&lif->entity, cfg, fmt->which); > > - if (!config) { > > - ret = -EINVAL; > > - goto done; > > - } > > - > > - /* Default to YUV if the requested format is not supported. */ > > - if (fmt->format.code != MEDIA_BUS_FMT_ARGB8888_1X32 && > > - fmt->format.code != MEDIA_BUS_FMT_AYUV8_1X32) > > - fmt->format.code = MEDIA_BUS_FMT_AYUV8_1X32; > > - > > - format = vsp1_entity_get_pad_format(&lif->entity, config, fmt->pad); > > - > > - if (fmt->pad == LIF_PAD_SOURCE) { > > - /* > > - * The LIF source format is always identical to its sink > > - * format. > > - */ > > - fmt->format = *format; > > - goto done; > > - } > > - > > - format->code = fmt->format.code; > > - format->width = clamp_t(unsigned int, fmt->format.width, > > - LIF_MIN_SIZE, LIF_MAX_SIZE); > > - format->height = clamp_t(unsigned int, fmt->format.height, > > - LIF_MIN_SIZE, LIF_MAX_SIZE); > > - format->field = V4L2_FIELD_NONE; > > - format->colorspace = V4L2_COLORSPACE_SRGB; > > - > > - fmt->format = *format; > > - > > - /* Propagate the format to the source pad. */ > > - format = vsp1_entity_get_pad_format(&lif->entity, config, > > - LIF_PAD_SOURCE); > > - *format = fmt->format; > > - > > -done: > > - mutex_unlock(&lif->entity.lock); > > - return ret; > > + return vsp1_subdev_set_pad_format(subdev, cfg, fmt, lif_codes, > > + ARRAY_SIZE(lif_codes), > > + LIF_MIN_SIZE, LIF_MIN_SIZE, > > + LIF_MAX_SIZE, LIF_MAX_SIZE); > > > > } > > > > static const struct v4l2_subdev_pad_ops lif_pad_ops = { > > > > diff --git a/drivers/media/platform/vsp1/vsp1_lut.c > > b/drivers/media/platform/vsp1/vsp1_lut.c index 7bdabb311c6c..f2e48a02ca7d > > 100644 > > --- a/drivers/media/platform/vsp1/vsp1_lut.c > > +++ b/drivers/media/platform/vsp1/vsp1_lut.c > > @@ -90,18 +90,18 @@ static const struct v4l2_ctrl_config lut_table_control > > = {> > > * V4L2 Subdevice Pad Operations > > */ > > > > +static const unsigned int lut_codes[] = { > > + MEDIA_BUS_FMT_ARGB8888_1X32, > > + MEDIA_BUS_FMT_AHSV8888_1X32, > > + MEDIA_BUS_FMT_AYUV8_1X32, > > +}; > > + > > > > static int lut_enum_mbus_code(struct v4l2_subdev *subdev, > > > > struct v4l2_subdev_pad_config *cfg, > > struct v4l2_subdev_mbus_code_enum *code) > > > > { > > > > - static const unsigned int codes[] = { > > - MEDIA_BUS_FMT_ARGB8888_1X32, > > - MEDIA_BUS_FMT_AHSV8888_1X32, > > - MEDIA_BUS_FMT_AYUV8_1X32, > > - }; > > - > > - return vsp1_subdev_enum_mbus_code(subdev, cfg, code, codes, > > - ARRAY_SIZE(codes)); > > + return vsp1_subdev_enum_mbus_code(subdev, cfg, code, lut_codes, > > + ARRAY_SIZE(lut_codes)); > > > > } > > > > static int lut_enum_frame_size(struct v4l2_subdev *subdev, > > > > @@ -117,51 +117,10 @@ static int lut_set_format(struct v4l2_subdev > > *subdev, > > > > struct v4l2_subdev_pad_config *cfg, > > struct v4l2_subdev_format *fmt) > > > > { > > > > - struct vsp1_lut *lut = to_lut(subdev); > > - struct v4l2_subdev_pad_config *config; > > - struct v4l2_mbus_framefmt *format; > > - int ret = 0; > > - > > - mutex_lock(&lut->entity.lock); > > - > > - config = vsp1_entity_get_pad_config(&lut->entity, cfg, fmt->which); > > - if (!config) { > > - ret = -EINVAL; > > - goto done; > > - } > > - > > - /* Default to YUV if the requested format is not supported. */ > > - if (fmt->format.code != MEDIA_BUS_FMT_ARGB8888_1X32 && > > - fmt->format.code != MEDIA_BUS_FMT_AHSV8888_1X32 && > > - fmt->format.code != MEDIA_BUS_FMT_AYUV8_1X32) > > - fmt->format.code = MEDIA_BUS_FMT_AYUV8_1X32; > > - > > - format = vsp1_entity_get_pad_format(&lut->entity, config, fmt->pad); > > - > > - if (fmt->pad == LUT_PAD_SOURCE) { > > - /* The LUT output format can't be modified. */ > > - fmt->format = *format; > > - goto done; > > - } > > - > > - format->code = fmt->format.code; > > - format->width = clamp_t(unsigned int, fmt->format.width, > > - LUT_MIN_SIZE, LUT_MAX_SIZE); > > - format->height = clamp_t(unsigned int, fmt->format.height, > > - LUT_MIN_SIZE, LUT_MAX_SIZE); > > - format->field = V4L2_FIELD_NONE; > > - format->colorspace = V4L2_COLORSPACE_SRGB; > > - > > - fmt->format = *format; > > - > > - /* Propagate the format to the source pad. */ > > - format = vsp1_entity_get_pad_format(&lut->entity, config, > > - LUT_PAD_SOURCE); > > - *format = fmt->format; > > - > > -done: > > - mutex_unlock(&lut->entity.lock); > > - return ret; > > + return vsp1_subdev_set_pad_format(subdev, cfg, fmt, lut_codes, > > + ARRAY_SIZE(lut_codes), > > + LUT_MIN_SIZE, LUT_MIN_SIZE, > > + LUT_MAX_SIZE, LUT_MAX_SIZE); > > > > } > > > > /* > > ------------------------------------------------------------------------ > > ----- -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v2 2/8] v4l: vsp1: Share the CLU, LIF and LUT set_fmt pad operation code Date: Sat, 28 Apr 2018 20:25:44 +0300 Message-ID: <13638427.AR7oG9JFQr@avalon> References: <20180422223430.16407-1-laurent.pinchart+renesas@ideasonboard.com> <20180422223430.16407-3-laurent.pinchart+renesas@ideasonboard.com> <9839f231-f91c-ab54-fdba-f100a98a558d@ideasonboard.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by gabe.freedesktop.org (Postfix) with ESMTPS id A23466E254 for ; Sat, 28 Apr 2018 17:25:29 +0000 (UTC) In-Reply-To: <9839f231-f91c-ab54-fdba-f100a98a558d@ideasonboard.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Kieran Bingham Cc: linux-renesas-soc@vger.kernel.org, Laurent Pinchart , dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org SGkgS2llcmFuLAoKT24gU2F0dXJkYXksIDI4IEFwcmlsIDIwMTggMjA6MTY6MTEgRUVTVCBLaWVy YW4gQmluZ2hhbSB3cm90ZToKPiBPbiAyMi8wNC8xOCAyMzozNCwgTGF1cmVudCBQaW5jaGFydCB3 cm90ZToKPiA+IFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2V0X2ZtdCBwYWQgb3BlcmF0aW9u IGlzIGlkZW50aWNhbCBpbiB0aGUKPiA+IHRocmVlIG1vZHVsZXMuIE1vdmUgaXQgdG8gYSBnZW5l cmljIGhlbHBlciBmdW5jdGlvbi4KPiA+IAo+ID4gU2lnbmVkLW9mZi1ieTogTGF1cmVudCBQaW5j aGFydAo+ID4gPGxhdXJlbnQucGluY2hhcnQrcmVuZXNhc0BpZGVhc29uYm9hcmQuY29tPgo+IAo+ IE9ubHkgYSBtaW5vciBwYWlyIG9mIGNvbW1lbnRzIGJlbG93IHJlZ2FyZGluZyBzb3VyY2Uvc2lu ayBwYWQgZGVzY3JpcHRpb25zLgo+IAo+IElmIGl0J3Mgbm90IGNvbnZlbmllbnQvYWNjdXJhdGUg dG8gZGVmaW5lIHRoZXNlIHdpdGggYW4gZW51bSB0aGVuIGRvbid0Cj4gd29ycnkgYWJvdXQgaXQu CgpJdCdzIGEgZ29vZCBwb2ludC4gVGhlcmUgYXJlIGhvd2V2ZXIgb3RoZXIgbG9jYXRpb25zIGlu IHZzcDFfZW50aXR5LmMgdGhhdCAKaGFyZGNvZGUgcGFkIG51bWJlcnMsIHNvIEknbGwgc3VibWl0 IGEgcGF0Y2ggb24gdG9wIG9mIHRoaXMgc2VyaWVzIHRvIGZpeCB0aGVtIAphbGwgaW4gb25lIGdv LgoKPiBPdGhlcndpc2UsCj4gCj4gUmV2aWV3ZWQtYnk6IEtpZXJhbiBCaW5naGFtIDxraWVyYW4u YmluZ2hhbStyZW5lc2FzQGlkZWFzb25ib2FyZC5jb20+Cj4gCj4gPiAtLS0KPiA+IAo+ID4gIGRy aXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2NsdS5jICAgIHwgNjUgKysrKystLS0tLS0t LS0tLS0tLS0tLS0tCj4gPiAgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZW50aXR5 LmMgfCA3NSArKysrKysrKysrKysrKysrKysrKysrKysrKwo+ID4gIGRyaXZlcnMvbWVkaWEvcGxh dGZvcm0vdnNwMS92c3AxX2VudGl0eS5oIHwgIDYgKysrCj4gPiAgZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS92c3AxL3ZzcDFfbGlmLmMgICAgfCA2NSArKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tCj4g PiAgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfbHV0LmMgICAgfCA2NSArKysrKy0t LS0tLS0tLS0tLS0tLS0tLS0tCj4gPiAgNSBmaWxlcyBjaGFuZ2VkLCAxMTYgaW5zZXJ0aW9ucygr KSwgMTYwIGRlbGV0aW9ucygtKQo+IAo+IFRoYXQncyBhIG5pY2UgZGlmZnN0YXQgOi0pCj4gCj4g PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfY2x1LmMKPiA+ IGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfY2x1LmMgaW5kZXggOTYyNmI2MzA4 NTg1Li45NmE0NDhlMTUwNGMKPiA+IDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS92c3AxL3ZzcDFfY2x1LmMKPiA+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNw MS92c3AxX2NsdS5jCj4gPiBAQCAtMTE0LDE4ICsxMTQsMTggQEAgc3RhdGljIGNvbnN0IHN0cnVj dCB2NGwyX2N0cmxfY29uZmlnCj4gPiBjbHVfbW9kZV9jb250cm9sID0gez4gCj4gPiAgICogVjRM MiBTdWJkZXZpY2UgUGFkIE9wZXJhdGlvbnMKPiA+ICAgKi8KPiA+IAo+ID4gK3N0YXRpYyBjb25z dCB1bnNpZ25lZCBpbnQgY2x1X2NvZGVzW10gPSB7Cj4gPiArCU1FRElBX0JVU19GTVRfQVJHQjg4 ODhfMVgzMiwKPiA+ICsJTUVESUFfQlVTX0ZNVF9BSFNWODg4OF8xWDMyLAo+ID4gKwlNRURJQV9C VVNfRk1UX0FZVVY4XzFYMzIsCj4gPiArfTsKPiA+ICsKPiA+IAo+ID4gIHN0YXRpYyBpbnQgY2x1 X2VudW1fbWJ1c19jb2RlKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAo+ID4gIAo+ID4gIAkJ CSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9wYWRfY29uZmlnICpjZmcsCj4gPiAgCQkJICAgICAg c3RydWN0IHY0bDJfc3ViZGV2X21idXNfY29kZV9lbnVtICpjb2RlKQo+ID4gIAo+ID4gIHsKPiA+ IAo+ID4gLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNvZGVzW10gPSB7Cj4gPiAtCQlNRURJ QV9CVVNfRk1UX0FSR0I4ODg4XzFYMzIsCj4gPiAtCQlNRURJQV9CVVNfRk1UX0FIU1Y4ODg4XzFY MzIsCj4gPiAtCQlNRURJQV9CVVNfRk1UX0FZVVY4XzFYMzIsCj4gPiAtCX07Cj4gPiAtCj4gPiAt CXJldHVybiB2c3AxX3N1YmRldl9lbnVtX21idXNfY29kZShzdWJkZXYsIGNmZywgY29kZSwgY29k ZXMsCj4gPiAtCQkJCQkgIEFSUkFZX1NJWkUoY29kZXMpKTsKPiA+ICsJcmV0dXJuIHZzcDFfc3Vi ZGV2X2VudW1fbWJ1c19jb2RlKHN1YmRldiwgY2ZnLCBjb2RlLCBjbHVfY29kZXMsCj4gPiArCQkJ CQkgIEFSUkFZX1NJWkUoY2x1X2NvZGVzKSk7Cj4gPiAKPiA+ICB9Cj4gPiAgCj4gPiAgc3RhdGlj IGludCBjbHVfZW51bV9mcmFtZV9zaXplKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAo+ID4g Cj4gPiBAQCAtMTQxLDUxICsxNDEsMTAgQEAgc3RhdGljIGludCBjbHVfc2V0X2Zvcm1hdChzdHJ1 Y3QgdjRsMl9zdWJkZXYKPiA+ICpzdWJkZXYsCj4gPiAKPiA+ICAJCQkgIHN0cnVjdCB2NGwyX3N1 YmRldl9wYWRfY29uZmlnICpjZmcsCj4gPiAgCQkJICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0 ICpmbXQpCj4gPiAgCj4gPiAgewo+ID4gCj4gPiAtCXN0cnVjdCB2c3AxX2NsdSAqY2x1ID0gdG9f Y2x1KHN1YmRldik7Cj4gPiAtCXN0cnVjdCB2NGwyX3N1YmRldl9wYWRfY29uZmlnICpjb25maWc7 Cj4gPiAtCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKPiA+IC0JaW50IHJldCA9 IDA7Cj4gPiAtCj4gPiAtCW11dGV4X2xvY2soJmNsdS0+ZW50aXR5LmxvY2spOwo+ID4gLQo+ID4g LQljb25maWcgPSB2c3AxX2VudGl0eV9nZXRfcGFkX2NvbmZpZygmY2x1LT5lbnRpdHksIGNmZywg Zm10LT53aGljaCk7Cj4gPiAtCWlmICghY29uZmlnKSB7Cj4gPiAtCQlyZXQgPSAtRUlOVkFMOwo+ ID4gLQkJZ290byBkb25lOwo+ID4gLQl9Cj4gPiAtCj4gPiAtCS8qIERlZmF1bHQgdG8gWVVWIGlm IHRoZSByZXF1ZXN0ZWQgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICovCj4gPiAtCWlmIChmbXQt PmZvcm1hdC5jb2RlICE9IE1FRElBX0JVU19GTVRfQVJHQjg4ODhfMVgzMiAmJgo+ID4gLQkgICAg Zm10LT5mb3JtYXQuY29kZSAhPSBNRURJQV9CVVNfRk1UX0FIU1Y4ODg4XzFYMzIgJiYKPiA+IC0J ICAgIGZtdC0+Zm9ybWF0LmNvZGUgIT0gTUVESUFfQlVTX0ZNVF9BWVVWOF8xWDMyKQo+ID4gLQkJ Zm10LT5mb3JtYXQuY29kZSA9IE1FRElBX0JVU19GTVRfQVlVVjhfMVgzMjsKPiA+IC0KPiA+IC0J Zm9ybWF0ID0gdnNwMV9lbnRpdHlfZ2V0X3BhZF9mb3JtYXQoJmNsdS0+ZW50aXR5LCBjb25maWcs IGZtdC0+cGFkKTsKPiA+IC0KPiA+IC0JaWYgKGZtdC0+cGFkID09IENMVV9QQURfU09VUkNFKSB7 Cj4gPiAtCQkvKiBUaGUgQ0xVIG91dHB1dCBmb3JtYXQgY2FuJ3QgYmUgbW9kaWZpZWQuICovCj4g PiAtCQlmbXQtPmZvcm1hdCA9ICpmb3JtYXQ7Cj4gPiAtCQlnb3RvIGRvbmU7Cj4gPiAtCX0KPiA+ IC0KPiA+IC0JZm9ybWF0LT5jb2RlID0gZm10LT5mb3JtYXQuY29kZTsKPiA+IC0JZm9ybWF0LT53 aWR0aCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBmbXQtPmZvcm1hdC53aWR0aCwKPiA+IC0JCQkJ Q0xVX01JTl9TSVpFLCBDTFVfTUFYX1NJWkUpOwo+ID4gLQlmb3JtYXQtPmhlaWdodCA9IGNsYW1w X3QodW5zaWduZWQgaW50LCBmbXQtPmZvcm1hdC5oZWlnaHQsCj4gPiAtCQkJCSBDTFVfTUlOX1NJ WkUsIENMVV9NQVhfU0laRSk7Cj4gPiAtCWZvcm1hdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7 Cj4gPiAtCWZvcm1hdC0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOwo+ID4gLQo+ ID4gLQlmbXQtPmZvcm1hdCA9ICpmb3JtYXQ7Cj4gPiAtCj4gPiAtCS8qIFByb3BhZ2F0ZSB0aGUg Zm9ybWF0IHRvIHRoZSBzb3VyY2UgcGFkLiAqLwo+ID4gLQlmb3JtYXQgPSB2c3AxX2VudGl0eV9n ZXRfcGFkX2Zvcm1hdCgmY2x1LT5lbnRpdHksIGNvbmZpZywKPiA+IC0JCQkJCSAgICBDTFVfUEFE X1NPVVJDRSk7Cj4gPiAtCSpmb3JtYXQgPSBmbXQtPmZvcm1hdDsKPiA+IC0KPiA+IC1kb25lOgo+ ID4gLQltdXRleF91bmxvY2soJmNsdS0+ZW50aXR5LmxvY2spOwo+ID4gLQlyZXR1cm4gcmV0Owo+ ID4gKwlyZXR1cm4gdnNwMV9zdWJkZXZfc2V0X3BhZF9mb3JtYXQoc3ViZGV2LCBjZmcsIGZtdCwg Y2x1X2NvZGVzLAo+ID4gKwkJCQkJICBBUlJBWV9TSVpFKGNsdV9jb2RlcyksCj4gPiArCQkJCQkg IENMVV9NSU5fU0laRSwgQ0xVX01JTl9TSVpFLAo+ID4gKwkJCQkJICBDTFVfTUFYX1NJWkUsIENM VV9NQVhfU0laRSk7Cj4gPiAKPiA+ICB9Cj4gPiAgCj4gPiAgLyoKPiA+ICAtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KPiA+ICAtLS0tLT4gCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92 c3AxL3ZzcDFfZW50aXR5LmMKPiA+IGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFf ZW50aXR5LmMgaW5kZXgKPiA+IDcyMzU0Y2FmNTc0Ni4uMjM5ZGYwNDdlZmQwIDEwMDY0NAo+ID4g LS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZW50aXR5LmMKPiA+ICsrKyBi L2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2VudGl0eS5jCj4gPiBAQCAtMzA3LDYg KzMwNyw4MSBAQCBpbnQgdnNwMV9zdWJkZXZfZW51bV9mcmFtZV9zaXplKHN0cnVjdCB2NGwyX3N1 YmRldgo+ID4gKnN1YmRldiw+IAo+ID4gIAlyZXR1cm4gcmV0Owo+ID4gIAo+ID4gIH0KPiA+IAo+ ID4gKy8qCj4gPiArICogdnNwMV9zdWJkZXZfc2V0X3BhZF9mb3JtYXQgLSBTdWJkZXYgcGFkIHNl dF9mbXQgaGFuZGxlcgo+ID4gKyAqIEBzdWJkZXY6IFY0TDIgc3ViZGV2aWNlCj4gPiArICogQGNm ZzogVjRMMiBzdWJkZXYgcGFkIGNvbmZpZ3VyYXRpb24KPiA+ICsgKiBAZm10OiBWNEwyIHN1YmRl diBmb3JtYXQKPiA+ICsgKiBAY29kZXM6IEFycmF5IG9mIHN1cHBvcnRlZCBtZWRpYSBidXMgY29k ZXMKPiA+ICsgKiBAbmNvZGVzOiBOdW1iZXIgb2Ygc3VwcG9ydGVkIG1lZGlhIGJ1cyBjb2Rlcwo+ ID4gKyAqIEBtaW5fd2lkdGg6IE1pbmltdW0gaW1hZ2Ugd2lkdGgKPiA+ICsgKiBAbWluX2hlaWdo dDogTWluaW11bSBpbWFnZSBoZWlnaHQKPiA+ICsgKiBAbWF4X3dpZHRoOiBNYXhpbXVtIGltYWdl IHdpZHRoCj4gPiArICogQG1heF9oZWlnaHQ6IE1heGltdW0gaW1hZ2UgaGVpZ2h0Cj4gPiArICoK PiA+ICsgKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHN1YmRldiBzZXRfZm10IHBhZCBv cGVyYXRpb24gZm9yIGVudGl0aWVzCj4gPiB0aGF0Cj4gPiArICogZG8gbm90IHN1cHBvcnQgc2Nh bGluZyBvciBjcm9wcGluZy4gSXQgZGVmYXVsdHMgdG8gdGhlIGZpcnN0IHN1cHBsaWVkCj4gPiBt ZWRpYQo+ID4gKyAqIGJ1cyBjb2RlIGlmIHRoZSByZXF1ZXN0ZWQgY29kZSBpc24ndCBzdXBwb3J0 ZWQsIGNsYW1wcyB0aGUgc2l6ZSB0byB0aGUKPiA+ICsgKiBzdXBwbGllZCBtaW5pbXVtIGFuZCBt YXhpbXVtLCBhbmQgcHJvcGFnYXRlcyB0aGUgc2luayBwYWQgZm9ybWF0IHRvCj4gPiB0aGUKPiA+ ICsgKiBzb3VyY2UgcGFkLgo+ID4gKyAqLwo+ID4gK2ludCB2c3AxX3N1YmRldl9zZXRfcGFkX2Zv cm1hdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKPiA+ICsJCQkgICAgICAgc3RydWN0IHY0 bDJfc3ViZGV2X3BhZF9jb25maWcgKmNmZywKPiA+ICsJCQkgICAgICAgc3RydWN0IHY0bDJfc3Vi ZGV2X2Zvcm1hdCAqZm10LAo+ID4gKwkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKmNvZGVz LCB1bnNpZ25lZCBpbnQgbmNvZGVzLAo+ID4gKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWluX3dp ZHRoLCB1bnNpZ25lZCBpbnQgbWluX2hlaWdodCwKPiA+ICsJCQkgICAgICAgdW5zaWduZWQgaW50 IG1heF93aWR0aCwgdW5zaWduZWQgaW50IG1heF9oZWlnaHQpCj4gPiArewo+ID4gKwlzdHJ1Y3Qg dnNwMV9lbnRpdHkgKmVudGl0eSA9IHRvX3ZzcDFfZW50aXR5KHN1YmRldik7Cj4gPiArCXN0cnVj dCB2NGwyX3N1YmRldl9wYWRfY29uZmlnICpjb25maWc7Cj4gPiArCXN0cnVjdCB2NGwyX21idXNf ZnJhbWVmbXQgKmZvcm1hdDsKPiA+ICsJdW5zaWduZWQgaW50IGk7Cj4gPiArCWludCByZXQgPSAw Owo+ID4gKwo+ID4gKwltdXRleF9sb2NrKCZlbnRpdHktPmxvY2spOwo+ID4gKwo+ID4gKwljb25m aWcgPSB2c3AxX2VudGl0eV9nZXRfcGFkX2NvbmZpZyhlbnRpdHksIGNmZywgZm10LT53aGljaCk7 Cj4gPiArCWlmICghY29uZmlnKSB7Cj4gPiArCQlyZXQgPSAtRUlOVkFMOwo+ID4gKwkJZ290byBk b25lOwo+ID4gKwl9Cj4gPiArCj4gPiArCWZvcm1hdCA9IHZzcDFfZW50aXR5X2dldF9wYWRfZm9y bWF0KGVudGl0eSwgY29uZmlnLCBmbXQtPnBhZCk7Cj4gPiArCj4gPiArCWlmIChmbXQtPnBhZCAh PSAwKSB7Cj4gCj4gSSBndWVzcyB3ZSBkb24ndCBoYXZlIGFueSBjbGVhciB3YXkgdG8gc2F5ICE9 ICpfUEFEX1NJTksgaGVyZSBkbyB3ZSAuLgo+IAo+ID4gKwkJLyogVGhlIG91dHB1dCBmb3JtYXQg Y2FuJ3QgYmUgbW9kaWZpZWQuICovCj4gPiArCQlmbXQtPmZvcm1hdCA9ICpmb3JtYXQ7Cj4gPiAr CQlnb3RvIGRvbmU7Cj4gPiArCX0KPiA+ICsKPiA+ICsJLyoKPiA+ICsJICogRGVmYXVsdCB0byB0 aGUgZmlyc3QgbWVkaWEgYnVzIGNvZGUgaWYgdGhlIHJlcXVlc3RlZCBmb3JtYXQgaXMgbm90Cj4g PiArCSAqIHN1cHBvcnRlZC4KPiA+ICsJICovCj4gPiArCWZvciAoaSA9IDA7IGkgPCBuY29kZXM7 ICsraSkgewo+ID4gKwkJaWYgKGZtdC0+Zm9ybWF0LmNvZGUgPT0gY29kZXNbaV0pCj4gPiArCQkJ YnJlYWs7Cj4gPiArCX0KPiA+ICsKPiA+ICsJZm9ybWF0LT5jb2RlID0gaSA8IG5jb2RlcyA/IGNv ZGVzW2ldIDogY29kZXNbMF07Cj4gPiArCWZvcm1hdC0+d2lkdGggPSBjbGFtcF90KHVuc2lnbmVk IGludCwgZm10LT5mb3JtYXQud2lkdGgsCj4gPiArCQkJCW1pbl93aWR0aCwgbWF4X3dpZHRoKTsK PiA+ICsJZm9ybWF0LT5oZWlnaHQgPSBjbGFtcF90KHVuc2lnbmVkIGludCwgZm10LT5mb3JtYXQu aGVpZ2h0LAo+ID4gKwkJCQkgbWluX2hlaWdodCwgbWF4X2hlaWdodCk7Cj4gPiArCWZvcm1hdC0+ ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Cj4gPiArCWZvcm1hdC0+Y29sb3JzcGFjZSA9IFY0TDJf Q09MT1JTUEFDRV9TUkdCOwo+ID4gKwo+ID4gKwlmbXQtPmZvcm1hdCA9ICpmb3JtYXQ7Cj4gPiAr Cj4gPiArCS8qIFByb3BhZ2F0ZSB0aGUgZm9ybWF0IHRvIHRoZSBzb3VyY2UgcGFkLiAqLwo+ID4g Kwlmb3JtYXQgPSB2c3AxX2VudGl0eV9nZXRfcGFkX2Zvcm1hdChlbnRpdHksIGNvbmZpZywgMSk7 Cj4gCj4gSWYgd2UgY2FuIGd1YXJhbnRlZSB0aGF0IEVOVElUWV9QQURfU0lOSyA9PSAwIGFuZCBF TlRJVFlfUEFEX1NPVVJDRSA9PSAxLAo+IGNhbiB3ZSBwdXQgdGhvc2UgaW50byBhbiBlbnVtID8K PiAKPiA+ICsJKmZvcm1hdCA9IGZtdC0+Zm9ybWF0Owo+ID4gKwo+ID4gK2RvbmU6Cj4gPiArCW11 dGV4X3VubG9jaygmZW50aXR5LT5sb2NrKTsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ICt9Cj4gPiAr Cj4gPiAKPiA+ICAvKgo+ID4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ID4gIC0tLS0tPiAgCj4gPiAgICog TWVkaWEgT3BlcmF0aW9ucwo+ID4gICAqLwo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9t ZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZW50aXR5LmgKPiA+IGIvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS92c3AxL3ZzcDFfZW50aXR5LmggaW5kZXgKPiA+IGZiMjBhMTU3OGYzYi4uMDgzOWE2MmNm YTcxIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZW50 aXR5LmgKPiA+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2VudGl0eS5o Cj4gPiBAQCAtMTYwLDYgKzE2MCwxMiBAQCBzdHJ1Y3QgbWVkaWFfcGFkICp2c3AxX2VudGl0eV9y ZW1vdGVfcGFkKHN0cnVjdAo+ID4gbWVkaWFfcGFkICpwYWQpOz4gCj4gPiAgaW50IHZzcDFfc3Vi ZGV2X2dldF9wYWRfZm9ybWF0KHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAo+ID4gIAo+ID4g IAkJCSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfcGFkX2NvbmZpZyAqY2ZnLAo+ID4gIAkJCSAg ICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpOwo+ID4gCj4gPiAraW50IHZzcDFf c3ViZGV2X3NldF9wYWRfZm9ybWF0KHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAo+ID4gKwkJ CSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfcGFkX2NvbmZpZyAqY2ZnLAo+ID4gKwkJCSAgICAg ICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQsCj4gPiArCQkJICAgICAgIGNvbnN0IHVu c2lnbmVkIGludCAqY29kZXMsIHVuc2lnbmVkIGludCBuY29kZXMsCj4gPiArCQkJICAgICAgIHVu c2lnbmVkIGludCBtaW5fd2lkdGgsIHVuc2lnbmVkIGludCBtaW5faGVpZ2h0LAo+ID4gKwkJCSAg ICAgICB1bnNpZ25lZCBpbnQgbWF4X3dpZHRoLCB1bnNpZ25lZCBpbnQgbWF4X2hlaWdodCk7Cj4g PiAKPiA+ICBpbnQgdnNwMV9zdWJkZXZfZW51bV9tYnVzX2NvZGUoc3RydWN0IHY0bDJfc3ViZGV2 ICpzdWJkZXYsCj4gPiAgCj4gPiAgCQkJICAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9wYWRfY29u ZmlnICpjZmcsCj4gPiAgCQkJICAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9tYnVzX2NvZGVfZW51 bSAqY29kZSwKPiA+IAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNw MS92c3AxX2xpZi5jCj4gPiBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2xpZi5j IGluZGV4IGIyMGI4NDJmMDZiYS4uZmJkZDU3MTVmODI5Cj4gPiAxMDA2NDQKPiA+IC0tLSBhL2Ry aXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2xpZi5jCj4gPiArKysgYi9kcml2ZXJzL21l ZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9saWYuYwo+ID4gQEAgLTMzLDE3ICszMywxNyBAQCBzdGF0 aWMgaW5saW5lIHZvaWQgdnNwMV9saWZfd3JpdGUoc3RydWN0IHZzcDFfbGlmCj4gPiAqbGlmLCBz dHJ1Y3QgdnNwMV9kbF9saXN0ICpkbCw+IAo+ID4gICAqIFY0TDIgU3ViZGV2aWNlIE9wZXJhdGlv bnMKPiA+ICAgKi8KPiA+IAo+ID4gK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGlmX2NvZGVz W10gPSB7Cj4gPiArCU1FRElBX0JVU19GTVRfQVJHQjg4ODhfMVgzMiwKPiA+ICsJTUVESUFfQlVT X0ZNVF9BWVVWOF8xWDMyLAo+ID4gK307Cj4gPiArCj4gPiAKPiA+ICBzdGF0aWMgaW50IGxpZl9l bnVtX21idXNfY29kZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKPiA+ICAKPiA+ICAJCQkg ICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfcGFkX2NvbmZpZyAqY2ZnLAo+ID4gIAkJCSAgICAgIHN0 cnVjdCB2NGwyX3N1YmRldl9tYnVzX2NvZGVfZW51bSAqY29kZSkKPiA+ICAKPiA+ICB7Cj4gPiAK PiA+IC0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjb2Rlc1tdID0gewo+ID4gLQkJTUVESUFf QlVTX0ZNVF9BUkdCODg4OF8xWDMyLAo+ID4gLQkJTUVESUFfQlVTX0ZNVF9BWVVWOF8xWDMyLAo+ ID4gLQl9Owo+ID4gLQo+ID4gLQlyZXR1cm4gdnNwMV9zdWJkZXZfZW51bV9tYnVzX2NvZGUoc3Vi ZGV2LCBjZmcsIGNvZGUsIGNvZGVzLAo+ID4gLQkJCQkJICBBUlJBWV9TSVpFKGNvZGVzKSk7Cj4g PiArCXJldHVybiB2c3AxX3N1YmRldl9lbnVtX21idXNfY29kZShzdWJkZXYsIGNmZywgY29kZSwg bGlmX2NvZGVzLAo+ID4gKwkJCQkJICBBUlJBWV9TSVpFKGxpZl9jb2RlcykpOwo+ID4gCj4gPiAg fQo+ID4gIAo+ID4gIHN0YXRpYyBpbnQgbGlmX2VudW1fZnJhbWVfc2l6ZShzdHJ1Y3QgdjRsMl9z dWJkZXYgKnN1YmRldiwKPiA+IAo+ID4gQEAgLTU5LDUzICs1OSwxMCBAQCBzdGF0aWMgaW50IGxp Zl9zZXRfZm9ybWF0KHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAo+ID4gCj4gPiAgCQkJICBz dHJ1Y3QgdjRsMl9zdWJkZXZfcGFkX2NvbmZpZyAqY2ZnLAo+ID4gIAkJCSAgc3RydWN0IHY0bDJf c3ViZGV2X2Zvcm1hdCAqZm10KQo+ID4gIAo+ID4gIHsKPiA+IAo+ID4gLQlzdHJ1Y3QgdnNwMV9s aWYgKmxpZiA9IHRvX2xpZihzdWJkZXYpOwo+ID4gLQlzdHJ1Y3QgdjRsMl9zdWJkZXZfcGFkX2Nv bmZpZyAqY29uZmlnOwo+ID4gLQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmb3JtYXQ7Cj4g PiAtCWludCByZXQgPSAwOwo+ID4gLQo+ID4gLQltdXRleF9sb2NrKCZsaWYtPmVudGl0eS5sb2Nr KTsKPiA+IC0KPiA+IC0JY29uZmlnID0gdnNwMV9lbnRpdHlfZ2V0X3BhZF9jb25maWcoJmxpZi0+ ZW50aXR5LCBjZmcsIGZtdC0+d2hpY2gpOwo+ID4gLQlpZiAoIWNvbmZpZykgewo+ID4gLQkJcmV0 ID0gLUVJTlZBTDsKPiA+IC0JCWdvdG8gZG9uZTsKPiA+IC0JfQo+ID4gLQo+ID4gLQkvKiBEZWZh dWx0IHRvIFlVViBpZiB0aGUgcmVxdWVzdGVkIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAqLwo+ ID4gLQlpZiAoZm10LT5mb3JtYXQuY29kZSAhPSBNRURJQV9CVVNfRk1UX0FSR0I4ODg4XzFYMzIg JiYKPiA+IC0JICAgIGZtdC0+Zm9ybWF0LmNvZGUgIT0gTUVESUFfQlVTX0ZNVF9BWVVWOF8xWDMy KQo+ID4gLQkJZm10LT5mb3JtYXQuY29kZSA9IE1FRElBX0JVU19GTVRfQVlVVjhfMVgzMjsKPiA+ IC0KPiA+IC0JZm9ybWF0ID0gdnNwMV9lbnRpdHlfZ2V0X3BhZF9mb3JtYXQoJmxpZi0+ZW50aXR5 LCBjb25maWcsIGZtdC0+cGFkKTsKPiA+IC0KPiA+IC0JaWYgKGZtdC0+cGFkID09IExJRl9QQURf U09VUkNFKSB7Cj4gPiAtCQkvKgo+ID4gLQkJICogVGhlIExJRiBzb3VyY2UgZm9ybWF0IGlzIGFs d2F5cyBpZGVudGljYWwgdG8gaXRzIHNpbmsKPiA+IC0JCSAqIGZvcm1hdC4KPiA+IC0JCSAqLwo+ ID4gLQkJZm10LT5mb3JtYXQgPSAqZm9ybWF0Owo+ID4gLQkJZ290byBkb25lOwo+ID4gLQl9Cj4g PiAtCj4gPiAtCWZvcm1hdC0+Y29kZSA9IGZtdC0+Zm9ybWF0LmNvZGU7Cj4gPiAtCWZvcm1hdC0+ d2lkdGggPSBjbGFtcF90KHVuc2lnbmVkIGludCwgZm10LT5mb3JtYXQud2lkdGgsCj4gPiAtCQkJ CUxJRl9NSU5fU0laRSwgTElGX01BWF9TSVpFKTsKPiA+IC0JZm9ybWF0LT5oZWlnaHQgPSBjbGFt cF90KHVuc2lnbmVkIGludCwgZm10LT5mb3JtYXQuaGVpZ2h0LAo+ID4gLQkJCQkgTElGX01JTl9T SVpFLCBMSUZfTUFYX1NJWkUpOwo+ID4gLQlmb3JtYXQtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05F Owo+ID4gLQlmb3JtYXQtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKPiA+IC0K PiA+IC0JZm10LT5mb3JtYXQgPSAqZm9ybWF0Owo+ID4gLQo+ID4gLQkvKiBQcm9wYWdhdGUgdGhl IGZvcm1hdCB0byB0aGUgc291cmNlIHBhZC4gKi8KPiA+IC0JZm9ybWF0ID0gdnNwMV9lbnRpdHlf Z2V0X3BhZF9mb3JtYXQoJmxpZi0+ZW50aXR5LCBjb25maWcsCj4gPiAtCQkJCQkgICAgTElGX1BB RF9TT1VSQ0UpOwo+ID4gLQkqZm9ybWF0ID0gZm10LT5mb3JtYXQ7Cj4gPiAtCj4gPiAtZG9uZToK PiA+IC0JbXV0ZXhfdW5sb2NrKCZsaWYtPmVudGl0eS5sb2NrKTsKPiA+IC0JcmV0dXJuIHJldDsK PiA+ICsJcmV0dXJuIHZzcDFfc3ViZGV2X3NldF9wYWRfZm9ybWF0KHN1YmRldiwgY2ZnLCBmbXQs IGxpZl9jb2RlcywKPiA+ICsJCQkJCSAgQVJSQVlfU0laRShsaWZfY29kZXMpLAo+ID4gKwkJCQkJ ICBMSUZfTUlOX1NJWkUsIExJRl9NSU5fU0laRSwKPiA+ICsJCQkJCSAgTElGX01BWF9TSVpFLCBM SUZfTUFYX1NJWkUpOwo+ID4gCj4gPiAgfQo+ID4gIAo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3Qg djRsMl9zdWJkZXZfcGFkX29wcyBsaWZfcGFkX29wcyA9IHsKPiA+IAo+ID4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2x1dC5jCj4gPiBiL2RyaXZlcnMvbWVk aWEvcGxhdGZvcm0vdnNwMS92c3AxX2x1dC5jIGluZGV4IDdiZGFiYjMxMWM2Yy4uZjJlNDhhMDJj YTdkCj4gPiAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3Ax X2x1dC5jCj4gPiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9sdXQuYwo+ ID4gQEAgLTkwLDE4ICs5MCwxOCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25m aWcgbHV0X3RhYmxlX2NvbnRyb2wKPiA+ID0gez4gCj4gPiAgICogVjRMMiBTdWJkZXZpY2UgUGFk IE9wZXJhdGlvbnMKPiA+ICAgKi8KPiA+IAo+ID4gK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQg bHV0X2NvZGVzW10gPSB7Cj4gPiArCU1FRElBX0JVU19GTVRfQVJHQjg4ODhfMVgzMiwKPiA+ICsJ TUVESUFfQlVTX0ZNVF9BSFNWODg4OF8xWDMyLAo+ID4gKwlNRURJQV9CVVNfRk1UX0FZVVY4XzFY MzIsCj4gPiArfTsKPiA+ICsKPiA+IAo+ID4gIHN0YXRpYyBpbnQgbHV0X2VudW1fbWJ1c19jb2Rl KHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAo+ID4gIAo+ID4gIAkJCSAgICAgIHN0cnVjdCB2 NGwyX3N1YmRldl9wYWRfY29uZmlnICpjZmcsCj4gPiAgCQkJICAgICAgc3RydWN0IHY0bDJfc3Vi ZGV2X21idXNfY29kZV9lbnVtICpjb2RlKQo+ID4gIAo+ID4gIHsKPiA+IAo+ID4gLQlzdGF0aWMg Y29uc3QgdW5zaWduZWQgaW50IGNvZGVzW10gPSB7Cj4gPiAtCQlNRURJQV9CVVNfRk1UX0FSR0I4 ODg4XzFYMzIsCj4gPiAtCQlNRURJQV9CVVNfRk1UX0FIU1Y4ODg4XzFYMzIsCj4gPiAtCQlNRURJ QV9CVVNfRk1UX0FZVVY4XzFYMzIsCj4gPiAtCX07Cj4gPiAtCj4gPiAtCXJldHVybiB2c3AxX3N1 YmRldl9lbnVtX21idXNfY29kZShzdWJkZXYsIGNmZywgY29kZSwgY29kZXMsCj4gPiAtCQkJCQkg IEFSUkFZX1NJWkUoY29kZXMpKTsKPiA+ICsJcmV0dXJuIHZzcDFfc3ViZGV2X2VudW1fbWJ1c19j b2RlKHN1YmRldiwgY2ZnLCBjb2RlLCBsdXRfY29kZXMsCj4gPiArCQkJCQkgIEFSUkFZX1NJWkUo bHV0X2NvZGVzKSk7Cj4gPiAKPiA+ICB9Cj4gPiAgCj4gPiAgc3RhdGljIGludCBsdXRfZW51bV9m cmFtZV9zaXplKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAo+ID4gCj4gPiBAQCAtMTE3LDUx ICsxMTcsMTAgQEAgc3RhdGljIGludCBsdXRfc2V0X2Zvcm1hdChzdHJ1Y3QgdjRsMl9zdWJkZXYK PiA+ICpzdWJkZXYsCj4gPiAKPiA+ICAJCQkgIHN0cnVjdCB2NGwyX3N1YmRldl9wYWRfY29uZmln ICpjZmcsCj4gPiAgCQkJICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCj4gPiAgCj4g PiAgewo+ID4gCj4gPiAtCXN0cnVjdCB2c3AxX2x1dCAqbHV0ID0gdG9fbHV0KHN1YmRldik7Cj4g PiAtCXN0cnVjdCB2NGwyX3N1YmRldl9wYWRfY29uZmlnICpjb25maWc7Cj4gPiAtCXN0cnVjdCB2 NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKPiA+IC0JaW50IHJldCA9IDA7Cj4gPiAtCj4gPiAt CW11dGV4X2xvY2soJmx1dC0+ZW50aXR5LmxvY2spOwo+ID4gLQo+ID4gLQljb25maWcgPSB2c3Ax X2VudGl0eV9nZXRfcGFkX2NvbmZpZygmbHV0LT5lbnRpdHksIGNmZywgZm10LT53aGljaCk7Cj4g PiAtCWlmICghY29uZmlnKSB7Cj4gPiAtCQlyZXQgPSAtRUlOVkFMOwo+ID4gLQkJZ290byBkb25l Owo+ID4gLQl9Cj4gPiAtCj4gPiAtCS8qIERlZmF1bHQgdG8gWVVWIGlmIHRoZSByZXF1ZXN0ZWQg Zm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICovCj4gPiAtCWlmIChmbXQtPmZvcm1hdC5jb2RlICE9 IE1FRElBX0JVU19GTVRfQVJHQjg4ODhfMVgzMiAmJgo+ID4gLQkgICAgZm10LT5mb3JtYXQuY29k ZSAhPSBNRURJQV9CVVNfRk1UX0FIU1Y4ODg4XzFYMzIgJiYKPiA+IC0JICAgIGZtdC0+Zm9ybWF0 LmNvZGUgIT0gTUVESUFfQlVTX0ZNVF9BWVVWOF8xWDMyKQo+ID4gLQkJZm10LT5mb3JtYXQuY29k ZSA9IE1FRElBX0JVU19GTVRfQVlVVjhfMVgzMjsKPiA+IC0KPiA+IC0JZm9ybWF0ID0gdnNwMV9l bnRpdHlfZ2V0X3BhZF9mb3JtYXQoJmx1dC0+ZW50aXR5LCBjb25maWcsIGZtdC0+cGFkKTsKPiA+ IC0KPiA+IC0JaWYgKGZtdC0+cGFkID09IExVVF9QQURfU09VUkNFKSB7Cj4gPiAtCQkvKiBUaGUg TFVUIG91dHB1dCBmb3JtYXQgY2FuJ3QgYmUgbW9kaWZpZWQuICovCj4gPiAtCQlmbXQtPmZvcm1h dCA9ICpmb3JtYXQ7Cj4gPiAtCQlnb3RvIGRvbmU7Cj4gPiAtCX0KPiA+IC0KPiA+IC0JZm9ybWF0 LT5jb2RlID0gZm10LT5mb3JtYXQuY29kZTsKPiA+IC0JZm9ybWF0LT53aWR0aCA9IGNsYW1wX3Qo dW5zaWduZWQgaW50LCBmbXQtPmZvcm1hdC53aWR0aCwKPiA+IC0JCQkJTFVUX01JTl9TSVpFLCBM VVRfTUFYX1NJWkUpOwo+ID4gLQlmb3JtYXQtPmhlaWdodCA9IGNsYW1wX3QodW5zaWduZWQgaW50 LCBmbXQtPmZvcm1hdC5oZWlnaHQsCj4gPiAtCQkJCSBMVVRfTUlOX1NJWkUsIExVVF9NQVhfU0la RSk7Cj4gPiAtCWZvcm1hdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Cj4gPiAtCWZvcm1hdC0+ Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOwo+ID4gLQo+ID4gLQlmbXQtPmZvcm1h dCA9ICpmb3JtYXQ7Cj4gPiAtCj4gPiAtCS8qIFByb3BhZ2F0ZSB0aGUgZm9ybWF0IHRvIHRoZSBz b3VyY2UgcGFkLiAqLwo+ID4gLQlmb3JtYXQgPSB2c3AxX2VudGl0eV9nZXRfcGFkX2Zvcm1hdCgm bHV0LT5lbnRpdHksIGNvbmZpZywKPiA+IC0JCQkJCSAgICBMVVRfUEFEX1NPVVJDRSk7Cj4gPiAt CSpmb3JtYXQgPSBmbXQtPmZvcm1hdDsKPiA+IC0KPiA+IC1kb25lOgo+ID4gLQltdXRleF91bmxv Y2soJmx1dC0+ZW50aXR5LmxvY2spOwo+ID4gLQlyZXR1cm4gcmV0Owo+ID4gKwlyZXR1cm4gdnNw MV9zdWJkZXZfc2V0X3BhZF9mb3JtYXQoc3ViZGV2LCBjZmcsIGZtdCwgbHV0X2NvZGVzLAo+ID4g KwkJCQkJICBBUlJBWV9TSVpFKGx1dF9jb2RlcyksCj4gPiArCQkJCQkgIExVVF9NSU5fU0laRSwg TFVUX01JTl9TSVpFLAo+ID4gKwkJCQkJICBMVVRfTUFYX1NJWkUsIExVVF9NQVhfU0laRSk7Cj4g PiAKPiA+ICB9Cj4gPiAgCj4gPiAgLyoKPiA+ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiA+ICAtLS0tLQoK Ci0tIApSZWdhcmRzLAoKTGF1cmVudCBQaW5jaGFydAoKCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZl bEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9kcmktZGV2ZWwK