From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from perceval.ideasonboard.com ([213.167.242.64]:53186 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757832AbeD1R35 (ORCPT ); Sat, 28 Apr 2018 13:29:57 -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:30:12 +0300 Message-ID: <1628120.9DFZQMBCSb@avalon> In-Reply-To: <13638427.AR7oG9JFQr@avalon> References: <20180422223430.16407-1-laurent.pinchart+renesas@ideasonboard.com> <9839f231-f91c-ab54-fdba-f100a98a558d@ideasonboard.com> <13638427.AR7oG9JFQr@avalon> 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 again, On Saturday, 28 April 2018 20:25:44 EEST Laurent Pinchart wrote: > 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. Actually I can compare the pad number to entity->source_pad, I'll update this patch accordingly in v3. > > 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:30:12 +0300 Message-ID: <1628120.9DFZQMBCSb@avalon> References: <20180422223430.16407-1-laurent.pinchart+renesas@ideasonboard.com> <9839f231-f91c-ab54-fdba-f100a98a558d@ideasonboard.com> <13638427.AR7oG9JFQr@avalon> 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 [213.167.242.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id 244D56E21A for ; Sat, 28 Apr 2018 17:29:56 +0000 (UTC) In-Reply-To: <13638427.AR7oG9JFQr@avalon> 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 SGkgYWdhaW4sCgpPbiBTYXR1cmRheSwgMjggQXByaWwgMjAxOCAyMDoyNTo0NCBFRVNUIExhdXJl bnQgUGluY2hhcnQgd3JvdGU6Cj4gT24gU2F0dXJkYXksIDI4IEFwcmlsIDIwMTggMjA6MTY6MTEg RUVTVCBLaWVyYW4gQmluZ2hhbSB3cm90ZToKPiA+IE9uIDIyLzA0LzE4IDIzOjM0LCBMYXVyZW50 IFBpbmNoYXJ0IHdyb3RlOgo+ID4gPiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNldF9mbXQg cGFkIG9wZXJhdGlvbiBpcyBpZGVudGljYWwgaW4gdGhlCj4gPiA+IHRocmVlIG1vZHVsZXMuIE1v dmUgaXQgdG8gYSBnZW5lcmljIGhlbHBlciBmdW5jdGlvbi4KPiA+ID4gCj4gPiA+IFNpZ25lZC1v ZmYtYnk6IExhdXJlbnQgUGluY2hhcnQKPiA+ID4gPGxhdXJlbnQucGluY2hhcnQrcmVuZXNhc0Bp ZGVhc29uYm9hcmQuY29tPgo+ID4gCj4gPiBPbmx5IGEgbWlub3IgcGFpciBvZiBjb21tZW50cyBi ZWxvdyByZWdhcmRpbmcgc291cmNlL3NpbmsgcGFkCj4gPiBkZXNjcmlwdGlvbnMuCj4gPiAKPiA+ IElmIGl0J3Mgbm90IGNvbnZlbmllbnQvYWNjdXJhdGUgdG8gZGVmaW5lIHRoZXNlIHdpdGggYW4g ZW51bSB0aGVuIGRvbid0Cj4gPiB3b3JyeSBhYm91dCBpdC4KPiAKPiBJdCdzIGEgZ29vZCBwb2lu dC4gVGhlcmUgYXJlIGhvd2V2ZXIgb3RoZXIgbG9jYXRpb25zIGluIHZzcDFfZW50aXR5LmMgdGhh dAo+IGhhcmRjb2RlIHBhZCBudW1iZXJzLCBzbyBJJ2xsIHN1Ym1pdCBhIHBhdGNoIG9uIHRvcCBv ZiB0aGlzIHNlcmllcyB0byBmaXgKPiB0aGVtIGFsbCBpbiBvbmUgZ28uCgpBY3R1YWxseSBJIGNh biBjb21wYXJlIHRoZSBwYWQgbnVtYmVyIHRvIGVudGl0eS0+c291cmNlX3BhZCwgSSdsbCB1cGRh dGUgdGhpcyAKcGF0Y2ggYWNjb3JkaW5nbHkgaW4gdjMuCgo+ID4gT3RoZXJ3aXNlLAo+ID4gCj4g PiBSZXZpZXdlZC1ieTogS2llcmFuIEJpbmdoYW0gPGtpZXJhbi5iaW5naGFtK3JlbmVzYXNAaWRl YXNvbmJvYXJkLmNvbT4KPiA+IAo+ID4gPiAtLS0KPiA+ID4gCj4gPiA+ICBkcml2ZXJzL21lZGlh L3BsYXRmb3JtL3ZzcDEvdnNwMV9jbHUuYyAgICB8IDY1ICsrKysrLS0tLS0tLS0tLS0tLS0tLS0t LQo+ID4gPiAgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZW50aXR5LmMgfCA3NQo+ ID4gPiAgKysrKysrKysrKysrKysrKysrKysrKysrKysKPiA+ID4gIGRyaXZlcnMvbWVkaWEvcGxh dGZvcm0vdnNwMS92c3AxX2VudGl0eS5oIHwgIDYgKysrCj4gPiA+ICBkcml2ZXJzL21lZGlhL3Bs YXRmb3JtL3ZzcDEvdnNwMV9saWYuYyAgICB8IDY1Cj4gPiA+ICArKysrKy0tLS0tLS0tLS0tLS0t LS0tLS0tCj4gPiA+ICBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9sdXQuYyAgICB8 IDY1Cj4gPiA+ICArKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gPiA+ICA1IGZpbGVzIGNoYW5n ZWQsIDExNiBpbnNlcnRpb25zKCspLCAxNjAgZGVsZXRpb25zKC0pCj4gPiAKPiA+IFRoYXQncyBh IG5pY2UgZGlmZnN0YXQgOi0pCj4gPiAKPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEv cGxhdGZvcm0vdnNwMS92c3AxX2NsdS5jCj4gPiA+IGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92 c3AxL3ZzcDFfY2x1LmMgaW5kZXgKPiA+ID4gOTYyNmI2MzA4NTg1Li45NmE0NDhlMTUwNGMKPiA+ ID4gMTAwNjQ0Cj4gPiA+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2Ns dS5jCj4gPiA+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2NsdS5jCj4g PiA+IEBAIC0xMTQsMTggKzExNCwxOCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9j b25maWcKPiA+ID4gY2x1X21vZGVfY29udHJvbCA9IHs+Cj4gPiA+IAo+ID4gPiAgICogVjRMMiBT dWJkZXZpY2UgUGFkIE9wZXJhdGlvbnMKPiA+ID4gICAqLwo+ID4gPiAKPiA+ID4gK3N0YXRpYyBj b25zdCB1bnNpZ25lZCBpbnQgY2x1X2NvZGVzW10gPSB7Cj4gPiA+ICsJTUVESUFfQlVTX0ZNVF9B UkdCODg4OF8xWDMyLAo+ID4gPiArCU1FRElBX0JVU19GTVRfQUhTVjg4ODhfMVgzMiwKPiA+ID4g KwlNRURJQV9CVVNfRk1UX0FZVVY4XzFYMzIsCj4gPiA+ICt9Owo+ID4gPiArCj4gPiA+IAo+ID4g PiAgc3RhdGljIGludCBjbHVfZW51bV9tYnVzX2NvZGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJk ZXYsCj4gPiA+ICAKPiA+ID4gIAkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9wYWRfY29uZmln ICpjZmcsCj4gPiA+ICAJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0g KmNvZGUpCj4gPiA+ICAKPiA+ID4gIHsKPiA+ID4gCj4gPiA+IC0Jc3RhdGljIGNvbnN0IHVuc2ln bmVkIGludCBjb2Rlc1tdID0gewo+ID4gPiAtCQlNRURJQV9CVVNfRk1UX0FSR0I4ODg4XzFYMzIs Cj4gPiA+IC0JCU1FRElBX0JVU19GTVRfQUhTVjg4ODhfMVgzMiwKPiA+ID4gLQkJTUVESUFfQlVT X0ZNVF9BWVVWOF8xWDMyLAo+ID4gPiAtCX07Cj4gPiA+IC0KPiA+ID4gLQlyZXR1cm4gdnNwMV9z dWJkZXZfZW51bV9tYnVzX2NvZGUoc3ViZGV2LCBjZmcsIGNvZGUsIGNvZGVzLAo+ID4gPiAtCQkJ CQkgIEFSUkFZX1NJWkUoY29kZXMpKTsKPiA+ID4gKwlyZXR1cm4gdnNwMV9zdWJkZXZfZW51bV9t YnVzX2NvZGUoc3ViZGV2LCBjZmcsIGNvZGUsIGNsdV9jb2RlcywKPiA+ID4gKwkJCQkJICBBUlJB WV9TSVpFKGNsdV9jb2RlcykpOwo+ID4gPiAKPiA+ID4gIH0KPiA+ID4gIAo+ID4gPiAgc3RhdGlj IGludCBjbHVfZW51bV9mcmFtZV9zaXplKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAo+ID4g PiAKPiA+ID4gQEAgLTE0MSw1MSArMTQxLDEwIEBAIHN0YXRpYyBpbnQgY2x1X3NldF9mb3JtYXQo c3RydWN0IHY0bDJfc3ViZGV2Cj4gPiA+ICpzdWJkZXYsCj4gPiA+IAo+ID4gPiAgCQkJICBzdHJ1 Y3QgdjRsMl9zdWJkZXZfcGFkX2NvbmZpZyAqY2ZnLAo+ID4gPiAgCQkJICBzdHJ1Y3QgdjRsMl9z dWJkZXZfZm9ybWF0ICpmbXQpCj4gPiA+ICAKPiA+ID4gIHsKPiA+ID4gCj4gPiA+IC0Jc3RydWN0 IHZzcDFfY2x1ICpjbHUgPSB0b19jbHUoc3ViZGV2KTsKPiA+ID4gLQlzdHJ1Y3QgdjRsMl9zdWJk ZXZfcGFkX2NvbmZpZyAqY29uZmlnOwo+ID4gPiAtCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQg KmZvcm1hdDsKPiA+ID4gLQlpbnQgcmV0ID0gMDsKPiA+ID4gLQo+ID4gPiAtCW11dGV4X2xvY2so JmNsdS0+ZW50aXR5LmxvY2spOwo+ID4gPiAtCj4gPiA+IC0JY29uZmlnID0gdnNwMV9lbnRpdHlf Z2V0X3BhZF9jb25maWcoJmNsdS0+ZW50aXR5LCBjZmcsIGZtdC0+d2hpY2gpOwo+ID4gPiAtCWlm ICghY29uZmlnKSB7Cj4gPiA+IC0JCXJldCA9IC1FSU5WQUw7Cj4gPiA+IC0JCWdvdG8gZG9uZTsK PiA+ID4gLQl9Cj4gPiA+IC0KPiA+ID4gLQkvKiBEZWZhdWx0IHRvIFlVViBpZiB0aGUgcmVxdWVz dGVkIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAqLwo+ID4gPiAtCWlmIChmbXQtPmZvcm1hdC5j b2RlICE9IE1FRElBX0JVU19GTVRfQVJHQjg4ODhfMVgzMiAmJgo+ID4gPiAtCSAgICBmbXQtPmZv cm1hdC5jb2RlICE9IE1FRElBX0JVU19GTVRfQUhTVjg4ODhfMVgzMiAmJgo+ID4gPiAtCSAgICBm bXQtPmZvcm1hdC5jb2RlICE9IE1FRElBX0JVU19GTVRfQVlVVjhfMVgzMikKPiA+ID4gLQkJZm10 LT5mb3JtYXQuY29kZSA9IE1FRElBX0JVU19GTVRfQVlVVjhfMVgzMjsKPiA+ID4gLQo+ID4gPiAt CWZvcm1hdCA9IHZzcDFfZW50aXR5X2dldF9wYWRfZm9ybWF0KCZjbHUtPmVudGl0eSwgY29uZmln LCBmbXQtPnBhZCk7Cj4gPiA+IC0KPiA+ID4gLQlpZiAoZm10LT5wYWQgPT0gQ0xVX1BBRF9TT1VS Q0UpIHsKPiA+ID4gLQkJLyogVGhlIENMVSBvdXRwdXQgZm9ybWF0IGNhbid0IGJlIG1vZGlmaWVk LiAqLwo+ID4gPiAtCQlmbXQtPmZvcm1hdCA9ICpmb3JtYXQ7Cj4gPiA+IC0JCWdvdG8gZG9uZTsK PiA+ID4gLQl9Cj4gPiA+IC0KPiA+ID4gLQlmb3JtYXQtPmNvZGUgPSBmbXQtPmZvcm1hdC5jb2Rl Owo+ID4gPiAtCWZvcm1hdC0+d2lkdGggPSBjbGFtcF90KHVuc2lnbmVkIGludCwgZm10LT5mb3Jt YXQud2lkdGgsCj4gPiA+IC0JCQkJQ0xVX01JTl9TSVpFLCBDTFVfTUFYX1NJWkUpOwo+ID4gPiAt CWZvcm1hdC0+aGVpZ2h0ID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIGZtdC0+Zm9ybWF0LmhlaWdo dCwKPiA+ID4gLQkJCQkgQ0xVX01JTl9TSVpFLCBDTFVfTUFYX1NJWkUpOwo+ID4gPiAtCWZvcm1h dC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Cj4gPiA+IC0JZm9ybWF0LT5jb2xvcnNwYWNlID0g VjRMMl9DT0xPUlNQQUNFX1NSR0I7Cj4gPiA+IC0KPiA+ID4gLQlmbXQtPmZvcm1hdCA9ICpmb3Jt YXQ7Cj4gPiA+IC0KPiA+ID4gLQkvKiBQcm9wYWdhdGUgdGhlIGZvcm1hdCB0byB0aGUgc291cmNl IHBhZC4gKi8KPiA+ID4gLQlmb3JtYXQgPSB2c3AxX2VudGl0eV9nZXRfcGFkX2Zvcm1hdCgmY2x1 LT5lbnRpdHksIGNvbmZpZywKPiA+ID4gLQkJCQkJICAgIENMVV9QQURfU09VUkNFKTsKPiA+ID4g LQkqZm9ybWF0ID0gZm10LT5mb3JtYXQ7Cj4gPiA+IC0KPiA+ID4gLWRvbmU6Cj4gPiA+IC0JbXV0 ZXhfdW5sb2NrKCZjbHUtPmVudGl0eS5sb2NrKTsKPiA+ID4gLQlyZXR1cm4gcmV0Owo+ID4gPiAr CXJldHVybiB2c3AxX3N1YmRldl9zZXRfcGFkX2Zvcm1hdChzdWJkZXYsIGNmZywgZm10LCBjbHVf Y29kZXMsCj4gPiA+ICsJCQkJCSAgQVJSQVlfU0laRShjbHVfY29kZXMpLAo+ID4gPiArCQkJCQkg IENMVV9NSU5fU0laRSwgQ0xVX01JTl9TSVpFLAo+ID4gPiArCQkJCQkgIENMVV9NQVhfU0laRSwg Q0xVX01BWF9TSVpFKTsKPiA+ID4gCj4gPiA+ICB9Cj4gPiA+ICAKPiA+ID4gIC8qCj4gPiA+ICAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQo+ID4gPiAgLQo+ID4gPiAgLS0tLS0+Cj4gPiA+IAo+ID4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZW50aXR5LmMKPiA+ID4gYi9k cml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9lbnRpdHkuYyBpbmRleAo+ID4gPiA3MjM1 NGNhZjU3NDYuLjIzOWRmMDQ3ZWZkMCAxMDA2NDQKPiA+ID4gLS0tIGEvZHJpdmVycy9tZWRpYS9w bGF0Zm9ybS92c3AxL3ZzcDFfZW50aXR5LmMKPiA+ID4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS92c3AxL3ZzcDFfZW50aXR5LmMKPiA+ID4gQEAgLTMwNyw2ICszMDcsODEgQEAgaW50IHZz cDFfc3ViZGV2X2VudW1fZnJhbWVfc2l6ZShzdHJ1Y3QgdjRsMl9zdWJkZXYKPiA+ID4gKnN1YmRl diw+Cj4gPiA+IAo+ID4gPiAgCXJldHVybiByZXQ7Cj4gPiA+ICAKPiA+ID4gIH0KPiA+ID4gCj4g PiA+ICsvKgo+ID4gPiArICogdnNwMV9zdWJkZXZfc2V0X3BhZF9mb3JtYXQgLSBTdWJkZXYgcGFk IHNldF9mbXQgaGFuZGxlcgo+ID4gPiArICogQHN1YmRldjogVjRMMiBzdWJkZXZpY2UKPiA+ID4g KyAqIEBjZmc6IFY0TDIgc3ViZGV2IHBhZCBjb25maWd1cmF0aW9uCj4gPiA+ICsgKiBAZm10OiBW NEwyIHN1YmRldiBmb3JtYXQKPiA+ID4gKyAqIEBjb2RlczogQXJyYXkgb2Ygc3VwcG9ydGVkIG1l ZGlhIGJ1cyBjb2Rlcwo+ID4gPiArICogQG5jb2RlczogTnVtYmVyIG9mIHN1cHBvcnRlZCBtZWRp YSBidXMgY29kZXMKPiA+ID4gKyAqIEBtaW5fd2lkdGg6IE1pbmltdW0gaW1hZ2Ugd2lkdGgKPiA+ ID4gKyAqIEBtaW5faGVpZ2h0OiBNaW5pbXVtIGltYWdlIGhlaWdodAo+ID4gPiArICogQG1heF93 aWR0aDogTWF4aW11bSBpbWFnZSB3aWR0aAo+ID4gPiArICogQG1heF9oZWlnaHQ6IE1heGltdW0g aW1hZ2UgaGVpZ2h0Cj4gPiA+ICsgKgo+ID4gPiArICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRz IHRoZSBzdWJkZXYgc2V0X2ZtdCBwYWQgb3BlcmF0aW9uIGZvcgo+ID4gPiBlbnRpdGllcwo+ID4g PiB0aGF0Cj4gPiA+ICsgKiBkbyBub3Qgc3VwcG9ydCBzY2FsaW5nIG9yIGNyb3BwaW5nLiBJdCBk ZWZhdWx0cyB0byB0aGUgZmlyc3QKPiA+ID4gc3VwcGxpZWQKPiA+ID4gbWVkaWEKPiA+ID4gKyAq IGJ1cyBjb2RlIGlmIHRoZSByZXF1ZXN0ZWQgY29kZSBpc24ndCBzdXBwb3J0ZWQsIGNsYW1wcyB0 aGUgc2l6ZSB0bwo+ID4gPiB0aGUKPiA+ID4gKyAqIHN1cHBsaWVkIG1pbmltdW0gYW5kIG1heGlt dW0sIGFuZCBwcm9wYWdhdGVzIHRoZSBzaW5rIHBhZCBmb3JtYXQgdG8KPiA+ID4gdGhlCj4gPiA+ ICsgKiBzb3VyY2UgcGFkLgo+ID4gPiArICovCj4gPiA+ICtpbnQgdnNwMV9zdWJkZXZfc2V0X3Bh ZF9mb3JtYXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCj4gPiA+ICsJCQkgICAgICAgc3Ry dWN0IHY0bDJfc3ViZGV2X3BhZF9jb25maWcgKmNmZywKPiA+ID4gKwkJCSAgICAgICBzdHJ1Y3Qg djRsMl9zdWJkZXZfZm9ybWF0ICpmbXQsCj4gPiA+ICsJCQkgICAgICAgY29uc3QgdW5zaWduZWQg aW50ICpjb2RlcywgdW5zaWduZWQgaW50IG5jb2RlcywKPiA+ID4gKwkJCSAgICAgICB1bnNpZ25l ZCBpbnQgbWluX3dpZHRoLCB1bnNpZ25lZCBpbnQgbWluX2hlaWdodCwKPiA+ID4gKwkJCSAgICAg ICB1bnNpZ25lZCBpbnQgbWF4X3dpZHRoLCB1bnNpZ25lZCBpbnQgbWF4X2hlaWdodCkKPiA+ID4g K3sKPiA+ID4gKwlzdHJ1Y3QgdnNwMV9lbnRpdHkgKmVudGl0eSA9IHRvX3ZzcDFfZW50aXR5KHN1 YmRldik7Cj4gPiA+ICsJc3RydWN0IHY0bDJfc3ViZGV2X3BhZF9jb25maWcgKmNvbmZpZzsKPiA+ ID4gKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmb3JtYXQ7Cj4gPiA+ICsJdW5zaWduZWQg aW50IGk7Cj4gPiA+ICsJaW50IHJldCA9IDA7Cj4gPiA+ICsKPiA+ID4gKwltdXRleF9sb2NrKCZl bnRpdHktPmxvY2spOwo+ID4gPiArCj4gPiA+ICsJY29uZmlnID0gdnNwMV9lbnRpdHlfZ2V0X3Bh ZF9jb25maWcoZW50aXR5LCBjZmcsIGZtdC0+d2hpY2gpOwo+ID4gPiArCWlmICghY29uZmlnKSB7 Cj4gPiA+ICsJCXJldCA9IC1FSU5WQUw7Cj4gPiA+ICsJCWdvdG8gZG9uZTsKPiA+ID4gKwl9Cj4g PiA+ICsKPiA+ID4gKwlmb3JtYXQgPSB2c3AxX2VudGl0eV9nZXRfcGFkX2Zvcm1hdChlbnRpdHks IGNvbmZpZywgZm10LT5wYWQpOwo+ID4gPiArCj4gPiA+ICsJaWYgKGZtdC0+cGFkICE9IDApIHsK PiA+IAo+ID4gSSBndWVzcyB3ZSBkb24ndCBoYXZlIGFueSBjbGVhciB3YXkgdG8gc2F5ICE9ICpf UEFEX1NJTksgaGVyZSBkbyB3ZSAuLgo+ID4gCj4gPiA+ICsJCS8qIFRoZSBvdXRwdXQgZm9ybWF0 IGNhbid0IGJlIG1vZGlmaWVkLiAqLwo+ID4gPiArCQlmbXQtPmZvcm1hdCA9ICpmb3JtYXQ7Cj4g PiA+ICsJCWdvdG8gZG9uZTsKPiA+ID4gKwl9Cj4gPiA+ICsKPiA+ID4gKwkvKgo+ID4gPiArCSAq IERlZmF1bHQgdG8gdGhlIGZpcnN0IG1lZGlhIGJ1cyBjb2RlIGlmIHRoZSByZXF1ZXN0ZWQgZm9y bWF0IGlzIApub3QKPiA+ID4gKwkgKiBzdXBwb3J0ZWQuCj4gPiA+ICsJICovCj4gPiA+ICsJZm9y IChpID0gMDsgaSA8IG5jb2RlczsgKytpKSB7Cj4gPiA+ICsJCWlmIChmbXQtPmZvcm1hdC5jb2Rl ID09IGNvZGVzW2ldKQo+ID4gPiArCQkJYnJlYWs7Cj4gPiA+ICsJfQo+ID4gPiArCj4gPiA+ICsJ Zm9ybWF0LT5jb2RlID0gaSA8IG5jb2RlcyA/IGNvZGVzW2ldIDogY29kZXNbMF07Cj4gPiA+ICsJ Zm9ybWF0LT53aWR0aCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBmbXQtPmZvcm1hdC53aWR0aCwK PiA+ID4gKwkJCQltaW5fd2lkdGgsIG1heF93aWR0aCk7Cj4gPiA+ICsJZm9ybWF0LT5oZWlnaHQg PSBjbGFtcF90KHVuc2lnbmVkIGludCwgZm10LT5mb3JtYXQuaGVpZ2h0LAo+ID4gPiArCQkJCSBt aW5faGVpZ2h0LCBtYXhfaGVpZ2h0KTsKPiA+ID4gKwlmb3JtYXQtPmZpZWxkID0gVjRMMl9GSUVM RF9OT05FOwo+ID4gPiArCWZvcm1hdC0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdC Owo+ID4gPiArCj4gPiA+ICsJZm10LT5mb3JtYXQgPSAqZm9ybWF0Owo+ID4gPiArCj4gPiA+ICsJ LyogUHJvcGFnYXRlIHRoZSBmb3JtYXQgdG8gdGhlIHNvdXJjZSBwYWQuICovCj4gPiA+ICsJZm9y bWF0ID0gdnNwMV9lbnRpdHlfZ2V0X3BhZF9mb3JtYXQoZW50aXR5LCBjb25maWcsIDEpOwo+ID4g Cj4gPiBJZiB3ZSBjYW4gZ3VhcmFudGVlIHRoYXQgRU5USVRZX1BBRF9TSU5LID09IDAgYW5kIEVO VElUWV9QQURfU09VUkNFID09IDEsCj4gPiBjYW4gd2UgcHV0IHRob3NlIGludG8gYW4gZW51bSA/ Cj4gPiAKPiA+ID4gKwkqZm9ybWF0ID0gZm10LT5mb3JtYXQ7Cj4gPiA+ICsKPiA+ID4gK2RvbmU6 Cj4gPiA+ICsJbXV0ZXhfdW5sb2NrKCZlbnRpdHktPmxvY2spOwo+ID4gPiArCXJldHVybiByZXQ7 Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gCj4gPiA+ICAvKgo+ID4gPiAgLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K PiA+ID4gIC0KPiA+ID4gIC0tLS0tPgo+ID4gPiAgCj4gPiA+ICAgKiBNZWRpYSBPcGVyYXRpb25z Cj4gPiA+ICAgKi8KPiA+ID4gCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRm b3JtL3ZzcDEvdnNwMV9lbnRpdHkuaAo+ID4gPiBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNw MS92c3AxX2VudGl0eS5oIGluZGV4Cj4gPiA+IGZiMjBhMTU3OGYzYi4uMDgzOWE2MmNmYTcxIDEw MDY0NAo+ID4gPiAtLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9lbnRpdHku aAo+ID4gPiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9lbnRpdHkuaAo+ ID4gPiBAQCAtMTYwLDYgKzE2MCwxMiBAQCBzdHJ1Y3QgbWVkaWFfcGFkICp2c3AxX2VudGl0eV9y ZW1vdGVfcGFkKHN0cnVjdAo+ID4gPiBtZWRpYV9wYWQgKnBhZCk7Pgo+ID4gPiAKPiA+ID4gIGlu dCB2c3AxX3N1YmRldl9nZXRfcGFkX2Zvcm1hdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwK PiA+ID4gIAo+ID4gPiAgCQkJICAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9wYWRfY29uZmlnICpj ZmcsCj4gPiA+ICAJCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm10KTsKPiA+ ID4gCj4gPiA+ICtpbnQgdnNwMV9zdWJkZXZfc2V0X3BhZF9mb3JtYXQoc3RydWN0IHY0bDJfc3Vi ZGV2ICpzdWJkZXYsCj4gPiA+ICsJCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X3BhZF9jb25m aWcgKmNmZywKPiA+ID4gKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQs Cj4gPiA+ICsJCQkgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICpjb2RlcywgdW5zaWduZWQgaW50 IG5jb2RlcywKPiA+ID4gKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWluX3dpZHRoLCB1bnNpZ25l ZCBpbnQgbWluX2hlaWdodCwKPiA+ID4gKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF4X3dpZHRo LCB1bnNpZ25lZCBpbnQgbWF4X2hlaWdodCk7Cj4gPiA+IAo+ID4gPiAgaW50IHZzcDFfc3ViZGV2 X2VudW1fbWJ1c19jb2RlKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAo+ID4gPiAgCj4gPiA+ ICAJCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X3BhZF9jb25maWcgKmNmZywKPiA+ID4gIAkJ CSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0gKmNvZGUsCj4gPiA+IAo+ ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfbGlmLmMK PiA+ID4gYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9saWYuYyBpbmRleAo+ID4g PiBiMjBiODQyZjA2YmEuLmZiZGQ1NzE1ZjgyOQo+ID4gPiAxMDA2NDQKPiA+ID4gLS0tIGEvZHJp dmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfbGlmLmMKPiA+ID4gKysrIGIvZHJpdmVycy9t ZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfbGlmLmMKPiA+ID4gQEAgLTMzLDE3ICszMywxNyBAQCBz dGF0aWMgaW5saW5lIHZvaWQgdnNwMV9saWZfd3JpdGUoc3RydWN0IHZzcDFfbGlmCj4gPiA+ICps aWYsIHN0cnVjdCB2c3AxX2RsX2xpc3QgKmRsLD4KPiA+ID4gCj4gPiA+ICAgKiBWNEwyIFN1YmRl dmljZSBPcGVyYXRpb25zCj4gPiA+ICAgKi8KPiA+ID4gCj4gPiA+ICtzdGF0aWMgY29uc3QgdW5z aWduZWQgaW50IGxpZl9jb2Rlc1tdID0gewo+ID4gPiArCU1FRElBX0JVU19GTVRfQVJHQjg4ODhf MVgzMiwKPiA+ID4gKwlNRURJQV9CVVNfRk1UX0FZVVY4XzFYMzIsCj4gPiA+ICt9Owo+ID4gPiAr Cj4gPiA+IAo+ID4gPiAgc3RhdGljIGludCBsaWZfZW51bV9tYnVzX2NvZGUoc3RydWN0IHY0bDJf c3ViZGV2ICpzdWJkZXYsCj4gPiA+ICAKPiA+ID4gIAkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRl dl9wYWRfY29uZmlnICpjZmcsCj4gPiA+ICAJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfbWJ1 c19jb2RlX2VudW0gKmNvZGUpCj4gPiA+ICAKPiA+ID4gIHsKPiA+ID4gCj4gPiA+IC0Jc3RhdGlj IGNvbnN0IHVuc2lnbmVkIGludCBjb2Rlc1tdID0gewo+ID4gPiAtCQlNRURJQV9CVVNfRk1UX0FS R0I4ODg4XzFYMzIsCj4gPiA+IC0JCU1FRElBX0JVU19GTVRfQVlVVjhfMVgzMiwKPiA+ID4gLQl9 Owo+ID4gPiAtCj4gPiA+IC0JcmV0dXJuIHZzcDFfc3ViZGV2X2VudW1fbWJ1c19jb2RlKHN1YmRl diwgY2ZnLCBjb2RlLCBjb2RlcywKPiA+ID4gLQkJCQkJICBBUlJBWV9TSVpFKGNvZGVzKSk7Cj4g PiA+ICsJcmV0dXJuIHZzcDFfc3ViZGV2X2VudW1fbWJ1c19jb2RlKHN1YmRldiwgY2ZnLCBjb2Rl LCBsaWZfY29kZXMsCj4gPiA+ICsJCQkJCSAgQVJSQVlfU0laRShsaWZfY29kZXMpKTsKPiA+ID4g Cj4gPiA+ICB9Cj4gPiA+ICAKPiA+ID4gIHN0YXRpYyBpbnQgbGlmX2VudW1fZnJhbWVfc2l6ZShz dHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKPiA+ID4gCj4gPiA+IEBAIC01OSw1MyArNTksMTAg QEAgc3RhdGljIGludCBsaWZfc2V0X2Zvcm1hdChzdHJ1Y3QgdjRsMl9zdWJkZXYKPiA+ID4gKnN1 YmRldiwKPiA+ID4gCj4gPiA+ICAJCQkgIHN0cnVjdCB2NGwyX3N1YmRldl9wYWRfY29uZmlnICpj ZmcsCj4gPiA+ICAJCQkgIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgKmZtdCkKPiA+ID4gIAo+ ID4gPiAgewo+ID4gPiAKPiA+ID4gLQlzdHJ1Y3QgdnNwMV9saWYgKmxpZiA9IHRvX2xpZihzdWJk ZXYpOwo+ID4gPiAtCXN0cnVjdCB2NGwyX3N1YmRldl9wYWRfY29uZmlnICpjb25maWc7Cj4gPiA+ IC0Jc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0Owo+ID4gPiAtCWludCByZXQgPSAw Owo+ID4gPiAtCj4gPiA+IC0JbXV0ZXhfbG9jaygmbGlmLT5lbnRpdHkubG9jayk7Cj4gPiA+IC0K PiA+ID4gLQljb25maWcgPSB2c3AxX2VudGl0eV9nZXRfcGFkX2NvbmZpZygmbGlmLT5lbnRpdHks IGNmZywgZm10LT53aGljaCk7Cj4gPiA+IC0JaWYgKCFjb25maWcpIHsKPiA+ID4gLQkJcmV0ID0g LUVJTlZBTDsKPiA+ID4gLQkJZ290byBkb25lOwo+ID4gPiAtCX0KPiA+ID4gLQo+ID4gPiAtCS8q IERlZmF1bHQgdG8gWVVWIGlmIHRoZSByZXF1ZXN0ZWQgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQu ICovCj4gPiA+IC0JaWYgKGZtdC0+Zm9ybWF0LmNvZGUgIT0gTUVESUFfQlVTX0ZNVF9BUkdCODg4 OF8xWDMyICYmCj4gPiA+IC0JICAgIGZtdC0+Zm9ybWF0LmNvZGUgIT0gTUVESUFfQlVTX0ZNVF9B WVVWOF8xWDMyKQo+ID4gPiAtCQlmbXQtPmZvcm1hdC5jb2RlID0gTUVESUFfQlVTX0ZNVF9BWVVW OF8xWDMyOwo+ID4gPiAtCj4gPiA+IC0JZm9ybWF0ID0gdnNwMV9lbnRpdHlfZ2V0X3BhZF9mb3Jt YXQoJmxpZi0+ZW50aXR5LCBjb25maWcsIGZtdC0+cGFkKTsKPiA+ID4gLQo+ID4gPiAtCWlmIChm bXQtPnBhZCA9PSBMSUZfUEFEX1NPVVJDRSkgewo+ID4gPiAtCQkvKgo+ID4gPiAtCQkgKiBUaGUg TElGIHNvdXJjZSBmb3JtYXQgaXMgYWx3YXlzIGlkZW50aWNhbCB0byBpdHMgc2luawo+ID4gPiAt CQkgKiBmb3JtYXQuCj4gPiA+IC0JCSAqLwo+ID4gPiAtCQlmbXQtPmZvcm1hdCA9ICpmb3JtYXQ7 Cj4gPiA+IC0JCWdvdG8gZG9uZTsKPiA+ID4gLQl9Cj4gPiA+IC0KPiA+ID4gLQlmb3JtYXQtPmNv ZGUgPSBmbXQtPmZvcm1hdC5jb2RlOwo+ID4gPiAtCWZvcm1hdC0+d2lkdGggPSBjbGFtcF90KHVu c2lnbmVkIGludCwgZm10LT5mb3JtYXQud2lkdGgsCj4gPiA+IC0JCQkJTElGX01JTl9TSVpFLCBM SUZfTUFYX1NJWkUpOwo+ID4gPiAtCWZvcm1hdC0+aGVpZ2h0ID0gY2xhbXBfdCh1bnNpZ25lZCBp bnQsIGZtdC0+Zm9ybWF0LmhlaWdodCwKPiA+ID4gLQkJCQkgTElGX01JTl9TSVpFLCBMSUZfTUFY X1NJWkUpOwo+ID4gPiAtCWZvcm1hdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Cj4gPiA+IC0J Zm9ybWF0LT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7Cj4gPiA+IC0KPiA+ID4g LQlmbXQtPmZvcm1hdCA9ICpmb3JtYXQ7Cj4gPiA+IC0KPiA+ID4gLQkvKiBQcm9wYWdhdGUgdGhl IGZvcm1hdCB0byB0aGUgc291cmNlIHBhZC4gKi8KPiA+ID4gLQlmb3JtYXQgPSB2c3AxX2VudGl0 eV9nZXRfcGFkX2Zvcm1hdCgmbGlmLT5lbnRpdHksIGNvbmZpZywKPiA+ID4gLQkJCQkJICAgIExJ Rl9QQURfU09VUkNFKTsKPiA+ID4gLQkqZm9ybWF0ID0gZm10LT5mb3JtYXQ7Cj4gPiA+IC0KPiA+ ID4gLWRvbmU6Cj4gPiA+IC0JbXV0ZXhfdW5sb2NrKCZsaWYtPmVudGl0eS5sb2NrKTsKPiA+ID4g LQlyZXR1cm4gcmV0Owo+ID4gPiArCXJldHVybiB2c3AxX3N1YmRldl9zZXRfcGFkX2Zvcm1hdChz dWJkZXYsIGNmZywgZm10LCBsaWZfY29kZXMsCj4gPiA+ICsJCQkJCSAgQVJSQVlfU0laRShsaWZf Y29kZXMpLAo+ID4gPiArCQkJCQkgIExJRl9NSU5fU0laRSwgTElGX01JTl9TSVpFLAo+ID4gPiAr CQkJCQkgIExJRl9NQVhfU0laRSwgTElGX01BWF9TSVpFKTsKPiA+ID4gCj4gPiA+ICB9Cj4gPiA+ ICAKPiA+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfcGFkX29wcyBsaWZfcGFk X29wcyA9IHsKPiA+ID4gCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3Jt L3ZzcDEvdnNwMV9sdXQuYwo+ID4gPiBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3Ax X2x1dC5jIGluZGV4Cj4gPiA+IDdiZGFiYjMxMWM2Yy4uZjJlNDhhMDJjYTdkCj4gPiA+IDEwMDY0 NAo+ID4gPiAtLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9sdXQuYwo+ID4g PiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9sdXQuYwo+ID4gPiBAQCAt OTAsMTggKzkwLDE4IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZwo+ID4g PiBsdXRfdGFibGVfY29udHJvbAo+ID4gPiA9IHs+Cj4gPiA+IAo+ID4gPiAgICogVjRMMiBTdWJk ZXZpY2UgUGFkIE9wZXJhdGlvbnMKPiA+ID4gICAqLwo+ID4gPiAKPiA+ID4gK3N0YXRpYyBjb25z dCB1bnNpZ25lZCBpbnQgbHV0X2NvZGVzW10gPSB7Cj4gPiA+ICsJTUVESUFfQlVTX0ZNVF9BUkdC ODg4OF8xWDMyLAo+ID4gPiArCU1FRElBX0JVU19GTVRfQUhTVjg4ODhfMVgzMiwKPiA+ID4gKwlN RURJQV9CVVNfRk1UX0FZVVY4XzFYMzIsCj4gPiA+ICt9Owo+ID4gPiArCj4gPiA+IAo+ID4gPiAg c3RhdGljIGludCBsdXRfZW51bV9tYnVzX2NvZGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYs Cj4gPiA+ICAKPiA+ID4gIAkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9wYWRfY29uZmlnICpj ZmcsCj4gPiA+ICAJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0gKmNv ZGUpCj4gPiA+ICAKPiA+ID4gIHsKPiA+ID4gCj4gPiA+IC0Jc3RhdGljIGNvbnN0IHVuc2lnbmVk IGludCBjb2Rlc1tdID0gewo+ID4gPiAtCQlNRURJQV9CVVNfRk1UX0FSR0I4ODg4XzFYMzIsCj4g PiA+IC0JCU1FRElBX0JVU19GTVRfQUhTVjg4ODhfMVgzMiwKPiA+ID4gLQkJTUVESUFfQlVTX0ZN VF9BWVVWOF8xWDMyLAo+ID4gPiAtCX07Cj4gPiA+IC0KPiA+ID4gLQlyZXR1cm4gdnNwMV9zdWJk ZXZfZW51bV9tYnVzX2NvZGUoc3ViZGV2LCBjZmcsIGNvZGUsIGNvZGVzLAo+ID4gPiAtCQkJCQkg IEFSUkFZX1NJWkUoY29kZXMpKTsKPiA+ID4gKwlyZXR1cm4gdnNwMV9zdWJkZXZfZW51bV9tYnVz X2NvZGUoc3ViZGV2LCBjZmcsIGNvZGUsIGx1dF9jb2RlcywKPiA+ID4gKwkJCQkJICBBUlJBWV9T SVpFKGx1dF9jb2RlcykpOwo+ID4gPiAKPiA+ID4gIH0KPiA+ID4gIAo+ID4gPiAgc3RhdGljIGlu dCBsdXRfZW51bV9mcmFtZV9zaXplKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAo+ID4gPiAK PiA+ID4gQEAgLTExNyw1MSArMTE3LDEwIEBAIHN0YXRpYyBpbnQgbHV0X3NldF9mb3JtYXQoc3Ry dWN0IHY0bDJfc3ViZGV2Cj4gPiA+ICpzdWJkZXYsCj4gPiA+IAo+ID4gPiAgCQkJICBzdHJ1Y3Qg djRsMl9zdWJkZXZfcGFkX2NvbmZpZyAqY2ZnLAo+ID4gPiAgCQkJICBzdHJ1Y3QgdjRsMl9zdWJk ZXZfZm9ybWF0ICpmbXQpCj4gPiA+ICAKPiA+ID4gIHsKPiA+ID4gCj4gPiA+IC0Jc3RydWN0IHZz cDFfbHV0ICpsdXQgPSB0b19sdXQoc3ViZGV2KTsKPiA+ID4gLQlzdHJ1Y3QgdjRsMl9zdWJkZXZf cGFkX2NvbmZpZyAqY29uZmlnOwo+ID4gPiAtCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZv cm1hdDsKPiA+ID4gLQlpbnQgcmV0ID0gMDsKPiA+ID4gLQo+ID4gPiAtCW11dGV4X2xvY2soJmx1 dC0+ZW50aXR5LmxvY2spOwo+ID4gPiAtCj4gPiA+IC0JY29uZmlnID0gdnNwMV9lbnRpdHlfZ2V0 X3BhZF9jb25maWcoJmx1dC0+ZW50aXR5LCBjZmcsIGZtdC0+d2hpY2gpOwo+ID4gPiAtCWlmICgh Y29uZmlnKSB7Cj4gPiA+IC0JCXJldCA9IC1FSU5WQUw7Cj4gPiA+IC0JCWdvdG8gZG9uZTsKPiA+ ID4gLQl9Cj4gPiA+IC0KPiA+ID4gLQkvKiBEZWZhdWx0IHRvIFlVViBpZiB0aGUgcmVxdWVzdGVk IGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAqLwo+ID4gPiAtCWlmIChmbXQtPmZvcm1hdC5jb2Rl ICE9IE1FRElBX0JVU19GTVRfQVJHQjg4ODhfMVgzMiAmJgo+ID4gPiAtCSAgICBmbXQtPmZvcm1h dC5jb2RlICE9IE1FRElBX0JVU19GTVRfQUhTVjg4ODhfMVgzMiAmJgo+ID4gPiAtCSAgICBmbXQt PmZvcm1hdC5jb2RlICE9IE1FRElBX0JVU19GTVRfQVlVVjhfMVgzMikKPiA+ID4gLQkJZm10LT5m b3JtYXQuY29kZSA9IE1FRElBX0JVU19GTVRfQVlVVjhfMVgzMjsKPiA+ID4gLQo+ID4gPiAtCWZv cm1hdCA9IHZzcDFfZW50aXR5X2dldF9wYWRfZm9ybWF0KCZsdXQtPmVudGl0eSwgY29uZmlnLCBm bXQtPnBhZCk7Cj4gPiA+IC0KPiA+ID4gLQlpZiAoZm10LT5wYWQgPT0gTFVUX1BBRF9TT1VSQ0Up IHsKPiA+ID4gLQkJLyogVGhlIExVVCBvdXRwdXQgZm9ybWF0IGNhbid0IGJlIG1vZGlmaWVkLiAq Lwo+ID4gPiAtCQlmbXQtPmZvcm1hdCA9ICpmb3JtYXQ7Cj4gPiA+IC0JCWdvdG8gZG9uZTsKPiA+ ID4gLQl9Cj4gPiA+IC0KPiA+ID4gLQlmb3JtYXQtPmNvZGUgPSBmbXQtPmZvcm1hdC5jb2RlOwo+ ID4gPiAtCWZvcm1hdC0+d2lkdGggPSBjbGFtcF90KHVuc2lnbmVkIGludCwgZm10LT5mb3JtYXQu d2lkdGgsCj4gPiA+IC0JCQkJTFVUX01JTl9TSVpFLCBMVVRfTUFYX1NJWkUpOwo+ID4gPiAtCWZv cm1hdC0+aGVpZ2h0ID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIGZtdC0+Zm9ybWF0LmhlaWdodCwK PiA+ID4gLQkJCQkgTFVUX01JTl9TSVpFLCBMVVRfTUFYX1NJWkUpOwo+ID4gPiAtCWZvcm1hdC0+ ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Cj4gPiA+IC0JZm9ybWF0LT5jb2xvcnNwYWNlID0gVjRM Ml9DT0xPUlNQQUNFX1NSR0I7Cj4gPiA+IC0KPiA+ID4gLQlmbXQtPmZvcm1hdCA9ICpmb3JtYXQ7 Cj4gPiA+IC0KPiA+ID4gLQkvKiBQcm9wYWdhdGUgdGhlIGZvcm1hdCB0byB0aGUgc291cmNlIHBh ZC4gKi8KPiA+ID4gLQlmb3JtYXQgPSB2c3AxX2VudGl0eV9nZXRfcGFkX2Zvcm1hdCgmbHV0LT5l bnRpdHksIGNvbmZpZywKPiA+ID4gLQkJCQkJICAgIExVVF9QQURfU09VUkNFKTsKPiA+ID4gLQkq Zm9ybWF0ID0gZm10LT5mb3JtYXQ7Cj4gPiA+IC0KPiA+ID4gLWRvbmU6Cj4gPiA+IC0JbXV0ZXhf dW5sb2NrKCZsdXQtPmVudGl0eS5sb2NrKTsKPiA+ID4gLQlyZXR1cm4gcmV0Owo+ID4gPiArCXJl dHVybiB2c3AxX3N1YmRldl9zZXRfcGFkX2Zvcm1hdChzdWJkZXYsIGNmZywgZm10LCBsdXRfY29k ZXMsCj4gPiA+ICsJCQkJCSAgQVJSQVlfU0laRShsdXRfY29kZXMpLAo+ID4gPiArCQkJCQkgIExV VF9NSU5fU0laRSwgTFVUX01JTl9TSVpFLAo+ID4gPiArCQkJCQkgIExVVF9NQVhfU0laRSwgTFVU X01BWF9TSVpFKTsKPiA+ID4gCj4gPiA+ICB9Cj4gPiA+ICAKPiA+ID4gIC8qCj4gPiA+ICAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQo+ID4gPiAgLQo+ID4gPiAgLS0tLS0KCgotLSAKUmVnYXJkcywKCkxhdXJlbnQg UGluY2hhcnQKCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs Cg==