dhre-ui-kit 0.0.116 → 0.0.118

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.d.ts CHANGED
@@ -352,11 +352,14 @@ interface AccordionProps {
352
352
  optionalElement?: () => React$1.ReactNode;
353
353
  headerComponent?: () => React$1.ReactNode;
354
354
  disabled?: boolean;
355
+ icon: React$1.ReactElement;
355
356
  }
356
357
 
357
- declare const Accordion: ({ title, testId, containerStyle, titleStyle, headerStyle, children, isOpen, onToggle, optionalElement, headerComponent, disabled, }: AccordionProps) => React$1.JSX.Element;
358
+ declare const Accordion: ({ title, testId, containerStyle, titleStyle, headerStyle, children, isOpen, onToggle, optionalElement, headerComponent, disabled, icon, }: AccordionProps) => React$1.JSX.Element;
358
359
 
359
360
  interface ToastProps {
361
+ sucessIcon: React$1.ReactElement;
362
+ errorIcon: React$1.ReactElement;
360
363
  }
361
364
  interface ToastRef {
362
365
  showToast: (message: string, duration?: number, isSuccess?: boolean, buttonText?: string | null, buttonAction?: (() => void) | null) => void;
@@ -382,6 +385,7 @@ interface CustomSearchBarProps extends TextInputProps {
382
385
  onSearchIconPress?: () => void;
383
386
  onCrossIconPress?: () => void;
384
387
  handleOnChangeText?: (text: string) => void;
388
+ searchIcon: React.ReactElement;
385
389
  rightIcon?: React.ReactElement;
386
390
  disableBorderColor?: string;
387
391
  disablePlaceHolderStyle?: string;
@@ -391,7 +395,7 @@ interface CustomSearchBarProps extends TextInputProps {
391
395
  value: string | undefined;
392
396
  }
393
397
 
394
- declare const CustomSearchBar: ({ value, height, disabled, testID, inputContainerStyle, searchIconStyle, crossIconStyle, inputStyle, onSearchIconPress, onCrossIconPress, handleOnChangeText, setValue, rightIcon, disableBorderColor, borderColor, disablePlaceHolderStyle, enablePlaceHolderStyle, ...props }: CustomSearchBarProps) => React$1.JSX.Element;
398
+ declare const CustomSearchBar: ({ value, height, disabled, testID, inputContainerStyle, searchIconStyle, crossIconStyle, inputStyle, onSearchIconPress, onCrossIconPress, handleOnChangeText, setValue, searchIcon, rightIcon, disableBorderColor, borderColor, disablePlaceHolderStyle, enablePlaceHolderStyle, ...props }: CustomSearchBarProps) => React$1.JSX.Element;
395
399
 
396
400
  interface CustomHeaderProps {
397
401
  title: string;
@@ -518,6 +522,7 @@ declare const _default$5: (props: OurOfficesButtonProps) => React$1.JSX.Element;
518
522
 
519
523
  interface NotificationBandgeProps {
520
524
  notificationCount?: number;
525
+ icon: React$1.ReactElement;
521
526
  }
522
527
 
523
528
  declare const NotificationBandge: React$1.FC<NotificationBandgeProps>;
@@ -651,6 +656,9 @@ interface CustomDocumentPickerProps {
651
656
  containerStyle?: ViewStyle;
652
657
  titleStyle?: TextStyle;
653
658
  hintStyle?: TextStyle;
659
+ fileIcon: React$1.ReactElement;
660
+ uploadIcon: React$1.ReactElement;
661
+ deleteIcon: React$1.ReactElement;
654
662
  }
655
663
 
656
664
  declare const _default$3: (props: CustomDocumentPickerProps) => React$1.JSX.Element;
@@ -680,6 +688,7 @@ interface IProps {
680
688
  showStepCount?: boolean;
681
689
  showStatus?: boolean;
682
690
  data: IData[];
691
+ completedStatusIcon: React$1.ReactElement;
683
692
  }
684
693
 
685
694
  declare const _default$1: (props: IProps) => React$1.JSX.Element;
@@ -687,6 +696,7 @@ declare const _default$1: (props: IProps) => React$1.JSX.Element;
687
696
  interface CustomSlideButtonProps {
688
697
  label?: string;
689
698
  onComplete?: () => void;
699
+ icon: React$1.ReactElement;
690
700
  }
691
701
 
692
702
  declare const _default: (props: CustomSlideButtonProps) => React$1.JSX.Element;
package/lib/index.js CHANGED
@@ -39,7 +39,6 @@ function _interopNamespace(e) {
39
39
  }
40
40
 
41
41
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
42
- var React__namespace = /*#__PURE__*/_interopNamespace(React);
43
42
  var Tooltip__default = /*#__PURE__*/_interopDefaultLegacy(Tooltip);
44
43
  var Pdf__default = /*#__PURE__*/_interopDefaultLegacy(Pdf);
45
44
  var Progress__namespace = /*#__PURE__*/_interopNamespace(Progress);
@@ -651,65 +650,6 @@ const styles$B = reactNative.StyleSheet.create({
651
650
  rightIconStyle: { marginLeft: 8 }
652
651
  });
653
652
 
654
- var _path$2;
655
- function _extends$3() { return _extends$3 = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends$3.apply(null, arguments); }
656
- var SvgCrossIcon = function SvgCrossIcon(props) {
657
- return /*#__PURE__*/React__namespace.createElement("svg", _extends$3({
658
- xmlns: "http://www.w3.org/2000/svg",
659
- width: 24,
660
- height: 25,
661
- fill: "none"
662
- }, props), _path$2 || (_path$2 = /*#__PURE__*/React__namespace.createElement("path", {
663
- fill: "#fff",
664
- d: "M17.657 8.032a.686.686 0 0 0-.97-.97L12 11.749 7.313 7.062a.686.686 0 1 0-.97.97l4.687 4.687-4.687 4.687a.686.686 0 1 0 .97.97L12 13.688l4.687 4.688a.686.686 0 1 0 .97-.97l-4.687-4.687z"
665
- })));
666
- };
667
-
668
- function _extends$2() { return _extends$2 = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends$2.apply(null, arguments); }
669
- var SvgCaretLeft = function SvgCaretLeft(props) {
670
- return /*#__PURE__*/React__namespace.createElement("svg", _extends$2({
671
- xmlns: "http://www.w3.org/2000/svg",
672
- width: 24,
673
- height: 24,
674
- fill: "none"
675
- }, props));
676
- };
677
-
678
- var _path$1, _path2;
679
- function _extends$1() { return _extends$1 = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends$1.apply(null, arguments); }
680
- var SvgDotsThreeVertical = function SvgDotsThreeVertical(props) {
681
- return /*#__PURE__*/React__namespace.createElement("svg", _extends$1({
682
- xmlns: "http://www.w3.org/2000/svg",
683
- width: 24,
684
- height: 24,
685
- fill: "none"
686
- }, props), _path$1 || (_path$1 = /*#__PURE__*/React__namespace.createElement("path", {
687
- fill: "#fff",
688
- stroke: "#fff",
689
- strokeWidth: 0.125,
690
- d: "M13.438 6a1.438 1.438 0 1 1-2.876 0 1.438 1.438 0 0 1 2.876 0ZM13.438 12a1.438 1.438 0 1 1-2.876 0 1.438 1.438 0 0 1 2.876 0Z"
691
- })), _path2 || (_path2 = /*#__PURE__*/React__namespace.createElement("path", {
692
- fill: "#fff",
693
- d: "M12 19.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3"
694
- })));
695
- };
696
-
697
- var _path;
698
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
699
- var SvgArrowLeft = function SvgArrowLeft(props) {
700
- return /*#__PURE__*/React__namespace.createElement("svg", _extends({
701
- xmlns: "http://www.w3.org/2000/svg",
702
- width: 24,
703
- height: 24,
704
- fill: "none"
705
- }, props), _path || (_path = /*#__PURE__*/React__namespace.createElement("path", {
706
- fill: "#fff",
707
- fillRule: "evenodd",
708
- d: "M15.6 4.186a.774.774 0 0 1 .085 1.092L9.923 12l5.762 6.722a.774.774 0 0 1-1.176 1.008l-6.194-7.226a.774.774 0 0 1 0-1.008L14.51 4.27a.774.774 0 0 1 1.092-.084",
709
- clipRule: "evenodd"
710
- })));
711
- };
712
-
713
653
  const BottomDrawer = ({
714
654
  isModalVisible,
715
655
  toggleModal,
@@ -723,8 +663,8 @@ const BottomDrawer = ({
723
663
  showBlurView = true,
724
664
  showLeftIcon = false,
725
665
  showRightIcon = true,
726
- leftIcon = /* @__PURE__ */ React__default["default"].createElement(SvgArrowLeft, null),
727
- rightIcon = /* @__PURE__ */ React__default["default"].createElement(SvgCrossIcon, null),
666
+ leftIcon,
667
+ rightIcon,
728
668
  onLeftIconPress,
729
669
  titleStyle,
730
670
  titleVariant = "B2_REGULAR",
@@ -757,14 +697,24 @@ const BottomDrawer = ({
757
697
  blurType: "light",
758
698
  blurAmount
759
699
  }
760
- ) : null, /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: [styles$B.modalContainer, modalContainerStyle] }, showHeader && /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$B.separator }), /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$B.headerContainer }, /* @__PURE__ */ React__default["default"].createElement(
700
+ ) : null, /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: [styles$B.modalContainer, modalContainerStyle] }, showHeader && /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$B.separator }), /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$B.headerContainer }, showLeftIcon && leftIcon ? React__default["default"].cloneElement(leftIcon, {
701
+ width: moderateScale(24),
702
+ height: moderateScale(24),
703
+ style: styles$B.leftIconStyle,
704
+ onPress: onLeftIconPress
705
+ }) : null, /* @__PURE__ */ React__default["default"].createElement(
761
706
  CustomTypography,
762
707
  {
763
708
  variant: titleVariant,
764
709
  text: title,
765
710
  style: { ...styles$B.title, ...titleStyle }
766
711
  }
767
- ))), children))
712
+ ), showRightIcon && rightIcon ? React__default["default"].cloneElement(rightIcon, {
713
+ width: moderateScale(24),
714
+ height: moderateScale(24),
715
+ style: styles$B.rightIconStyle,
716
+ onPress: toggleModal
717
+ }) : null)), children))
768
718
  ))
