@nlabs/gothamjs
Version:
Platform
163 lines (162 loc) • 18.4 kB
JavaScript
import { forwardRef, useEffect, useMemo, useRef, useState } from "react";
import { Controller, useFormContext } from "react-hook-form";
import { useIsMobile } from "../../hooks/useIsMobile.js";
import { getOutlineClasses } from "../../utils/colorUtils.js";
import { ErrorMessage } from "../ErrorMessage/ErrorMessage.js";
import { InputField } from "../InputField/InputField.js";
import { Label } from "../Label/Label.js";
import { DatePicker } from "./DatePicker.js";
import { jsx, jsxs } from "react/jsx-runtime";
const DateField = forwardRef(({
className = "w-full rounded-md outline-1 outline-solid focus:outline-3 px-3.5 py-2 text-black dark:text-white placeholder:text-black/50 dark:placeholder:text-white/50 sm:text-sm sm:leading-6",
color = "primary",
defaultValue,
disabled = false,
error: externalError,
label = "",
labelClass = "mb-1",
labelColor = "neutral",
maxDate,
minDate,
name,
onChange,
type = "text",
value,
...props
}, ref) => {
const isMobile = useIsMobile();
const { control, formState: { errors }, clearErrors, trigger } = useFormContext();
const formError = errors?.[name];
const hasError = !!formError || !!externalError;
const [isPickerVisible, setIsPickerVisible] = useState(false);
const pickerRef = useRef(null);
const inputRef = useRef(null);
const outlineClasses = useMemo(
() => getOutlineClasses(hasError ? "error" : color, { hasFocus: true, hasHover: true }),
[color, hasError]
);
const inputClasses = [
"bg-white/30 dark:bg-black/30",
disabled ? "text-neutral/30 dark:text-neutral-dark/30 outline-neutral/30 dark:outline-neutral-dark/30" : outlineClasses,
className
].filter(Boolean).join(" ");
useEffect(() => {
if (ref && typeof ref === "object" && inputRef.current) {
ref.current = inputRef.current;
}
}, [ref, inputRef.current]);
const ensureDateInRange = (timestamp) => {
if (!timestamp) return timestamp;
if (minDate && timestamp < minDate) {
return minDate;
}
if (maxDate && timestamp > maxDate) {
return maxDate;
}
return timestamp;
};
const formatDateForInput = (timestamp) => {
return new Date(timestamp).toISOString().split("T")[0];
};
const parseInputDate = (dateString) => {
return new Date(dateString).getTime();
};
const isDateValid = (timestamp) => {
if (minDate && timestamp < minDate) {
return false;
}
if (maxDate && timestamp > maxDate) {
return false;
}
return true;
};
useEffect(() => {
const handleClickOutside = (event) => {
if (pickerRef.current && !pickerRef.current.contains(event.target) && inputRef.current && !inputRef.current.contains(event.target)) {
setIsPickerVisible(false);
}
};
document.addEventListener("mousedown", handleClickOutside);
return () => {
document.removeEventListener("mousedown", handleClickOutside);
};
}, []);
return /* @__PURE__ */ jsx(
Controller,
{
control,
name,
defaultValue: value || ensureDateInRange(defaultValue || (/* @__PURE__ */ new Date()).getTime()),
render: ({ field }) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col w-full", ref, children: [
/* @__PURE__ */ jsx(
Label,
{
className: labelClass,
color: labelColor,
hasError,
label,
name
}
),
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
/* @__PURE__ */ jsx(
InputField,
{
...props,
ref: inputRef,
disabled,
value: formatDateForInput(field.value),
onChange: (changeEvent) => {
const timestamp = parseInputDate(changeEvent.target.value);
field.onChange(timestamp);
if (isDateValid(timestamp)) {
clearErrors(name);
trigger(name);
}
if (onChange) {
onChange(timestamp);
}
},
onFocus: () => {
if (!isMobile) {
setIsPickerVisible(true);
}
},
onBlur: () => {
trigger(name);
},
className: inputClasses,
type: isMobile ? "date" : type,
min: minDate ? formatDateForInput(minDate) : void 0,
max: maxDate ? formatDateForInput(maxDate) : void 0
}
),
isPickerVisible && !disabled && !isMobile && /* @__PURE__ */ jsx("div", { ref: pickerRef, className: "absolute z-10 mt-1", children: /* @__PURE__ */ jsx(
DatePicker,
{
initialDate: field.value,
minDate,
maxDate,
onDateSelect: (timestamp) => {
field.onChange(timestamp);
if (isDateValid(timestamp)) {
clearErrors(name);
trigger(name);
}
if (onChange) {
onChange(timestamp);
}
setIsPickerVisible(false);
}
}
) }),
/* @__PURE__ */ jsx(ErrorMessage, { message: formError?.message })
] })
] })
}
);
});
export {
DateField
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvRGF0ZUZpZWxkL0RhdGVGaWVsZC50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI1LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2ZvcndhcmRSZWYsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtDb250cm9sbGVyLCB1c2VGb3JtQ29udGV4dH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHt1c2VJc01vYmlsZX0gZnJvbSAnLi4vLi4vaG9va3MvdXNlSXNNb2JpbGUuanMnO1xuaW1wb3J0IHtnZXRPdXRsaW5lQ2xhc3Nlc30gZnJvbSAnLi4vLi4vdXRpbHMvY29sb3JVdGlscy5qcyc7XG5pbXBvcnQge0Vycm9yTWVzc2FnZX0gZnJvbSAnLi4vRXJyb3JNZXNzYWdlL0Vycm9yTWVzc2FnZS5qcyc7XG5pbXBvcnQge0lucHV0RmllbGQsIHR5cGUgSW5wdXRGaWVsZFByb3BzfSBmcm9tICcuLi9JbnB1dEZpZWxkL0lucHV0RmllbGQuanMnO1xuaW1wb3J0IHtMYWJlbH0gZnJvbSAnLi4vTGFiZWwvTGFiZWwuanMnO1xuaW1wb3J0IHtEYXRlUGlja2VyfSBmcm9tICcuL0RhdGVQaWNrZXIuanMnO1xuXG5pbXBvcnQgdHlwZSB7R290aGFtQ29sb3J9IGZyb20gJy4uLy4uL3V0aWxzL2NvbG9yVXRpbHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVGaWVsZFByb3BzIGV4dGVuZHMgUmVhY3QuSW5wdXRIVE1MQXR0cmlidXRlczxIVE1MSW5wdXRFbGVtZW50PiB7XG4gIHJlYWRvbmx5IGNsYXNzTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY29sb3I/OiBHb3RoYW1Db2xvcjtcbiAgcmVhZG9ubHkgZGVmYXVsdFZhbHVlPzogbnVtYmVyO1xuICByZWFkb25seSBkaXNhYmxlZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxhYmVsPzogc3RyaW5nO1xuICByZWFkb25seSBsYWJlbENsYXNzPzogc3RyaW5nO1xuICByZWFkb25seSBsYWJlbENvbG9yPzogR290aGFtQ29sb3I7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZXJyb3I/OiBib29sZWFuO1xuICByZWFkb25seSBlcnJvckNvbG9yPzogR290aGFtQ29sb3I7XG4gIHJlYWRvbmx5IG1heERhdGU/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1pbkRhdGU/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9uQ2hhbmdlPzogKGRhdGUpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHZhbHVlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgRGF0ZUZpZWxkID0gZm9yd2FyZFJlZjxIVE1MSW5wdXRFbGVtZW50LCBEYXRlRmllbGRQcm9wcz4oKHtcbiAgY2xhc3NOYW1lID0gJ3ctZnVsbCByb3VuZGVkLW1kIG91dGxpbmUtMSBvdXRsaW5lLXNvbGlkIGZvY3VzOm91dGxpbmUtMyBweC0zLjUgcHktMiB0ZXh0LWJsYWNrIGRhcms6dGV4dC13aGl0ZSBwbGFjZWhvbGRlcjp0ZXh0LWJsYWNrLzUwIGRhcms6cGxhY2Vob2xkZXI6dGV4dC13aGl0ZS81MCBzbTp0ZXh0LXNtIHNtOmxlYWRpbmctNicsXG4gIGNvbG9yID0gJ3ByaW1hcnknLFxuICBkZWZhdWx0VmFsdWUsXG4gIGRpc2FibGVkID0gZmFsc2UsXG4gIGVycm9yOiBleHRlcm5hbEVycm9yLFxuICBsYWJlbCA9ICcnLFxuICBsYWJlbENsYXNzID0gJ21iLTEnLFxuICBsYWJlbENvbG9yID0gJ25ldXRyYWwnLFxuICBtYXhEYXRlLFxuICBtaW5EYXRlLFxuICBuYW1lLFxuICBvbkNoYW5nZSxcbiAgdHlwZSA9ICd0ZXh0JyxcbiAgdmFsdWUsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgaXNNb2JpbGUgPSB1c2VJc01vYmlsZSgpO1xuICBjb25zdCB7Y29udHJvbCwgZm9ybVN0YXRlOiB7ZXJyb3JzfSwgY2xlYXJFcnJvcnMsIHRyaWdnZXJ9ID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgY29uc3QgZm9ybUVycm9yID0gZXJyb3JzPy5bbmFtZV07XG4gIGNvbnN0IGhhc0Vycm9yID0gISFmb3JtRXJyb3IgfHwgISFleHRlcm5hbEVycm9yO1xuICBjb25zdCBbaXNQaWNrZXJWaXNpYmxlLCBzZXRJc1BpY2tlclZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBwaWNrZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBpbnB1dFJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKTtcbiAgY29uc3Qgb3V0bGluZUNsYXNzZXMgPSB1c2VNZW1vKFxuICAgICgpID0+IGdldE91dGxpbmVDbGFzc2VzKGhhc0Vycm9yID8gJ2Vycm9yJyA6IGNvbG9yLCB7aGFzRm9jdXM6IHRydWUsIGhhc0hvdmVyOiB0cnVlfSksXG4gICAgW2NvbG9yLCBoYXNFcnJvcl1cbiAgKTtcbiAgY29uc3QgaW5wdXRDbGFzc2VzID0gW1xuICAgICdiZy13aGl0ZS8zMCBkYXJrOmJnLWJsYWNrLzMwJyxcbiAgICBkaXNhYmxlZCA/ICd0ZXh0LW5ldXRyYWwvMzAgZGFyazp0ZXh0LW5ldXRyYWwtZGFyay8zMCBvdXRsaW5lLW5ldXRyYWwvMzAgZGFyazpvdXRsaW5lLW5ldXRyYWwtZGFyay8zMCcgOiBvdXRsaW5lQ2xhc3NlcyxcbiAgICBjbGFzc05hbWVcbiAgXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHJlZiAmJiB0eXBlb2YgcmVmID09PSAnb2JqZWN0JyAmJiBpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICByZWYuY3VycmVudCA9IGlucHV0UmVmLmN1cnJlbnQ7XG4gICAgfVxuICB9LCBbcmVmLCBpbnB1dFJlZi5jdXJyZW50XSk7XG5cbiAgY29uc3QgZW5zdXJlRGF0ZUluUmFuZ2UgPSAodGltZXN0YW1wOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgIGlmICghdGltZXN0YW1wKSByZXR1cm4gdGltZXN0YW1wO1xuXG4gICAgaWYgKG1pbkRhdGUgJiYgdGltZXN0YW1wIDwgbWluRGF0ZSkge1xuICAgICAgcmV0dXJuIG1pbkRhdGU7XG4gICAgfVxuXG4gICAgaWYgKG1heERhdGUgJiYgdGltZXN0YW1wID4gbWF4RGF0ZSkge1xuICAgICAgcmV0dXJuIG1heERhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbWVzdGFtcDtcbiAgfTtcblxuICBjb25zdCBmb3JtYXREYXRlRm9ySW5wdXQgPSAodGltZXN0YW1wOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXApLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcbiAgfTtcblxuICBjb25zdCBwYXJzZUlucHV0RGF0ZSA9IChkYXRlU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlU3RyaW5nKS5nZXRUaW1lKCk7XG4gIH07XG5cbiAgY29uc3QgaXNEYXRlVmFsaWQgPSAodGltZXN0YW1wOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICBpZiAobWluRGF0ZSAmJiB0aW1lc3RhbXAgPCBtaW5EYXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChtYXhEYXRlICYmIHRpbWVzdGFtcCA+IG1heERhdGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVDbGlja091dHNpZGUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcGlja2VyUmVmLmN1cnJlbnQgJiZcbiAgICAgICAgIXBpY2tlclJlZi5jdXJyZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSAmJlxuICAgICAgICBpbnB1dFJlZi5jdXJyZW50ICYmXG4gICAgICAgICFpbnB1dFJlZi5jdXJyZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKVxuICAgICAgKSB7XG4gICAgICAgIHNldElzUGlja2VyVmlzaWJsZShmYWxzZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZUNsaWNrT3V0c2lkZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZUNsaWNrT3V0c2lkZSk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPENvbnRyb2xsZXJcbiAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gICAgICBuYW1lPXtuYW1lfVxuICAgICAgZGVmYXVsdFZhbHVlPXt2YWx1ZSB8fCBlbnN1cmVEYXRlSW5SYW5nZShkZWZhdWx0VmFsdWUgfHwgbmV3IERhdGUoKS5nZXRUaW1lKCkpfVxuICAgICAgcmVuZGVyPXsoe2ZpZWxkfSkgPT4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgdy1mdWxsXCIgcmVmPXtyZWZ9PlxuICAgICAgICAgIDxMYWJlbFxuICAgICAgICAgICAgY2xhc3NOYW1lPXtsYWJlbENsYXNzfVxuICAgICAgICAgICAgY29sb3I9e2xhYmVsQ29sb3J9XG4gICAgICAgICAgICBoYXNFcnJvcj17aGFzRXJyb3J9XG4gICAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgICBuYW1lPXtuYW1lfSAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIj5cbiAgICAgICAgICAgIDxJbnB1dEZpZWxkXG4gICAgICAgICAgICAgIHsuLi5wcm9wcyBhcyBPbWl0PElucHV0RmllbGRQcm9wcywgJ29uQ2hhbmdlJz59XG4gICAgICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgdmFsdWU9e2Zvcm1hdERhdGVGb3JJbnB1dChmaWVsZC52YWx1ZSl9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoY2hhbmdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBwYXJzZUlucHV0RGF0ZShjaGFuZ2VFdmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKHRpbWVzdGFtcCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNEYXRlVmFsaWQodGltZXN0YW1wKSkge1xuICAgICAgICAgICAgICAgICAgY2xlYXJFcnJvcnMobmFtZSk7XG4gICAgICAgICAgICAgICAgICB0cmlnZ2VyKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgb25DaGFuZ2UodGltZXN0YW1wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIG9uRm9jdXM9eygpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICBzZXRJc1BpY2tlclZpc2libGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBvbkJsdXI9eygpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBvbiBibHVyXG4gICAgICAgICAgICAgICAgdHJpZ2dlcihuYW1lKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtpbnB1dENsYXNzZXN9XG4gICAgICAgICAgICAgIHR5cGU9e2lzTW9iaWxlID8gJ2RhdGUnIDogdHlwZX1cbiAgICAgICAgICAgICAgbWluPXttaW5EYXRlID8gZm9ybWF0RGF0ZUZvcklucHV0KG1pbkRhdGUpIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICBtYXg9e21heERhdGUgPyBmb3JtYXREYXRlRm9ySW5wdXQobWF4RGF0ZSkgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge2lzUGlja2VyVmlzaWJsZSAmJiAhZGlzYWJsZWQgJiYgIWlzTW9iaWxlICYmIChcbiAgICAgICAgICAgICAgPGRpdiByZWY9e3BpY2tlclJlZn0gY2xhc3NOYW1lPVwiYWJzb2x1dGUgei0xMCBtdC0xXCI+XG4gICAgICAgICAgICAgICAgPERhdGVQaWNrZXJcbiAgICAgICAgICAgICAgICAgIGluaXRpYWxEYXRlPXtmaWVsZC52YWx1ZX1cbiAgICAgICAgICAgICAgICAgIG1pbkRhdGU9e21pbkRhdGV9XG4gICAgICAgICAgICAgICAgICBtYXhEYXRlPXttYXhEYXRlfVxuICAgICAgICAgICAgICAgICAgb25EYXRlU2VsZWN0PXsodGltZXN0YW1wKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKHRpbWVzdGFtcCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGF0ZVZhbGlkKHRpbWVzdGFtcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjbGVhckVycm9ycyhuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UodGltZXN0YW1wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXRJc1BpY2tlclZpc2libGUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8RXJyb3JNZXNzYWdlIG1lc3NhZ2U9e2Zvcm1FcnJvcj8ubWVzc2FnZSBhcyBzdHJpbmd9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAvPlxuICApO1xufSk7Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUSxZQUFZLFdBQVcsU0FBUyxRQUFRLGdCQUFlO0FBQy9ELFNBQVEsWUFBWSxzQkFBcUI7QUFFekMsU0FBUSxtQkFBa0I7QUFDMUIsU0FBUSx5QkFBd0I7QUFDaEMsU0FBUSxvQkFBbUI7QUFDM0IsU0FBUSxrQkFBdUM7QUFDL0MsU0FBUSxhQUFZO0FBQ3BCLFNBQVEsa0JBQWlCO0FBc0hmLGNBTUEsWUFOQTtBQWpHSCxNQUFNLFlBQVksV0FBNkMsQ0FBQztBQUFBLEVBQ3JFLFlBQVk7QUFBQSxFQUNaLFFBQVE7QUFBQSxFQUNSO0FBQUEsRUFDQSxXQUFXO0FBQUEsRUFDWCxPQUFPO0FBQUEsRUFDUCxRQUFRO0FBQUEsRUFDUixhQUFhO0FBQUEsRUFDYixhQUFhO0FBQUEsRUFDYjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsT0FBTztBQUFBLEVBQ1A7QUFBQSxFQUNBLEdBQUc7QUFDTCxHQUFHLFFBQVE7QUFDVCxRQUFNLFdBQVcsWUFBWTtBQUM3QixRQUFNLEVBQUMsU0FBUyxXQUFXLEVBQUMsT0FBTSxHQUFHLGFBQWEsUUFBTyxJQUFJLGVBQWU7QUFDNUUsUUFBTSxZQUFZLFNBQVMsSUFBSTtBQUMvQixRQUFNLFdBQVcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ2xDLFFBQU0sQ0FBQyxpQkFBaUIsa0JBQWtCLElBQUksU0FBUyxLQUFLO0FB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