769
719
  );
770
720
  };
@@ -1969,7 +1919,8 @@ const Accordion = ({
1969
1919
  optionalElement,
1970
1920
  // Destructure the new prop,
1971
1921
  headerComponent,
1972
- disabled = false
1922
+ disabled = false,
1923
+ icon
1973
1924
  }) => {
1974
1925
  const contentRef = React.useRef(null);
1975
1926
  const [animation] = React.useState(new reactNative.Animated.Value(0));
@@ -2005,7 +1956,12 @@ const Accordion = ({
2005
1956
  text: title,
2006
1957
  style: [styles$n.title, titleStyle]
2007
1958
  }
2008
- )
1959
+ ),
1960
+ React__default["default"].cloneElement(icon, {
1961
+ width: moderateScale(20),
1962
+ height: moderateScale(20),
1963
+ style: styles$n.iconStyle
1964
+ })
2009
1965
  ), optionalElement ? optionalElement() : null, isOpen && /* @__PURE__ */ React__default["default"].createElement(reactNative.Animated.View, { style: [styles$n.content, { height: cardHeight }] }, /* @__PURE__ */ React__default["default"].createElement(
2010
1966
  reactNative.View,
2011
1967
  {
@@ -2050,7 +2006,7 @@ const styles$m = reactNative.StyleSheet.create({
2050
2006
  }
2051
2007
  });
2052
2008
 
2053
- const Toast = React__default["default"].forwardRef((_props, ref) => {
2009
+ const Toast = React__default["default"].forwardRef(({ sucessIcon, errorIcon }, ref) => {
2054
2010
  const [visible, setVisible] = React.useState(false);
2055
2011
  const [message, setMessage] = React.useState("");
2056
2012
  const [isSuccess, setIsSuccess] = React.useState(true);
@@ -2106,7 +2062,7 @@ const Toast = React__default["default"].forwardRef((_props, ref) => {
2106
2062
  ],
2107
2063
  testID: "TOAST"
2108
2064
  },
2109
- /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$m.toastContainer }, /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$m.innerContainer }, /* @__PURE__ */ React__default["default"].createElement(
2065
+ /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$m.toastContainer }, /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$m.innerContainer }, isSuccess ? sucessIcon : errorIcon, /* @__PURE__ */ React__default["default"].createElement(
2110
2066
  CustomTypography,
2111
2067
  {
2112
2068
  variant: "L2_REGULAR",
@@ -2174,7 +2130,8 @@ const CustomSearchBar = ({
2174
2130
  onCrossIconPress,
2175
2131
  handleOnChangeText,
2176
2132
  setValue,
2177
- rightIcon = /* @__PURE__ */ React__default["default"].createElement(SvgCrossIcon, null),
2133
+ searchIcon,
2134
+ rightIcon,
2178
2135
  disableBorderColor = "#4F4F4F",
2179
2136
  borderColor = "#FFFFFF",
2180
2137
  disablePlaceHolderStyle = "#686868",
@@ -2202,7 +2159,12 @@ const CustomSearchBar = ({
2202
2159
  onSearchIconPress?.();
2203
2160
  },
2204
2161
  style: searchIconStyle
2205
- }
2162
+ },
2163
+ React__default["default"].cloneElement(searchIcon, {
2164
+ width: moderateScale(24),
2165
+ height: moderateScale(24),
2166
+ style: [styles$l.searchIconStyle, searchIconStyle]
2167
+ })
2206
2168
  ),
2207
2169
  /* @__PURE__ */ React__default["default"].createElement(
2208
2170
  reactNative.TextInput,
@@ -2228,11 +2190,11 @@ const CustomSearchBar = ({
2228
2190
  },
2229
2191
  style: crossIconStyle
2230
2192
  },
2231
- React__default["default"].cloneElement(rightIcon, {
2193
+ rightIcon ? React__default["default"].cloneElement(rightIcon, {
2232
2194
  // width: moderateScale(24),
2233
2195
  // height: moderateScale(24),
2234
2196
  style: [styles$l.crossIconStyle, crossIconStyle]
2235
- })
2197
+ }) : null
2236
2198
  )
2237
2199
  );
2238
2200
  };
@@ -2262,31 +2224,31 @@ const styles$k = reactNative.StyleSheet.create({
2262
2224
  const CustomHeader = ({
2263
2225
  title,
2264
2226
  testId = "CUSTOM-HEADER",
2265
- leftIcon = /* @__PURE__ */ React__default["default"].createElement(SvgCaretLeft, null),
2266
- rightIcon = /* @__PURE__ */ React__default["default"].createElement(SvgDotsThreeVertical, null),
2227
+ leftIcon,
2228
+ rightIcon,
2267
2229
  showLeftIcon = true,
2268
2230
  showRightIcon = true,
2269
2231
  onLeftPress,
2270
2232
  onRightPress
2271
2233
  }) => {
2272
- return /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$k.container, testID: testId }, /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$k.headderContainer }, showLeftIcon && React__default["default"].cloneElement(leftIcon, {
2234
+ return /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$k.container, testID: testId }, /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$k.headderContainer }, showLeftIcon && leftIcon ? React__default["default"].cloneElement(leftIcon, {
2273
2235
  width: moderateScale(24),
2274
2236
  height: moderateScale(24),
2275
2237
  onPress: onLeftPress,
2276
2238
  style: styles$k.leftIconStyle
2277
- }), /* @__PURE__ */ React__default["default"].createElement(
2239
+ }) : null, /* @__PURE__ */ React__default["default"].createElement(
2278
2240
  CustomTypography,
2279
2241
  {
2280
2242
  variant: "B2_REGULAR",
2281
2243
  text: title,
2282
2244
  style: styles$k.headerTitle
2283
2245
  }
2284
- )), showRightIcon && React__default["default"].cloneElement(rightIcon, {
2246
+ )), showRightIcon && rightIcon ? React__default["default"].cloneElement(rightIcon, {
2285
2247
  width: moderateScale(24),
2286
2248
  height: moderateScale(24),
2287
2249
  onPress: onRightPress,
2288
2250
  style: styles$k.rightIconStyle
2289
- }));
2251
+ }) : null);
2290
2252
  };
2291
2253
 
2292
2254
  const styles$j = reactNative.StyleSheet.create({
@@ -2908,12 +2870,13 @@ const styles$b = reactNative.StyleSheet.create({
2908
2870
  });
2909
2871
 
2910
2872
  const NotificationBandge = ({
2911
- notificationCount = 0
2873
+ notificationCount = 0,
2874
+ icon
2912
2875
  }) => {
2913
2876
  if (notificationCount <= 0) {
2914
- return null;
2877
+ return icon;
2915
2878
  }
2916
- return /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$b.iconContainer }, /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$b.badge }, /* @__PURE__ */ React__default["default"].createElement(reactNative.Text, { style: [styles$b.badgeText] }, notificationCount > 99 ? "99+" : notificationCount)));
2879
+ return /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$b.iconContainer }, icon, /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$b.badge }, /* @__PURE__ */ React__default["default"].createElement(reactNative.Text, { style: [styles$b.badgeText] }, notificationCount > 99 ? "99+" : notificationCount)));
2917
2880
  };
2918
2881
 
2919
2882
  const ScrollableList = ({
@@ -3643,7 +3606,10 @@ const CustomDocumentPicker = ({
3643
3606
  fileTypes = [DocumentPicker__default["default"].types.images, DocumentPicker__default["default"].types.pdf],
3644
3607
  containerStyle,
3645
3608
  titleStyle,
3646
- hintStyle
3609
+ hintStyle,
3610
+ fileIcon,
3611
+ uploadIcon,
3612
+ deleteIcon
3647
3613
  }) => {
3648
3614
  const [error, setError] = React.useState("");
3649
3615
  const [docDetails, setDocDetails] = React.useState();
@@ -3673,7 +3639,7 @@ const CustomDocumentPicker = ({
3673
3639
  }
3674
3640
  }
3675
3641
  }, [fileTypes, maxFileSize, onDocumentUpload]);
3676
- React.useCallback(() => {
3642
+ const removeDocument = React.useCallback(() => {
3677
3643
  setDocDetails(void 0);
3678
3644
  }, []);
3679
3645
  return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, /* @__PURE__ */ React__default["default"].createElement(
@@ -3686,7 +3652,7 @@ const CustomDocumentPicker = ({
3686
3652
  containerStyle
3687
3653
  ]
3688
3654
  },
3689
- /* @__PURE__ */ React__default["default"].createElement(reactNative.Pressable, { style: styles$3.innerContainer, onPress: pickDocument }, /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$3.titleContainer }, /* @__PURE__ */ React__default["default"].createElement(
3655
+ /* @__PURE__ */ React__default["default"].createElement(reactNative.Pressable, { style: styles$3.innerContainer, onPress: pickDocument }, docDetails ? fileIcon : uploadIcon, /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$3.titleContainer }, /* @__PURE__ */ React__default["default"].createElement(
3690
3656
  CustomTypography,
3691
3657
  {
3692
3658
  variant: FontStyle.L2_REGULAR,
@@ -3700,7 +3666,10 @@ const CustomDocumentPicker = ({
3700
3666
  text: hint,
3701
3667
  style: [{ color: theme.CONTENT_SECONDRY }, hintStyle]
3702
3668
  }
3703
- )))
3669
+ ))),
3670
+ docDetails && React__default["default"].cloneElement(deleteIcon, {
3671
+ onPress: removeDocument
3672
+ })
3704
3673
  ), error && /* @__PURE__ */ React__default["default"].createElement(
3705
3674
  CustomTypography,
3706
3675
  {
@@ -3935,7 +3904,8 @@ const Stepper = ({
3935
3904
  containerStyle,
3936
3905
  showStepCount = false,
3937
3906
  showStatus = false,
3938
- data
3907
+ data,
3908
+ completedStatusIcon
3939
3909
  }) => {
3940
3910
  const { theme } = useTheme();
3941
3911
  const renderCircleStyle = (status) => {
@@ -3997,7 +3967,7 @@ const Stepper = ({
3997
3967
  color: theme.CONTENT_PRIMARY
3998
3968
  }
3999
3969
  }
4000
- )), index != data?.length - 1 && /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: { ...styles$1.separator, ...dividerStyle } })),
3970
+ ), showStatus && item?.status === Status.Completed && completedStatusIcon), index != data?.length - 1 && /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: { ...styles$1.separator, ...dividerStyle } })),
4001
3971
  /* @__PURE__ */ React__default["default"].createElement(reactNative.View, { style: styles$1.lableContainer }, /* @__PURE__ */ React__default["default"].createElement(
4002
3972
  CustomTypography,
4003
3973
  {
@@ -4048,7 +4018,11 @@ const styles = reactNative.StyleSheet.create({
4048
4018
 
4049
4019
  const { width } = reactNative.Dimensions.get("window");
4050
4020
  const BUTTON_WIDTH = 40;
4051
- const CustomSlideButton = ({ label, onComplete }) => {
4021
+ const CustomSlideButton = ({
4022
+ label,
4023
+ onComplete,
4024
+ icon
4025
+ }) => {
4052
4026
  const pan = React.useRef(new reactNative.Animated.Value(0)).current;
4053
4027
  const panResponder = React.useRef(
4054
4028
  reactNative.PanResponder.create({
@@ -4111,7 +4085,8 @@ const CustomSlideButton = ({ label, onComplete }) => {
4111
4085
  backgroundColor: theme.SURFACE_PRIMARY,
4112
4086
  width: BUTTON_WIDTH
4113
4087
  }
4114
- }
4088
+ },
4089
+ icon
4115
4090
  )
4116
4091
  )
4117
4092
  );