@daracl/form 0.0.19 → 0.0.22
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/README.md +51 -18
- package/dist/daracl.form.css +312 -160
- package/dist/daracl.form.min.css +1 -10
- package/dist/daracl.form.min.umd.js +36 -41
- package/dist/daracl.form.min.umd.js.map +1 -1
- package/dist/daracl.form.umd.js +221 -226
- package/dist/daracl.form.umd.js.map +1 -1
- package/dist/defaultOption.d.ts +3 -0
- package/dist/index.cjs +104 -1537
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +58 -1491
- package/dist/index.js.map +1 -1
- package/dist/index.min.cjs +33 -98
- package/dist/index.min.cjs.map +1 -1
- package/dist/index.min.js +471 -1384
- package/dist/index.min.js.map +1 -1
- package/dist/index.umd.d.ts +1 -0
- package/dist/util/utils.d.ts +8 -30
- package/package.json +37 -49
- package/style/base/_base.scss +7 -6
- package/style/components/_button.scss +5 -4
- package/style/components/_field-container.scss +4 -3
- package/style/components/_field-group.scss +1 -1
- package/style/components/_file-list.scss +3 -2
- package/style/components/_form-field.scss +13 -4
- package/style/components/_form-group.scss +8 -7
- package/style/components/_grid-field.scss +12 -11
- package/style/components/_icon.scss +2 -1
- package/style/components/_label.scss +10 -9
- package/style/components/_tab.scss +8 -7
- package/style/daracl.form.scss +17 -31
- package/style/themes/_common.scss +0 -18
- package/style/themes/_dark.scss +0 -32
- package/style/themes/_index.scss +0 -14
- package/style/themes/_light.scss +0 -26
- package/style/themes/_mixin.scss +0 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daracl.form.umd.js","sources":["../../node_modules/@daracl/core/dist/index.js","../../src/util/utils.ts","../../src/renderer/Render.ts","../../src/rule/regexpValidator.ts","../../src/rule/validator.ts","../../src/rule/numberValidator.ts","../../src/util/validUtils.ts","../../src/event/renderEvents.ts","../../src/renderer/NumberRender.ts","../../src/rule/stringValidator.ts","../../src/renderer/TextAreaRender.ts","../../src/renderer/DropdownRender.ts","../../src/renderer/TextRender.ts","../../src/util/styleUtils.ts","../../src/renderer/CheckboxRender.ts","../../src/renderer/RadioRender.ts","../../src/renderer/PasswordRender.ts","../../src/rule/fileValidator.ts","../../src/renderer/FileRender.ts","../../src/renderer/CustomRender.ts","../../src/renderer/GroupRender.ts","../../src/renderer/HiddenRender.ts","../../src/renderer/ButtonRender.ts","../../src/renderer/RangeRender.ts","../../node_modules/@daracl/datetimepicker/dist/index.js","../../src/renderer/DateRender.ts","../../src/renderer/TabRender.ts","../../src/renderer/GridRender.ts","../../src/constants.ts","../../src/util/Language.ts","../../src/util/renderFactory.ts","../../src/FieldInfoMap.ts","../../src/FormTemplate.ts","../../src/defaultOption.ts","../../src/DaraForm.ts","../../src/index.umd.ts"],"sourcesContent":["function isArray(value) {\n return Array.isArray(value);\n}\nfunction isDate(value) {\n return value instanceof Date && !isNaN(value.getTime());\n}\nfunction isNil(value) {\n return value === null || value === void 0;\n}\nfunction isString(value) {\n return typeof value === \"string\" || value instanceof String;\n}\nfunction isEmpty(value) {\n if (isNil(value)) {\n return true;\n }\n if (isString(value)) {\n return value.trim() === \"\";\n }\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n if (typeof value === \"object\") {\n return Object.keys(value).length === 0;\n }\n return false;\n}\nfunction isFunction(value) {\n return typeof value === \"function\" || value instanceof Function;\n}\nfunction isObject(value) {\n return value !== null && (typeof value === \"object\" || typeof value === \"function\");\n}\nfunction isPlainObject(value) {\n return value !== null && typeof value === \"object\" && Object.getPrototypeOf(value) === Object.prototype;\n}\nfunction isUndefined(value) {\n return typeof value === \"undefined\";\n}\nfunction cloneDeep(dst, src, excludeKeys) {\n if (isArray(src)) {\n return cloneArrayDeep(dst, src, excludeKeys);\n }\n if (isDate(src)) {\n return new Date(src.getTime());\n }\n if (isObject(src)) {\n return cloneObjectDeep(dst, src, excludeKeys);\n }\n return src;\n}\nfunction cloneObjectDeep(dst, src, excludeKeys) {\n if (isFunction(src)) {\n return src;\n }\n for (const key of Object.keys(src)) {\n if (excludeKeys.has(key)) continue;\n const val = src[key];\n if (isUndefined(val)) {\n continue;\n }\n if (val === null) {\n dst[key] = val;\n } else if (isFunction(val)) {\n dst[key] = val;\n } else if (isEmpty(dst[key])) {\n dst[key] = cloneDeep(isArray(val) ? [] : {}, val, excludeKeys);\n } else if (!isObject(val)) {\n dst[key] = val;\n } else {\n if (!isObject(dst[key])) {\n dst[key] = {};\n }\n cloneDeep(dst[key], val, excludeKeys);\n }\n }\n return dst;\n}\nfunction cloneArrayDeep(dst, src, excludeKeys) {\n const isObj = isPlainObject(dst);\n const isArr = isArray(dst);\n for (let i = 0; i < src.length; i += 1) {\n const val = src[i];\n let newVal;\n if (val == null) {\n newVal = val;\n } else {\n newVal = cloneDeep(isArray(val) ? [] : {}, val, excludeKeys);\n }\n if (isObj) {\n dst[i] = newVal;\n } else {\n if (isArr && dst.indexOf(newVal) < 0) {\n dst.push(newVal);\n }\n }\n }\n return dst;\n}\nfunction objectDeepMerge(...values) {\n if (values.length < 1) {\n return values;\n }\n let excludeKeys = /* @__PURE__ */ new Set();\n let sources = values;\n const last = values[values.length - 1];\n if (last && isObject(last) && isArray(last._excludeKeys)) {\n excludeKeys = new Set(last._excludeKeys.map(String));\n sources = values.slice(0, -1);\n }\n let result = {};\n let firstflag = true;\n for (let value of sources) {\n if (isEmpty(value)) {\n firstflag = false;\n continue;\n }\n if (firstflag) {\n cloneDeep(result, value, /* @__PURE__ */ new Set());\n firstflag = false;\n } else {\n cloneDeep(result, value, excludeKeys);\n }\n }\n return result;\n}\nfunction arrayDeepMerge(...values) {\n if (values.length < 1) {\n return values;\n }\n let source = [];\n let excludeKeys = /* @__PURE__ */ new Set();\n for (let value of values) {\n if (isEmpty(value)) continue;\n cloneArrayDeep(source, value, excludeKeys);\n }\n return source;\n}\nconst deepCopy = (copyValue) => {\n if (isArray(copyValue)) {\n let reval = [];\n for (let value of copyValue) {\n if (isPlainObject(value)) {\n reval.push(objectDeepMerge({}, value));\n } else {\n reval.push(value);\n }\n }\n return reval;\n } else {\n return objectDeepMerge({}, copyValue);\n }\n};\nfunction hasProperty(obj, prop) {\n return obj != null && obj != void 0 && Object.prototype.hasOwnProperty.call(obj, prop);\n}\nfunction isBlank(value) {\n return value === null || value === void 0 || isString(value) && value.trim() === \"\";\n}\nfunction isNumeric(value, typeIgnore = false) {\n if (typeIgnore === true) return !Number.isNaN(value);\n return (typeof value === \"number\" || isString(value) && value.trim() !== \"\" && !isNaN(parseFloat(value))) && isFinite(Number(value));\n}\nfunction objectToQueryString(param) {\n return Object.keys(param).map((key) => {\n if (param.hasOwnProperty(key) && param[key] !== void 0) {\n const val = param[key];\n return `${key}=${isObject(val) ? JSON.stringify(val) : val}`;\n }\n }).filter(Boolean).join(\"&\");\n}\nconst SPEICAL_CHAR_REGEX = {\n \"|\": \"[|]\",\n \"+\": \"[+]\",\n $: \"[$]\",\n \"*\": \"[*]\",\n \"(\": \"\\\\(\",\n \")\": \"\\\\)\",\n \"{\": \"\\\\{\",\n \"}\": \"\\\\}\",\n \"[\": \"\\\\[\",\n \"]\": \"\\\\]\",\n \"\\\\\": \"\\\\\\\\\\\\\\\\\"\n};\nfunction replaceParameter(template, param) {\n const matchObj = template.match(/#.*?#/g);\n if (matchObj == null) return template;\n let returnTemplate = template;\n const tmpKey = {};\n let matchKey;\n let orginKey;\n const paramObjFlag = isPlainObject(param);\n for (let j = 0, matchLen = matchObj.length; j < matchLen; j += 1) {\n orginKey = matchObj[j];\n matchKey = orginKey;\n const keyMatch = matchKey.match(/[*+$|^(){}[\\]]/gi);\n if (keyMatch != null) {\n const tmpReplaceKey = {};\n for (let z = 0, matchKeyLen = keyMatch.length; z < matchKeyLen; z += 1) {\n const specCh = keyMatch[z];\n if (!tmpReplaceKey[specCh]) {\n matchKey = matchKey.replace(new RegExp(SPEICAL_CHAR_REGEX[specCh], \"g\"), SPEICAL_CHAR_REGEX[specCh]);\n tmpReplaceKey[specCh] = specCh;\n }\n }\n }\n if (paramObjFlag) {\n if (!tmpKey[orginKey]) {\n const paramKey = orginKey.replace(/#/g, \"\");\n let replaceValue = param[paramKey] || \"\";\n if (isObject(replaceValue)) {\n replaceValue = JSON.stringify(replaceValue);\n }\n returnTemplate = returnTemplate.replace(new RegExp(matchKey, \"g\"), replaceValue);\n tmpKey[orginKey] = orginKey;\n }\n } else {\n returnTemplate = returnTemplate.replace(new RegExp(matchKey, \"g\"), param);\n }\n }\n return returnTemplate;\n}\nconst xssFilter = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\"\n};\nconst charsToReplace = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\"\n};\nfunction trim(s) {\n return s.replace(/^\\s+|\\s+$/g, \"\");\n}\nfunction leftTrim(s) {\n return s.replace(/^\\s+/g, \"\");\n}\nfunction rightTrim(s) {\n return s.replace(/\\s+$/g, \"\");\n}\nfunction allTrim(s) {\n return s.replace(/\\s+/g, \"\");\n}\nfunction matchCount(str, matchString) {\n if (isBlank(str)) return 0;\n const re = new RegExp(matchString, \"ig\");\n const resultArray = str.match(re);\n return resultArray == null ? 0 : resultArray.length;\n}\nfunction leftPad(str, len, ch = \"0\") {\n return pad(str, len, ch, \"l\");\n}\nfunction leftPadClamp(str, len, ch = \"0\") {\n return pad(str, len, ch, \"l\", true);\n}\nfunction rightPad(str, len, ch = \"0\") {\n return pad(str, len, ch, \"r\");\n}\nfunction rightPadClamp(str, len, ch = \"0\") {\n return pad(str, len, ch, \"r\", true);\n}\nfunction escapeHTML(html) {\n const fn = (tag) => {\n return charsToReplace[tag] || tag;\n };\n return html.replace(/[&<>\"]/g, fn);\n}\nfunction xss(inputText) {\n let returnText = inputText;\n if (returnText) {\n Object.keys(xssFilter).forEach((key) => {\n returnText = returnText.replaceAll(key, xssFilter[key]);\n });\n }\n return returnText;\n}\nfunction unXss(inputText) {\n let returnText = inputText;\n if (returnText) {\n Object.keys(xssFilter).forEach((key) => {\n returnText = returnText.replaceAll(xssFilter[key], key);\n });\n }\n return returnText;\n}\nfunction capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nfunction upperCase(str) {\n return (str || \"\").toUpperCase();\n}\nfunction lowerCase(str) {\n return (str || \"\").toLowerCase();\n}\nfunction pad(orginStr, size, ch, type = \"l\", clamp = false) {\n let str = \"\";\n if (isEmpty(orginStr)) {\n str = \"\";\n } else {\n str = isString(orginStr) ? orginStr : `${orginStr}`;\n }\n const strLength = str.length;\n if (strLength > size) {\n return clamp ? str.slice(0, size) : str;\n }\n const len = size - strLength;\n if (len < 1) return str;\n const padStr = ch.repeat(len);\n return type === \"l\" ? padStr + str : str + padStr;\n}\nfunction uuid(dashRemoveFlag = true) {\n let d = (/* @__PURE__ */ new Date()).getTime();\n const reval = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n return (c === \"x\" ? r : r & 7 | 8).toString(16);\n });\n return dashRemoveFlag ? reval.replace(/-/g, \"\") : reval;\n}\nfunction isFormData(data) {\n if (!data) return false;\n return typeof FormData !== \"undefined\" && data instanceof FormData;\n}\nfunction getURLParams(checkUrl) {\n const url = new URL(checkUrl);\n const params = {};\n for (const key of url.searchParams.keys()) {\n params[key] = url.searchParams.getAll(key);\n }\n return params;\n}\nfunction getURLParam(checkUrl, paramKey) {\n const url = new URL(checkUrl);\n return url.searchParams.get(paramKey);\n}\nconst instanceMap = {};\nconst centerLoadingIntervalObject = {};\nlet G_LOADING_IDX = 0;\nlet defaultOptions = {\n // 사라지는 시간\n timeout: -1,\n // 시간 표시 여부\n enableTime: false,\n // 표시 내용\n content: \"\",\n // background color\n bgColor: \"#ffffff\",\n // z-index\n zIndex: 9999,\n // opacity\n opacity: \"0.3\",\n // 이미지 경로 및 base64 코드\n loadingImg: \"data:image/gif;base64,R0lGODlhIAAgALMLADaJuwRsqx57s8bc65rD3FacxoS21bzX6Njo8eTu9bbT5v///wAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkFBQTEyNEY3MTZBMTFFNTlEMTU4OEI0NTk3MzIxQkYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkFBQTEyNTA3MTZBMTFFNTlEMTU4OEI0NTk3MzIxQkYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQUFBMTI0RDcxNkExMUU1OUQxNTg4QjQ1OTczMjFCRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQUFBMTI0RTcxNkExMUU1OUQxNTg4QjQ1OTczMjFCRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn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\",\n // css cursor\n cursor: \"wait\",\n // 취소 버튼 활성화 여부\n enableCancelButton: false,\n // 취소 벼튼 활성화시 callback 메소드\n callback: (param) => {\n return true;\n }\n};\nclass Loading {\n constructor(selector, options = {}) {\n this.orginStylePosition = \"\";\n if (isBlank(selector)) {\n selector = \"body\";\n }\n if (selector instanceof HTMLElement) {\n this.containerNode = selector;\n this.selector = \"\";\n } else {\n selector = selector || \"body\";\n this.containerNode = document.querySelector(selector);\n this.selector = selector;\n }\n if (!this.containerNode) return;\n this.options = objectDeepMerge(defaultOptions, options);\n instanceMap[this.selector] = this;\n this.show();\n }\n static create(selector, options) {\n return new Loading(selector, options);\n }\n static instance(selector) {\n return instanceMap[selector];\n }\n static setOptions(options) {\n defaultOptions = Object.assign({}, defaultOptions, options);\n }\n cancelHandler() {\n const callback = this.options.callback;\n if (callback) {\n if (callback(this.options) !== false) {\n this.hide();\n }\n } else {\n this.hide();\n }\n }\n /**\n * show loading module\n * @public\n */\n show() {\n var _a, _b, _c;\n const containerNode = this.containerNode;\n if (!containerNode) return;\n if (containerNode.querySelector(\":scope >.daracl-cl\")) return;\n this.orginStylePosition = containerNode.style.position;\n const computedStyle = getComputedStyle(containerNode);\n if (![\"absolute\", \"relative\", \"fixed\", \"sticky\"].includes(computedStyle.position)) {\n containerNode.style.position = \"relative\";\n }\n const opts = this.options;\n let zIndex = opts.zIndex;\n if (defaultOptions.zIndex == opts.zIndex) {\n zIndex += ++G_LOADING_IDX;\n }\n let template = `\n <div class=\"daracl-cl\" style=\"cursor: ${opts.cursor}; top: 0px; left: 0px; z-index: ${zIndex}; position: absolute; width: 100%; height: 100%;\">\n <div style=\"position: absolute; background: ${opts.bgColor}; opacity: ${opts.opacity}; width: 100%; height: 100%; z-index: 1\"></div>\n <div style=\"z-index: 10; text-align: center; margin: 0; position: absolute; top: 40%; left: 50%; transform: translate(-50%, -50%)\">\n ${opts.enableTime ? `<div class=\"daracl-cl-time\" style=\"position: absolute; z-index: ${opts.zIndex + 1}; width: 100%; margin-top: 8px;\">0</div>` : \"\"}\n <img class=\"daracl-cl-image\" src=\"${opts.loadingImg}\" />\n `;\n if (opts.content) {\n template += `<div class=\"daracl-cl-content\">${opts.content}</div>`;\n }\n if (opts.enableCancelButton) {\n template += `<div style=\"height: 35px; line-height: 35px;\"><button type=\"button\" class=\"daracl-cl-btn\">Cancel</button></div>`;\n }\n template += `</div></div>`;\n containerNode.insertAdjacentHTML(\"afterbegin\", template);\n this.loadingElement = containerNode.querySelector(\":scope >.daracl-cl\");\n if (opts.enableCancelButton) {\n (_b = (_a = this.loadingElement) == null ? void 0 : _a.querySelector(\".daracl-cl-btn\")) == null ? void 0 : _b.addEventListener(\"click\", () => this.cancelHandler());\n }\n if (opts.enableTime) {\n const loadingTimeElement = (_c = this.loadingElement) == null ? void 0 : _c.querySelector(\".daracl-cl-time\");\n let sec = 0;\n centerLoadingIntervalObject[this.selector] = window.setInterval(() => {\n loadingTimeElement.innerText = `${++sec}`;\n }, 1e3);\n }\n if (opts.timeout > 0) {\n setTimeout(() => this.hide(), opts.timeout);\n }\n }\n /**\n * set display content\n *\n * @public\n * @param {string} content \n */\n setContent(content) {\n var _a, _b, _c;\n if (!this.containerNode) return;\n const existing = (_a = this.loadingElement) == null ? void 0 : _a.querySelector(\".daracl-cl-content\");\n if (!existing) {\n (_c = (_b = this.loadingElement) == null ? void 0 : _b.querySelector(\".daracl-cl-image\")) == null ? void 0 : _c.insertAdjacentHTML(\"afterend\", `<div class=\"daracl-cl-content\">${content}</div>`);\n } else {\n existing.innerHTML = content;\n }\n }\n /**\n * hide loading module\n *\n * @public\n * @param {?boolean} [flag] \n */\n hide(flag) {\n if (this.containerNode) {\n this.containerNode.style.position = this.orginStylePosition || \"\";\n const loadingEle = this.containerNode.querySelector(\":scope >.daracl-cl\");\n if (loadingEle) {\n this.containerNode.removeChild(loadingEle);\n }\n if (this.options.enableTime) {\n clearInterval(centerLoadingIntervalObject[this.selector]);\n delete centerLoadingIntervalObject[this.selector];\n }\n }\n if (flag !== false) {\n delete instanceMap[this.selector];\n }\n }\n /**\n * destroy loading instance\n *\n * @public\n * @static\n * @param {string} selector \n */\n static destroy(selector) {\n if (instanceMap[selector]) {\n instanceMap[selector].hide(false);\n delete instanceMap[selector];\n }\n }\n}\nclass AjaxAbstract {\n constructor(options) {\n this.options = options;\n }\n // 객체 내부에 File/Blob/FileList가 있는지 재귀 검사\n containsFile(data) {\n if (!data) return false;\n if (typeof File !== \"undefined\" && (data instanceof File || data instanceof Blob)) return true;\n if (typeof FileList !== \"undefined\" && data instanceof FileList) return true;\n if (isArray(data)) {\n for (const item of data) {\n if (this.containsFile(item)) return true;\n }\n return false;\n }\n if (isObject(data)) {\n for (const key of Object.keys(data)) {\n if (this.containsFile(data[key])) return true;\n }\n }\n return false;\n }\n // GET용: URL에 데이터를 쿼리 스트링으로 추가합니다.\n getUrlWithData(url, method, data) {\n if (method !== \"GET\") return url;\n if (!data) return url;\n if (isFormData(data)) return url;\n const qs = objectToQueryString(data);\n return url + (url.includes(\"?\") ? \"&\" : \"?\") + qs;\n }\n // 단순 객체(파일 포함 가능)를 FormData로 변환\n buildFormDataFromObject(obj) {\n const form = new FormData();\n const appendValue = (key, value) => {\n if (value === null || value === void 0) {\n return;\n }\n if (typeof File !== \"undefined\" && (value instanceof File || value instanceof Blob)) {\n form.append(key, value);\n return;\n }\n if (typeof FileList !== \"undefined\" && value instanceof FileList) {\n for (let i = 0; i < value.length; i++) {\n form.append(key + (key.endsWith(\"[]\") ? \"\" : \"[]\"), value[i]);\n }\n return;\n }\n if (Array.isArray(value)) {\n for (const v of value) {\n if (typeof File !== \"undefined\" && (v instanceof File || v instanceof Blob)) {\n form.append(key + (key.endsWith(\"[]\") ? \"\" : \"[]\"), v);\n } else {\n form.append(key + (key.endsWith(\"[]\") ? \"\" : \"[]\"), typeof v === \"object\" ? JSON.stringify(v) : String(v));\n }\n }\n return;\n }\n if (isObject(value)) {\n form.append(key, JSON.stringify(value));\n return;\n }\n form.append(key, String(value));\n };\n if (isObject(obj)) {\n for (const k of Object.keys(obj)) {\n appendValue(k, obj[k]);\n }\n } else {\n appendValue(\"file\", obj);\n }\n return form;\n }\n}\nclass FetchAjax extends AjaxAbstract {\n constructor(options) {\n super(options);\n }\n // Fetch 요청을 처리합니다.\n async request(url, method, opts) {\n const hasFormData = isFormData(opts.data);\n const containsFile = !hasFormData && this.containsFile(opts.data);\n let preparedData = opts.data;\n if (containsFile && !hasFormData) {\n preparedData = this.buildFormDataFromObject(opts.data);\n }\n const finalUrl = this.getUrlWithData(url, method, preparedData);\n const { loadingInstance, abortController } = this.prepareRequest(opts);\n let timeoutId = null;\n let isTimeout = false;\n if (opts.timeout && opts.timeout > 0 && abortController) {\n timeoutId = setTimeout(() => {\n isTimeout = true;\n abortController.abort();\n }, opts.timeout);\n }\n const fetchHeaders = opts.headers ? { ...opts.headers } : void 0;\n let body = void 0;\n if (method !== \"GET\") {\n if (isFormData(preparedData)) {\n body = preparedData;\n if (fetchHeaders) {\n Object.keys(fetchHeaders).forEach((k) => {\n if (k.toLowerCase() === \"content-type\") delete fetchHeaders[k];\n });\n }\n } else if (containsFile) {\n body = preparedData;\n if (fetchHeaders) {\n Object.keys(fetchHeaders).forEach((k) => {\n if (k.toLowerCase() === \"content-type\") delete fetchHeaders[k];\n });\n }\n } else if (isObject(preparedData)) {\n const contentType = fetchHeaders && (fetchHeaders[\"Content-Type\"] || fetchHeaders[\"content-type\"]) || \"\";\n if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n body = objectToQueryString(preparedData);\n } else {\n if (fetchHeaders && !(\"Content-Type\" in fetchHeaders) && !(\"content-type\" in fetchHeaders)) {\n fetchHeaders[\"Content-Type\"] = \"application/json\";\n }\n body = JSON.stringify(preparedData);\n }\n } else if (preparedData != null) {\n body = preparedData;\n }\n }\n const fetchOptions = {\n method,\n headers: fetchHeaders,\n body,\n signal: abortController == null ? void 0 : abortController.signal\n };\n try {\n const response = await fetch(finalUrl, fetchOptions);\n if (timeoutId) clearTimeout(timeoutId);\n const text = await response.text();\n let data = text;\n if (opts.responseType === \"json\") {\n try {\n data = JSON.parse(text);\n } catch (e) {\n data = { error: e.message };\n }\n }\n if (!response.ok) {\n return Promise.reject(\n this.createError({\n type: \"http\",\n status: response.status,\n statusText: response.statusText,\n responseText: text,\n xhr: response,\n loadingInstance\n })\n );\n }\n return {\n data,\n status: response.status,\n responseText: text,\n config: opts,\n headers: this.parseFetchHeaders(response),\n loadingInstance\n };\n } catch (err) {\n if (timeoutId) clearTimeout(timeoutId);\n let errorType = \"network\";\n if (err.name === \"AbortError\") {\n errorType = isTimeout ? \"timeout\" : \"abort\";\n }\n return Promise.reject(\n this.createError({\n type: errorType,\n error: err,\n loadingInstance\n })\n );\n }\n }\n // 요청 준비를 처리합니다.\n prepareRequest(opts) {\n var _a;\n let loadingInstance = null;\n let abortController = null;\n const loaderSelector = opts.loaderContainer;\n if (loaderSelector) {\n if (((_a = opts.loaderOption) == null ? void 0 : _a.enableCancelButton) && typeof AbortController !== \"undefined\") {\n abortController = new AbortController();\n const originalCallback = opts.loaderOption.callback;\n opts.loaderOption.callback = () => {\n abortController.abort();\n if (originalCallback) originalCallback(opts);\n };\n }\n loadingInstance = new Loading(loaderSelector, opts.loaderOption);\n }\n if (opts.beforeRequest) opts.beforeRequest.call(null, opts, null, loadingInstance);\n return { loadingInstance, abortController };\n }\n // 응답 headers를 파싱합니다.\n parseFetchHeaders(response) {\n const headersObj = {};\n response.headers.forEach((value, key) => {\n headersObj[key] = value;\n });\n return headersObj;\n }\n // 오류 객체를 생성합니다.\n createError(params) {\n const { type, xhr, status, statusText, responseText, error, loadingInstance } = params;\n const reqXhr = xhr || {};\n return {\n type,\n status: status ?? reqXhr.status ?? 0,\n statusText: statusText ?? reqXhr.statusText ?? \"\",\n responseText: responseText ?? \"\",\n error: error ?? null,\n xhr,\n loadingInstance\n };\n }\n}\nclass XHRAjax extends AjaxAbstract {\n constructor(options) {\n super(options);\n }\n async request(url, method, opts) {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n const hasFormData = isFormData(opts.data);\n const containsFile = !hasFormData && this.containsFile(opts.data);\n let preparedData = opts.data;\n if (containsFile) {\n preparedData = this.buildFormDataFromObject(opts.data);\n }\n const finalUrl = this.getUrlWithData(url, method, preparedData);\n xhr.open(method, finalUrl, opts.async !== false);\n if (opts.timeout && opts.timeout > 0) xhr.timeout = opts.timeout;\n this.setHeaders(xhr, opts, hasFormData || containsFile);\n xhr.open(method, finalUrl, opts.async !== false);\n if (opts.timeout && opts.timeout > 0) xhr.timeout = opts.timeout;\n this.setHeaders(xhr, opts, hasFormData || containsFile);\n const onUploadProgress = opts.onUploadProgress;\n const onDownloadProgress = opts.onDownloadProgress;\n if (isFunction(onUploadProgress) && xhr.upload) {\n xhr.upload.onprogress = (ev) => {\n try {\n onUploadProgress({ xhr, ev });\n } catch (e) {\n onDownloadProgress({ xhr, ev, error: e });\n }\n };\n }\n if (isFunction(onDownloadProgress)) {\n xhr.onprogress = (ev) => {\n try {\n onDownloadProgress({ xhr, ev });\n } catch (e) {\n onDownloadProgress({ xhr, ev, error: e });\n }\n };\n }\n const { loadingInstance } = this.prepareRequest(opts, xhr);\n let errorHandled = false;\n xhr.onreadystatechange = () => {\n if (xhr.readyState === XMLHttpRequest.DONE) {\n if (xhr.status >= 200 && xhr.status < 300) {\n if (!errorHandled) {\n const response = this.parseResponse(xhr, opts);\n resolve({ ...response, loadingInstance });\n }\n } else if (xhr.status > 0) {\n reject(this.createError({ type: \"http\", xhr, loadingInstance }));\n }\n }\n };\n xhr.onerror = () => {\n if (errorHandled) return;\n errorHandled = true;\n reject(this.createError({ type: \"network\", xhr, loadingInstance }));\n };\n xhr.ontimeout = () => {\n if (errorHandled) return;\n errorHandled = true;\n reject(this.createError({ type: \"timeout\", xhr, loadingInstance }));\n };\n xhr.onabort = () => {\n if (errorHandled) return;\n errorHandled = true;\n reject(this.createError({ type: \"abort\", xhr, loadingInstance }));\n };\n if (method === \"GET\" || !preparedData) {\n xhr.send();\n } else if (isFormData(preparedData)) {\n xhr.send(preparedData);\n } else if (isObject(preparedData)) {\n const contentType = opts.headers && opts.headers[\"Content-Type\"] || \"\";\n if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n xhr.send(objectToQueryString(preparedData));\n } else {\n xhr.send(JSON.stringify(preparedData));\n }\n } else {\n xhr.send(preparedData);\n }\n });\n }\n // 응답을 파싱합니다.\n parseResponse(xhr, opts) {\n let responseText = xhr.responseText;\n let data = responseText;\n if (opts.responseType === \"json\") {\n try {\n data = JSON.parse(xhr.responseText);\n } catch (e) {\n data = { error: e.message };\n }\n }\n return {\n data,\n status: xhr.status,\n readyState: xhr.readyState,\n responseText,\n headers: this.getResponseHeaders(xhr)\n };\n }\n // 응답 headers를 파싱합니다.\n getResponseHeaders(xhr) {\n const headersObj = {};\n const allHeaders = xhr.getAllResponseHeaders();\n const lines = allHeaders.trim().split(/[\\r\\n]+/);\n for (const line of lines) {\n const parts = line.split(\": \");\n const key = parts.shift();\n const value = parts.join(\": \");\n if (key) headersObj[key] = value;\n }\n return headersObj;\n }\n // 요청 headers를 설정합니다.\n // isFormData가 true이면 Content-Type을 설정하지 않아 브라우저가 boundary 포함한 적절한 헤더를 생성하도록 함\n setHeaders(xhr, opts, isFormData2 = false) {\n const headers = opts.headers || {};\n if (!isFormData2) {\n if (!hasProperty(headers, \"Content-Type\")) {\n headers[\"Content-Type\"] = isObject(opts.data) ? \"application/json\" : \"application/x-www-form-urlencoded\";\n }\n for (const key of Object.keys(headers)) {\n if (headers[key]) xhr.setRequestHeader(key, headers[key]);\n }\n } else {\n for (const key of Object.keys(headers)) {\n if (key.toLowerCase() === \"content-type\") continue;\n if (headers[key]) xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n // 요청 준비를 처리합니다.\n prepareRequest(opts, xhr) {\n var _a;\n let loadingInstance = null;\n const loaderSelector = opts.loaderContainer;\n if (loaderSelector) {\n if ((_a = opts.loaderOption) == null ? void 0 : _a.enableCancelButton) {\n const originalCallback = opts.loaderOption.callback;\n opts.loaderOption.callback = () => {\n xhr.abort();\n if (originalCallback) originalCallback(opts);\n };\n }\n loadingInstance = new Loading(loaderSelector, opts.loaderOption);\n }\n if (opts.beforeRequest) opts.beforeRequest.call(null, opts, null, loadingInstance);\n return { loadingInstance };\n }\n // 오류 객체를 생성합니다. \n createError(params) {\n const { type, xhr, status, statusText, responseText, error, loadingInstance } = params;\n return {\n type,\n status: status ?? (xhr ? xhr.status : 0),\n statusText: statusText ?? (xhr ? xhr.statusText : \"\"),\n responseText: responseText ?? (xhr ? xhr.responseText : \"\"),\n error: error ?? null,\n xhr,\n loadingInstance\n };\n }\n}\nclass Ajax {\n constructor(options) {\n this.options = objectDeepMerge(this.createGlobalAjaxOptions(), options || {});\n this.fetchAjax = new FetchAjax(this.options);\n this.xhrAjax = new XHRAjax(this.options);\n this.isFetchSupported = typeof window !== \"undefined\" && \"fetch\" in window;\n }\n createGlobalAjaxOptions() {\n return {\n baseUrl: \"\",\n method: \"POST\",\n timeout: -1,\n responseType: \"json\",\n headers: { \"X-Requested-With\": \"XMLHttpRequest\" },\n loaderContainer: \"\",\n enableDefaultLoader: false,\n loaderOption: {},\n validMethods: [\"GET\", \"POST\", \"PUT\", \"DELETE\"],\n errorAlertView: false,\n ignoreResultCheck: false,\n fetchMode: \"xhr\"\n };\n }\n createDefaultOptions() {\n const opts = this.options;\n return {\n url: \"\",\n method: opts.method,\n timeout: opts.timeout,\n responseType: opts.responseType,\n headers: opts.headers,\n loaderContainer: \"\",\n loaderOption: {},\n errorAlertView: opts.errorAlertView,\n ignoreResultCheck: opts.ignoreResultCheck\n };\n }\n /**\n * Ajax 인스턴스를 생성합니다.\n * @param {?AjaxOptions} [options] ajax 옵션\n * @returns {Ajax} Ajax 인스턴스\n */\n static create(options) {\n return new Ajax(options);\n }\n _request(url, method, options, useFetch = true) {\n var _a;\n url = this.options.baseUrl ? this.options.baseUrl + url : url;\n const data = options == null ? void 0 : options.data;\n const opts = objectDeepMerge(this.createDefaultOptions(), options || {}, { _excludeKeys: [\"data\"] });\n opts.data = data;\n const ajaxMethod = (method || opts.method || \"GET\").toUpperCase();\n if (!((_a = this.options.validMethods) == null ? void 0 : _a.includes(ajaxMethod))) {\n return Promise.reject(\n {\n type: \"http\",\n status: 405,\n readyState: 0,\n statusText: \"Invalid Method\",\n responseText: `Invalid HTTP method: ${ajaxMethod}`,\n xhr: null,\n loadingInstance: null\n }\n );\n }\n opts.loaderContainer = opts.loaderContainer || (this.options.enableDefaultLoader ? this.options.loaderContainer || \"body\" : null);\n const returnPromise = this.isFetchSupported && this.options.fetchMode == \"fetch\" ? this.fetchAjax.request(url, ajaxMethod, opts) : this.xhrAjax.request(url, ajaxMethod, opts);\n return returnPromise.then((response) => {\n if (response.loadingInstance) response.loadingInstance.hide();\n return Promise.resolve(response);\n }).catch((error) => {\n if (error.loadingInstance) error.loadingInstance.hide();\n return Promise.reject(error);\n });\n }\n /**\n * 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*} \n */\n request(options, useFetch = true) {\n const url = (options == null ? void 0 : options.url) || \"\";\n return this._request(url, options == null ? void 0 : options.method, options, useFetch);\n }\n /**\n * get 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*} \n */\n get(url, options, useFetch = true) {\n return this._request(url, \"GET\", options, useFetch);\n }\n /**\n * post 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*} \n */\n post(url, options, useFetch = true) {\n return this._request(url, \"POST\", options, useFetch);\n }\n /**\n * put 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*} \n */\n put(url, options, useFetch = true) {\n return this._request(url, \"PUT\", options, useFetch);\n }\n /**\n * DELETE 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*} \n */\n delete(url, options, useFetch = true) {\n return this._request(url, \"DELETE\", options, useFetch);\n }\n}\nfunction $querySelectorList(el) {\n if (isBlank(el)) {\n return [];\n }\n if (isString(el)) {\n return Array.from(document.querySelectorAll(el));\n }\n if (isArray(el)) {\n return el;\n }\n if (el instanceof Document) {\n return [document];\n }\n if (el instanceof Element) {\n return [el];\n }\n if (el instanceof NodeList) {\n return Array.from(el);\n }\n return [];\n}\nfunction $querySelector(el) {\n if (isBlank(el)) {\n return null;\n }\n if (el instanceof Document) {\n return document;\n }\n if (el instanceof Element) {\n return el;\n }\n if (isString(el)) {\n return document.querySelector(el);\n }\n if (isArray(el)) {\n return el[0];\n }\n if (el instanceof NodeList) {\n return el.item(0);\n }\n return null;\n}\nfunction getElementRect(el, includeScroll = false) {\n if (!el) {\n throw new Error(\"유효하지 않은 요소입니다.\");\n }\n const rect = el.getBoundingClientRect();\n const scrollX = includeScroll ? window.scrollX : 0;\n const scrollY = includeScroll ? window.scrollY : 0;\n return {\n top: rect.top + scrollY,\n left: rect.left + scrollX,\n bottom: rect.bottom + scrollY,\n right: rect.right + scrollX,\n width: rect.width,\n height: rect.height\n };\n}\nfunction before(el, renderElements) {\n insertAdjacentHTML($querySelectorList(el), \"beforebegin\", renderElements);\n}\nfunction after(el, renderElements) {\n insertAdjacentHTML($querySelectorList(el), \"afterend\", renderElements);\n}\nfunction prepend(el, renderElements) {\n insertAdjacentHTML($querySelectorList(el), \"afterbegin\", renderElements);\n}\nfunction append(el, renderElements) {\n insertAdjacentHTML($querySelectorList(el), \"beforeend\", renderElements);\n}\nfunction insertAdjacentHTML(elements, insertPosition, renderElements) {\n if (isString(renderElements)) {\n elements.forEach((el) => {\n el.insertAdjacentHTML(insertPosition, renderElements);\n });\n } else {\n elements.forEach((el) => {\n el.insertAdjacentElement(insertPosition, renderElements);\n });\n }\n}\nfunction eqAttributeValue(element, attr, value) {\n return element.getAttribute(attr) == value;\n}\nfunction addAttr(el, attrs) {\n for (let key in attrs) {\n el.setAttribute(key, attrs[key]);\n }\n}\nfunction removeAttr(element, ...attrKey) {\n let elements;\n if (element instanceof HTMLElement) {\n elements = [element];\n } else {\n elements = element;\n }\n elements.forEach((ele) => {\n for (let attr of attrKey) {\n ele.removeAttribute(attr);\n }\n });\n}\nconst styleClassSplit = (styleClass) => {\n return styleClass.trim().split(/\\s+/);\n};\nfunction addClass(element, styleClass) {\n if (!element) return;\n const elements = $querySelectorList(element);\n const addStyles = styleClassSplit(styleClass);\n elements.forEach((el) => {\n el.classList.add(...addStyles);\n });\n}\nfunction removeClass(element, classNames) {\n if (!element || typeof classNames !== \"string\") return;\n const elements = $querySelectorList(element);\n const styleClasses = styleClassSplit(classNames);\n for (const el of elements) {\n el.classList.remove(...styleClasses);\n }\n}\nfunction toggleClass(element, classNames) {\n if (!element || typeof classNames !== \"string\") return;\n const elements = $querySelectorList(element);\n const styleClasses = styleClassSplit(classNames);\n for (const el of elements) {\n styleClasses.forEach((cls) => {\n el.classList.toggle(cls);\n });\n }\n}\nfunction addStyleCss(element, styles) {\n for (const key in styles) {\n if (Object.prototype.hasOwnProperty.call(styles, key)) {\n element.style.setProperty(key, styles[key]);\n }\n }\n}\nfunction keyboardEventKey(e) {\n return (e.key || \"\").toLowerCase();\n}\nfunction eventKeyCode(e) {\n const evt = e;\n if (typeof evt.keyCode === \"number\" && evt.keyCode > 0) {\n return evt.keyCode;\n }\n if (typeof evt.which === \"number\" && evt.which > 0) {\n return evt.which;\n }\n return void 0;\n}\nfunction isShiftKey(evt) {\n return evt.shiftKey;\n}\nfunction isCtrlKey(evt) {\n return evt.ctrlKey;\n}\nfunction isSpacebar(evt) {\n const event = evt;\n if (event.key === \" \" || event.code === \"Space\") {\n return true;\n }\n return false;\n}\nfunction isEnter(evt) {\n const event = evt;\n if (event.key === \"Enter\" || event.code === \"Enter\") {\n return true;\n }\n return false;\n}\nfunction stopPreventCancel(e) {\n e.preventDefault();\n e.stopPropagation();\n}\nfunction eventPosition(e) {\n let evt;\n if (typeof TouchEvent !== \"undefined\" && e instanceof TouchEvent && e.touches.length > 0) {\n evt = e.touches[0];\n } else if (e instanceof MouseEvent) {\n evt = e;\n } else {\n evt = { pageX: 0, pageY: 0 };\n }\n return {\n x: evt.pageX,\n y: evt.pageY\n };\n}\nfunction isClickEvent(e) {\n if (e.type === \"touchstart\") {\n return true;\n }\n if (e instanceof MouseEvent) {\n return e.button === 0;\n }\n return false;\n}\nfunction formatMessage(msgFormat, msgParam) {\n return msgFormat.replace(new RegExp(\"(?<![\\\\$\\\\\\\\])\\\\{([A-Za-z0-9_.]+)\\\\}\", \"g\"), (match, key) => {\n return key in msgParam ? String(msgParam[key]) : match;\n });\n}\nconst VERSION = `${\"0.0.5\"}`;\nexport {\n $querySelector,\n $querySelectorList,\n Ajax,\n Loading,\n VERSION,\n addAttr,\n addClass,\n addStyleCss,\n after,\n allTrim,\n append,\n arrayDeepMerge,\n before,\n capitalize,\n deepCopy,\n eqAttributeValue,\n escapeHTML,\n eventKeyCode,\n eventPosition,\n formatMessage,\n getElementRect,\n getURLParam,\n getURLParams,\n hasProperty,\n isArray,\n isBlank,\n isClickEvent,\n isCtrlKey,\n isDate,\n isEmpty,\n isEnter,\n isFormData,\n isFunction,\n isNil,\n isNumeric,\n isObject,\n isPlainObject,\n isShiftKey,\n isSpacebar,\n isString,\n isUndefined,\n keyboardEventKey,\n leftPad,\n leftPadClamp,\n leftTrim,\n lowerCase,\n matchCount,\n objectDeepMerge,\n objectToQueryString,\n prepend,\n removeAttr,\n removeClass,\n replaceParameter,\n rightPad,\n rightPadClamp,\n rightTrim,\n stopPreventCancel,\n styleClassSplit,\n toggleClass,\n trim,\n unXss,\n upperCase,\n uuid,\n xss\n};\n//# sourceMappingURL=index.js.map\n","import { FormField } from \"@t/FormField\";\r\nimport { isArray as coreIsArray} from \"@daracl/core\";\r\n\r\nconst xssFilter = {\r\n \"&\": \"&\",\r\n \"<\": \"<\",\r\n \">\": \">\",\r\n '\"': \""\",\r\n \"'\": \"'\",\r\n} as any;\r\n\r\nexport const replaceXss = (inputText: string): string => {\r\n let returnText = inputText;\r\n if (returnText) {\r\n Object.keys(xssFilter).forEach((key) => {\r\n returnText = returnText.replaceAll(key, xssFilter[key]);\r\n });\r\n }\r\n return returnText;\r\n};\r\n\r\nexport const hasOwnProp = (obj: any, key: string): boolean => {\r\n return obj.hasOwnProperty(key);\r\n};\r\n\r\nexport const unReplace = (inputText: string): string => {\r\n let returnText = inputText;\r\n\r\n if (returnText) {\r\n Object.keys(xssFilter).forEach((key) => {\r\n returnText = returnText.replaceAll(xssFilter[key], key);\r\n });\r\n }\r\n return returnText;\r\n};\r\n\r\nexport const unFieldName = (fieldName: string): string => {\r\n if (fieldName) {\r\n return unReplace(fieldName).replaceAll('\"', '\\\\\"');\r\n }\r\n return \"\";\r\n};\r\nexport const isBlank = (value: any): boolean => {\r\n if (value === null) return true;\r\n if (value === \"\") return true;\r\n if (typeof value === \"undefined\") return true;\r\n if (typeof value === \"string\" && (value === \"\" || value.replace(/\\s/g, \"\") === \"\")) return true;\r\n\r\n return false;\r\n};\r\n\r\nexport const isUndefined = (value: any): value is undefined => {\r\n return typeof value === \"undefined\";\r\n};\r\n\r\nexport const isFunction = (value: any): boolean => {\r\n return typeof value === \"function\";\r\n};\r\n\r\nexport const isString = (value: any): value is string => {\r\n return typeof value === \"string\";\r\n};\r\nexport const isNumber = (value: any): value is number => {\r\n if (isBlank(value)) {\r\n return false;\r\n }\r\n value = +value;\r\n return !isNaN(value);\r\n};\r\n\r\nexport const isArray = (value: any): value is Array<any> => {\r\n return coreIsArray(value);\r\n};\r\n\r\n/**\r\n * 값있는지 여부 체크.\r\n *\r\n * @param {*} value\r\n * @returns {boolean}\r\n */\r\nexport const isEmpty = (value: any): boolean => isUndefined(value) || value == null; //_isEmpty(value);\r\n\r\n/**\r\n * tab render type check\r\n *\r\n * @param {FormField} field\r\n * @returns {boolean} tab type 인지 여부\r\n */\r\nexport const isTabType = (field: FormField): boolean => {\r\n return field && field.renderType === \"tab\";\r\n};\r\n/**\r\n * grid render type check\r\n *\r\n * @param {FormField} field\r\n * @returns {boolean} grid type 인지 여부\r\n */\r\nexport const isGridType = (field: FormField): boolean => {\r\n return field && field.renderType === \"grid\";\r\n};\r\nexport const replaceXssField = (field: FormField): FormField => {\r\n field.$xssName = getXssFieldName(field);\r\n\r\n field.label = replaceXss(field.label);\r\n return field;\r\n};\r\n\r\n/**\r\n * 값을 무시하는 필드\r\n *\r\n * @param field formField\r\n * @returns\r\n */\r\nexport const ignoreValueField = (field: FormField): boolean => {\r\n return isGridType(field.$parent) || isTabType(field.$parent);\r\n};\r\n\r\n/**\r\n * grid field name xss repalce\r\n *\r\n * @param {FormField} field\r\n * @returns {string} replace 된 field name\r\n */\r\nexport const getXssFieldName = (field: FormField): string => {\r\n if (isUndefined(field.$xssName)) {\r\n let returnText = field.name;\r\n if (returnText) {\r\n Object.keys(xssFilter).forEach((key) => {\r\n returnText = returnText.replaceAll(key, \"_\");\r\n });\r\n }\r\n\r\n return \"df_\" + returnText;\r\n }\r\n\r\n return field.$xssName;\r\n};\r\n\r\nexport const getHashCode = (str: string) => {\r\n let hash = 0;\r\n if (str.length == 0) return hash;\r\n for (let i = 0; i < str.length; i++) {\r\n let tmpChar = str.charCodeAt(i);\r\n hash = (hash << 5) - hash + tmpChar;\r\n hash = hash & hash;\r\n }\r\n return String(hash).replaceAll(/-/g, \"_\");\r\n};\r\n\r\nexport const isHiddenField = (field: FormField): boolean => {\r\n if (field.renderType === \"hidden\") {\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nexport const templateToElement = (htmlTemplate: string): Element | null => {\r\n const template = document.createElement(\"template\");\r\n template.innerHTML = htmlTemplate;\r\n return template.content.firstElementChild;\r\n};\r\n\r\nexport function isPlainObject(obj: any) {\r\n // 객체가 아닌 경우 또는 null인 경우 false 반환\r\n if (typeof obj !== \"object\" || obj === null) {\r\n return false;\r\n }\r\n\r\n // 프로토타입 체인을 따라 Object 생성자를 찾음\r\n let proto = obj;\r\n while (Object.getPrototypeOf(proto) !== null) {\r\n proto = Object.getPrototypeOf(proto);\r\n }\r\n\r\n // Object 생성자의 prototype과 같으면 Plain Object로 판단\r\n return Object.getPrototypeOf(obj) === proto;\r\n}\r\n\r\nfunction isObject(value: any) {\r\n return typeof value === \"object\" && value !== null && !isArray(value);\r\n}\r\n\r\nfunction isDate(value: any) {\r\n return value instanceof Date && !isNaN(value.valueOf());\r\n}\r\n\r\n/**\r\n * object merge\r\n * \r\n * @example\r\n ```\r\n merge({},{aaa:'bbb',ccc:'ddd'},{bbb:'bbb','aaa':'aaa'})) -> {\"aaa\": \"aaa\", \"bbb\": \"bbb\", \"ccc\": \"ddd\"}\r\n ```\r\n * @param {...any[]} value\r\n * @returns {object}\r\n */\r\nexport const merge = (...value: any[]): any => {\r\n let reval = value[0];\r\n\r\n if (!isPlainObject(reval) || isEmpty(reval)) {\r\n return reval;\r\n }\r\n\r\n let i = 1;\r\n if (Object.keys(reval).length > 0) {\r\n i = 0;\r\n reval = isArray(reval) ? [] : {};\r\n }\r\n const argLen = value.length;\r\n for (; i < argLen; i += 1) {\r\n cloneDeep(reval, value[i]);\r\n }\r\n\r\n return reval;\r\n};\r\n\r\nfunction trim(s: string): string {\r\n return s.replace(/^\\s+|\\s+$/g, \"\");\r\n}\r\n\r\nfunction cloneDeep(dst: any, src: any): any {\r\n if (isObject(src)) {\r\n return cloneObjectDeep(dst, src);\r\n }\r\n\r\n if (isArray(src)) {\r\n return cloneArrayDeep(dst, src);\r\n }\r\n\r\n if (isDate(src)) {\r\n return new src.constructor(src);\r\n }\r\n return src;\r\n}\r\n\r\n/*eslint no-param-reassign: \"error\"*/\r\nfunction cloneObjectDeep(dst: any, src: any): object {\r\n if (isFunction(src)) {\r\n return src;\r\n }\r\n\r\n for (const key of Object.keys(src)) {\r\n const val = (src as any)[key];\r\n\r\n if (isUndefined(val)) {\r\n continue;\r\n }\r\n\r\n if (val === null) {\r\n dst[key] = val;\r\n } else if (isFunction(val)) {\r\n dst[key] = val;\r\n } else if (isEmpty(dst[key])) {\r\n dst[key] = cloneDeep(isArray(val) ? [] : {}, val);\r\n } else if (!isObject(val)) {\r\n dst[key] = val;\r\n } else {\r\n cloneDeep(dst[key], val);\r\n }\r\n }\r\n return dst;\r\n}\r\n\r\nfunction cloneArrayDeep(dst: any, src: any[]) {\r\n const isObj = isPlainObject(dst);\r\n\r\n for (let i = 0; i < src.length; i += 1) {\r\n const val = src[i];\r\n let newVal;\r\n\r\n if (val == null) {\r\n newVal = val;\r\n } else {\r\n newVal = cloneDeep(isArray(val) ? [] : {}, val);\r\n }\r\n\r\n if (isObj) {\r\n (dst as any)[i] = newVal;\r\n } else {\r\n dst.push(newVal);\r\n }\r\n }\r\n return dst;\r\n}\r\n","import { FormField } from \"@t/FormField\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\n\nexport abstract class Render {\n protected daraForm;\n protected rowElement;\n protected field;\n\n private enableView: boolean = true;\n\n constructor(form: DaraForm, field: FormField, rowElement: HTMLElement) {\n this.daraForm = form;\n this.field = field;\n this.rowElement = rowElement;\n this.createField();\n\n if (field.tooltip) rowElement.querySelector(\".df-tooltip\")?.setAttribute(\"tooltip\", field.tooltip);\n }\n\n public setDefaultInfo() {\n if (utils.isUndefined(this.field.defaultValue)) {\n this.setValue(\"\", false);\n } else {\n this.setValue(this.field.defaultValue, false);\n }\n\n if (!utils.isUndefined(this.field.placeholder)) {\n const ele = this.getElement();\n if (ele instanceof Element) {\n ele.setAttribute(\"placeholder\", this.field.placeholder);\n }\n }\n }\n\n public setDefaultOption() {\n this.setDisabled(this.field.disabled ?? false);\n }\n\n public addChildField(element: Element) {\n this.rowElement.querySelector(\".df-field-container\")?.append(element);\n }\n\n static isDataRender(): boolean {\n return true;\n }\n\n static isChildrenCreate(): boolean {\n return true;\n }\n\n public getForm(): DaraForm {\n return this.daraForm;\n }\n\n public abstract mounted(): void;\n public abstract getValue(): any;\n public abstract setValue(value: any, changeCheckFlag?: boolean): void;\n public abstract reset(): void;\n public abstract getElement(): any;\n public abstract valid(): ValidResult | boolean;\n public abstract createField(): void;\n\n public setValueItems(value: any): void {}\n\n public static getDescriptionTemplate(field: FormField): string {\n const classNames = field.descriptionClass ? utils.replaceXss(field.descriptionClass) : \"\";\n const style = field.descriptionStyle ? 'style=\"' + utils.replaceXss(field.descriptionStyle) + '\"' : \"\";\n\n return field.description ? `<div class=\"df-description ${classNames}\" ${style}>${field.description}</div>` : \"\";\n }\n\n public changeEventCall(field: FormField, e: Event | null, rederInfo: Render, fieldValue: any): boolean | undefined {\n if (field.onChange) {\n let changeInfo: any = {\n field: field,\n evt: e,\n oldValue: field.$value,\n value: fieldValue,\n };\n\n if (field.listItem?.list) {\n let valuesItem = [];\n const valueKey = Render.valuesValueKey(field);\n\n for (let val of field.listItem.list) {\n let changeVal = val[valueKey];\n if (utils.isString(fieldValue)) {\n if (changeVal == fieldValue) {\n valuesItem.push(val);\n break;\n }\n } else if (utils.isArray(fieldValue)) {\n if (fieldValue.includes(changeVal)) {\n valuesItem.push(val);\n }\n }\n }\n\n changeInfo.valueItems = valuesItem;\n }\n\n if (changeInfo.oldValue != changeInfo.value && field.onChange.call(null, changeInfo) === false) {\n rederInfo.setValue(field.$value, false);\n return false;\n }\n\n field.$value = changeInfo.value;\n }\n\n this.daraForm.conditionCheck();\n }\n\n public focus() {\n this.getElement().focus();\n }\n\n public isEnableView() {\n return this.enableView;\n }\n\n public show() {\n this.enableView = true;\n this.rowElement.classList.remove(\"df-hidden\");\n }\n\n public hide() {\n this.enableView = false;\n if (!this.rowElement.classList.contains(\"df-hidden\")) {\n this.rowElement.classList.add(\"df-hidden\");\n }\n }\n\n /**\n * 설명 추가\n *\n * @public\n * @param {string} desc\n */\n public setDescription(desc: string) {\n const descEle = this.rowElement.querySelector(\".df-description\");\n if (descEle) {\n descEle.textContent = desc;\n } else {\n const fieldEle = this.rowElement.querySelector(\".df-field\");\n if (fieldEle) {\n const parser = new DOMParser();\n this.field.description = desc;\n const descEle = parser.parseFromString(Render.getDescriptionTemplate(this.field), \"text/html\").querySelector(\".df-description\");\n\n if (descEle) fieldEle.parentNode?.insertBefore(descEle, fieldEle.nextSibling);\n }\n }\n }\n\n public setActive(id: string): void {\n //console.log(\"parent\");\n }\n\n public setDisabled(flag: boolean) {\n const ele = this.getElement();\n if (ele instanceof HTMLElement) {\n if (flag === false) {\n this.getElement().removeAttribute(\"disabled\");\n } else {\n this.getElement().setAttribute(\"disabled\", true);\n }\n }\n }\n\n public commonValidator() {\n //this.field.diff\n }\n\n public static valuesValueKey(field: FormField): string {\n return field.listItem?.valueField ? field.listItem.valueField : \"value\";\n }\n\n public static valuesLabelKey(field: FormField): string {\n return field.listItem?.labelField ? field.listItem.labelField : \"label\";\n }\n\n public static valuesLabelValue(label: string, val: any) {\n let replaceFlag = false;\n const resultValue = label.replace(/\\{\\{([A-Za-z0-9_.]*)\\}\\}/g, (match, key) => {\n replaceFlag = true;\n return val[key] || \"\";\n });\n\n if (replaceFlag) {\n return resultValue;\n }\n\n return val[label] || \"\";\n }\n}\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\n\r\nconst regexp = {\r\n mobile: /^\\d{3}-\\d{3,4}-\\d{4}$/,\r\n email: /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/,\r\n url: /^(?:(?:https?|HTTPS?|ftp|FTP):\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-zA-Z\\u00a1-\\uffff0-9]-*)*[a-zA-Z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-zA-Z\\u00a1-\\uffff0-9]-*)*[a-zA-Z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-zA-Z\\u00a1-\\uffff]{2,}))\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/,\r\n number: /\\d$/,\r\n alpha: /^[a-zA-Z]+$/,\r\n \"alpha-num\": /^[a-zA-Z0-9]+$/,\r\n variable: /^[a-zA-Z0-9_$][a-zA-Z0-9_$]*$/,\r\n \"number-char\": /^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]/,\r\n \"upper-char\": /^(?=.*?[A-Z])(?=.*?[a-z])/,\r\n \"upper-char-special\": /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[#?!@$%^&*-])/,\r\n \"upper-char-special-number\": /^(?=.*[A-Za-z])(?=.*\\d)(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]/,\r\n};\r\n\r\n/**\r\n * 정규식 유효성 체크.\r\n *\r\n * @param {string} value\r\n * @param {FormField} field\r\n * @param {(ValidResult | undefined)} result\r\n * @returns {ValidResult}\r\n */\r\nexport const regexpValidator = (value: string, field: FormField, result: ValidResult): ValidResult => {\r\n if (!field.$instance.isEnableView()) {\r\n return { name: field.name, constraint: [] };\r\n }\r\n\r\n if (typeof result === \"undefined\") {\r\n result = { name: field.name, constraint: [] };\r\n }\r\n\r\n const regexpType = field.regexpType;\r\n\r\n if (regexpType) {\r\n if (!regexp[regexpType].test(value)) {\r\n result.regexp = regexpType;\r\n return result;\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { regexpValidator } from \"./regexpValidator\";\r\nimport * as utils from \"@/util/utils\";\r\n\r\n/**\r\n * validator , regexp 체크 .\r\n *\r\n * @param {string} value field value\r\n * @param {FormField} field field 정보\r\n * @param {ValidResult} result\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const validator = (value: string, field: FormField, result: ValidResult): ValidResult | boolean => {\r\n if (field.validator) {\r\n result.validator = field.validator(field, value);\r\n if (typeof result.validator === \"object\") {\r\n return result;\r\n }\r\n }\r\n\r\n result = regexpValidator(value, field, result);\r\n\r\n if (result.regexp) {\r\n return result;\r\n }\r\n\r\n if (field.different) {\r\n const diffFieldName = field.different.field;\r\n const diffField = field.$instance.getForm().getField(diffFieldName);\r\n\r\n if (!utils.isEmpty(diffField) && field.$instance.getValue() == diffField.$instance.getValue()) {\r\n result.message = field.different.message;\r\n return result;\r\n }\r\n }\r\n\r\n if (field.identical) {\r\n const diffFieldName = field.identical.field;\r\n const diffField = field.$instance.getForm().getField(diffFieldName);\r\n\r\n if (!utils.isEmpty(diffField) && field.$instance.getValue() != diffField.$instance.getValue()) {\r\n result.message = field.identical.message;\r\n return result;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\nimport { validator } from \"./validator\";\r\nimport * as utils from \"@/util/utils\";\r\n\r\n/**\r\n * 숫자 유효성 체크\r\n *\r\n * @param {string} value\r\n * @param {FormField} field\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const numberValidator = (value: string, field: FormField): ValidResult | boolean => {\r\n if (!field.$instance.isEnableView()) {\r\n return true;\r\n }\r\n\r\n const result: ValidResult = { name: field.name, constraint: [] };\r\n const numValue = Number(value);\r\n\r\n if (field.required && utils.isBlank(value)) {\r\n result.constraint.push(RULES.REQUIRED);\r\n return result;\r\n }\r\n\r\n if (!utils.isNumber(value)) {\r\n result.constraint.push(RULES.NAN);\r\n return result;\r\n }\r\n\r\n if (validator(value, field, result) !== true) {\r\n return result;\r\n }\r\n\r\n const rule = field.rule;\r\n if (rule) {\r\n const isMinimum = utils.isNumber(rule.minimum),\r\n isMaximum = utils.isNumber(rule.maximum);\r\n\r\n let minRule = false,\r\n minExclusive = false,\r\n maxRule = false,\r\n maxExclusive = false;\r\n\r\n if (isMinimum) {\r\n if (rule.exclusiveMinimum && numValue <= rule.minimum) {\r\n minExclusive = true;\r\n } else if (numValue < rule.minimum) {\r\n minRule = true;\r\n }\r\n }\r\n\r\n if (isMaximum) {\r\n if (rule.exclusiveMaximum && numValue >= rule.maximum) {\r\n maxExclusive = true;\r\n } else if (numValue > rule.maximum) {\r\n maxRule = true;\r\n }\r\n }\r\n\r\n if (isMinimum && isMaximum && (minRule || minExclusive || maxRule || maxExclusive)) {\r\n if (rule.exclusiveMinimum && rule.exclusiveMaximum && (minExclusive || maxExclusive)) {\r\n result.constraint.push(RULES.BETWEEN_EXCLUSIVE_MINMAX);\r\n } else if (minExclusive) {\r\n result.constraint.push(RULES.BETWEEN_EXCLUSIVE_MIN);\r\n } else if (maxExclusive) {\r\n result.constraint.push(RULES.BETWEEN_EXCLUSIVE_MAX);\r\n } else {\r\n result.constraint.push(RULES.BETWEEN);\r\n }\r\n } else {\r\n if (minExclusive) {\r\n result.constraint.push(RULES.EXCLUSIVE_MIN);\r\n }\r\n\r\n if (maxExclusive) {\r\n result.constraint.push(RULES.EXCLUSIVE_MAX);\r\n }\r\n\r\n if (minRule) {\r\n result.constraint.push(RULES.MIN);\r\n }\r\n\r\n if (maxRule) {\r\n result.constraint.push(RULES.MAX);\r\n }\r\n }\r\n }\r\n\r\n if (result.constraint.length > 0) {\r\n return result;\r\n }\r\n\r\n return true;\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport Language from \"./Language\";\r\n\r\nexport const invalidMessage = (field: FormField, rowElement: Element, validResult: ValidResult | boolean) => {\r\n if (validResult === true) {\r\n rowElement.classList.remove(\"invalid\");\r\n\r\n if (!rowElement.classList.contains(\"valid\")) {\r\n rowElement.classList.add(\"valid\");\r\n }\r\n\r\n const helpMessageElement = rowElement.querySelector(\".df-help-message\");\r\n if (helpMessageElement) {\r\n helpMessageElement.innerHTML = \"\";\r\n }\r\n\r\n return;\r\n }\r\n\r\n rowElement.classList.remove(\"valid\");\r\n\r\n if (!rowElement.classList.contains(\"invalid\")) {\r\n rowElement.classList.add(\"invalid\");\r\n }\r\n\r\n if (validResult !== false) {\r\n const message: string[] = Language.validMessage(field, validResult);\r\n\r\n if (validResult.message) {\r\n message.push(validResult.message);\r\n }\r\n\r\n const helpMessageElement = rowElement.querySelector(\".df-help-message\");\r\n if (helpMessageElement && message.length > 0) {\r\n const msgHtml: string[] = [];\r\n message.forEach((item) => {\r\n msgHtml.push(`<div>${item}</div>`);\r\n });\r\n helpMessageElement.innerHTML = msgHtml.join(\"\");\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * remove row element style class\r\n *\r\n * @param {Element} rowElement\r\n */\r\nexport const resetRowElementStyleClass = (rowElement: Element) => {\r\n rowElement.classList.remove(\"invalid\");\r\n rowElement.classList.remove(\"valid\");\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { Render } from \"@/renderer/Render\";\r\nimport * as utils from \"@/util/utils\";\r\n\r\nexport const inputEvent = (field: FormField, element: Element, renderInfo: Render) => {\r\n element.addEventListener(\"input\", (e: Event) => {\r\n customChangeEventCall(field, e, renderInfo, renderInfo.getValue());\r\n renderInfo.valid();\r\n });\r\n};\r\n\r\nexport const numberInputEvent = (field: FormField, element: HTMLInputElement, renderInfo: Render) => {\r\n element.addEventListener(\"keyup\", (e: any) => {\r\n const val = e.target.value;\r\n\r\n if (!utils.isNumber(val)) {\r\n element.value = val.replace(/[^0-9\\.\\-\\+]/g, \"\");\r\n e.preventDefault();\r\n }\r\n customChangeEventCall(field, e, renderInfo, renderInfo.getValue());\r\n renderInfo.valid();\r\n });\r\n\r\n /*\r\n element.addEventListener('input', (e: any) => {\r\n customChangeEventCall(field, e, renderInfo);\r\n renderInfo.valid();\r\n })\r\n */\r\n};\r\n\r\nexport const dropdownChangeEvent = (field: FormField, element: Element, renderInfo: Render) => {\r\n element.addEventListener(\"change\", (e: any) => {\r\n customChangeEventCall(field, e, renderInfo, renderInfo.getValue());\r\n renderInfo.valid();\r\n });\r\n};\r\n\r\nexport const customChangeEventCall = (field: FormField, e: Event, renderInfo: Render, value: any) => {\r\n renderInfo.changeEventCall(field, e, renderInfo, value);\r\n};\r\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { numberValidator } from \"@/rule/numberValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { numberInputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class NumberRender extends Render {\n private element: HTMLInputElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n numberInputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"text\" name=\"${field.$xssName}\" class=\"df-form-field df-number df-help-icon\" />\n </div> \n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = numberValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\nimport * as utils from \"@/util/utils\";\r\nimport { validator } from \"./validator\";\r\n\r\n/**\r\n * string validator\r\n *\r\n * @param {string} value\r\n * @param {FormField} field\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const stringValidator = (value: string, field: FormField): ValidResult | boolean => {\r\n if (!field.$instance.isEnableView()) {\r\n return true;\r\n }\r\n\r\n let result: ValidResult = { name: field.name, constraint: [] };\r\n\r\n if (field.required && utils.isBlank(value)) {\r\n result.constraint.push(RULES.REQUIRED);\r\n return result;\r\n }\r\n const validResult = validator(value, field, result);\r\n if (validResult !== true) {\r\n return validResult;\r\n }\r\n\r\n const rule = field.rule;\r\n\r\n if (rule) {\r\n const valueLength = value.length;\r\n\r\n const isMinNumber = utils.isNumber(rule.minLength),\r\n isMaxNumber = utils.isNumber(rule.maxLength);\r\n\r\n let minRule = false,\r\n maxRule = false;\r\n if (isMinNumber && valueLength < rule.minLength) {\r\n minRule = true;\r\n }\r\n if (isMaxNumber && valueLength > rule.maxLength) {\r\n maxRule = true;\r\n }\r\n\r\n if (isMinNumber && isMaxNumber && (minRule || maxRule)) {\r\n result.constraint.push(RULES.BETWEEN);\r\n } else {\r\n if (minRule) {\r\n result.constraint.push(RULES.MIN_LENGTH);\r\n }\r\n\r\n if (maxRule) {\r\n result.constraint.push(RULES.MAX_LENGTH);\r\n }\r\n }\r\n if (result.constraint.length > 0) {\r\n return result;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { inputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class TextAreaRender extends Render {\n private element: HTMLTextAreaElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n inputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n let rows = field.rendererOptions?.rows;\n rows = +rows > 0 ? rows : 3;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <textarea name=\"${field.$xssName}\" rows=\"${rows}\" class=\"df-form-field df-textarea df-help-icon\"></textarea>\n </div> \n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLTextAreaElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField, ValuesInfo } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { RULES } from \"@/constants\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { dropdownChangeEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\nimport Language from \"@/util/Language\";\n\nexport default class DropdownRender extends Render {\n private element: HTMLSelectElement;\n private defaultSelected;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n let initDefaultValue = \"\";\n\n if (!utils.isUndefined(field.defaultValue)) {\n initDefaultValue = field.defaultValue;\n }\n\n const valueKey = DropdownRender.valuesValueKey(field);\n let initDefaultValueFlag = false;\n this.field.listItem?.list?.forEach((item) => {\n let itemValue = item[valueKey];\n if (item.selected) {\n this.defaultSelected = itemValue;\n }\n if (itemValue == initDefaultValue) {\n initDefaultValueFlag = true;\n }\n });\n\n if (initDefaultValueFlag) {\n this.defaultSelected = initDefaultValue;\n } else if (!this.defaultSelected) {\n if (field.rendererOptions?.disableDefaultOption === true) {\n this.defaultSelected = this.field.listItem?.list?.length > 0 ? this.field.listItem.list[0][valueKey] || \"\" : \"\";\n }\n }\n\n if (utils.isUndefined(this.defaultSelected)) {\n this.defaultSelected = \"\";\n }\n\n this.mounted();\n this.setDefaultOption();\n this.setValue(this.defaultSelected, false);\n }\n\n mounted() {\n dropdownChangeEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n let template = ` <div class=\"df-field\"><select name=\"${field.$xssName}\" class=\"df-form-field df-dropdown\">\n ${this.dropdownValuesTemplate(field)}\n </select> <i class=\"df-help-icon\"></i></div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n fieldContainerElement.innerHTML = template;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLSelectElement;\n }\n\n public setValueItems(items: any): void {\n if (this.field.listItem) {\n this.field.listItem.list = items;\n } else {\n this.field.listItem = {\n list: items,\n } as ValuesInfo;\n }\n this.element.innerHTML = this.dropdownValuesTemplate(this.field);\n\n if (!utils.isBlank(this.field.$value)) {\n const currentValue = this.field.$value;\n this.field.$value = \"\";\n this.setValue(currentValue);\n }\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setValue(this.defaultSelected, false);\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const value = this.getValue();\n\n let validResult: ValidResult | boolean = true;\n\n if (this.field.required) {\n if (value.length < 1) {\n validResult = { name: this.field.name, constraint: [] };\n validResult.constraint.push(RULES.REQUIRED);\n }\n }\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n\n public dropdownValuesTemplate(field: FormField) {\n const labelKey = Render.valuesLabelKey(field);\n const valueKey = Render.valuesValueKey(field);\n let template = \"\";\n\n if (field.rendererOptions?.disableDefaultOption !== true) {\n template += `<option value=\"\">${Language.getMessage(\"selection\")}</option>`;\n }\n field.listItem?.list?.forEach((val) => {\n const attr = `${val.selected ? \"selected\" : \"\"} ${val.disabled ? \"disabled\" : \"\"}`;\n if (utils.isUndefined(val[valueKey]) && val.label) {\n template += `<option value=\"${val.value || \"\"}\" ${attr}>${val.label}</option>`;\n } else {\n template += `<option value=\"${val[valueKey]}\" ${attr}>${Render.valuesLabelValue(labelKey, val)}</option>`;\n }\n });\n\n return template;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { inputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class TextRender extends Render {\n private element: HTMLInputElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n inputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"text\" name=\"${field.$xssName}\" class=\"df-form-field df-text df-help-icon\" />\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLInputElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FieldStyle, FormField } from \"@t/FormField\";\nimport * as utils from \"./utils\";\nimport { FIELD_POSITION_STYLE, ALIGN } from \"@/constants\";\nimport { FormOptions } from \"@t/FormOptions\";\n\n/**\n * field style 처리\n *\n * @param formOptions FormOptions\n * @param field FormField\n * @param beforeField FormField\n * @returns FieldStyle\n */\n\nexport function resolveFieldStyle(formOptions: FormOptions, field: FormField, beforeField?: FormField | null, isLabelHide?: boolean): FieldStyle {\n const fieldStyle = {\n rowStyleClass: orientationClassName(field.orientation),\n fieldClass: \"\",\n fieldStyle: \"\",\n labelClass: \"\",\n labelStyle: \"\",\n labelAlignClass: \"\",\n valueClass: \"\",\n valueStyle: \"\",\n tabAlignClass: \"\",\n };\n\n const defaultLabelWidth = beforeField?.style?.labelWidth ?? formOptions.style.labelWidth ?? \"3\";\n let defaultValueWidth = beforeField?.style?.valueWidth ?? formOptions.style.valueWidth ?? \"9\";\n const position = beforeField?.style?.position ?? formOptions.style.position;\n\n const width = field.style?.width;\n const positionArr = FIELD_POSITION_STYLE[field.style?.position] ?? FIELD_POSITION_STYLE[position] ?? FIELD_POSITION_STYLE.top;\n\n fieldStyle.fieldClass = `${positionArr[0] ? \"df-\" + positionArr[0] : \"\"} ${field.style?.customClass || \"\"}`;\n if (width) {\n if (utils.isNumber(width)) {\n fieldStyle.fieldClass += utils.isNumber(width) ? ` df-col-xs-${width}` : \"\";\n } else {\n fieldStyle.fieldStyle = utils.isNumber(width) ? \"\" : `width:${width};`;\n }\n }\n\n fieldStyle.tabAlignClass = \"df-tab-al-\" + ([\"right\", \"center\"].includes(field.style?.tabAlign) ? field.style.tabAlign : \"left\");\n\n const labelWidth = field.style?.labelWidth || defaultLabelWidth;\n fieldStyle.labelAlignClass = positionArr[1];\n\n if (!isLabelHide && labelWidth && ![\"top\", \"bottom\"].includes(positionArr[0])) {\n if (utils.isNumber(labelWidth)) {\n const labelWidthValue = +labelWidth;\n defaultValueWidth = 12 - labelWidthValue;\n fieldStyle.labelClass = `df-col-xs-${labelWidthValue}`;\n fieldStyle.valueClass = fieldStyle.labelStyle ? \"df-col-full\" : `df-col-xs-${defaultValueWidth}`;\n } else {\n fieldStyle.labelStyle = `width:${labelWidth};`;\n }\n }\n\n const valueWidth = field.style?.valueWidth || defaultValueWidth;\n if (isLabelHide && ![\"left\", \"right\"].includes(positionArr[0])) {\n fieldStyle.valueClass = \"df-col-full\";\n } else {\n if (valueWidth && ![\"top\", \"bottom\"].includes(positionArr[0])) {\n if (utils.isNumber(valueWidth)) {\n fieldStyle.valueClass = fieldStyle.labelStyle ? \"df-col-full\" : `df-col-xs-${valueWidth}`;\n } else {\n fieldStyle.valueStyle = `width:${valueWidth};`;\n }\n } else {\n fieldStyle.valueClass = fieldStyle.labelStyle ? \"df-col-full\" : \"\";\n }\n }\n\n fieldStyle.fieldClass = spaceReplace(fieldStyle.fieldClass);\n fieldStyle.labelClass = spaceReplace(fieldStyle.labelClass);\n fieldStyle.valueClass = spaceReplace(fieldStyle.valueClass);\n\n return fieldStyle;\n}\n\nexport function orientationClassName(orientation: string): string {\n return orientation === \"horizontal\" ? \"df-horizontal\" : \"df-vertical\";\n}\n\nfunction spaceReplace(str: string): string {\n return str.replace(/\\s+/g, \" \").trim();\n}\n","import { FormField, ValuesInfo } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport * as utils from \"@/util/utils\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { OrientationMap, RULES } from \"@/constants\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { customChangeEventCall } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport { orientationClassName } from \"@/util/styleUtils\";\n\nexport default class CheckboxRender extends Render {\n private defaultCheckValue: any[] = [];\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.defaultCheckValue = [];\n let initDefaultValue = [] as any;\n if (!utils.isUndefined(field.defaultValue)) {\n if (utils.isArray(field.defaultValue)) {\n initDefaultValue = field.defaultValue;\n } else {\n initDefaultValue = [field.defaultValue];\n }\n }\n\n const valueKey = CheckboxRender.valuesValueKey(field);\n\n if (utils.isUndefined(this.field.listItem)) {\n this.setValueItems([{ label: \"\", value: \"Y\" }]);\n }\n\n let initDefaultValueFlag = false;\n this.field.listItem?.list?.forEach((item) => {\n let itemValue = item[valueKey];\n if (item.selected) {\n this.defaultCheckValue.push(itemValue ? itemValue : true);\n }\n if (initDefaultValue.includes(itemValue)) {\n initDefaultValueFlag = true;\n }\n });\n\n this.defaultCheckValue = initDefaultValueFlag ? initDefaultValue : this.defaultCheckValue;\n\n this.mounted();\n this.setDefaultOption();\n this.setValue(this.defaultCheckValue, false);\n }\n\n public mounted() {\n this.initEvent();\n }\n\n public initEvent() {\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n checkboxes.forEach((ele) => {\n ele.addEventListener(\"change\", (e: Event) => {\n customChangeEventCall(this.field, e, this, this.getValue());\n this.valid();\n });\n });\n }\n\n public getSelector() {\n return `input[type=\"checkbox\"][name=\"${this.field.$xssName}\"]`;\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n const templates: string[] = [];\n const fieldName = field.$xssName;\n\n const labelKey = Render.valuesLabelKey(field);\n const valueKey = Render.valuesValueKey(field);\n\n templates.push(` <div class=\"df-field\"><div class=\"df-field-group\">`);\n field.listItem?.list?.forEach((val) => {\n const checkVal = val[valueKey];\n templates.push(`\n <span class=\"df-field-item ${orientationClassName(field.listItem.orientation ?? OrientationMap.horizontal)}\">\n <label>\n <input type=\"checkbox\" name=\"${fieldName}\" value=\"${checkVal ? utils.replaceXss(checkVal) : \"\"}\" class=\"df-form-field df-checkbox\" ${val.selected ? \"checked\" : \"\"} ${val.disabled ? \"disabled\" : \"\"} />\n ${Render.valuesLabelValue(labelKey, val)}\n </label>\n </span>\n `);\n });\n templates.push(`<i class=\"df-form-icon df-help-icon\"></i></div></div> ${Render.getDescriptionTemplate(field)}<div class=\"df-help-message\"></div>`);\n\n fieldContainerElement.innerHTML = templates.join(\"\");\n }\n\n public setValueItems(items: any): void {\n const containerEle = this.rowElement.querySelector(\".df-field-container\");\n if (containerEle) {\n if (this.field.listItem) {\n this.field.listItem.list = items;\n } else {\n this.field.listItem = {\n list: items,\n } as ValuesInfo;\n }\n\n this.createField();\n\n if (!utils.isBlank(this.field.$value)) {\n const currentValue = this.field.$value;\n this.field.$value = \"\";\n this.setValue(currentValue);\n }\n }\n }\n\n getValue() {\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n if (checkboxes.length > 1) {\n const checkValue: any[] = [];\n checkboxes.forEach((ele) => {\n const checkEle = ele as HTMLInputElement;\n if (checkEle.checked) {\n checkValue.push(checkEle.value);\n }\n });\n return checkValue;\n } else {\n const checkElement = this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement;\n\n if (checkElement?.checked) {\n return checkElement.value ? checkElement.value : true;\n }\n\n return checkElement.value ? \"\" : false;\n }\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n value = this.field.$value;\n }\n\n this.field.$value = value;\n if (value === true) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = true;\n return;\n }\n\n if (value === false) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = false;\n return;\n }\n\n let valueArr: any[] = [];\n if (utils.isArray(value)) {\n valueArr = value;\n } else {\n valueArr.push(value);\n }\n\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n checkboxes.forEach((ele) => {\n (ele as HTMLInputElement).checked = false;\n });\n\n valueArr.forEach((val) => {\n const ele = this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"][value=\"${val}\"]`) as HTMLInputElement;\n if (ele) ele.checked = true;\n });\n }\n\n reset() {\n if (this.field.listItem?.list?.length == 1 && this.defaultCheckValue.length == 1) {\n this.setValue(true, false);\n } else {\n this.setValue(this.defaultCheckValue, false);\n }\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): any {\n return this.rowElement.querySelectorAll(`[name=\"${this.field.$xssName}\"]`);\n }\n\n public focus() {\n const elements = this.getElement();\n\n if (elements && elements.length > 0) {\n this.getElement()[0].focus();\n }\n }\n\n valid(): any {\n const value = this.getValue();\n\n let validResult: ValidResult | boolean = true;\n\n if (this.field.required && utils.isArray(value)) {\n if ((value as any[]).length < 1) {\n validResult = { name: this.field.name, constraint: [] };\n validResult.constraint.push(RULES.REQUIRED);\n }\n }\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField, ValuesInfo } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { OrientationMap, RULES } from \"@/constants\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { customChangeEventCall } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\nimport { orientationClassName } from \"@/util/styleUtils\";\n\nexport default class RadioRender extends Render {\n private defaultCheckValue;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.defaultCheckValue = \"\";\n let initDefaultValue = [] as any;\n if (!utils.isUndefined(field.defaultValue)) {\n initDefaultValue = field.defaultValue;\n }\n\n const valueKey = RadioRender.valuesValueKey(field);\n let initDefaultValueFlag = false;\n this.field.listItem?.list?.forEach((item) => {\n let itemValue = item[valueKey];\n if (item.selected) {\n this.defaultCheckValue = itemValue;\n }\n\n if (initDefaultValue == itemValue) {\n initDefaultValueFlag = true;\n }\n });\n\n // 처리 할것.\n\n if (initDefaultValueFlag) {\n this.defaultCheckValue = initDefaultValue;\n } else if (!this.defaultCheckValue) {\n this.defaultCheckValue = this.field.listItem?.list?.length > 0 ? this.field.listItem?.list[0][valueKey] : \"\";\n }\n\n this.mounted();\n this.setDefaultOption();\n this.setValue(this.defaultCheckValue, false);\n }\n\n public mounted() {\n this.initEvent();\n }\n\n public initEvent() {\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n checkboxes.forEach((ele) => {\n ele.addEventListener(\"change\", (e: Event) => {\n customChangeEventCall(this.field, e, this, this.getValue());\n\n this.valid();\n });\n });\n }\n\n public getSelector() {\n return `input[type=\"radio\"][name=\"${this.field.$xssName}\"]`;\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n const templates: string[] = [];\n const fieldName = field.$xssName;\n\n const labelKey = Render.valuesLabelKey(field);\n const valueKey = Render.valuesValueKey(field);\n\n templates.push(`<div class=\"df-field\"><div class=\"df-field-group\">`);\n\n field.listItem?.list?.forEach((val) => {\n const radioVal = val[valueKey];\n\n templates.push(\n `<span class=\"df-field-item ${orientationClassName(field.orientation ?? OrientationMap.horizontal)}\">\n <label>\n <input type=\"radio\" name=\"${fieldName}\" value=\"${radioVal}\" class=\"df-form-field df-radio\" ${val.selected ? \"checked\" : \"\"} ${val.disabled ? \"disabled\" : \"\"}/>\n ${Render.valuesLabelValue(labelKey, val)}\n </label>\n </span>\n `\n );\n });\n templates.push(`<i class=\"df-form-icon df-help-icon\"></i></div></div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `);\n\n fieldContainerElement.innerHTML = templates.join(\"\");\n\n this.initEvent();\n }\n\n public setValueItems(items: any): void {\n const containerEle = this.rowElement.querySelector(\".df-field-container\");\n if (containerEle) {\n if (this.field.listItem) {\n this.field.listItem.list = items;\n } else {\n this.field.listItem = {\n list: items,\n } as ValuesInfo;\n }\n\n this.createField();\n\n if (!utils.isBlank(this.field.$value)) {\n const currentValue = this.field.$value;\n this.field.$value = \"\";\n this.setValue(currentValue);\n }\n }\n }\n\n getValue() {\n return (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]:checked`) as HTMLInputElement)?.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n value = this.field.$value;\n }\n\n this.field.$value = value;\n if (value === true) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = true;\n return;\n }\n\n if (value === false) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = false;\n return;\n }\n\n const elements = this.rowElement.querySelectorAll(this.getSelector());\n\n elements.forEach((ele) => {\n let radioEle = ele as HTMLInputElement;\n if (radioEle.value == value) {\n radioEle.checked = true;\n } else {\n radioEle.checked = false;\n }\n });\n }\n\n reset() {\n this.setValue(this.defaultCheckValue, false);\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): any {\n return this.rowElement.querySelectorAll(this.getSelector());\n }\n\n public focus() {\n const elements = this.getElement();\n\n if (elements && elements.length > 0) {\n this.getElement()[0].focus();\n }\n }\n\n valid(): any {\n const value = this.getValue();\n\n let validResult: ValidResult | boolean = true;\n\n if (this.field.required) {\n if (utils.isBlank(value)) {\n validResult = { name: this.field.name, constraint: [] };\n validResult.constraint.push(RULES.REQUIRED);\n }\n }\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { inputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class PasswordRender extends Render {\n private element: HTMLInputElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n inputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"password\" name=\"${field.$xssName}\" class=\"df-form-field df-password df-help-icon\" autocomplete=\"off\" />\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FileInfo, FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\n\r\n/**\r\n * file validator\r\n *\r\n * @param {HTMLInputElement} element\r\n * @param {FormField} field\r\n * @param {FileInfo[]} fileList\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const fileValidator = (element: HTMLInputElement, field: FormField, fileList: FileInfo[]): ValidResult | boolean => {\r\n const result: ValidResult = { name: field.name, constraint: [] };\r\n\r\n if (field.required && fileList.length < 1) {\r\n result.constraint.push(RULES.REQUIRED);\r\n return result;\r\n }\r\n\r\n if (result.constraint.length > 0) {\r\n return result;\r\n }\r\n\r\n return true;\r\n};\r\n","import { FileInfo, FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { fileValidator } from \"@/rule/fileValidator\";\nimport Language from \"@/util/Language\";\nimport { customChangeEventCall } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport { isArray } from \"@daracl/core\";\n\nexport default class FileRender extends Render {\n private element: HTMLInputElement;\n private removeIds: any[] = [];\n private uploadFiles: any = {};\n private fileList: any[] = [];\n private fileSeq = 0;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.element = rowElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n this.fileList = field.listItem?.list || [];\n this.mounted();\n this.setDefaultOption();\n }\n\n mounted() {\n this.element.addEventListener(\"change\", (e: Event) => {\n const files = (e.target as HTMLInputElement)?.files;\n\n if (files) {\n let fileList = [];\n for (let item of files) {\n fileList.push(item);\n }\n this.addFiles(fileList);\n }\n customChangeEventCall(this.field, e, this, this.fileList);\n this.valid();\n });\n\n this.fileList.forEach((file) => {\n file.$seq = this.fileSeq += 1;\n });\n\n this.setFileList(this.fileList);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <span class=\"df-file-wrapper\">\n <label class=\"df-file-label\">\n <input type=\"file\" name=\"${field.$xssName}\" class=\"df-form-field df-file\" multiple />\n ${Language.getMessage(\"fileButton\")}\n </label>\n <i class=\"df-form-icon df-help-icon\"></i>\n </span>\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-file-list\"></div>\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n addFiles(files: any[]) {\n let addFlag = false;\n\n const newFiles: FileInfo[] = [];\n\n for (let item of files) {\n const fileCheckList = this.fileList.filter((fileItem) => fileItem.fileName == item.name && fileItem.fileSize == item.size && fileItem.lastModified == item.lastModified);\n\n if (fileCheckList.length > 0) continue;\n this.fileSeq += 1;\n this.uploadFiles[this.fileSeq] = item;\n\n let newFileInfo = {\n fileName: item.name,\n $seq: this.fileSeq,\n fileSize: item.size,\n lastModified: item.lastModified,\n } as FileInfo;\n\n newFiles.push(newFileInfo);\n addFlag = true;\n }\n if (addFlag) {\n this.setFileList(newFiles);\n this.fileList.push(...newFiles);\n }\n }\n\n private setFileList(fileList: FileInfo[], initFlag?: boolean | undefined) {\n const fileListElement = this.rowElement.querySelector(\".df-file-list\");\n\n if (fileListElement) {\n if (initFlag === true) {\n fileListElement.innerHTML = \"\";\n }\n\n const fileTemplateHtml: string[] = [];\n\n fileList.forEach((file) => {\n fileTemplateHtml.push(`\n <div class=\"df-file-item\" data-seq=\"${file.$seq}\">\n ${file.fileId ? '<span class=\"df-file-icon df-file-download\"></span>' : '<span class=\"df-file-icon df-empty-icon\"></span>'} <span class=\"df-file-icon df-file-remove\"></span>\n <span class=\"df-file-name\">${file.fileName}</span > \n </div>`);\n });\n\n fileListElement.insertAdjacentHTML(\"beforeend\", fileTemplateHtml.join(\"\"));\n\n fileList.forEach((item) => {\n this.removeFileEvent(item, fileListElement);\n this.downloadFileEvent(item, fileListElement);\n });\n }\n }\n\n /**\n * 파일 다운로드 이벤트 처리.\n *\n * @param item\n * @param fileListElement\n */\n private downloadFileEvent(item: FileInfo, fileListElement: Element) {\n const ele = fileListElement.querySelector(`[data-seq=\"${item.$seq}\"] .df-file-download`);\n if (ele) {\n ele.addEventListener(\"click\", (evt: Event) => {\n const fileItemElement = (evt.target as Element).closest(\".df-file-item\");\n\n if (fileItemElement) {\n const attrSeq = fileItemElement.getAttribute(\"data-seq\");\n if (attrSeq) {\n const seq = parseInt(attrSeq, 10);\n const idx = this.fileList.findIndex((v) => v.$seq === seq);\n\n const item = this.fileList[idx];\n\n if (item[\"url\"]) {\n location.href = item[\"url\"];\n return;\n }\n\n if (this.field.fileDownload) {\n this.field.fileDownload.call(null, { file: item, field: this.field });\n return;\n }\n }\n }\n });\n }\n }\n\n /**\n * 파일 삭제 처리.\n *\n * @param item\n * @param fileListElement\n */\n private removeFileEvent(item: FileInfo, fileListElement: Element) {\n const ele = fileListElement.querySelector(`[data-seq=\"${item.$seq}\"] .df-file-remove`);\n if (ele) {\n ele.addEventListener(\"click\", (evt: Event) => {\n const fileItemElement = (evt.target as Element).closest(\".df-file-item\");\n\n if (fileItemElement) {\n const attrSeq = fileItemElement.getAttribute(\"data-seq\");\n if (attrSeq) {\n const seq = parseInt(attrSeq, 10);\n const removeIdx = this.fileList.findIndex((v) => v.$seq === seq);\n\n const removeItem = this.fileList[removeIdx];\n\n this.fileList.splice(removeIdx, 1);\n delete this.uploadFiles[seq];\n fileItemElement.remove();\n\n if (removeItem.fileId) {\n this.removeIds.push(removeItem.fileId);\n }\n }\n }\n this.valid();\n });\n }\n }\n\n getValue() {\n return {\n uploadFile: Object.values(this.uploadFiles),\n removeIds: this.removeIds,\n };\n }\n\n public setValueItems(value: any): void {\n this.fileList = [];\n this.uploadFiles = [];\n this.removeIds = [];\n for (let file of value) {\n file.$seq = this.fileSeq += 1;\n\n this.fileList.push(file);\n }\n\n this.setFileList(this.fileList, true);\n }\n\n setValue(value: any): void {\n if (isArray(value)) {\n this.setValueItems(value);\n }\n this.element.value = \"\";\n }\n\n reset() {\n this.setValue(\"\");\n this.setValueItems([]);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLInputElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = fileValidator(this.element, this.field, this.fileList);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { invalidMessage, resetRowElementStyleClass } from \"@/util/validUtils\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\nimport { stringValidator } from \"@/rule/stringValidator\";\n\nexport default class CustomRender extends Render {\n private customFunction;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n if (field.renderer) {\n this.customFunction = field.renderer;\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n } else {\n this.customFunction = {} as any;\n }\n }\n\n mounted() {\n if (this.customFunction.mounted) {\n (this.customFunction.mounted as any).call(this, this.field, this.rowElement);\n }\n }\n\n static isDataRender(): boolean {\n return false;\n }\n\n createField() {\n const field = this.field;\n\n const fieldTemplate = utils.isEmpty(field.template) ? \"\" : utils.isString(field.template) ? field.template : field.template();\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = ` <div class=\"df-field\">\n ${fieldTemplate}\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>`;\n }\n\n getValue() {\n if (this.customFunction.getValue) {\n return (this.customFunction.getValue as any).call(this, this.field, this.rowElement);\n }\n return \"\";\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (this.customFunction.setValue) {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n value = this.field.$value;\n }\n (this.customFunction.setValue as any).call(this, value, this.field, this.rowElement);\n }\n\n this.field.$value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement() {\n if (this.customFunction.getElement) {\n return (this.customFunction.getElement as any).call(this, this.field, this.rowElement);\n }\n return null;\n }\n\n valid(): any {\n if (this.customFunction.valid) {\n const validResult = (this.customFunction.valid as any).call(this, this.field, this.rowElement);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return;\n }\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n\n /**\n * focus\n */\n focus(): void {\n if (this.customFunction.focus) {\n (this.customFunction.focus as any).call(this, this.field, this.rowElement);\n }\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class GroupRender extends Render {\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n }\n\n public mounted() {}\n\n static isDataRender(): boolean {\n return false;\n }\n\n createField() {\n return \"\";\n }\n\n getValue() {\n return null;\n }\n\n setValue(value: any): void {}\n\n reset() {}\n\n getElement(): HTMLElement {\n return this.rowElement;\n }\n\n valid(): any {\n return true;\n }\n\n public addChildField(element: Element) {\n let addContainer = this.rowElement.querySelector(\".df-field-container\");\n\n if (addContainer) {\n addContainer.append(element);\n } else {\n this.rowElement.append(element);\n }\n }\n\n focus(): void {}\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class HiddenRender extends Render {\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n this.field.$value = field.defaultValue;\n }\n\n mounted() {}\n\n createField() {\n return ``;\n }\n\n getValue() {\n return this.field.$value;\n }\n\n setValue(value: any): void {\n this.field.$value = value;\n }\n\n reset() {\n this.setValue(this.field.defaultValue);\n }\n\n getElement() {\n return;\n }\n\n valid(): any {\n return true;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class ButtonRender extends Render {\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n this.mounted();\n this.setDefaultOption();\n }\n\n mounted() {\n this.rowElement.querySelector(`#${this.field.$key}`)?.addEventListener(\"click\", (evt) => {\n if (this.field.onClick) {\n this.field.onClick.call(null, this.field);\n }\n });\n }\n\n static isDataRender(): boolean {\n return false;\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <button type=\"button\" id=\"${field.$key}\" class=\"df-btn\">${field.label}</button> ${Render.getDescriptionTemplate(field)}\n `;\n }\n\n getValue() {\n return \"\";\n }\n\n setValue(value: any): void {}\n\n reset() {\n this.setDisabled(false);\n }\n\n getElement() {\n return null;\n }\n\n valid(): any {\n return true;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { numberValidator } from \"@/rule/numberValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { customChangeEventCall, numberInputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class RangeRender extends Render {\n private element: HTMLInputElement;\n private rangeNumElement: Element;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.rangeNumElement = rowElement.querySelector(\".df-range-num\") as Element;\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n this.element.addEventListener(\"input\", (e: any) => {\n this.rangeNumElement.innerHTML = e.target.value;\n\n this.element.setAttribute(\"title\", e.target.value);\n customChangeEventCall(this.field, e, this, this.getValue());\n this.valid();\n });\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <span class=\"df-range-num\">${field.defaultValue ? field.defaultValue : 0}</span>\n <input type=\"range\" name=\"${field.$xssName}\" class=\"df-form-field df-range df-help-icon\" min=\"${field.rule.minimum}\" max=\"${field.rule.maximum}\"/>\n </div> \n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = numberValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { leftPad, isNumeric, leftPadClamp, isFunction } from \"@daracl/core\";\nlet localeMessage = {\n year: \"Year\",\n month: \"Month\",\n day: \"Day\",\n am: \"AM\",\n pm: \"PM\",\n today: \"Today\",\n ok: \"Ok\",\n months: {\n full: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n abbr: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n },\n weeks: {\n full: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n abbr: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"]\n }\n};\nclass Language {\n constructor() {\n this.lang = localeMessage;\n }\n setDefaultMessage(lang) {\n localeMessage = Object.assign(localeMessage, lang);\n }\n /**\n * 다국어 메시지 등록\n *\n * @public\n * @param {?Message} [lang] 둥록할 메시지\n */\n set(lang) {\n this.lang = Object.assign({}, localeMessage, lang);\n }\n /**\n * 메시지 얻기\n *\n * @public\n * @param {string} messageKey 메시지 키\n * @returns {*}\n */\n getMessage(messageKey) {\n return this.lang[messageKey];\n }\n getMonthsMessage(idx, mode = \"abbr\") {\n return this.lang.months[mode][idx] || \"\";\n }\n getWeeksMessage(idx, mode = \"abbr\") {\n return this.lang.weeks[mode][idx] || \"\";\n }\n getMonthsIdx(val, mode = \"abbr\") {\n return mode == \"full\" ? this.lang.months.full.indexOf(val) : this.lang.months.abbr.indexOf(val);\n }\n getWeeksIdx(val, mode = \"abbr\") {\n return mode == \"full\" ? this.lang.weeks.full.indexOf(val) : this.lang.weeks.abbr.indexOf(val);\n }\n}\nconst Lanauage = new Language();\nconst EXPRESSIONS_FORMAT = [\"YY\", \"YYYY\", \"MMMM\", \"MMM\", \"MM\", \"M\", \"dddd\", \"ddd\", \"dd\", \"d\", \"DD\", \"D\", \"S\", \"HH\", \"H\", \"hh\", \"h\", \"mm\", \"m\", \"ss\", \"s\", \"SSS\", \"zzzz\", \"zzz\", \"zz\", \"z\", \"a\", \"A\"];\nlet MAX_CHAR_LENGTH = 0;\nlet DEFAULT_FORMAT = {\n year: \"YYYY\",\n month: \"YYYY-MM\",\n date: \"YYYY-MM-DD\",\n time: \"HH:mm\",\n datetime: \"YYYY-MM-DD HH:mm\"\n};\nconst DAY_STYLE_CLASS = [\"ddtp-sun\", \"ddtp-mon\", \"ddtp-tue\", \"ddtp-wed\", \"ddtp-thu\", \"ddtp-fri\", \"ddtp-sat\"];\nvar DateViewMode = /* @__PURE__ */ ((DateViewMode2) => {\n DateViewMode2[\"year\"] = \"year\";\n DateViewMode2[\"month\"] = \"month\";\n DateViewMode2[\"date\"] = \"date\";\n DateViewMode2[\"datetime\"] = \"datetime\";\n DateViewMode2[\"time\"] = \"time\";\n return DateViewMode2;\n})(DateViewMode || {});\nEXPRESSIONS_FORMAT.forEach((item) => {\n MAX_CHAR_LENGTH = Math.max(item.length, MAX_CHAR_LENGTH);\n});\nconst format = (date, format2) => {\n format2 = format2 || \"YYYY-MM-DD\";\n const len = format2.length;\n let result = [];\n for (let i = 0; i < len; ) {\n let minLen = Math.min(MAX_CHAR_LENGTH, len - i);\n let j = minLen;\n for (; j > 0; j--) {\n const v = format2.substring(i, i + j);\n if (EXPRESSIONS_FORMAT.includes(v)) {\n try {\n result.push(expressionsFunction$1[v](date));\n } catch (e) {\n console.log(EXPRESSIONS_FORMAT.includes(v), v, e);\n }\n break;\n }\n }\n if (j < 1) {\n result.push(format2.substring(i, i + 1));\n i += 1;\n } else {\n i += j;\n }\n }\n return result.join(\"\");\n};\nconst expressionsFunction$1 = {\n YY: (date) => {\n return String(date.getFullYear()).slice(-2);\n },\n YYYY: (date) => {\n return String(date.getFullYear());\n },\n M: (date) => {\n return String(date.getMonth() + 1);\n },\n MM: (date) => {\n return leftPad(date.getMonth() + 1, 2);\n },\n MMM: (date) => {\n return Lanauage.getMonthsMessage(date.getMonth());\n },\n MMMM: (date) => {\n return Lanauage.getMonthsMessage(date.getMonth(), \"full\");\n },\n D: (date) => {\n return String(date.getDate());\n },\n DD: (date) => {\n return leftPad(date.getDate(), 2);\n },\n d: (date) => {\n return String(date.getDate());\n },\n dd: (date) => {\n return leftPad(date.getDate(), 2);\n },\n ddd: (date) => {\n return Lanauage.getWeeksMessage(date.getDay());\n },\n dddd: (date) => {\n return Lanauage.getWeeksMessage(date.getDay(), \"full\");\n },\n H: (date) => {\n return String(date.getHours());\n },\n HH: (date) => {\n return leftPad(date.getHours(), 2);\n },\n h: (date) => {\n return getH(date);\n },\n hh: (date) => {\n return leftPad(getH(date), 2);\n },\n a: (date) => {\n return String(date.getFullYear()).slice(-2);\n },\n A: (date) => {\n return getMeridiem(date);\n },\n m: (date) => {\n return String(date.getMinutes());\n },\n mm: (date) => {\n return leftPad(date.getMinutes(), 2);\n },\n s: (date) => {\n return String(date.getSeconds());\n },\n ss: (date) => {\n return leftPad(date.getSeconds(), 2);\n },\n SSS: (date) => {\n return leftPad(date.getMilliseconds(), 3);\n }\n};\nfunction getH(date) {\n let hour = date.getHours();\n if (hour > 12) {\n hour -= 12;\n } else if (hour < 1) {\n hour = 12;\n }\n return hour;\n}\nfunction getMeridiem(date, isUpper, isShort) {\n const hour = date.getHours();\n let m = hour < 12 ? \"am\" : \"pm\";\n m = Lanauage.getMessage(m);\n m = m.toUpperCase();\n return m;\n}\nconst parser = (dateStr, format2) => {\n if (dateStr.length > 1e3) {\n return null;\n }\n format2 = format2 || DEFAULT_FORMAT.date;\n const dateInfo = {\n year: (/* @__PURE__ */ new Date()).getFullYear(),\n month: 0,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n isPm: false,\n isH: false,\n charIdx: 0\n };\n const len = format2.length;\n let startIdx = 0;\n for (let i = 0; i < len; ) {\n let minLen = Math.min(MAX_CHAR_LENGTH, len - i);\n let j = minLen;\n for (; j > 0; j--) {\n const v = format2.substring(i, i + j);\n if (EXPRESSIONS_FORMAT.includes(v)) {\n const expInfo = expressionsFunction[v];\n const val = matchFind(dateStr.substring(startIdx), expInfo[0]);\n expInfo[1](dateInfo, val);\n startIdx += val.length;\n break;\n }\n }\n if (j < 1) {\n i += 1;\n startIdx += 1;\n } else {\n i += j;\n }\n }\n if (dateInfo.hour != null && !dateInfo.isH) {\n if (dateInfo.isPm && +dateInfo.hour !== 12) {\n dateInfo.hour = +dateInfo.hour + 12;\n } else if (!dateInfo.isPm && +dateInfo.hour === 12) {\n dateInfo.hour = 0;\n }\n }\n let date;\n date = new Date(dateInfo.year, dateInfo.month, dateInfo.day, dateInfo.hour, dateInfo.minute, dateInfo.second, dateInfo.millisecond);\n return date;\n};\nconst matchFind = (val, regexp) => {\n const match = regexp.exec(val);\n return match == null ? \"\" : match[0];\n};\nconst digitsCheck = {\n twoOptional: /\\d\\d?/,\n two: /\\d\\d/,\n three: /\\d{3}/,\n four: /\\d{4}/\n};\nconst word = /[^\\s]+/;\nconst expressionsFunction = {\n YY: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.year = +((\"\" + (/* @__PURE__ */ new Date()).getFullYear()).substring(0, 2) + val);\n return dateInfo;\n }\n ],\n YYYY: [\n digitsCheck[\"four\"],\n (dateInfo, val) => {\n dateInfo.year = +val;\n return dateInfo;\n }\n ],\n M: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.month = +val - 1;\n return dateInfo;\n }\n ],\n MM: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.month = +val - 1;\n return dateInfo;\n }\n ],\n MMM: [\n word,\n (dateInfo, val) => {\n dateInfo.month = Lanauage.getMonthsIdx(val, \"abbr\");\n return dateInfo;\n }\n ],\n MMMM: [\n word,\n (dateInfo, val) => {\n dateInfo.month = Lanauage.getMonthsIdx(val, \"full\");\n return dateInfo;\n }\n ],\n D: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.day = +val;\n return dateInfo;\n }\n ],\n DD: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.day = +val;\n return dateInfo;\n }\n ],\n d: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.day = +val;\n return dateInfo;\n }\n ],\n dd: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.day = +val;\n return dateInfo;\n }\n ],\n ddd: [\n word,\n (dateInfo, val) => {\n return dateInfo;\n }\n ],\n dddd: [\n word,\n (dateInfo, val) => {\n return dateInfo;\n }\n ],\n H: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.hour = +val;\n dateInfo.isH = true;\n return dateInfo;\n }\n ],\n HH: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.hour = +val;\n dateInfo.isH = true;\n return dateInfo;\n }\n ],\n h: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.hour = +val;\n return dateInfo;\n }\n ],\n hh: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.hour = +val;\n return dateInfo;\n }\n ],\n a: [\n word,\n (dateInfo, val) => {\n if (Lanauage.getMessage(\"am\") != val.toLowerCase()) {\n dateInfo.isPm = true;\n }\n return dateInfo;\n }\n ],\n A: [\n word,\n (dateInfo, val) => {\n if (Lanauage.getMessage(\"am\") != val.toLowerCase()) {\n dateInfo.isPm = true;\n }\n return dateInfo;\n }\n ],\n m: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.minute = +val;\n return dateInfo;\n }\n ],\n mm: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.minute = +val;\n return dateInfo;\n }\n ],\n s: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.second = +val;\n return dateInfo;\n }\n ],\n ss: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.second = +val;\n return dateInfo;\n }\n ],\n SSS: [\n digitsCheck[\"three\"],\n (dateInfo, val) => {\n dateInfo.millisecond = +val;\n return dateInfo;\n }\n ]\n};\nfunction closestElement(el, checkElement) {\n let currentEl = el;\n while (currentEl) {\n if (currentEl == checkElement) {\n return true;\n }\n currentEl = currentEl.parentElement;\n }\n return false;\n}\nclass DaraDate {\n constructor(dt) {\n this.date = dt;\n }\n setYear(num) {\n this.date.setFullYear(num);\n return this;\n }\n addYear(num) {\n this.date.setFullYear(this.date.getFullYear() + num);\n return this;\n }\n addMonth(num) {\n this.date.setMonth(this.date.getMonth() + num);\n return this;\n }\n setMonth(num) {\n this.date.setMonth(num);\n return this;\n }\n setDate(num) {\n this.date.setDate(num);\n return this;\n }\n addDate(num) {\n this.date.setDate(this.date.getDate() + num);\n return this;\n }\n addWeek(num) {\n this.date.setDate(this.date.getDate() + num * 7);\n return this;\n }\n addHours(num) {\n this.date.setHours(this.date.getHours() + num);\n return this;\n }\n setHour(num) {\n this.date.setHours(num);\n return this;\n }\n addMinutes(num) {\n this.date.setMinutes(this.date.getMinutes() + num);\n return this;\n }\n setMinutes(num) {\n this.date.setMinutes(num);\n return this;\n }\n addSeconds(num) {\n this.date.setSeconds(this.date.getSeconds() + num);\n return this;\n }\n addMilliseconds(num) {\n this.date.setMilliseconds(this.date.getMilliseconds() + num);\n return this;\n }\n compare(date) {\n if (this.date.valueOf() < date.valueOf()) {\n return -1;\n } else if (this.date.valueOf() > date.valueOf()) {\n return 1;\n }\n return 0;\n }\n getYear() {\n return this.date.getFullYear();\n }\n getMonth() {\n return this.date.getMonth() + 1;\n }\n getDate() {\n return this.date.getDate();\n }\n getDay() {\n return this.date.getDay();\n }\n getTime() {\n return this.date.getTime();\n }\n format(format$1) {\n return format(this.date, format$1);\n }\n clone() {\n return new DaraDate(new Date(this.date.valueOf()));\n }\n}\nlet DEFAULT_OPTIONS = {\n inline: false,\n // layer or innerhtml\n weekStartDay: 0,\n initialDate: \"\",\n autoClose: true,\n isRTL: false,\n mode: DateViewMode.date,\n enableTodayBtn: false,\n showMonthAfterYear: false,\n isPositionFixed: false,\n format: \"\",\n zIndex: 1e3,\n minDate: \"\",\n maxDate: \"\",\n beforeDrawDate: (dt) => {\n return {\n check: false,\n style: \"\",\n tooltip: \"\"\n };\n }\n};\nfunction hiddenElement() {\n var _a;\n if (document.getElementById(\"hiddenDaraDatetimeElement\") == null) {\n (_a = document.querySelector(\"body\")) == null ? void 0 : _a.insertAdjacentHTML(\"beforeend\", `<div id=\"hiddenDaraDatetimeElement\" class=\"daracl-datetime-hidden\"></div>`);\n }\n return document.getElementById(\"hiddenDaraDatetimeElement\");\n}\nlet daraDatetimeIdx = 0;\nconst _DateTimePicker = class _DateTimePicker {\n constructor(selector, options, message) {\n var _a;\n this.isInput = false;\n this.isVisible = false;\n this.minYear = -1;\n this.maxYear = -1;\n this.minMonth = -1;\n this.maxMonth = -1;\n this.dayOrder = [0, 1, 2, 3, 4, 5, 6];\n this._documentClickEvent = (e) => {\n if (this.isVisible && e.target != this.targetElement && !closestElement(e.target, this.datetimeElement)) {\n this.hide();\n }\n };\n this.options = Object.assign({}, DEFAULT_OPTIONS, options);\n daraDatetimeIdx += 1;\n let selectorElement;\n if (typeof selector === \"string\") {\n selectorElement = document.querySelector(selector);\n } else {\n selectorElement = selector;\n }\n if (!selectorElement) {\n throw new Error(`${selector} datetimepicker element not found`);\n }\n this._viewMode = Object.keys(DateViewMode).includes(this.options.mode) ? this.options.mode : DateViewMode.date;\n this.initMode = this._viewMode;\n Lanauage.set(message);\n if (this.initMode == DateViewMode.year) {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.year;\n } else if (this.initMode == DateViewMode.month) {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.month;\n } else if (this.initMode == DateViewMode.time) {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.time;\n } else if (this.initMode == DateViewMode.datetime) {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.datetime;\n } else {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.date;\n }\n let viewDate;\n if (this.options.initialDate) {\n if (typeof this.options.initialDate === \"string\") {\n viewDate = new DaraDate(parser(this.options.initialDate, this.dateFormat) || /* @__PURE__ */ new Date());\n } else {\n viewDate = new DaraDate(this.options.initialDate);\n }\n } else {\n viewDate = new DaraDate(/* @__PURE__ */ new Date());\n this.options.initialDate = viewDate.format(this.dateFormat);\n }\n this.setWeekDays();\n this.todayDate = viewDate.format(DEFAULT_FORMAT.date);\n this.currentDate = viewDate;\n this.targetElement = selectorElement;\n this.minDate = this._minDate();\n this.maxDate = this._maxDate();\n if (this.options.inline) {\n this.datetimeElement = selectorElement;\n this.datetimeElement.className = `daracl-datetime-wrapper ddtp-${daraDatetimeIdx} embed`;\n } else {\n this.isInput = true;\n this.targetElement.setAttribute(\"value\", viewDate.format(this.dateFormat));\n const datetimeElement = document.createElement(\"div\");\n datetimeElement.className = `daracl-datetime-wrapper ddtp-${daraDatetimeIdx} layer`;\n datetimeElement.setAttribute(\"style\", `z-index:${this.options.zIndex};`);\n (_a = hiddenElement()) == null ? void 0 : _a.appendChild(datetimeElement);\n this.datetimeElement = datetimeElement;\n this.initTargetEvent();\n }\n this.createDatetimeTemplate();\n if (this.isTimeMode()) {\n this.hourInputEle = this.datetimeElement.querySelector(\".ddtp-hour\");\n this.minuteInputEle = this.datetimeElement.querySelector(\".ddtp-minute\");\n } else {\n this.hourInputEle = {};\n this.minuteInputEle = {};\n }\n this.changeViewMode(this._viewMode);\n this.initHeaderEvent();\n this.initDateEvent();\n this.initTimeEvent();\n }\n setWeekDays() {\n let weekStartDay = this.options.weekStartDay;\n if (weekStartDay == 0) return;\n if (weekStartDay < 0 || weekStartDay > 6) {\n weekStartDay = 0;\n }\n for (let i = 0; i < 7; i++) {\n let day = weekStartDay + i;\n this.dayOrder[i] = day < 7 ? day : day - 7;\n }\n }\n static create(selector, options, message) {\n return new _DateTimePicker(selector, options, message);\n }\n /**\n * default date format setting\n * @example\n ```\n setDefaultFormat({\n year: \"YYYY\",\n month: \"YYYY-MM\",\n date: \"YYYY-MM-DD\",\n time: \"HH:mm\",\n datetime: \"YYYY-MM-DD HH:mm\",\n });\n ```\n * @public\n * @static\n * @param {*} dateFormat\n */\n static setDefaultFormat(dateFormat) {\n Object.assign(DEFAULT_FORMAT, dateFormat);\n }\n _minDate() {\n let minDate = this.options.minDate;\n if (minDate != \"\") {\n if (typeof minDate === \"string\") {\n const dt = parser(minDate, this.dateFormat);\n if (!dt) {\n return -1;\n }\n minDate = dt;\n }\n this.minYear = minDate.getFullYear();\n this.minMonth = +(this.minYear + leftPad(minDate.getMonth(), 2));\n return new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), 0, 0).getTime();\n }\n return -1;\n }\n _maxDate() {\n let maxDate = this.options.maxDate;\n if (maxDate != \"\") {\n if (typeof maxDate === \"string\") {\n const dt = parser(maxDate, this.dateFormat);\n if (!dt) {\n return -1;\n }\n maxDate = dt;\n }\n this.maxYear = maxDate.getFullYear();\n this.maxMonth = +(this.maxYear + leftPad(maxDate.getMonth(), 2));\n return new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 23, 59).getTime();\n }\n return -1;\n }\n set viewMode(mode) {\n if (this._viewMode === mode) {\n return;\n }\n this._viewMode = mode;\n this.changeViewMode(mode);\n }\n get viewMode() {\n return this._viewMode;\n }\n /**\n * 모드 change\n * @param mode\n */\n changeViewMode(mode) {\n var _a;\n (_a = this.datetimeElement.querySelector(\".ddtp-datetime\")) == null ? void 0 : _a.setAttribute(\"view-mode\", mode);\n if (mode === \"year\") {\n this.yearDraw();\n } else if (mode === \"month\") {\n this.monthDraw();\n } else {\n this.dayDraw();\n }\n }\n /**\n * init header event\n *\n * @public\n */\n initHeaderEvent() {\n var _a, _b, _c, _d;\n const isRTL = this.options.isRTL;\n (_a = this.datetimeElement.querySelector(\".ddtp-move-btn.prev\")) == null ? void 0 : _a.addEventListener(\"click\", (e) => {\n this.moveDate(isRTL ? \"next\" : \"prev\", e);\n });\n (_b = this.datetimeElement.querySelector(\".ddtp-move-btn.next\")) == null ? void 0 : _b.addEventListener(\"click\", (e) => {\n this.moveDate(isRTL ? \"prev\" : \"next\", e);\n });\n (_c = this.datetimeElement.querySelector(\".ddtp-header-year\")) == null ? void 0 : _c.addEventListener(\"click\", (e) => {\n this.viewMode = DateViewMode.year;\n });\n (_d = this.datetimeElement.querySelector(\".ddtp-header-month\")) == null ? void 0 : _d.addEventListener(\"click\", (e) => {\n this.viewMode = DateViewMode.month;\n });\n }\n /**\n * 날짜 달력 이벤트처리.\n */\n initDateEvent() {\n var _a, _b;\n (_a = this.datetimeElement.querySelector(\".ddtp-day-body\")) == null ? void 0 : _a.addEventListener(\"click\", (e) => {\n var _a2;\n const targetEle = e.target;\n if (targetEle.classList.contains(\"ddtp-day\") || targetEle.closest(\".ddtp-day\")) {\n const selectDate = targetEle.getAttribute(\"data-day\") || \"1\";\n const mmDD = selectDate.split(\",\");\n this.currentDate.setMonth(+mmDD[0] - 1);\n this.currentDate.setDate(+mmDD[1]);\n if (this.isDayDisabled(this.currentDate)) {\n return;\n }\n (_a2 = this.datetimeElement.querySelector(\".select\")) == null ? void 0 : _a2.classList.remove(\"select\");\n targetEle.classList.add(\"select\");\n if (this.isTimeMode()) {\n this.currentDate.setHour(+this.hourInputEle.value);\n this.currentDate.setMinutes(+this.minuteInputEle.value);\n }\n this.dateChangeEvent(e);\n }\n });\n (_b = this.datetimeElement.querySelector(\".ddtp-today\")) == null ? void 0 : _b.addEventListener(\"click\", (e) => {\n const initDate = new DaraDate(parser(this.todayDate, DEFAULT_FORMAT.date) || /* @__PURE__ */ new Date());\n this.currentDate.setYear(initDate.getYear());\n this.currentDate.setMonth(initDate.getMonth() - 1);\n this.currentDate.setDate(initDate.getDate());\n this.changeViewMode(this.initMode);\n });\n }\n isTimeMode() {\n return this._viewMode === DateViewMode.time || this._viewMode === DateViewMode.datetime;\n }\n getTimeNumberValue(val) {\n if (!isNumeric(val)) {\n return 0;\n }\n return parseInt(val, 10);\n }\n /**\n * 시간 분 설정 이벤트 처리.\n *\n * @public\n */\n initTimeEvent() {\n var _a;\n if (!this.isTimeMode()) return;\n let hh = this.currentDate.format(\"HH\");\n const datetimeElement = this.datetimeElement;\n const hourInputEle = datetimeElement.querySelector(\".ddtp-hour\");\n const hourRangeEle = datetimeElement.querySelector(\".ddtp-hour-range\");\n hourInputEle.value = hh;\n hourRangeEle.value = hh;\n hourInputEle.addEventListener(\"input\", (e) => {\n const targetElement = e.target;\n let val = this.getTimeNumberValue(targetElement.value);\n let addVal = leftPadClamp(val, 2, \"0\");\n if (parseInt(addVal, 10) > 23) {\n addVal = \"23\";\n }\n hourInputEle.value = addVal;\n hourRangeEle.value = addVal;\n });\n hourRangeEle.addEventListener(\"input\", (e) => {\n const targetElement = e.target;\n hourInputEle.value = leftPadClamp(targetElement.value, 2, \"0\");\n });\n let mm = this.currentDate.format(\"mm\");\n const minuteInputEle = datetimeElement.querySelector(\".ddtp-minute\");\n const minuteRangeEle = datetimeElement.querySelector(\".ddtp-minute-range\");\n minuteInputEle.value = mm;\n minuteRangeEle.value = mm;\n minuteInputEle.addEventListener(\"input\", (e) => {\n const targetElement = e.target;\n let val = this.getTimeNumberValue(targetElement.value);\n let addVal = leftPadClamp(val, 2, \"0\");\n if (parseInt(addVal, 10) > 59) {\n addVal = \"59\";\n }\n minuteInputEle.value = addVal;\n minuteRangeEle.value = addVal;\n });\n minuteRangeEle.addEventListener(\"input\", (e) => {\n const targetElement = e.target;\n minuteInputEle.value = leftPadClamp(targetElement.value, 2, \"0\");\n });\n (_a = datetimeElement.querySelector(\".time-select\")) == null ? void 0 : _a.addEventListener(\"click\", (e) => {\n this.currentDate.setHour(+hourInputEle.value);\n this.currentDate.setMinutes(+minuteInputEle.value);\n this.dateChangeEvent(e);\n });\n }\n /**\n * 날짜 이동\n * @param moveMode // 앞뒤 이동 prev, next\n * @returns\n */\n moveDate(moveMode, e) {\n if (this._viewMode === DateViewMode.date || this._viewMode === DateViewMode.datetime) {\n this.currentDate.setDate(1);\n this.currentDate.addMonth(\"prev\" === moveMode ? -1 : 1);\n this.dayDraw();\n return;\n }\n if (this._viewMode === DateViewMode.month) {\n this.currentDate.setDate(1);\n this.currentDate.addYear(\"prev\" === moveMode ? -1 : 1);\n this.monthDraw();\n return;\n }\n if (this._viewMode === DateViewMode.year) {\n this.currentDate.setDate(1);\n this.currentDate.addYear(\"prev\" === moveMode ? -16 : 16);\n this.yearDraw();\n }\n }\n /**\n * get date value\n *\n * @returns\n */\n getDateValue() {\n return this.currentDate.format(this.dateFormat);\n }\n /**\n * 옵션 셋팅\n * @static\n * @param {DateTimePickerOptions} options\n */\n static setOptions(options) {\n DEFAULT_OPTIONS = Object.assign({}, DEFAULT_OPTIONS, options);\n }\n /**\n * 달력 보이기 처리.\n *\n * @returns\n */\n show() {\n if (this.isVisible) {\n return;\n }\n this.isVisible = true;\n const docSize = getDocSize();\n this.datetimeElement.classList.remove(\"hide\");\n this.datetimeElement.classList.add(\"show\");\n const rect = this.targetElement.getBoundingClientRect();\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n const elementHeight = this.datetimeElement.offsetHeight;\n const targetElementHeight = this.targetElement.offsetHeight + 2;\n let left = rect.left + scrollLeft;\n let top = 0;\n if (this.options.isPositionFixed) {\n top = rect.top + targetElementHeight;\n left = rect.left;\n } else {\n if (rect.top + targetElementHeight + elementHeight > docSize.clientHeight && rect.top >= elementHeight) {\n top = scrollTop + rect.top - elementHeight - 2;\n } else {\n top = scrollTop + rect.top + targetElementHeight;\n }\n }\n this.datetimeElement.setAttribute(\"style\", `${this.options.isPositionFixed ? \"position:fixed;\" : \"\"}top:${top}px;left:${left}px;z-index:${this.options.zIndex}`);\n document.addEventListener(\"click\", this._documentClickEvent);\n }\n /**\n * 달력 숨기기\n */\n hide() {\n this.isVisible = false;\n if (this.options.onClose) {\n if (this.options.onClose() === false) {\n return;\n }\n }\n this.datetimeElement.classList.remove(\"show\");\n this.datetimeElement.classList.add(\"hide\");\n document.removeEventListener(\"click\", this._documentClickEvent);\n }\n /**\n * 타켓 이벤트 처리.\n */\n initTargetEvent() {\n if (this.targetElement) {\n this.targetElement.addEventListener(\"click\", (e) => {\n this.show();\n });\n }\n }\n /**\n * 날짜 변경후 이벤트\n */\n afterChangeDatepicker() {\n const formatValue = this.currentDate.format(this.dateFormat);\n if (this.options.afterChangeDatepicker && isFunction(this.options.afterChangeDatepicker)) {\n this.options.afterChangeDatepicker(formatValue, this.viewMode);\n }\n }\n /**\n * 날짜 변경 전 이벤트.\n * @returns void\n */\n beforeChangeDatepicker() {\n const formatValue = this.currentDate.format(this.dateFormat);\n if (this.options.beforeChangeDatepicker && isFunction(this.options.beforeChangeDatepicker)) {\n const reval = this.options.beforeChangeDatepicker(formatValue, (result) => {\n if (result === false) {\n return;\n }\n this.refresh(false);\n });\n if (reval === false) {\n return;\n }\n this.refresh(false);\n return;\n }\n this.refresh(false);\n }\n dateChangeEvent(e) {\n const formatValue = this.currentDate.format(this.dateFormat);\n if (this.options.onSelect) {\n if (this.options.onSelect(formatValue, this.viewMode, e) === false) {\n return;\n }\n }\n if (this.isInput) {\n this.targetElement.setAttribute(\"value\", formatValue);\n }\n if (!this.options.inline && this.options.autoClose) {\n this.hide();\n }\n }\n /**\n * datepicker template 그리기\n */\n createDatetimeTemplate() {\n const showMonthAfterYear = this.options.showMonthAfterYear;\n let datetimeTemplate = `<div class=\"ddtp-datetime ${this.options.isRTL ? \"rtl\" : \"\"}\" view-mode=\"${this._viewMode}\">\n\t\t\t<div class=\"ddtp-header\">\n <span class=\"${showMonthAfterYear ? \"ddtp-header-year\" : \"ddtp-header-month\"}\"></span>\n <span class=\"${showMonthAfterYear ? \"ddtp-header-month\" : \"ddtp-header-year\"}\"></span>\n\n <span class=\"ddtp-date-move\"> \n <a href=\"javascript:;\" class=\"ddtp-move-btn prev\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#000000\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/></svg>\n </a>\n <a href=\"javascript:;\" class=\"ddtp-move-btn next\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#000000\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"/></svg>\n </a> \n </span>\n\t\t\t</div>\n <div class=\"ddtp-body\">\n <table class=\"ddtp-days\">\n <thead class=\"ddtp-day-header\">\n <tr>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[0]]}\">${Lanauage.getWeeksMessage(this.dayOrder[0])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[1]]}\">${Lanauage.getWeeksMessage(this.dayOrder[1])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[2]]}\">${Lanauage.getWeeksMessage(this.dayOrder[2])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[3]]}\">${Lanauage.getWeeksMessage(this.dayOrder[3])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[4]]}\">${Lanauage.getWeeksMessage(this.dayOrder[4])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[5]]}\">${Lanauage.getWeeksMessage(this.dayOrder[5])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[6]]}\">${Lanauage.getWeeksMessage(this.dayOrder[6])}</td>\t\t\n </tr>\n </thead>\n <tbody class=\"ddtp-day-body\">\n </tbody>\n \n <tfoot class=\"ddtp-day-footer\">\n <td colspan=\"7\">\n <div style=\"width:99%;text-align:center;margin-top: 5px;${this.options.enableTodayBtn ? \"\" : \"display:none;\"}\"><button type=\"button\" class=\"ddtp-today\">${Lanauage.getMessage(\"today\")}</button></div>\n <div class=\"footer-tooltip\"></div>\n </td>\n </tfoot>\n </table>\n\n <div class=\"ddtp-times\">\n <div class=\"time-container\">\n <div class=\"ddtp-time\">\n <span>H: </span><input type=\"number\" class=\"ddtp-hour\" min=\"0\" max=\"23\" maxlength=\"2\">\n <input type=\"range\" min=\"0\" max=\"23\" class=\"ddtp-hour-range\">\n </div>\n <div class=\"ddtp-time\">\n <span>M: </span><input type=\"number\" class=\"ddtp-minute\" min=\"0\" max=\"59\" size=\"2\" maxlength=\"2\">\n <input type=\"range\" min=\"0\" max=\"59\" class=\"ddtp-minute-range\">\n </div>\n </div>\n <div class=\"ddtp-btn\">\n <button type=\"button\" class=\"time-select\">${Lanauage.getMessage(\"ok\")}</button>\n </div>\n </div>\n\n <div class=\"ddtp-months\">\n </div>\n\n <div class=\"ddtp-years\">\n </div>\n </div>\n </div>`;\n this.datetimeElement.innerHTML = datetimeTemplate;\n }\n refresh(beforeChangeDatepickerCheck) {\n if (this._viewMode === DateViewMode.date || this._viewMode === DateViewMode.datetime) {\n this.dayDraw(beforeChangeDatepickerCheck);\n return;\n }\n if (this._viewMode === DateViewMode.month) {\n this.monthDraw(beforeChangeDatepickerCheck);\n return;\n }\n if (this._viewMode === DateViewMode.year) {\n this.yearDraw(beforeChangeDatepickerCheck);\n }\n }\n /**\n * 년 달력 그리기\n */\n yearDraw(beforeChangeDatepickerCheck) {\n var _a;\n const currentYear = this.currentDate.format(\"YYYY\");\n if (beforeChangeDatepickerCheck !== false && this.initMode == DateViewMode.year) {\n this.beforeChangeDatepicker();\n return;\n }\n const startYear = +currentYear - 8;\n this.datetimeElement.querySelector(\".ddtp-header-year\").textContent = `${startYear} ~ ${startYear + 15}`;\n const beforeDrawDateFlag = isFunction(this.options.beforeDrawDate);\n const beforeDrawDateFn = beforeDrawDateFlag ? this.options.beforeDrawDate : false;\n const calHTML = [];\n for (let i = 0; i < 16; i++) {\n const year = startYear + i;\n const disabled = this.isYearDisabled(year);\n let addStylceClass = disabled ? \" disabled\" : \"\";\n let tooltip = \"\";\n if (beforeDrawDateFlag && beforeDrawDateFn) {\n const reval = beforeDrawDateFn({ mode: this._viewMode, date: year });\n addStylceClass += reval.style ? \" \" + reval.style : \"\";\n tooltip = reval.tooltip;\n tooltip = tooltip ? `title=\"${tooltip}\"` : \"\";\n }\n calHTML.push(`<div class=\"ddtp-year ${addStylceClass}\" data-year=\"${year}\" ${tooltip}>${year}</div>`);\n }\n this.datetimeElement.querySelector(\".ddtp-years\").innerHTML = calHTML.join(\"\");\n if (this.initMode == DateViewMode.year) {\n this.afterChangeDatepicker();\n }\n (_a = this.datetimeElement.querySelectorAll(\".ddtp-year\")) == null ? void 0 : _a.forEach((yearEle) => {\n yearEle.addEventListener(\"click\", (e) => {\n const targetEle = e.target;\n if (targetEle) {\n const year = targetEle.getAttribute(\"data-year\");\n if (year) {\n const numYear = +year;\n if (this.isYearDisabled(numYear)) {\n return;\n }\n if (this.initMode == DateViewMode.year) {\n if (this.isYearDisabled(numYear)) {\n return;\n }\n this.currentDate.setYear(numYear);\n this.dateChangeEvent(e);\n return;\n }\n this.currentDate.setYear(numYear);\n this.viewMode = this.initMode;\n }\n }\n });\n });\n }\n /**\n * 월 달력 그리기\n */\n monthDraw(beforeChangeDatepickerCheck) {\n var _a;\n if (beforeChangeDatepickerCheck !== false && this.initMode == DateViewMode.month) {\n this.beforeChangeDatepicker();\n return;\n }\n const year = this.currentDate.format(\"YYYY\");\n this.datetimeElement.querySelector(\".ddtp-header-year\").textContent = `${year}`;\n const monthElements = this.datetimeElement.querySelectorAll(\".ddtp-months > .ddtp-month\");\n if (monthElements.length > 0) {\n if (this.isYearDisabled(+year)) {\n monthElements.forEach((monthEle) => {\n if (!monthEle.classList.contains(\"disabled\")) {\n monthEle.classList.add(\"disabled\");\n }\n });\n return;\n }\n monthElements.forEach((monthEle, idx) => {\n if (this.isMonthDisabled(+year, idx)) {\n if (!monthEle.classList.contains(\"disabled\")) {\n monthEle.classList.add(\"disabled\");\n }\n } else {\n monthEle.classList.remove(\"disabled\");\n }\n });\n if (this.initMode == DateViewMode.month) {\n this.afterChangeDatepicker();\n }\n return;\n }\n this.datetimeElement.querySelector(\".ddtp-header-month\").textContent = this.currentDate.format(\"MMMM\");\n const beforeDrawDateFlag = isFunction(this.options.beforeDrawDate);\n const beforeDrawDateFn = beforeDrawDateFlag ? this.options.beforeDrawDate : false;\n const calHTML = [];\n for (let i = 0; i < 12; i++) {\n const disabled = this.isMonthDisabled(+year, i);\n let addStylceClass = disabled ? \" disabled\" : \"\";\n let tooltip = \"\";\n if (beforeDrawDateFlag && beforeDrawDateFn) {\n const reval = beforeDrawDateFn({ mode: this._viewMode, date: year + \"/\" + (i + 1) });\n addStylceClass += reval.style ? \" \" + reval.style : \"\";\n tooltip = reval.tooltip;\n tooltip = tooltip ? `title=\"${tooltip}\"` : \"\";\n }\n calHTML.push(`<div class=\"ddtp-month ${addStylceClass}\" data-month=\"${i}\" ${tooltip}>${Lanauage.getMonthsMessage(i, \"abbr\")}</div>`);\n }\n this.datetimeElement.querySelector(\".ddtp-months\").innerHTML = calHTML.join(\"\");\n if (this.initMode == DateViewMode.month) {\n this.afterChangeDatepicker();\n }\n (_a = this.datetimeElement.querySelectorAll(\".ddtp-month\")) == null ? void 0 : _a.forEach((monthEle) => {\n monthEle.addEventListener(\"click\", (e) => {\n const targetEle = e.target;\n if (targetEle) {\n const month = targetEle.getAttribute(\"data-month\");\n if (month) {\n if (this.isMonthDisabled(this.currentDate.getYear(), +month)) {\n return false;\n }\n if (this.initMode == DateViewMode.month) {\n this.currentDate.setMonth(+month);\n this.dateChangeEvent(e);\n return;\n }\n this.currentDate.setMonth(+month);\n this.viewMode = this.initMode;\n this.dayDraw();\n }\n }\n });\n });\n }\n /**\n * 날짜 그리기\n */\n dayDraw(beforeChangeDatepickerCheck) {\n if (beforeChangeDatepickerCheck !== false && (this.initMode == DateViewMode.date || this.initMode == DateViewMode.datetime)) {\n this.beforeChangeDatepicker();\n return;\n }\n let monthFirstDate = this.currentDate.clone();\n const currentMonth = monthFirstDate.getMonth();\n monthFirstDate.setDate(1);\n this.datetimeElement.querySelector(\".ddtp-header-year\").textContent = monthFirstDate.format(\"YYYY\");\n this.datetimeElement.querySelector(\".ddtp-header-month\").textContent = monthFirstDate.format(\"MMMM\");\n let day = monthFirstDate.getDay();\n day = day - this.dayOrder[0];\n if (day >= 0) {\n monthFirstDate.addDate(-day);\n } else {\n monthFirstDate.addDate(-(7 + day));\n }\n const beforeDrawDateFlag = isFunction(this.options.beforeDrawDate);\n const beforeDrawDateFn = beforeDrawDateFlag ? this.options.beforeDrawDate : false;\n const calHTML = [];\n for (let i = 0; i < 42; i++) {\n let dateItem;\n if (i == 0) {\n dateItem = monthFirstDate;\n } else {\n dateItem = monthFirstDate.clone().addDate(i);\n }\n const dateItemFormat = dateItem.format(DEFAULT_FORMAT.date);\n if (i % 7 == 0) {\n calHTML.push((i == 0 ? \"\" : \"</tr>\") + \"<tr>\");\n }\n let disabled = this.isDayDisabled(dateItem);\n let addStylceClass = DAY_STYLE_CLASS[this.dayOrder[i % 7]];\n const dateItemMonth = dateItem.getMonth();\n if (dateItemMonth != currentMonth) {\n if (dateItemMonth < currentMonth) {\n addStylceClass += dateItemMonth == 1 ? \" new\" : \" old\";\n } else {\n addStylceClass += currentMonth == 1 && dateItemMonth == 12 ? \" old\" : \" new\";\n }\n }\n addStylceClass += this.todayDate == dateItemFormat ? \" ddtp-today\" : \"\";\n addStylceClass += disabled ? \" disabled\" : \"\";\n let tooltip = \"\";\n if (beforeDrawDateFlag && beforeDrawDateFn) {\n const reval = beforeDrawDateFn({ mode: this._viewMode, item: dateItem, date: dateItem.format(this.dateFormat) });\n addStylceClass += reval.style ? \" \" + reval.style : \"\";\n addStylceClass += reval.check ? \" ddtp-event\" : \"\";\n tooltip = reval.tooltip;\n tooltip = tooltip ? `title=\"${tooltip}\"` : \"\";\n }\n calHTML.push(`<td class=\"ddtp-day ${addStylceClass}\" data-day=\"${dateItem.format(\"M,D\")}\" ${tooltip}>`);\n calHTML.push(`<span>${dateItem.format(\"d\")}</span>`);\n calHTML.push(\"</td>\");\n }\n calHTML.push(\"</tr>\");\n this.datetimeElement.querySelector(\".ddtp-day-body\").innerHTML = calHTML.join(\"\");\n if (this.initMode == DateViewMode.date || this.initMode == DateViewMode.datetime) {\n this.afterChangeDatepicker();\n }\n }\n isDayDisabled(dateItem) {\n if (this.minDate != -1 && this.minDate > dateItem.getTime() || this.maxDate != -1 && this.maxDate < dateItem.getTime()) {\n return true;\n }\n return false;\n }\n isYearDisabled(year) {\n if (this.minYear != -1 && this.minYear > year || this.maxYear != -1 && this.maxYear < year) {\n return true;\n }\n return false;\n }\n isMonthDisabled(year, month) {\n if (this.isYearDisabled(year)) {\n return true;\n }\n let yearMonth = +(year + leftPad(month, 2));\n if (this.minMonth != -1 && this.minMonth > yearMonth || this.maxMonth != -1 && this.maxMonth < yearMonth) {\n return true;\n }\n return false;\n }\n static setMessage(message) {\n Lanauage.setDefaultMessage(message);\n }\n};\n_DateTimePicker.VERSION = `${\"0.0.13\"}`;\n_DateTimePicker.format = format;\n_DateTimePicker.parser = parser;\nlet DateTimePicker = _DateTimePicker;\nfunction getDocSize() {\n return {\n clientHeight: Math.max(document.documentElement.clientHeight, window.innerHeight || 0),\n clientWidth: Math.max(document.documentElement.clientWidth, window.innerWidth || 0)\n };\n}\nexport {\n DateTimePicker\n};\n//# sourceMappingURL=index.js.map\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { DaraForm } from \"@/DaraForm\";\n\nimport { DateTimePicker } from \"@daracl/datetimepicker\";\n\nimport * as utils from \"@/util/utils\";\n\nexport default class DateRender extends Render {\n private element: HTMLInputElement;\n private dateObj: any;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n let dateOnSelectEvent: any;\n this.field.rendererOptions = Object.assign({}, this.field.rendererOptions);\n if (typeof this.field.rendererOptions.onSelect !== \"undefined\") {\n dateOnSelectEvent = typeof this.field.rendererOptions.onSelect;\n }\n\n if (utils.isUndefined(this.field.rendererOptions.mode)) {\n if (this.field.renderType == \"datemonth\" || this.field.renderType == \"datehour\") {\n this.field.rendererOptions.mode = this.field.renderType.replace(\"date\", \"\");\n } else {\n this.field.rendererOptions.mode = this.field.renderType;\n }\n }\n\n this.field.rendererOptions.onSelect = (dt: any, e: Event) => {\n if (dateOnSelectEvent) {\n dateOnSelectEvent(dt, e);\n }\n\n this.setValue(dt);\n\n this.valid();\n };\n\n this.dateObj = new DateTimePicker(this.element, this.field.rendererOptions, {} as any);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"text\" name=\"${field.$xssName}\" class=\"df-form-field df-text df-help-icon\" autocomplete=\"off\" readonly/>\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLInputElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FieldStyle, FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { invalidMessage } from \"@/util/validUtils\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { DaraForm } from \"@/DaraForm\";\nimport FormTemplate from \"@/FormTemplate\";\nimport { resolveFieldStyle } from \"@/util/styleUtils\";\nimport { FormOptions } from \"@t/FormOptions\";\nimport * as utils from \"@/util/utils\";\n\nexport default class TabRender extends Render {\n private customFunction;\n private tabContainerElement: HTMLElement;\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n if (field.renderer) {\n this.customFunction = field.renderer;\n } else {\n this.customFunction = {} as any;\n }\n\n this.mounted();\n }\n\n mounted() {\n if (this.customFunction.mounted) {\n (this.customFunction.mounted as any).call(this, this.field, this.rowElement);\n }\n\n this.tabContainerElement.querySelectorAll(\".df-tab-item\").forEach((tabItem) => {\n tabItem.addEventListener(\"click\", (e: any) => {\n this.clickEventHandler(tabItem, e);\n });\n });\n }\n\n /**\n * tab item click\n *\n * @param {Element} tabItem\n * @param {*} evt\n */\n private clickEventHandler(tabItem: Element, evt: any) {\n this.setActive(tabItem.getAttribute(\"data-tab-id\") ?? \"\");\n }\n\n public setActive(tabId: string): void {\n const tabItem = this.tabContainerElement.querySelector(`[data-tab-id=\"${tabId}\"]`);\n\n if (!tabItem) return;\n\n if (!tabItem.classList.contains(\"active\")) {\n for (let item of tabItem?.parentElement?.children ?? []) {\n item.classList.remove(\"active\");\n }\n tabItem.classList.add(\"active\");\n }\n\n const tabPanel = this.rowElement.querySelector(`[tab-panel-id=\"${tabId}\"]`);\n\n if (!tabPanel?.classList.contains(\"active\")) {\n for (let item of tabPanel?.parentElement?.children ?? []) {\n item.classList.remove(\"active\");\n }\n\n tabPanel?.classList.add(\"active\");\n }\n }\n\n static isDataRender(): boolean {\n return false;\n }\n\n static isChildrenCreate(): boolean {\n return false;\n }\n\n /**\n * tab template\n *\n * @param {FormField} field\n * @param {FormTemplate} formTemplate\n * @param {FormOptions} options\n * @returns {string} template string\n */\n\n createField() {\n const field = this.field;\n\n const formTemplate = this.daraForm.formTemplate;\n const options = this.daraForm.getOptions();\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n //tab 이벤트 처리 할것.\n let fieldStyle = resolveFieldStyle(options, field);\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field \">\n <div class=\"df-tab-header ${fieldStyle.tabAlignClass}\"></div>\n </div>\n <div class=\"df-tab-body\"></div>\n `;\n\n if (field.children) {\n let firstFlag = true;\n\n const formOptions = this.getForm().getOptions();\n\n let fieldStyle: FieldStyle = resolveFieldStyle(formOptions, field, null, formTemplate.isLabelHide(field));\n\n for (const childField of field.children) {\n childField.$parent = field;\n formTemplate.addRowFieldInfo(childField);\n let id = childField.$key;\n\n let tabTemplate = `<span class=\"df-tab-item ${firstFlag ? \"active\" : \"\"}\" data-tab-id=\"${id}\"><a href=\"javascript:;\">${childField.label}</a></span>`;\n\n let tabBodyTemplate = `<div class=\"df-tab-panel ${firstFlag ? \"active\" : \"\"}\" tab-panel-id=\"${id}\">${Render.getDescriptionTemplate(childField)}\n <div class=\"df-tab-group\"></div>\n </div>`;\n\n const tabElement = utils.templateToElement(tabTemplate);\n const tabBodyElement = utils.templateToElement(tabBodyTemplate);\n\n firstFlag = false;\n if (tabElement) {\n fieldContainerElement.querySelector(\".df-tab-header\")?.appendChild(tabElement);\n }\n\n if (tabBodyElement) {\n fieldContainerElement.querySelector(\".df-tab-body\")?.appendChild(tabBodyElement);\n\n if (childField.children) {\n let tabFormOptions = {\n style: {\n width: formOptions.style.width ?? \"100%\",\n labelWidth: formOptions.style.labelWidth ?? 3,\n valueWidth: formOptions.style.valueWidth ?? 9,\n position: formOptions.style.position ?? \"left-right\",\n },\n useTypeValue: formOptions.useTypeValue,\n autoCreate: false,\n notValidMessage: \"This form is not valid.\",\n fields: [],\n } as FormOptions;\n\n childField.$tabForm = new DaraForm(document.createElement(\"div\"), tabFormOptions);\n\n childField.$instance = new (childField.$renderType as any)(childField, tabBodyElement?.querySelector(\".df-tab-group\"), childField.$tabForm);\n\n childField.$tabForm.formTemplate.childTemplate(childField, fieldStyle);\n }\n }\n }\n\n this.tabContainerElement = fieldContainerElement;\n }\n }\n\n getValue(): any {\n if (this.customFunction.getValue) {\n return (this.customFunction.getValue as any).call(this, this.field, this.rowElement);\n }\n\n let allTabValue = {} as any;\n\n let useTypeValue = this.getForm().getOptions().useTypeValue;\n\n for (const childField of this.field.children) {\n const childFieldValue = childField.$tabForm?.getValue(false);\n if (useTypeValue) {\n allTabValue[childField.$validName] = childFieldValue;\n } else {\n for (let [key, value] of Object.entries(childFieldValue)) {\n allTabValue[key] = value;\n }\n }\n }\n return allTabValue;\n }\n\n setValue(value: any): void {\n for (const childField of this.field.children) {\n let tabChildValue = value[childField.$validName];\n\n if (tabChildValue) {\n childField.$tabForm?.setValue(tabChildValue);\n }\n }\n }\n\n reset() {}\n\n getElement(): Element {\n return this.rowElement;\n }\n\n valid(): any {\n if (this.customFunction.valid) {\n const validResult = (this.customFunction.valid as any).call(this, this.field, this.rowElement);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return;\n }\n\n const field = this.field;\n\n for (const childField of field.children) {\n const validResult = childField.$tabForm?.validForm();\n\n if (validResult && validResult.length > 0) {\n const firstItem = validResult[0];\n\n if (firstItem.message) {\n firstItem.message = \"[\" + this.field.label + \"] \" + firstItem.message;\n\n return firstItem;\n }\n }\n }\n\n return true;\n }\n\n focus(): void {}\n}\n","import { FieldStyle, FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { invalidMessage, resetRowElementStyleClass } from \"@/util/validUtils\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resolveFieldStyle } from \"@/util/styleUtils\";\nimport FormTemplate from \"@/FormTemplate\";\nimport { FormOptions } from \"@t/FormOptions\";\nimport { NumberKeyMap } from \"@t/DataMap\";\n\nlet $$idx = 0;\n\nexport default class GridRender extends Render {\n private customFunction;\n private gridForm;\n private allAddRowInfo = {} as NumberKeyMap;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n if (field.renderer) {\n this.customFunction = field.renderer;\n } else {\n this.customFunction = {} as any;\n }\n\n const gridFormOptions = {\n style: {\n width: \"100%\",\n labelWidth: 3,\n valueWidth: 9,\n position: \"left-right\",\n },\n autoCreate: false,\n notValidMessage: \"This form is not valid.\",\n fields: [],\n } as FormOptions;\n\n this.gridForm = new DaraForm(document.createElement(\"div\"), gridFormOptions);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n this.addRow();\n\n if (this.customFunction.mounted) {\n (this.customFunction.mounted as any).call(this, this.field, this.rowElement);\n }\n\n this.rowElement.querySelector(\".df-grid-add-row-btn\")?.addEventListener(\"click\", (evt) => {\n this.addRow();\n });\n }\n\n static isDataRender(): boolean {\n return false;\n }\n\n static isChildrenCreate(): boolean {\n return false;\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n let theadTemplate = [];\n let colgroupTemplate = [];\n let addBtnTemplate = [];\n addBtnTemplate.push(\"\");\n\n if (field.children) {\n colgroupTemplate.push(\"<colgroup>\");\n\n theadTemplate.push(\"<tr>\");\n\n colgroupTemplate.push(`<col style=\"width:38px\">`);\n theadTemplate.push(\"<th>\");\n if (field.rendererOptions?.disableAddButton !== true) {\n theadTemplate.push(`<button type=\"button\" class=\"df-btn df-grid-add-row-btn\" title=\"Add\"><i class=\"df-icon df-add-icon\"></i></button>`);\n }\n theadTemplate.push(\"</th>\");\n\n for (const childField of field.children) {\n colgroupTemplate.push(`<col style=\"width:${childField.style?.width ?? \"*\"}\">`);\n theadTemplate.push(`<th class=\"df-grid-header\">${childField.label}</th>`);\n }\n colgroupTemplate.push(\"</colgroup>\");\n theadTemplate.push(\"</tr>\");\n }\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-grid-field\">\n ${addBtnTemplate.join(\"\")}\n <div class=\"df-grid-container ${field.style?.position ?? \"\"}\" style=\"height:${field.rendererOptions?.height ?? \"auto\"};\">\n <table class=\"df-grid\">${colgroupTemplate.join(\"\")}<thead>${theadTemplate.join(\"\")}</thead><tbody></tbody></table>\n </div>\n </div>\n `;\n }\n\n /**\n * add row\n */\n addRow(valueItem?: any): void {\n let rowTemplate = [];\n\n const options = this.daraForm.getOptions();\n const formTemplate = this.gridForm.formTemplate;\n const parentName = this.field.$xssName;\n\n ++$$idx;\n let addColumns = [];\n rowTemplate.push(`<tr class=\"df-grid-row\">`);\n\n rowTemplate.push(\"<td>\");\n if (this.field.rendererOptions?.disableRemoveButton !== true) {\n rowTemplate.push(`<button type=\"button\" data-row-idx=\"${$$idx}\" class=\"df-btn df-grid-row-remove\"><i class=\"df-icon df-remove-icon\"></i></button>`);\n }\n rowTemplate.push(\"</td>\");\n\n for (const childField of this.field.children) {\n let fieldStyle: FieldStyle = resolveFieldStyle(options, childField, null, true);\n\n let columnField = utils.merge({}, childField) as FormField;\n\n addColumns.push(columnField);\n columnField.$orgin = childField;\n columnField.name = columnField.name + \"_\" + $$idx;\n columnField.$xssName = parentName + \"_\" + utils.getXssFieldName(columnField);\n\n formTemplate.addRowFieldInfo(columnField);\n\n rowTemplate.push(`<td id=\"${columnField.$xssName}\"><div class=\"df-field-container ${columnField.required ? \"required\" : \"\"} \" style=\"${fieldStyle.valueStyle}\"></div></td>`);\n }\n rowTemplate.push(\"</tr>\");\n\n this.allAddRowInfo[$$idx] = addColumns;\n\n const addRowElement = utils.templateToElement(rowTemplate.join(\"\"));\n\n if (addRowElement) {\n this.rowElement.querySelector(\"tbody\")?.append(addRowElement);\n\n addRowElement.querySelector(\".df-grid-row-remove\")?.addEventListener(\"click\", (evt) => {\n this.removeRow(evt);\n });\n }\n\n valueItem = valueItem ?? {};\n for (let columnField of addColumns) {\n columnField.$instance = new (columnField.$renderType as any)(columnField, addRowElement?.querySelector(`#${columnField.$xssName}`), this.gridForm);\n\n if (valueItem[columnField.$orgin.name]) {\n columnField.$instance.setValue(valueItem[columnField.$orgin.name]);\n }\n }\n }\n\n /**\n * remove row\n *\n * @param evt event\n */\n removeRow(evt: Event): void {\n const target = evt.target as Element;\n\n const rowElement = target.closest(\"tr\");\n\n if (rowElement) {\n //if (rowElement.parentElement?.childElementCount == 1) return;\n\n let rowIdx = (evt.currentTarget as Element)?.getAttribute(\"data-row-idx\") || \"-1\";\n\n this.removeFieldInfo(rowIdx);\n rowElement.remove();\n }\n }\n\n /**\n *\n * @param rowIdx row index\n */\n removeFieldInfo(rowIdx?: string) {\n let removeFieldArrs = [] as any;\n\n console.log(\"rowIdx : \", rowIdx);\n if (utils.isEmpty(rowIdx)) {\n for (let key in this.allAddRowInfo) {\n removeFieldArrs = removeFieldArrs.concat(this.allAddRowInfo[key]);\n }\n this.allAddRowInfo = {} as NumberKeyMap;\n } else if (rowIdx) {\n const rowIdxNum = parseInt(rowIdx, 10);\n removeFieldArrs = removeFieldArrs.concat(this.allAddRowInfo[rowIdxNum]);\n delete this.allAddRowInfo[rowIdxNum];\n }\n\n for (let columnField of removeFieldArrs) {\n this.gridForm.getFieldInfoMap().removeFieldInfo(columnField.name);\n }\n }\n\n allRemoveRow(): void {\n this.rowElement.querySelector(\"tbody\")?.replaceChildren();\n this.removeFieldInfo();\n }\n\n getValue() {\n if (this.customFunction.getValue) {\n return (this.customFunction.getValue as any).call(this, this.field, this.rowElement);\n }\n let result = [];\n const children = this.field.children;\n const childrenLength = children.length;\n for (let idx in this.allAddRowInfo) {\n const rowColumns = this.allAddRowInfo[idx];\n\n let rowInfo = {} as any;\n for (let childIdx = 0; childIdx < childrenLength; childIdx++) {\n let childField = children[childIdx];\n rowInfo[childField.name] = this.gridForm.getFieldValue(rowColumns[childIdx].name); // rowColumns[childIdx].$instance.getValue();\n }\n\n result.push(rowInfo);\n }\n return result;\n }\n\n setValue(value: any): void {\n this.field.$value = value;\n\n let valueArr: any[] = [];\n if (utils.isArray(value)) {\n valueArr = value;\n } else {\n if (utils.isPlainObject(value)) {\n valueArr.push(value);\n }\n }\n\n this.allRemoveRow();\n\n for (let valueItem of valueArr) {\n this.addRow(valueItem);\n }\n }\n\n reset() {\n this.setDefaultInfo();\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement() {\n if (this.customFunction.getElement) {\n return (this.customFunction.getElement as any).call(this, this.field, this.rowElement);\n }\n return null;\n }\n\n valid(): any {\n if (this.customFunction.valid) {\n const validResult = (this.customFunction.valid as any).call(this, this.field, this.rowElement);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return;\n }\n\n const validResult = this.gridForm.validForm();\n\n if (validResult.length > 0) {\n const firstItem = validResult[0];\n\n if (firstItem.message) {\n firstItem.message = \"[\" + this.field.label + \"] \" + firstItem.message;\n\n return firstItem;\n }\n }\n\n return true;\n }\n\n focus(): void {}\n}\n","import NumberRender from \"@/renderer/NumberRender\";\r\nimport TextAreaRender from \"@/renderer/TextAreaRender\";\r\nimport DropdownRender from \"@/renderer/DropdownRender\";\r\nimport TextRender from \"@/renderer/TextRender\";\r\nimport CheckboxRender from \"@/renderer/CheckboxRender\";\r\nimport RadioRender from \"@/renderer/RadioRender\";\r\nimport PasswordRender from \"@/renderer/PasswordRender\";\r\nimport FileRender from \"@/renderer/FileRender\";\r\nimport CustomRender from \"./renderer/CustomRender\";\r\nimport GroupRender from \"./renderer/GroupRender\";\r\nimport HiddenRender from \"./renderer/HiddenRender\";\r\nimport ButtonRender from \"./renderer/ButtonRender\";\r\nimport RangeRender from \"./renderer/RangeRender\";\r\nimport DateRender from \"./renderer/DateRender\";\r\nimport TabRender from \"./renderer/TabRender\";\r\nimport GridRender from \"./renderer/GridRender\";\r\n\r\nexport type FORM_MODE = \"new\" | \"modify\" | \"view\";\r\n\r\nexport const RULES = {\r\n NAN: \"nan\",\r\n MIN: \"minimum\",\r\n EXCLUSIVE_MIN: \"exclusiveMinimum\",\r\n MAX: \"maximum\",\r\n EXCLUSIVE_MAX: \"exclusiveMaximum\",\r\n MIN_LENGTH: \"minLength\",\r\n MAX_LENGTH: \"maxLength\",\r\n BETWEEN: \"between\",\r\n BETWEEN_EXCLUSIVE_MIN: \"betweenExclusiveMin\",\r\n BETWEEN_EXCLUSIVE_MAX: \"betweenExclusiveMax\",\r\n BETWEEN_EXCLUSIVE_MINMAX: \"betweenExclusiveMinMax\",\r\n REGEXP: \"regexp\",\r\n REQUIRED: \"required\",\r\n VALIDATOR: \"validator\",\r\n} as const;\r\n\r\nexport const FIELD_PREFIX = \"dff\"; // daracl form field\r\n\r\nexport const RENDER_TEMPLATE: any = {\r\n number: NumberRender,\r\n textarea: TextAreaRender,\r\n dropdown: DropdownRender,\r\n checkbox: CheckboxRender,\r\n radio: RadioRender,\r\n text: TextRender,\r\n password: PasswordRender,\r\n file: FileRender,\r\n custom: CustomRender,\r\n group: GroupRender,\r\n hidden: HiddenRender,\r\n button: ButtonRender,\r\n range: RangeRender,\r\n datehour: DateRender,\r\n datemonth: DateRender,\r\n date: DateRender,\r\n datetime: DateRender,\r\n tab: TabRender,\r\n grid: GridRender,\r\n};\r\n\r\nexport const ALIGN = {\r\n left: \"left\",\r\n center: \"center\",\r\n right: \"right\",\r\n} as const;\r\n\r\nexport type TEXT_ALIGN_TYPE = (typeof ALIGN)[keyof typeof ALIGN];\r\n\r\nexport type RENDER_TYPE = \"number\" | \"text\" | \"file\" | \"textarea\" | \"dropdown\" | \"radio\" | \"checkbox\" | \"date\" | \"datetime\" | \"dateyear\" | \"datemonth\" | \"datehour\" | \"group\" | \"custom\";\r\n\r\nexport type REGEXP_TYPE = \"email\" | \"url\" | \"alpha\" | \"alpha-num\";\r\n\r\nexport type PASSWORD_TYPE = \"number\" | \"upper\" | \"upper-special\" | \"upper-special-number\"; // 숫자 | 대문자 포함, 대문자 특수문자 포함, 대문자 특수문자 숫자\r\n\r\nexport type FIELD_POSITION = \"top\" | \"left\" | \"left-left\" | \"left-right\" | \"right\" | \"right-left\" | \"right-right\" | \"bottom\";\r\n\r\nexport const OrientationMap = {\r\n horizontal: \"horizontal\",\r\n vertical: \"vertical\",\r\n} as const;\r\n\r\nexport type OrientationType = (typeof OrientationMap)[keyof typeof OrientationMap];\r\n\r\ninterface StringArrayMap {\r\n [key: string]: string[];\r\n}\r\n\r\nexport const FIELD_POSITION_STYLE: StringArrayMap = {\r\n \"top-left\": [\"top\", \"df-txt-left\"],\r\n \"top-center\": [\"top\", \"df-txt-center\"],\r\n \"top-right\": [\"top\", \"df-txt-right\"],\r\n \"left-left\": [\"\", \"df-txt-left\"],\r\n \"left-center\": [\"\", \"df-txt-center\"],\r\n \"left-right\": [\"\", \"df-txt-right\"],\r\n \"right-right\": [\"right\", \"df-txt-right\"],\r\n \"right-center\": [\"right\", \"df-txt-center\"],\r\n \"right-left\": [\"right\", \"df-txt-left\"],\r\n \"bottom-left\": [\"bottom\", \"df-txt-left\"],\r\n \"bottom-center\": [\"bottom\", \"df-txt-center\"],\r\n \"bottom-right\": [\"bottom\", \"df-txt-right\"],\r\n};\r\nFIELD_POSITION_STYLE[\"top\"] = FIELD_POSITION_STYLE[\"top-left\"];\r\nFIELD_POSITION_STYLE[\"right\"] = FIELD_POSITION_STYLE[\"right-right\"];\r\nFIELD_POSITION_STYLE[\"left\"] = FIELD_POSITION_STYLE[\"left-left\"];\r\nFIELD_POSITION_STYLE[\"bottom\"] = FIELD_POSITION_STYLE[\"bottom-left\"];\r\n","import { Message } from \"@t/Message\";\r\nimport { FormField } from \"../types/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\n\r\nlet localeMessage: Message = {\r\n required: \"{label} 필수 입력사항입니다.\",\r\n fileButton: \"파일찾기\",\r\n selection: \"선택\",\r\n string: {\r\n minLength: \"{minLength} 글자 이상으로 입력하세요.\",\r\n maxLength: \"{maxLength} 글자 이하로 입력하세요.\",\r\n between: \"{minLength} ~ {maxLength} 사이의 글자를 입력하세요.\",\r\n },\r\n number: {\r\n nan: \"숫자만 입력 가능 합니다.\",\r\n minimum: \"{minimum} 값과 같거나 커야 합니다\",\r\n exclusiveMinimum: \"{minimum} 보다 커야 합니다\",\r\n maximum: \"{maximum} 값과 같거나 작아야 합니다\",\r\n exclusiveMaximum: \"{maximum} 보다 작아야 합니다.\",\r\n between: \"{minimum}~{maximum} 사이의 값을 입력하세요.\",\r\n betweenExclusiveMin: \"{minimum} 보다 크고 {maximum} 보다 같거나 작아야 합니다\",\r\n betweenExclusiveMax: \"{minimum} 보다 같거나 크고 {maximum} 보다 작아야 합니다\",\r\n betweenExclusiveMinMax: \"{minimum} 보다 크고 {maximum} 보다 작아야 합니다\",\r\n },\r\n regexp: {\r\n mobile: \"핸드폰 번호가 유효하지 않습니다.\",\r\n email: \"이메일이 유효하지 않습니다.\",\r\n url: \"URL이 유효하지 않습니다.\",\r\n alpha: \"영문만 입력 가능 합니다.\",\r\n \"alpha-num\": \"영문과 숫자만 입력 가능 합니다.\",\r\n number: \"숫자만 입력 가능 합니다.\",\r\n variable: \"값이 유효하지 않습니다.\",\r\n \"number-char\": \"숫자, 문자 각각 하나 이상 포함 되어야 합니다.\",\r\n \"upper-char\": \"대문자가 하나 이상 포함 되어야 합니다.\",\r\n \"upper-char-special\": \"대문자,소문자,특수문자 각각 하나 이상 포함 되어야 합니다.\",\r\n \"upper-char-special-number\": \"대문자,소문자,특수문자,숫자 각각 하나 이상 포함 되어야합니다.\",\r\n },\r\n};\r\n\r\n/**\r\n * validation 메시지 처리.\r\n *\r\n * @class Language\r\n * @typedef {Language}\r\n */\r\nclass Language {\r\n private lang: Message = localeMessage;\r\n\r\n /**\r\n * 다국어 메시지 등록\r\n *\r\n * @public\r\n * @param {?Message} [lang] 둥록할 메시지\r\n */\r\n public set(lang?: Message) {\r\n this.lang = Object.assign({}, localeMessage, lang);\r\n }\r\n\r\n /**\r\n * 메시지 얻기\r\n *\r\n * @public\r\n * @param {string} messageKey 메시지 키\r\n * @returns {*}\r\n */\r\n public getMessage(messageKey: string): any {\r\n return (this.lang as any)[messageKey];\r\n }\r\n\r\n /**\r\n * ValidResult 값을 메시지로 변경.\r\n *\r\n * @public\r\n * @param {FormField} field\r\n * @param {ValidResult} validResult\r\n * @returns {string[]}\r\n */\r\n public validMessage(field: FormField, validResult: ValidResult): string[] {\r\n let messageFormat = \"\";\r\n\r\n let messageFormats: string[] = [];\r\n\r\n if (validResult.regexp) {\r\n messageFormat = (this.lang.regexp as any)[validResult.regexp];\r\n messageFormats.push(messageFormat);\r\n }\r\n\r\n (validResult.constraint ?? []).forEach((constraint) => {\r\n if (constraint === RULES.REQUIRED) {\r\n messageFormat = message(this.lang.required, field);\r\n messageFormats.push(messageFormat);\r\n }\r\n\r\n if (field.renderType == \"number\" || field.renderType == \"range\") {\r\n messageFormat = (this.lang.number as any)[constraint];\r\n messageFormats.push(messageFormat);\r\n } else {\r\n messageFormat = (this.lang.string as any)[constraint];\r\n messageFormats.push(messageFormat);\r\n }\r\n });\r\n\r\n const reMessage: string[] = [];\r\n\r\n const msgParam = Object.assign({}, { name: field.name, label: field.label }, field.rule);\r\n messageFormats.forEach((msgFormat) => {\r\n if (msgFormat) {\r\n reMessage.push(message(msgFormat, msgParam));\r\n }\r\n });\r\n\r\n if (validResult.validator) {\r\n reMessage.push(validResult.validator.message);\r\n }\r\n\r\n return reMessage;\r\n }\r\n}\r\n\r\nfunction message(msgFormat: string, msgParam: any): string {\r\n return msgFormat.replace(/\\{{1,1}([A-Za-z0-9_.]*)\\}{1,1}/g, (match, key) => {\r\n return typeof msgParam[key] !== \"undefined\" ? msgParam[key] : match;\r\n });\r\n}\r\n\r\nexport default new Language();\r\n","import { FormField } from \"@t/FormField\";\r\n\r\nimport { Render } from \"../renderer/Render\";\r\nimport { RENDER_TEMPLATE } from \"../constants\";\r\nimport * as utils from \"./utils\";\r\n\r\nexport const getRenderer = (field: FormField): Render => {\r\n let render;\r\n if (field.renderType) {\r\n render = RENDER_TEMPLATE[field.renderType];\r\n }\r\n\r\n if (render && (render.isDataRender() === false || !utils.isUndefined(field.name))) {\r\n return render;\r\n }\r\n\r\n if (utils.isUndefined(field.name)) {\r\n if (field.children) {\r\n return RENDER_TEMPLATE[\"group\"];\r\n } else {\r\n return RENDER_TEMPLATE[\"hidden\"];\r\n }\r\n }\r\n\r\n return RENDER_TEMPLATE[\"text\"];\r\n};\r\n","import { FIELD_PREFIX } from \"@/constants\";\r\nimport { FormField } from \"./types/FormField\";\r\nimport { ValidResult } from \"./types/ValidResult\";\r\nimport { getRenderer } from \"./util/renderFactory\";\r\nimport Language from \"./util/Language\";\r\nimport * as utils from \"./util/utils\";\r\nimport { DaraForm } from \"./DaraForm\";\r\n\r\ninterface NumberFieldMap {\r\n [key: string]: FormField;\r\n}\r\n\r\ninterface StringNumberMap {\r\n [key: string]: string;\r\n}\r\n\r\nexport default class FieldInfoMap {\r\n private fieldIdx = 0;\r\n\r\n private allFieldInfo: NumberFieldMap = {};\r\n\r\n private keyNameMap: StringNumberMap = {};\r\n\r\n private conditionFields: string[] = [];\r\n\r\n private fieldPrefix;\r\n\r\n private form;\r\n\r\n constructor(selector: string, form: DaraForm) {\r\n this.fieldPrefix = `${FIELD_PREFIX}_${utils.getHashCode(selector)}`;\r\n this.form = form;\r\n }\r\n\r\n /**\r\n * add Field 정보\r\n *\r\n * @public\r\n * @param {FormField} field 폼필드 정보\r\n */\r\n public addField(field: FormField) {\r\n utils.replaceXssField(field);\r\n this.fieldIdx += 1;\r\n field.$key = `${this.fieldPrefix}_${this.fieldIdx}`;\r\n field.$validName = field.name ?? field.label;\r\n this.keyNameMap[field.$validName] = field.$key;\r\n this.allFieldInfo[field.$key] = field;\r\n field.$renderType = getRenderer(field);\r\n\r\n if (field.conditional) {\r\n this.conditionFields.push(field.$key);\r\n }\r\n }\r\n\r\n /**\r\n * 필드명으로 필드 정부 구하기\r\n *\r\n * @public\r\n * @param {string} fieldName 필드명\r\n * @returns {FormField}\r\n */\r\n public getFieldName(fieldName: string): FormField {\r\n return this.allFieldInfo[this.keyNameMap[fieldName]];\r\n }\r\n\r\n /**\r\n * 필드 키로 정보 구하기\r\n *\r\n * @public\r\n * @param {string} fieldKey\r\n * @returns {FormField}\r\n */\r\n public get(fieldKey: string): FormField {\r\n return this.allFieldInfo[fieldKey];\r\n }\r\n\r\n /**\r\n * 필드명 있는지 여부 체크.\r\n *\r\n * @public\r\n * @param {string} fieldName 필드명\r\n * @returns {boolean}\r\n */\r\n public hasFieldName(fieldName: string): boolean {\r\n if (this.keyNameMap[fieldName] && this.allFieldInfo[this.keyNameMap[fieldName]]) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * 모든 필드 정보\r\n *\r\n * @public\r\n * @returns {NumberFieldMap}\r\n */\r\n public getAllFieldInfo(): NumberFieldMap {\r\n return this.allFieldInfo;\r\n }\r\n\r\n /**\r\n * 필드 정보 맵에서 지우기\r\n *\r\n * @public\r\n * @param {string} fieldName\r\n */\r\n public removeFieldInfo(fieldName: string) {\r\n const fieldKey = this.keyNameMap[fieldName];\r\n\r\n if (utils.isUndefined(fieldKey)) return;\r\n\r\n this.removeFieldInfoByKey(fieldKey);\r\n delete this.keyNameMap[fieldName];\r\n }\r\n\r\n /**\r\n * 필드 키로 필드 정보 맵에서 지우기\r\n *\r\n * @public\r\n * @param {string} fieldKey\r\n */\r\n public removeFieldInfoByKey(fieldKey: string) {\r\n const fieldInfo = this.allFieldInfo[fieldKey];\r\n\r\n if (fieldInfo && this.keyNameMap[fieldInfo.$validName] === fieldKey) {\r\n delete this.keyNameMap[fieldInfo.$validName];\r\n }\r\n\r\n delete this.allFieldInfo[fieldKey];\r\n\r\n this.conditionFields = this.conditionFields.filter((key) => key !== fieldKey);\r\n }\r\n\r\n /**\r\n * 모든 필드값 구하기\r\n *\r\n * @public\r\n * @param {boolean} validationCheck\r\n * @returns {*}\r\n */\r\n public getAllFieldValue(formValue: any, validationCheck: boolean) {\r\n const useTypeValue = this.form.getOptions().useTypeValue;\r\n\r\n if (validationCheck !== true) {\r\n for (let [key, fieldInfo] of Object.entries(this.allFieldInfo)) {\r\n formValue = addFormValue(formValue, fieldInfo, useTypeValue);\r\n }\r\n return formValue;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n for (let [key, fieldInfo] of Object.entries(this.allFieldInfo)) {\r\n if (!fieldInfo.$instance.isEnableView()) {\r\n continue;\r\n }\r\n\r\n let fieldValid = this.getFieldValidation(fieldInfo, true);\r\n\r\n if (fieldValid !== true) {\r\n reject(new Error(fieldValid.message, { cause: fieldValid }));\r\n return;\r\n }\r\n\r\n formValue = addFormValue(formValue, fieldInfo, useTypeValue);\r\n }\r\n\r\n resolve(formValue);\r\n });\r\n }\r\n\r\n public getFormDataValue(formValue: any, validationCheck: boolean) {\r\n if (validationCheck !== true) {\r\n let reval = new FormData();\r\n\r\n for (let [key, value] of Object.entries(formValue)) {\r\n reval.set(key, value as any);\r\n }\r\n\r\n for (let [key, fieldInfo] of Object.entries(this.allFieldInfo)) {\r\n addFieldFormData(reval, fieldInfo, fieldInfo.$instance.getValue());\r\n }\r\n\r\n return reval;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n let reval = new FormData();\r\n\r\n for (let [key, value] of Object.entries(formValue)) {\r\n reval.set(key, value as any);\r\n }\r\n\r\n for (let [key, fieldInfo] of Object.entries(this.allFieldInfo)) {\r\n if (!fieldInfo.$instance.isEnableView()) {\r\n continue;\r\n }\r\n\r\n let fieldValid = this.getFieldValidation(fieldInfo, true);\r\n\r\n if (fieldValid !== true) {\r\n reject(new Error(fieldValid.message, { cause: fieldValid }));\r\n return;\r\n }\r\n\r\n addFieldFormData(reval, fieldInfo, fieldInfo.$instance.getValue());\r\n }\r\n\r\n resolve(reval);\r\n });\r\n }\r\n\r\n /**\r\n *\r\n *\r\n * @param field\r\n * @returns\r\n */\r\n public isConditionFieldCheck(field: FormField) {\r\n let parent = field;\r\n\r\n while (typeof parent !== \"undefined\") {\r\n if (!this.isConditionField(parent)) {\r\n return false;\r\n }\r\n\r\n parent = parent.$parent;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * field 활성 비활성화 여부.\r\n *\r\n * @param field form field\r\n * @returns\r\n */\r\n public isConditionField(field: FormField) {\r\n if (!this.conditionFields.includes(field.$key)) {\r\n return true;\r\n }\r\n\r\n let condFlag = false;\r\n\r\n if (field.conditional.custom) {\r\n condFlag = field.conditional.custom.call(null, field);\r\n } else {\r\n if (field.conditional.field) {\r\n const condField = this.getFieldName(field.conditional.field);\r\n\r\n if (condField) {\r\n if (field.conditional.eq == condField.$instance.getValue()) {\r\n condFlag = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return condFlag;\r\n }\r\n\r\n /**\r\n * 컬럼 로우 보이고 안보이기 체크.\r\n *\r\n * @public\r\n */\r\n public conditionCheck() {\r\n this.conditionFields.forEach((fieldKey) => {\r\n const fieldInfo = this.allFieldInfo[fieldKey];\r\n\r\n let condFlag = this.isConditionField(fieldInfo);\r\n\r\n if (condFlag) {\r\n fieldInfo.$instance.show();\r\n } else {\r\n fieldInfo.$instance.hide();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * field validation check\r\n *\r\n * @param fieldInfo FormField\r\n * @returns boolean true or ValidResult\r\n */\r\n public getFieldValidation(fieldInfo: FormField, focusFlag: boolean | undefined) {\r\n if (!this.isConditionFieldCheck(fieldInfo)) {\r\n return true;\r\n }\r\n\r\n const renderInfo = fieldInfo.$instance;\r\n let fieldValid = renderInfo.valid();\r\n\r\n if (fieldValid === true) return true;\r\n\r\n if (focusFlag) {\r\n renderInfo.focus();\r\n }\r\n fieldValid = fieldValid as ValidResult;\r\n if (utils.isUndefined(fieldValid.message)) {\r\n fieldValid.message = Language.validMessage(fieldInfo, fieldValid)[0];\r\n }\r\n\r\n return fieldValid;\r\n }\r\n}\r\n\r\n/**\r\n * add form value\r\n * @param formData {Object} return Object value\r\n * @param fieldInfo {FormField} field info\r\n * @param fieldValue {any} form value\r\n */\r\nfunction addFormValue(formData: any, fieldInfo: FormField, useTypeValue?: boolean) {\r\n if (utils.ignoreValueField(fieldInfo)) {\r\n return formData;\r\n }\r\n\r\n const fieldValue = fieldInfo.$instance.getValue();\r\n\r\n if (fieldInfo.renderType === \"file\") {\r\n const uploadFiles = fieldValue[\"uploadFile\"];\r\n\r\n formData[fieldInfo.$validName] = uploadFiles;\r\n formData[fieldInfo.$validName + \"RemoveIds\"] = fieldValue[\"removeIds\"];\r\n } else {\r\n if (useTypeValue !== true) {\r\n if (utils.isTabType(fieldInfo)) {\r\n for (let [key, value] of Object.entries(fieldValue)) {\r\n formData[key] = value;\r\n }\r\n } else {\r\n if (!utils.isEmpty(fieldInfo.name)) {\r\n formData[fieldInfo.name] = fieldValue;\r\n }\r\n }\r\n } else {\r\n formData[fieldInfo.$validName] = fieldValue;\r\n }\r\n }\r\n\r\n return formData;\r\n}\r\n\r\nfunction addFieldFormData(formData: FormData, fieldInfo: FormField, useTypeValue?: boolean) {\r\n if (utils.ignoreValueField(fieldInfo)) {\r\n return formData;\r\n }\r\n\r\n const fieldValue = fieldInfo.$instance.getValue();\r\n\r\n if (fieldInfo.renderType === \"file\") {\r\n const uploadFiles = fieldValue[\"uploadFile\"];\r\n formData.delete(fieldInfo.$validName);\r\n for (let uploadFile of uploadFiles) {\r\n formData.append(fieldInfo.$validName, uploadFile);\r\n }\r\n\r\n formData.set(fieldInfo.$validName + \"RemoveIds\", fieldValue[\"removeIds\"]);\r\n } else {\r\n if (useTypeValue !== true) {\r\n if (utils.isTabType(fieldInfo)) {\r\n for (let [key, value] of Object.entries(fieldValue)) {\r\n formData.set(key, value as any);\r\n }\r\n } else {\r\n if (!utils.isEmpty(fieldInfo.name)) {\r\n formData.set(fieldInfo.$validName, fieldValue);\r\n }\r\n }\r\n } else {\r\n formData.set(fieldInfo.$validName, fieldValue);\r\n }\r\n }\r\n\r\n return formData;\r\n}\r\n","import { FormOptions } from \"@t/FormOptions\";\nimport { FieldStyle, FormField } from \"@t/FormField\";\nimport * as utils from \"./util/utils\";\nimport FieldInfoMap from \"@/FieldInfoMap\";\n\nimport { resolveFieldStyle } from \"./util/styleUtils\";\nimport { DaraForm } from \"./DaraForm\";\nimport TabRender from \"./renderer/TabRender\";\nimport GridRender from \"./renderer/GridRender\";\n\n/**\n * form template\n *\n * @class FormTemplate\n * @typedef {FormTemplate}\n */\nexport default class FormTemplate {\n private readonly options: FormOptions;\n private readonly formElement;\n\n private fieldInfoMap;\n\n private daraform: DaraForm;\n\n private addRowFields: string[] = [];\n\n constructor(daraform: DaraForm, formElement: Element, fieldInfoMap: FieldInfoMap) {\n this.daraform = daraform;\n this.options = daraform.getOptions();\n this.formElement = formElement;\n\n this.fieldInfoMap = fieldInfoMap;\n }\n\n /**\n * field row 추가.\n *\n * @param field\n */\n public addRow(field: FormField) {\n if (this.checkHiddenField(field)) {\n return;\n }\n\n this.addRowFields = [];\n\n this.addRowTemplate(field);\n }\n\n /**\n * 그룹 템플릿\n *\n * @param {FormField} field\n * @returns {string} row template\n */\n public addRowTemplate(field: FormField): void {\n let labelHideFlag = this.isLabelHide(field);\n\n let fieldStyle: FieldStyle = resolveFieldStyle(this.options, field, null, labelHideFlag);\n\n this.addRowFieldInfo(field);\n\n const rowElement = utils.templateToElement(`\n <div class=\"df-row df-form-group ${fieldStyle.fieldClass}\" id=\"${field.$key}\">\n ${labelHideFlag ? \"\" : `<div class=\"df-label ${fieldStyle.labelClass} ${fieldStyle.labelAlignClass}\" title=\"${field.label ?? \"\"}\" style=\"${fieldStyle.labelStyle}\">${this.getLabelTemplate(field)}</div>`}\n\n <div class=\"df-field-container ${fieldStyle.valueClass} ${field.required ? \"required\" : \"\"}\" style=\"${fieldStyle.valueStyle}\"></div>\n </div>\n `);\n\n if (rowElement) {\n this.createField(field, rowElement);\n this.formElement.append(rowElement);\n\n if (field.children) {\n this.childTemplate(field, fieldStyle);\n }\n }\n }\n\n public createField(field: FormField, element: Element): void {\n field.$instance = new (field.$renderType as any)(field, element, this.daraform);\n }\n\n /**\n * child template\n *\n * @param {FormField} field\n * @param {FieldStyle} parentFieldStyle\n * @returns {*}\n */\n public childTemplate(field: FormField, parentFieldStyle: FieldStyle): void {\n let beforeField: FormField = null as any;\n let firstFlag = true;\n let isEmptyLabel = false;\n\n if (!(field.$renderType as any).isChildrenCreate()) {\n return;\n }\n\n const rowElement = document.createElement(\"div\");\n rowElement.classList.add(\"df-row\", parentFieldStyle.rowStyleClass ?? \"\");\n\n let idx = 0;\n\n for (const childField of field.children) {\n if (utils.isEmpty(childField)) {\n throw new Error(`parent field :[${field.$validName}], children index ${idx}, empty [${childField}]`);\n }\n\n childField.$parent = field;\n ++idx;\n\n if (this.checkHiddenField(childField)) {\n continue;\n }\n\n this.addRowFieldInfo(childField);\n\n if (firstFlag) {\n beforeField = childField;\n }\n\n let labelHideFlag = this.isLabelHide(childField);\n\n let childFieldStyle;\n\n let labelTemplate = \"\";\n if (labelHideFlag) {\n childFieldStyle = resolveFieldStyle(this.options, childField, beforeField, !isEmptyLabel);\n labelTemplate = isEmptyLabel ? `<span class=\"df-label df-empty ${childFieldStyle.labelClass}\" style=\"${childFieldStyle.labelStyle}\"></span>` : \"\";\n } else {\n childFieldStyle = resolveFieldStyle(this.options, childField, beforeField, false);\n labelTemplate = `<span class=\"df-label ${childFieldStyle.labelClass} ${childFieldStyle.labelAlignClass}\" title=\"${childField.label ?? \"\"}\" style=\"${childFieldStyle.labelStyle}\">${this.getLabelTemplate(childField)}</span>`;\n }\n\n const groupElement = utils.templateToElement(`<div class=\"df-form-group ${childFieldStyle.fieldClass}\" style=\"${childFieldStyle.fieldStyle}\" id=\"${childField.$key}\">\n ${labelTemplate}\n <span class=\"df-field-container ${childFieldStyle.valueClass} ${childField.required ? \"required\" : \"\"}\" style=\"${childFieldStyle.valueStyle}\"></span>\n </div>`);\n\n if (groupElement) {\n this.createField(childField, groupElement);\n rowElement.append(groupElement);\n\n if (childField.children) {\n this.childTemplate(childField, childField.children ? childFieldStyle : parentFieldStyle);\n }\n }\n if (!labelHideFlag) {\n isEmptyLabel = true;\n }\n\n firstFlag = false;\n }\n\n field.$instance.addChildField(rowElement);\n }\n\n /**\n * label template\n *\n * @param {FormField} field form field\n * @returns {string} template string\n */\n public getLabelTemplate(field: FormField) {\n const requiredTemplate = field.required ? `<span class=\"required\"></span>` : \"\";\n const tooltipTemplate = utils.isBlank(field.tooltip) ? \"\" : `<span class=\"df-tooltip\">?<span class=\"df-tooltip-text\">${field.tooltip}</span></span>`;\n\n return `<span class=\"df-label-text\">${field.label ?? \"\"}</span> ${tooltipTemplate} ${requiredTemplate}`;\n }\n\n /**\n * label 숨김 여부\n *\n * @param field formfield\n * @returns\n */\n public isLabelHide(field: FormField): boolean {\n return field.style?.labelHide || utils.isUndefined(field.label);\n }\n\n public checkHiddenField(field: FormField) {\n if (utils.isHiddenField(field)) {\n this.fieldInfoMap.addField(field);\n field.$instance = new (field.$renderType as any)(field, null, this.daraform);\n\n return true;\n }\n\n return false;\n }\n\n /**\n * add row file map\n *\n * @param {FormField} field\n */\n public addRowFieldInfo(field: FormField) {\n if (!utils.isBlank(field.name) && this.fieldInfoMap.hasFieldName(field.name)) {\n throw new Error(`Duplicate field name \"${field.name}\"`);\n }\n\n this.fieldInfoMap.addField(field);\n this.addRowFields.push(field.$key);\n }\n}\n","import { FormOptions } from \"./types/FormOptions\";\r\nimport { merge } from \"./util/utils\";\r\n\r\nexport function initFormOptions(options: FormOptions): FormOptions {\r\n const opts = merge({}, DEFAULT_OPTIONS, options) as FormOptions;\r\n\r\n return opts;\r\n}\r\n\r\n/**\r\n * 전역으로 옵션 설정.\r\n *\r\n * @param options 옵션\r\n */\r\nexport function setDefaultOptions(options: Partial<FormOptions>): void {\r\n DEFAULT_OPTIONS = merge({}, DEFAULT_OPTIONS, options);\r\n}\r\n\r\nlet DEFAULT_OPTIONS = {\r\n style: {\r\n width: \"100%\",\r\n labelWidth: 3,\r\n valueWidth: 9,\r\n position: \"left-right\",\r\n },\r\n mode: \"new\",\r\n useTypeValue: true,\r\n autoCreate: true,\r\n notValidMessage: \"This form is not valid.\",\r\n fields: [],\r\n} as FormOptions;\r\n","import { FormOptions } from \"@t/FormOptions\";\nimport { FormField } from \"@t/FormField\";\nimport * as utils from \"./util/utils\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { Message } from \"@t/Message\";\nimport Language from \"./util/Language\";\nimport { stringValidator } from \"./rule/stringValidator\";\nimport { numberValidator } from \"./rule/numberValidator\";\nimport { regexpValidator } from \"./rule/regexpValidator\";\nimport FieldInfoMap from \"@/FieldInfoMap\";\nimport FormTemplate from \"./FormTemplate\";\nimport { FORM_MODE } from \"./constants\";\nimport { initFormOptions, setDefaultOptions } from \"./defaultOption\";\n\ndeclare const APP_VERSION: string;\n\ninterface FieldMap {\n [key: string]: FormField;\n}\n\ninterface DaraFormMap {\n [key: string]: DaraForm;\n}\n\nexport interface FormChangeEvent {\n form: DaraForm;\n}\n\nexport interface FormChangeListener {\n (event: FormChangeEvent): void;\n}\n\nexport interface Unsubscribe {\n (): void;\n}\n\n// all instance\nconst allInstance: DaraFormMap = {};\n\nconst SEQ_ATTR_KEY = \"data-form-uid\";\n\nlet DARA_FORM_SEQ = 0;\n/**\n * DaraForm class\n *\n * @class DaraForm\n * @typedef {DaraForm}\n */\nexport class DaraForm {\n public static VERSION = `${APP_VERSION}`;\n\n private readonly options;\n\n private orginFormStyleClass;\n\n private selector: string;\n private formElement: Element;\n\n private fieldInfoMap: FieldInfoMap;\n\n private formValue: any = {};\n\n public formTemplate: FormTemplate;\n\n private changeListeners: FormChangeListener[] = [];\n\n constructor(formElement: Element, options: FormOptions, message?: Message) {\n this.options = initFormOptions(options);\n\n Language.set(message);\n\n if (formElement) {\n this.orginFormStyleClass = formElement.className;\n formElement.classList.add(\"daracl-form\");\n\n this.selector = `df_${++DARA_FORM_SEQ}`;\n formElement.setAttribute(\"name\", this.selector);\n formElement.setAttribute(SEQ_ATTR_KEY, this.selector);\n\n if (this.options.style.width) {\n formElement.setAttribute(\"style\", `width:${this.options.style.width};`);\n }\n\n this.formElement = formElement;\n this.changeMode(this.options.mode ?? \"new\");\n this.createForm(this.options.fields);\n\n if (this.options.autoCreate !== false) {\n allInstance[this.selector] = this;\n }\n } else {\n throw new Error(`${formElement} form selector not found`);\n }\n }\n\n public static create(formElement: Element, options: FormOptions, message?: Message): DaraForm {\n return new DaraForm(formElement, options, message);\n }\n\n public static setMessage(message: Message): void {\n Language.set(message);\n }\n\n public static setDefaultOptions(options: FormOptions, message?: Message): void {\n setDefaultOptions(options);\n\n if (message) {\n Language.set(message);\n }\n }\n\n private createForm(fields: FormField[]) {\n this.fieldInfoMap = new FieldInfoMap(this.selector, this);\n //this.formElement.innerHTML = \"\";\n this.formTemplate = new FormTemplate(this, this.formElement, this.fieldInfoMap);\n\n if (this.options.autoCreate === false) {\n return;\n }\n\n fields.forEach((field) => {\n this.formTemplate.addRow(field);\n });\n this.conditionCheck();\n\n if (this.options.onMounted) {\n this.options.onMounted.call(this);\n }\n }\n\n /**\n * change mode\n *\n * @param mode form_mode default new\n */\n public changeMode = (mode: FORM_MODE): void => {\n this.options.mode = mode;\n this.formElement.setAttribute(\"data-df-mode\", mode);\n\n const fields = this.formElement.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>(\".df-field input, \" + \".df-field textarea, \" + \".df-field select\");\n\n if (mode == \"view\") {\n fields.forEach((field) => {\n if (field instanceof HTMLInputElement) {\n field.readOnly = true;\n }\n\n if (field instanceof HTMLTextAreaElement) {\n field.readOnly = true;\n }\n });\n } else {\n fields.forEach((field) => {\n if (field instanceof HTMLInputElement) {\n field.readOnly = false;\n }\n\n if (field instanceof HTMLTextAreaElement) {\n field.readOnly = false;\n }\n });\n }\n };\n\n /**\n * 폼 데이터 reset\n */\n public resetForm = () => {\n const fieldMap = this.fieldInfoMap.getAllFieldInfo();\n for (const seq in fieldMap) {\n const fieldInfo = fieldMap[seq];\n const renderInfo = fieldInfo.$instance;\n\n if (renderInfo && typeof renderInfo.reset === \"function\") {\n renderInfo.reset();\n }\n }\n this.formValue = {};\n this.conditionCheck();\n };\n\n /**\n * field 값 reset\n * @param fieldName 필드명\n */\n public resetField = (fieldName: string) => {\n this.fieldInfoMap.getFieldName(fieldName).$instance.reset();\n this.formValue[fieldName] = \"\";\n this.conditionCheck();\n };\n\n /**\n * 필드 element 얻기\n *\n * @param {string} fieldName\n * @returns {*}\n */\n public getFieldElement(fieldName: string) {\n const field = this.fieldInfoMap.getFieldName(fieldName);\n\n if (field?.$instance) {\n return field.$instance.getElement();\n }\n\n return null;\n }\n\n public getField(fieldName: string): FormField {\n return this.fieldInfoMap.getFieldName(fieldName);\n }\n\n /**\n * field 값 얻기\n *\n * @param fieldName 필드명\n * @returns\n */\n public getFieldValue = (fieldName: string) => {\n const field = this.fieldInfoMap.getFieldName(fieldName);\n\n if (field) {\n return field.$instance.getValue();\n }\n return null;\n };\n\n /**\n * 폼 필드 값 얻기\n * @param isValid 폼 유효성 검사 여부 default:false|undefined true일경우 검사.\n * @returns\n */\n public getValue = (isValid: boolean): any => {\n return this.fieldInfoMap.getAllFieldValue(this.formValue, isValid);\n };\n\n public getFormDataValue = (isValid: boolean): any => {\n return this.fieldInfoMap.getFormDataValue(this.formValue, isValid);\n };\n\n /**\n * 폼 필드 value 셋팅\n * @param values\n */\n public setValue = (values: any, dataClear?: boolean | undefined) => {\n if (dataClear !== false) {\n this.resetForm();\n }\n\n Object.keys(values).forEach((fieldName) => {\n this._setFieldValue(fieldName, values[fieldName]);\n });\n this.conditionCheck();\n };\n\n public setFieldValue = (fieldName: string, value: any) => {\n this._setFieldValue(fieldName, value);\n this.conditionCheck();\n };\n\n private _setFieldValue(fieldName: string, value: any) {\n this.formValue[fieldName] = value;\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n\n if (fieldInfo) {\n fieldInfo.$instance.setValue(value);\n }\n }\n\n public setFieldItems = (fieldName: string, values: any) => {\n const field = this.fieldInfoMap.getFieldName(fieldName);\n\n if (field) {\n return field.$instance.setValueItems(values);\n }\n };\n\n /**\n * field 추가\n *\n * @param {FormField} field\n */\n public addField = (field: FormField) => {\n this.options.fields.push(field);\n this.formTemplate.addRow(field);\n this.conditionCheck();\n };\n\n /**\n * field 제거\n *\n * @param {string} fieldName\n */\n public removeField = (fieldName: string) => {\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n\n if (!fieldInfo) return;\n\n const removeFields = this.getRemoveFields(fieldInfo);\n\n removeFields.forEach((removeField) => {\n this.removeFormValue(removeField);\n });\n\n this.removeFieldElement(fieldInfo);\n this.removeParentChildField(fieldInfo);\n\n removeFields.forEach((removeField) => {\n this.fieldInfoMap.removeFieldInfoByKey(removeField.$key);\n });\n\n this.conditionCheck();\n };\n\n /**\n * 제거할 필드와 같은 fieldInfoMap에 등록된 하위 필드(group 하위 필드, tab 패널) 목록\n * grid 컬럼, tab 패널 내부 필드는 별도 form에 등록되므로 제외됨.\n *\n * @param {FormField} fieldInfo\n * @param {FormField[]} result\n * @returns {FormField[]}\n */\n private getRemoveFields(fieldInfo: FormField, result: FormField[] = []): FormField[] {\n result.push(fieldInfo);\n\n fieldInfo.children?.forEach((childField) => {\n if (childField && this.fieldInfoMap.get(childField.$key) === childField) {\n this.getRemoveFields(childField, result);\n }\n });\n\n return result;\n }\n\n /**\n * field element 제거\n *\n * @param {FormField} fieldInfo\n */\n private removeFieldElement(fieldInfo: FormField) {\n const parentField = fieldInfo.$parent;\n\n // tab 패널은 tab header item, tab panel 로 구성됨.\n if (parentField && utils.isTabType(parentField)) {\n const tabElement = parentField.$instance.getElement() as Element;\n const tabItem = tabElement.querySelector(`[data-tab-id=\"${fieldInfo.$key}\"]`);\n const activeFlag = tabItem?.classList.contains(\"active\");\n\n tabItem?.remove();\n tabElement.querySelector(`[tab-panel-id=\"${fieldInfo.$key}\"]`)?.remove();\n\n const firstTabItem = tabElement.querySelector(\".df-tab-header .df-tab-item\");\n if (activeFlag && firstTabItem) {\n parentField.$instance.setActive(firstTabItem.getAttribute(\"data-tab-id\") ?? \"\");\n }\n return;\n }\n\n // 최상위 필드는 .df-row, group 하위 필드는 .df-form-group 에 id=$key 가 지정됨.\n const rowSelector = `[id=\"${fieldInfo.$key}\"]`;\n let element = fieldInfo.$instance?.getElement();\n\n // checkbox, radio 는 getElement()가 NodeList를 반환함.\n if (element instanceof NodeList || element instanceof HTMLCollection) {\n element = element[0] ?? null;\n }\n\n const rowElement = (element instanceof Element ? element.closest(rowSelector) : null) ?? this.formElement.querySelector(rowSelector);\n const containerElement = rowElement?.parentElement;\n\n rowElement?.remove();\n\n // group 하위 필드를 모두 제거한 경우 빈 row 제거\n if (parentField && containerElement?.classList.contains(\"df-row\") && containerElement.childElementCount < 1) {\n containerElement.remove();\n }\n }\n\n /**\n * 부모 children(최상위는 options.fields)에서 필드 제거\n * tab 은 children 기준으로 값/유효성 체크를 하므로 제거해야 함.\n *\n * @param {FormField} fieldInfo\n */\n private removeParentChildField(fieldInfo: FormField) {\n const fields: FormField[] | undefined = fieldInfo.$parent ? fieldInfo.$parent.children : this.options.fields;\n const idx = fields ? fields.indexOf(fieldInfo) : -1;\n\n if (idx > -1) {\n fields?.splice(idx, 1);\n }\n }\n\n /**\n * getValue() 시 formValue에 누적된 field 값 제거\n *\n * @param {FormField} fieldInfo\n */\n private removeFormValue(fieldInfo: FormField) {\n const keys = [fieldInfo.name, fieldInfo.$validName];\n\n if (fieldInfo.renderType === \"file\") {\n keys.push(fieldInfo.$validName + \"RemoveIds\");\n } else if (utils.isTabType(fieldInfo)) {\n keys.push(...Object.keys(fieldInfo.$instance.getValue() ?? {}));\n }\n\n // tab 패널 (useTypeValue false 일 경우 패널 내부 필드 값이 펼쳐져 저장됨)\n if (fieldInfo.$tabForm) {\n keys.push(...Object.keys(fieldInfo.$tabForm.getValue(false) ?? {}));\n }\n\n keys.forEach((key) => {\n if (!utils.isBlank(key)) delete this.formValue[key];\n });\n }\n\n /**\n * 폼 유효성 검증 여부\n *\n * @returns {boolean}\n */\n public isValidForm = (): boolean => {\n const result = this.validForm();\n\n return result.length < 1;\n };\n\n /**\n * 유효성 검증 폼 검증여부 리턴\n *\n * @returns {any[]}\n */\n public validForm = (): any[] => {\n let validResult = [] as any;\n let autoFocusFlag = this.options.autoFocus !== false;\n let firstFlag = true;\n\n const fieldMap = this.fieldInfoMap.getAllFieldInfo();\n for (const fieldKey in fieldMap) {\n const fieldInfo = fieldMap[fieldKey];\n\n let fieldValid = this.fieldInfoMap.getFieldValidation(fieldInfo, autoFocusFlag);\n\n if (fieldValid !== true) {\n autoFocusFlag = false;\n\n if (utils.isGridType(fieldInfo)) {\n validResult = validResult.concat(fieldValid);\n } else {\n if (firstFlag) {\n this.validTabCheck(fieldInfo);\n firstFlag = false;\n }\n validResult.push(fieldValid);\n }\n }\n }\n\n return validResult;\n };\n\n private validTabCheck(fieldInfo: FormField) {\n if (fieldInfo.$parent) {\n if (fieldInfo.$parent.renderType == \"tab\") {\n fieldInfo.$parent.$instance.setActive(fieldInfo.$key);\n }\n this.validTabCheck(fieldInfo.$parent);\n }\n }\n\n public isValidField = (fieldName: string): boolean => {\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n\n if (utils.isUndefined(fieldInfo)) {\n throw new Error(`Field name [${fieldName}] not found`);\n }\n\n const renderInfo = fieldInfo.$instance;\n if (renderInfo) {\n return renderInfo.valid() === true;\n }\n\n return true;\n };\n\n /**\n * 설정 옵션 얻기\n */\n public getOptions = () => {\n return this.options;\n };\n\n public conditionCheck() {\n this.fieldInfoMap.conditionCheck();\n this.notifyChange();\n }\n\n /**\n * 폼 상태(값/보이기 여부 등) 변경을 감지하는 리스너 등록.\n *\n * value/setValue/resetForm/conditional 변경 체크\n *\n * @param listener 상태 변경시 호출되는 콜백\n * @returns 등록 해제 함수\n */\n public subscribe = (listener: FormChangeListener): Unsubscribe => {\n this.changeListeners.push(listener);\n\n return () => {\n this.changeListeners = this.changeListeners.filter((l) => l !== listener);\n };\n };\n\n private notifyChange() {\n if (this.changeListeners.length < 1) return;\n\n const event: FormChangeEvent = { form: this };\n this.changeListeners.forEach((listener) => listener(event));\n }\n\n public setFieldDisabled(fieldName: string, flag: boolean) {\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n fieldInfo.$instance.setDisabled(flag);\n }\n\n /**\n * 설명 추가\n *\n * @public\n * @param {string} fieldName\n * @param {string} desc\n */\n public setFieldDescription(fieldName: string, desc: string) {\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n fieldInfo.$instance.setDescription(desc);\n }\n\n public destroy = () => {\n this.formElement.className = this.orginFormStyleClass;\n this.formElement.replaceChildren();\n\n for (const key in this) {\n if (utils.hasOwnProp(this, key)) {\n delete this[key];\n delete allInstance[this.selector];\n }\n }\n };\n\n public static validator = {\n string: (value: string, field: FormField) => {\n return stringValidator(value, field);\n },\n number: (value: string, field: FormField) => {\n return numberValidator(value, field);\n },\n regexp: (value: string, field: FormField) => {\n let result: ValidResult = { name: field.name, constraint: [] };\n return regexpValidator(value, field, result);\n },\n };\n\n public static instance(ele: Element | String) {\n let element;\n if (utils.isString(ele)) {\n element = document.querySelector(ele);\n } else {\n element = ele;\n }\n element = element as Element;\n let selector = element.getAttribute(SEQ_ATTR_KEY);\n\n if (utils.isUndefined(selector) || utils.isBlank(selector)) {\n const keys = Object.keys(allInstance);\n if (keys.length > 1) {\n throw new Error(`selector empty : [${selector}]`);\n }\n selector = keys[0];\n\n return allInstance[selector];\n }\n }\n /**\n * 모든 field 얻기\n */\n public getFields = (): any[] => {\n return this.options.fields;\n };\n\n /**\n * field setting\n * @param fields\n */\n public setFields = (fields: any[]) => {\n this.options.fields = fields;\n this.createForm(fields);\n };\n\n public getFieldInfoMap() {\n return this.fieldInfoMap;\n }\n}\n","import { DaraForm } from \"./DaraForm\";\r\n\r\nimport \"../style/daracl.form.scss\";\r\n\r\nimport \"@daracl/datetimepicker/dist/daracl.datetimepicker.min.css\";\r\n\r\n// 2) 브라우저 전역에 등록 (데모 실행용)\r\ndeclare global {\r\n interface Window {\r\n Daracl?: any;\r\n }\r\n}\r\n\r\nif (typeof window !== \"undefined\") {\r\n window.Daracl = window.Daracl || {};\r\n window.Daracl.form = DaraForm;\r\n}"],"names":["isArray","isString","isEmpty","isFunction","coreIsArray","utils.isUndefined","utils.replaceXss","utils.isString","utils.isArray","parser","descEle","utils.isEmpty","utils.isBlank","utils.isNumber","message","Language","item","validResult","localeMessage","regexp","DEFAULT_OPTIONS","_DateTimePicker","fieldStyle","utils.templateToElement","utils.merge","utils.getXssFieldName","utils.isPlainObject","utils.getHashCode","utils.replaceXssField","utils.ignoreValueField","utils.isTabType","utils.isHiddenField","utils.isGridType","utils.hasOwnProp"],"mappings":"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","x_google_ignoreList":[0,24]}
|
|
1
|
+
{"version":3,"file":"daracl.form.umd.js","sources":["../../node_modules/@daracl/core/dist/utils.js","../../src/util/utils.ts","../../src/renderer/Render.ts","../../src/rule/regexpValidator.ts","../../src/rule/validator.ts","../../src/rule/numberValidator.ts","../../src/util/validUtils.ts","../../src/event/renderEvents.ts","../../src/renderer/NumberRender.ts","../../src/rule/stringValidator.ts","../../src/renderer/TextAreaRender.ts","../../src/renderer/DropdownRender.ts","../../src/renderer/TextRender.ts","../../src/util/styleUtils.ts","../../src/renderer/CheckboxRender.ts","../../src/renderer/RadioRender.ts","../../src/renderer/PasswordRender.ts","../../src/rule/fileValidator.ts","../../src/renderer/FileRender.ts","../../src/renderer/CustomRender.ts","../../src/renderer/GroupRender.ts","../../src/renderer/HiddenRender.ts","../../src/renderer/ButtonRender.ts","../../src/renderer/RangeRender.ts","../../node_modules/@daracl/core/dist/index.js","../../node_modules/@daracl/datetimepicker/dist/index.js","../../src/renderer/DateRender.ts","../../src/renderer/TabRender.ts","../../src/renderer/GridRender.ts","../../src/constants.ts","../../src/util/Language.ts","../../src/util/renderFactory.ts","../../src/FieldInfoMap.ts","../../src/FormTemplate.ts","../../src/defaultOption.ts","../../src/DaraForm.ts","../../src/index.umd.ts"],"sourcesContent":["function isArray(value) {\n return Array.isArray(value);\n}\nfunction isFunction(value) {\n return typeof value === \"function\";\n}\nfunction isObject(value) {\n return value !== null && (typeof value === \"object\" || typeof value === \"function\");\n}\nfunction isPlainObject(value) {\n return value !== null && typeof value === \"object\" && Object.getPrototypeOf(value) === Object.prototype;\n}\nfunction isPlainPrototype(prototype) {\n if (prototype === null) return true;\n if (Object.getPrototypeOf(prototype) !== null) return false;\n const constructor = Object.getOwnPropertyDescriptor(prototype, \"constructor\")?.value;\n return isFunction(constructor) && Function.prototype.toString.call(constructor) === Function.prototype.toString.call(Object);\n}\nfunction copyProperties(source, target, context) {\n for (const key of Reflect.ownKeys(source)) {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n Object.defineProperty(target, key, {\n value: copy(source[key], context),\n enumerable: true,\n writable: true,\n configurable: true\n });\n }\n}\nfunction copy(source, context) {\n if (!isObject(source) || isFunction(source)) return source;\n if (context.seen.has(source)) return context.seen.get(source);\n let result;\n if (isArray(source)) {\n result = new Array(source.length);\n } else if (source instanceof Date) {\n result = new Date(Date.prototype.getTime.call(source));\n } else if (source instanceof RegExp) {\n result = new RegExp(source.source, source.flags);\n result.lastIndex = source.lastIndex;\n } else if (source instanceof Map) {\n result = /* @__PURE__ */ new Map();\n context.tasks.push(() => Map.prototype.forEach.call(source, (item, key) => result.set(copy(key, context), copy(item, context))));\n } else if (source instanceof Set) {\n result = /* @__PURE__ */ new Set();\n context.tasks.push(() => Set.prototype.forEach.call(source, (item) => result.add(copy(item, context))));\n } else {\n const prototype = Object.getPrototypeOf(source);\n if (!isPlainObject(source) && !isPlainPrototype(prototype)) return source;\n result = Object.create(prototype === null ? null : Object.prototype);\n }\n context.seen.set(source, result);\n context.tasks.push(() => copyProperties(source, result, context));\n return result;\n}\nconst deepCopy = (value, seen = /* @__PURE__ */ new WeakMap()) => {\n const context = { seen, tasks: [] };\n const result = copy(value, context);\n while (context.tasks.length) context.tasks.pop()();\n return result;\n};\nconst isMergeObject = (value) => isPlainObject(value) || value !== null && typeof value === \"object\" && Object.getPrototypeOf(value) === null;\nconst hasOwn = (value, key) => Object.prototype.hasOwnProperty.call(value, key);\nfunction setOwn(target, key, value) {\n Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });\n}\nfunction mergeSource(target, source, excludeKeys) {\n const copies = /* @__PURE__ */ new WeakMap();\n const tasks = [];\n function copy2(value, current) {\n if (value === null || typeof value !== \"object\") return value;\n if (copies.has(value)) return copies.get(value);\n let result;\n if (isArray(value)) {\n result = isArray(current) ? current : [];\n tasks.push(() => mergeArray(result, value));\n } else if (isMergeObject(value)) {\n result = isMergeObject(current) ? current : Object.create(Object.getPrototypeOf(value));\n tasks.push(() => mergeObject(result, value));\n } else if (value instanceof Date) {\n result = new Date(value.getTime());\n } else if (value instanceof RegExp) {\n result = new RegExp(value.source, value.flags);\n result.lastIndex = value.lastIndex;\n } else if (value instanceof Map) {\n result = /* @__PURE__ */ new Map();\n tasks.push(() => value.forEach((item, key) => result.set(copy2(key), copy2(item))));\n } else if (value instanceof Set) {\n result = /* @__PURE__ */ new Set();\n tasks.push(() => value.forEach((item) => result.add(copy2(item))));\n } else {\n return value;\n }\n copies.set(value, result);\n return result;\n }\n function mergeObject(dst, src) {\n for (const key of Object.keys(src)) {\n if (excludeKeys.has(key) || key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") continue;\n const value = src[key];\n if (value === void 0) continue;\n setOwn(dst, key, copy2(value, hasOwn(dst, key) ? dst[key] : void 0));\n }\n }\n function mergeArray(dst, src) {\n const seen = new Set(dst);\n for (const value of src) {\n const item = copy2(value);\n if (value !== null && typeof value === \"object\" || Number.isNaN(item) || !seen.has(item)) {\n seen.add(item);\n dst.push(item);\n }\n }\n }\n copies.set(source, target);\n if (isArray(source) && isArray(target)) tasks.push(() => mergeArray(target, source));\n else tasks.push(() => mergeObject(target, source));\n while (tasks.length) tasks.pop()();\n}\nfunction objectDeepMerge(...values) {\n if (values.length < 1) {\n return values;\n }\n let excludeKeys = /* @__PURE__ */ new Set();\n let sources = values;\n const last = values[values.length - 1];\n if (isMergeObject(last) && hasOwn(last, \"_excludeKeys\") && isArray(last._excludeKeys)) {\n excludeKeys = new Set(last._excludeKeys.map(String));\n sources = values.slice(0, -1);\n }\n let result = {};\n for (let index = 0; index < sources.length; index++) {\n const value = sources[index];\n if (isArray(value) || isMergeObject(value)) {\n mergeSource(result, value, index === 0 ? /* @__PURE__ */ new Set() : excludeKeys);\n }\n }\n return result;\n}\nfunction arrayDeepMerge(...values) {\n if (values.length < 1) {\n return values;\n }\n let source = [];\n let excludeKeys = /* @__PURE__ */ new Set();\n for (let value of values) {\n if (!isArray(value)) continue;\n mergeSource(source, value, excludeKeys);\n }\n return source;\n}\nfunction hasProperty(obj, prop) {\n return obj != null && obj != void 0 && Object.prototype.hasOwnProperty.call(obj, prop);\n}\nfunction isString(value) {\n return typeof value === \"string\";\n}\nfunction isBlank(value) {\n return value === null || value === void 0 || isString(value) && value.trim() === \"\";\n}\nfunction isDate(value) {\n return value instanceof Date && !isNaN(value.getTime());\n}\nfunction isNil(value) {\n return value === null || value === void 0;\n}\nfunction isEmpty(value) {\n if (isNil(value)) {\n return true;\n }\n if (isString(value)) {\n return value.trim() === \"\";\n }\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n if (typeof value === \"object\") {\n return Object.keys(value).length === 0;\n }\n return false;\n}\nfunction isNumeric(value, typeIgnore = false) {\n if (typeIgnore === true) return !Number.isNaN(value);\n return (typeof value === \"number\" || isString(value) && value.trim() !== \"\" && !isNaN(parseFloat(value))) && isFinite(Number(value));\n}\nfunction isUndefined(value) {\n return typeof value === \"undefined\";\n}\nfunction objectToQueryString(param) {\n return Object.keys(param).map((key) => {\n if (param[key] !== void 0) {\n const val = param[key];\n return `${encodeURIComponent(key)}=${encodeURIComponent(isObject(val) ? JSON.stringify(val) : String(val))}`;\n }\n }).filter(Boolean).join(\"&\");\n}\nfunction replaceParameter(template, param) {\n const objectParam = isPlainObject(param);\n return template.replace(/#.*?#/g, (placeholder) => {\n const key = placeholder.slice(1, -1);\n const value = objectParam ? Object.prototype.hasOwnProperty.call(param, key) ? param[key] ?? \"\" : \"\" : param;\n return isObject(value) ? JSON.stringify(value) : String(value);\n });\n}\nconst xssFilter = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\"\n};\nconst charsToReplace = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\"\n};\nfunction trim(s) {\n return s.replace(/^\\s+|\\s+$/g, \"\");\n}\nfunction leftTrim(s) {\n return s.replace(/^\\s+/g, \"\");\n}\nfunction rightTrim(s) {\n return s.replace(/\\s+$/g, \"\");\n}\nfunction allTrim(s) {\n return s.replace(/\\s+/g, \"\");\n}\nfunction matchCount(str, matchString) {\n if (isBlank(str)) return 0;\n const re = new RegExp(matchString, \"ig\");\n const resultArray = str.match(re);\n return resultArray == null ? 0 : resultArray.length;\n}\nfunction leftPad(str, len, ch = \"0\") {\n return pad(str, len, ch, \"l\");\n}\nfunction leftPadClamp(str, len, ch = \"0\") {\n return pad(str, len, ch, \"l\", true);\n}\nfunction rightPad(str, len, ch = \"0\") {\n return pad(str, len, ch, \"r\");\n}\nfunction rightPadClamp(str, len, ch = \"0\") {\n return pad(str, len, ch, \"r\", true);\n}\nfunction escapeHTML(html) {\n const fn = (tag) => {\n return charsToReplace[tag] || tag;\n };\n return html.replace(/[&<>\"]/g, fn);\n}\nfunction xss(inputText) {\n let returnText = inputText;\n if (returnText) {\n Object.keys(xssFilter).forEach((key) => {\n returnText = returnText.replaceAll(key, xssFilter[key]);\n });\n }\n return returnText;\n}\nfunction unXss(inputText) {\n let returnText = inputText;\n if (returnText) {\n Object.keys(xssFilter).forEach((key) => {\n returnText = returnText.replaceAll(xssFilter[key], key);\n });\n }\n return returnText;\n}\nfunction capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nfunction upperCase(str) {\n return (str || \"\").toUpperCase();\n}\nfunction lowerCase(str) {\n return (str || \"\").toLowerCase();\n}\nfunction pad(orginStr, size, ch, type = \"l\", clamp2 = false) {\n let str = \"\";\n if (isEmpty(orginStr)) {\n str = \"\";\n } else {\n str = isString(orginStr) ? orginStr : `${orginStr}`;\n }\n const strLength = str.length;\n if (strLength > size) {\n return clamp2 ? str.slice(0, size) : str;\n }\n const len = size - strLength;\n if (len < 1) return str;\n const padStr = ch.repeat(len);\n return type === \"l\" ? padStr + str : str + padStr;\n}\nfunction convertHtmlToText(html) {\n if (!html) return \"\";\n return html.replaceAll(/<br\\s*\\/?>/gi, \"\\n\").replaceAll(/<\\/(p|div|li|h[1-6])>/gi, \"\\n\").replaceAll(/<[^>]*>/g, \"\").replaceAll(\" \", \" \").replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\").replaceAll(\""\", '\"').replaceAll(\"'\", \"'\").replaceAll(/\\n{3,}/g, \"\\n\\n\").trim();\n}\nfunction uuid(dashRemoveFlag = true) {\n const value = createUuid();\n return dashRemoveFlag ? value : value.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, \"$1-$2-$3-$4-$5\");\n}\nfunction createUuid() {\n const cryptoObj = globalThis.crypto;\n if (cryptoObj && typeof cryptoObj.randomUUID === \"function\") return cryptoObj.randomUUID().replace(/-/g, \"\");\n const bytes = new Uint8Array(16);\n if (cryptoObj && typeof cryptoObj.getRandomValues === \"function\") {\n cryptoObj.getRandomValues(bytes);\n } else {\n for (let index = 0; index < bytes.length; index++) bytes[index] = Math.floor(Math.random() * 256);\n }\n bytes[6] = bytes[6] & 15 | 64;\n bytes[8] = bytes[8] & 63 | 128;\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\nfunction isFormData(data) {\n if (!data) return false;\n return typeof FormData !== \"undefined\" && data instanceof FormData;\n}\nfunction getURLParams(checkUrl) {\n const url = new URL(checkUrl);\n const params = {};\n for (const [key, value] of url.searchParams) {\n if (Object.prototype.hasOwnProperty.call(params, key)) {\n params[key].push(value);\n } else {\n Object.defineProperty(params, key, { value: [value], enumerable: true, configurable: true, writable: true });\n }\n }\n return params;\n}\nfunction getURLParam(checkUrl, paramKey) {\n const url = new URL(checkUrl);\n return url.searchParams.get(paramKey);\n}\nfunction isNumber(value) {\n return typeof value === \"number\" && !Number.isNaN(value);\n}\nfunction isBoolean(value) {\n return typeof value === \"boolean\";\n}\nfunction isThenable(value) {\n return isObject(value) && isFunction(value.then);\n}\nfunction isElement(value) {\n return value !== null && typeof value === \"object\" && value.nodeType === 1;\n}\nfunction isHTMLElement(value) {\n if (!isElement(value)) return false;\n const constructor = value.ownerDocument?.defaultView?.HTMLElement ?? (typeof HTMLElement === \"undefined\" ? void 0 : HTMLElement);\n return !!constructor && value instanceof constructor;\n}\nfunction toNumber(value) {\n if (isNumber(value)) return Number.isFinite(value) ? value : null;\n if (!isString(value) || value.trim() === \"\") return null;\n const number = Number(value.replace(/,/g, \"\"));\n return Number.isFinite(number) ? number : null;\n}\nfunction intValue(value) {\n return Number.parseInt(String(value), 10);\n}\nfunction clamp(value, min, max) {\n return Math.min(Math.max(value, min), max);\n}\nfunction formatNumber(value, pattern) {\n const decimals = (pattern.split(\".\")[1] ?? \"\").replace(/[^0#]/g, \"\").length;\n return value.toLocaleString(\"en-US\", {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n useGrouping: pattern.split(\".\")[0].includes(\",\")\n });\n}\nfunction toTimestamp(value) {\n if (isDate(value)) return value.getTime();\n if (isNumber(value)) return Number.isFinite(value) ? value : null;\n if (!isString(value) || value.trim() === \"\") return null;\n const time = Date.parse(value);\n return Number.isNaN(time) ? null : time;\n}\nfunction removeItem(array, item) {\n const index = array.indexOf(item);\n return index < 0 ? [...array] : [...array.slice(0, index), ...array.slice(index + 1)];\n}\nfunction arrayCopy(array, start, end) {\n return isArray(array) ? array.slice(start, end) : [];\n}\nfunction insertToArray(targetArray, values, isBefore = false, rowIndex, limit = Infinity) {\n const items = isArray(values) ? values : [values];\n if (rowIndex === void 0) {\n if (isBefore) targetArray.unshift(...items);\n else targetArray.push(...items);\n } else targetArray.splice(isBefore ? rowIndex - 1 : rowIndex, 0, ...items);\n if (Number.isFinite(limit) && targetArray.length > Math.max(0, limit)) {\n targetArray.splice(0, targetArray.length - Math.max(0, Math.floor(limit)));\n }\n return targetArray;\n}\nfunction moveItem(array, fromIndex, toIndex) {\n if (!Number.isInteger(fromIndex) || !Number.isInteger(toIndex) || fromIndex < 0 || fromIndex >= array.length || toIndex < 0 || toIndex >= array.length) return array;\n array.splice(toIndex, 0, array.splice(fromIndex, 1)[0]);\n return array;\n}\nfunction isSequential(array) {\n if (!array.length) return false;\n const values = /* @__PURE__ */ new Set();\n let min = Infinity;\n let max = -Infinity;\n for (const value of array) {\n if (!Number.isInteger(value) || values.has(value)) return false;\n values.add(value);\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n return max - min + 1 === array.length;\n}\nfunction arrayEquals(a, b, ignoreOrder = false, selector) {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n const select = selector ?? ((item) => item);\n if (!ignoreOrder) return a.every((item, index) => select(item) === select(b[index]));\n const counts = /* @__PURE__ */ new Map();\n for (const item of a) {\n const value = select(item);\n if (typeof value === \"number\" && Number.isNaN(value)) return false;\n counts.set(value, (counts.get(value) ?? 0) + 1);\n }\n for (const item of b) {\n const value = select(item);\n const count = counts.get(value);\n if (!count) return false;\n if (count === 1) counts.delete(value);\n else counts.set(value, count - 1);\n }\n return counts.size === 0;\n}\nfunction toListValue(value, delimiter = \",\") {\n if (isNil(value)) return [];\n if (isArray(value)) return value;\n return String(value).split(delimiter || \",\").map((item) => item.trim()).filter(Boolean);\n}\nfunction isSameValue(a, b) {\n return isNil(a) && isNil(b) || String(a) === String(b);\n}\nfunction getHashCode(value) {\n if (!value.length) return 0;\n let hash = 0;\n for (let index = 0; index < value.length; index++) hash = (hash << 5) - hash + value.charCodeAt(index) | 0;\n return String(hash).replace(/-/g, \"_\");\n}\nfunction camelToUnderscore(value) {\n return value.replace(/([a-z0-9])([A-Z])/g, \"$1_$2\").toLowerCase();\n}\nfunction camelToKebab(value) {\n return value.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\nfunction stringSplit(value, delimiter) {\n return (value || \"\").split(delimiter);\n}\nfunction addValueIfMissing(currentValue, addValue, shouldSort = false, delimiter = \",\", originValues = []) {\n if (!addValue) return [];\n let items = stringSplit(currentValue, delimiter).map(trim).filter(Boolean);\n if (originValues.length) {\n const allowed = new Set(originValues.map(trim));\n items = items.filter((item) => allowed.has(item));\n }\n const values = new Set(items);\n if (values.has(addValue)) values.delete(addValue);\n else values.add(addValue);\n const result = [...values];\n return shouldSort ? result.sort() : result;\n}\nfunction renderTemplate(template, data) {\n const get = (key) => hasProperty(data, key) ? data[key] : void 0;\n const result = template.replace(/{{if\\(([^)]+)\\)}}([\\s\\S]*?){{\\/if}}/g, (_match, condition, content) => {\n const booleanKey = /^\\s*(\\w+)\\s*$/.exec(condition);\n if (booleanKey) return get(booleanKey[1]) ? content : \"\";\n const comparison = /^\\s*(\\w+)\\s*(==|!=|>=|<=|>|<)\\s*(\\d+)\\s*$/.exec(condition);\n if (!comparison) return \"\";\n const left = get(comparison[1]);\n const right = Number(comparison[3]);\n const numeric = Number(left);\n const matched = comparison[2] === \"==\" ? left == right : comparison[2] === \"!=\" ? left != right : comparison[2] === \">=\" ? numeric >= right : comparison[2] === \"<=\" ? numeric <= right : comparison[2] === \">\" ? numeric > right : numeric < right;\n return matched ? content : \"\";\n });\n return result.replace(/{{\\s*(\\w+)\\s*}}/g, (_match, key) => String(get(key) ?? \"\"));\n}\nfunction assertScope(scope) {\n if (!/^[a-z][a-z0-9-]*$/i.test(scope)) throw new Error(`Invalid scope: ${scope}`);\n return scope;\n}\nfunction toDataAttribute(key, reserved = []) {\n const kebab = camelToKebab(key);\n return /^[a-z][a-z0-9-]*$/.test(kebab) && !reserved.includes(kebab) ? `data-${kebab}` : void 0;\n}\nfunction cloneJson(value) {\n return isUndefined(value) ? value : JSON.parse(JSON.stringify(value));\n}\nfunction cloneConfig(value) {\n if (isFunction(value)) return value;\n if (isArray(value)) return value.filter((item) => !isUndefined(item)).map((item) => cloneConfig(item));\n if (isPlainObject(value)) {\n const result = {};\n for (const [key, item] of Object.entries(value)) {\n if (isUndefined(item)) continue;\n Object.defineProperty(result, key, { value: cloneConfig(item), enumerable: true, configurable: true, writable: true });\n }\n return result;\n }\n return cloneJson(value);\n}\nfunction jsonEqual(a, b) {\n return a === b || JSON.stringify(a) === JSON.stringify(b);\n}\nfunction sameValue(a, b) {\n const seen = /* @__PURE__ */ new WeakMap();\n const compare = (left, right) => {\n if (Object.is(left, right)) return true;\n const arrays = isArray(left) && isArray(right);\n if (!arrays && !(isPlainObject(left) && isPlainObject(right))) return false;\n const l = left, r = right;\n if (seen.get(l)?.has(r)) return true;\n if (!seen.has(l)) seen.set(l, /* @__PURE__ */ new WeakSet());\n seen.get(l).add(r);\n if (arrays) {\n const la = left, ra = right;\n return la.length === ra.length && la.every((item, index) => compare(item, ra[index]));\n }\n const lo = left, ro = right;\n return [.../* @__PURE__ */ new Set([...Object.keys(lo), ...Object.keys(ro)])].every((key) => compare(\n Object.prototype.hasOwnProperty.call(lo, key) ? lo[key] : void 0,\n Object.prototype.hasOwnProperty.call(ro, key) ? ro[key] : void 0\n ));\n };\n return compare(a, b);\n}\nfunction parseConfigString(value) {\n if (!isString(value)) return value;\n try {\n const parsed = JSON.parse(value);\n return isPlainObject(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\nfunction toOptionObject(value) {\n if (isBoolean(value)) return { enabled: value };\n return isPlainObject(value) ? deepCopy(value) : {};\n}\nfunction debounce(callback, delay) {\n let timer;\n const cancel = () => {\n clearTimeout(timer);\n timer = void 0;\n };\n const debounced = function(...args) {\n cancel();\n if (delay < 1) {\n callback.apply(this, args);\n return;\n }\n timer = setTimeout(() => {\n timer = void 0;\n callback.apply(this, args);\n }, delay);\n };\n debounced.cancel = cancel;\n return debounced;\n}\nfunction compareValues(a, b, ascending = true, nullsLast = false) {\n const nullA = isNil(a);\n const nullB = isNil(b);\n if (nullA !== nullB) return nullsLast ? nullA ? 1 : -1 : ascending ? nullA ? 1 : -1 : nullA ? -1 : 1;\n if (nullA) return 0;\n const result = isNumber(a) && isNumber(b) ? a - b : String(a).localeCompare(String(b));\n return ascending ? result : -result;\n}\nfunction sortRows(rows, sorts, nullsLast = false) {\n return [...rows].sort((a, b) => {\n for (const sort of sorts) {\n const result = compareValues(a[sort.field], b[sort.field], sort.direction === \"asc\", nullsLast);\n if (result !== 0) return result;\n }\n return 0;\n });\n}\nfunction escapeRegExp(value) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\nfunction createMatcher(keyword, options = {}) {\n let source = escapeRegExp(keyword);\n const nested = /\\([^()]*[+*|][^()]*\\)[+*]/.test(keyword);\n if (options.useRegex && keyword.length <= 200 && !nested) {\n try {\n new RegExp(keyword);\n source = keyword;\n } catch {\n }\n }\n if (options.matchWholeWord) {\n const boundary = `[\\\\s.,;:!?()\\\\[\\\\]{}\"']`;\n source = `(?:^|${boundary})(?:${source})(?=$|${boundary})`;\n }\n const regexp = new RegExp(source, options.matchCase ? \"\" : \"i\");\n return (text) => regexp.test(text);\n}\nfunction matchRow(row, fields, matcher) {\n return fields.some((field) => {\n const value = row[field];\n return !isNil(value) && matcher(String(value));\n });\n}\nfunction highlightSingleMatch(text, match, highlightTag = \"mark\") {\n if (![\"mark\", \"span\", \"b\", \"strong\", \"em\", \"i\"].includes(highlightTag)) throw new TypeError(\"Invalid highlight tag\");\n const start = Math.max(0, Math.min(text.length, Math.floor(match.start)));\n const end = Math.max(start, Math.min(text.length, Math.floor(match.end)));\n return `${escapeHTML(text.slice(0, start))}<${highlightTag}>${escapeHTML(text.slice(start, end))}</${highlightTag}>${escapeHTML(text.slice(end))}`;\n}\nfunction formatDate(date, pattern) {\n const pad2 = (value) => leftPad(value, 2);\n const tokens = { YYYY: String(date.getFullYear()), MM: pad2(date.getMonth() + 1), DD: pad2(date.getDate()), HH: pad2(date.getHours()), mm: pad2(date.getMinutes()), ss: pad2(date.getSeconds()) };\n return pattern.replace(/YYYY|MM|DD|HH|mm|ss/g, (token) => tokens[token]);\n}\nfunction formatValue(value, format) {\n if (isNil(value) || value === \"\") return \"\";\n if (!format) return String(value);\n const prefix = format.prefix ?? \"\";\n const suffix = format.suffix ?? \"\";\n if (format.type === \"date\") {\n const date = value instanceof Date ? value : new Date(isNumber(value) ? value : String(value));\n return Number.isNaN(date.getTime()) ? String(value) : `${prefix}${formatDate(date, format.format ?? \"YYYY-MM-DD\")}${suffix}`;\n }\n const number = toNumber(value);\n if (number === null) return String(value);\n const text = format.type === \"currency\" ? new Intl.NumberFormat(format.locale, { style: \"currency\", currency: format.format ?? \"KRW\" }).format(number) : formatNumber(number, format.format ?? \"0,0\");\n return `${prefix}${text}${suffix}`;\n}\nfunction computeSummary(rows, field, expression) {\n if (isFunction(expression)) return expression(rows);\n if (expression === \"count\") return rows.length;\n let sum = 0, min = Infinity, max = -Infinity, count = 0;\n for (const row of rows) {\n const value = row[field];\n if (!isNumber(value)) continue;\n count++;\n sum += value;\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n return !count ? null : expression === \"min\" ? min : expression === \"max\" ? max : expression === \"average\" ? sum / count : sum;\n}\nfunction calcSummary(items, mode, itemKey) {\n if (![\"count\", \"min\", \"max\", \"sum\", \"avg\"].includes(mode)) return `${mode} not valid`;\n return computeSummary(items, itemKey, mode === \"avg\" ? \"average\" : mode) ?? \"not valid\";\n}\nfunction escapeCellValue(value) {\n return isString(value) && /[\"\\n\\r\\t]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n}\nfunction parseClipboard(text) {\n const rows = [];\n let row = [], cell = \"\", inQuotes = false;\n text = text.replace(/(\\r?\\n){2}$/, \"\\n\");\n for (let index = 0; index < text.length; index++) {\n const char = text[index], next = text[index + 1];\n if (char === '\"') {\n if (inQuotes && next === '\"') {\n cell += '\"';\n index++;\n } else inQuotes = !inQuotes;\n } else if (!inQuotes && char === \"\t\") {\n row.push(cell);\n cell = \"\";\n } else if (!inQuotes && (char === \"\\n\" || char === \"\\r\")) {\n if (char === \"\\r\" && next === \"\\n\") index++;\n row.push(cell);\n rows.push(row);\n row = [];\n cell = \"\";\n } else cell += char;\n }\n row.push(cell);\n rows.push(row);\n return rows;\n}\nfunction toTsv(rows, fields) {\n return rows.map((row) => fields.map((field) => {\n const value = row[field];\n return isNil(value) ? \"\" : String(value).replace(/[\\t\\n\\r]/g, \" \");\n }).join(\"\t\")).join(\"\\n\");\n}\nfunction parseTsv(text) {\n return text.replace(/\\r\\n/g, \"\\n\").replace(/\\n$/, \"\").split(\"\\n\").map((line) => line.split(\"\t\"));\n}\nfunction $querySelectorList(el) {\n if (isBlank(el)) {\n return [];\n }\n if (isString(el)) {\n return Array.from(document.querySelectorAll(el));\n }\n if (isArray(el)) {\n return el;\n }\n if (el instanceof Document) {\n return [el];\n }\n if (el instanceof Element) {\n return [el];\n }\n if (el instanceof NodeList) {\n return Array.from(el);\n }\n return [];\n}\nfunction getElementRect(el, includeScroll = false) {\n if (!el) {\n throw new Error(\"유효하지 않은 요소입니다.\");\n }\n const rect = el.getBoundingClientRect();\n const scrollX = includeScroll ? window.scrollX : 0;\n const scrollY = includeScroll ? window.scrollY : 0;\n return {\n top: rect.top + scrollY,\n left: rect.left + scrollX,\n bottom: rect.bottom + scrollY,\n right: rect.right + scrollX,\n width: rect.width,\n height: rect.height\n };\n}\nconst styleClassSplit = (styleClass) => {\n return styleClass.trim().split(/\\s+/).filter(Boolean);\n};\nfunction addClass(element, styleClass) {\n if (!element) return;\n const elements = $querySelectorList(element);\n const addStyles = styleClassSplit(styleClass);\n elements.forEach((el) => {\n el.classList.add(...addStyles);\n });\n}\nfunction addStyleCss(element, styles) {\n for (const key in styles) {\n if (Object.prototype.hasOwnProperty.call(styles, key)) {\n element.style.setProperty(key, styles[key]);\n }\n }\n}\nfunction hasClass(element, className) {\n return styleClassSplit(className).some((name) => element.classList.contains(name));\n}\nfunction isVisible(element) {\n return !!(element.offsetHeight || element.offsetWidth) && getComputedStyle(element).visibility !== \"hidden\";\n}\nfunction createHTMLElement(tagName, className, attrs = {}, text) {\n const element = document.createElement(tagName);\n if (className) addClass(element, className);\n for (const [key, value] of Object.entries(attrs)) {\n if (key === \"style\" && value !== null && typeof value === \"object\") {\n const styles = {};\n for (const [name, item] of Object.entries(value)) styles[camelToKebab(name)] = item;\n addStyleCss(element, styles);\n } else if (key === \"dataset\" && value !== null && typeof value === \"object\") {\n for (const [name, item] of Object.entries(value)) element.setAttribute(`data-${camelToKebab(name)}`, String(item));\n } else element.setAttribute(key, value !== null && typeof value === \"object\" ? JSON.stringify(value) : String(value));\n }\n if (text !== void 0) element.textContent = text;\n return element;\n}\nfunction templateToElement(html) {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n return template.content.firstElementChild;\n}\nfunction normalizeCssLength(value) {\n return !value ? \"\" : typeof value === \"number\" || /^\\d+$/.test(value) ? `${value}px` : value;\n}\nfunction resolveClassName(value, params) {\n if (!value) return [];\n return styleClassSplit(isFunction(value) ? value(params) : value);\n}\nfunction getBrowserSize(usableSize = true) {\n return usableSize ? { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight } : { width: window.innerWidth, height: window.innerHeight };\n}\nfunction getScrollPosition() {\n return {\n top: window.pageYOffset ?? (document.documentElement.scrollTop || document.body.scrollTop || 0),\n left: window.pageXOffset ?? (document.documentElement.scrollLeft || document.body.scrollLeft || 0)\n };\n}\nfunction outerLayerPosition(layer, position) {\n const scroll = getScrollPosition(), rect = getElementRect(layer), view = getBrowserSize();\n const bottom = scroll.top + view.height, right = scroll.left + view.width;\n return {\n top: Math.max(0, position.y + rect.height + 5 > bottom ? bottom - rect.height - 5 : position.y),\n left: Math.max(0, position.x + rect.width > right ? position.x - rect.width : position.x)\n };\n}\nfunction innerLayerPosition(container, target, layer, margin = 2) {\n const parent = getElementRect(container), rect = getElementRect(target);\n const height = Math.min(layer.offsetHeight || getElementRect(layer).height, Math.max(rect.top - margin, window.innerHeight - rect.bottom - margin, 0));\n const top = rect.bottom + height > window.innerHeight ? rect.top - height - margin : rect.bottom;\n return { top: top - parent.top, left: rect.left - parent.left, height, width: rect.width };\n}\nconst isPageRoot = (element) => element === document.body || element === document.documentElement;\nfunction resolveScrollElement(container, option) {\n let found;\n if (isHTMLElement(option)) found = option;\n else if (typeof option === \"string\" && option) {\n try {\n found = container.closest(option) ?? void 0;\n } catch {\n }\n }\n if (found) return isPageRoot(found) ? void 0 : found;\n for (let element = container; element && !isPageRoot(element); element = element.parentElement) {\n if ([\"auto\", \"scroll\", \"overlay\"].includes(getComputedStyle(element).overflowY) && element.scrollHeight > element.clientHeight) return element;\n }\n return void 0;\n}\nfunction measureScrollTarget(element) {\n if (!element) return { top: 0, bottom: window.innerHeight };\n const rect = getElementRect(element);\n return { element, top: clamp(rect.top, 0, window.innerHeight), bottom: clamp(rect.bottom, 0, window.innerHeight) };\n}\nfunction resolveScrollTarget(container, option) {\n return measureScrollTarget(resolveScrollElement(container, option));\n}\nfunction isEsc(event) {\n return event.key === \"Escape\" || event.key === \"Esc\";\n}\nfunction isPrimaryPointer(event) {\n if (typeof PointerEvent !== \"undefined\" && event instanceof PointerEvent) return event.isPrimary && event.button === 0;\n if (typeof MouseEvent !== \"undefined\" && event instanceof MouseEvent) return event.button === 0;\n return typeof TouchEvent !== \"undefined\" && event instanceof TouchEvent;\n}\nfunction isMouseMoved(start, current, threshold = 5) {\n return (current.x - start.x) ** 2 + (current.y - start.y) ** 2 > threshold ** 2;\n}\nfunction isSafeUrl(url) {\n const value = url.trim().replace(/[\\u0000-\\u001F\\u007F\\s]+/g, \"\");\n if (!value) return false;\n const match = /^([a-z][a-z0-9+.-]*):/i.exec(value);\n if (!match) return true;\n if (match[1].toLowerCase() === \"data\") return /^data:image\\/(?:png|gif|jpe?g|webp|avif|bmp)(?:;|,)/i.test(value);\n return [\"http\", \"https\", \"mailto\", \"tel\"].includes(match[1].toLowerCase());\n}\nfunction createClassNamer(prefix) {\n return (...names) => names.flatMap(styleClassSplit).map((name) => `${prefix}-${name}`).join(\" \");\n}\nasync function writeClipboard(text) {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n }\n if (typeof document === \"undefined\" || !document.body || !document.execCommand) return false;\n const active = document.activeElement;\n const textarea = createHTMLElement(\"textarea\", void 0, { style: { position: \"fixed\", top: \"-9999px\", left: \"-9999px\" } });\n textarea.value = text;\n document.body.appendChild(textarea);\n try {\n textarea.select();\n return document.execCommand(\"copy\");\n } catch {\n return false;\n } finally {\n textarea.remove();\n active?.focus?.();\n }\n}\nfunction downloadUrl(url, fileName) {\n const link = createHTMLElement(\"a\", void 0, { href: url, download: fileName, style: { display: \"none\" } });\n document.body.appendChild(link);\n try {\n link.click();\n } finally {\n link.remove();\n }\n}\nfunction downloadText(fileName, text, type = \"application/json\") {\n const url = URL.createObjectURL(new Blob([text], { type }));\n try {\n downloadUrl(url, fileName);\n } finally {\n setTimeout(() => URL.revokeObjectURL(url), 0);\n }\n}\nfunction svgToDataURL(svg) {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\nfunction serializeSvg(svg) {\n const clone = svg.cloneNode(true);\n if (!clone.getAttribute(\"xmlns\")) clone.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n return new XMLSerializer().serializeToString(clone);\n}\nconst getPagingParamToPagingInfo = (pagingParam, rowLength) => {\n const page = pagingParam?.page || 1;\n const totalCount = pagingParam?.totalCount ?? rowLength;\n const pageSize = pagingParam?.pageSize || 10;\n const unitPage = pagingParam?.unitPage || 10;\n return getPagingInfo(totalCount > 0 ? totalCount : rowLength, page, pageSize, unitPage);\n};\nconst getPagingInfo = (totalCount, page, pageSize, unitPage) => {\n pageSize = Number.isFinite(pageSize) && pageSize > 0 ? Math.max(1, Math.floor(pageSize)) : 10;\n unitPage = Number.isFinite(unitPage) && unitPage > 0 ? Math.max(1, Math.floor(unitPage)) : 10;\n totalCount = Number.isFinite(totalCount) ? Math.max(0, Math.floor(totalCount)) : 0;\n page = Number.isFinite(page) ? Math.max(1, Math.floor(page)) : 1;\n if (totalCount < 1) {\n return {\n page: 0,\n pageSize,\n unitPage,\n totalCount: 0,\n totalPages: 0,\n currStartPage: 0,\n currEndPage: 0,\n prePage: 0,\n nextPage: 0,\n prePage_is: false,\n nextPage_is: false\n };\n }\n const totalPages = totalCount % pageSize == 0 ? totalCount / pageSize : Math.floor(totalCount / pageSize) + 1;\n if (totalPages < page) {\n page = totalPages;\n }\n let currStartPage;\n let currEndPage;\n if (totalPages <= unitPage) {\n currEndPage = totalPages;\n currStartPage = 1;\n } else {\n let halfUnitPage = unitPage;\n if (page == unitPage || page > unitPage && totalPages - (page - 1) >= unitPage) {\n halfUnitPage = Math.floor(unitPage / 2);\n }\n if (page <= halfUnitPage) {\n currEndPage = unitPage;\n currStartPage = 1;\n } else if (page + halfUnitPage < totalPages) {\n currEndPage = page + halfUnitPage;\n currStartPage = currEndPage - unitPage + 1;\n } else {\n currEndPage = page + halfUnitPage;\n if (currEndPage > totalPages) {\n currEndPage = totalPages;\n }\n currStartPage = currEndPage - unitPage + 1;\n }\n }\n if (currEndPage > totalPages) currEndPage = totalPages;\n let prePage = 0;\n let prePage_is = false;\n if (currStartPage != 1) {\n prePage_is = true;\n prePage = currStartPage - 1;\n }\n let nextPage = 0;\n let nextPage_is = false;\n if (currEndPage != totalPages) {\n nextPage_is = true;\n nextPage = currEndPage + 1;\n }\n return {\n page,\n unitPage,\n prePage,\n prePage_is,\n nextPage,\n nextPage_is,\n currStartPage,\n currEndPage,\n pageSize,\n totalCount,\n totalPages\n };\n};\nconst DROP_TAGS = /* @__PURE__ */ new Set([\n \"script\",\n \"style\",\n \"iframe\",\n \"frame\",\n \"frameset\",\n \"object\",\n \"embed\",\n \"applet\",\n \"link\",\n \"meta\",\n \"base\",\n \"form\",\n \"input\",\n \"button\",\n \"textarea\",\n \"select\",\n \"option\",\n \"svg\",\n \"math\",\n \"template\",\n \"noscript\",\n \"title\"\n]);\nconst ALLOWED_TAGS = /* @__PURE__ */ new Set([\n \"a\",\n \"abbr\",\n \"b\",\n \"blockquote\",\n \"br\",\n \"caption\",\n \"code\",\n \"col\",\n \"colgroup\",\n \"dd\",\n \"del\",\n \"div\",\n \"dl\",\n \"dt\",\n \"em\",\n \"figcaption\",\n \"figure\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"hr\",\n \"i\",\n \"img\",\n \"ins\",\n \"li\",\n \"mark\",\n \"ol\",\n \"p\",\n \"pre\",\n \"s\",\n \"small\",\n \"span\",\n \"strong\",\n \"sub\",\n \"sup\",\n \"table\",\n \"tbody\",\n \"td\",\n \"tfoot\",\n \"th\",\n \"thead\",\n \"tr\",\n \"u\",\n \"ul\"\n]);\nconst ALLOWED_ATTRS = /* @__PURE__ */ new Set([\n \"class\",\n \"style\",\n \"title\",\n \"alt\",\n \"href\",\n \"src\",\n \"target\",\n \"width\",\n \"height\",\n \"colspan\",\n \"rowspan\",\n \"align\",\n \"valign\",\n \"dir\",\n \"lang\"\n]);\nconst URL_ATTRS = /* @__PURE__ */ new Set([\"href\", \"src\"]);\nconst UNSAFE_STYLE = /url\\s*\\(|expression\\s*\\(|javascript:|@import|behavior\\s*:|-moz-binding|\\\\|\\/\\*/i;\nfunction sanitizeElement(el) {\n Array.from(el.attributes).forEach((attr) => {\n const name = attr.name.toLowerCase();\n const value = attr.value;\n const keep = ALLOWED_ATTRS.has(name) && (!URL_ATTRS.has(name) || isSafeUrl(value)) && (name !== \"style\" || !UNSAFE_STYLE.test(value)) && (name !== \"target\" || value === \"_blank\" || value === \"_self\");\n if (!keep) el.removeAttribute(attr.name);\n });\n if (el.tagName === \"A\" && el.getAttribute(\"target\") === \"_blank\") {\n el.setAttribute(\"rel\", \"noopener noreferrer\");\n }\n}\nfunction sanitizeChildren(parent) {\n Array.from(parent.childNodes).forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) return;\n if (node.nodeType !== Node.ELEMENT_NODE) {\n node.parentNode?.removeChild(node);\n return;\n }\n const el = node;\n const tag = el.tagName.toLowerCase();\n if (DROP_TAGS.has(tag)) {\n el.remove();\n return;\n }\n sanitizeChildren(el);\n if (ALLOWED_TAGS.has(tag)) {\n sanitizeElement(el);\n } else {\n el.replaceWith(...Array.from(el.childNodes));\n }\n });\n}\nfunction sanitizeHtml(html) {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n const fragment = template.content;\n sanitizeChildren(fragment);\n return document.importNode(fragment, true);\n}\nconst copyObject = (value) => isPlainObject(value) ? { ...value } : {};\nconst isUnsafe = (path) => path.some((key) => [\"__proto__\", \"constructor\", \"prototype\"].includes(key));\nfunction toObjectForm(value, stringKey) {\n if (isBoolean(value)) return { enabled: value };\n if (isString(value)) return stringKey ? { [stringKey]: value } : {};\n return copyObject(value);\n}\nfunction setIn(target, path, value, options = {}) {\n if (!path.length || isUnsafe(path)) throw new TypeError(\"Invalid object path\");\n const nodes = [target];\n let node = target;\n for (const key of path.slice(0, -1)) {\n const current = hasProperty(node, key) ? node[key] : void 0;\n const next = (options.toObject ?? copyObject)(current);\n node[key] = next;\n nodes.push(next);\n node = next;\n }\n const last = path[path.length - 1];\n if (value === void 0) delete node[last];\n else node[last] = value;\n if (options.prune) {\n for (let index = nodes.length - 1; index > 0 && !Object.keys(nodes[index]).length; index--) delete nodes[index - 1][path[index - 1]];\n }\n}\nfunction getIn(target, path, toObject) {\n if (isUnsafe(path)) return void 0;\n let node = target;\n for (const key of path) {\n if (toObject && !isPlainObject(node)) node = toObject(node);\n if (!isPlainObject(node) || !hasProperty(node, key)) return void 0;\n node = node[key];\n }\n return node;\n}\nfunction fieldsOf(rows, limit = 100) {\n const fields = /* @__PURE__ */ new Set();\n for (const row of (rows ?? []).slice(0, Math.max(0, limit))) {\n if (isPlainObject(row)) Object.keys(row).forEach((key) => fields.add(key));\n }\n return [...fields];\n}\nfunction fieldDisplayName(field, label) {\n return label && label !== field ? `${label}(${field})` : field;\n}\nconst FUNCTION_REF_PREFIX = \"@fn:\";\nfunction createErrorFactory(prefix) {\n return (message) => new Error(`${prefix} ${message}`);\n}\nfunction parseJson(json, createError = (message) => new Error(message)) {\n try {\n return JSON.parse(json);\n } catch (error) {\n throw createError(`invalid JSON : ${error.message}`);\n }\n}\nfunction walkConfig(value, visitor, startPath = \"\") {\n const active = /* @__PURE__ */ new WeakSet();\n const walk = (node, path) => {\n const result = visitor(node, path);\n if (result.handled) return result.value;\n if (!isArray(node) && !isPlainObject(node)) return node;\n if (active.has(node)) throw new TypeError(`Cyclic config: ${path}`);\n active.add(node);\n try {\n if (isArray(node)) return node.map((item, index) => walk(item, `${path}[${index}]`));\n const out = {};\n for (const [key, value2] of Object.entries(node)) {\n const next = walk(value2, path ? `${path}.${key}` : key);\n if (next !== void 0) Object.defineProperty(out, key, { value: next, enumerable: true, configurable: true, writable: true });\n }\n return out;\n } finally {\n active.delete(node);\n }\n };\n return walk(value, startPath);\n}\nfunction stringifyWithFunctions(value, functions = {}) {\n const names = new Map(Object.entries(functions).map(([name, fn]) => [fn, name]));\n const omitted = [];\n const converted = walkConfig(value, (node, path) => {\n if (!isFunction(node)) return { handled: false };\n const name = names.get(node);\n if (name !== void 0) return { handled: true, value: `${FUNCTION_REF_PREFIX}${name}` };\n omitted.push(path);\n return { handled: true, value: void 0 };\n });\n return { json: JSON.stringify(converted, null, 2), omitted };\n}\nfunction restoreFunctions(value, functions = {}, createError = (message) => new Error(message), path = \"\") {\n return walkConfig(value, (node, at) => {\n if (!isString(node) || !node.startsWith(FUNCTION_REF_PREFIX)) return { handled: false };\n const name = node.slice(FUNCTION_REF_PREFIX.length);\n if (!hasProperty(functions, name) || !isFunction(functions[name])) throw createError(`${at || \"value\"} : function \"${name}\" is not registered`);\n return { handled: true, value: functions[name] };\n }, path);\n}\nfunction parseConfigJson(json, functions = {}, createError = (message) => new Error(message)) {\n const config = restoreFunctions(parseJson(json, createError), functions, createError);\n if (!isPlainObject(config)) throw createError(\"config JSON must be an object\");\n return config;\n}\nfunction readTextFile(file) {\n return file.text();\n}\nexport {\n FUNCTION_REF_PREFIX,\n addValueIfMissing,\n allTrim,\n arrayCopy,\n arrayDeepMerge,\n arrayEquals,\n assertScope,\n calcSummary,\n camelToKebab,\n camelToUnderscore,\n capitalize,\n clamp,\n cloneConfig,\n cloneJson,\n compareValues,\n computeSummary,\n convertHtmlToText,\n createClassNamer,\n createErrorFactory,\n createHTMLElement,\n createMatcher,\n createUuid,\n debounce,\n deepCopy,\n downloadText,\n downloadUrl,\n escapeCellValue,\n escapeHTML,\n fieldDisplayName,\n fieldsOf,\n formatDate,\n formatNumber,\n formatValue,\n getBrowserSize,\n getHashCode,\n getIn,\n getPagingInfo,\n getPagingParamToPagingInfo,\n getScrollPosition,\n getURLParam,\n getURLParams,\n hasClass,\n hasProperty,\n highlightSingleMatch,\n innerLayerPosition,\n insertToArray,\n intValue,\n isArray,\n isBlank,\n isBoolean,\n isDate,\n isElement,\n isEmpty,\n isEsc,\n isFormData,\n isFunction,\n isHTMLElement,\n isMouseMoved,\n isNil,\n isNumber,\n isNumeric,\n isObject,\n isPlainObject,\n isPrimaryPointer,\n isSafeUrl,\n isSameValue,\n isSequential,\n isString,\n isThenable,\n isUndefined,\n isVisible,\n jsonEqual,\n leftPad,\n leftPadClamp,\n leftTrim,\n lowerCase,\n matchCount,\n matchRow,\n measureScrollTarget,\n moveItem,\n normalizeCssLength,\n objectDeepMerge,\n objectToQueryString,\n outerLayerPosition,\n parseClipboard,\n parseConfigJson,\n parseConfigString,\n parseJson,\n parseTsv,\n readTextFile,\n removeItem,\n renderTemplate,\n replaceParameter,\n resolveClassName,\n resolveScrollElement,\n resolveScrollTarget,\n restoreFunctions,\n rightPad,\n rightPadClamp,\n rightTrim,\n sameValue,\n sanitizeHtml,\n serializeSvg,\n setIn,\n sortRows,\n stringSplit,\n stringifyWithFunctions,\n svgToDataURL,\n templateToElement,\n toDataAttribute,\n toListValue,\n toNumber,\n toObjectForm,\n toOptionObject,\n toTimestamp,\n toTsv,\n trim,\n unXss,\n upperCase,\n uuid,\n writeClipboard,\n xss\n};\n//# sourceMappingURL=utils.js.map\n","import type { FormField } from \"@t/FormField\";\r\nimport { isBlank, isNumeric, isPlainObject, isUndefined, objectDeepMerge, xss as replaceXss, unXss as unReplace } from \"@daracl/core/utils\";\r\nexport { isArray, isBlank, isFunction, isString, isUndefined, isPlainObject, isNil as isEmpty, hasProperty as hasOwnProp, getHashCode, templateToElement } from \"@daracl/core/utils\";\r\nexport { replaceXss, unReplace };\r\n\r\nexport const unFieldName = (fieldName: string): string => {\r\n if (fieldName) {\r\n return unReplace(fieldName).replaceAll('\"', '\\\\\"');\r\n }\r\n return \"\";\r\n};\r\n// Preserve form numeric coercion (including numeric strings) for existing callers.\r\nexport const isNumber = (value: any): value is number => {\r\n return !isBlank(value) && isNumeric(+value, true);\r\n};\r\n\r\n/**\r\n * tab render type check\r\n *\r\n * @param {FormField} field\r\n * @returns {boolean} tab type 인지 여부\r\n */\r\nexport const isTabType = (field: FormField): boolean => {\r\n return field?.renderType === \"tab\";\r\n};\r\n/**\r\n * grid render type check\r\n *\r\n * @param {FormField} field\r\n * @returns {boolean} grid type 인지 여부\r\n */\r\nexport const isGridType = (field: FormField): boolean => {\r\n return field?.renderType === \"grid\";\r\n};\r\nexport const replaceXssField = (field: FormField): FormField => {\r\n field.$xssName = getXssFieldName(field);\r\n\r\n field.label = replaceXss(field.label);\r\n return field;\r\n};\r\n\r\n/**\r\n * 값을 무시하는 필드\r\n *\r\n * @param field formField\r\n * @returns\r\n */\r\nexport const ignoreValueField = (field: FormField): boolean => {\r\n return isGridType(field.$parent) || isTabType(field.$parent);\r\n};\r\n\r\n/**\r\n * grid field name xss repalce\r\n *\r\n * @param {FormField} field\r\n * @returns {string} replace 된 field name\r\n */\r\nexport const getXssFieldName = (field: FormField): string => {\r\n if (isUndefined(field.$xssName)) {\r\n let returnText = field.name;\r\n if (returnText) {\r\n returnText = returnText.replace(/[&<>\"']/g, \"_\");\r\n }\r\n\r\n return \"df_\" + returnText;\r\n }\r\n\r\n return field.$xssName;\r\n};\r\n\r\nexport const isHiddenField = (field: FormField | null | undefined): boolean => field?.renderType === \"hidden\";\r\n\r\n/** Merge form options using the shared core implementation.\r\n * Keep the legacy non-object first argument behavior.\r\n */\r\nexport const merge = (...values: any[]): any => {\r\n if (!isPlainObject(values[0])) return values[0];\r\n // An extra source prevents a form's _excludeKeys field becoming core options.\r\n return objectDeepMerge(...values, {});\r\n};\r\n","import { FormField } from \"@t/FormField\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\n\nexport abstract class Render {\n protected daraForm;\n protected rowElement;\n protected field;\n\n private enableView: boolean = true;\n\n constructor(form: DaraForm, field: FormField, rowElement: HTMLElement) {\n this.daraForm = form;\n this.field = field;\n this.rowElement = rowElement;\n this.createField();\n\n if (field.tooltip) rowElement.querySelector(\".df-tooltip\")?.setAttribute(\"tooltip\", field.tooltip);\n }\n\n public setDefaultInfo() {\n if (utils.isUndefined(this.field.defaultValue)) {\n this.setValue(\"\", false);\n } else {\n this.setValue(this.field.defaultValue, false);\n }\n\n if (!utils.isUndefined(this.field.placeholder)) {\n const ele = this.getElement();\n if (ele instanceof Element) {\n ele.setAttribute(\"placeholder\", this.field.placeholder);\n }\n }\n }\n\n public setDefaultOption() {\n this.setDisabled(this.field.disabled ?? false);\n }\n\n public addChildField(element: Element) {\n this.rowElement.querySelector(\".df-field-container\")?.append(element);\n }\n\n static isDataRender(): boolean {\n return true;\n }\n\n static isChildrenCreate(): boolean {\n return true;\n }\n\n public getForm(): DaraForm {\n return this.daraForm;\n }\n\n public abstract mounted(): void;\n public abstract getValue(): any;\n public abstract setValue(value: any, changeCheckFlag?: boolean): void;\n public abstract reset(): void;\n public abstract getElement(): any;\n public abstract valid(): ValidResult | boolean;\n public abstract createField(): void;\n\n public setValueItems(value: any): void {}\n\n public static getDescriptionTemplate(field: FormField): string {\n const classNames = field.descriptionClass ? utils.replaceXss(field.descriptionClass) : \"\";\n const style = field.descriptionStyle ? 'style=\"' + utils.replaceXss(field.descriptionStyle) + '\"' : \"\";\n\n return field.description ? `<div class=\"df-description ${classNames}\" ${style}>${field.description}</div>` : \"\";\n }\n\n public changeEventCall(field: FormField, e: Event | null, rederInfo: Render, fieldValue: any): boolean | undefined {\n if (field.onChange) {\n let changeInfo: any = {\n field: field,\n evt: e,\n oldValue: field.$value,\n value: fieldValue,\n };\n\n if (field.listItem?.list) {\n let valuesItem = [];\n const valueKey = Render.valuesValueKey(field);\n\n for (let val of field.listItem.list) {\n let changeVal = val[valueKey];\n if (utils.isString(fieldValue)) {\n if (changeVal == fieldValue) {\n valuesItem.push(val);\n break;\n }\n } else if (utils.isArray(fieldValue)) {\n if (fieldValue.includes(changeVal)) {\n valuesItem.push(val);\n }\n }\n }\n\n changeInfo.valueItems = valuesItem;\n }\n\n if (changeInfo.oldValue != changeInfo.value && field.onChange.call(null, changeInfo) === false) {\n rederInfo.setValue(field.$value, false);\n return false;\n }\n\n field.$value = changeInfo.value;\n }\n\n this.daraForm.conditionCheck();\n }\n\n public focus() {\n this.getElement().focus();\n }\n\n public isEnableView() {\n return this.enableView;\n }\n\n public show() {\n this.enableView = true;\n this.rowElement.classList.remove(\"df-hidden\");\n }\n\n public hide() {\n this.enableView = false;\n if (!this.rowElement.classList.contains(\"df-hidden\")) {\n this.rowElement.classList.add(\"df-hidden\");\n }\n }\n\n /**\n * 설명 추가\n *\n * @public\n * @param {string} desc\n */\n public setDescription(desc: string) {\n const descEle = this.rowElement.querySelector(\".df-description\");\n if (descEle) {\n descEle.textContent = desc;\n } else {\n const fieldEle = this.rowElement.querySelector(\".df-field\");\n if (fieldEle) {\n const parser = new DOMParser();\n this.field.description = desc;\n const descEle = parser.parseFromString(Render.getDescriptionTemplate(this.field), \"text/html\").querySelector(\".df-description\");\n\n if (descEle) fieldEle.parentNode?.insertBefore(descEle, fieldEle.nextSibling);\n }\n }\n }\n\n public setActive(id: string): void {\n //console.log(\"parent\");\n }\n\n public setDisabled(flag: boolean) {\n const ele = this.getElement();\n if (ele instanceof HTMLElement) {\n if (flag === false) {\n this.getElement().removeAttribute(\"disabled\");\n } else {\n this.getElement().setAttribute(\"disabled\", true);\n }\n }\n }\n\n public commonValidator() {\n //this.field.diff\n }\n\n public static valuesValueKey(field: FormField): string {\n return field.listItem?.valueField ? field.listItem.valueField : \"value\";\n }\n\n public static valuesLabelKey(field: FormField): string {\n return field.listItem?.labelField ? field.listItem.labelField : \"label\";\n }\n\n public static valuesLabelValue(label: string, val: any) {\n let replaceFlag = false;\n const resultValue = label.replace(/\\{\\{([A-Za-z0-9_.]*)\\}\\}/g, (match, key) => {\n replaceFlag = true;\n return val[key] || \"\";\n });\n\n if (replaceFlag) {\n return resultValue;\n }\n\n return val[label] || \"\";\n }\n}\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\n\r\nconst regexp = {\r\n mobile: /^\\d{3}-\\d{3,4}-\\d{4}$/,\r\n email: /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/,\r\n url: /^(?:(?:https?|HTTPS?|ftp|FTP):\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-zA-Z\\u00a1-\\uffff0-9]-*)*[a-zA-Z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-zA-Z\\u00a1-\\uffff0-9]-*)*[a-zA-Z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-zA-Z\\u00a1-\\uffff]{2,}))\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/,\r\n number: /\\d$/,\r\n alpha: /^[a-zA-Z]+$/,\r\n \"alpha-num\": /^[a-zA-Z0-9]+$/,\r\n variable: /^[a-zA-Z0-9_$][a-zA-Z0-9_$]*$/,\r\n \"number-char\": /^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]/,\r\n \"upper-char\": /^(?=.*?[A-Z])(?=.*?[a-z])/,\r\n \"upper-char-special\": /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[#?!@$%^&*-])/,\r\n \"upper-char-special-number\": /^(?=.*[A-Za-z])(?=.*\\d)(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]/,\r\n};\r\n\r\n/**\r\n * 정규식 유효성 체크.\r\n *\r\n * @param {string} value\r\n * @param {FormField} field\r\n * @param {(ValidResult | undefined)} result\r\n * @returns {ValidResult}\r\n */\r\nexport const regexpValidator = (value: string, field: FormField, result: ValidResult): ValidResult => {\r\n if (!field.$instance.isEnableView()) {\r\n return { name: field.name, constraint: [] };\r\n }\r\n\r\n if (typeof result === \"undefined\") {\r\n result = { name: field.name, constraint: [] };\r\n }\r\n\r\n const regexpType = field.regexpType;\r\n\r\n if (regexpType) {\r\n if (!regexp[regexpType].test(value)) {\r\n result.regexp = regexpType;\r\n return result;\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { regexpValidator } from \"./regexpValidator\";\r\nimport * as utils from \"@/util/utils\";\r\n\r\n/**\r\n * validator , regexp 체크 .\r\n *\r\n * @param {string} value field value\r\n * @param {FormField} field field 정보\r\n * @param {ValidResult} result\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const validator = (value: string, field: FormField, result: ValidResult): ValidResult | boolean => {\r\n if (field.validator) {\r\n result.validator = field.validator(field, value);\r\n if (typeof result.validator === \"object\") {\r\n return result;\r\n }\r\n }\r\n\r\n result = regexpValidator(value, field, result);\r\n\r\n if (result.regexp) {\r\n return result;\r\n }\r\n\r\n if (field.different) {\r\n const diffFieldName = field.different.field;\r\n const diffField = field.$instance.getForm().getField(diffFieldName);\r\n\r\n if (!utils.isEmpty(diffField) && field.$instance.getValue() == diffField.$instance.getValue()) {\r\n result.message = field.different.message;\r\n return result;\r\n }\r\n }\r\n\r\n if (field.identical) {\r\n const diffFieldName = field.identical.field;\r\n const diffField = field.$instance.getForm().getField(diffFieldName);\r\n\r\n if (!utils.isEmpty(diffField) && field.$instance.getValue() != diffField.$instance.getValue()) {\r\n result.message = field.identical.message;\r\n return result;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\nimport { validator } from \"./validator\";\r\nimport * as utils from \"@/util/utils\";\r\n\r\n/**\r\n * 숫자 유효성 체크\r\n *\r\n * @param {string} value\r\n * @param {FormField} field\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const numberValidator = (value: string, field: FormField): ValidResult | boolean => {\r\n if (!field.$instance.isEnableView()) {\r\n return true;\r\n }\r\n\r\n const result: ValidResult = { name: field.name, constraint: [] };\r\n const numValue = Number(value);\r\n\r\n if (field.required && utils.isBlank(value)) {\r\n result.constraint.push(RULES.REQUIRED);\r\n return result;\r\n }\r\n\r\n if (!utils.isNumber(value)) {\r\n result.constraint.push(RULES.NAN);\r\n return result;\r\n }\r\n\r\n if (validator(value, field, result) !== true) {\r\n return result;\r\n }\r\n\r\n const rule = field.rule;\r\n if (rule) {\r\n const isMinimum = utils.isNumber(rule.minimum),\r\n isMaximum = utils.isNumber(rule.maximum);\r\n\r\n let minRule = false,\r\n minExclusive = false,\r\n maxRule = false,\r\n maxExclusive = false;\r\n\r\n if (isMinimum) {\r\n if (rule.exclusiveMinimum && numValue <= rule.minimum) {\r\n minExclusive = true;\r\n } else if (numValue < rule.minimum) {\r\n minRule = true;\r\n }\r\n }\r\n\r\n if (isMaximum) {\r\n if (rule.exclusiveMaximum && numValue >= rule.maximum) {\r\n maxExclusive = true;\r\n } else if (numValue > rule.maximum) {\r\n maxRule = true;\r\n }\r\n }\r\n\r\n if (isMinimum && isMaximum && (minRule || minExclusive || maxRule || maxExclusive)) {\r\n if (rule.exclusiveMinimum && rule.exclusiveMaximum && (minExclusive || maxExclusive)) {\r\n result.constraint.push(RULES.BETWEEN_EXCLUSIVE_MINMAX);\r\n } else if (minExclusive) {\r\n result.constraint.push(RULES.BETWEEN_EXCLUSIVE_MIN);\r\n } else if (maxExclusive) {\r\n result.constraint.push(RULES.BETWEEN_EXCLUSIVE_MAX);\r\n } else {\r\n result.constraint.push(RULES.BETWEEN);\r\n }\r\n } else {\r\n if (minExclusive) {\r\n result.constraint.push(RULES.EXCLUSIVE_MIN);\r\n }\r\n\r\n if (maxExclusive) {\r\n result.constraint.push(RULES.EXCLUSIVE_MAX);\r\n }\r\n\r\n if (minRule) {\r\n result.constraint.push(RULES.MIN);\r\n }\r\n\r\n if (maxRule) {\r\n result.constraint.push(RULES.MAX);\r\n }\r\n }\r\n }\r\n\r\n if (result.constraint.length > 0) {\r\n return result;\r\n }\r\n\r\n return true;\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport Language from \"./Language\";\r\n\r\nexport const invalidMessage = (field: FormField, rowElement: Element, validResult: ValidResult | boolean) => {\r\n if (validResult === true) {\r\n rowElement.classList.remove(\"invalid\");\r\n\r\n if (!rowElement.classList.contains(\"valid\")) {\r\n rowElement.classList.add(\"valid\");\r\n }\r\n\r\n const helpMessageElement = rowElement.querySelector(\".df-help-message\");\r\n if (helpMessageElement) {\r\n helpMessageElement.innerHTML = \"\";\r\n }\r\n\r\n return;\r\n }\r\n\r\n rowElement.classList.remove(\"valid\");\r\n\r\n if (!rowElement.classList.contains(\"invalid\")) {\r\n rowElement.classList.add(\"invalid\");\r\n }\r\n\r\n if (validResult !== false) {\r\n const message: string[] = Language.validMessage(field, validResult);\r\n\r\n if (validResult.message) {\r\n message.push(validResult.message);\r\n }\r\n\r\n const helpMessageElement = rowElement.querySelector(\".df-help-message\");\r\n if (helpMessageElement && message.length > 0) {\r\n const msgHtml: string[] = [];\r\n message.forEach((item) => {\r\n msgHtml.push(`<div>${item}</div>`);\r\n });\r\n helpMessageElement.innerHTML = msgHtml.join(\"\");\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * remove row element style class\r\n *\r\n * @param {Element} rowElement\r\n */\r\nexport const resetRowElementStyleClass = (rowElement: Element) => {\r\n rowElement.classList.remove(\"invalid\");\r\n rowElement.classList.remove(\"valid\");\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { Render } from \"@/renderer/Render\";\r\nimport * as utils from \"@/util/utils\";\r\n\r\nexport const inputEvent = (field: FormField, element: Element, renderInfo: Render) => {\r\n element.addEventListener(\"input\", (e: Event) => {\r\n customChangeEventCall(field, e, renderInfo, renderInfo.getValue());\r\n renderInfo.valid();\r\n });\r\n};\r\n\r\nexport const numberInputEvent = (field: FormField, element: HTMLInputElement, renderInfo: Render) => {\r\n element.addEventListener(\"keyup\", (e: any) => {\r\n const val = e.target.value;\r\n\r\n if (!utils.isNumber(val)) {\r\n element.value = val.replace(/[^0-9\\.\\-\\+]/g, \"\");\r\n e.preventDefault();\r\n }\r\n customChangeEventCall(field, e, renderInfo, renderInfo.getValue());\r\n renderInfo.valid();\r\n });\r\n\r\n /*\r\n element.addEventListener('input', (e: any) => {\r\n customChangeEventCall(field, e, renderInfo);\r\n renderInfo.valid();\r\n })\r\n */\r\n};\r\n\r\nexport const dropdownChangeEvent = (field: FormField, element: Element, renderInfo: Render) => {\r\n element.addEventListener(\"change\", (e: any) => {\r\n customChangeEventCall(field, e, renderInfo, renderInfo.getValue());\r\n renderInfo.valid();\r\n });\r\n};\r\n\r\nexport const customChangeEventCall = (field: FormField, e: Event, renderInfo: Render, value: any) => {\r\n renderInfo.changeEventCall(field, e, renderInfo, value);\r\n};\r\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { numberValidator } from \"@/rule/numberValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { numberInputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class NumberRender extends Render {\n private element: HTMLInputElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n numberInputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"text\" name=\"${field.$xssName}\" class=\"df-form-field df-number df-help-icon\" />\n </div> \n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = numberValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\nimport * as utils from \"@/util/utils\";\r\nimport { validator } from \"./validator\";\r\n\r\n/**\r\n * string validator\r\n *\r\n * @param {string} value\r\n * @param {FormField} field\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const stringValidator = (value: string, field: FormField): ValidResult | boolean => {\r\n if (!field.$instance.isEnableView()) {\r\n return true;\r\n }\r\n\r\n let result: ValidResult = { name: field.name, constraint: [] };\r\n\r\n if (field.required && utils.isBlank(value)) {\r\n result.constraint.push(RULES.REQUIRED);\r\n return result;\r\n }\r\n const validResult = validator(value, field, result);\r\n if (validResult !== true) {\r\n return validResult;\r\n }\r\n\r\n const rule = field.rule;\r\n\r\n if (rule) {\r\n const valueLength = value.length;\r\n\r\n const isMinNumber = utils.isNumber(rule.minLength),\r\n isMaxNumber = utils.isNumber(rule.maxLength);\r\n\r\n let minRule = false,\r\n maxRule = false;\r\n if (isMinNumber && valueLength < rule.minLength) {\r\n minRule = true;\r\n }\r\n if (isMaxNumber && valueLength > rule.maxLength) {\r\n maxRule = true;\r\n }\r\n\r\n if (isMinNumber && isMaxNumber && (minRule || maxRule)) {\r\n result.constraint.push(RULES.BETWEEN);\r\n } else {\r\n if (minRule) {\r\n result.constraint.push(RULES.MIN_LENGTH);\r\n }\r\n\r\n if (maxRule) {\r\n result.constraint.push(RULES.MAX_LENGTH);\r\n }\r\n }\r\n if (result.constraint.length > 0) {\r\n return result;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { inputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class TextAreaRender extends Render {\n private element: HTMLTextAreaElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n inputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n let rows = field.rendererOptions?.rows;\n rows = +rows > 0 ? rows : 3;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <textarea name=\"${field.$xssName}\" rows=\"${rows}\" class=\"df-form-field df-textarea df-help-icon\"></textarea>\n </div> \n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLTextAreaElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField, ValuesInfo } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { RULES } from \"@/constants\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { dropdownChangeEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\nimport Language from \"@/util/Language\";\n\nexport default class DropdownRender extends Render {\n private element: HTMLSelectElement;\n private defaultSelected;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n let initDefaultValue = \"\";\n\n if (!utils.isUndefined(field.defaultValue)) {\n initDefaultValue = field.defaultValue;\n }\n\n const valueKey = DropdownRender.valuesValueKey(field);\n let initDefaultValueFlag = false;\n this.field.listItem?.list?.forEach((item) => {\n let itemValue = item[valueKey];\n if (item.selected) {\n this.defaultSelected = itemValue;\n }\n if (itemValue == initDefaultValue) {\n initDefaultValueFlag = true;\n }\n });\n\n if (initDefaultValueFlag) {\n this.defaultSelected = initDefaultValue;\n } else if (!this.defaultSelected) {\n if (field.rendererOptions?.disableDefaultOption === true) {\n this.defaultSelected = this.field.listItem?.list?.length > 0 ? this.field.listItem.list[0][valueKey] || \"\" : \"\";\n }\n }\n\n if (utils.isUndefined(this.defaultSelected)) {\n this.defaultSelected = \"\";\n }\n\n this.mounted();\n this.setDefaultOption();\n this.setValue(this.defaultSelected, false);\n }\n\n mounted() {\n dropdownChangeEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n let template = ` <div class=\"df-field\"><select name=\"${field.$xssName}\" class=\"df-form-field df-dropdown\">\n ${this.dropdownValuesTemplate(field)}\n </select> <i class=\"df-help-icon\"></i></div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n fieldContainerElement.innerHTML = template;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLSelectElement;\n }\n\n public setValueItems(items: any): void {\n if (this.field.listItem) {\n this.field.listItem.list = items;\n } else {\n this.field.listItem = {\n list: items,\n } as ValuesInfo;\n }\n this.element.innerHTML = this.dropdownValuesTemplate(this.field);\n\n if (!utils.isBlank(this.field.$value)) {\n const currentValue = this.field.$value;\n this.field.$value = \"\";\n this.setValue(currentValue);\n }\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setValue(this.defaultSelected, false);\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const value = this.getValue();\n\n let validResult: ValidResult | boolean = true;\n\n if (this.field.required) {\n if (value.length < 1) {\n validResult = { name: this.field.name, constraint: [] };\n validResult.constraint.push(RULES.REQUIRED);\n }\n }\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n\n public dropdownValuesTemplate(field: FormField) {\n const labelKey = Render.valuesLabelKey(field);\n const valueKey = Render.valuesValueKey(field);\n let template = \"\";\n\n if (field.rendererOptions?.disableDefaultOption !== true) {\n template += `<option value=\"\">${Language.getMessage(\"selection\")}</option>`;\n }\n field.listItem?.list?.forEach((val) => {\n const attr = `${val.selected ? \"selected\" : \"\"} ${val.disabled ? \"disabled\" : \"\"}`;\n if (utils.isUndefined(val[valueKey]) && val.label) {\n template += `<option value=\"${val.value || \"\"}\" ${attr}>${val.label}</option>`;\n } else {\n template += `<option value=\"${val[valueKey]}\" ${attr}>${Render.valuesLabelValue(labelKey, val)}</option>`;\n }\n });\n\n return template;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { inputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class TextRender extends Render {\n private element: HTMLInputElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n inputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"text\" name=\"${field.$xssName}\" class=\"df-form-field df-text df-help-icon\" />\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLInputElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FIELD_POSITION_STYLE } from \"@/constants\";\nimport { FieldStyle, FormField } from \"@t/FormField\";\nimport { FormOptions } from \"@t/FormOptions\";\nimport { isNumber } from \"./utils\";\nimport { resolveClassName } from \"@daracl/core/utils\";\n\n/**\n * field style 처리\n *\n * @param formOptions FormOptions\n * @param field FormField\n * @param beforeField FormField\n * @returns FieldStyle\n */\n\nexport function resolveFieldStyle(formOptions: FormOptions, field: FormField, beforeField?: FormField | null, isLabelHide?: boolean): FieldStyle {\n const fieldStyle = {\n rowStyleClass: orientationClassName(field.orientation),\n fieldClass: \"\",\n fieldStyle: \"\",\n labelClass: \"\",\n labelStyle: \"\",\n labelAlignClass: \"\",\n valueClass: \"\",\n valueStyle: \"\",\n tabAlignClass: \"\",\n };\n\n const defaultLabelWidth = beforeField?.style?.labelWidth ?? formOptions.style.labelWidth ?? \"3\";\n let defaultValueWidth = beforeField?.style?.valueWidth ?? formOptions.style.valueWidth ?? \"9\";\n const position = beforeField?.style?.position ?? formOptions.style.position;\n\n const width = field.style?.width;\n const positionArr = FIELD_POSITION_STYLE[field.style?.position] ?? FIELD_POSITION_STYLE[position] ?? FIELD_POSITION_STYLE.top;\n\n fieldStyle.fieldClass = `${positionArr[0] ? \"df-\" + positionArr[0] : \"\"} ${field.style?.customClass || \"\"}`;\n if (width) {\n if (isNumber(width)) {\n fieldStyle.fieldClass += isNumber(width) ? ` df-col-xs-${width}` : \"\";\n } else {\n fieldStyle.fieldStyle = isNumber(width) ? \"\" : `width:${width};`;\n }\n }\n\n fieldStyle.tabAlignClass = \"df-tab-al-\" + ([\"right\", \"center\"].includes(field.style?.tabAlign) ? field.style.tabAlign : \"left\");\n\n const labelWidth = field.style?.labelWidth || defaultLabelWidth;\n fieldStyle.labelAlignClass = positionArr[1];\n\n if (!isLabelHide && labelWidth && ![\"top\", \"bottom\"].includes(positionArr[0])) {\n if (isNumber(labelWidth)) {\n const labelWidthValue = +labelWidth;\n defaultValueWidth = 12 - labelWidthValue;\n fieldStyle.labelClass = `df-col-xs-${labelWidthValue}`;\n fieldStyle.valueClass = fieldStyle.labelStyle ? \"df-col-full\" : `df-col-xs-${defaultValueWidth}`;\n } else {\n fieldStyle.labelStyle = `width:${labelWidth};`;\n }\n }\n\n const valueWidth = field.style?.valueWidth || defaultValueWidth;\n if (isLabelHide && ![\"left\", \"right\"].includes(positionArr[0])) {\n fieldStyle.valueClass = \"df-col-full\";\n } else {\n if (valueWidth && ![\"top\", \"bottom\"].includes(positionArr[0])) {\n if (isNumber(valueWidth)) {\n fieldStyle.valueClass = fieldStyle.labelStyle ? \"df-col-full\" : `df-col-xs-${valueWidth}`;\n } else {\n fieldStyle.valueStyle = `width:${valueWidth};`;\n }\n } else {\n fieldStyle.valueClass = fieldStyle.labelStyle ? \"df-col-full\" : \"\";\n }\n }\n\n fieldStyle.fieldClass = resolveClassName(fieldStyle.fieldClass).join(\" \");\n fieldStyle.labelClass = resolveClassName(fieldStyle.labelClass).join(\" \");\n fieldStyle.valueClass = resolveClassName(fieldStyle.valueClass).join(\" \");\n\n return fieldStyle;\n}\n\nexport function orientationClassName(orientation: string): string {\n return orientation === \"horizontal\" ? \"df-horizontal\" : \"df-vertical\";\n}\n","import { FormField, ValuesInfo } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport * as utils from \"@/util/utils\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { OrientationMap, RULES } from \"@/constants\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { customChangeEventCall } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport { orientationClassName } from \"@/util/styleUtils\";\n\nexport default class CheckboxRender extends Render {\n private defaultCheckValue: any[] = [];\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.defaultCheckValue = [];\n let initDefaultValue = [] as any;\n if (!utils.isUndefined(field.defaultValue)) {\n if (utils.isArray(field.defaultValue)) {\n initDefaultValue = field.defaultValue;\n } else {\n initDefaultValue = [field.defaultValue];\n }\n }\n\n const valueKey = CheckboxRender.valuesValueKey(field);\n\n if (utils.isUndefined(this.field.listItem)) {\n this.setValueItems([{ label: \"\", value: \"Y\" }]);\n }\n\n let initDefaultValueFlag = false;\n this.field.listItem?.list?.forEach((item) => {\n let itemValue = item[valueKey];\n if (item.selected) {\n this.defaultCheckValue.push(itemValue ? itemValue : true);\n }\n if (initDefaultValue.includes(itemValue)) {\n initDefaultValueFlag = true;\n }\n });\n\n this.defaultCheckValue = initDefaultValueFlag ? initDefaultValue : this.defaultCheckValue;\n\n this.mounted();\n this.setDefaultOption();\n this.setValue(this.defaultCheckValue, false);\n }\n\n public mounted() {\n this.initEvent();\n }\n\n public initEvent() {\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n checkboxes.forEach((ele) => {\n ele.addEventListener(\"change\", (e: Event) => {\n customChangeEventCall(this.field, e, this, this.getValue());\n this.valid();\n });\n });\n }\n\n public getSelector() {\n return `input[type=\"checkbox\"][name=\"${this.field.$xssName}\"]`;\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n const templates: string[] = [];\n const fieldName = field.$xssName;\n\n const labelKey = Render.valuesLabelKey(field);\n const valueKey = Render.valuesValueKey(field);\n\n templates.push(` <div class=\"df-field\"><div class=\"df-field-group\">`);\n field.listItem?.list?.forEach((val) => {\n const checkVal = String(val[valueKey] ?? \"\");\n templates.push(`\n <span class=\"df-field-item ${orientationClassName(field.listItem.orientation ?? OrientationMap.horizontal)}\">\n <label>\n <input type=\"checkbox\" name=\"${fieldName}\" value=\"${checkVal ? utils.replaceXss(checkVal) : \"\"}\" class=\"df-form-field df-checkbox\" ${val.selected ? \"checked\" : \"\"} ${val.disabled ? \"disabled\" : \"\"} />\n ${Render.valuesLabelValue(labelKey, val)}\n </label>\n </span>\n `);\n });\n templates.push(`<i class=\"df-form-icon df-help-icon\"></i></div></div> ${Render.getDescriptionTemplate(field)}<div class=\"df-help-message\"></div>`);\n\n fieldContainerElement.innerHTML = templates.join(\"\");\n }\n\n public setValueItems(items: any): void {\n const containerEle = this.rowElement.querySelector(\".df-field-container\");\n if (containerEle) {\n if (this.field.listItem) {\n this.field.listItem.list = items;\n } else {\n this.field.listItem = {\n list: items,\n } as ValuesInfo;\n }\n\n this.createField();\n\n if (!utils.isBlank(this.field.$value)) {\n const currentValue = this.field.$value;\n this.field.$value = \"\";\n this.setValue(currentValue);\n }\n }\n }\n\n getValue() {\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n if (checkboxes.length > 1) {\n const checkValue: any[] = [];\n checkboxes.forEach((ele) => {\n const checkEle = ele as HTMLInputElement;\n if (checkEle.checked) {\n checkValue.push(checkEle.value);\n }\n });\n return checkValue;\n } else {\n const checkElement = this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement;\n\n if (checkElement?.checked) {\n return checkElement.value ? checkElement.value : true;\n }\n\n return checkElement.value ? \"\" : false;\n }\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n value = this.field.$value;\n }\n\n this.field.$value = value;\n if (value === true) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = true;\n return;\n }\n\n if (value === false) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = false;\n return;\n }\n\n let valueArr: any[] = [];\n if (utils.isArray(value)) {\n valueArr = value;\n } else {\n valueArr.push(value);\n }\n\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n checkboxes.forEach((ele) => {\n (ele as HTMLInputElement).checked = false;\n });\n\n valueArr.forEach((val) => {\n const ele = this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"][value=\"${val}\"]`) as HTMLInputElement;\n if (ele) ele.checked = true;\n });\n }\n\n reset() {\n if (this.field.listItem?.list?.length == 1 && this.defaultCheckValue.length == 1) {\n this.setValue(true, false);\n } else {\n this.setValue(this.defaultCheckValue, false);\n }\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): any {\n return this.rowElement.querySelectorAll(`[name=\"${this.field.$xssName}\"]`);\n }\n\n public focus() {\n const elements = this.getElement();\n\n if (elements && elements.length > 0) {\n this.getElement()[0].focus();\n }\n }\n\n valid(): any {\n const value = this.getValue();\n\n let validResult: ValidResult | boolean = true;\n\n if (this.field.required && utils.isArray(value)) {\n if ((value as any[]).length < 1) {\n validResult = { name: this.field.name, constraint: [] };\n validResult.constraint.push(RULES.REQUIRED);\n }\n }\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField, ValuesInfo } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { OrientationMap, RULES } from \"@/constants\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { customChangeEventCall } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\nimport { orientationClassName } from \"@/util/styleUtils\";\n\nexport default class RadioRender extends Render {\n private defaultCheckValue;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.defaultCheckValue = \"\";\n let initDefaultValue = [] as any;\n if (!utils.isUndefined(field.defaultValue)) {\n initDefaultValue = field.defaultValue;\n }\n\n const valueKey = RadioRender.valuesValueKey(field);\n let initDefaultValueFlag = false;\n this.field.listItem?.list?.forEach((item) => {\n let itemValue = item[valueKey];\n if (item.selected) {\n this.defaultCheckValue = itemValue;\n }\n\n if (initDefaultValue == itemValue) {\n initDefaultValueFlag = true;\n }\n });\n\n // 처리 할것.\n\n if (initDefaultValueFlag) {\n this.defaultCheckValue = initDefaultValue;\n } else if (!this.defaultCheckValue) {\n this.defaultCheckValue = this.field.listItem?.list?.length > 0 ? this.field.listItem?.list[0][valueKey] : \"\";\n }\n\n this.mounted();\n this.setDefaultOption();\n this.setValue(this.defaultCheckValue, false);\n }\n\n public mounted() {\n this.initEvent();\n }\n\n public initEvent() {\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n checkboxes.forEach((ele) => {\n ele.addEventListener(\"change\", (e: Event) => {\n customChangeEventCall(this.field, e, this, this.getValue());\n\n this.valid();\n });\n });\n }\n\n public getSelector() {\n return `input[type=\"radio\"][name=\"${this.field.$xssName}\"]`;\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n const templates: string[] = [];\n const fieldName = field.$xssName;\n\n const labelKey = Render.valuesLabelKey(field);\n const valueKey = Render.valuesValueKey(field);\n\n templates.push(`<div class=\"df-field\"><div class=\"df-field-group\">`);\n\n field.listItem?.list?.forEach((val) => {\n const radioVal = val[valueKey];\n\n templates.push(\n `<span class=\"df-field-item ${orientationClassName(field.orientation ?? OrientationMap.horizontal)}\">\n <label>\n <input type=\"radio\" name=\"${fieldName}\" value=\"${radioVal}\" class=\"df-form-field df-radio\" ${val.selected ? \"checked\" : \"\"} ${val.disabled ? \"disabled\" : \"\"}/>\n ${Render.valuesLabelValue(labelKey, val)}\n </label>\n </span>\n `\n );\n });\n templates.push(`<i class=\"df-form-icon df-help-icon\"></i></div></div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `);\n\n fieldContainerElement.innerHTML = templates.join(\"\");\n\n this.initEvent();\n }\n\n public setValueItems(items: any): void {\n const containerEle = this.rowElement.querySelector(\".df-field-container\");\n if (containerEle) {\n if (this.field.listItem) {\n this.field.listItem.list = items;\n } else {\n this.field.listItem = {\n list: items,\n } as ValuesInfo;\n }\n\n this.createField();\n\n if (!utils.isBlank(this.field.$value)) {\n const currentValue = this.field.$value;\n this.field.$value = \"\";\n this.setValue(currentValue);\n }\n }\n }\n\n getValue() {\n return (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]:checked`) as HTMLInputElement)?.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n value = this.field.$value;\n }\n\n this.field.$value = value;\n if (value === true) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = true;\n return;\n }\n\n if (value === false) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = false;\n return;\n }\n\n const elements = this.rowElement.querySelectorAll(this.getSelector());\n\n elements.forEach((ele) => {\n let radioEle = ele as HTMLInputElement;\n if (radioEle.value == value) {\n radioEle.checked = true;\n } else {\n radioEle.checked = false;\n }\n });\n }\n\n reset() {\n this.setValue(this.defaultCheckValue, false);\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): any {\n return this.rowElement.querySelectorAll(this.getSelector());\n }\n\n public focus() {\n const elements = this.getElement();\n\n if (elements && elements.length > 0) {\n this.getElement()[0].focus();\n }\n }\n\n valid(): any {\n const value = this.getValue();\n\n let validResult: ValidResult | boolean = true;\n\n if (this.field.required) {\n if (utils.isBlank(value)) {\n validResult = { name: this.field.name, constraint: [] };\n validResult.constraint.push(RULES.REQUIRED);\n }\n }\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { inputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class PasswordRender extends Render {\n private element: HTMLInputElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n inputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"password\" name=\"${field.$xssName}\" class=\"df-form-field df-password df-help-icon\" autocomplete=\"off\" />\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FileInfo, FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\n\r\n/**\r\n * file validator\r\n *\r\n * @param {HTMLInputElement} element\r\n * @param {FormField} field\r\n * @param {FileInfo[]} fileList\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const fileValidator = (element: HTMLInputElement, field: FormField, fileList: FileInfo[]): ValidResult | boolean => {\r\n const result: ValidResult = { name: field.name, constraint: [] };\r\n\r\n if (field.required && fileList.length < 1) {\r\n result.constraint.push(RULES.REQUIRED);\r\n return result;\r\n }\r\n\r\n if (result.constraint.length > 0) {\r\n return result;\r\n }\r\n\r\n return true;\r\n};\r\n","import { FileInfo, FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { fileValidator } from \"@/rule/fileValidator\";\nimport Language from \"@/util/Language\";\nimport { customChangeEventCall } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport { isArray } from \"@daracl/core/utils\";\n\nexport default class FileRender extends Render {\n private element: HTMLInputElement;\n private removeIds: any[] = [];\n private uploadFiles: any = {};\n private fileList: any[] = [];\n private fileSeq = 0;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.element = rowElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n this.fileList = field.listItem?.list || [];\n this.mounted();\n this.setDefaultOption();\n }\n\n mounted() {\n this.element.addEventListener(\"change\", (e: Event) => {\n const files = (e.target as HTMLInputElement)?.files;\n\n if (files) {\n let fileList = [];\n for (let item of files) {\n fileList.push(item);\n }\n this.addFiles(fileList);\n }\n customChangeEventCall(this.field, e, this, this.fileList);\n this.valid();\n });\n\n this.fileList.forEach((file) => {\n file.$seq = this.fileSeq += 1;\n });\n\n this.setFileList(this.fileList);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <span class=\"df-file-wrapper\">\n <label class=\"df-file-label\">\n <input type=\"file\" name=\"${field.$xssName}\" class=\"df-form-field df-file\" multiple />\n ${Language.getMessage(\"fileButton\")}\n </label>\n <i class=\"df-form-icon df-help-icon\"></i>\n </span>\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-file-list\"></div>\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n addFiles(files: any[]) {\n let addFlag = false;\n\n const newFiles: FileInfo[] = [];\n\n for (let item of files) {\n const fileCheckList = this.fileList.filter((fileItem) => fileItem.fileName == item.name && fileItem.fileSize == item.size && fileItem.lastModified == item.lastModified);\n\n if (fileCheckList.length > 0) continue;\n this.fileSeq += 1;\n this.uploadFiles[this.fileSeq] = item;\n\n let newFileInfo = {\n fileName: item.name,\n $seq: this.fileSeq,\n fileSize: item.size,\n lastModified: item.lastModified,\n } as FileInfo;\n\n newFiles.push(newFileInfo);\n addFlag = true;\n }\n if (addFlag) {\n this.setFileList(newFiles);\n this.fileList.push(...newFiles);\n }\n }\n\n private setFileList(fileList: FileInfo[], initFlag?: boolean | undefined) {\n const fileListElement = this.rowElement.querySelector(\".df-file-list\");\n\n if (fileListElement) {\n if (initFlag === true) {\n fileListElement.innerHTML = \"\";\n }\n\n const fileTemplateHtml: string[] = [];\n\n fileList.forEach((file) => {\n fileTemplateHtml.push(`\n <div class=\"df-file-item\" data-seq=\"${file.$seq}\">\n ${file.fileId ? '<span class=\"df-file-icon df-file-download\"></span>' : '<span class=\"df-file-icon df-empty-icon\"></span>'} <span class=\"df-file-icon df-file-remove\"></span>\n <span class=\"df-file-name\">${file.fileName}</span > \n </div>`);\n });\n\n fileListElement.insertAdjacentHTML(\"beforeend\", fileTemplateHtml.join(\"\"));\n\n fileList.forEach((item) => {\n this.removeFileEvent(item, fileListElement);\n this.downloadFileEvent(item, fileListElement);\n });\n }\n }\n\n /**\n * 파일 다운로드 이벤트 처리.\n *\n * @param item\n * @param fileListElement\n */\n private downloadFileEvent(item: FileInfo, fileListElement: Element) {\n const ele = fileListElement.querySelector(`[data-seq=\"${item.$seq}\"] .df-file-download`);\n if (ele) {\n ele.addEventListener(\"click\", (evt: Event) => {\n const fileItemElement = (evt.target as Element).closest(\".df-file-item\");\n\n if (fileItemElement) {\n const attrSeq = fileItemElement.getAttribute(\"data-seq\");\n if (attrSeq) {\n const seq = parseInt(attrSeq, 10);\n const idx = this.fileList.findIndex((v) => v.$seq === seq);\n\n const item = this.fileList[idx];\n\n if (item[\"url\"]) {\n location.href = item[\"url\"];\n return;\n }\n\n if (this.field.fileDownload) {\n this.field.fileDownload.call(null, { file: item, field: this.field });\n return;\n }\n }\n }\n });\n }\n }\n\n /**\n * 파일 삭제 처리.\n *\n * @param item\n * @param fileListElement\n */\n private removeFileEvent(item: FileInfo, fileListElement: Element) {\n const ele = fileListElement.querySelector(`[data-seq=\"${item.$seq}\"] .df-file-remove`);\n if (ele) {\n ele.addEventListener(\"click\", (evt: Event) => {\n const fileItemElement = (evt.target as Element).closest(\".df-file-item\");\n\n if (fileItemElement) {\n const attrSeq = fileItemElement.getAttribute(\"data-seq\");\n if (attrSeq) {\n const seq = parseInt(attrSeq, 10);\n const removeIdx = this.fileList.findIndex((v) => v.$seq === seq);\n\n const removeItem = this.fileList[removeIdx];\n\n this.fileList.splice(removeIdx, 1);\n delete this.uploadFiles[seq];\n fileItemElement.remove();\n\n if (removeItem.fileId) {\n this.removeIds.push(removeItem.fileId);\n }\n }\n }\n this.valid();\n });\n }\n }\n\n getValue() {\n return {\n uploadFile: Object.values(this.uploadFiles),\n removeIds: this.removeIds,\n };\n }\n\n public setValueItems(value: any): void {\n this.fileList = [];\n this.uploadFiles = [];\n this.removeIds = [];\n for (let file of value) {\n file.$seq = this.fileSeq += 1;\n\n this.fileList.push(file);\n }\n\n this.setFileList(this.fileList, true);\n }\n\n setValue(value: any): void {\n if (isArray(value)) {\n this.setValueItems(value);\n }\n this.element.value = \"\";\n }\n\n reset() {\n this.setValue(\"\");\n this.setValueItems([]);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLInputElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = fileValidator(this.element, this.field, this.fileList);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { invalidMessage, resetRowElementStyleClass } from \"@/util/validUtils\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\nimport { stringValidator } from \"@/rule/stringValidator\";\n\nexport default class CustomRender extends Render {\n private customFunction;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n if (field.renderer) {\n this.customFunction = field.renderer;\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n } else {\n this.customFunction = {} as any;\n }\n }\n\n mounted() {\n if (this.customFunction.mounted) {\n (this.customFunction.mounted as any).call(this, this.field, this.rowElement);\n }\n }\n\n static isDataRender(): boolean {\n return false;\n }\n\n createField() {\n const field = this.field;\n\n const fieldTemplate = utils.isEmpty(field.template) ? \"\" : utils.isString(field.template) ? field.template : field.template();\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = ` <div class=\"df-field\">\n ${fieldTemplate}\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>`;\n }\n\n getValue() {\n if (this.customFunction.getValue) {\n return (this.customFunction.getValue as any).call(this, this.field, this.rowElement);\n }\n return \"\";\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (this.customFunction.setValue) {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n value = this.field.$value;\n }\n (this.customFunction.setValue as any).call(this, value, this.field, this.rowElement);\n }\n\n this.field.$value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement() {\n if (this.customFunction.getElement) {\n return (this.customFunction.getElement as any).call(this, this.field, this.rowElement);\n }\n return null;\n }\n\n valid(): any {\n if (this.customFunction.valid) {\n const validResult = (this.customFunction.valid as any).call(this, this.field, this.rowElement);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return;\n }\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n\n /**\n * focus\n */\n focus(): void {\n if (this.customFunction.focus) {\n (this.customFunction.focus as any).call(this, this.field, this.rowElement);\n }\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class GroupRender extends Render {\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n }\n\n public mounted() {}\n\n static isDataRender(): boolean {\n return false;\n }\n\n createField() {\n return \"\";\n }\n\n getValue() {\n return null;\n }\n\n setValue(value: any): void {}\n\n reset() {}\n\n getElement(): HTMLElement {\n return this.rowElement;\n }\n\n valid(): any {\n return true;\n }\n\n public addChildField(element: Element) {\n let addContainer = this.rowElement.querySelector(\".df-field-container\");\n\n if (addContainer) {\n addContainer.append(element);\n } else {\n this.rowElement.append(element);\n }\n }\n\n focus(): void {}\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class HiddenRender extends Render {\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n this.field.$value = field.defaultValue;\n }\n\n mounted() {}\n\n createField() {\n return ``;\n }\n\n getValue() {\n return this.field.$value;\n }\n\n setValue(value: any): void {\n this.field.$value = value;\n }\n\n reset() {\n this.setValue(this.field.defaultValue);\n }\n\n getElement() {\n return;\n }\n\n valid(): any {\n return true;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class ButtonRender extends Render {\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n this.mounted();\n this.setDefaultOption();\n }\n\n mounted() {\n this.rowElement.querySelector(`#${this.field.$key}`)?.addEventListener(\"click\", (evt) => {\n if (this.field.onClick) {\n this.field.onClick.call(null, this.field);\n }\n });\n }\n\n static isDataRender(): boolean {\n return false;\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <button type=\"button\" id=\"${field.$key}\" class=\"df-btn\">${field.label}</button> ${Render.getDescriptionTemplate(field)}\n `;\n }\n\n getValue() {\n return \"\";\n }\n\n setValue(value: any): void {}\n\n reset() {\n this.setDisabled(false);\n }\n\n getElement() {\n return null;\n }\n\n valid(): any {\n return true;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { numberValidator } from \"@/rule/numberValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { customChangeEventCall, numberInputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class RangeRender extends Render {\n private element: HTMLInputElement;\n private rangeNumElement: Element;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.rangeNumElement = rowElement.querySelector(\".df-range-num\") as Element;\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n this.element.addEventListener(\"input\", (e: any) => {\n this.rangeNumElement.innerHTML = e.target.value;\n\n this.element.setAttribute(\"title\", e.target.value);\n customChangeEventCall(this.field, e, this, this.getValue());\n this.valid();\n });\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <span class=\"df-range-num\">${field.defaultValue ? field.defaultValue : 0}</span>\n <input type=\"range\" name=\"${field.$xssName}\" class=\"df-form-field df-range df-help-icon\" min=\"${field.rule.minimum}\" max=\"${field.rule.maximum}\"/>\n </div> \n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = numberValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","function isArray(value) {\n return Array.isArray(value);\n}\nfunction isFunction(value) {\n return typeof value === \"function\";\n}\nfunction isObject(value) {\n return value !== null && (typeof value === \"object\" || typeof value === \"function\");\n}\nfunction isPlainObject(value) {\n return value !== null && typeof value === \"object\" && Object.getPrototypeOf(value) === Object.prototype;\n}\nfunction isPlainPrototype(prototype) {\n if (prototype === null) return true;\n if (Object.getPrototypeOf(prototype) !== null) return false;\n const constructor = Object.getOwnPropertyDescriptor(prototype, \"constructor\")?.value;\n return isFunction(constructor) && Function.prototype.toString.call(constructor) === Function.prototype.toString.call(Object);\n}\nfunction copyProperties(source, target, context) {\n for (const key of Reflect.ownKeys(source)) {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n Object.defineProperty(target, key, {\n value: copy(source[key], context),\n enumerable: true,\n writable: true,\n configurable: true\n });\n }\n}\nfunction copy(source, context) {\n if (!isObject(source) || isFunction(source)) return source;\n if (context.seen.has(source)) return context.seen.get(source);\n let result;\n if (isArray(source)) {\n result = new Array(source.length);\n } else if (source instanceof Date) {\n result = new Date(Date.prototype.getTime.call(source));\n } else if (source instanceof RegExp) {\n result = new RegExp(source.source, source.flags);\n result.lastIndex = source.lastIndex;\n } else if (source instanceof Map) {\n result = /* @__PURE__ */ new Map();\n context.tasks.push(() => Map.prototype.forEach.call(source, (item, key) => result.set(copy(key, context), copy(item, context))));\n } else if (source instanceof Set) {\n result = /* @__PURE__ */ new Set();\n context.tasks.push(() => Set.prototype.forEach.call(source, (item) => result.add(copy(item, context))));\n } else {\n const prototype = Object.getPrototypeOf(source);\n if (!isPlainObject(source) && !isPlainPrototype(prototype)) return source;\n result = Object.create(prototype === null ? null : Object.prototype);\n }\n context.seen.set(source, result);\n context.tasks.push(() => copyProperties(source, result, context));\n return result;\n}\nconst deepCopy = (value, seen = /* @__PURE__ */ new WeakMap()) => {\n const context = { seen, tasks: [] };\n const result = copy(value, context);\n while (context.tasks.length) context.tasks.pop()();\n return result;\n};\nconst isMergeObject = (value) => isPlainObject(value) || value !== null && typeof value === \"object\" && Object.getPrototypeOf(value) === null;\nconst hasOwn = (value, key) => Object.prototype.hasOwnProperty.call(value, key);\nfunction setOwn(target, key, value) {\n Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });\n}\nfunction mergeSource(target, source, excludeKeys) {\n const copies = /* @__PURE__ */ new WeakMap();\n const tasks = [];\n function copy2(value, current) {\n if (value === null || typeof value !== \"object\") return value;\n if (copies.has(value)) return copies.get(value);\n let result;\n if (isArray(value)) {\n result = isArray(current) ? current : [];\n tasks.push(() => mergeArray(result, value));\n } else if (isMergeObject(value)) {\n result = isMergeObject(current) ? current : Object.create(Object.getPrototypeOf(value));\n tasks.push(() => mergeObject(result, value));\n } else if (value instanceof Date) {\n result = new Date(value.getTime());\n } else if (value instanceof RegExp) {\n result = new RegExp(value.source, value.flags);\n result.lastIndex = value.lastIndex;\n } else if (value instanceof Map) {\n result = /* @__PURE__ */ new Map();\n tasks.push(() => value.forEach((item, key) => result.set(copy2(key), copy2(item))));\n } else if (value instanceof Set) {\n result = /* @__PURE__ */ new Set();\n tasks.push(() => value.forEach((item) => result.add(copy2(item))));\n } else {\n return value;\n }\n copies.set(value, result);\n return result;\n }\n function mergeObject(dst, src) {\n for (const key of Object.keys(src)) {\n if (excludeKeys.has(key) || key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") continue;\n const value = src[key];\n if (value === void 0) continue;\n setOwn(dst, key, copy2(value, hasOwn(dst, key) ? dst[key] : void 0));\n }\n }\n function mergeArray(dst, src) {\n const seen = new Set(dst);\n for (const value of src) {\n const item = copy2(value);\n if (value !== null && typeof value === \"object\" || Number.isNaN(item) || !seen.has(item)) {\n seen.add(item);\n dst.push(item);\n }\n }\n }\n copies.set(source, target);\n if (isArray(source) && isArray(target)) tasks.push(() => mergeArray(target, source));\n else tasks.push(() => mergeObject(target, source));\n while (tasks.length) tasks.pop()();\n}\nfunction objectDeepMerge(...values) {\n if (values.length < 1) {\n return values;\n }\n let excludeKeys = /* @__PURE__ */ new Set();\n let sources = values;\n const last = values[values.length - 1];\n if (isMergeObject(last) && hasOwn(last, \"_excludeKeys\") && isArray(last._excludeKeys)) {\n excludeKeys = new Set(last._excludeKeys.map(String));\n sources = values.slice(0, -1);\n }\n let result = {};\n for (let index = 0; index < sources.length; index++) {\n const value = sources[index];\n if (isArray(value) || isMergeObject(value)) {\n mergeSource(result, value, index === 0 ? /* @__PURE__ */ new Set() : excludeKeys);\n }\n }\n return result;\n}\nfunction arrayDeepMerge(...values) {\n if (values.length < 1) {\n return values;\n }\n let source = [];\n let excludeKeys = /* @__PURE__ */ new Set();\n for (let value of values) {\n if (!isArray(value)) continue;\n mergeSource(source, value, excludeKeys);\n }\n return source;\n}\nfunction hasProperty(obj, prop) {\n return obj != null && obj != void 0 && Object.prototype.hasOwnProperty.call(obj, prop);\n}\nfunction isString(value) {\n return typeof value === \"string\";\n}\nfunction isBlank(value) {\n return value === null || value === void 0 || isString(value) && value.trim() === \"\";\n}\nfunction isDate(value) {\n return value instanceof Date && !isNaN(value.getTime());\n}\nfunction isNil(value) {\n return value === null || value === void 0;\n}\nfunction isEmpty(value) {\n if (isNil(value)) {\n return true;\n }\n if (isString(value)) {\n return value.trim() === \"\";\n }\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n if (typeof value === \"object\") {\n return Object.keys(value).length === 0;\n }\n return false;\n}\nfunction isNumeric(value, typeIgnore = false) {\n if (typeIgnore === true) return !Number.isNaN(value);\n return (typeof value === \"number\" || isString(value) && value.trim() !== \"\" && !isNaN(parseFloat(value))) && isFinite(Number(value));\n}\nfunction isUndefined(value) {\n return typeof value === \"undefined\";\n}\nfunction objectToQueryString(param) {\n return Object.keys(param).map((key) => {\n if (param[key] !== void 0) {\n const val = param[key];\n return `${encodeURIComponent(key)}=${encodeURIComponent(isObject(val) ? JSON.stringify(val) : String(val))}`;\n }\n }).filter(Boolean).join(\"&\");\n}\nfunction replaceParameter(template, param) {\n const objectParam = isPlainObject(param);\n return template.replace(/#.*?#/g, (placeholder) => {\n const key = placeholder.slice(1, -1);\n const value = objectParam ? Object.prototype.hasOwnProperty.call(param, key) ? param[key] ?? \"\" : \"\" : param;\n return isObject(value) ? JSON.stringify(value) : String(value);\n });\n}\nconst xssFilter = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\"\n};\nconst charsToReplace = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\"\n};\nfunction trim(s) {\n return s.replace(/^\\s+|\\s+$/g, \"\");\n}\nfunction leftTrim(s) {\n return s.replace(/^\\s+/g, \"\");\n}\nfunction rightTrim(s) {\n return s.replace(/\\s+$/g, \"\");\n}\nfunction allTrim(s) {\n return s.replace(/\\s+/g, \"\");\n}\nfunction matchCount(str, matchString) {\n if (isBlank(str)) return 0;\n const re = new RegExp(matchString, \"ig\");\n const resultArray = str.match(re);\n return resultArray == null ? 0 : resultArray.length;\n}\nfunction leftPad(str, len, ch = \"0\") {\n return pad(str, len, ch, \"l\");\n}\nfunction leftPadClamp(str, len, ch = \"0\") {\n return pad(str, len, ch, \"l\", true);\n}\nfunction rightPad(str, len, ch = \"0\") {\n return pad(str, len, ch, \"r\");\n}\nfunction rightPadClamp(str, len, ch = \"0\") {\n return pad(str, len, ch, \"r\", true);\n}\nfunction escapeHTML(html) {\n const fn = (tag) => {\n return charsToReplace[tag] || tag;\n };\n return html.replace(/[&<>\"]/g, fn);\n}\nfunction xss(inputText) {\n let returnText = inputText;\n if (returnText) {\n Object.keys(xssFilter).forEach((key) => {\n returnText = returnText.replaceAll(key, xssFilter[key]);\n });\n }\n return returnText;\n}\nfunction unXss(inputText) {\n let returnText = inputText;\n if (returnText) {\n Object.keys(xssFilter).forEach((key) => {\n returnText = returnText.replaceAll(xssFilter[key], key);\n });\n }\n return returnText;\n}\nfunction capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nfunction upperCase(str) {\n return (str || \"\").toUpperCase();\n}\nfunction lowerCase(str) {\n return (str || \"\").toLowerCase();\n}\nfunction pad(orginStr, size, ch, type = \"l\", clamp2 = false) {\n let str = \"\";\n if (isEmpty(orginStr)) {\n str = \"\";\n } else {\n str = isString(orginStr) ? orginStr : `${orginStr}`;\n }\n const strLength = str.length;\n if (strLength > size) {\n return clamp2 ? str.slice(0, size) : str;\n }\n const len = size - strLength;\n if (len < 1) return str;\n const padStr = ch.repeat(len);\n return type === \"l\" ? padStr + str : str + padStr;\n}\nfunction convertHtmlToText(html) {\n if (!html) return \"\";\n return html.replaceAll(/<br\\s*\\/?>/gi, \"\\n\").replaceAll(/<\\/(p|div|li|h[1-6])>/gi, \"\\n\").replaceAll(/<[^>]*>/g, \"\").replaceAll(\" \", \" \").replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\").replaceAll(\""\", '\"').replaceAll(\"'\", \"'\").replaceAll(/\\n{3,}/g, \"\\n\\n\").trim();\n}\nfunction uuid(dashRemoveFlag = true) {\n const value = createUuid();\n return dashRemoveFlag ? value : value.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, \"$1-$2-$3-$4-$5\");\n}\nfunction createUuid() {\n const cryptoObj = globalThis.crypto;\n if (cryptoObj && typeof cryptoObj.randomUUID === \"function\") return cryptoObj.randomUUID().replace(/-/g, \"\");\n const bytes = new Uint8Array(16);\n if (cryptoObj && typeof cryptoObj.getRandomValues === \"function\") {\n cryptoObj.getRandomValues(bytes);\n } else {\n for (let index = 0; index < bytes.length; index++) bytes[index] = Math.floor(Math.random() * 256);\n }\n bytes[6] = bytes[6] & 15 | 64;\n bytes[8] = bytes[8] & 63 | 128;\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\nfunction isFormData(data) {\n if (!data) return false;\n return typeof FormData !== \"undefined\" && data instanceof FormData;\n}\nfunction getURLParams(checkUrl) {\n const url = new URL(checkUrl);\n const params = {};\n for (const [key, value] of url.searchParams) {\n if (Object.prototype.hasOwnProperty.call(params, key)) {\n params[key].push(value);\n } else {\n Object.defineProperty(params, key, { value: [value], enumerable: true, configurable: true, writable: true });\n }\n }\n return params;\n}\nfunction getURLParam(checkUrl, paramKey) {\n const url = new URL(checkUrl);\n return url.searchParams.get(paramKey);\n}\nfunction isNumber(value) {\n return typeof value === \"number\" && !Number.isNaN(value);\n}\nfunction isBoolean(value) {\n return typeof value === \"boolean\";\n}\nfunction isThenable(value) {\n return isObject(value) && isFunction(value.then);\n}\nfunction isElement(value) {\n return value !== null && typeof value === \"object\" && value.nodeType === 1;\n}\nfunction isHTMLElement(value) {\n if (!isElement(value)) return false;\n const constructor = value.ownerDocument?.defaultView?.HTMLElement ?? (typeof HTMLElement === \"undefined\" ? void 0 : HTMLElement);\n return !!constructor && value instanceof constructor;\n}\nfunction toNumber(value) {\n if (isNumber(value)) return Number.isFinite(value) ? value : null;\n if (!isString(value) || value.trim() === \"\") return null;\n const number = Number(value.replace(/,/g, \"\"));\n return Number.isFinite(number) ? number : null;\n}\nfunction intValue(value) {\n return Number.parseInt(String(value), 10);\n}\nfunction clamp(value, min, max) {\n return Math.min(Math.max(value, min), max);\n}\nfunction formatNumber(value, pattern) {\n const decimals = (pattern.split(\".\")[1] ?? \"\").replace(/[^0#]/g, \"\").length;\n return value.toLocaleString(\"en-US\", {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n useGrouping: pattern.split(\".\")[0].includes(\",\")\n });\n}\nfunction toTimestamp(value) {\n if (isDate(value)) return value.getTime();\n if (isNumber(value)) return Number.isFinite(value) ? value : null;\n if (!isString(value) || value.trim() === \"\") return null;\n const time = Date.parse(value);\n return Number.isNaN(time) ? null : time;\n}\nfunction removeItem(array, item) {\n const index = array.indexOf(item);\n return index < 0 ? [...array] : [...array.slice(0, index), ...array.slice(index + 1)];\n}\nfunction arrayCopy(array, start, end) {\n return isArray(array) ? array.slice(start, end) : [];\n}\nfunction insertToArray(targetArray, values, isBefore = false, rowIndex, limit = Infinity) {\n const items = isArray(values) ? values : [values];\n if (rowIndex === void 0) {\n if (isBefore) targetArray.unshift(...items);\n else targetArray.push(...items);\n } else targetArray.splice(isBefore ? rowIndex - 1 : rowIndex, 0, ...items);\n if (Number.isFinite(limit) && targetArray.length > Math.max(0, limit)) {\n targetArray.splice(0, targetArray.length - Math.max(0, Math.floor(limit)));\n }\n return targetArray;\n}\nfunction moveItem(array, fromIndex, toIndex) {\n if (!Number.isInteger(fromIndex) || !Number.isInteger(toIndex) || fromIndex < 0 || fromIndex >= array.length || toIndex < 0 || toIndex >= array.length) return array;\n array.splice(toIndex, 0, array.splice(fromIndex, 1)[0]);\n return array;\n}\nfunction isSequential(array) {\n if (!array.length) return false;\n const values = /* @__PURE__ */ new Set();\n let min = Infinity;\n let max = -Infinity;\n for (const value of array) {\n if (!Number.isInteger(value) || values.has(value)) return false;\n values.add(value);\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n return max - min + 1 === array.length;\n}\nfunction arrayEquals(a, b, ignoreOrder = false, selector) {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n const select = selector ?? ((item) => item);\n if (!ignoreOrder) return a.every((item, index) => select(item) === select(b[index]));\n const counts = /* @__PURE__ */ new Map();\n for (const item of a) {\n const value = select(item);\n if (typeof value === \"number\" && Number.isNaN(value)) return false;\n counts.set(value, (counts.get(value) ?? 0) + 1);\n }\n for (const item of b) {\n const value = select(item);\n const count = counts.get(value);\n if (!count) return false;\n if (count === 1) counts.delete(value);\n else counts.set(value, count - 1);\n }\n return counts.size === 0;\n}\nfunction toListValue(value, delimiter = \",\") {\n if (isNil(value)) return [];\n if (isArray(value)) return value;\n return String(value).split(delimiter || \",\").map((item) => item.trim()).filter(Boolean);\n}\nfunction isSameValue(a, b) {\n return isNil(a) && isNil(b) || String(a) === String(b);\n}\nfunction getHashCode(value) {\n if (!value.length) return 0;\n let hash = 0;\n for (let index = 0; index < value.length; index++) hash = (hash << 5) - hash + value.charCodeAt(index) | 0;\n return String(hash).replace(/-/g, \"_\");\n}\nfunction camelToUnderscore(value) {\n return value.replace(/([a-z0-9])([A-Z])/g, \"$1_$2\").toLowerCase();\n}\nfunction camelToKebab(value) {\n return value.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\nfunction stringSplit(value, delimiter) {\n return (value || \"\").split(delimiter);\n}\nfunction addValueIfMissing(currentValue, addValue, shouldSort = false, delimiter = \",\", originValues = []) {\n if (!addValue) return [];\n let items = stringSplit(currentValue, delimiter).map(trim).filter(Boolean);\n if (originValues.length) {\n const allowed = new Set(originValues.map(trim));\n items = items.filter((item) => allowed.has(item));\n }\n const values = new Set(items);\n if (values.has(addValue)) values.delete(addValue);\n else values.add(addValue);\n const result = [...values];\n return shouldSort ? result.sort() : result;\n}\nfunction renderTemplate(template, data) {\n const get = (key) => hasProperty(data, key) ? data[key] : void 0;\n const result = template.replace(/{{if\\(([^)]+)\\)}}([\\s\\S]*?){{\\/if}}/g, (_match, condition, content) => {\n const booleanKey = /^\\s*(\\w+)\\s*$/.exec(condition);\n if (booleanKey) return get(booleanKey[1]) ? content : \"\";\n const comparison = /^\\s*(\\w+)\\s*(==|!=|>=|<=|>|<)\\s*(\\d+)\\s*$/.exec(condition);\n if (!comparison) return \"\";\n const left = get(comparison[1]);\n const right = Number(comparison[3]);\n const numeric = Number(left);\n const matched = comparison[2] === \"==\" ? left == right : comparison[2] === \"!=\" ? left != right : comparison[2] === \">=\" ? numeric >= right : comparison[2] === \"<=\" ? numeric <= right : comparison[2] === \">\" ? numeric > right : numeric < right;\n return matched ? content : \"\";\n });\n return result.replace(/{{\\s*(\\w+)\\s*}}/g, (_match, key) => String(get(key) ?? \"\"));\n}\nfunction assertScope(scope) {\n if (!/^[a-z][a-z0-9-]*$/i.test(scope)) throw new Error(`Invalid scope: ${scope}`);\n return scope;\n}\nfunction toDataAttribute(key, reserved = []) {\n const kebab = camelToKebab(key);\n return /^[a-z][a-z0-9-]*$/.test(kebab) && !reserved.includes(kebab) ? `data-${kebab}` : void 0;\n}\nfunction cloneJson(value) {\n return isUndefined(value) ? value : JSON.parse(JSON.stringify(value));\n}\nfunction cloneConfig(value) {\n if (isFunction(value)) return value;\n if (isArray(value)) return value.filter((item) => !isUndefined(item)).map((item) => cloneConfig(item));\n if (isPlainObject(value)) {\n const result = {};\n for (const [key, item] of Object.entries(value)) {\n if (isUndefined(item)) continue;\n Object.defineProperty(result, key, { value: cloneConfig(item), enumerable: true, configurable: true, writable: true });\n }\n return result;\n }\n return cloneJson(value);\n}\nfunction jsonEqual(a, b) {\n return a === b || JSON.stringify(a) === JSON.stringify(b);\n}\nfunction sameValue(a, b) {\n const seen = /* @__PURE__ */ new WeakMap();\n const compare = (left, right) => {\n if (Object.is(left, right)) return true;\n const arrays = isArray(left) && isArray(right);\n if (!arrays && !(isPlainObject(left) && isPlainObject(right))) return false;\n const l = left, r = right;\n if (seen.get(l)?.has(r)) return true;\n if (!seen.has(l)) seen.set(l, /* @__PURE__ */ new WeakSet());\n seen.get(l).add(r);\n if (arrays) {\n const la = left, ra = right;\n return la.length === ra.length && la.every((item, index) => compare(item, ra[index]));\n }\n const lo = left, ro = right;\n return [.../* @__PURE__ */ new Set([...Object.keys(lo), ...Object.keys(ro)])].every((key) => compare(\n Object.prototype.hasOwnProperty.call(lo, key) ? lo[key] : void 0,\n Object.prototype.hasOwnProperty.call(ro, key) ? ro[key] : void 0\n ));\n };\n return compare(a, b);\n}\nfunction parseConfigString(value) {\n if (!isString(value)) return value;\n try {\n const parsed = JSON.parse(value);\n return isPlainObject(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\nfunction toOptionObject(value) {\n if (isBoolean(value)) return { enabled: value };\n return isPlainObject(value) ? deepCopy(value) : {};\n}\nfunction debounce(callback, delay) {\n let timer;\n const cancel = () => {\n clearTimeout(timer);\n timer = void 0;\n };\n const debounced = function(...args) {\n cancel();\n if (delay < 1) {\n callback.apply(this, args);\n return;\n }\n timer = setTimeout(() => {\n timer = void 0;\n callback.apply(this, args);\n }, delay);\n };\n debounced.cancel = cancel;\n return debounced;\n}\nfunction compareValues(a, b, ascending = true, nullsLast = false) {\n const nullA = isNil(a);\n const nullB = isNil(b);\n if (nullA !== nullB) return nullsLast ? nullA ? 1 : -1 : ascending ? nullA ? 1 : -1 : nullA ? -1 : 1;\n if (nullA) return 0;\n const result = isNumber(a) && isNumber(b) ? a - b : String(a).localeCompare(String(b));\n return ascending ? result : -result;\n}\nfunction sortRows(rows, sorts, nullsLast = false) {\n return [...rows].sort((a, b) => {\n for (const sort of sorts) {\n const result = compareValues(a[sort.field], b[sort.field], sort.direction === \"asc\", nullsLast);\n if (result !== 0) return result;\n }\n return 0;\n });\n}\nfunction escapeRegExp(value) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\nfunction createMatcher(keyword, options = {}) {\n let source = escapeRegExp(keyword);\n const nested = /\\([^()]*[+*|][^()]*\\)[+*]/.test(keyword);\n if (options.useRegex && keyword.length <= 200 && !nested) {\n try {\n new RegExp(keyword);\n source = keyword;\n } catch {\n }\n }\n if (options.matchWholeWord) {\n const boundary = `[\\\\s.,;:!?()\\\\[\\\\]{}\"']`;\n source = `(?:^|${boundary})(?:${source})(?=$|${boundary})`;\n }\n const regexp = new RegExp(source, options.matchCase ? \"\" : \"i\");\n return (text) => regexp.test(text);\n}\nfunction matchRow(row, fields, matcher) {\n return fields.some((field) => {\n const value = row[field];\n return !isNil(value) && matcher(String(value));\n });\n}\nfunction highlightSingleMatch(text, match, highlightTag = \"mark\") {\n if (![\"mark\", \"span\", \"b\", \"strong\", \"em\", \"i\"].includes(highlightTag)) throw new TypeError(\"Invalid highlight tag\");\n const start = Math.max(0, Math.min(text.length, Math.floor(match.start)));\n const end = Math.max(start, Math.min(text.length, Math.floor(match.end)));\n return `${escapeHTML(text.slice(0, start))}<${highlightTag}>${escapeHTML(text.slice(start, end))}</${highlightTag}>${escapeHTML(text.slice(end))}`;\n}\nfunction formatDate(date, pattern) {\n const pad2 = (value) => leftPad(value, 2);\n const tokens = { YYYY: String(date.getFullYear()), MM: pad2(date.getMonth() + 1), DD: pad2(date.getDate()), HH: pad2(date.getHours()), mm: pad2(date.getMinutes()), ss: pad2(date.getSeconds()) };\n return pattern.replace(/YYYY|MM|DD|HH|mm|ss/g, (token) => tokens[token]);\n}\nfunction formatValue(value, format) {\n if (isNil(value) || value === \"\") return \"\";\n if (!format) return String(value);\n const prefix = format.prefix ?? \"\";\n const suffix = format.suffix ?? \"\";\n if (format.type === \"date\") {\n const date = value instanceof Date ? value : new Date(isNumber(value) ? value : String(value));\n return Number.isNaN(date.getTime()) ? String(value) : `${prefix}${formatDate(date, format.format ?? \"YYYY-MM-DD\")}${suffix}`;\n }\n const number = toNumber(value);\n if (number === null) return String(value);\n const text = format.type === \"currency\" ? new Intl.NumberFormat(format.locale, { style: \"currency\", currency: format.format ?? \"KRW\" }).format(number) : formatNumber(number, format.format ?? \"0,0\");\n return `${prefix}${text}${suffix}`;\n}\nfunction computeSummary(rows, field, expression) {\n if (isFunction(expression)) return expression(rows);\n if (expression === \"count\") return rows.length;\n let sum = 0, min = Infinity, max = -Infinity, count = 0;\n for (const row of rows) {\n const value = row[field];\n if (!isNumber(value)) continue;\n count++;\n sum += value;\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n return !count ? null : expression === \"min\" ? min : expression === \"max\" ? max : expression === \"average\" ? sum / count : sum;\n}\nfunction calcSummary(items, mode, itemKey) {\n if (![\"count\", \"min\", \"max\", \"sum\", \"avg\"].includes(mode)) return `${mode} not valid`;\n return computeSummary(items, itemKey, mode === \"avg\" ? \"average\" : mode) ?? \"not valid\";\n}\nfunction escapeCellValue(value) {\n return isString(value) && /[\"\\n\\r\\t]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n}\nfunction parseClipboard(text) {\n const rows = [];\n let row = [], cell = \"\", inQuotes = false;\n text = text.replace(/(\\r?\\n){2}$/, \"\\n\");\n for (let index = 0; index < text.length; index++) {\n const char = text[index], next = text[index + 1];\n if (char === '\"') {\n if (inQuotes && next === '\"') {\n cell += '\"';\n index++;\n } else inQuotes = !inQuotes;\n } else if (!inQuotes && char === \"\t\") {\n row.push(cell);\n cell = \"\";\n } else if (!inQuotes && (char === \"\\n\" || char === \"\\r\")) {\n if (char === \"\\r\" && next === \"\\n\") index++;\n row.push(cell);\n rows.push(row);\n row = [];\n cell = \"\";\n } else cell += char;\n }\n row.push(cell);\n rows.push(row);\n return rows;\n}\nfunction toTsv(rows, fields) {\n return rows.map((row) => fields.map((field) => {\n const value = row[field];\n return isNil(value) ? \"\" : String(value).replace(/[\\t\\n\\r]/g, \" \");\n }).join(\"\t\")).join(\"\\n\");\n}\nfunction parseTsv(text) {\n return text.replace(/\\r\\n/g, \"\\n\").replace(/\\n$/, \"\").split(\"\\n\").map((line) => line.split(\"\t\"));\n}\nfunction $querySelectorList(el) {\n if (isBlank(el)) {\n return [];\n }\n if (isString(el)) {\n return Array.from(document.querySelectorAll(el));\n }\n if (isArray(el)) {\n return el;\n }\n if (el instanceof Document) {\n return [el];\n }\n if (el instanceof Element) {\n return [el];\n }\n if (el instanceof NodeList) {\n return Array.from(el);\n }\n return [];\n}\nfunction $querySelector(el) {\n if (isBlank(el)) {\n return null;\n }\n if (el instanceof Document) {\n return el;\n }\n if (el instanceof Element) {\n return el;\n }\n if (isString(el)) {\n return document.querySelector(el);\n }\n if (isArray(el)) {\n return el[0];\n }\n if (el instanceof NodeList) {\n return el.item(0);\n }\n return null;\n}\nfunction getElementRect(el, includeScroll = false) {\n if (!el) {\n throw new Error(\"유효하지 않은 요소입니다.\");\n }\n const rect = el.getBoundingClientRect();\n const scrollX = includeScroll ? window.scrollX : 0;\n const scrollY = includeScroll ? window.scrollY : 0;\n return {\n top: rect.top + scrollY,\n left: rect.left + scrollX,\n bottom: rect.bottom + scrollY,\n right: rect.right + scrollX,\n width: rect.width,\n height: rect.height\n };\n}\nfunction before(el, renderElements) {\n insertAdjacentHTML($querySelectorList(el), \"beforebegin\", renderElements);\n}\nfunction after(el, renderElements) {\n insertAdjacentHTML($querySelectorList(el), \"afterend\", renderElements);\n}\nfunction prepend(el, renderElements) {\n insertAdjacentHTML($querySelectorList(el), \"afterbegin\", renderElements);\n}\nfunction append(el, renderElements) {\n insertAdjacentHTML($querySelectorList(el), \"beforeend\", renderElements);\n}\nfunction insertAdjacentHTML(elements, insertPosition, renderElements) {\n if (isString(renderElements)) {\n elements.forEach((el) => {\n el.insertAdjacentHTML(insertPosition, renderElements);\n });\n } else {\n elements.forEach((el) => {\n el.insertAdjacentElement(insertPosition, renderElements);\n });\n }\n}\nfunction findClosest(el, check) {\n if (!el) return null;\n if (typeof check === \"string\") {\n return el.closest(check);\n }\n let current = el;\n while (current) {\n if (current === check) return current;\n current = current.parentElement;\n }\n return null;\n}\nconst styleClassSplit = (styleClass) => {\n return styleClass.trim().split(/\\s+/).filter(Boolean);\n};\nfunction addClass(element, styleClass) {\n if (!element) return;\n const elements = $querySelectorList(element);\n const addStyles = styleClassSplit(styleClass);\n elements.forEach((el) => {\n el.classList.add(...addStyles);\n });\n}\nfunction removeClass(element, classNames) {\n if (!element || typeof classNames !== \"string\") return;\n const elements = $querySelectorList(element);\n const styleClasses = styleClassSplit(classNames);\n for (const el of elements) {\n el.classList.remove(...styleClasses);\n }\n}\nfunction toggleClass(element, classNames) {\n if (!element || typeof classNames !== \"string\") return;\n const elements = $querySelectorList(element);\n const styleClasses = styleClassSplit(classNames);\n for (const el of elements) {\n styleClasses.forEach((cls) => {\n el.classList.toggle(cls);\n });\n }\n}\nfunction addStyleCss(element, styles) {\n for (const key in styles) {\n if (Object.prototype.hasOwnProperty.call(styles, key)) {\n element.style.setProperty(key, styles[key]);\n }\n }\n}\nfunction hasClass(element, className) {\n return styleClassSplit(className).some((name) => element.classList.contains(name));\n}\nfunction isVisible(element) {\n return !!(element.offsetHeight || element.offsetWidth) && getComputedStyle(element).visibility !== \"hidden\";\n}\nfunction createHTMLElement(tagName, className, attrs = {}, text) {\n const element = document.createElement(tagName);\n if (className) addClass(element, className);\n for (const [key, value] of Object.entries(attrs)) {\n if (key === \"style\" && value !== null && typeof value === \"object\") {\n const styles = {};\n for (const [name, item] of Object.entries(value)) styles[camelToKebab(name)] = item;\n addStyleCss(element, styles);\n } else if (key === \"dataset\" && value !== null && typeof value === \"object\") {\n for (const [name, item] of Object.entries(value)) element.setAttribute(`data-${camelToKebab(name)}`, String(item));\n } else element.setAttribute(key, value !== null && typeof value === \"object\" ? JSON.stringify(value) : String(value));\n }\n if (text !== void 0) element.textContent = text;\n return element;\n}\nfunction templateToElement(html) {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n return template.content.firstElementChild;\n}\nfunction normalizeCssLength(value) {\n return !value ? \"\" : typeof value === \"number\" || /^\\d+$/.test(value) ? `${value}px` : value;\n}\nfunction resolveClassName(value, params) {\n if (!value) return [];\n return styleClassSplit(isFunction(value) ? value(params) : value);\n}\nfunction getBrowserSize(usableSize = true) {\n return usableSize ? { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight } : { width: window.innerWidth, height: window.innerHeight };\n}\nfunction getScrollPosition() {\n return {\n top: window.pageYOffset ?? (document.documentElement.scrollTop || document.body.scrollTop || 0),\n left: window.pageXOffset ?? (document.documentElement.scrollLeft || document.body.scrollLeft || 0)\n };\n}\nfunction outerLayerPosition(layer, position) {\n const scroll = getScrollPosition(), rect = getElementRect(layer), view = getBrowserSize();\n const bottom = scroll.top + view.height, right = scroll.left + view.width;\n return {\n top: Math.max(0, position.y + rect.height + 5 > bottom ? bottom - rect.height - 5 : position.y),\n left: Math.max(0, position.x + rect.width > right ? position.x - rect.width : position.x)\n };\n}\nfunction innerLayerPosition(container, target, layer, margin = 2) {\n const parent = getElementRect(container), rect = getElementRect(target);\n const height = Math.min(layer.offsetHeight || getElementRect(layer).height, Math.max(rect.top - margin, window.innerHeight - rect.bottom - margin, 0));\n const top = rect.bottom + height > window.innerHeight ? rect.top - height - margin : rect.bottom;\n return { top: top - parent.top, left: rect.left - parent.left, height, width: rect.width };\n}\nconst isPageRoot = (element) => element === document.body || element === document.documentElement;\nfunction resolveScrollElement(container, option) {\n let found;\n if (isHTMLElement(option)) found = option;\n else if (typeof option === \"string\" && option) {\n try {\n found = container.closest(option) ?? void 0;\n } catch {\n }\n }\n if (found) return isPageRoot(found) ? void 0 : found;\n for (let element = container; element && !isPageRoot(element); element = element.parentElement) {\n if ([\"auto\", \"scroll\", \"overlay\"].includes(getComputedStyle(element).overflowY) && element.scrollHeight > element.clientHeight) return element;\n }\n return void 0;\n}\nfunction measureScrollTarget(element) {\n if (!element) return { top: 0, bottom: window.innerHeight };\n const rect = getElementRect(element);\n return { element, top: clamp(rect.top, 0, window.innerHeight), bottom: clamp(rect.bottom, 0, window.innerHeight) };\n}\nfunction resolveScrollTarget(container, option) {\n return measureScrollTarget(resolveScrollElement(container, option));\n}\nfunction isEsc(event) {\n return event.key === \"Escape\" || event.key === \"Esc\";\n}\nfunction isPrimaryPointer(event) {\n if (typeof PointerEvent !== \"undefined\" && event instanceof PointerEvent) return event.isPrimary && event.button === 0;\n if (typeof MouseEvent !== \"undefined\" && event instanceof MouseEvent) return event.button === 0;\n return typeof TouchEvent !== \"undefined\" && event instanceof TouchEvent;\n}\nfunction isMouseMoved(start, current, threshold = 5) {\n return (current.x - start.x) ** 2 + (current.y - start.y) ** 2 > threshold ** 2;\n}\nfunction isSafeUrl(url) {\n const value = url.trim().replace(/[\\u0000-\\u001F\\u007F\\s]+/g, \"\");\n if (!value) return false;\n const match = /^([a-z][a-z0-9+.-]*):/i.exec(value);\n if (!match) return true;\n if (match[1].toLowerCase() === \"data\") return /^data:image\\/(?:png|gif|jpe?g|webp|avif|bmp)(?:;|,)/i.test(value);\n return [\"http\", \"https\", \"mailto\", \"tel\"].includes(match[1].toLowerCase());\n}\nfunction createClassNamer(prefix) {\n return (...names) => names.flatMap(styleClassSplit).map((name) => `${prefix}-${name}`).join(\" \");\n}\nasync function writeClipboard(text) {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n }\n if (typeof document === \"undefined\" || !document.body || !document.execCommand) return false;\n const active = document.activeElement;\n const textarea = createHTMLElement(\"textarea\", void 0, { style: { position: \"fixed\", top: \"-9999px\", left: \"-9999px\" } });\n textarea.value = text;\n document.body.appendChild(textarea);\n try {\n textarea.select();\n return document.execCommand(\"copy\");\n } catch {\n return false;\n } finally {\n textarea.remove();\n active?.focus?.();\n }\n}\nfunction downloadUrl(url, fileName) {\n const link = createHTMLElement(\"a\", void 0, { href: url, download: fileName, style: { display: \"none\" } });\n document.body.appendChild(link);\n try {\n link.click();\n } finally {\n link.remove();\n }\n}\nfunction downloadText(fileName, text, type = \"application/json\") {\n const url = URL.createObjectURL(new Blob([text], { type }));\n try {\n downloadUrl(url, fileName);\n } finally {\n setTimeout(() => URL.revokeObjectURL(url), 0);\n }\n}\nfunction svgToDataURL(svg) {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\nfunction serializeSvg(svg) {\n const clone = svg.cloneNode(true);\n if (!clone.getAttribute(\"xmlns\")) clone.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n return new XMLSerializer().serializeToString(clone);\n}\nconst getPagingParamToPagingInfo = (pagingParam, rowLength) => {\n const page = pagingParam?.page || 1;\n const totalCount = pagingParam?.totalCount ?? rowLength;\n const pageSize = pagingParam?.pageSize || 10;\n const unitPage = pagingParam?.unitPage || 10;\n return getPagingInfo(totalCount > 0 ? totalCount : rowLength, page, pageSize, unitPage);\n};\nconst getPagingInfo = (totalCount, page, pageSize, unitPage) => {\n pageSize = Number.isFinite(pageSize) && pageSize > 0 ? Math.max(1, Math.floor(pageSize)) : 10;\n unitPage = Number.isFinite(unitPage) && unitPage > 0 ? Math.max(1, Math.floor(unitPage)) : 10;\n totalCount = Number.isFinite(totalCount) ? Math.max(0, Math.floor(totalCount)) : 0;\n page = Number.isFinite(page) ? Math.max(1, Math.floor(page)) : 1;\n if (totalCount < 1) {\n return {\n page: 0,\n pageSize,\n unitPage,\n totalCount: 0,\n totalPages: 0,\n currStartPage: 0,\n currEndPage: 0,\n prePage: 0,\n nextPage: 0,\n prePage_is: false,\n nextPage_is: false\n };\n }\n const totalPages = totalCount % pageSize == 0 ? totalCount / pageSize : Math.floor(totalCount / pageSize) + 1;\n if (totalPages < page) {\n page = totalPages;\n }\n let currStartPage;\n let currEndPage;\n if (totalPages <= unitPage) {\n currEndPage = totalPages;\n currStartPage = 1;\n } else {\n let halfUnitPage = unitPage;\n if (page == unitPage || page > unitPage && totalPages - (page - 1) >= unitPage) {\n halfUnitPage = Math.floor(unitPage / 2);\n }\n if (page <= halfUnitPage) {\n currEndPage = unitPage;\n currStartPage = 1;\n } else if (page + halfUnitPage < totalPages) {\n currEndPage = page + halfUnitPage;\n currStartPage = currEndPage - unitPage + 1;\n } else {\n currEndPage = page + halfUnitPage;\n if (currEndPage > totalPages) {\n currEndPage = totalPages;\n }\n currStartPage = currEndPage - unitPage + 1;\n }\n }\n if (currEndPage > totalPages) currEndPage = totalPages;\n let prePage = 0;\n let prePage_is = false;\n if (currStartPage != 1) {\n prePage_is = true;\n prePage = currStartPage - 1;\n }\n let nextPage = 0;\n let nextPage_is = false;\n if (currEndPage != totalPages) {\n nextPage_is = true;\n nextPage = currEndPage + 1;\n }\n return {\n page,\n unitPage,\n prePage,\n prePage_is,\n nextPage,\n nextPage_is,\n currStartPage,\n currEndPage,\n pageSize,\n totalCount,\n totalPages\n };\n};\nconst DROP_TAGS = /* @__PURE__ */ new Set([\n \"script\",\n \"style\",\n \"iframe\",\n \"frame\",\n \"frameset\",\n \"object\",\n \"embed\",\n \"applet\",\n \"link\",\n \"meta\",\n \"base\",\n \"form\",\n \"input\",\n \"button\",\n \"textarea\",\n \"select\",\n \"option\",\n \"svg\",\n \"math\",\n \"template\",\n \"noscript\",\n \"title\"\n]);\nconst ALLOWED_TAGS = /* @__PURE__ */ new Set([\n \"a\",\n \"abbr\",\n \"b\",\n \"blockquote\",\n \"br\",\n \"caption\",\n \"code\",\n \"col\",\n \"colgroup\",\n \"dd\",\n \"del\",\n \"div\",\n \"dl\",\n \"dt\",\n \"em\",\n \"figcaption\",\n \"figure\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"hr\",\n \"i\",\n \"img\",\n \"ins\",\n \"li\",\n \"mark\",\n \"ol\",\n \"p\",\n \"pre\",\n \"s\",\n \"small\",\n \"span\",\n \"strong\",\n \"sub\",\n \"sup\",\n \"table\",\n \"tbody\",\n \"td\",\n \"tfoot\",\n \"th\",\n \"thead\",\n \"tr\",\n \"u\",\n \"ul\"\n]);\nconst ALLOWED_ATTRS = /* @__PURE__ */ new Set([\n \"class\",\n \"style\",\n \"title\",\n \"alt\",\n \"href\",\n \"src\",\n \"target\",\n \"width\",\n \"height\",\n \"colspan\",\n \"rowspan\",\n \"align\",\n \"valign\",\n \"dir\",\n \"lang\"\n]);\nconst URL_ATTRS = /* @__PURE__ */ new Set([\"href\", \"src\"]);\nconst UNSAFE_STYLE = /url\\s*\\(|expression\\s*\\(|javascript:|@import|behavior\\s*:|-moz-binding|\\\\|\\/\\*/i;\nfunction sanitizeElement(el) {\n Array.from(el.attributes).forEach((attr) => {\n const name = attr.name.toLowerCase();\n const value = attr.value;\n const keep = ALLOWED_ATTRS.has(name) && (!URL_ATTRS.has(name) || isSafeUrl(value)) && (name !== \"style\" || !UNSAFE_STYLE.test(value)) && (name !== \"target\" || value === \"_blank\" || value === \"_self\");\n if (!keep) el.removeAttribute(attr.name);\n });\n if (el.tagName === \"A\" && el.getAttribute(\"target\") === \"_blank\") {\n el.setAttribute(\"rel\", \"noopener noreferrer\");\n }\n}\nfunction sanitizeChildren(parent) {\n Array.from(parent.childNodes).forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) return;\n if (node.nodeType !== Node.ELEMENT_NODE) {\n node.parentNode?.removeChild(node);\n return;\n }\n const el = node;\n const tag = el.tagName.toLowerCase();\n if (DROP_TAGS.has(tag)) {\n el.remove();\n return;\n }\n sanitizeChildren(el);\n if (ALLOWED_TAGS.has(tag)) {\n sanitizeElement(el);\n } else {\n el.replaceWith(...Array.from(el.childNodes));\n }\n });\n}\nfunction sanitizeHtml(html) {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n const fragment = template.content;\n sanitizeChildren(fragment);\n return document.importNode(fragment, true);\n}\nconst copyObject = (value) => isPlainObject(value) ? { ...value } : {};\nconst isUnsafe = (path) => path.some((key) => [\"__proto__\", \"constructor\", \"prototype\"].includes(key));\nfunction toObjectForm(value, stringKey) {\n if (isBoolean(value)) return { enabled: value };\n if (isString(value)) return stringKey ? { [stringKey]: value } : {};\n return copyObject(value);\n}\nfunction setIn(target, path, value, options = {}) {\n if (!path.length || isUnsafe(path)) throw new TypeError(\"Invalid object path\");\n const nodes = [target];\n let node = target;\n for (const key of path.slice(0, -1)) {\n const current = hasProperty(node, key) ? node[key] : void 0;\n const next = (options.toObject ?? copyObject)(current);\n node[key] = next;\n nodes.push(next);\n node = next;\n }\n const last = path[path.length - 1];\n if (value === void 0) delete node[last];\n else node[last] = value;\n if (options.prune) {\n for (let index = nodes.length - 1; index > 0 && !Object.keys(nodes[index]).length; index--) delete nodes[index - 1][path[index - 1]];\n }\n}\nfunction getIn(target, path, toObject) {\n if (isUnsafe(path)) return void 0;\n let node = target;\n for (const key of path) {\n if (toObject && !isPlainObject(node)) node = toObject(node);\n if (!isPlainObject(node) || !hasProperty(node, key)) return void 0;\n node = node[key];\n }\n return node;\n}\nfunction fieldsOf(rows, limit = 100) {\n const fields = /* @__PURE__ */ new Set();\n for (const row of (rows ?? []).slice(0, Math.max(0, limit))) {\n if (isPlainObject(row)) Object.keys(row).forEach((key) => fields.add(key));\n }\n return [...fields];\n}\nfunction fieldDisplayName(field, label) {\n return label && label !== field ? `${label}(${field})` : field;\n}\nconst FUNCTION_REF_PREFIX = \"@fn:\";\nfunction createErrorFactory(prefix) {\n return (message) => new Error(`${prefix} ${message}`);\n}\nfunction parseJson(json, createError = (message) => new Error(message)) {\n try {\n return JSON.parse(json);\n } catch (error) {\n throw createError(`invalid JSON : ${error.message}`);\n }\n}\nfunction walkConfig(value, visitor, startPath = \"\") {\n const active = /* @__PURE__ */ new WeakSet();\n const walk = (node, path) => {\n const result = visitor(node, path);\n if (result.handled) return result.value;\n if (!isArray(node) && !isPlainObject(node)) return node;\n if (active.has(node)) throw new TypeError(`Cyclic config: ${path}`);\n active.add(node);\n try {\n if (isArray(node)) return node.map((item, index) => walk(item, `${path}[${index}]`));\n const out = {};\n for (const [key, value2] of Object.entries(node)) {\n const next = walk(value2, path ? `${path}.${key}` : key);\n if (next !== void 0) Object.defineProperty(out, key, { value: next, enumerable: true, configurable: true, writable: true });\n }\n return out;\n } finally {\n active.delete(node);\n }\n };\n return walk(value, startPath);\n}\nfunction stringifyWithFunctions(value, functions = {}) {\n const names = new Map(Object.entries(functions).map(([name, fn]) => [fn, name]));\n const omitted = [];\n const converted = walkConfig(value, (node, path) => {\n if (!isFunction(node)) return { handled: false };\n const name = names.get(node);\n if (name !== void 0) return { handled: true, value: `${FUNCTION_REF_PREFIX}${name}` };\n omitted.push(path);\n return { handled: true, value: void 0 };\n });\n return { json: JSON.stringify(converted, null, 2), omitted };\n}\nfunction restoreFunctions(value, functions = {}, createError = (message) => new Error(message), path = \"\") {\n return walkConfig(value, (node, at) => {\n if (!isString(node) || !node.startsWith(FUNCTION_REF_PREFIX)) return { handled: false };\n const name = node.slice(FUNCTION_REF_PREFIX.length);\n if (!hasProperty(functions, name) || !isFunction(functions[name])) throw createError(`${at || \"value\"} : function \"${name}\" is not registered`);\n return { handled: true, value: functions[name] };\n }, path);\n}\nfunction parseConfigJson(json, functions = {}, createError = (message) => new Error(message)) {\n const config = restoreFunctions(parseJson(json, createError), functions, createError);\n if (!isPlainObject(config)) throw createError(\"config JSON must be an object\");\n return config;\n}\nfunction readTextFile(file) {\n return file.text();\n}\nconst instanceMap = {};\nconst loadingGroups = /* @__PURE__ */ new WeakMap();\nlet G_LOADING_IDX = 0;\nlet defaultOptions = {\n // 사라지는 시간\n timeout: -1,\n // 시간 표시 여부\n enableTime: false,\n enableRequestCount: false,\n requestCount: 0,\n // 표시 내용\n content: \"\",\n // background color\n bgColor: \"#ffffff\",\n // z-index\n zIndex: 9999,\n // opacity\n opacity: \"0.3\",\n // 이미지 경로 및 base64 코드\n loadingImg: \"data:image/gif;base64,R0lGODlhIAAgALMLADaJuwRsqx57s8bc65rD3FacxoS21bzX6Njo8eTu9bbT5v///wAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkFBQTEyNEY3MTZBMTFFNTlEMTU4OEI0NTk3MzIxQkYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkFBQTEyNTA3MTZBMTFFNTlEMTU4OEI0NTk3MzIxQkYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQUFBMTI0RDcxNkExMUU1OUQxNTg4QjQ1OTczMjFCRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQUFBMTI0RTcxNkExMUU1OUQxNTg4QjQ1OTczMjFCRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn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\",\n // css cursor\n cursor: \"wait\",\n // 취소 버튼 활성화 여부\n enableCancelButton: false,\n // 취소 벼튼 활성화시 callback 메소드\n callback: (param) => {\n return true;\n }\n};\nclass Loading {\n constructor(selector, options = {}) {\n this.orginStylePosition = \"\";\n if (isBlank(selector)) {\n selector = \"body\";\n }\n if (selector instanceof HTMLElement) {\n this.containerNode = selector;\n this.selector = \"\";\n } else {\n selector = selector || \"body\";\n this.containerNode = document.querySelector(selector);\n this.selector = selector;\n }\n if (!this.containerNode) return;\n this.options = objectDeepMerge(defaultOptions, options);\n if (this.selector) instanceMap[this.selector] = this;\n this.show();\n }\n static create(selector, options) {\n return new Loading(selector, options);\n }\n static instance(selector) {\n return instanceMap[selector];\n }\n static setOptions(options) {\n defaultOptions = Object.assign({}, defaultOptions, options);\n }\n cancelHandler() {\n for (const member of Array.from(this.group?.members ?? [this])) {\n if (member.options.callback?.(member.options) !== false) member.hide();\n }\n }\n /**\n * 이 인스턴스의 요청 수를 갱신하고 공유 화면에 합계를 표시합니다.\n * @param count 진행 중인 요청 수\n * @returns 없음\n */\n setRequestCount(count) {\n this.options.requestCount = Number.isFinite(count) ? Math.max(0, Math.floor(count)) : 0;\n this.updateRequestCount();\n }\n updateRequestCount() {\n const group = this.group;\n const element = group?.renderer.loadingElement;\n if (!group || !element) return;\n let count = 0;\n let enabled = false;\n for (const member of group.members) {\n enabled = enabled || member.options.enableRequestCount;\n count += Number.isFinite(member.options.requestCount) ? Math.max(0, Math.floor(member.options.requestCount)) : 0;\n }\n let counter = element.querySelector(\".daracl-cl-request-count\");\n if (!enabled) {\n counter?.remove();\n return;\n }\n if (!counter) {\n counter = document.createElement(\"div\");\n counter.className = \"daracl-cl-request-count\";\n counter.setAttribute(\"role\", \"status\");\n element.querySelector(\".daracl-cl-image\")?.insertAdjacentElement(\"afterend\", counter);\n }\n counter.textContent = `진행 중 요청: ${count}`;\n }\n /**\n * show loading module\n * @public\n */\n show() {\n const containerNode = this.containerNode;\n if (!containerNode) return;\n const existingGroup = loadingGroups.get(containerNode);\n if (existingGroup) {\n this.group = existingGroup;\n existingGroup.members.add(this);\n this.updateRequestCount();\n return;\n }\n if (containerNode.querySelector(\":scope >.daracl-cl\")) return;\n this.orginStylePosition = containerNode.style.position;\n const computedStyle = getComputedStyle(containerNode);\n if (![\"absolute\", \"relative\", \"fixed\", \"sticky\"].includes(computedStyle.position)) {\n containerNode.style.position = \"relative\";\n }\n const opts = this.options;\n let zIndex = opts.zIndex;\n if (defaultOptions.zIndex == opts.zIndex) {\n zIndex += ++G_LOADING_IDX;\n }\n let template = `\n <div class=\"daracl-cl\" style=\"cursor: ${opts.cursor}; top: 0px; left: 0px; z-index: ${zIndex}; position: absolute; width: 100%; height: 100%;\">\n <div style=\"position: absolute; background: ${opts.bgColor}; opacity: ${opts.opacity}; width: 100%; height: 100%; z-index: 1\"></div>\n <div style=\"z-index: 10; text-align: center; margin: 0; position: absolute; top: 40%; left: 50%; transform: translate(-50%, -50%)\">\n ${opts.enableTime ? `<div class=\"daracl-cl-time\" style=\"position: absolute; z-index: ${opts.zIndex + 1}; width: 100%; margin-top: 8px;\">0</div>` : \"\"}\n <img class=\"daracl-cl-image\" src=\"${opts.loadingImg}\" />\n `;\n if (opts.content) {\n template += `<div class=\"daracl-cl-content\">${opts.content}</div>`;\n }\n if (opts.enableCancelButton) {\n template += `<div style=\"height: 35px; line-height: 35px;\"><button type=\"button\" class=\"daracl-cl-btn\">Cancel</button></div>`;\n }\n template += `</div></div>`;\n containerNode.insertAdjacentHTML(\"afterbegin\", template);\n this.loadingElement = containerNode.querySelector(\":scope >.daracl-cl\");\n this.group = { renderer: this, members: /* @__PURE__ */ new Set([this]) };\n loadingGroups.set(containerNode, this.group);\n this.updateRequestCount();\n if (opts.enableCancelButton) {\n this.loadingElement?.querySelector(\".daracl-cl-btn\")?.addEventListener(\"click\", () => this.cancelHandler());\n }\n if (opts.enableTime) {\n const loadingTimeElement = this.loadingElement?.querySelector(\".daracl-cl-time\");\n let sec = 0;\n this.intervalId = window.setInterval(() => {\n loadingTimeElement.innerText = `${++sec}`;\n }, 1e3);\n }\n if (opts.timeout > 0) {\n this.timeoutId = window.setTimeout(() => {\n for (const member of Array.from(this.group?.members ?? [])) member.hide();\n }, opts.timeout);\n }\n }\n /**\n * set display content\n *\n * @public\n * @param {string} content \n */\n setContent(content) {\n if (!this.containerNode) return;\n const loadingElement = this.group?.renderer.loadingElement ?? this.loadingElement;\n const existing = loadingElement?.querySelector(\".daracl-cl-content\");\n if (!existing) {\n loadingElement?.querySelector(\".daracl-cl-image\")?.insertAdjacentHTML(\"afterend\", `<div class=\"daracl-cl-content\">${content}</div>`);\n } else {\n existing.innerHTML = content;\n }\n }\n /**\n * hide loading module\n *\n * @public\n * @param {?boolean} [flag] \n */\n hide(flag) {\n const group = this.group;\n if (!group || !group.members.delete(this)) return;\n if (flag !== false && instanceMap[this.selector] === this) {\n delete instanceMap[this.selector];\n const replacement = Array.from(group?.members ?? []).find((member) => member.selector === this.selector);\n if (replacement) instanceMap[this.selector] = replacement;\n }\n if (group?.members.size) {\n this.updateRequestCount();\n if (this !== group.renderer) this.group = void 0;\n return;\n }\n const renderer = group?.renderer ?? this;\n window.clearInterval(renderer.intervalId);\n window.clearTimeout(renderer.timeoutId);\n renderer.intervalId = void 0;\n renderer.timeoutId = void 0;\n if (renderer.containerNode && renderer.loadingElement) {\n renderer.containerNode.style.position = renderer.orginStylePosition || \"\";\n renderer.loadingElement.remove();\n renderer.loadingElement = null;\n }\n if (renderer.containerNode) loadingGroups.delete(renderer.containerNode);\n this.group = void 0;\n renderer.group = void 0;\n }\n /**\n * destroy loading instance\n *\n * @public\n * @static\n * @param {string} selector \n */\n static destroy(selector) {\n if (instanceMap[selector]) {\n const instance = instanceMap[selector];\n for (const member of Array.from(instance.group?.members ?? [instance])) member.hide();\n delete instanceMap[selector];\n }\n }\n}\nclass AjaxAbstract {\n constructor(options) {\n this.options = options;\n }\n // 객체 내부에 File/Blob/FileList가 있는지 재귀 검사\n containsFile(data) {\n if (!data) return false;\n if (typeof File !== \"undefined\" && (data instanceof File || data instanceof Blob)) return true;\n if (typeof FileList !== \"undefined\" && data instanceof FileList) return true;\n if (isArray(data)) {\n for (const item of data) {\n if (this.containsFile(item)) return true;\n }\n return false;\n }\n if (isObject(data)) {\n for (const key of Object.keys(data)) {\n if (this.containsFile(data[key])) return true;\n }\n }\n return false;\n }\n getRequestUrl(url, method, data, params) {\n return this.getUrlWithData(this.getUrlWithData(url, method, data), \"GET\", params);\n }\n isSuccess(status, opts) {\n return opts.validateStatus ? opts.validateStatus(status) : status >= 200 && status < 300;\n }\n // GET용: URL에 데이터를 쿼리 스트링으로 추가합니다.\n getUrlWithData(url, method, data) {\n if (method !== \"GET\") return url;\n if (!data) return url;\n if (isFormData(data)) return url;\n const qs = objectToQueryString(data);\n if (!qs) return url;\n const hashIndex = url.indexOf(\"#\");\n const base = hashIndex < 0 ? url : url.slice(0, hashIndex);\n const hash = hashIndex < 0 ? \"\" : url.slice(hashIndex);\n return base + (base.includes(\"?\") ? \"&\" : \"?\") + qs + hash;\n }\n // 단순 객체(파일 포함 가능)를 FormData로 변환\n buildFormDataFromObject(obj) {\n const form = new FormData();\n const appendValue = (key, value) => {\n if (value === null || value === void 0) {\n return;\n }\n if (typeof File !== \"undefined\" && (value instanceof File || value instanceof Blob)) {\n form.append(key, value);\n return;\n }\n if (typeof FileList !== \"undefined\" && value instanceof FileList) {\n for (let i = 0; i < value.length; i++) {\n form.append(key + (key.endsWith(\"[]\") ? \"\" : \"[]\"), value[i]);\n }\n return;\n }\n if (Array.isArray(value)) {\n for (const v of value) {\n if (typeof File !== \"undefined\" && (v instanceof File || v instanceof Blob)) {\n form.append(key + (key.endsWith(\"[]\") ? \"\" : \"[]\"), v);\n } else {\n form.append(key + (key.endsWith(\"[]\") ? \"\" : \"[]\"), typeof v === \"object\" ? JSON.stringify(v) : String(v));\n }\n }\n return;\n }\n if (isObject(value)) {\n form.append(key, JSON.stringify(value));\n return;\n }\n form.append(key, String(value));\n };\n if (isObject(obj)) {\n for (const k of Object.keys(obj)) {\n appendValue(k, obj[k]);\n }\n } else {\n appendValue(\"file\", obj);\n }\n return form;\n }\n}\nclass FetchAjax extends AjaxAbstract {\n constructor(options) {\n super(options);\n }\n // Fetch 요청을 처리합니다.\n async request(url, method, opts) {\n const hasFormData = isFormData(opts.data);\n const containsFile = !hasFormData && this.containsFile(opts.data);\n let preparedData = opts.data;\n if (containsFile && !hasFormData) {\n preparedData = this.buildFormDataFromObject(opts.data);\n }\n const finalUrl = this.getRequestUrl(url, method, preparedData, opts.params);\n const fetchHeaders = { ...opts.headers };\n let body = void 0;\n if (method !== \"GET\") {\n if (isFormData(preparedData)) {\n body = preparedData;\n if (fetchHeaders) {\n Object.keys(fetchHeaders).forEach((k) => {\n if (k.toLowerCase() === \"content-type\") delete fetchHeaders[k];\n });\n }\n } else if (containsFile) {\n body = preparedData;\n if (fetchHeaders) {\n Object.keys(fetchHeaders).forEach((k) => {\n if (k.toLowerCase() === \"content-type\") delete fetchHeaders[k];\n });\n }\n } else if (isObject(preparedData)) {\n const contentType = fetchHeaders && (fetchHeaders[\"Content-Type\"] || fetchHeaders[\"content-type\"]) || \"\";\n if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n body = objectToQueryString(preparedData);\n } else {\n if (fetchHeaders && !(\"Content-Type\" in fetchHeaders) && !(\"content-type\" in fetchHeaders)) {\n fetchHeaders[\"Content-Type\"] = \"application/json\";\n }\n body = JSON.stringify(preparedData);\n }\n } else if (preparedData != null) {\n body = preparedData;\n }\n }\n const { loadingInstance, abortController } = this.prepareRequest(opts);\n let timeoutId;\n let isTimeout = false;\n const onAbort = () => abortController?.abort();\n opts.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (opts.signal?.aborted) onAbort();\n const fetchOptions = {\n method,\n headers: fetchHeaders,\n body,\n signal: abortController?.signal ?? opts.signal,\n credentials: opts.credentials\n };\n try {\n if (opts.timeout && opts.timeout > 0 && abortController) {\n timeoutId = setTimeout(() => {\n isTimeout = true;\n abortController.abort();\n }, opts.timeout);\n }\n if (fetchOptions.signal?.aborted) throw Object.assign(new Error(\"Request aborted\"), { name: \"AbortError\" });\n const response = await fetch(finalUrl, fetchOptions);\n const text = await response.text();\n let data = text;\n if (opts.responseType === \"json\") {\n try {\n data = JSON.parse(text);\n } catch (e) {\n data = { error: e.message };\n }\n }\n if (!this.isSuccess(response.status, opts)) {\n return Promise.reject(\n this.createError({\n type: \"http\",\n status: response.status,\n statusText: response.statusText,\n responseText: text,\n xhr: response,\n loadingInstance\n })\n );\n }\n const result = {\n data,\n status: response.status,\n responseText: text,\n config: opts,\n xhr: response,\n headers: this.parseFetchHeaders(response),\n loadingInstance\n };\n opts.beforeResponse?.(result, response, loadingInstance);\n return result;\n } catch (err) {\n if (timeoutId) clearTimeout(timeoutId);\n let errorType = \"network\";\n if (abortController?.signal.aborted || opts.signal?.aborted || err?.name === \"AbortError\") {\n errorType = isTimeout ? \"timeout\" : \"abort\";\n }\n return Promise.reject(\n this.createError({\n type: errorType,\n error: err,\n loadingInstance\n })\n );\n } finally {\n opts.signal?.removeEventListener(\"abort\", onAbort);\n if (timeoutId) clearTimeout(timeoutId);\n }\n }\n // 요청 준비를 처리합니다.\n prepareRequest(opts) {\n let loadingInstance = null;\n let abortController = typeof AbortController !== \"undefined\" ? new AbortController() : null;\n const loaderSelector = opts.enableLoader === false ? null : opts.loaderContainer;\n if (loaderSelector) {\n if (opts.loaderOption?.enableCancelButton && typeof AbortController !== \"undefined\") {\n const originalCallback = opts.loaderOption.callback;\n opts.loaderOption = { ...opts.loaderOption, callback: () => {\n abortController.abort();\n return originalCallback?.(opts);\n } };\n }\n loadingInstance = new Loading(loaderSelector, { ...opts.loaderOption, requestCount: 1 });\n }\n try {\n opts.beforeRequest?.(opts, null, loadingInstance);\n } catch (error) {\n loadingInstance?.hide();\n throw error;\n }\n return { loadingInstance, abortController };\n }\n // 응답 headers를 파싱합니다.\n parseFetchHeaders(response) {\n const headersObj = {};\n response.headers.forEach((value, key) => {\n headersObj[key] = value;\n });\n return headersObj;\n }\n // 오류 객체를 생성합니다.\n createError(params) {\n const { type, xhr, status, statusText, responseText, error, loadingInstance } = params;\n const reqXhr = xhr || {};\n return {\n type,\n status: status ?? reqXhr.status ?? 0,\n statusText: statusText ?? reqXhr.statusText ?? \"\",\n responseText: responseText ?? \"\",\n error: error ?? null,\n xhr,\n loadingInstance\n };\n }\n}\nclass XHRAjax extends AjaxAbstract {\n constructor(options) {\n super(options);\n }\n async request(url, method, opts) {\n if (opts.credentials === \"omit\") {\n throw new TypeError('credentials=\"omit\" requires fetch; XHR cannot omit same-origin cookies.');\n }\n let cleanup = () => {\n };\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n const hasFormData = isFormData(opts.data);\n const containsFile = !hasFormData && this.containsFile(opts.data);\n const preparedData = containsFile ? this.buildFormDataFromObject(opts.data) : opts.data;\n const finalUrl = this.getRequestUrl(url, method, preparedData, opts.params);\n xhr.open(method, finalUrl, opts.async !== false);\n if (opts.timeout && opts.timeout > 0) xhr.timeout = opts.timeout;\n if (opts.credentials !== void 0) xhr.withCredentials = opts.credentials === \"include\";\n this.setHeaders(xhr, opts, hasFormData || containsFile);\n let loadingInstance = null;\n let settled = false;\n const fail = (type, error) => {\n if (settled) return;\n settled = true;\n reject(this.createError({ type, xhr, loadingInstance, error }));\n };\n const onAbort = () => {\n xhr.abort();\n fail(\"abort\");\n };\n cleanup = () => opts.signal?.removeEventListener(\"abort\", onAbort);\n opts.signal?.addEventListener(\"abort\", onAbort, { once: true });\n xhr.onreadystatechange = () => {\n if (settled || xhr.readyState !== XMLHttpRequest.DONE || xhr.status === 0) return;\n try {\n if (!this.isSuccess(xhr.status, opts)) {\n fail(\"http\");\n return;\n }\n const result = { ...this.parseResponse(xhr, opts), xhr, config: opts, loadingInstance };\n opts.beforeResponse?.(result, xhr, loadingInstance);\n settled = true;\n resolve(result);\n } catch (error) {\n fail(\"network\", error);\n }\n };\n xhr.onerror = () => fail(\"network\");\n xhr.ontimeout = () => fail(\"timeout\");\n xhr.onabort = () => fail(\"abort\");\n if (opts.onUploadProgress && xhr.upload) {\n xhr.upload.onprogress = (ev) => opts.onUploadProgress({ xhr, ev });\n }\n if (opts.onDownloadProgress) {\n xhr.onprogress = (ev) => opts.onDownloadProgress({ xhr, ev });\n }\n try {\n if (opts.signal?.aborted) {\n fail(\"abort\");\n return;\n }\n loadingInstance = this.prepareRequest(opts, xhr).loadingInstance;\n opts.beforeRequest?.(opts, xhr, loadingInstance);\n if (opts.signal?.aborted || settled) {\n fail(\"abort\");\n return;\n }\n if (method === \"GET\" || preparedData == null) {\n xhr.send();\n } else if (isFormData(preparedData)) {\n xhr.send(preparedData);\n } else if (isObject(preparedData)) {\n const contentType = Object.entries(opts.headers || {}).find(([key]) => key.toLowerCase() === \"content-type\")?.[1] || \"\";\n xhr.send(String(contentType).includes(\"application/x-www-form-urlencoded\") ? objectToQueryString(preparedData) : JSON.stringify(preparedData));\n } else {\n xhr.send(preparedData);\n }\n } catch (error) {\n fail(\"network\", error);\n }\n }).finally(() => cleanup());\n }\n parseResponse(xhr, opts) {\n let responseText = xhr.responseText;\n let data = responseText;\n if (opts.responseType === \"json\") {\n try {\n data = JSON.parse(xhr.responseText);\n } catch (e) {\n data = { error: e.message };\n }\n }\n return {\n data,\n status: xhr.status,\n readyState: xhr.readyState,\n responseText,\n headers: this.getResponseHeaders(xhr)\n };\n }\n // 응답 headers를 파싱합니다.\n getResponseHeaders(xhr) {\n const headersObj = {};\n const allHeaders = xhr.getAllResponseHeaders();\n const lines = allHeaders.trim().split(/[\\r\\n]+/);\n for (const line of lines) {\n const parts = line.split(\": \");\n const key = parts.shift();\n const value = parts.join(\": \");\n if (key) headersObj[key] = value;\n }\n return headersObj;\n }\n // 요청 headers를 설정합니다.\n // isFormData가 true이면 Content-Type을 설정하지 않아 브라우저가 boundary 포함한 적절한 헤더를 생성하도록 함\n setHeaders(xhr, opts, isFormData2 = false) {\n const headers = { ...opts.headers };\n if (!isFormData2) {\n if (!Object.keys(headers).some((key) => key.toLowerCase() === \"content-type\")) {\n headers[\"Content-Type\"] = isObject(opts.data) ? \"application/json\" : \"application/x-www-form-urlencoded\";\n }\n for (const key of Object.keys(headers)) {\n if (headers[key]) xhr.setRequestHeader(key, headers[key]);\n }\n } else {\n for (const key of Object.keys(headers)) {\n if (key.toLowerCase() === \"content-type\") continue;\n if (headers[key]) xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n // 요청 준비를 처리합니다.\n prepareRequest(opts, xhr) {\n let loadingInstance = null;\n const loaderSelector = opts.enableLoader === false ? null : opts.loaderContainer;\n if (loaderSelector) {\n if (opts.loaderOption?.enableCancelButton) {\n const originalCallback = opts.loaderOption.callback;\n opts.loaderOption = { ...opts.loaderOption, callback: () => {\n xhr.abort();\n return originalCallback?.(opts);\n } };\n }\n loadingInstance = new Loading(loaderSelector, { ...opts.loaderOption, requestCount: 1 });\n }\n return { loadingInstance };\n }\n // 오류 객체를 생성합니다. \n createError(params) {\n const { type, xhr, status, statusText, responseText, error, loadingInstance } = params;\n return {\n type,\n status: status ?? (xhr ? xhr.status : 0),\n statusText: statusText ?? (xhr ? xhr.statusText : \"\"),\n responseText: responseText ?? (xhr ? xhr.responseText : \"\"),\n error: error ?? null,\n xhr,\n loadingInstance\n };\n }\n}\nclass Ajax {\n constructor(options) {\n this.pendingRequestMap = /* @__PURE__ */ new Map();\n this.nextRequestId = 0;\n this.options = objectDeepMerge(this.createGlobalAjaxOptions(), options || {}, { _excludeKeys: [\"signal\", \"params\", \"loaderContainer\"] });\n this.options.signal = options?.signal;\n this.options.params = options?.params;\n this.options.loaderContainer = options?.loaderContainer;\n this.fetchAjax = new FetchAjax(this.options);\n this.xhrAjax = new XHRAjax(this.options);\n this.isFetchSupported = typeof window !== \"undefined\" && \"fetch\" in window;\n }\n /**\n * 진행 중인 요청의 스냅샷을 반환합니다. 동일 URL 요청도 별도 ID로 구분합니다.\n * @returns 진행 중인 요청 Map의 복사본\n */\n get pendingRequests() {\n return new Map(this.pendingRequestMap);\n }\n createGlobalAjaxOptions() {\n return {\n baseUrl: \"\",\n method: \"POST\",\n timeout: -1,\n responseType: \"json\",\n headers: { \"X-Requested-With\": \"XMLHttpRequest\" },\n loaderContainer: \"\",\n enableDefaultLoader: false,\n loaderOption: {},\n validMethods: [\"GET\", \"POST\", \"PUT\", \"DELETE\"],\n errorAlertView: false,\n ignoreResultCheck: false,\n fetchMode: \"xhr\"\n };\n }\n createDefaultOptions() {\n const opts = this.options;\n return {\n url: \"\",\n signal: opts.signal,\n credentials: opts.credentials,\n params: opts.params,\n enableLoader: opts.enableLoader,\n fetchMode: opts.fetchMode,\n validateStatus: opts.validateStatus,\n beforeRequest: opts.beforeRequest,\n beforeResponse: opts.beforeResponse,\n method: opts.method,\n timeout: opts.timeout,\n responseType: opts.responseType,\n headers: opts.headers,\n loaderContainer: opts.loaderContainer,\n loaderOption: opts.loaderOption,\n errorAlertView: opts.errorAlertView,\n ignoreResultCheck: opts.ignoreResultCheck\n };\n }\n /**\n * Ajax 인스턴스를 생성합니다.\n * @param {?AjaxOptions} [options] ajax 옵션\n * @returns {Ajax} Ajax 인스턴스\n */\n static create(options) {\n return new Ajax(options);\n }\n async _request(url, method, options, useFetch = true) {\n url = this.options.baseUrl ? this.options.baseUrl + url : url;\n const data = options?.data;\n const opts = objectDeepMerge({ ...this.createDefaultOptions(), signal: void 0, params: void 0, loaderContainer: void 0 }, options || {}, { _excludeKeys: [\"data\", \"signal\", \"params\", \"loaderContainer\"] });\n opts.data = data;\n opts.signal = options?.signal ?? this.options.signal;\n opts.params = { ...this.options.params, ...options?.params };\n opts.loaderContainer = options?.loaderContainer ?? this.options.loaderContainer;\n const ajaxMethod = (method || opts.method || \"GET\").toUpperCase();\n if (!this.options.validMethods?.includes(ajaxMethod)) {\n return Promise.reject({\n type: \"http\",\n status: 405,\n readyState: 0,\n statusText: \"Invalid Method\",\n responseText: `Invalid HTTP method: ${ajaxMethod}`,\n xhr: null,\n loadingInstance: null\n });\n }\n opts.loaderContainer = opts.enableLoader === false ? null : opts.loaderContainer || (opts.enableLoader === true || this.options.enableDefaultLoader ? \"body\" : null);\n const id = ++this.nextRequestId;\n this.pendingRequestMap.set(id, Object.freeze({ id, url, method: ajaxMethod, startedAt: Date.now() }));\n let loadingInstance = null;\n const beforeRequest = opts.beforeRequest;\n opts.beforeRequest = (value, xhr, loading) => {\n loadingInstance = loading ?? null;\n beforeRequest?.(value, xhr, loading);\n };\n try {\n const response = await (useFetch && this.isFetchSupported && opts.fetchMode === \"fetch\" ? this.fetchAjax.request(url, ajaxMethod, opts) : this.xhrAjax.request(url, ajaxMethod, opts));\n loadingInstance = loadingInstance ?? response?.loadingInstance ?? null;\n return response;\n } catch (error) {\n loadingInstance = loadingInstance ?? error?.loadingInstance;\n throw error;\n } finally {\n this.pendingRequestMap.delete(id);\n loadingInstance?.hide();\n }\n }\n /**\n * 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*}\n */\n request(options, useFetch = true) {\n const url = options?.url || \"\";\n return this._request(url, options?.method, options, useFetch);\n }\n /**\n * get 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*}\n */\n get(url, options, useFetch = true) {\n return this._request(url, \"GET\", options, useFetch);\n }\n /**\n * post 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*}\n */\n post(url, options, useFetch = true) {\n return this._request(url, \"POST\", options, useFetch);\n }\n /**\n * put 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*}\n */\n put(url, options, useFetch = true) {\n return this._request(url, \"PUT\", options, useFetch);\n }\n /**\n * DELETE 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*}\n */\n delete(url, options, useFetch = true) {\n return this._request(url, \"DELETE\", options, useFetch);\n }\n}\nfunction eqAttributeValue(element, attr, value) {\n return element.getAttribute(attr) == value;\n}\nfunction addAttr(el, attrs) {\n for (let key in attrs) {\n el.setAttribute(key, attrs[key]);\n }\n}\nfunction removeAttr(element, ...attrKey) {\n let elements;\n if (element instanceof HTMLElement) {\n elements = [element];\n } else {\n elements = element;\n }\n elements.forEach((ele) => {\n for (let attr of attrKey) {\n ele.removeAttribute(attr);\n }\n });\n}\nfunction keyboardEventKey(e) {\n return (e.key || \"\").toLowerCase();\n}\nfunction eventKeyCode(e) {\n const evt = e;\n if (typeof evt.keyCode === \"number\" && evt.keyCode > 0) {\n return evt.keyCode;\n }\n if (typeof evt.which === \"number\" && evt.which > 0) {\n return evt.which;\n }\n return void 0;\n}\nfunction isShiftKey(evt) {\n return evt.shiftKey;\n}\nfunction isCtrlKey(evt) {\n return evt.ctrlKey;\n}\nfunction isSpacebar(evt) {\n const event = evt;\n if (event.key === \" \" || event.code === \"Space\") {\n return true;\n }\n return false;\n}\nfunction isEnter(evt) {\n const event = evt;\n if (event.key === \"Enter\" || event.code === \"Enter\") {\n return true;\n }\n return false;\n}\nfunction stopPreventCancel(e) {\n e.preventDefault();\n e.stopPropagation();\n}\nfunction eventPosition(e) {\n let evt;\n if (typeof TouchEvent !== \"undefined\" && e instanceof TouchEvent && e.touches.length > 0) {\n evt = e.touches[0];\n } else if (e instanceof MouseEvent) {\n evt = e;\n } else {\n evt = { pageX: 0, pageY: 0 };\n }\n return {\n x: evt.pageX,\n y: evt.pageY\n };\n}\nfunction isClickEvent(e) {\n if (e.type === \"touchstart\") {\n return true;\n }\n if (e instanceof MouseEvent) {\n return e.button === 0;\n }\n return false;\n}\nclass EventManager {\n constructor() {\n this.registrations = /* @__PURE__ */ new Map();\n }\n on(el, type, listener, selector, fnOpts) {\n if (el == null || typeof listener !== \"function\") return;\n for (const target of $querySelectorList(el)) {\n for (const eventType of type.trim().split(/\\s+/).filter(Boolean)) {\n const handler = (event) => {\n let matched;\n if (typeof selector === \"string\" && selector.trim()) {\n const origin = event.target instanceof Element ? event.target : event.target?.parentElement;\n matched = origin?.closest(selector) ?? void 0;\n if (!matched || !target.contains(matched)) return;\n }\n if (listener(event, matched ?? target) === false) {\n event.stopImmediatePropagation();\n event.preventDefault();\n }\n };\n const capture = typeof fnOpts === \"boolean\" ? fnOpts : !!fnOpts?.capture;\n target.addEventListener(eventType.split(\".\")[0], handler, fnOpts);\n const entries = this.registrations.get(target) ?? [];\n entries.push({ type: eventType, handler, capture });\n this.registrations.set(target, entries);\n }\n }\n }\n off(el, type) {\n if (el == null) return el;\n const types = new Set(type.trim().split(/\\s+/));\n for (const target of $querySelectorList(el)) {\n const remaining = (this.registrations.get(target) ?? []).filter((entry) => {\n if (!types.has(entry.type)) return true;\n target.removeEventListener(entry.type.split(\".\")[0], entry.handler, entry.capture);\n return false;\n });\n if (remaining.length) this.registrations.set(target, remaining);\n else this.registrations.delete(target);\n }\n }\n offAll() {\n for (const [target, entries] of this.registrations) {\n for (const entry of entries) {\n target.removeEventListener(entry.type.split(\".\")[0], entry.handler, entry.capture);\n }\n }\n this.registrations.clear();\n }\n}\nfunction formatMessage(msgFormat, msgParam) {\n if (!msgParam) return msgFormat;\n return msgFormat.replace(/\\{([A-Za-z0-9_.]+)\\}/g, (match, key, offset) => {\n const previous = msgFormat[offset - 1];\n if (previous === \"$\" || previous === \"\\\\\") return match;\n return key in msgParam ? String(msgParam[key]) : match;\n });\n}\nconst VERSION = `${\"0.0.10\"}`;\nexport {\n $querySelector,\n $querySelectorList,\n Ajax,\n EventManager,\n FUNCTION_REF_PREFIX,\n Loading,\n VERSION,\n addAttr,\n addClass,\n addStyleCss,\n addValueIfMissing,\n after,\n allTrim,\n append,\n arrayCopy,\n arrayDeepMerge,\n arrayEquals,\n assertScope,\n before,\n calcSummary,\n camelToKebab,\n camelToUnderscore,\n capitalize,\n clamp,\n cloneConfig,\n cloneJson,\n compareValues,\n computeSummary,\n convertHtmlToText,\n createClassNamer,\n createErrorFactory,\n createHTMLElement,\n createMatcher,\n createUuid,\n debounce,\n deepCopy,\n downloadText,\n downloadUrl,\n eqAttributeValue,\n escapeCellValue,\n escapeHTML,\n eventKeyCode,\n eventPosition,\n fieldDisplayName,\n fieldsOf,\n findClosest,\n formatDate,\n formatMessage,\n formatNumber,\n formatValue,\n getBrowserSize,\n getElementRect,\n getHashCode,\n getIn,\n getPagingInfo,\n getPagingParamToPagingInfo,\n getScrollPosition,\n getURLParam,\n getURLParams,\n hasClass,\n hasProperty,\n highlightSingleMatch,\n innerLayerPosition,\n insertToArray,\n intValue,\n isArray,\n isBlank,\n isBoolean,\n isClickEvent,\n isCtrlKey,\n isDate,\n isElement,\n isEmpty,\n isEnter,\n isEsc,\n isFormData,\n isFunction,\n isHTMLElement,\n isMouseMoved,\n isNil,\n isNumber,\n isNumeric,\n isObject,\n isPlainObject,\n isPrimaryPointer,\n isSafeUrl,\n isSameValue,\n isSequential,\n isShiftKey,\n isSpacebar,\n isString,\n isThenable,\n isUndefined,\n isVisible,\n jsonEqual,\n keyboardEventKey,\n leftPad,\n leftPadClamp,\n leftTrim,\n lowerCase,\n matchCount,\n matchRow,\n measureScrollTarget,\n moveItem,\n normalizeCssLength,\n objectDeepMerge,\n objectToQueryString,\n outerLayerPosition,\n parseClipboard,\n parseConfigJson,\n parseConfigString,\n parseJson,\n parseTsv,\n prepend,\n readTextFile,\n removeAttr,\n removeClass,\n removeItem,\n renderTemplate,\n replaceParameter,\n resolveClassName,\n resolveScrollElement,\n resolveScrollTarget,\n restoreFunctions,\n rightPad,\n rightPadClamp,\n rightTrim,\n sameValue,\n sanitizeHtml,\n serializeSvg,\n setIn,\n sortRows,\n stopPreventCancel,\n stringSplit,\n stringifyWithFunctions,\n styleClassSplit,\n svgToDataURL,\n templateToElement,\n toDataAttribute,\n toListValue,\n toNumber,\n toObjectForm,\n toOptionObject,\n toTimestamp,\n toTsv,\n toggleClass,\n trim,\n unXss,\n upperCase,\n uuid,\n writeClipboard,\n xss\n};\n//# sourceMappingURL=index.js.map\n","import { leftPad, isNumeric, leftPadClamp, isFunction } from \"@daracl/core\";\nlet localeMessage = {\n year: \"Year\",\n month: \"Month\",\n day: \"Day\",\n am: \"AM\",\n pm: \"PM\",\n today: \"Today\",\n ok: \"Ok\",\n months: {\n full: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n abbr: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n },\n weeks: {\n full: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n abbr: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"]\n }\n};\nclass Language {\n constructor() {\n this.lang = localeMessage;\n }\n setDefaultMessage(lang) {\n localeMessage = Object.assign(localeMessage, lang);\n }\n /**\n * 다국어 메시지 등록\n *\n * @public\n * @param {?Message} [lang] 둥록할 메시지\n */\n set(lang) {\n this.lang = Object.assign({}, localeMessage, lang);\n }\n /**\n * 메시지 얻기\n *\n * @public\n * @param {string} messageKey 메시지 키\n * @returns {*}\n */\n getMessage(messageKey) {\n return this.lang[messageKey];\n }\n getMonthsMessage(idx, mode = \"abbr\") {\n return this.lang.months[mode][idx] || \"\";\n }\n getWeeksMessage(idx, mode = \"abbr\") {\n return this.lang.weeks[mode][idx] || \"\";\n }\n getMonthsIdx(val, mode = \"abbr\") {\n return mode == \"full\" ? this.lang.months.full.indexOf(val) : this.lang.months.abbr.indexOf(val);\n }\n getWeeksIdx(val, mode = \"abbr\") {\n return mode == \"full\" ? this.lang.weeks.full.indexOf(val) : this.lang.weeks.abbr.indexOf(val);\n }\n}\nconst Lanauage = new Language();\nconst EXPRESSIONS_FORMAT = [\"YY\", \"YYYY\", \"MMMM\", \"MMM\", \"MM\", \"M\", \"dddd\", \"ddd\", \"dd\", \"d\", \"DD\", \"D\", \"S\", \"HH\", \"H\", \"hh\", \"h\", \"mm\", \"m\", \"ss\", \"s\", \"SSS\", \"zzzz\", \"zzz\", \"zz\", \"z\", \"a\", \"A\"];\nlet MAX_CHAR_LENGTH = 0;\nlet DEFAULT_FORMAT = {\n year: \"YYYY\",\n month: \"YYYY-MM\",\n date: \"YYYY-MM-DD\",\n time: \"HH:mm\",\n datetime: \"YYYY-MM-DD HH:mm\"\n};\nconst DAY_STYLE_CLASS = [\"ddtp-sun\", \"ddtp-mon\", \"ddtp-tue\", \"ddtp-wed\", \"ddtp-thu\", \"ddtp-fri\", \"ddtp-sat\"];\nvar DateViewMode = /* @__PURE__ */ ((DateViewMode2) => {\n DateViewMode2[\"year\"] = \"year\";\n DateViewMode2[\"month\"] = \"month\";\n DateViewMode2[\"date\"] = \"date\";\n DateViewMode2[\"datetime\"] = \"datetime\";\n DateViewMode2[\"time\"] = \"time\";\n return DateViewMode2;\n})(DateViewMode || {});\nEXPRESSIONS_FORMAT.forEach((item) => {\n MAX_CHAR_LENGTH = Math.max(item.length, MAX_CHAR_LENGTH);\n});\nconst format = (date, format2) => {\n format2 = format2 || \"YYYY-MM-DD\";\n const len = format2.length;\n let result = [];\n for (let i = 0; i < len; ) {\n let minLen = Math.min(MAX_CHAR_LENGTH, len - i);\n let j = minLen;\n for (; j > 0; j--) {\n const v = format2.substring(i, i + j);\n if (EXPRESSIONS_FORMAT.includes(v)) {\n try {\n result.push(expressionsFunction$1[v](date));\n } catch (e) {\n console.log(EXPRESSIONS_FORMAT.includes(v), v, e);\n }\n break;\n }\n }\n if (j < 1) {\n result.push(format2.substring(i, i + 1));\n i += 1;\n } else {\n i += j;\n }\n }\n return result.join(\"\");\n};\nconst expressionsFunction$1 = {\n YY: (date) => {\n return String(date.getFullYear()).slice(-2);\n },\n YYYY: (date) => {\n return String(date.getFullYear());\n },\n M: (date) => {\n return String(date.getMonth() + 1);\n },\n MM: (date) => {\n return leftPad(date.getMonth() + 1, 2);\n },\n MMM: (date) => {\n return Lanauage.getMonthsMessage(date.getMonth());\n },\n MMMM: (date) => {\n return Lanauage.getMonthsMessage(date.getMonth(), \"full\");\n },\n D: (date) => {\n return String(date.getDate());\n },\n DD: (date) => {\n return leftPad(date.getDate(), 2);\n },\n d: (date) => {\n return String(date.getDate());\n },\n dd: (date) => {\n return leftPad(date.getDate(), 2);\n },\n ddd: (date) => {\n return Lanauage.getWeeksMessage(date.getDay());\n },\n dddd: (date) => {\n return Lanauage.getWeeksMessage(date.getDay(), \"full\");\n },\n H: (date) => {\n return String(date.getHours());\n },\n HH: (date) => {\n return leftPad(date.getHours(), 2);\n },\n h: (date) => {\n return getH(date);\n },\n hh: (date) => {\n return leftPad(getH(date), 2);\n },\n a: (date) => {\n return String(date.getFullYear()).slice(-2);\n },\n A: (date) => {\n return getMeridiem(date);\n },\n m: (date) => {\n return String(date.getMinutes());\n },\n mm: (date) => {\n return leftPad(date.getMinutes(), 2);\n },\n s: (date) => {\n return String(date.getSeconds());\n },\n ss: (date) => {\n return leftPad(date.getSeconds(), 2);\n },\n SSS: (date) => {\n return leftPad(date.getMilliseconds(), 3);\n }\n};\nfunction getH(date) {\n let hour = date.getHours();\n if (hour > 12) {\n hour -= 12;\n } else if (hour < 1) {\n hour = 12;\n }\n return hour;\n}\nfunction getMeridiem(date, isUpper, isShort) {\n const hour = date.getHours();\n let m = hour < 12 ? \"am\" : \"pm\";\n m = Lanauage.getMessage(m);\n m = m.toUpperCase();\n return m;\n}\nconst parser = (dateStr, format2) => {\n if (dateStr.length > 1e3) {\n return null;\n }\n format2 = format2 || DEFAULT_FORMAT.date;\n const dateInfo = {\n year: (/* @__PURE__ */ new Date()).getFullYear(),\n month: 0,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n isPm: false,\n isH: false,\n charIdx: 0\n };\n const len = format2.length;\n let startIdx = 0;\n for (let i = 0; i < len; ) {\n let minLen = Math.min(MAX_CHAR_LENGTH, len - i);\n let j = minLen;\n for (; j > 0; j--) {\n const v = format2.substring(i, i + j);\n if (EXPRESSIONS_FORMAT.includes(v)) {\n const expInfo = expressionsFunction[v];\n const val = matchFind(dateStr.substring(startIdx), expInfo[0]);\n expInfo[1](dateInfo, val);\n startIdx += val.length;\n break;\n }\n }\n if (j < 1) {\n i += 1;\n startIdx += 1;\n } else {\n i += j;\n }\n }\n if (dateInfo.hour != null && !dateInfo.isH) {\n if (dateInfo.isPm && +dateInfo.hour !== 12) {\n dateInfo.hour = +dateInfo.hour + 12;\n } else if (!dateInfo.isPm && +dateInfo.hour === 12) {\n dateInfo.hour = 0;\n }\n }\n let date;\n date = new Date(dateInfo.year, dateInfo.month, dateInfo.day, dateInfo.hour, dateInfo.minute, dateInfo.second, dateInfo.millisecond);\n return date;\n};\nconst matchFind = (val, regexp) => {\n const match = regexp.exec(val);\n return match == null ? \"\" : match[0];\n};\nconst digitsCheck = {\n twoOptional: /\\d\\d?/,\n two: /\\d\\d/,\n three: /\\d{3}/,\n four: /\\d{4}/\n};\nconst word = /[^\\s]+/;\nconst expressionsFunction = {\n YY: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.year = +((\"\" + (/* @__PURE__ */ new Date()).getFullYear()).substring(0, 2) + val);\n return dateInfo;\n }\n ],\n YYYY: [\n digitsCheck[\"four\"],\n (dateInfo, val) => {\n dateInfo.year = +val;\n return dateInfo;\n }\n ],\n M: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.month = +val - 1;\n return dateInfo;\n }\n ],\n MM: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.month = +val - 1;\n return dateInfo;\n }\n ],\n MMM: [\n word,\n (dateInfo, val) => {\n dateInfo.month = Lanauage.getMonthsIdx(val, \"abbr\");\n return dateInfo;\n }\n ],\n MMMM: [\n word,\n (dateInfo, val) => {\n dateInfo.month = Lanauage.getMonthsIdx(val, \"full\");\n return dateInfo;\n }\n ],\n D: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.day = +val;\n return dateInfo;\n }\n ],\n DD: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.day = +val;\n return dateInfo;\n }\n ],\n d: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.day = +val;\n return dateInfo;\n }\n ],\n dd: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.day = +val;\n return dateInfo;\n }\n ],\n ddd: [\n word,\n (dateInfo, val) => {\n return dateInfo;\n }\n ],\n dddd: [\n word,\n (dateInfo, val) => {\n return dateInfo;\n }\n ],\n H: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.hour = +val;\n dateInfo.isH = true;\n return dateInfo;\n }\n ],\n HH: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.hour = +val;\n dateInfo.isH = true;\n return dateInfo;\n }\n ],\n h: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.hour = +val;\n return dateInfo;\n }\n ],\n hh: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.hour = +val;\n return dateInfo;\n }\n ],\n a: [\n word,\n (dateInfo, val) => {\n if (Lanauage.getMessage(\"am\") != val.toLowerCase()) {\n dateInfo.isPm = true;\n }\n return dateInfo;\n }\n ],\n A: [\n word,\n (dateInfo, val) => {\n if (Lanauage.getMessage(\"am\") != val.toLowerCase()) {\n dateInfo.isPm = true;\n }\n return dateInfo;\n }\n ],\n m: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.minute = +val;\n return dateInfo;\n }\n ],\n mm: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.minute = +val;\n return dateInfo;\n }\n ],\n s: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.second = +val;\n return dateInfo;\n }\n ],\n ss: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.second = +val;\n return dateInfo;\n }\n ],\n SSS: [\n digitsCheck[\"three\"],\n (dateInfo, val) => {\n dateInfo.millisecond = +val;\n return dateInfo;\n }\n ]\n};\nfunction closestElement(el, checkElement) {\n let currentEl = el;\n while (currentEl) {\n if (currentEl == checkElement) {\n return true;\n }\n currentEl = currentEl.parentElement;\n }\n return false;\n}\nclass DaraDate {\n constructor(dt) {\n this.date = dt;\n }\n setYear(num) {\n this.date.setFullYear(num);\n return this;\n }\n addYear(num) {\n this.date.setFullYear(this.date.getFullYear() + num);\n return this;\n }\n addMonth(num) {\n this.date.setMonth(this.date.getMonth() + num);\n return this;\n }\n setMonth(num) {\n this.date.setMonth(num);\n return this;\n }\n setDate(num) {\n this.date.setDate(num);\n return this;\n }\n addDate(num) {\n this.date.setDate(this.date.getDate() + num);\n return this;\n }\n addWeek(num) {\n this.date.setDate(this.date.getDate() + num * 7);\n return this;\n }\n addHours(num) {\n this.date.setHours(this.date.getHours() + num);\n return this;\n }\n setHour(num) {\n this.date.setHours(num);\n return this;\n }\n addMinutes(num) {\n this.date.setMinutes(this.date.getMinutes() + num);\n return this;\n }\n setMinutes(num) {\n this.date.setMinutes(num);\n return this;\n }\n addSeconds(num) {\n this.date.setSeconds(this.date.getSeconds() + num);\n return this;\n }\n addMilliseconds(num) {\n this.date.setMilliseconds(this.date.getMilliseconds() + num);\n return this;\n }\n compare(date) {\n if (this.date.valueOf() < date.valueOf()) {\n return -1;\n } else if (this.date.valueOf() > date.valueOf()) {\n return 1;\n }\n return 0;\n }\n getYear() {\n return this.date.getFullYear();\n }\n getMonth() {\n return this.date.getMonth() + 1;\n }\n getDate() {\n return this.date.getDate();\n }\n getDay() {\n return this.date.getDay();\n }\n getTime() {\n return this.date.getTime();\n }\n format(format$1) {\n return format(this.date, format$1);\n }\n clone() {\n return new DaraDate(new Date(this.date.valueOf()));\n }\n}\nlet DEFAULT_OPTIONS = {\n inline: false,\n // layer or innerhtml\n weekStartDay: 0,\n initialDate: \"\",\n autoClose: true,\n isRTL: false,\n mode: DateViewMode.date,\n enableTodayBtn: false,\n showMonthAfterYear: false,\n isPositionFixed: false,\n format: \"\",\n zIndex: 1e3,\n minDate: \"\",\n maxDate: \"\",\n beforeDrawDate: (dt) => {\n return {\n check: false,\n style: \"\",\n tooltip: \"\"\n };\n }\n};\nfunction hiddenElement() {\n var _a;\n if (document.getElementById(\"hiddenDaraDatetimeElement\") == null) {\n (_a = document.querySelector(\"body\")) == null ? void 0 : _a.insertAdjacentHTML(\"beforeend\", `<div id=\"hiddenDaraDatetimeElement\" class=\"daracl-datetime-hidden\"></div>`);\n }\n return document.getElementById(\"hiddenDaraDatetimeElement\");\n}\nlet daraDatetimeIdx = 0;\nconst _DateTimePicker = class _DateTimePicker {\n constructor(selector, options, message) {\n var _a;\n this.isInput = false;\n this.isVisible = false;\n this.minYear = -1;\n this.maxYear = -1;\n this.minMonth = -1;\n this.maxMonth = -1;\n this.dayOrder = [0, 1, 2, 3, 4, 5, 6];\n this._documentClickEvent = (e) => {\n if (this.isVisible && e.target != this.targetElement && !closestElement(e.target, this.datetimeElement)) {\n this.hide();\n }\n };\n this.options = Object.assign({}, DEFAULT_OPTIONS, options);\n daraDatetimeIdx += 1;\n let selectorElement;\n if (typeof selector === \"string\") {\n selectorElement = document.querySelector(selector);\n } else {\n selectorElement = selector;\n }\n if (!selectorElement) {\n throw new Error(`${selector} datetimepicker element not found`);\n }\n this._viewMode = Object.keys(DateViewMode).includes(this.options.mode) ? this.options.mode : DateViewMode.date;\n this.initMode = this._viewMode;\n Lanauage.set(message);\n if (this.initMode == DateViewMode.year) {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.year;\n } else if (this.initMode == DateViewMode.month) {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.month;\n } else if (this.initMode == DateViewMode.time) {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.time;\n } else if (this.initMode == DateViewMode.datetime) {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.datetime;\n } else {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.date;\n }\n let viewDate;\n if (this.options.initialDate) {\n if (typeof this.options.initialDate === \"string\") {\n viewDate = new DaraDate(parser(this.options.initialDate, this.dateFormat) || /* @__PURE__ */ new Date());\n } else {\n viewDate = new DaraDate(this.options.initialDate);\n }\n } else {\n viewDate = new DaraDate(/* @__PURE__ */ new Date());\n this.options.initialDate = viewDate.format(this.dateFormat);\n }\n this.setWeekDays();\n this.todayDate = viewDate.format(DEFAULT_FORMAT.date);\n this.currentDate = viewDate;\n this.targetElement = selectorElement;\n this.minDate = this._minDate();\n this.maxDate = this._maxDate();\n if (this.options.inline) {\n this.datetimeElement = selectorElement;\n this.datetimeElement.className = `daracl-datetime-wrapper ddtp-${daraDatetimeIdx} embed`;\n } else {\n this.isInput = true;\n this.targetElement.setAttribute(\"value\", viewDate.format(this.dateFormat));\n const datetimeElement = document.createElement(\"div\");\n datetimeElement.className = `daracl-datetime-wrapper ddtp-${daraDatetimeIdx} layer`;\n datetimeElement.setAttribute(\"style\", `z-index:${this.options.zIndex};`);\n (_a = hiddenElement()) == null ? void 0 : _a.appendChild(datetimeElement);\n this.datetimeElement = datetimeElement;\n this.initTargetEvent();\n }\n this.createDatetimeTemplate();\n if (this.isTimeMode()) {\n this.hourInputEle = this.datetimeElement.querySelector(\".ddtp-hour\");\n this.minuteInputEle = this.datetimeElement.querySelector(\".ddtp-minute\");\n } else {\n this.hourInputEle = {};\n this.minuteInputEle = {};\n }\n this.changeViewMode(this._viewMode);\n this.initHeaderEvent();\n this.initDateEvent();\n this.initTimeEvent();\n }\n setWeekDays() {\n let weekStartDay = this.options.weekStartDay;\n if (weekStartDay == 0) return;\n if (weekStartDay < 0 || weekStartDay > 6) {\n weekStartDay = 0;\n }\n for (let i = 0; i < 7; i++) {\n let day = weekStartDay + i;\n this.dayOrder[i] = day < 7 ? day : day - 7;\n }\n }\n static create(selector, options, message) {\n return new _DateTimePicker(selector, options, message);\n }\n /**\n * default date format setting\n * @example\n ```\n setDefaultFormat({\n year: \"YYYY\",\n month: \"YYYY-MM\",\n date: \"YYYY-MM-DD\",\n time: \"HH:mm\",\n datetime: \"YYYY-MM-DD HH:mm\",\n });\n ```\n * @public\n * @static\n * @param {*} dateFormat\n */\n static setDefaultFormat(dateFormat) {\n Object.assign(DEFAULT_FORMAT, dateFormat);\n }\n _minDate() {\n let minDate = this.options.minDate;\n if (minDate != \"\") {\n if (typeof minDate === \"string\") {\n const dt = parser(minDate, this.dateFormat);\n if (!dt) {\n return -1;\n }\n minDate = dt;\n }\n this.minYear = minDate.getFullYear();\n this.minMonth = +(this.minYear + leftPad(minDate.getMonth(), 2));\n return new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), 0, 0).getTime();\n }\n return -1;\n }\n _maxDate() {\n let maxDate = this.options.maxDate;\n if (maxDate != \"\") {\n if (typeof maxDate === \"string\") {\n const dt = parser(maxDate, this.dateFormat);\n if (!dt) {\n return -1;\n }\n maxDate = dt;\n }\n this.maxYear = maxDate.getFullYear();\n this.maxMonth = +(this.maxYear + leftPad(maxDate.getMonth(), 2));\n return new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 23, 59).getTime();\n }\n return -1;\n }\n set viewMode(mode) {\n if (this._viewMode === mode) {\n return;\n }\n this._viewMode = mode;\n this.changeViewMode(mode);\n }\n get viewMode() {\n return this._viewMode;\n }\n /**\n * 모드 change\n * @param mode\n */\n changeViewMode(mode) {\n var _a;\n (_a = this.datetimeElement.querySelector(\".ddtp-datetime\")) == null ? void 0 : _a.setAttribute(\"view-mode\", mode);\n if (mode === \"year\") {\n this.yearDraw();\n } else if (mode === \"month\") {\n this.monthDraw();\n } else {\n this.dayDraw();\n }\n }\n /**\n * init header event\n *\n * @public\n */\n initHeaderEvent() {\n var _a, _b, _c, _d;\n const isRTL = this.options.isRTL;\n (_a = this.datetimeElement.querySelector(\".ddtp-move-btn.prev\")) == null ? void 0 : _a.addEventListener(\"click\", (e) => {\n this.moveDate(isRTL ? \"next\" : \"prev\", e);\n });\n (_b = this.datetimeElement.querySelector(\".ddtp-move-btn.next\")) == null ? void 0 : _b.addEventListener(\"click\", (e) => {\n this.moveDate(isRTL ? \"prev\" : \"next\", e);\n });\n (_c = this.datetimeElement.querySelector(\".ddtp-header-year\")) == null ? void 0 : _c.addEventListener(\"click\", (e) => {\n this.viewMode = DateViewMode.year;\n });\n (_d = this.datetimeElement.querySelector(\".ddtp-header-month\")) == null ? void 0 : _d.addEventListener(\"click\", (e) => {\n this.viewMode = DateViewMode.month;\n });\n }\n /**\n * 날짜 달력 이벤트처리.\n */\n initDateEvent() {\n var _a, _b;\n (_a = this.datetimeElement.querySelector(\".ddtp-day-body\")) == null ? void 0 : _a.addEventListener(\"click\", (e) => {\n var _a2;\n const targetEle = e.target;\n if (targetEle.classList.contains(\"ddtp-day\") || targetEle.closest(\".ddtp-day\")) {\n const selectDate = targetEle.getAttribute(\"data-day\") || \"1\";\n const mmDD = selectDate.split(\",\");\n this.currentDate.setMonth(+mmDD[0] - 1);\n this.currentDate.setDate(+mmDD[1]);\n if (this.isDayDisabled(this.currentDate)) {\n return;\n }\n (_a2 = this.datetimeElement.querySelector(\".select\")) == null ? void 0 : _a2.classList.remove(\"select\");\n targetEle.classList.add(\"select\");\n if (this.isTimeMode()) {\n this.currentDate.setHour(+this.hourInputEle.value);\n this.currentDate.setMinutes(+this.minuteInputEle.value);\n }\n this.dateChangeEvent(e);\n }\n });\n (_b = this.datetimeElement.querySelector(\".ddtp-today\")) == null ? void 0 : _b.addEventListener(\"click\", (e) => {\n const initDate = new DaraDate(parser(this.todayDate, DEFAULT_FORMAT.date) || /* @__PURE__ */ new Date());\n this.currentDate.setYear(initDate.getYear());\n this.currentDate.setMonth(initDate.getMonth() - 1);\n this.currentDate.setDate(initDate.getDate());\n this.changeViewMode(this.initMode);\n });\n }\n isTimeMode() {\n return this._viewMode === DateViewMode.time || this._viewMode === DateViewMode.datetime;\n }\n getTimeNumberValue(val) {\n if (!isNumeric(val)) {\n return 0;\n }\n return parseInt(val, 10);\n }\n /**\n * 시간 분 설정 이벤트 처리.\n *\n * @public\n */\n initTimeEvent() {\n var _a;\n if (!this.isTimeMode()) return;\n let hh = this.currentDate.format(\"HH\");\n const datetimeElement = this.datetimeElement;\n const hourInputEle = datetimeElement.querySelector(\".ddtp-hour\");\n const hourRangeEle = datetimeElement.querySelector(\".ddtp-hour-range\");\n hourInputEle.value = hh;\n hourRangeEle.value = hh;\n hourInputEle.addEventListener(\"input\", (e) => {\n const targetElement = e.target;\n let val = this.getTimeNumberValue(targetElement.value);\n let addVal = leftPadClamp(val, 2, \"0\");\n if (parseInt(addVal, 10) > 23) {\n addVal = \"23\";\n }\n hourInputEle.value = addVal;\n hourRangeEle.value = addVal;\n });\n hourRangeEle.addEventListener(\"input\", (e) => {\n const targetElement = e.target;\n hourInputEle.value = leftPadClamp(targetElement.value, 2, \"0\");\n });\n let mm = this.currentDate.format(\"mm\");\n const minuteInputEle = datetimeElement.querySelector(\".ddtp-minute\");\n const minuteRangeEle = datetimeElement.querySelector(\".ddtp-minute-range\");\n minuteInputEle.value = mm;\n minuteRangeEle.value = mm;\n minuteInputEle.addEventListener(\"input\", (e) => {\n const targetElement = e.target;\n let val = this.getTimeNumberValue(targetElement.value);\n let addVal = leftPadClamp(val, 2, \"0\");\n if (parseInt(addVal, 10) > 59) {\n addVal = \"59\";\n }\n minuteInputEle.value = addVal;\n minuteRangeEle.value = addVal;\n });\n minuteRangeEle.addEventListener(\"input\", (e) => {\n const targetElement = e.target;\n minuteInputEle.value = leftPadClamp(targetElement.value, 2, \"0\");\n });\n (_a = datetimeElement.querySelector(\".time-select\")) == null ? void 0 : _a.addEventListener(\"click\", (e) => {\n this.currentDate.setHour(+hourInputEle.value);\n this.currentDate.setMinutes(+minuteInputEle.value);\n this.dateChangeEvent(e);\n });\n }\n /**\n * 날짜 이동\n * @param moveMode // 앞뒤 이동 prev, next\n * @returns\n */\n moveDate(moveMode, e) {\n if (this._viewMode === DateViewMode.date || this._viewMode === DateViewMode.datetime) {\n this.currentDate.setDate(1);\n this.currentDate.addMonth(\"prev\" === moveMode ? -1 : 1);\n this.dayDraw();\n return;\n }\n if (this._viewMode === DateViewMode.month) {\n this.currentDate.setDate(1);\n this.currentDate.addYear(\"prev\" === moveMode ? -1 : 1);\n this.monthDraw();\n return;\n }\n if (this._viewMode === DateViewMode.year) {\n this.currentDate.setDate(1);\n this.currentDate.addYear(\"prev\" === moveMode ? -16 : 16);\n this.yearDraw();\n }\n }\n /**\n * get date value\n *\n * @returns\n */\n getDateValue() {\n return this.currentDate.format(this.dateFormat);\n }\n /**\n * 옵션 셋팅\n * @static\n * @param {DateTimePickerOptions} options\n */\n static setOptions(options) {\n DEFAULT_OPTIONS = Object.assign({}, DEFAULT_OPTIONS, options);\n }\n /**\n * 달력 보이기 처리.\n *\n * @returns\n */\n show() {\n if (this.isVisible) {\n return;\n }\n this.isVisible = true;\n const docSize = getDocSize();\n this.datetimeElement.classList.remove(\"hide\");\n this.datetimeElement.classList.add(\"show\");\n const rect = this.targetElement.getBoundingClientRect();\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n const elementHeight = this.datetimeElement.offsetHeight;\n const targetElementHeight = this.targetElement.offsetHeight + 2;\n let left = rect.left + scrollLeft;\n let top = 0;\n if (this.options.isPositionFixed) {\n top = rect.top + targetElementHeight;\n left = rect.left;\n } else {\n if (rect.top + targetElementHeight + elementHeight > docSize.clientHeight && rect.top >= elementHeight) {\n top = scrollTop + rect.top - elementHeight - 2;\n } else {\n top = scrollTop + rect.top + targetElementHeight;\n }\n }\n this.datetimeElement.setAttribute(\"style\", `${this.options.isPositionFixed ? \"position:fixed;\" : \"\"}top:${top}px;left:${left}px;z-index:${this.options.zIndex}`);\n document.addEventListener(\"click\", this._documentClickEvent);\n }\n /**\n * 달력 숨기기\n */\n hide() {\n this.isVisible = false;\n if (this.options.onClose) {\n if (this.options.onClose() === false) {\n return;\n }\n }\n this.datetimeElement.classList.remove(\"show\");\n this.datetimeElement.classList.add(\"hide\");\n document.removeEventListener(\"click\", this._documentClickEvent);\n }\n /**\n * 타켓 이벤트 처리.\n */\n initTargetEvent() {\n if (this.targetElement) {\n this.targetElement.addEventListener(\"click\", (e) => {\n this.show();\n });\n }\n }\n /**\n * 날짜 변경후 이벤트\n */\n afterChangeDatepicker() {\n const formatValue = this.currentDate.format(this.dateFormat);\n if (this.options.afterChangeDatepicker && isFunction(this.options.afterChangeDatepicker)) {\n this.options.afterChangeDatepicker(formatValue, this.viewMode);\n }\n }\n /**\n * 날짜 변경 전 이벤트.\n * @returns void\n */\n beforeChangeDatepicker() {\n const formatValue = this.currentDate.format(this.dateFormat);\n if (this.options.beforeChangeDatepicker && isFunction(this.options.beforeChangeDatepicker)) {\n const reval = this.options.beforeChangeDatepicker(formatValue, (result) => {\n if (result === false) {\n return;\n }\n this.refresh(false);\n });\n if (reval === false) {\n return;\n }\n this.refresh(false);\n return;\n }\n this.refresh(false);\n }\n dateChangeEvent(e) {\n const formatValue = this.currentDate.format(this.dateFormat);\n if (this.options.onSelect) {\n if (this.options.onSelect(formatValue, this.viewMode, e) === false) {\n return;\n }\n }\n if (this.isInput) {\n this.targetElement.setAttribute(\"value\", formatValue);\n }\n if (!this.options.inline && this.options.autoClose) {\n this.hide();\n }\n }\n /**\n * datepicker template 그리기\n */\n createDatetimeTemplate() {\n const showMonthAfterYear = this.options.showMonthAfterYear;\n let datetimeTemplate = `<div class=\"ddtp-datetime ${this.options.isRTL ? \"rtl\" : \"\"}\" view-mode=\"${this._viewMode}\">\n\t\t\t<div class=\"ddtp-header\">\n <span class=\"${showMonthAfterYear ? \"ddtp-header-year\" : \"ddtp-header-month\"}\"></span>\n <span class=\"${showMonthAfterYear ? \"ddtp-header-month\" : \"ddtp-header-year\"}\"></span>\n\n <span class=\"ddtp-date-move\"> \n <a href=\"javascript:;\" class=\"ddtp-move-btn prev\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#000000\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/></svg>\n </a>\n <a href=\"javascript:;\" class=\"ddtp-move-btn next\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#000000\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"/></svg>\n </a> \n </span>\n\t\t\t</div>\n <div class=\"ddtp-body\">\n <table class=\"ddtp-days\">\n <thead class=\"ddtp-day-header\">\n <tr>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[0]]}\">${Lanauage.getWeeksMessage(this.dayOrder[0])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[1]]}\">${Lanauage.getWeeksMessage(this.dayOrder[1])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[2]]}\">${Lanauage.getWeeksMessage(this.dayOrder[2])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[3]]}\">${Lanauage.getWeeksMessage(this.dayOrder[3])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[4]]}\">${Lanauage.getWeeksMessage(this.dayOrder[4])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[5]]}\">${Lanauage.getWeeksMessage(this.dayOrder[5])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[6]]}\">${Lanauage.getWeeksMessage(this.dayOrder[6])}</td>\t\t\n </tr>\n </thead>\n <tbody class=\"ddtp-day-body\">\n </tbody>\n \n <tfoot class=\"ddtp-day-footer\">\n <td colspan=\"7\">\n <div style=\"width:99%;text-align:center;margin-top: 5px;${this.options.enableTodayBtn ? \"\" : \"display:none;\"}\"><button type=\"button\" class=\"ddtp-today\">${Lanauage.getMessage(\"today\")}</button></div>\n <div class=\"footer-tooltip\"></div>\n </td>\n </tfoot>\n </table>\n\n <div class=\"ddtp-times\">\n <div class=\"time-container\">\n <div class=\"ddtp-time\">\n <span>H: </span><input type=\"number\" class=\"ddtp-hour\" min=\"0\" max=\"23\" maxlength=\"2\">\n <input type=\"range\" min=\"0\" max=\"23\" class=\"ddtp-hour-range\">\n </div>\n <div class=\"ddtp-time\">\n <span>M: </span><input type=\"number\" class=\"ddtp-minute\" min=\"0\" max=\"59\" size=\"2\" maxlength=\"2\">\n <input type=\"range\" min=\"0\" max=\"59\" class=\"ddtp-minute-range\">\n </div>\n </div>\n <div class=\"ddtp-btn\">\n <button type=\"button\" class=\"time-select\">${Lanauage.getMessage(\"ok\")}</button>\n </div>\n </div>\n\n <div class=\"ddtp-months\">\n </div>\n\n <div class=\"ddtp-years\">\n </div>\n </div>\n </div>`;\n this.datetimeElement.innerHTML = datetimeTemplate;\n }\n refresh(beforeChangeDatepickerCheck) {\n if (this._viewMode === DateViewMode.date || this._viewMode === DateViewMode.datetime) {\n this.dayDraw(beforeChangeDatepickerCheck);\n return;\n }\n if (this._viewMode === DateViewMode.month) {\n this.monthDraw(beforeChangeDatepickerCheck);\n return;\n }\n if (this._viewMode === DateViewMode.year) {\n this.yearDraw(beforeChangeDatepickerCheck);\n }\n }\n /**\n * 년 달력 그리기\n */\n yearDraw(beforeChangeDatepickerCheck) {\n var _a;\n const currentYear = this.currentDate.format(\"YYYY\");\n if (beforeChangeDatepickerCheck !== false && this.initMode == DateViewMode.year) {\n this.beforeChangeDatepicker();\n return;\n }\n const startYear = +currentYear - 8;\n this.datetimeElement.querySelector(\".ddtp-header-year\").textContent = `${startYear} ~ ${startYear + 15}`;\n const beforeDrawDateFlag = isFunction(this.options.beforeDrawDate);\n const beforeDrawDateFn = beforeDrawDateFlag ? this.options.beforeDrawDate : false;\n const calHTML = [];\n for (let i = 0; i < 16; i++) {\n const year = startYear + i;\n const disabled = this.isYearDisabled(year);\n let addStylceClass = disabled ? \" disabled\" : \"\";\n let tooltip = \"\";\n if (beforeDrawDateFlag && beforeDrawDateFn) {\n const reval = beforeDrawDateFn({ mode: this._viewMode, date: year });\n addStylceClass += reval.style ? \" \" + reval.style : \"\";\n tooltip = reval.tooltip;\n tooltip = tooltip ? `title=\"${tooltip}\"` : \"\";\n }\n calHTML.push(`<div class=\"ddtp-year ${addStylceClass}\" data-year=\"${year}\" ${tooltip}>${year}</div>`);\n }\n this.datetimeElement.querySelector(\".ddtp-years\").innerHTML = calHTML.join(\"\");\n if (this.initMode == DateViewMode.year) {\n this.afterChangeDatepicker();\n }\n (_a = this.datetimeElement.querySelectorAll(\".ddtp-year\")) == null ? void 0 : _a.forEach((yearEle) => {\n yearEle.addEventListener(\"click\", (e) => {\n const targetEle = e.target;\n if (targetEle) {\n const year = targetEle.getAttribute(\"data-year\");\n if (year) {\n const numYear = +year;\n if (this.isYearDisabled(numYear)) {\n return;\n }\n if (this.initMode == DateViewMode.year) {\n if (this.isYearDisabled(numYear)) {\n return;\n }\n this.currentDate.setYear(numYear);\n this.dateChangeEvent(e);\n return;\n }\n this.currentDate.setYear(numYear);\n this.viewMode = this.initMode;\n }\n }\n });\n });\n }\n /**\n * 월 달력 그리기\n */\n monthDraw(beforeChangeDatepickerCheck) {\n var _a;\n if (beforeChangeDatepickerCheck !== false && this.initMode == DateViewMode.month) {\n this.beforeChangeDatepicker();\n return;\n }\n const year = this.currentDate.format(\"YYYY\");\n this.datetimeElement.querySelector(\".ddtp-header-year\").textContent = `${year}`;\n const monthElements = this.datetimeElement.querySelectorAll(\".ddtp-months > .ddtp-month\");\n if (monthElements.length > 0) {\n if (this.isYearDisabled(+year)) {\n monthElements.forEach((monthEle) => {\n if (!monthEle.classList.contains(\"disabled\")) {\n monthEle.classList.add(\"disabled\");\n }\n });\n return;\n }\n monthElements.forEach((monthEle, idx) => {\n if (this.isMonthDisabled(+year, idx)) {\n if (!monthEle.classList.contains(\"disabled\")) {\n monthEle.classList.add(\"disabled\");\n }\n } else {\n monthEle.classList.remove(\"disabled\");\n }\n });\n if (this.initMode == DateViewMode.month) {\n this.afterChangeDatepicker();\n }\n return;\n }\n this.datetimeElement.querySelector(\".ddtp-header-month\").textContent = this.currentDate.format(\"MMMM\");\n const beforeDrawDateFlag = isFunction(this.options.beforeDrawDate);\n const beforeDrawDateFn = beforeDrawDateFlag ? this.options.beforeDrawDate : false;\n const calHTML = [];\n for (let i = 0; i < 12; i++) {\n const disabled = this.isMonthDisabled(+year, i);\n let addStylceClass = disabled ? \" disabled\" : \"\";\n let tooltip = \"\";\n if (beforeDrawDateFlag && beforeDrawDateFn) {\n const reval = beforeDrawDateFn({ mode: this._viewMode, date: year + \"/\" + (i + 1) });\n addStylceClass += reval.style ? \" \" + reval.style : \"\";\n tooltip = reval.tooltip;\n tooltip = tooltip ? `title=\"${tooltip}\"` : \"\";\n }\n calHTML.push(`<div class=\"ddtp-month ${addStylceClass}\" data-month=\"${i}\" ${tooltip}>${Lanauage.getMonthsMessage(i, \"abbr\")}</div>`);\n }\n this.datetimeElement.querySelector(\".ddtp-months\").innerHTML = calHTML.join(\"\");\n if (this.initMode == DateViewMode.month) {\n this.afterChangeDatepicker();\n }\n (_a = this.datetimeElement.querySelectorAll(\".ddtp-month\")) == null ? void 0 : _a.forEach((monthEle) => {\n monthEle.addEventListener(\"click\", (e) => {\n const targetEle = e.target;\n if (targetEle) {\n const month = targetEle.getAttribute(\"data-month\");\n if (month) {\n if (this.isMonthDisabled(this.currentDate.getYear(), +month)) {\n return false;\n }\n if (this.initMode == DateViewMode.month) {\n this.currentDate.setMonth(+month);\n this.dateChangeEvent(e);\n return;\n }\n this.currentDate.setMonth(+month);\n this.viewMode = this.initMode;\n this.dayDraw();\n }\n }\n });\n });\n }\n /**\n * 날짜 그리기\n */\n dayDraw(beforeChangeDatepickerCheck) {\n if (beforeChangeDatepickerCheck !== false && (this.initMode == DateViewMode.date || this.initMode == DateViewMode.datetime)) {\n this.beforeChangeDatepicker();\n return;\n }\n let monthFirstDate = this.currentDate.clone();\n const currentMonth = monthFirstDate.getMonth();\n monthFirstDate.setDate(1);\n this.datetimeElement.querySelector(\".ddtp-header-year\").textContent = monthFirstDate.format(\"YYYY\");\n this.datetimeElement.querySelector(\".ddtp-header-month\").textContent = monthFirstDate.format(\"MMMM\");\n let day = monthFirstDate.getDay();\n day = day - this.dayOrder[0];\n if (day >= 0) {\n monthFirstDate.addDate(-day);\n } else {\n monthFirstDate.addDate(-(7 + day));\n }\n const beforeDrawDateFlag = isFunction(this.options.beforeDrawDate);\n const beforeDrawDateFn = beforeDrawDateFlag ? this.options.beforeDrawDate : false;\n const calHTML = [];\n for (let i = 0; i < 42; i++) {\n let dateItem;\n if (i == 0) {\n dateItem = monthFirstDate;\n } else {\n dateItem = monthFirstDate.clone().addDate(i);\n }\n const dateItemFormat = dateItem.format(DEFAULT_FORMAT.date);\n if (i % 7 == 0) {\n calHTML.push((i == 0 ? \"\" : \"</tr>\") + \"<tr>\");\n }\n let disabled = this.isDayDisabled(dateItem);\n let addStylceClass = DAY_STYLE_CLASS[this.dayOrder[i % 7]];\n const dateItemMonth = dateItem.getMonth();\n if (dateItemMonth != currentMonth) {\n if (dateItemMonth < currentMonth) {\n addStylceClass += dateItemMonth == 1 ? \" new\" : \" old\";\n } else {\n addStylceClass += currentMonth == 1 && dateItemMonth == 12 ? \" old\" : \" new\";\n }\n }\n addStylceClass += this.todayDate == dateItemFormat ? \" ddtp-today\" : \"\";\n addStylceClass += disabled ? \" disabled\" : \"\";\n let tooltip = \"\";\n if (beforeDrawDateFlag && beforeDrawDateFn) {\n const reval = beforeDrawDateFn({ mode: this._viewMode, item: dateItem, date: dateItem.format(this.dateFormat) });\n addStylceClass += reval.style ? \" \" + reval.style : \"\";\n addStylceClass += reval.check ? \" ddtp-event\" : \"\";\n tooltip = reval.tooltip;\n tooltip = tooltip ? `title=\"${tooltip}\"` : \"\";\n }\n calHTML.push(`<td class=\"ddtp-day ${addStylceClass}\" data-day=\"${dateItem.format(\"M,D\")}\" ${tooltip}>`);\n calHTML.push(`<span>${dateItem.format(\"d\")}</span>`);\n calHTML.push(\"</td>\");\n }\n calHTML.push(\"</tr>\");\n this.datetimeElement.querySelector(\".ddtp-day-body\").innerHTML = calHTML.join(\"\");\n if (this.initMode == DateViewMode.date || this.initMode == DateViewMode.datetime) {\n this.afterChangeDatepicker();\n }\n }\n isDayDisabled(dateItem) {\n if (this.minDate != -1 && this.minDate > dateItem.getTime() || this.maxDate != -1 && this.maxDate < dateItem.getTime()) {\n return true;\n }\n return false;\n }\n isYearDisabled(year) {\n if (this.minYear != -1 && this.minYear > year || this.maxYear != -1 && this.maxYear < year) {\n return true;\n }\n return false;\n }\n isMonthDisabled(year, month) {\n if (this.isYearDisabled(year)) {\n return true;\n }\n let yearMonth = +(year + leftPad(month, 2));\n if (this.minMonth != -1 && this.minMonth > yearMonth || this.maxMonth != -1 && this.maxMonth < yearMonth) {\n return true;\n }\n return false;\n }\n static setMessage(message) {\n Lanauage.setDefaultMessage(message);\n }\n};\n_DateTimePicker.VERSION = `${\"0.0.13\"}`;\n_DateTimePicker.format = format;\n_DateTimePicker.parser = parser;\nlet DateTimePicker = _DateTimePicker;\nfunction getDocSize() {\n return {\n clientHeight: Math.max(document.documentElement.clientHeight, window.innerHeight || 0),\n clientWidth: Math.max(document.documentElement.clientWidth, window.innerWidth || 0)\n };\n}\nexport {\n DateTimePicker\n};\n//# sourceMappingURL=index.js.map\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { DaraForm } from \"@/DaraForm\";\n\nimport { DateTimePicker } from \"@daracl/datetimepicker\";\n\nimport * as utils from \"@/util/utils\";\n\nexport default class DateRender extends Render {\n private element: HTMLInputElement;\n private dateObj: any;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n let dateOnSelectEvent: any;\n this.field.rendererOptions = Object.assign({}, this.field.rendererOptions);\n if (typeof this.field.rendererOptions.onSelect !== \"undefined\") {\n dateOnSelectEvent = this.field.rendererOptions.onSelect;\n }\n\n if (utils.isUndefined(this.field.rendererOptions.mode)) {\n if (this.field.renderType == \"datemonth\" || this.field.renderType == \"datehour\") {\n this.field.rendererOptions.mode = this.field.renderType.replace(\"date\", \"\");\n } else {\n this.field.rendererOptions.mode = this.field.renderType;\n }\n }\n\n this.field.rendererOptions.onSelect = (dt: any, e: Event) => {\n if (utils.isFunction(dateOnSelectEvent)) {\n dateOnSelectEvent(dt, e);\n }\n\n this.setValue(dt);\n\n this.valid();\n };\n\n this.dateObj = new DateTimePicker(this.element, this.field.rendererOptions, {} as any);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"text\" name=\"${field.$xssName}\" class=\"df-form-field df-text df-help-icon\" autocomplete=\"off\" readonly/>\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLInputElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FieldStyle, FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { invalidMessage } from \"@/util/validUtils\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { DaraForm } from \"@/DaraForm\";\nimport FormTemplate from \"@/FormTemplate\";\nimport { resolveFieldStyle } from \"@/util/styleUtils\";\nimport { FormOptions } from \"@t/FormOptions\";\nimport * as utils from \"@/util/utils\";\n\nexport default class TabRender extends Render {\n private customFunction;\n private tabContainerElement: HTMLElement;\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n if (field.renderer) {\n this.customFunction = field.renderer;\n } else {\n this.customFunction = {} as any;\n }\n\n this.mounted();\n }\n\n mounted() {\n if (this.customFunction.mounted) {\n (this.customFunction.mounted as any).call(this, this.field, this.rowElement);\n }\n\n this.tabContainerElement.querySelectorAll(\".df-tab-item\").forEach((tabItem) => {\n tabItem.addEventListener(\"click\", (e: any) => {\n this.clickEventHandler(tabItem, e);\n });\n });\n }\n\n /**\n * tab item click\n *\n * @param {Element} tabItem\n * @param {*} evt\n */\n private clickEventHandler(tabItem: Element, evt: any) {\n this.setActive(tabItem.getAttribute(\"data-tab-id\") ?? \"\");\n }\n\n public setActive(tabId: string): void {\n const tabItem = this.tabContainerElement.querySelector(`[data-tab-id=\"${tabId}\"]`);\n\n if (!tabItem) return;\n\n if (!tabItem.classList.contains(\"active\")) {\n for (let item of tabItem?.parentElement?.children ?? []) {\n item.classList.remove(\"active\");\n }\n tabItem.classList.add(\"active\");\n }\n\n const tabPanel = this.rowElement.querySelector(`[tab-panel-id=\"${tabId}\"]`);\n\n if (!tabPanel?.classList.contains(\"active\")) {\n for (let item of tabPanel?.parentElement?.children ?? []) {\n item.classList.remove(\"active\");\n }\n\n tabPanel?.classList.add(\"active\");\n }\n }\n\n static isDataRender(): boolean {\n return false;\n }\n\n static isChildrenCreate(): boolean {\n return false;\n }\n\n /**\n * tab template\n *\n * @param {FormField} field\n * @param {FormTemplate} formTemplate\n * @param {FormOptions} options\n * @returns {string} template string\n */\n\n createField() {\n const field = this.field;\n\n const formTemplate = this.daraForm.formTemplate;\n const options = this.daraForm.getOptions();\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n //tab 이벤트 처리 할것.\n let fieldStyle = resolveFieldStyle(options, field);\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field \">\n <div class=\"df-tab-header ${fieldStyle.tabAlignClass}\"></div>\n </div>\n <div class=\"df-tab-body\"></div>\n `;\n\n if (field.children) {\n let firstFlag = true;\n\n const formOptions = this.getForm().getOptions();\n\n let fieldStyle: FieldStyle = resolveFieldStyle(formOptions, field, null, formTemplate.isLabelHide(field));\n\n for (const childField of field.children) {\n childField.$parent = field;\n formTemplate.addRowFieldInfo(childField);\n let id = childField.$key;\n\n let tabTemplate = `<span class=\"df-tab-item ${firstFlag ? \"active\" : \"\"}\" data-tab-id=\"${id}\"><a href=\"javascript:;\">${childField.label}</a></span>`;\n\n let tabBodyTemplate = `<div class=\"df-tab-panel ${firstFlag ? \"active\" : \"\"}\" tab-panel-id=\"${id}\">${Render.getDescriptionTemplate(childField)}\n <div class=\"df-tab-group\"></div>\n </div>`;\n\n const tabElement = utils.templateToElement(tabTemplate);\n const tabBodyElement = utils.templateToElement(tabBodyTemplate);\n\n firstFlag = false;\n if (tabElement) {\n fieldContainerElement.querySelector(\".df-tab-header\")?.appendChild(tabElement);\n }\n\n if (tabBodyElement) {\n fieldContainerElement.querySelector(\".df-tab-body\")?.appendChild(tabBodyElement);\n\n if (childField.children) {\n let tabFormOptions = {\n style: {\n width: formOptions.style.width ?? \"100%\",\n labelWidth: formOptions.style.labelWidth ?? 3,\n valueWidth: formOptions.style.valueWidth ?? 9,\n position: formOptions.style.position ?? \"left-right\",\n },\n useTypeValue: formOptions.useTypeValue,\n autoCreate: false,\n notValidMessage: \"This form is not valid.\",\n fields: [],\n } as FormOptions;\n\n childField.$tabForm = new DaraForm(document.createElement(\"div\"), tabFormOptions);\n\n childField.$instance = new (childField.$renderType as any)(childField, tabBodyElement?.querySelector(\".df-tab-group\"), childField.$tabForm);\n\n childField.$tabForm.formTemplate.childTemplate(childField, fieldStyle);\n }\n }\n }\n\n this.tabContainerElement = fieldContainerElement;\n }\n }\n\n getValue(): any {\n if (this.customFunction.getValue) {\n return (this.customFunction.getValue as any).call(this, this.field, this.rowElement);\n }\n\n let allTabValue = {} as any;\n\n let useTypeValue = this.getForm().getOptions().useTypeValue;\n\n for (const childField of this.field.children) {\n const childFieldValue = childField.$tabForm?.getValue(false);\n if (useTypeValue) {\n allTabValue[childField.$validName] = childFieldValue;\n } else {\n for (let [key, value] of Object.entries(childFieldValue)) {\n allTabValue[key] = value;\n }\n }\n }\n return allTabValue;\n }\n\n setValue(value: any): void {\n for (const childField of this.field.children) {\n let tabChildValue = value[childField.$validName];\n\n if (tabChildValue) {\n childField.$tabForm?.setValue(tabChildValue);\n }\n }\n }\n\n reset() {\n for (const childField of this.field.children ?? []) {\n childField.$tabForm?.resetForm();\n }\n }\n\n getElement(): Element {\n return this.rowElement;\n }\n\n valid(): any {\n if (this.customFunction.valid) {\n const validResult = (this.customFunction.valid as any).call(this, this.field, this.rowElement);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return;\n }\n\n const field = this.field;\n\n for (const childField of field.children) {\n const validResult = childField.$tabForm?.validForm();\n\n if (validResult && validResult.length > 0) {\n const firstItem = validResult[0];\n\n if (firstItem.message) {\n firstItem.message = \"[\" + this.field.label + \"] \" + firstItem.message;\n\n return firstItem;\n }\n }\n }\n\n return true;\n }\n\n focus(): void {}\n}\n","import { FieldStyle, FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { invalidMessage, resetRowElementStyleClass } from \"@/util/validUtils\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resolveFieldStyle } from \"@/util/styleUtils\";\nimport FormTemplate from \"@/FormTemplate\";\nimport { FormOptions } from \"@t/FormOptions\";\nimport { NumberKeyMap } from \"@t/DataMap\";\n\nlet $$idx = 0;\n\nexport default class GridRender extends Render {\n private customFunction;\n private gridForm;\n private allAddRowInfo = {} as NumberKeyMap;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n if (field.renderer) {\n this.customFunction = field.renderer;\n } else {\n this.customFunction = {} as any;\n }\n\n const gridFormOptions = {\n style: {\n width: \"100%\",\n labelWidth: 3,\n valueWidth: 9,\n position: \"left-right\",\n },\n autoCreate: false,\n notValidMessage: \"This form is not valid.\",\n fields: [],\n } as FormOptions;\n\n this.gridForm = new DaraForm(document.createElement(\"div\"), gridFormOptions);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n this.addRow();\n\n if (this.customFunction.mounted) {\n (this.customFunction.mounted as any).call(this, this.field, this.rowElement);\n }\n\n this.rowElement.querySelector(\".df-grid-add-row-btn\")?.addEventListener(\"click\", (evt) => {\n this.addRow();\n });\n }\n\n static isDataRender(): boolean {\n return false;\n }\n\n static isChildrenCreate(): boolean {\n return false;\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n let theadTemplate = [];\n let colgroupTemplate = [];\n let addBtnTemplate = [];\n addBtnTemplate.push(\"\");\n\n if (field.children) {\n colgroupTemplate.push(\"<colgroup>\");\n\n theadTemplate.push(\"<tr>\");\n\n colgroupTemplate.push(`<col style=\"width:38px\">`);\n theadTemplate.push(\"<th>\");\n if (field.rendererOptions?.disableAddButton !== true) {\n theadTemplate.push(`<button type=\"button\" class=\"df-btn df-grid-add-row-btn\" title=\"Add\"><i class=\"df-icon df-add-icon\"></i></button>`);\n }\n theadTemplate.push(\"</th>\");\n\n for (const childField of field.children) {\n colgroupTemplate.push(`<col style=\"width:${childField.style?.width ?? \"*\"}\">`);\n theadTemplate.push(`<th class=\"df-grid-header\">${childField.label}</th>`);\n }\n colgroupTemplate.push(\"</colgroup>\");\n theadTemplate.push(\"</tr>\");\n }\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-grid-field\">\n ${addBtnTemplate.join(\"\")}\n <div class=\"df-grid-container ${field.style?.position ?? \"\"}\" style=\"height:${field.rendererOptions?.height ?? \"auto\"};\">\n <table class=\"df-grid\">${colgroupTemplate.join(\"\")}<thead>${theadTemplate.join(\"\")}</thead><tbody></tbody></table>\n </div>\n </div>\n `;\n }\n\n /**\n * add row\n */\n addRow(valueItem?: any): void {\n let rowTemplate = [];\n\n const options = this.daraForm.getOptions();\n const formTemplate = this.gridForm.formTemplate;\n const parentName = this.field.$xssName;\n\n ++$$idx;\n let addColumns = [];\n rowTemplate.push(`<tr class=\"df-grid-row\">`);\n\n rowTemplate.push(\"<td>\");\n if (this.field.rendererOptions?.disableRemoveButton !== true) {\n rowTemplate.push(`<button type=\"button\" data-row-idx=\"${$$idx}\" class=\"df-btn df-grid-row-remove\"><i class=\"df-icon df-remove-icon\"></i></button>`);\n }\n rowTemplate.push(\"</td>\");\n\n for (const childField of this.field.children) {\n let fieldStyle: FieldStyle = resolveFieldStyle(options, childField, null, true);\n\n let columnField = utils.merge({}, childField) as FormField;\n\n addColumns.push(columnField);\n columnField.$orgin = childField;\n columnField.name = columnField.name + \"_\" + $$idx;\n columnField.$xssName = parentName + \"_\" + utils.getXssFieldName(columnField);\n\n formTemplate.addRowFieldInfo(columnField);\n\n rowTemplate.push(`<td id=\"${columnField.$xssName}\"><div class=\"df-field-container ${columnField.required ? \"required\" : \"\"} \" style=\"${fieldStyle.valueStyle}\"></div></td>`);\n }\n rowTemplate.push(\"</tr>\");\n\n this.allAddRowInfo[$$idx] = addColumns;\n\n const addRowElement = utils.templateToElement(rowTemplate.join(\"\"));\n\n if (addRowElement) {\n this.rowElement.querySelector(\"tbody\")?.append(addRowElement);\n\n addRowElement.querySelector(\".df-grid-row-remove\")?.addEventListener(\"click\", (evt) => {\n this.removeRow(evt);\n });\n }\n\n valueItem = valueItem ?? {};\n for (let columnField of addColumns) {\n columnField.$instance = new (columnField.$renderType as any)(columnField, addRowElement?.querySelector(`#${columnField.$xssName}`), this.gridForm);\n\n if (utils.hasOwnProp(valueItem, columnField.$orgin.name)) {\n columnField.$instance.setValue(valueItem[columnField.$orgin.name]);\n }\n }\n }\n\n /**\n * remove row\n *\n * @param evt event\n */\n removeRow(evt: Event): void {\n const target = evt.target as Element;\n\n const rowElement = target.closest(\"tr\");\n\n if (rowElement) {\n //if (rowElement.parentElement?.childElementCount == 1) return;\n\n let rowIdx = (evt.currentTarget as Element)?.getAttribute(\"data-row-idx\") || \"-1\";\n\n this.removeFieldInfo(rowIdx);\n rowElement.remove();\n }\n }\n\n /**\n *\n * @param rowIdx row index\n */\n removeFieldInfo(rowIdx?: string) {\n let removeFieldArrs = [] as any;\n\n if (utils.isEmpty(rowIdx)) {\n for (let key in this.allAddRowInfo) {\n removeFieldArrs = removeFieldArrs.concat(this.allAddRowInfo[key]);\n }\n this.allAddRowInfo = {} as NumberKeyMap;\n } else if (rowIdx) {\n const rowIdxNum = parseInt(rowIdx, 10);\n removeFieldArrs = removeFieldArrs.concat(this.allAddRowInfo[rowIdxNum]);\n delete this.allAddRowInfo[rowIdxNum];\n }\n\n for (let columnField of removeFieldArrs) {\n this.gridForm.getFieldInfoMap().removeFieldInfo(columnField.name);\n }\n }\n\n allRemoveRow(): void {\n this.rowElement.querySelector(\"tbody\")?.replaceChildren();\n this.removeFieldInfo();\n }\n\n getValue() {\n if (this.customFunction.getValue) {\n return (this.customFunction.getValue as any).call(this, this.field, this.rowElement);\n }\n let result = [];\n const children = this.field.children;\n const childrenLength = children.length;\n for (let idx in this.allAddRowInfo) {\n const rowColumns = this.allAddRowInfo[idx];\n\n let rowInfo = {} as any;\n for (let childIdx = 0; childIdx < childrenLength; childIdx++) {\n let childField = children[childIdx];\n rowInfo[childField.name] = this.gridForm.getFieldValue(rowColumns[childIdx].name); // rowColumns[childIdx].$instance.getValue();\n }\n\n result.push(rowInfo);\n }\n return result;\n }\n\n setValue(value: any): void {\n this.field.$value = value;\n\n let valueArr: any[] = [];\n if (utils.isArray(value)) {\n valueArr = value;\n } else {\n if (utils.isPlainObject(value)) {\n valueArr.push(value);\n }\n }\n\n this.allRemoveRow();\n\n for (let valueItem of valueArr) {\n this.addRow(valueItem);\n }\n }\n\n reset() {\n this.setDefaultInfo();\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement() {\n if (this.customFunction.getElement) {\n return (this.customFunction.getElement as any).call(this, this.field, this.rowElement);\n }\n return null;\n }\n\n valid(): any {\n if (this.customFunction.valid) {\n const validResult = (this.customFunction.valid as any).call(this, this.field, this.rowElement);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return;\n }\n\n const validResult = this.gridForm.validForm();\n\n if (validResult.length > 0) {\n const firstItem = validResult[0];\n\n if (firstItem.message) {\n firstItem.message = \"[\" + this.field.label + \"] \" + firstItem.message;\n\n return firstItem;\n }\n }\n\n return true;\n }\n\n focus(): void {}\n}\n","import NumberRender from \"@/renderer/NumberRender\";\r\nimport TextAreaRender from \"@/renderer/TextAreaRender\";\r\nimport DropdownRender from \"@/renderer/DropdownRender\";\r\nimport TextRender from \"@/renderer/TextRender\";\r\nimport CheckboxRender from \"@/renderer/CheckboxRender\";\r\nimport RadioRender from \"@/renderer/RadioRender\";\r\nimport PasswordRender from \"@/renderer/PasswordRender\";\r\nimport FileRender from \"@/renderer/FileRender\";\r\nimport CustomRender from \"./renderer/CustomRender\";\r\nimport GroupRender from \"./renderer/GroupRender\";\r\nimport HiddenRender from \"./renderer/HiddenRender\";\r\nimport ButtonRender from \"./renderer/ButtonRender\";\r\nimport RangeRender from \"./renderer/RangeRender\";\r\nimport DateRender from \"./renderer/DateRender\";\r\nimport TabRender from \"./renderer/TabRender\";\r\nimport GridRender from \"./renderer/GridRender\";\r\n\r\nexport type FORM_MODE = \"new\" | \"modify\" | \"view\";\r\n\r\nexport const RULES = {\r\n NAN: \"nan\",\r\n MIN: \"minimum\",\r\n EXCLUSIVE_MIN: \"exclusiveMinimum\",\r\n MAX: \"maximum\",\r\n EXCLUSIVE_MAX: \"exclusiveMaximum\",\r\n MIN_LENGTH: \"minLength\",\r\n MAX_LENGTH: \"maxLength\",\r\n BETWEEN: \"between\",\r\n BETWEEN_EXCLUSIVE_MIN: \"betweenExclusiveMin\",\r\n BETWEEN_EXCLUSIVE_MAX: \"betweenExclusiveMax\",\r\n BETWEEN_EXCLUSIVE_MINMAX: \"betweenExclusiveMinMax\",\r\n REGEXP: \"regexp\",\r\n REQUIRED: \"required\",\r\n VALIDATOR: \"validator\",\r\n} as const;\r\n\r\nexport const FIELD_PREFIX = \"dff\"; // daracl form field\r\n\r\nexport const RENDER_TEMPLATE: any = {\r\n number: NumberRender,\r\n textarea: TextAreaRender,\r\n dropdown: DropdownRender,\r\n checkbox: CheckboxRender,\r\n radio: RadioRender,\r\n text: TextRender,\r\n password: PasswordRender,\r\n file: FileRender,\r\n custom: CustomRender,\r\n group: GroupRender,\r\n hidden: HiddenRender,\r\n button: ButtonRender,\r\n range: RangeRender,\r\n datehour: DateRender,\r\n datemonth: DateRender,\r\n date: DateRender,\r\n datetime: DateRender,\r\n tab: TabRender,\r\n grid: GridRender,\r\n};\r\n\r\nexport const ALIGN = {\r\n left: \"left\",\r\n center: \"center\",\r\n right: \"right\",\r\n} as const;\r\n\r\nexport type TEXT_ALIGN_TYPE = (typeof ALIGN)[keyof typeof ALIGN];\r\n\r\nexport type RENDER_TYPE = \"number\" | \"text\" | \"file\" | \"textarea\" | \"dropdown\" | \"radio\" | \"checkbox\" | \"date\" | \"datetime\" | \"dateyear\" | \"datemonth\" | \"datehour\" | \"group\" | \"custom\";\r\n\r\nexport type REGEXP_TYPE = \"email\" | \"url\" | \"alpha\" | \"alpha-num\";\r\n\r\nexport type PASSWORD_TYPE = \"number\" | \"upper\" | \"upper-special\" | \"upper-special-number\"; // 숫자 | 대문자 포함, 대문자 특수문자 포함, 대문자 특수문자 숫자\r\n\r\nexport type FIELD_POSITION = \"top\" | \"left\" | \"left-left\" | \"left-right\" | \"right\" | \"right-left\" | \"right-right\" | \"bottom\";\r\n\r\nexport const OrientationMap = {\r\n horizontal: \"horizontal\",\r\n vertical: \"vertical\",\r\n} as const;\r\n\r\nexport type OrientationType = (typeof OrientationMap)[keyof typeof OrientationMap];\r\n\r\ninterface StringArrayMap {\r\n [key: string]: string[];\r\n}\r\n\r\nexport const FIELD_POSITION_STYLE: StringArrayMap = {\r\n \"top-left\": [\"top\", \"df-txt-left\"],\r\n \"top-center\": [\"top\", \"df-txt-center\"],\r\n \"top-right\": [\"top\", \"df-txt-right\"],\r\n \"left-left\": [\"\", \"df-txt-left\"],\r\n \"left-center\": [\"\", \"df-txt-center\"],\r\n \"left-right\": [\"\", \"df-txt-right\"],\r\n \"right-right\": [\"right\", \"df-txt-right\"],\r\n \"right-center\": [\"right\", \"df-txt-center\"],\r\n \"right-left\": [\"right\", \"df-txt-left\"],\r\n \"bottom-left\": [\"bottom\", \"df-txt-left\"],\r\n \"bottom-center\": [\"bottom\", \"df-txt-center\"],\r\n \"bottom-right\": [\"bottom\", \"df-txt-right\"],\r\n};\r\nFIELD_POSITION_STYLE[\"top\"] = FIELD_POSITION_STYLE[\"top-left\"];\r\nFIELD_POSITION_STYLE[\"right\"] = FIELD_POSITION_STYLE[\"right-right\"];\r\nFIELD_POSITION_STYLE[\"left\"] = FIELD_POSITION_STYLE[\"left-left\"];\r\nFIELD_POSITION_STYLE[\"bottom\"] = FIELD_POSITION_STYLE[\"bottom-left\"];\r\n","import { Message } from \"@t/Message\";\r\nimport { FormField } from \"../types/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\n\r\nlet localeMessage: Message = {\r\n required: \"{label} 필수 입력사항입니다.\",\r\n fileButton: \"파일찾기\",\r\n selection: \"선택\",\r\n string: {\r\n minLength: \"{minLength} 글자 이상으로 입력하세요.\",\r\n maxLength: \"{maxLength} 글자 이하로 입력하세요.\",\r\n between: \"{minLength} ~ {maxLength} 사이의 글자를 입력하세요.\",\r\n },\r\n number: {\r\n nan: \"숫자만 입력 가능 합니다.\",\r\n minimum: \"{minimum} 값과 같거나 커야 합니다\",\r\n exclusiveMinimum: \"{minimum} 보다 커야 합니다\",\r\n maximum: \"{maximum} 값과 같거나 작아야 합니다\",\r\n exclusiveMaximum: \"{maximum} 보다 작아야 합니다.\",\r\n between: \"{minimum}~{maximum} 사이의 값을 입력하세요.\",\r\n betweenExclusiveMin: \"{minimum} 보다 크고 {maximum} 보다 같거나 작아야 합니다\",\r\n betweenExclusiveMax: \"{minimum} 보다 같거나 크고 {maximum} 보다 작아야 합니다\",\r\n betweenExclusiveMinMax: \"{minimum} 보다 크고 {maximum} 보다 작아야 합니다\",\r\n },\r\n regexp: {\r\n mobile: \"핸드폰 번호가 유효하지 않습니다.\",\r\n email: \"이메일이 유효하지 않습니다.\",\r\n url: \"URL이 유효하지 않습니다.\",\r\n alpha: \"영문만 입력 가능 합니다.\",\r\n \"alpha-num\": \"영문과 숫자만 입력 가능 합니다.\",\r\n number: \"숫자만 입력 가능 합니다.\",\r\n variable: \"값이 유효하지 않습니다.\",\r\n \"number-char\": \"숫자, 문자 각각 하나 이상 포함 되어야 합니다.\",\r\n \"upper-char\": \"대문자가 하나 이상 포함 되어야 합니다.\",\r\n \"upper-char-special\": \"대문자,소문자,특수문자 각각 하나 이상 포함 되어야 합니다.\",\r\n \"upper-char-special-number\": \"대문자,소문자,특수문자,숫자 각각 하나 이상 포함 되어야합니다.\",\r\n },\r\n};\r\n\r\n/**\r\n * validation 메시지 처리.\r\n *\r\n * @class Language\r\n * @typedef {Language}\r\n */\r\nclass Language {\r\n private lang: Message = localeMessage;\r\n\r\n /**\r\n * 다국어 메시지 등록\r\n *\r\n * @public\r\n * @param {?Message} [lang] 둥록할 메시지\r\n */\r\n public set(lang?: Message) {\r\n this.lang = Object.assign({}, localeMessage, lang);\r\n }\r\n\r\n /**\r\n * 메시지 얻기\r\n *\r\n * @public\r\n * @param {string} messageKey 메시지 키\r\n * @returns {*}\r\n */\r\n public getMessage(messageKey: string): any {\r\n return (this.lang as any)[messageKey];\r\n }\r\n\r\n /**\r\n * ValidResult 값을 메시지로 변경.\r\n *\r\n * @public\r\n * @param {FormField} field\r\n * @param {ValidResult} validResult\r\n * @returns {string[]}\r\n */\r\n public validMessage(field: FormField, validResult: ValidResult): string[] {\r\n let messageFormat = \"\";\r\n\r\n let messageFormats: string[] = [];\r\n\r\n if (validResult.regexp) {\r\n messageFormat = (this.lang.regexp as any)[validResult.regexp];\r\n messageFormats.push(messageFormat);\r\n }\r\n\r\n (validResult.constraint ?? []).forEach((constraint) => {\r\n if (constraint === RULES.REQUIRED) {\r\n messageFormat = message(this.lang.required, field);\r\n messageFormats.push(messageFormat);\r\n }\r\n\r\n if (field.renderType == \"number\" || field.renderType == \"range\") {\r\n messageFormat = (this.lang.number as any)[constraint];\r\n messageFormats.push(messageFormat);\r\n } else {\r\n messageFormat = (this.lang.string as any)[constraint];\r\n messageFormats.push(messageFormat);\r\n }\r\n });\r\n\r\n const reMessage: string[] = [];\r\n\r\n const msgParam = Object.assign({}, { name: field.name, label: field.label }, field.rule);\r\n messageFormats.forEach((msgFormat) => {\r\n if (msgFormat) {\r\n reMessage.push(message(msgFormat, msgParam));\r\n }\r\n });\r\n\r\n if (validResult.validator) {\r\n reMessage.push(validResult.validator.message);\r\n }\r\n\r\n return reMessage;\r\n }\r\n}\r\n\r\nfunction message(msgFormat: string, msgParam: any): string {\r\n return msgFormat.replace(/\\{{1,1}([A-Za-z0-9_.]*)\\}{1,1}/g, (match, key) => {\r\n return typeof msgParam[key] !== \"undefined\" ? msgParam[key] : match;\r\n });\r\n}\r\n\r\nexport default new Language();\r\n","import { FormField } from \"@t/FormField\";\r\n\r\nimport { Render } from \"../renderer/Render\";\r\nimport { RENDER_TEMPLATE } from \"../constants\";\r\nimport * as utils from \"./utils\";\r\n\r\nexport const getRenderer = (field: FormField): Render => {\r\n let render;\r\n if (field.renderType) {\r\n render = RENDER_TEMPLATE[field.renderType];\r\n }\r\n\r\n if (render && (render.isDataRender() === false || !utils.isUndefined(field.name))) {\r\n return render;\r\n }\r\n\r\n if (utils.isUndefined(field.name)) {\r\n if (field.children) {\r\n return RENDER_TEMPLATE[\"group\"];\r\n } else {\r\n return RENDER_TEMPLATE[\"hidden\"];\r\n }\r\n }\r\n\r\n return RENDER_TEMPLATE[\"text\"];\r\n};\r\n","import { FIELD_PREFIX } from \"@/constants\";\r\nimport { FormField } from \"./types/FormField\";\r\nimport { ValidResult } from \"./types/ValidResult\";\r\nimport { getRenderer } from \"./util/renderFactory\";\r\nimport Language from \"./util/Language\";\r\nimport * as utils from \"./util/utils\";\r\nimport { DaraForm } from \"./DaraForm\";\r\n\r\ninterface NumberFieldMap {\r\n [key: string]: FormField;\r\n}\r\n\r\ninterface StringNumberMap {\r\n [key: string]: string;\r\n}\r\n\r\nexport default class FieldInfoMap {\r\n private fieldIdx = 0;\r\n\r\n private allFieldInfo: NumberFieldMap = {};\r\n\r\n private keyNameMap: StringNumberMap = {};\r\n\r\n private conditionFields: string[] = [];\r\n\r\n private fieldPrefix;\r\n\r\n private form;\r\n\r\n constructor(selector: string, form: DaraForm) {\r\n this.fieldPrefix = `${FIELD_PREFIX}_${utils.getHashCode(selector)}`;\r\n this.form = form;\r\n }\r\n\r\n /**\r\n * add Field 정보\r\n *\r\n * @public\r\n * @param {FormField} field 폼필드 정보\r\n */\r\n public addField(field: FormField) {\r\n utils.replaceXssField(field);\r\n this.fieldIdx += 1;\r\n field.$key = `${this.fieldPrefix}_${this.fieldIdx}`;\r\n field.$validName = field.name ?? field.label;\r\n this.keyNameMap[field.$validName] = field.$key;\r\n this.allFieldInfo[field.$key] = field;\r\n field.$renderType = getRenderer(field);\r\n\r\n if (field.conditional) {\r\n this.conditionFields.push(field.$key);\r\n }\r\n }\r\n\r\n /**\r\n * 필드명으로 필드 정부 구하기\r\n *\r\n * @public\r\n * @param {string} fieldName 필드명\r\n * @returns {FormField}\r\n */\r\n public getFieldName(fieldName: string): FormField {\r\n return this.allFieldInfo[this.keyNameMap[fieldName]];\r\n }\r\n\r\n /**\r\n * 필드 키로 정보 구하기\r\n *\r\n * @public\r\n * @param {string} fieldKey\r\n * @returns {FormField}\r\n */\r\n public get(fieldKey: string): FormField {\r\n return this.allFieldInfo[fieldKey];\r\n }\r\n\r\n /**\r\n * 필드명 있는지 여부 체크.\r\n *\r\n * @public\r\n * @param {string} fieldName 필드명\r\n * @returns {boolean}\r\n */\r\n public hasFieldName(fieldName: string): boolean {\r\n if (this.keyNameMap[fieldName] && this.allFieldInfo[this.keyNameMap[fieldName]]) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * 모든 필드 정보\r\n *\r\n * @public\r\n * @returns {NumberFieldMap}\r\n */\r\n public getAllFieldInfo(): NumberFieldMap {\r\n return this.allFieldInfo;\r\n }\r\n\r\n /**\r\n * 필드 정보 맵에서 지우기\r\n *\r\n * @public\r\n * @param {string} fieldName\r\n */\r\n public removeFieldInfo(fieldName: string) {\r\n const fieldKey = this.keyNameMap[fieldName];\r\n\r\n if (utils.isUndefined(fieldKey)) return;\r\n\r\n this.removeFieldInfoByKey(fieldKey);\r\n delete this.keyNameMap[fieldName];\r\n }\r\n\r\n /**\r\n * 필드 키로 필드 정보 맵에서 지우기\r\n *\r\n * @public\r\n * @param {string} fieldKey\r\n */\r\n public removeFieldInfoByKey(fieldKey: string) {\r\n const fieldInfo = this.allFieldInfo[fieldKey];\r\n\r\n if (fieldInfo && this.keyNameMap[fieldInfo.$validName] === fieldKey) {\r\n delete this.keyNameMap[fieldInfo.$validName];\r\n }\r\n\r\n delete this.allFieldInfo[fieldKey];\r\n\r\n this.conditionFields = this.conditionFields.filter((key) => key !== fieldKey);\r\n }\r\n\r\n /**\r\n * 모든 필드값 구하기\r\n *\r\n * @public\r\n * @param {boolean} validationCheck\r\n * @returns {*}\r\n */\r\n public getAllFieldValue(formValue: any, validationCheck: boolean) {\r\n const useTypeValue = this.form.getOptions().useTypeValue;\r\n\r\n if (validationCheck !== true) {\r\n for (let [key, fieldInfo] of Object.entries(this.allFieldInfo)) {\r\n formValue = addFormValue(formValue, fieldInfo, useTypeValue);\r\n }\r\n return formValue;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n for (let [key, fieldInfo] of Object.entries(this.allFieldInfo)) {\r\n if (!fieldInfo.$instance.isEnableView()) {\r\n continue;\r\n }\r\n\r\n let fieldValid = this.getFieldValidation(fieldInfo, true);\r\n\r\n if (fieldValid !== true) {\r\n reject(new Error(fieldValid.message, { cause: fieldValid }));\r\n return;\r\n }\r\n\r\n formValue = addFormValue(formValue, fieldInfo, useTypeValue);\r\n }\r\n\r\n resolve(formValue);\r\n });\r\n }\r\n\r\n public getFormDataValue(formValue: any, validationCheck: boolean) {\r\n if (validationCheck !== true) {\r\n let reval = new FormData();\r\n\r\n for (let [key, value] of Object.entries(formValue)) {\r\n reval.set(key, value as any);\r\n }\r\n\r\n for (let [key, fieldInfo] of Object.entries(this.allFieldInfo)) {\r\n addFieldFormData(reval, fieldInfo, fieldInfo.$instance.getValue());\r\n }\r\n\r\n return reval;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n let reval = new FormData();\r\n\r\n for (let [key, value] of Object.entries(formValue)) {\r\n reval.set(key, value as any);\r\n }\r\n\r\n for (let [key, fieldInfo] of Object.entries(this.allFieldInfo)) {\r\n if (!fieldInfo.$instance.isEnableView()) {\r\n continue;\r\n }\r\n\r\n let fieldValid = this.getFieldValidation(fieldInfo, true);\r\n\r\n if (fieldValid !== true) {\r\n reject(new Error(fieldValid.message, { cause: fieldValid }));\r\n return;\r\n }\r\n\r\n addFieldFormData(reval, fieldInfo, fieldInfo.$instance.getValue());\r\n }\r\n\r\n resolve(reval);\r\n });\r\n }\r\n\r\n /**\r\n *\r\n *\r\n * @param field\r\n * @returns\r\n */\r\n public isConditionFieldCheck(field: FormField) {\r\n let parent = field;\r\n\r\n while (typeof parent !== \"undefined\") {\r\n if (!this.isConditionField(parent)) {\r\n return false;\r\n }\r\n\r\n parent = parent.$parent;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * field 활성 비활성화 여부.\r\n *\r\n * @param field form field\r\n * @returns\r\n */\r\n public isConditionField(field: FormField) {\r\n if (!this.conditionFields.includes(field.$key)) {\r\n return true;\r\n }\r\n\r\n let condFlag = false;\r\n\r\n if (field.conditional.custom) {\r\n condFlag = field.conditional.custom.call(null, field);\r\n } else {\r\n if (field.conditional.field) {\r\n const condField = this.getFieldName(field.conditional.field);\r\n\r\n if (condField) {\r\n if (field.conditional.eq == condField.$instance.getValue()) {\r\n condFlag = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return condFlag;\r\n }\r\n\r\n /**\r\n * 컬럼 로우 보이고 안보이기 체크.\r\n *\r\n * @public\r\n */\r\n public conditionCheck() {\r\n this.conditionFields.forEach((fieldKey) => {\r\n const fieldInfo = this.allFieldInfo[fieldKey];\r\n\r\n let condFlag = this.isConditionField(fieldInfo);\r\n\r\n if (condFlag) {\r\n fieldInfo.$instance.show();\r\n } else {\r\n fieldInfo.$instance.hide();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * field validation check\r\n *\r\n * @param fieldInfo FormField\r\n * @returns boolean true or ValidResult\r\n */\r\n public getFieldValidation(fieldInfo: FormField, focusFlag: boolean | undefined) {\r\n if (!this.isConditionFieldCheck(fieldInfo)) {\r\n return true;\r\n }\r\n\r\n const renderInfo = fieldInfo.$instance;\r\n let fieldValid = renderInfo.valid();\r\n\r\n if (fieldValid === true) return true;\r\n\r\n if (focusFlag) {\r\n renderInfo.focus();\r\n }\r\n fieldValid = fieldValid as ValidResult;\r\n if (utils.isUndefined(fieldValid.message)) {\r\n fieldValid.message = Language.validMessage(fieldInfo, fieldValid)[0];\r\n }\r\n\r\n return fieldValid;\r\n }\r\n}\r\n\r\n/**\r\n * add form value\r\n * @param formData {Object} return Object value\r\n * @param fieldInfo {FormField} field info\r\n * @param fieldValue {any} form value\r\n */\r\nfunction addFormValue(formData: any, fieldInfo: FormField, useTypeValue?: boolean) {\r\n if (utils.ignoreValueField(fieldInfo)) {\r\n return formData;\r\n }\r\n\r\n const fieldValue = fieldInfo.$instance.getValue();\r\n\r\n if (fieldInfo.renderType === \"file\") {\r\n const uploadFiles = fieldValue[\"uploadFile\"];\r\n\r\n formData[fieldInfo.$validName] = uploadFiles;\r\n formData[fieldInfo.$validName + \"RemoveIds\"] = fieldValue[\"removeIds\"];\r\n } else {\r\n if (useTypeValue !== true) {\r\n if (utils.isTabType(fieldInfo)) {\r\n for (let [key, value] of Object.entries(fieldValue)) {\r\n formData[key] = value;\r\n }\r\n } else {\r\n if (!utils.isEmpty(fieldInfo.name)) {\r\n formData[fieldInfo.name] = fieldValue;\r\n }\r\n }\r\n } else {\r\n formData[fieldInfo.$validName] = fieldValue;\r\n }\r\n }\r\n\r\n return formData;\r\n}\r\n\r\nfunction addFieldFormData(formData: FormData, fieldInfo: FormField, useTypeValue?: boolean) {\r\n if (utils.ignoreValueField(fieldInfo)) {\r\n return formData;\r\n }\r\n\r\n const fieldValue = fieldInfo.$instance.getValue();\r\n\r\n if (fieldInfo.renderType === \"file\") {\r\n const uploadFiles = fieldValue[\"uploadFile\"];\r\n formData.delete(fieldInfo.$validName);\r\n for (let uploadFile of uploadFiles) {\r\n formData.append(fieldInfo.$validName, uploadFile);\r\n }\r\n\r\n formData.set(fieldInfo.$validName + \"RemoveIds\", fieldValue[\"removeIds\"]);\r\n } else {\r\n if (useTypeValue !== true) {\r\n if (utils.isTabType(fieldInfo)) {\r\n for (let [key, value] of Object.entries(fieldValue)) {\r\n formData.set(key, value as any);\r\n }\r\n } else {\r\n if (!utils.isEmpty(fieldInfo.name)) {\r\n formData.set(fieldInfo.$validName, fieldValue);\r\n }\r\n }\r\n } else {\r\n formData.set(fieldInfo.$validName, fieldValue);\r\n }\r\n }\r\n\r\n return formData;\r\n}\r\n","import { FormOptions } from \"@t/FormOptions\";\nimport { FieldStyle, FormField } from \"@t/FormField\";\nimport * as utils from \"./util/utils\";\nimport FieldInfoMap from \"@/FieldInfoMap\";\n\nimport { resolveFieldStyle } from \"./util/styleUtils\";\nimport { DaraForm } from \"./DaraForm\";\nimport TabRender from \"./renderer/TabRender\";\nimport GridRender from \"./renderer/GridRender\";\n\n/**\n * form template\n *\n * @class FormTemplate\n * @typedef {FormTemplate}\n */\nexport default class FormTemplate {\n private readonly options: FormOptions;\n private readonly formElement;\n\n private fieldInfoMap;\n\n private daraform: DaraForm;\n\n private addRowFields: string[] = [];\n\n constructor(daraform: DaraForm, formElement: Element, fieldInfoMap: FieldInfoMap) {\n this.daraform = daraform;\n this.options = daraform.getOptions();\n this.formElement = formElement;\n\n this.fieldInfoMap = fieldInfoMap;\n }\n\n /**\n * field row 추가.\n *\n * @param field\n */\n public addRow(field: FormField) {\n if (this.checkHiddenField(field)) {\n return;\n }\n\n this.addRowFields = [];\n\n this.addRowTemplate(field);\n }\n\n /**\n * 그룹 템플릿\n *\n * @param {FormField} field\n * @returns {string} row template\n */\n public addRowTemplate(field: FormField): void {\n let labelHideFlag = this.isLabelHide(field);\n\n let fieldStyle: FieldStyle = resolveFieldStyle(this.options, field, null, labelHideFlag);\n\n this.addRowFieldInfo(field);\n\n const rowElement = utils.templateToElement(`\n <div class=\"df-row df-form-group ${fieldStyle.fieldClass}\" id=\"${field.$key}\">\n ${labelHideFlag ? \"\" : `<div class=\"df-label ${fieldStyle.labelClass} ${fieldStyle.labelAlignClass}\" title=\"${field.label ?? \"\"}\" style=\"${fieldStyle.labelStyle}\">${this.getLabelTemplate(field)}</div>`}\n\n <div class=\"df-field-container ${fieldStyle.valueClass} ${field.required ? \"required\" : \"\"}\" style=\"${fieldStyle.valueStyle}\"></div>\n </div>\n `);\n\n if (rowElement) {\n this.createField(field, rowElement);\n this.formElement.append(rowElement);\n\n if (field.children) {\n this.childTemplate(field, fieldStyle);\n }\n }\n }\n\n public createField(field: FormField, element: Element): void {\n field.$instance = new (field.$renderType as any)(field, element, this.daraform);\n }\n\n /**\n * child template\n *\n * @param {FormField} field\n * @param {FieldStyle} parentFieldStyle\n * @returns {*}\n */\n public childTemplate(field: FormField, parentFieldStyle: FieldStyle): void {\n let beforeField: FormField = null as any;\n let firstFlag = true;\n let isEmptyLabel = false;\n\n if (!(field.$renderType as any).isChildrenCreate()) {\n return;\n }\n\n const rowElement = document.createElement(\"div\");\n rowElement.classList.add(\"df-row\", parentFieldStyle.rowStyleClass ?? \"\");\n\n let idx = 0;\n\n for (const childField of field.children) {\n if (utils.isEmpty(childField)) {\n throw new Error(`parent field :[${field.$validName}], children index ${idx}, empty [${childField}]`);\n }\n\n childField.$parent = field;\n ++idx;\n\n if (this.checkHiddenField(childField)) {\n continue;\n }\n\n this.addRowFieldInfo(childField);\n\n if (firstFlag) {\n beforeField = childField;\n }\n\n let labelHideFlag = this.isLabelHide(childField);\n\n let childFieldStyle;\n\n let labelTemplate = \"\";\n if (labelHideFlag) {\n childFieldStyle = resolveFieldStyle(this.options, childField, beforeField, !isEmptyLabel);\n labelTemplate = isEmptyLabel ? `<span class=\"df-label df-empty ${childFieldStyle.labelClass}\" style=\"${childFieldStyle.labelStyle}\"></span>` : \"\";\n } else {\n childFieldStyle = resolveFieldStyle(this.options, childField, beforeField, false);\n labelTemplate = `<span class=\"df-label ${childFieldStyle.labelClass} ${childFieldStyle.labelAlignClass}\" title=\"${childField.label ?? \"\"}\" style=\"${childFieldStyle.labelStyle}\">${this.getLabelTemplate(childField)}</span>`;\n }\n\n const groupElement = utils.templateToElement(`<div class=\"df-form-group ${childFieldStyle.fieldClass}\" style=\"${childFieldStyle.fieldStyle}\" id=\"${childField.$key}\">\n ${labelTemplate}\n <span class=\"df-field-container ${childFieldStyle.valueClass} ${childField.required ? \"required\" : \"\"}\" style=\"${childFieldStyle.valueStyle}\"></span>\n </div>`);\n\n if (groupElement) {\n this.createField(childField, groupElement);\n rowElement.append(groupElement);\n\n if (childField.children) {\n this.childTemplate(childField, childField.children ? childFieldStyle : parentFieldStyle);\n }\n }\n if (!labelHideFlag) {\n isEmptyLabel = true;\n }\n\n firstFlag = false;\n }\n\n field.$instance.addChildField(rowElement);\n }\n\n /**\n * label template\n *\n * @param {FormField} field form field\n * @returns {string} template string\n */\n public getLabelTemplate(field: FormField) {\n const requiredTemplate = field.required ? `<span class=\"required\"></span>` : \"\";\n const tooltipTemplate = utils.isBlank(field.tooltip) ? \"\" : `<span class=\"df-tooltip\">?<span class=\"df-tooltip-text\">${field.tooltip}</span></span>`;\n\n return `<span class=\"df-label-text\">${field.label ?? \"\"}</span> ${tooltipTemplate} ${requiredTemplate}`;\n }\n\n /**\n * label 숨김 여부\n *\n * @param field formfield\n * @returns\n */\n public isLabelHide(field: FormField): boolean {\n return field.style?.labelHide || utils.isUndefined(field.label);\n }\n\n public checkHiddenField(field: FormField) {\n if (utils.isHiddenField(field)) {\n this.fieldInfoMap.addField(field);\n field.$instance = new (field.$renderType as any)(field, null, this.daraform);\n\n return true;\n }\n\n return false;\n }\n\n /**\n * add row file map\n *\n * @param {FormField} field\n */\n public addRowFieldInfo(field: FormField) {\n if (!utils.isBlank(field.name) && this.fieldInfoMap.hasFieldName(field.name)) {\n throw new Error(`Duplicate field name \"${field.name}\"`);\n }\n\n this.fieldInfoMap.addField(field);\n this.addRowFields.push(field.$key);\n }\n}\n","import { FormOptions } from \"./types/FormOptions\";\r\nimport type { FormField } from \"./types/FormField\";\r\nimport { merge } from \"./util/utils\";\r\n\r\nexport function initFormOptions(options: FormOptions): FormOptions {\r\n const opts = merge({}, DEFAULT_OPTIONS, options) as FormOptions;\r\n opts.fields = normalizeFields(opts.fields);\r\n\r\n return opts;\r\n}\r\n\r\n/**\r\n * 전역으로 옵션 설정.\r\n *\r\n * @param options 옵션\r\n */\r\nexport function setDefaultOptions(options: Partial<FormOptions>): void {\r\n DEFAULT_OPTIONS = merge({}, DEFAULT_OPTIONS, options);\r\n DEFAULT_OPTIONS.fields = normalizeFields(DEFAULT_OPTIONS.fields);\r\n}\r\n\r\n/** Core merge materializes sparse array holes; empty field slots are not renderers. */\r\nexport function normalizeFields(fields: readonly (FormField | null | undefined)[] | null | undefined): FormField[] {\r\n return (fields ?? []).filter((field): field is FormField => field != null).map((field) => {\r\n if (Array.isArray(field.children)) field.children = normalizeFields(field.children);\r\n return field;\r\n });\r\n}\r\n\r\nlet DEFAULT_OPTIONS = {\r\n style: {\r\n width: \"100%\",\r\n labelWidth: 3,\r\n valueWidth: 9,\r\n position: \"left-right\",\r\n },\r\n mode: \"new\",\r\n useTypeValue: true,\r\n autoCreate: true,\r\n notValidMessage: \"This form is not valid.\",\r\n fields: [],\r\n} as FormOptions;\r\n","import { FormOptions } from \"@t/FormOptions\";\nimport { FormField } from \"@t/FormField\";\nimport * as utils from \"./util/utils\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { Message } from \"@t/Message\";\nimport Language from \"./util/Language\";\nimport { stringValidator } from \"./rule/stringValidator\";\nimport { numberValidator } from \"./rule/numberValidator\";\nimport { regexpValidator } from \"./rule/regexpValidator\";\nimport FieldInfoMap from \"@/FieldInfoMap\";\nimport FormTemplate from \"./FormTemplate\";\nimport { FORM_MODE } from \"./constants\";\nimport { initFormOptions, normalizeFields, setDefaultOptions } from \"./defaultOption\";\n\ndeclare const APP_VERSION: string;\n\ninterface FieldMap {\n [key: string]: FormField;\n}\n\ninterface DaraFormMap {\n [key: string]: DaraForm;\n}\n\nexport interface FormChangeEvent {\n form: DaraForm;\n}\n\nexport interface FormChangeListener {\n (event: FormChangeEvent): void;\n}\n\nexport interface Unsubscribe {\n (): void;\n}\n\n// all instance\nconst allInstance: DaraFormMap = {};\n\nconst SEQ_ATTR_KEY = \"data-form-uid\";\n\nlet DARA_FORM_SEQ = 0;\n/**\n * DaraForm class\n *\n * @class DaraForm\n * @typedef {DaraForm}\n */\nexport class DaraForm {\n public static VERSION = `${APP_VERSION}`;\n\n private readonly options;\n\n private orginFormStyleClass;\n\n private selector: string;\n private formElement: Element;\n\n private fieldInfoMap: FieldInfoMap;\n\n private formValue: any = {};\n\n public formTemplate: FormTemplate;\n\n private changeListeners: FormChangeListener[] = [];\n\n constructor(formElement: Element, options: FormOptions, message?: Message) {\n this.options = initFormOptions(options);\n\n Language.set(message);\n\n if (formElement) {\n this.orginFormStyleClass = formElement.className;\n formElement.classList.add(\"daracl-form\");\n\n this.selector = `df_${++DARA_FORM_SEQ}`;\n formElement.setAttribute(\"name\", this.selector);\n formElement.setAttribute(SEQ_ATTR_KEY, this.selector);\n\n if (this.options.style.width) {\n formElement.setAttribute(\"style\", `width:${this.options.style.width};`);\n }\n\n this.formElement = formElement;\n this.changeMode(this.options.mode ?? \"new\");\n this.createForm(this.options.fields);\n\n if (this.options.autoCreate !== false) {\n allInstance[this.selector] = this;\n }\n } else {\n throw new Error(`${formElement} form selector not found`);\n }\n }\n\n public static create(formElement: Element, options: FormOptions, message?: Message): DaraForm {\n return new DaraForm(formElement, options, message);\n }\n\n public static setMessage(message: Message): void {\n Language.set(message);\n }\n\n public static setDefaultOptions(options: FormOptions, message?: Message): void {\n setDefaultOptions(options);\n\n if (message) {\n Language.set(message);\n }\n }\n\n private createForm(fields: FormField[]) {\n this.fieldInfoMap = new FieldInfoMap(this.selector, this);\n //this.formElement.innerHTML = \"\";\n this.formTemplate = new FormTemplate(this, this.formElement, this.fieldInfoMap);\n\n if (this.options.autoCreate === false) {\n return;\n }\n\n fields.forEach((field) => {\n this.formTemplate.addRow(field);\n });\n this.conditionCheck();\n\n if (this.options.onMounted) {\n this.options.onMounted.call(this);\n }\n }\n\n /**\n * change mode\n *\n * @param mode form_mode default new\n */\n public changeMode = (mode: FORM_MODE): void => {\n this.options.mode = mode;\n this.formElement.setAttribute(\"data-df-mode\", mode);\n\n const fields = this.formElement.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>(\".df-field input, \" + \".df-field textarea, \" + \".df-field select\");\n\n if (mode == \"view\") {\n fields.forEach((field) => {\n if (field instanceof HTMLInputElement) {\n field.readOnly = true;\n }\n\n if (field instanceof HTMLTextAreaElement) {\n field.readOnly = true;\n }\n });\n } else {\n fields.forEach((field) => {\n if (field instanceof HTMLInputElement) {\n field.readOnly = false;\n }\n\n if (field instanceof HTMLTextAreaElement) {\n field.readOnly = false;\n }\n });\n }\n };\n\n /**\n * 폼 데이터 reset\n */\n public resetForm = () => {\n const fieldMap = this.fieldInfoMap.getAllFieldInfo();\n for (const seq in fieldMap) {\n const fieldInfo = fieldMap[seq];\n const renderInfo = fieldInfo.$instance;\n\n if (renderInfo && typeof renderInfo.reset === \"function\") {\n renderInfo.reset();\n }\n }\n this.formValue = {};\n this.conditionCheck();\n };\n\n /**\n * field 값 reset\n * @param fieldName 필드명\n */\n public resetField = (fieldName: string) => {\n this.fieldInfoMap.getFieldName(fieldName).$instance.reset();\n this.formValue[fieldName] = \"\";\n this.conditionCheck();\n };\n\n /**\n * 필드 element 얻기\n *\n * @param {string} fieldName\n * @returns {*}\n */\n public getFieldElement(fieldName: string) {\n const field = this.fieldInfoMap.getFieldName(fieldName);\n\n if (field?.$instance) {\n return field.$instance.getElement();\n }\n\n return null;\n }\n\n public getField(fieldName: string): FormField {\n return this.fieldInfoMap.getFieldName(fieldName);\n }\n\n /**\n * field 값 얻기\n *\n * @param fieldName 필드명\n * @returns\n */\n public getFieldValue = (fieldName: string) => {\n const field = this.fieldInfoMap.getFieldName(fieldName);\n\n if (field) {\n return field.$instance.getValue();\n }\n return null;\n };\n\n /**\n * 폼 필드 값 얻기\n * @param isValid 폼 유효성 검사 여부 default:false|undefined true일경우 검사.\n * @returns\n */\n public getValue = (isValid: boolean): any => {\n return this.fieldInfoMap.getAllFieldValue(this.formValue, isValid);\n };\n\n public getFormDataValue = (isValid: boolean): any => {\n return this.fieldInfoMap.getFormDataValue(this.formValue, isValid);\n };\n\n /**\n * 폼 필드 value 셋팅\n * @param values\n */\n public setValue = (values: any, dataClear?: boolean | undefined) => {\n if (dataClear !== false) {\n this.resetForm();\n }\n\n Object.keys(values).forEach((fieldName) => {\n this._setFieldValue(fieldName, values[fieldName]);\n });\n this.conditionCheck();\n };\n\n public setFieldValue = (fieldName: string, value: any) => {\n this._setFieldValue(fieldName, value);\n this.conditionCheck();\n };\n\n private _setFieldValue(fieldName: string, value: any) {\n this.formValue[fieldName] = value;\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n\n if (fieldInfo) {\n fieldInfo.$instance.setValue(value);\n }\n }\n\n public setFieldItems = (fieldName: string, values: any) => {\n const field = this.fieldInfoMap.getFieldName(fieldName);\n\n if (field) {\n return field.$instance.setValueItems(values);\n }\n };\n\n /**\n * field 추가\n *\n * @param {FormField} field\n */\n public addField = (field: FormField) => {\n if (!normalizeFields([field]).length) return;\n this.options.fields.push(field);\n this.formTemplate.addRow(field);\n this.conditionCheck();\n };\n\n /**\n * field 제거\n *\n * @param {string} fieldName\n */\n public removeField = (fieldName: string) => {\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n\n if (!fieldInfo) return;\n\n const removeFields = this.getRemoveFields(fieldInfo);\n\n removeFields.forEach((removeField) => {\n this.removeFormValue(removeField);\n });\n\n this.removeFieldElement(fieldInfo);\n this.removeParentChildField(fieldInfo);\n\n removeFields.forEach((removeField) => {\n this.fieldInfoMap.removeFieldInfoByKey(removeField.$key);\n });\n\n this.conditionCheck();\n };\n\n /**\n * 제거할 필드와 같은 fieldInfoMap에 등록된 하위 필드(group 하위 필드, tab 패널) 목록\n * grid 컬럼, tab 패널 내부 필드는 별도 form에 등록되므로 제외됨.\n *\n * @param {FormField} fieldInfo\n * @param {FormField[]} result\n * @returns {FormField[]}\n */\n private getRemoveFields(fieldInfo: FormField, result: FormField[] = []): FormField[] {\n result.push(fieldInfo);\n\n fieldInfo.children?.forEach((childField) => {\n if (childField && this.fieldInfoMap.get(childField.$key) === childField) {\n this.getRemoveFields(childField, result);\n }\n });\n\n return result;\n }\n\n /**\n * field element 제거\n *\n * @param {FormField} fieldInfo\n */\n private removeFieldElement(fieldInfo: FormField) {\n const parentField = fieldInfo.$parent;\n\n // tab 패널은 tab header item, tab panel 로 구성됨.\n if (parentField && utils.isTabType(parentField)) {\n const tabElement = parentField.$instance.getElement() as Element;\n const tabItem = tabElement.querySelector(`[data-tab-id=\"${fieldInfo.$key}\"]`);\n const activeFlag = tabItem?.classList.contains(\"active\");\n\n tabItem?.remove();\n tabElement.querySelector(`[tab-panel-id=\"${fieldInfo.$key}\"]`)?.remove();\n\n const firstTabItem = tabElement.querySelector(\".df-tab-header .df-tab-item\");\n if (activeFlag && firstTabItem) {\n parentField.$instance.setActive(firstTabItem.getAttribute(\"data-tab-id\") ?? \"\");\n }\n return;\n }\n\n // 최상위 필드는 .df-row, group 하위 필드는 .df-form-group 에 id=$key 가 지정됨.\n const rowSelector = `[id=\"${fieldInfo.$key}\"]`;\n let element = fieldInfo.$instance?.getElement();\n\n // checkbox, radio 는 getElement()가 NodeList를 반환함.\n if (element instanceof NodeList || element instanceof HTMLCollection) {\n element = element[0] ?? null;\n }\n\n const rowElement = (element instanceof Element ? element.closest(rowSelector) : null) ?? this.formElement.querySelector(rowSelector);\n const containerElement = rowElement?.parentElement;\n\n rowElement?.remove();\n\n // group 하위 필드를 모두 제거한 경우 빈 row 제거\n if (parentField && containerElement?.classList.contains(\"df-row\") && containerElement.childElementCount < 1) {\n containerElement.remove();\n }\n }\n\n /**\n * 부모 children(최상위는 options.fields)에서 필드 제거\n * tab 은 children 기준으로 값/유효성 체크를 하므로 제거해야 함.\n *\n * @param {FormField} fieldInfo\n */\n private removeParentChildField(fieldInfo: FormField) {\n const fields: FormField[] | undefined = fieldInfo.$parent ? fieldInfo.$parent.children : this.options.fields;\n const idx = fields ? fields.indexOf(fieldInfo) : -1;\n\n if (idx > -1) {\n fields?.splice(idx, 1);\n }\n }\n\n /**\n * getValue() 시 formValue에 누적된 field 값 제거\n *\n * @param {FormField} fieldInfo\n */\n private removeFormValue(fieldInfo: FormField) {\n const keys = [fieldInfo.name, fieldInfo.$validName];\n\n if (fieldInfo.renderType === \"file\") {\n keys.push(fieldInfo.$validName + \"RemoveIds\");\n } else if (utils.isTabType(fieldInfo)) {\n keys.push(...Object.keys(fieldInfo.$instance.getValue() ?? {}));\n }\n\n // tab 패널 (useTypeValue false 일 경우 패널 내부 필드 값이 펼쳐져 저장됨)\n if (fieldInfo.$tabForm) {\n keys.push(...Object.keys(fieldInfo.$tabForm.getValue(false) ?? {}));\n }\n\n keys.forEach((key) => {\n if (!utils.isBlank(key)) delete this.formValue[key];\n });\n }\n\n /**\n * 폼 유효성 검증 여부\n *\n * @returns {boolean}\n */\n public isValidForm = (): boolean => {\n const result = this.validForm();\n\n return result.length < 1;\n };\n\n /**\n * 유효성 검증 폼 검증여부 리턴\n *\n * @returns {any[]}\n */\n public validForm = (): any[] => {\n let validResult = [] as any;\n let autoFocusFlag = this.options.autoFocus !== false;\n let firstFlag = true;\n\n const fieldMap = this.fieldInfoMap.getAllFieldInfo();\n for (const fieldKey in fieldMap) {\n const fieldInfo = fieldMap[fieldKey];\n\n let fieldValid = this.fieldInfoMap.getFieldValidation(fieldInfo, autoFocusFlag);\n\n if (fieldValid !== true) {\n autoFocusFlag = false;\n\n if (utils.isGridType(fieldInfo)) {\n validResult = validResult.concat(fieldValid);\n } else {\n if (firstFlag) {\n this.validTabCheck(fieldInfo);\n firstFlag = false;\n }\n validResult.push(fieldValid);\n }\n }\n }\n\n return validResult;\n };\n\n private validTabCheck(fieldInfo: FormField) {\n if (fieldInfo.$parent) {\n if (fieldInfo.$parent.renderType == \"tab\") {\n fieldInfo.$parent.$instance.setActive(fieldInfo.$key);\n }\n this.validTabCheck(fieldInfo.$parent);\n }\n }\n\n public isValidField = (fieldName: string): boolean => {\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n\n if (utils.isUndefined(fieldInfo)) {\n throw new Error(`Field name [${fieldName}] not found`);\n }\n\n const renderInfo = fieldInfo.$instance;\n if (renderInfo) {\n return renderInfo.valid() === true;\n }\n\n return true;\n };\n\n /**\n * 설정 옵션 얻기\n */\n public getOptions = () => {\n return this.options;\n };\n\n public conditionCheck() {\n this.fieldInfoMap.conditionCheck();\n this.notifyChange();\n }\n\n /**\n * 폼 상태(값/보이기 여부 등) 변경을 감지하는 리스너 등록.\n *\n * value/setValue/resetForm/conditional 변경 체크\n *\n * @param listener 상태 변경시 호출되는 콜백\n * @returns 등록 해제 함수\n */\n public subscribe = (listener: FormChangeListener): Unsubscribe => {\n this.changeListeners.push(listener);\n\n return () => {\n this.changeListeners = this.changeListeners.filter((l) => l !== listener);\n };\n };\n\n private notifyChange() {\n if (this.changeListeners.length < 1) return;\n\n const event: FormChangeEvent = { form: this };\n this.changeListeners.forEach((listener) => listener(event));\n }\n\n public setFieldDisabled(fieldName: string, flag: boolean) {\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n fieldInfo.$instance.setDisabled(flag);\n }\n\n /**\n * 설명 추가\n *\n * @public\n * @param {string} fieldName\n * @param {string} desc\n */\n public setFieldDescription(fieldName: string, desc: string) {\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n fieldInfo.$instance.setDescription(desc);\n }\n\n public destroy = () => {\n this.formElement.className = this.orginFormStyleClass;\n this.formElement.replaceChildren();\n delete allInstance[this.selector];\n\n for (const key in this) {\n if (utils.hasOwnProp(this, key)) {\n delete this[key];\n }\n }\n };\n\n public static validator = {\n string: (value: string, field: FormField) => {\n return stringValidator(value, field);\n },\n number: (value: string, field: FormField) => {\n return numberValidator(value, field);\n },\n regexp: (value: string, field: FormField) => {\n let result: ValidResult = { name: field.name, constraint: [] };\n return regexpValidator(value, field, result);\n },\n };\n\n public static instance(ele: Element | String) {\n const element = utils.isString(ele) ? document.querySelector(ele) : ele as Element;\n if (!element) return undefined;\n let selector = element.getAttribute(SEQ_ATTR_KEY);\n if (utils.isBlank(selector)) {\n const keys = Object.keys(allInstance);\n if (keys.length > 1) throw new Error(`selector empty : [${selector}]`);\n selector = keys[0];\n }\n return selector ? allInstance[selector] : undefined;\n }\n /**\n * 모든 field 얻기\n */\n public getFields = (): any[] => {\n return this.options.fields;\n };\n\n /**\n * field setting\n * @param fields\n */\n public setFields = (fields: any[]) => {\n this.options.fields = normalizeFields(fields);\n this.formElement.replaceChildren();\n this.formValue = {};\n this.createForm(this.options.fields);\n };\n\n public getFieldInfoMap() {\n return this.fieldInfoMap;\n }\n}\n","import { DaraForm } from \"./DaraForm\";\r\n\r\n// CDN / <script> 로 단독 사용하는 경우에도 dark 테마가 동작하도록 테마 변수(--dui-*)를 CSS 에 함께 포함한다.\r\nimport \"@daracl/ui-style/theme-vars.css\";\r\nimport \"../style/daracl.form.scss\";\r\n\r\nimport \"@daracl/datetimepicker/dist/daracl.datetimepicker.min.css\";\r\n\r\n// 2) 브라우저 전역에 등록 (데모 실행용)\r\ndeclare global {\r\n interface Window {\r\n Daracl?: any;\r\n }\r\n}\r\n\r\nif (typeof window !== \"undefined\") {\r\n window.Daracl = window.Daracl || {};\r\n window.Daracl.form = DaraForm;\r\n}"],"names":["isFunction","isString","isNil","isNumeric","replaceXss","utils.isUndefined","utils.replaceXss","utils.isString","utils.isArray","parser","descEle","utils.isEmpty","utils.isBlank","utils.isNumber","message","Language","item","validResult","localeMessage","regexp","DEFAULT_OPTIONS","_DateTimePicker","utils.isFunction","fieldStyle","utils.templateToElement","utils.merge","utils.getXssFieldName","utils.hasOwnProp","utils.isPlainObject","utils.getHashCode","utils.replaceXssField","utils.ignoreValueField","utils.isTabType","utils.isHiddenField","utils.isGridType"],"mappings":";;;;AAAA,WAAS,QAAQ,OAAO;AACtB,WAAO,MAAM,QAAQ,KAAK;AAAA,EAC5B;AACA,WAASA,aAAW,OAAO;AACzB,WAAO,OAAO,UAAU;AAAA,EAC1B;AAIA,WAAS,cAAc,OAAO;AAC5B,WAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,OAAO,eAAe,KAAK,MAAM,OAAO;AAAA,EAChG;AAmDA,QAAM,gBAAgB,CAAC,UAAU,cAAc,KAAK,KAAK,UAAU,QAAQ,OAAO,UAAU,YAAY,OAAO,eAAe,KAAK,MAAM;AACzI,QAAM,SAAS,CAAC,OAAO,QAAQ,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG;AAC9E,WAAS,OAAO,QAAQ,KAAK,OAAO;AAClC,WAAO,eAAe,QAAQ,KAAK,EAAE,OAAO,YAAY,MAAM,UAAU,MAAM,cAAc,KAAI,CAAE;AAAA,EACpG;AACA,WAAS,YAAY,QAAQ,QAAQ,aAAa;AAChD,UAAM,SAAyB,oBAAI,QAAO;AAC1C,UAAM,QAAQ,CAAA;AACd,aAAS,MAAM,OAAO,SAAS;AAC7B,UAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,UAAI,OAAO,IAAI,KAAK,EAAG,QAAO,OAAO,IAAI,KAAK;AAC9C,UAAI;AACJ,UAAI,QAAQ,KAAK,GAAG;AAClB,iBAAS,QAAQ,OAAO,IAAI,UAAU,CAAA;AACtC,cAAM,KAAK,MAAM,WAAW,QAAQ,KAAK,CAAC;AAAA,MAC5C,WAAW,cAAc,KAAK,GAAG;AAC/B,iBAAS,cAAc,OAAO,IAAI,UAAU,OAAO,OAAO,OAAO,eAAe,KAAK,CAAC;AACtF,cAAM,KAAK,MAAM,YAAY,QAAQ,KAAK,CAAC;AAAA,MAC7C,WAAW,iBAAiB,MAAM;AAChC,iBAAS,IAAI,KAAK,MAAM,QAAO,CAAE;AAAA,MACnC,WAAW,iBAAiB,QAAQ;AAClC,iBAAS,IAAI,OAAO,MAAM,QAAQ,MAAM,KAAK;AAC7C,eAAO,YAAY,MAAM;AAAA,MAC3B,WAAW,iBAAiB,KAAK;AAC/B,iBAAyB,oBAAI,IAAG;AAChC,cAAM,KAAK,MAAM,MAAM,QAAQ,CAAC,MAAM,QAAQ,OAAO,IAAI,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC;AAAA,MACpF,WAAW,iBAAiB,KAAK;AAC/B,iBAAyB,oBAAI,IAAG;AAChC,cAAM,KAAK,MAAM,MAAM,QAAQ,CAAC,SAAS,OAAO,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC;AAAA,MACnE,OAAO;AACL,eAAO;AAAA,MACT;AACA,aAAO,IAAI,OAAO,MAAM;AACxB,aAAO;AAAA,IACT;AACA,aAAS,YAAY,KAAK,KAAK;AAC7B,iBAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,YAAI,YAAY,IAAI,GAAG,KAAK,QAAQ,eAAe,QAAQ,iBAAiB,QAAQ,YAAa;AACjG,cAAM,QAAQ,IAAI,GAAG;AACrB,YAAI,UAAU,OAAQ;AACtB,eAAO,KAAK,KAAK,MAAM,OAAO,OAAO,KAAK,GAAG,IAAI,IAAI,GAAG,IAAI,MAAM,CAAC;AAAA,MACrE;AAAA,IACF;AACA,aAAS,WAAW,KAAK,KAAK;AAC5B,YAAM,OAAO,IAAI,IAAI,GAAG;AACxB,iBAAW,SAAS,KAAK;AACvB,cAAM,OAAO,MAAM,KAAK;AACxB,YAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,OAAO,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,GAAG;AACxF,eAAK,IAAI,IAAI;AACb,cAAI,KAAK,IAAI;AAAA,QACf;AAAA,MACF;AAAA,IACF;AACA,WAAO,IAAI,QAAQ,MAAM;AACzB,QAAI,QAAQ,MAAM,KAAK,QAAQ,MAAM,EAAG,OAAM,KAAK,MAAM,WAAW,QAAQ,MAAM,CAAC;AAAA,QAC9E,OAAM,KAAK,MAAM,YAAY,QAAQ,MAAM,CAAC;AACjD,WAAO,MAAM,OAAQ,OAAM,IAAG,EAAE;AAAA,EAClC;AACA,WAAS,mBAAmB,QAAQ;AAClC,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO;AAAA,IACT;AACA,QAAI,cAA8B,oBAAI,IAAG;AACzC,QAAI,UAAU;AACd,UAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,QAAI,cAAc,IAAI,KAAK,OAAO,MAAM,cAAc,KAAK,QAAQ,KAAK,YAAY,GAAG;AACrF,oBAAc,IAAI,IAAI,KAAK,aAAa,IAAI,MAAM,CAAC;AACnD,gBAAU,OAAO,MAAM,GAAG,EAAE;AAAA,IAC9B;AACA,QAAI,SAAS,CAAA;AACb,aAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS;AACnD,YAAM,QAAQ,QAAQ,KAAK;AAC3B,UAAI,QAAQ,KAAK,KAAK,cAAc,KAAK,GAAG;AAC1C,oBAAY,QAAQ,OAAO,UAAU,IAAoB,oBAAI,IAAG,IAAK,WAAW;AAAA,MAClF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAaA,WAAS,YAAY,KAAK,MAAM;AAC9B,WAAO,OAAO,QAAQ,OAAO,UAAU,OAAO,UAAU,eAAe,KAAK,KAAK,IAAI;AAAA,EACvF;AACA,WAASC,WAAS,OAAO;AACvB,WAAO,OAAO,UAAU;AAAA,EAC1B;AACA,WAAS,QAAQ,OAAO;AACtB,WAAO,UAAU,QAAQ,UAAU,UAAUA,WAAS,KAAK,KAAK,MAAM,KAAI,MAAO;AAAA,EACnF;AAIA,WAASC,QAAM,OAAO;AACpB,WAAO,UAAU,QAAQ,UAAU;AAAA,EACrC;AAgBA,WAASC,YAAU,OAAO,aAAa,OAAO;AAC5C,QAAI,eAAe,KAAM,QAAO,CAAC,OAAO,MAAM,KAAK;AACnD,YAAQ,OAAO,UAAU,YAAYF,WAAS,KAAK,KAAK,MAAM,KAAI,MAAO,MAAM,CAAC,MAAM,WAAW,KAAK,CAAC,MAAM,SAAS,OAAO,KAAK,CAAC;AAAA,EACrI;AACA,WAAS,YAAY,OAAO;AAC1B,WAAO,OAAO,UAAU;AAAA,EAC1B;AAiBA,QAAM,YAAY;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AA2CA,WAAS,IAAI,WAAW;AACtB,QAAI,aAAa;AACjB,QAAI,YAAY;AACd,aAAO,KAAK,SAAS,EAAE,QAAQ,CAAC,QAAQ;AACtC,qBAAa,WAAW,WAAW,KAAK,UAAU,GAAG,CAAC;AAAA,MACxD,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAwLA,WAAS,YAAY,OAAO;AAC1B,QAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,QAAI,OAAO;AACX,aAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,QAAS,SAAQ,QAAQ,KAAK,OAAO,MAAM,WAAW,KAAK,IAAI;AACzG,WAAO,OAAO,IAAI,EAAE,QAAQ,MAAM,GAAG;AAAA,EACvC;AAyRA,QAAM,kBAAkB,CAAC,eAAe;AACtC,WAAO,WAAW,OAAO,MAAM,KAAK,EAAE,OAAO,OAAO;AAAA,EACtD;AAqCA,WAAS,kBAAkB,MAAM;AAC/B,UAAM,WAAW,SAAS,cAAc,UAAU;AAClD,aAAS,YAAY;AACrB,WAAO,SAAS,QAAQ;AAAA,EAC1B;AAIA,WAAS,iBAAiB,OAAO,QAAQ;AACvC,QAAI,CAAC,MAAO,QAAO,CAAA;AACnB,WAAO,gBAAgBD,aAAW,KAAK,IAAI,MAAM,MAAM,IAAI,KAAK;AAAA,EAClE;AClwBO,QAAM,WAAW,CAAC,UAAgC;AACvD,WAAO,CAAC,QAAQ,KAAK,KAAKG,YAAU,CAAC,OAAO,IAAI;AAAA,EAClD;AAQO,QAAM,YAAY,CAAC,UAA8B;AACtD,YAAO,+BAAO,gBAAe;AAAA,EAC/B;AAOO,QAAM,aAAa,CAAC,UAA8B;AACvD,YAAO,+BAAO,gBAAe;AAAA,EAC/B;AACO,QAAM,kBAAkB,CAAC,UAAgC;AAC9D,UAAM,WAAW,gBAAgB,KAAK;AAEtC,UAAM,QAAQC,IAAW,MAAM,KAAK;AACpC,WAAO;AAAA,EACT;AAQO,QAAM,mBAAmB,CAAC,UAA8B;AAC7D,WAAO,WAAW,MAAM,OAAO,KAAK,UAAU,MAAM,OAAO;AAAA,EAC7D;AAQO,QAAM,kBAAkB,CAAC,UAA6B;AAC3D,QAAI,YAAY,MAAM,QAAQ,GAAG;AAC/B,UAAI,aAAa,MAAM;AACvB,UAAI,YAAY;AACd,qBAAa,WAAW,QAAQ,YAAY,GAAG;AAAA,MACjD;AAEA,aAAO,QAAQ;AAAA,IACjB;AAEA,WAAO,MAAM;AAAA,EACf;AAEO,QAAM,gBAAgB,CAAC,WAAiD,+BAAO,gBAAe;AAK9F,QAAM,QAAQ,IAAI,WAAuB;AAC9C,QAAI,CAAC,cAAc,OAAO,CAAC,CAAC,EAAG,QAAO,OAAO,CAAC;AAE9C,WAAO,gBAAgB,GAAG,QAAQ,EAAE;AAAA,EACtC;AAAA,EC1EO,MAAe,OAAO;AAAA,IAO3B,YAAY,MAAgB,OAAkB,YAAyB;;AAFvE,WAAQ,aAAsB;AAG5B,WAAK,WAAW;AAChB,WAAK,QAAQ;AACb,WAAK,aAAa;AAClB,WAAK,YAAA;AAEL,UAAI,MAAM,QAAS,kBAAW,cAAc,aAAa,MAAtC,mBAAyC,aAAa,WAAW,MAAM;AAAA,IAC5F;AAAA,IAEO,iBAAiB;AACtB,UAAIC,YAAkB,KAAK,MAAM,YAAY,GAAG;AAC9C,aAAK,SAAS,IAAI,KAAK;AAAA,MACzB,OAAO;AACL,aAAK,SAAS,KAAK,MAAM,cAAc,KAAK;AAAA,MAC9C;AAEA,UAAI,CAACA,YAAkB,KAAK,MAAM,WAAW,GAAG;AAC9C,cAAM,MAAM,KAAK,WAAA;AACjB,YAAI,eAAe,SAAS;AAC1B,cAAI,aAAa,eAAe,KAAK,MAAM,WAAW;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAAA,IAEO,mBAAmB;AACxB,WAAK,YAAY,KAAK,MAAM,YAAY,KAAK;AAAA,IAC/C;AAAA,IAEO,cAAc,SAAkB;;AACrC,iBAAK,WAAW,cAAc,qBAAqB,MAAnD,mBAAsD,OAAO;AAAA,IAC/D;AAAA,IAEA,OAAO,eAAwB;AAC7B,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,mBAA4B;AACjC,aAAO;AAAA,IACT;AAAA,IAEO,UAAoB;AACzB,aAAO,KAAK;AAAA,IACd;AAAA,IAUO,cAAc,OAAkB;AAAA,IAAC;AAAA,IAExC,OAAc,uBAAuB,OAA0B;AAC7D,YAAM,aAAa,MAAM,mBAAmBC,IAAiB,MAAM,gBAAgB,IAAI;AACvF,YAAM,QAAQ,MAAM,mBAAmB,YAAYA,IAAiB,MAAM,gBAAgB,IAAI,MAAM;AAEpG,aAAO,MAAM,cAAc,8BAA8B,UAAU,KAAK,KAAK,IAAI,MAAM,WAAW,WAAW;AAAA,IAC/G;AAAA,IAEO,gBAAgB,OAAkB,GAAiB,WAAmB,YAAsC;;AACjH,UAAI,MAAM,UAAU;AAClB,YAAI,aAAkB;AAAA,UACpB;AAAA,UACA,KAAK;AAAA,UACL,UAAU,MAAM;AAAA,UAChB,OAAO;AAAA,QAAA;AAGT,aAAI,WAAM,aAAN,mBAAgB,MAAM;AACxB,cAAI,aAAa,CAAA;AACjB,gBAAM,WAAW,OAAO,eAAe,KAAK;AAE5C,mBAAS,OAAO,MAAM,SAAS,MAAM;AACnC,gBAAI,YAAY,IAAI,QAAQ;AAC5B,gBAAIC,WAAe,UAAU,GAAG;AAC9B,kBAAI,aAAa,YAAY;AAC3B,2BAAW,KAAK,GAAG;AACnB;AAAA,cACF;AAAA,YACF,WAAWC,QAAc,UAAU,GAAG;AACpC,kBAAI,WAAW,SAAS,SAAS,GAAG;AAClC,2BAAW,KAAK,GAAG;AAAA,cACrB;AAAA,YACF;AAAA,UACF;AAEA,qBAAW,aAAa;AAAA,QAC1B;AAEA,YAAI,WAAW,YAAY,WAAW,SAAS,MAAM,SAAS,KAAK,MAAM,UAAU,MAAM,OAAO;AAC9F,oBAAU,SAAS,MAAM,QAAQ,KAAK;AACtC,iBAAO;AAAA,QACT;AAEA,cAAM,SAAS,WAAW;AAAA,MAC5B;AAEA,WAAK,SAAS,eAAA;AAAA,IAChB;AAAA,IAEO,QAAQ;AACb,WAAK,WAAA,EAAa,MAAA;AAAA,IACpB;AAAA,IAEO,eAAe;AACpB,aAAO,KAAK;AAAA,IACd;AAAA,IAEO,OAAO;AACZ,WAAK,aAAa;AAClB,WAAK,WAAW,UAAU,OAAO,WAAW;AAAA,IAC9C;AAAA,IAEO,OAAO;AACZ,WAAK,aAAa;AAClB,UAAI,CAAC,KAAK,WAAW,UAAU,SAAS,WAAW,GAAG;AACpD,aAAK,WAAW,UAAU,IAAI,WAAW;AAAA,MAC3C;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,eAAe,MAAc;;AAClC,YAAM,UAAU,KAAK,WAAW,cAAc,iBAAiB;AAC/D,UAAI,SAAS;AACX,gBAAQ,cAAc;AAAA,MACxB,OAAO;AACL,cAAM,WAAW,KAAK,WAAW,cAAc,WAAW;AAC1D,YAAI,UAAU;AACZ,gBAAMC,UAAS,IAAI,UAAA;AACnB,eAAK,MAAM,cAAc;AACzB,gBAAMC,WAAUD,QAAO,gBAAgB,OAAO,uBAAuB,KAAK,KAAK,GAAG,WAAW,EAAE,cAAc,iBAAiB;AAE9H,cAAIC,SAAS,gBAAS,eAAT,mBAAqB,aAAaA,UAAS,SAAS;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAAA,IAEO,UAAU,IAAkB;AAAA,IAEnC;AAAA,IAEO,YAAY,MAAe;AAChC,YAAM,MAAM,KAAK,WAAA;AACjB,UAAI,eAAe,aAAa;AAC9B,YAAI,SAAS,OAAO;AAClB,eAAK,WAAA,EAAa,gBAAgB,UAAU;AAAA,QAC9C,OAAO;AACL,eAAK,WAAA,EAAa,aAAa,YAAY,IAAI;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAAA,IAEO,kBAAkB;AAAA,IAEzB;AAAA,IAEA,OAAc,eAAe,OAA0B;;AACrD,eAAO,WAAM,aAAN,mBAAgB,cAAa,MAAM,SAAS,aAAa;AAAA,IAClE;AAAA,IAEA,OAAc,eAAe,OAA0B;;AACrD,eAAO,WAAM,aAAN,mBAAgB,cAAa,MAAM,SAAS,aAAa;AAAA,IAClE;AAAA,IAEA,OAAc,iBAAiB,OAAe,KAAU;AACtD,UAAI,cAAc;AAClB,YAAM,cAAc,MAAM,QAAQ,6BAA6B,CAAC,OAAO,QAAQ;AAC7E,sBAAc;AACd,eAAO,IAAI,GAAG,KAAK;AAAA,MACrB,CAAC;AAED,UAAI,aAAa;AACf,eAAO;AAAA,MACT;AAEA,aAAO,IAAI,KAAK,KAAK;AAAA,IACvB;AAAA,EACF;ACjMA,QAAM,SAAS;AAAA,IACb,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,IACV,eAAe;AAAA,IACf,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,6BAA6B;AAAA,EAC/B;AAUO,QAAM,kBAAkB,CAAC,OAAe,OAAkB,WAAqC;AACpG,QAAI,CAAC,MAAM,UAAU,gBAAgB;AACnC,aAAO,EAAE,MAAM,MAAM,MAAM,YAAY,CAAA,EAAC;AAAA,IAC1C;AAEA,QAAI,OAAO,WAAW,aAAa;AACjC,eAAS,EAAE,MAAM,MAAM,MAAM,YAAY,CAAA,EAAC;AAAA,IAC5C;AAEA,UAAM,aAAa,MAAM;AAEzB,QAAI,YAAY;AACd,UAAI,CAAC,OAAO,UAAU,EAAE,KAAK,KAAK,GAAG;AACnC,eAAO,SAAS;AAChB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AC/BO,QAAM,YAAY,CAAC,OAAe,OAAkB,WAA+C;AACxG,QAAI,MAAM,WAAW;AACnB,aAAO,YAAY,MAAM,UAAU,OAAO,KAAK;AAC/C,UAAI,OAAO,OAAO,cAAc,UAAU;AACxC,eAAO;AAAA,MACT;AAAA,IACF;AAEA,aAAS,gBAAgB,OAAO,OAAO,MAAM;AAE7C,QAAI,OAAO,QAAQ;AACjB,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,WAAW;AACnB,YAAM,gBAAgB,MAAM,UAAU;AACtC,YAAM,YAAY,MAAM,UAAU,QAAA,EAAU,SAAS,aAAa;AAElE,UAAI,CAACC,QAAc,SAAS,KAAK,MAAM,UAAU,SAAA,KAAc,UAAU,UAAU,YAAY;AAC7F,eAAO,UAAU,MAAM,UAAU;AACjC,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,MAAM,WAAW;AACnB,YAAM,gBAAgB,MAAM,UAAU;AACtC,YAAM,YAAY,MAAM,UAAU,QAAA,EAAU,SAAS,aAAa;AAElE,UAAI,CAACA,QAAc,SAAS,KAAK,MAAM,UAAU,SAAA,KAAc,UAAU,UAAU,YAAY;AAC7F,eAAO,UAAU,MAAM,UAAU;AACjC,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;ACnCO,QAAM,kBAAkB,CAAC,OAAe,UAA4C;AACzF,QAAI,CAAC,MAAM,UAAU,gBAAgB;AACnC,aAAO;AAAA,IACT;AAEA,UAAM,SAAsB,EAAE,MAAM,MAAM,MAAM,YAAY,GAAC;AAC7D,UAAM,WAAW,OAAO,KAAK;AAE7B,QAAI,MAAM,YAAYC,QAAc,KAAK,GAAG;AAC1C,aAAO,WAAW,KAAK,MAAM,QAAQ;AACrC,aAAO;AAAA,IACT;AAEA,QAAI,CAACC,SAAe,KAAK,GAAG;AAC1B,aAAO,WAAW,KAAK,MAAM,GAAG;AAChC,aAAO;AAAA,IACT;AAEA,QAAI,UAAU,OAAO,OAAO,MAAM,MAAM,MAAM;AAC5C,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM;AACnB,QAAI,MAAM;AACR,YAAM,YAAYA,SAAe,KAAK,OAAO,GAC3C,YAAYA,SAAe,KAAK,OAAO;AAEzC,UAAI,UAAU,OACZ,eAAe,OACf,UAAU,OACV,eAAe;AAEjB,UAAI,WAAW;AACb,YAAI,KAAK,oBAAoB,YAAY,KAAK,SAAS;AACrD,yBAAe;AAAA,QACjB,WAAW,WAAW,KAAK,SAAS;AAClC,oBAAU;AAAA,QACZ;AAAA,MACF;AAEA,UAAI,WAAW;AACb,YAAI,KAAK,oBAAoB,YAAY,KAAK,SAAS;AACrD,yBAAe;AAAA,QACjB,WAAW,WAAW,KAAK,SAAS;AAClC,oBAAU;AAAA,QACZ;AAAA,MACF;AAEA,UAAI,aAAa,cAAc,WAAW,gBAAgB,WAAW,eAAe;AAClF,YAAI,KAAK,oBAAoB,KAAK,qBAAqB,gBAAgB,eAAe;AACpF,iBAAO,WAAW,KAAK,MAAM,wBAAwB;AAAA,QACvD,WAAW,cAAc;AACvB,iBAAO,WAAW,KAAK,MAAM,qBAAqB;AAAA,QACpD,WAAW,cAAc;AACvB,iBAAO,WAAW,KAAK,MAAM,qBAAqB;AAAA,QACpD,OAAO;AACL,iBAAO,WAAW,KAAK,MAAM,OAAO;AAAA,QACtC;AAAA,MACF,OAAO;AACL,YAAI,cAAc;AAChB,iBAAO,WAAW,KAAK,MAAM,aAAa;AAAA,QAC5C;AAEA,YAAI,cAAc;AAChB,iBAAO,WAAW,KAAK,MAAM,aAAa;AAAA,QAC5C;AAEA,YAAI,SAAS;AACX,iBAAO,WAAW,KAAK,MAAM,GAAG;AAAA,QAClC;AAEA,YAAI,SAAS;AACX,iBAAO,WAAW,KAAK,MAAM,GAAG;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,SAAS,GAAG;AAChC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AC3FO,QAAM,iBAAiB,CAAC,OAAkB,YAAqB,gBAAuC;AAC3G,QAAI,gBAAgB,MAAM;AACxB,iBAAW,UAAU,OAAO,SAAS;AAErC,UAAI,CAAC,WAAW,UAAU,SAAS,OAAO,GAAG;AAC3C,mBAAW,UAAU,IAAI,OAAO;AAAA,MAClC;AAEA,YAAM,qBAAqB,WAAW,cAAc,kBAAkB;AACtE,UAAI,oBAAoB;AACtB,2BAAmB,YAAY;AAAA,MACjC;AAEA;AAAA,IACF;AAEA,eAAW,UAAU,OAAO,OAAO;AAEnC,QAAI,CAAC,WAAW,UAAU,SAAS,SAAS,GAAG;AAC7C,iBAAW,UAAU,IAAI,SAAS;AAAA,IACpC;AAEA,QAAI,gBAAgB,OAAO;AACzB,YAAMC,WAAoBC,WAAS,aAAa,OAAO,WAAW;AAElE,UAAI,YAAY,SAAS;AACvB,QAAAD,SAAQ,KAAK,YAAY,OAAO;AAAA,MAClC;AAEA,YAAM,qBAAqB,WAAW,cAAc,kBAAkB;AACtE,UAAI,sBAAsBA,SAAQ,SAAS,GAAG;AAC5C,cAAM,UAAoB,CAAA;AAC1B,QAAAA,SAAQ,QAAQ,CAAC,SAAS;AACxB,kBAAQ,KAAK,QAAQ,IAAI,QAAQ;AAAA,QACnC,CAAC;AACD,2BAAmB,YAAY,QAAQ,KAAK,EAAE;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAOO,QAAM,4BAA4B,CAAC,eAAwB;AAChE,eAAW,UAAU,OAAO,SAAS;AACrC,eAAW,UAAU,OAAO,OAAO;AAAA,EACrC;AChDO,QAAM,aAAa,CAAC,OAAkB,SAAkB,eAAuB;AACpF,YAAQ,iBAAiB,SAAS,CAAC,MAAa;AAC9C,4BAAsB,OAAO,GAAG,YAAY,WAAW,UAAU;AACjE,iBAAW,MAAA;AAAA,IACb,CAAC;AAAA,EACH;AAEO,QAAM,mBAAmB,CAAC,OAAkB,SAA2B,eAAuB;AACnG,YAAQ,iBAAiB,SAAS,CAAC,MAAW;AAC5C,YAAM,MAAM,EAAE,OAAO;AAErB,UAAI,CAACD,SAAe,GAAG,GAAG;AACxB,gBAAQ,QAAQ,IAAI,QAAQ,iBAAiB,EAAE;AAC/C,UAAE,eAAA;AAAA,MACJ;AACA,4BAAsB,OAAO,GAAG,YAAY,WAAW,UAAU;AACjE,iBAAW,MAAA;AAAA,IACb,CAAC;AAAA,EAQH;AAEO,QAAM,sBAAsB,CAAC,OAAkB,SAAkB,eAAuB;AAC7F,YAAQ,iBAAiB,UAAU,CAAC,MAAW;AAC7C,4BAAsB,OAAO,GAAG,YAAY,WAAW,UAAU;AACjE,iBAAW,MAAA;AAAA,IACb,CAAC;AAAA,EACH;AAEO,QAAM,wBAAwB,CAAC,OAAkB,GAAU,YAAoB,UAAe;AACnG,eAAW,gBAAgB,OAAO,GAAG,YAAY,KAAK;AAAA,EACxD;AAAA,ECjCA,MAAqB,qBAAqB,OAAO;AAAA,IAG/C,YAAY,OAAkB,YAAyB,UAAoB;AACzE,YAAM,UAAU,OAAO,UAAU;AAEjC,WAAK,QAAA;AACL,WAAK,iBAAA;AACL,WAAK,eAAA;AAAA,IACP;AAAA,IAEA,UAAU;AACR,uBAAiB,KAAK,OAAO,KAAK,SAAS,IAAI;AAAA,IACjD;AAAA,IAEA,cAAc;AACZ,YAAM,QAAQ,KAAK;AAEnB,YAAM,wBAAwB,KAAK,WAAW,cAAc,qBAAqB;AAEjF,4BAAsB,YAAY;AAAA;AAAA,uCAEC,MAAM,QAAQ;AAAA;AAAA,UAE3C,OAAO,uBAAuB,KAAK,CAAC;AAAA;AAAA;AAG1C,WAAK,UAAU,sBAAsB,cAAc,UAAU,MAAM,QAAQ,IAAI;AAAA,IACjF;AAAA,IAEA,WAAW;AACT,aAAO,KAAK,QAAQ;AAAA,IACtB;AAAA,IAEA,SAAS,OAAY,iBAAiC;AACpD,UAAI,oBAAoB,SAAS,KAAK,gBAAgB,KAAK,OAAO,MAAM,MAAM,KAAK,MAAM,OAAO;AAC9F,aAAK,QAAQ,QAAQ,KAAK,MAAM;AAChC;AAAA,MACF;AACA,WAAK,MAAM,SAAS;AACpB,WAAK,QAAQ,QAAQ;AAAA,IACvB;AAAA,IAEA,QAAQ;AACN,WAAK,eAAA;AACL,WAAK,YAAY,KAAK;AACtB,gCAA0B,KAAK,UAAU;AAAA,IAC3C;AAAA,IAEA,aAA0B;AACxB,aAAO,KAAK;AAAA,IACd;AAAA,IAEA,QAAa;AACX,YAAM,cAAc,gBAAgB,KAAK,SAAA,GAAY,KAAK,KAAK;AAE/D,qBAAe,KAAK,OAAO,KAAK,YAAY,WAAW;AAEvD,aAAO;AAAA,IACT;AAAA,EACF;ACtDO,QAAM,kBAAkB,CAAC,OAAe,UAA4C;AACzF,QAAI,CAAC,MAAM,UAAU,gBAAgB;AACnC,aAAO;AAAA,IACT;AAEA,QAAI,SAAsB,EAAE,MAAM,MAAM,MAAM,YAAY,GAAC;AAE3D,QAAI,MAAM,YAAYD,QAAc,KAAK,GAAG;AAC1C,aAAO,WAAW,KAAK,MAAM,QAAQ;AACrC,aAAO;AAAA,IACT;AACA,UAAM,cAAc,UAAU,OAAO,OAAO,MAAM;AAClD,QAAI,gBAAgB,MAAM;AACxB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM;AAEnB,QAAI,MAAM;AACR,YAAM,cAAc,MAAM;AAE1B,YAAM,cAAcC,SAAe,KAAK,SAAS,GAC/C,cAAcA,SAAe,KAAK,SAAS;AAE7C,UAAI,UAAU,OACZ,UAAU;AACZ,UAAI,eAAe,cAAc,KAAK,WAAW;AAC/C,kBAAU;AAAA,MACZ;AACA,UAAI,eAAe,cAAc,KAAK,WAAW;AAC/C,kBAAU;AAAA,MACZ;AAEA,UAAI,eAAe,gBAAgB,WAAW,UAAU;AACtD,eAAO,WAAW,KAAK,MAAM,OAAO;AAAA,MACtC,OAAO;AACL,YAAI,SAAS;AACX,iBAAO,WAAW,KAAK,MAAM,UAAU;AAAA,QACzC;AAEA,YAAI,SAAS;AACX,iBAAO,WAAW,KAAK,MAAM,UAAU;AAAA,QACzC;AAAA,MACF;AACA,UAAI,OAAO,WAAW,SAAS,GAAG;AAChC,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,ECxDA,MAAqB,uBAAuB,OAAO;AAAA,IAGjD,YAAY,OAAkB,YAAyB,UAAoB;AACzE,YAAM,UAAU,OAAO,UAAU;AAEjC,WAAK,QAAA;AACL,WAAK,iBAAA;AACL,WAAK,eAAA;AAAA,IACP;AAAA,IAEA,UAAU;AACR,iBAAW,KAAK,OAAO,KAAK,SAAS,IAAI;AAAA,IAC3C;AAAA,IAEA,cAAc;;AACZ,YAAM,QAAQ,KAAK;AAEnB,YAAM,wBAAwB,KAAK,WAAW,cAAc,qBAAqB;AAEjF,UAAI,QAAO,WAAM,oBAAN,mBAAuB;AAClC,aAAO,CAAC,OAAO,IAAI,OAAO;AAE1B,4BAAsB,YAAY;AAAA;AAAA,8BAER,MAAM,QAAQ,WAAW,IAAI;AAAA;AAAA,UAEjD,OAAO,uBAAuB,KAAK,CAAC;AAAA;AAAA;AAI1C,WAAK,UAAU,sBAAsB,cAAc,UAAU,MAAM,QAAQ,IAAI;AAAA,IACjF;AAAA,IAEA,WAAW;AACT,aAAO,KAAK,QAAQ;AAAA,IACtB;AAAA,IAEA,SAAS,OAAY,iBAAiC;AACpD,UAAI,oBAAoB,SAAS,KAAK,gBAAgB,KAAK,OAAO,MAAM,MAAM,KAAK,MAAM,OAAO;AAC9F,aAAK,QAAQ,QAAQ,KAAK,MAAM;AAChC;AAAA,MACF;AACA,WAAK,MAAM,SAAS;AACpB,WAAK,QAAQ,QAAQ;AAAA,IACvB;AAAA,IAEA,QAAQ;AACN,WAAK,eAAA;AACL,WAAK,YAAY,KAAK;AACtB,gCAA0B,KAAK,UAAU;AAAA,IAC3C;AAAA,IAEA,aAA0B;AACxB,aAAO,KAAK;AAAA,IACd;AAAA,IAEA,QAAa;AACX,YAAM,cAAc,gBAAgB,KAAK,SAAA,GAAY,KAAK,KAAK;AAE/D,qBAAe,KAAK,OAAO,KAAK,YAAY,WAAW;AAEvD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EC7DA,MAAqB,uBAAuB,OAAO;AAAA,IAIjD,YAAY,OAAkB,YAAyB,UAAoB;;AACzE,YAAM,UAAU,OAAO,UAAU;AAEjC,UAAI,mBAAmB;AAEvB,UAAI,CAACR,YAAkB,MAAM,YAAY,GAAG;AAC1C,2BAAmB,MAAM;AAAA,MAC3B;AAEA,YAAM,WAAW,eAAe,eAAe,KAAK;AACpD,UAAI,uBAAuB;AAC3B,uBAAK,MAAM,aAAX,mBAAqB,SAArB,mBAA2B,QAAQ,CAAC,SAAS;AAC3C,YAAI,YAAY,KAAK,QAAQ;AAC7B,YAAI,KAAK,UAAU;AACjB,eAAK,kBAAkB;AAAA,QACzB;AACA,YAAI,aAAa,kBAAkB;AACjC,iCAAuB;AAAA,QACzB;AAAA,MACF;AAEA,UAAI,sBAAsB;AACxB,aAAK,kBAAkB;AAAA,MACzB,WAAW,CAAC,KAAK,iBAAiB;AAChC,cAAI,WAAM,oBAAN,mBAAuB,0BAAyB,MAAM;AACxD,eAAK,oBAAkB,gBAAK,MAAM,aAAX,mBAAqB,SAArB,mBAA2B,UAAS,IAAI,KAAK,MAAM,SAAS,KAAK,CAAC,EAAE,QAAQ,KAAK,KAAK;AAAA,QAC/G;AAAA,MACF;AAEA,UAAIA,YAAkB,KAAK,eAAe,GAAG;AAC3C,aAAK,kBAAkB;AAAA,MACzB;AAEA,WAAK,QAAA;AACL,WAAK,iBAAA;AACL,WAAK,SAAS,KAAK,iBAAiB,KAAK;AAAA,IAC3C;AAAA,IAEA,UAAU;AACR,0BAAoB,KAAK,OAAO,KAAK,SAAS,IAAI;AAAA,IACpD;AAAA,IAEA,cAAc;AACZ,YAAM,QAAQ,KAAK;AAEnB,YAAM,wBAAwB,KAAK,WAAW,cAAc,qBAAqB;AAEjF,UAAI,WAAW,wCAAwC,MAAM,QAAQ;AAAA,YAC7D,KAAK,uBAAuB,KAAK,CAAC;AAAA;AAAA,kBAE5B,OAAO,uBAAuB,KAAK,CAAC;AAAA;AAAA;AAGlD,4BAAsB,YAAY;AAElC,WAAK,UAAU,sBAAsB,cAAc,UAAU,MAAM,QAAQ,IAAI;AAAA,IACjF;AAAA,IAEO,cAAc,OAAkB;AACrC,UAAI,KAAK,MAAM,UAAU;AACvB,aAAK,MAAM,SAAS,OAAO;AAAA,MAC7B,OAAO;AACL,aAAK,MAAM,WAAW;AAAA,UACpB,MAAM;AAAA,QAAA;AAAA,MAEV;AACA,WAAK,QAAQ,YAAY,KAAK,uBAAuB,KAAK,KAAK;AAE/D,UAAI,CAACO,QAAc,KAAK,MAAM,MAAM,GAAG;AACrC,cAAM,eAAe,KAAK,MAAM;AAChC,aAAK,MAAM,SAAS;AACpB,aAAK,SAAS,YAAY;AAAA,MAC5B;AAAA,IACF;AAAA,IAEA,WAAW;AACT,aAAO,KAAK,QAAQ;AAAA,IACtB;AAAA,IAEA,SAAS,OAAY,iBAAiC;AACpD,UAAI,oBAAoB,SAAS,KAAK,gBAAgB,KAAK,OAAO,MAAM,MAAM,KAAK,MAAM,OAAO;AAC9F,aAAK,QAAQ,QAAQ,KAAK,MAAM;AAChC;AAAA,MACF;AACA,WAAK,MAAM,SAAS;AACpB,WAAK,QAAQ,QAAQ;AAAA,IACvB;AAAA,IAEA,QAAQ;AACN,WAAK,SAAS,KAAK,iBAAiB,KAAK;AACzC,WAAK,YAAY,KAAK;AACtB,gCAA0B,KAAK,UAAU;AAAA,IAC3C;AAAA,IAEA,aAA0B;AACxB,aAAO,KAAK;AAAA,IACd;AAAA,IAEA,QAAa;AACX,YAAM,QAAQ,KAAK,SAAA;AAEnB,UAAI,cAAqC;AAEzC,UAAI,KAAK,MAAM,UAAU;AACvB,YAAI,MAAM,SAAS,GAAG;AACpB,wBAAc,EAAE,MAAM,KAAK,MAAM,MAAM,YAAY,GAAC;AACpD,sBAAY,WAAW,KAAK,MAAM,QAAQ;AAAA,QAC5C;AAAA,MACF;AAEA,qBAAe,KAAK,OAAO,KAAK,YAAY,WAAW;AAEvD,aAAO;AAAA,IACT;AAAA,IAEO,uBAAuB,OAAkB;;AAC9C,YAAM,WAAW,OAAO,eAAe,KAAK;AAC5C,YAAM,WAAW,OAAO,eAAe,KAAK;AAC5C,UAAI,WAAW;AAEf,YAAI,WAAM,oBAAN,mBAAuB,0BAAyB,MAAM;AACxD,oBAAY,oBAAoBG,WAAS,WAAW,WAAW,CAAC;AAAA,MAClE;AACA,wBAAM,aAAN,mBAAgB,SAAhB,mBAAsB,QAAQ,CAAC,QAAQ;AACrC,cAAM,OAAO,GAAG,IAAI,WAAW,aAAa,EAAE,IAAI,IAAI,WAAW,aAAa,EAAE;AAChF,YAAIV,YAAkB,IAAI,QAAQ,CAAC,KAAK,IAAI,OAAO;AACjD,sBAAY,kBAAkB,IAAI,SAAS,EAAE,KAAK,IAAI,IAAI,IAAI,KAAK;AAAA,QACrE,OAAO;AACL,sBAAY,kBAAkB,IAAI,QAAQ,CAAC,KAAK,IAAI,IAAI,OAAO,iBAAiB,UAAU,GAAG,CAAC;AAAA,QAChG;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EC7IA,MAAqB,mBAAmB,OAAO;AAAA,IAG7C,YAAY,OAAkB,YAAyB,UAAoB;AACzE,YAAM,UAAU,OAAO,UAAU;AACjC,WAAK,QAAA;AACL,WAAK,iBAAA;AACL,WAAK,eAAA;AAAA,IACP;AAAA,IAEA,UAAU;AACR,iBAAW,KAAK,OAAO,KAAK,SAAS,IAAI;AAAA,IAC3C;AAAA,IAEA,cAAc;AACZ,YAAM,QAAQ,KAAK;AAEnB,YAAM,wBAAwB,KAAK,WAAW,cAAc,qBAAqB;AAEjF,4BAAsB,YAAY;AAAA;AAAA,kCAEJ,MAAM,QAAQ;AAAA;AAAA,QAExC,OAAO,uBAAuB,KAAK,CAAC;AAAA;AAAA;AAIxC,WAAK,UAAU,sBAAsB,cAAc,UAAU,MAAM,QAAQ,IAAI;AAAA,IACjF;AAAA,IAEA,WAAW;AACT,aAAO,KAAK,QAAQ;AAAA,IACtB;AAAA,IAEA,SAAS,OAAY,iBAAiC;AACpD,UAAI,oBAAoB,SAAS,KAAK,gBAAgB,KAAK,OAAO,MAAM,MAAM,KAAK,MAAM,OAAO;AAC9F,aAAK,QAAQ,QAAQ,KAAK,MAAM;AAChC;AAAA,MACF;AACA,WAAK,MAAM,SAAS;AACpB,WAAK,QAAQ,QAAQ;AAAA,IACvB;AAAA,IAEA,QAAQ;AACN,WAAK,eAAA;AACL,WAAK,YAAY,KAAK;AACtB,gCAA0B,KAAK,UAAU;AAAA,IAC3C;AAAA,IAEA,aAA+B;AAC7B,aAAO,KAAK;AAAA,IACd;AAAA,IAEA,QAAa;AACX,YAAM,cAAc,gBAAgB,KAAK,SAAA,GAAY,KAAK,KAAK;AAE/D,qBAAe,KAAK,OAAO,KAAK,YAAY,WAAW;AAEvD,aAAO;AAAA,IACT;AAAA,EACF;ACpDO,WAAS,kBAAkB,aAA0B,OAAkB,aAAgC,aAAmC;;AAC/I,UAAM,aAAa;AAAA,MACjB,eAAe,qBAAqB,MAAM,WAAW;AAAA,MACrD,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,IAAA;AAGjB,UAAM,sBAAoB,gDAAa,UAAb,mBAAoB,eAAc,YAAY,MAAM,cAAc;AAC5F,QAAI,sBAAoB,gDAAa,UAAb,mBAAoB,eAAc,YAAY,MAAM,cAAc;AAC1F,UAAM,aAAW,gDAAa,UAAb,mBAAoB,aAAY,YAAY,MAAM;AAEnE,UAAM,SAAQ,WAAM,UAAN,mBAAa;AAC3B,UAAM,cAAc,sBAAqB,WAAM,UAAN,mBAAa,QAAQ,KAAK,qBAAqB,QAAQ,KAAK,qBAAqB;AAE1H,eAAW,aAAa,GAAG,YAAY,CAAC,IAAI,QAAQ,YAAY,CAAC,IAAI,EAAE,MAAI,WAAM,UAAN,mBAAa,gBAAe,EAAE;AACzG,QAAI,OAAO;AACT,UAAI,SAAS,KAAK,GAAG;AACnB,mBAAW,cAAc,SAAS,KAAK,IAAI,cAAc,KAAK,KAAK;AAAA,MACrE,OAAO;AACL,mBAAW,aAAa,SAAS,KAAK,IAAI,KAAK,SAAS,KAAK;AAAA,MAC/D;AAAA,IACF;AAEA,eAAW,gBAAgB,gBAAgB,CAAC,SAAS,QAAQ,EAAE,UAAS,WAAM,UAAN,mBAAa,QAAQ,IAAI,MAAM,MAAM,WAAW;AAExH,UAAM,eAAa,WAAM,UAAN,mBAAa,eAAc;AAC9C,eAAW,kBAAkB,YAAY,CAAC;AAE1C,QAAI,CAAC,eAAe,cAAc,CAAC,CAAC,OAAO,QAAQ,EAAE,SAAS,YAAY,CAAC,CAAC,GAAG;AAC7E,UAAI,SAAS,UAAU,GAAG;AACxB,cAAM,kBAAkB,CAAC;AACzB,4BAAoB,KAAK;AACzB,mBAAW,aAAa,aAAa,eAAe;AACpD,mBAAW,aAAa,WAAW,aAAa,gBAAgB,aAAa,iBAAiB;AAAA,MAChG,OAAO;AACL,mBAAW,aAAa,SAAS,UAAU;AAAA,MAC7C;AAAA,IACF;AAEA,UAAM,eAAa,WAAM,UAAN,mBAAa,eAAc;AAC9C,QAAI,eAAe,CAAC,CAAC,QAAQ,OAAO,EAAE,SAAS,YAAY,CAAC,CAAC,GAAG;AAC9D,iBAAW,aAAa;AAAA,IAC1B,OAAO;AACL,UAAI,cAAc,CAAC,CAAC,OAAO,QAAQ,EAAE,SAAS,YAAY,CAAC,CAAC,GAAG;AAC7D,YAAI,SAAS,UAAU,GAAG;AACxB,qBAAW,aAAa,WAAW,aAAa,gBAAgB,aAAa,UAAU;AAAA,QACzF,OAAO;AACL,qBAAW,aAAa,SAAS,UAAU;AAAA,QAC7C;AAAA,MACF,OAAO;AACL,mBAAW,aAAa,WAAW,aAAa,gBAAgB;AAAA,MAClE;AAAA,IACF;AAEA,eAAW,aAAa,iBAAiB,WAAW,UAAU,EAAE,KAAK,GAAG;AACxE,eAAW,aAAa,iBAAiB,WAAW,UAAU,EAAE,KAAK,GAAG;AACxE,eAAW,aAAa,iBAAiB,WAAW,UAAU,EAAE,KAAK,GAAG;AAExE,WAAO;AAAA,EACT;AAEO,WAAS,qBAAqB,aAA6B;AAChE,WAAO,gBAAgB,eAAe,kBAAkB;AAAA,EAC1D;AAAA,EC1EA,MAAqB,uBAAuB,OAAO;AAAA,IAGjD,YAAY,OAAkB,YAAyB,UAAoB;;AACzE,YAAM,UAAU,OAAO,UAAU;AAHnC,WAAQ,oBAA2B,CAAA;AAKjC,WAAK,oBAAoB,CAAA;AACzB,UAAI,mBAAmB,CAAA;AACvB,UAAI,CAACA,YAAkB,MAAM,YAAY,GAAG;AAC1C,YAAIG,QAAc,MAAM,YAAY,GAAG;AACrC,6BAAmB,MAAM;AAAA,QAC3B,OAAO;AACL,6BAAmB,CAAC,MAAM,YAAY;AAAA,QACxC;AAAA,MACF;AAEA,YAAM,WAAW,eAAe,eAAe,KAAK;AAEpD,UAAIH,YAAkB,KAAK,MAAM,QAAQ,GAAG;AAC1C,aAAK,cAAc,CAAC,EAAE,OAAO,IAAI,OAAO,IAAA,CAAK,CAAC;AAAA,MAChD;AAEA,UAAI,uBAAuB;AAC3B,uBAAK,MAAM,aAAX,mBAAqB,SAArB,mBAA2B,QAAQ,CAAC,SAAS;AAC3C,YAAI,YAAY,KAAK,QAAQ;AAC7B,YAAI,KAAK,UAAU;AACjB,eAAK,kBAAkB,KAAK,YAAY,YAAY,IAAI;AAAA,QAC1D;AACA,YAAI,iBAAiB,SAAS,SAAS,GAAG;AACxC,iCAAuB;AAAA,QACzB;AAAA,MACF;AAEA,WAAK,oBAAoB,uBAAuB,mBAAmB,KAAK;AAExE,WAAK,QAAA;AACL,WAAK,iBAAA;AACL,WAAK,SAAS,KAAK,mBAAmB,KAAK;AAAA,IAC7C;AAAA,IAEO,UAAU;AACf,WAAK,UAAA;AAAA,IACP;AAAA,IAEO,YAAY;AACjB,YAAM,aAAa,KAAK,WAAW,iBAAiB,KAAK,aAAa;AAEtE,iBAAW,QAAQ,CAAC,QAAQ;AAC1B,YAAI,iBAAiB,UAAU,CAAC,MAAa;AAC3C,gCAAsB,KAAK,OAAO,GAAG,MAAM,KAAK,UAAU;AAC1D,eAAK,MAAA;AAAA,QACP,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IAEO,cAAc;AACnB,aAAO,gCAAgC,KAAK,MAAM,QAAQ;AAAA,IAC5D;AAAA,IAEA,cAAc;;AACZ,YAAM,QAAQ,KAAK;AAEnB,YAAM,wBAAwB,KAAK,WAAW,cAAc,qBAAqB;AAEjF,YAAM,YAAsB,CAAA;AAC5B,YAAM,YAAY,MAAM;AAExB,YAAM,WAAW,OAAO,eAAe,KAAK;AAC5C,YAAM,WAAW,OAAO,eAAe,KAAK;AAE5C,gBAAU,KAAK,qDAAqD;AACpE,wBAAM,aAAN,mBAAgB,SAAhB,mBAAsB,QAAQ,CAAC,QAAQ;AACrC,cAAM,WAAW,OAAO,IAAI,QAAQ,KAAK,EAAE;AAC3C,kBAAU,KAAK;AAAA,uCACkB,qBAAqB,MAAM,SAAS,eAAe,eAAe,UAAU,CAAC;AAAA;AAAA,iDAEnE,SAAS,YAAY,WAAWC,IAAiB,QAAQ,IAAI,EAAE,uCAAuC,IAAI,WAAW,YAAY,EAAE,IAAI,IAAI,WAAW,aAAa,EAAE;AAAA,oBAClM,OAAO,iBAAiB,UAAU,GAAG,CAAC;AAAA;AAAA;AAAA,OAGnD;AAAA,MACH;AACA,gBAAU,KAAK,yDAAyD,OAAO,uBAAuB,KAAK,CAAC,qCAAqC;AAEjJ,4BAAsB,YAAY,UAAU,KAAK,EAAE;AAAA,IACrD;AAAA,IAEO,cAAc,OAAkB;AACrC,YAAM,eAAe,KAAK,WAAW,cAAc,qBAAqB;AACxE,UAAI,cAAc;AAChB,YAAI,KAAK,MAAM,UAAU;AACvB,eAAK,MAAM,SAAS,OAAO;AAAA,QAC7B,OAAO;AACL,eAAK,MAAM,WAAW;AAAA,YACpB,MAAM;AAAA,UAAA;AAAA,QAEV;AAEA,aAAK,YAAA;AAEL,YAAI,CAACM,QAAc,KAAK,MAAM,MAAM,GAAG;AACrC,gBAAM,eAAe,KAAK,MAAM;AAChC,eAAK,MAAM,SAAS;AACpB,eAAK,SAAS,YAAY;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,IAEA,WAAW;AACT,YAAM,aAAa,KAAK,WAAW,iBAAiB,KAAK,aAAa;AAEtE,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,aAAoB,CAAA;AAC1B,mBAAW,QAAQ,CAAC,QAAQ;AAC1B,gBAAM,WAAW;AACjB,cAAI,SAAS,SAAS;AACpB,uBAAW,KAAK,SAAS,KAAK;AAAA,UAChC;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT,OAAO;AACL,cAAM,eAAe,KAAK,WAAW,cAAc,UAAU,KAAK,MAAM,QAAQ,IAAI;AAEpF,YAAI,6CAAc,SAAS;AACzB,iBAAO,aAAa,QAAQ,aAAa,QAAQ;AAAA,QACnD;AAEA,eAAO,aAAa,QAAQ,KAAK;AAAA,MACnC;AAAA,IACF;AAAA,IAEA,SAAS,OAAY,iBAAiC;AACpD,UAAI,oBAAoB,SAAS,KAAK,gBAAgB,KAAK,OAAO,MAAM,MAAM,KAAK,MAAM,OAAO;AAC9F,gBAAQ,KAAK,MAAM;AAAA,MACrB;AAEA,WAAK,MAAM,SAAS;AACpB,UAAI,UAAU,MAAM;AACjB,aAAK,WAAW,cAAc,UAAU,KAAK,MAAM,QAAQ,IAAI,EAAuB,UAAU;AACjG;AAAA,MACF;AAEA,UAAI,UAAU,OAAO;AAClB,aAAK,WAAW,cAAc,UAAU,KAAK,MAAM,QAAQ,IAAI,EAAuB,UAAU;AACjG;AAAA,MACF;AAEA,UAAI,WAAkB,CAAA;AACtB,UAAIJ,QAAc,KAAK,GAAG;AACxB,mBAAW;AAAA,MACb,OAAO;AACL,iBAAS,KAAK,KAAK;AAAA,MACrB;AAEA,YAAM,aAAa,KAAK,WAAW,iBAAiB,KAAK,aAAa;AAEtE,iBAAW,QAAQ,CAAC,QAAQ;AACzB,YAAyB,UAAU;AAAA,MACtC,CAAC;AAED,eAAS,QAAQ,CAAC,QAAQ;AACxB,cAAM,MAAM,KAAK,WAAW,cAAc,UAAU,KAAK,MAAM,QAAQ,aAAa,GAAG,IAAI;AAC3F,YAAI,SAAS,UAAU;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,IAEA,QAAQ;;AACN,YAAI,gBAAK,MAAM,aAAX,mBAAqB,SAArB,mBAA2B,WAAU,KAAK,KAAK,kBAAkB,UAAU,GAAG;AAChF,aAAK,SAAS,MAAM,KAAK;AAAA,MAC3B,OAAO;AACL,aAAK,SAAS,KAAK,mBAAmB,KAAK;AAAA,MAC7C;AACA,WAAK,YAAY,KAAK;AACtB,gCAA0B,KAAK,UAAU;AAAA,IAC3C;AAAA,IAEA,aAAkB;AAChB,aAAO,KAAK,WAAW,iBAAiB,UAAU,KAAK,MAAM,QAAQ,IAAI;AAAA,IAC3E;AAAA,IAEO,QAAQ;AACb,YAAM,WAAW,KAAK,WAAA;AAEtB,UAAI,YAAY,SAAS,SAAS,GAAG;AACnC,aAAK,WAAA,EAAa,CAAC,EAAE,MAAA;AAAA,MACvB;AAAA,IACF;AAAA,IAEA,QAAa;AACX,YAAM,QAAQ,KAAK,SAAA;AAEnB,UAAI,cAAqC;AAEzC,UAAI,KAAK,MAAM,YAAYA,QAAc,KAAK,GAAG;AAC/C,YAAK,MAAgB,SAAS,GAAG;AAC/B,wBAAc,EAAE,MAAM,KAAK,MAAM,MAAM,YAAY,GAAC;AACpD,sBAAY,WAAW,KAAK,MAAM,QAAQ;AAAA,QAC5C;AAAA,MACF;AAEA,qBAAe,KAAK,OAAO,KAAK,YAAY,WAAW;AAEvD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EC5MA,MAAqB,oBAAoB,OAAO;AAAA,IAG9C,YAAY,OAAkB,YAAyB,UAAoB;;AACzE,YAAM,UAAU,OAAO,UAAU;AAEjC,WAAK,oBAAoB;AACzB,UAAI,mBAAmB,CAAA;AACvB,UAAI,CAACH,YAAkB,MAAM,YAAY,GAAG;AAC1C,2BAAmB,MAAM;AAAA,MAC3B;AAEA,YAAM,WAAW,YAAY,eAAe,KAAK;AACjD,UAAI,uBAAuB;AAC3B,uBAAK,MAAM,aAAX,mBAAqB,SAArB,mBAA2B,QAAQ,CAAC,SAAS;AAC3C,YAAI,YAAY,KAAK,QAAQ;AAC7B,YAAI,KAAK,UAAU;AACjB,eAAK,oBAAoB;AAAA,QAC3B;AAEA,YAAI,oBAAoB,WAAW;AACjC,iCAAuB;AAAA,QACzB;AAAA,MACF;AAIA,UAAI,sBAAsB;AACxB,aAAK,oBAAoB;AAAA,MAC3B,WAAW,CAAC,KAAK,mBAAmB;AAClC,aAAK,sBAAoB,gBAAK,MAAM,aAAX,mBAAqB,SAArB,mBAA2B,UAAS,KAAI,UAAK,MAAM,aAAX,mBAAqB,KAAK,GAAG,YAAY;AAAA,MAC5G;AAEA,WAAK,QAAA;AACL,WAAK,iBAAA;AACL,WAAK,SAAS,KAAK,mBAAmB,KAAK;AAAA,IAC7C;AAAA,IAEO,UAAU;AACf,WAAK,UAAA;AAAA,IACP;AAAA,IAEO,YAAY;AACjB,YAAM,aAAa,KAAK,WAAW,iBAAiB,KAAK,aAAa;AAEtE,iBAAW,QAAQ,CAAC,QAAQ;AAC1B,YAAI,iBAAiB,UAAU,CAAC,MAAa;AAC3C,gCAAsB,KAAK,OAAO,GAAG,MAAM,KAAK,UAAU;AAE1D,eAAK,MAAA;AAAA,QACP,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IAEO,cAAc;AACnB,aAAO,6BAA6B,KAAK,MAAM,QAAQ;AAAA,IACzD;AAAA,IAEA,cAAc;;AACZ,YAAM,QAAQ,KAAK;AAEnB,YAAM,wBAAwB,KAAK,WAAW,cAAc,qBAAqB;AAEjF,YAAM,YAAsB,CAAA;AAC5B,YAAM,YAAY,MAAM;AAExB,YAAM,WAAW,OAAO,eAAe,KAAK;AAC5C,YAAM,WAAW,OAAO,eAAe,KAAK;AAE5C,gBAAU,KAAK,oDAAoD;AAEnE,wBAAM,aAAN,mBAAgB,SAAhB,mBAAsB,QAAQ,CAAC,QAAQ;AACrC,cAAM,WAAW,IAAI,QAAQ;AAE7B,kBAAU;AAAA,UACR,8BAA8B,qBAAqB,MAAM,eAAe,eAAe,UAAU,CAAC;AAAA;AAAA,wCAElE,SAAS,YAAY,QAAQ,oCAAoC,IAAI,WAAW,YAAY,EAAE,IAAI,IAAI,WAAW,aAAa,EAAE;AAAA,cAC1J,OAAO,iBAAiB,UAAU,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA,QAAA;AAAA,MAKhD;AACA,gBAAU,KAAK;AAAA,UACT,OAAO,uBAAuB,KAAK,CAAC;AAAA;AAAA,KAEzC;AAED,4BAAsB,YAAY,UAAU,KAAK,EAAE;AAEnD,WAAK,UAAA;AAAA,IACP;AAAA,IAEO,cAAc,OAAkB;AACrC,YAAM,eAAe,KAAK,WAAW,cAAc,qBAAqB;AACxE,UAAI,cAAc;AAChB,YAAI,KAAK,MAAM,UAAU;AACvB,eAAK,MAAM,SAAS,OAAO;AAAA,QAC7B,OAAO;AACL,eAAK,MAAM,WAAW;AAAA,YACpB,MAAM;AAAA,UAAA;AAAA,QAEV;AAEA,aAAK,YAAA;AAEL,YAAI,CAACO,QAAc,KAAK,MAAM,MAAM,GAAG;AACrC,gBAAM,eAAe,KAAK,MAAM;AAChC,eAAK,MAAM,SAAS;AACpB,eAAK,SAAS,YAAY;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,IAEA,WAAW;;AACT,cAAQ,UAAK,WAAW,cAAc,UAAU,KAAK,MAAM,QAAQ,YAAY,MAAvE,mBAA+F;AAAA,IACzG;AAAA,IAEA,SAAS,OAAY,iBAAiC;AACpD,UAAI,oBAAoB,SAAS,KAAK,gBAAgB,KAAK,OAAO,MAAM,MAAM,KAAK,MAAM,OAAO;AAC9F,gBAAQ,KAAK,MAAM;AAAA,MACrB;AAEA,WAAK,MAAM,SAAS;AACpB,UAAI,UAAU,MAAM;AACjB,aAAK,WAAW,cAAc,UAAU,KAAK,MAAM,QAAQ,IAAI,EAAuB,UAAU;AACjG;AAAA,MACF;AAEA,UAAI,UAAU,OAAO;AAClB,aAAK,WAAW,cAAc,UAAU,KAAK,MAAM,QAAQ,IAAI,EAAuB,UAAU;AACjG;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,WAAW,iBAAiB,KAAK,aAAa;AAEpE,eAAS,QAAQ,CAAC,QAAQ;AACxB,YAAI,WAAW;AACf,YAAI,SAAS,SAAS,OAAO;AAC3B,mBAAS,UAAU;AAAA,QACrB,OAAO;AACL,mBAAS,UAAU;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAEA,QAAQ;AACN,WAAK,SAAS,KAAK,mBAAmB,KAAK;AAC3C,WAAK,YAAY,KAAK;AACtB,gCAA0B,KAAK,UAAU;AAAA,IAC3C;AAAA,IAEA,aAAkB;AAChB,aAAO,KAAK,WAAW,iBAAiB,KAAK,aAAa;AAAA,IAC5D;AAAA,IAEO,QAAQ;AACb,YAAM,WAAW,KAAK,WAAA;AAEtB,UAAI,YAAY,SAAS,SAAS,GAAG;AACnC,aAAK,WAAA,EAAa,CAAC,EAAE,MAAA;AAAA,MACvB;AAAA,IACF;AAAA,IAEA,QAAa;AACX,YAAM,QAAQ,KAAK,SAAA;AAEnB,UAAI,cAAqC;AAEzC,UAAI,KAAK,MAAM,UAAU;AACvB,YAAIA,QAAc,KAAK,GAAG;AACxB,wBAAc,EAAE,MAAM,KAAK,MAAM,MAAM,YAAY,GAAC;AACpD,sBAAY,WAAW,KAAK,MAAM,QAAQ;AAAA,QAC5C;AAAA,MACF;AAEA,qBAAe,KAAK,OAAO,KAAK,YAAY,WAAW;AAEvD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,ECxLA,MAAqB,uBAAuB,OAAO;AAAA,IAGjD,YAAY,OAAkB,YAAyB,UAAoB;AACzE,YAAM,UAAU,OAAO,UAAU;AAEjC,WAAK,QAAA;AACL,WAAK,iBAAA;AACL,WAAK,eAAA;AAAA,IACP;AAAA,IAEA,UAAU;AACR,iBAAW,KAAK,OAAO,KAAK,SAAS,IAAI;AAAA,IAC3C;AAAA,IAEA,cAAc;AACZ,YAAM,QAAQ,KAAK;AAEnB,YAAM,wBAAwB,KAAK,WAAW,cAAc,qBAAqB;AAEjF,4BAAsB,YAAY;AAAA;AAAA,2CAEK,MAAM,QAAQ;AAAA;AAAA,UAE/C,OAAO,uBAAuB,KAAK,CAAC;AAAA;AAAA;AAI1C,WAAK,UAAU,sBAAsB,cAAc,UAAU,MAAM,QAAQ,IAAI;AAAA,IACjF;AAAA,IAEA,WAAW;AACT,aAAO,KAAK,QAAQ;AAAA,IACtB;AAAA,IAEA,SAAS,OAAY,iBAAiC;AACpD,UAAI,oBAAoB,SAAS,KAAK,gBAAgB,KAAK,OAAO,MAAM,MAAM,KAAK,MAAM,OAAO;AAC9F,aAAK,QAAQ,QAAQ,KAAK,MAAM;AAChC;AAAA,MACF;AACA,WAAK,MAAM,SAAS;AACpB,WAAK,QAAQ,QAAQ;AAAA,IACvB;AAAA,IAEA,QAAQ;AACN,WAAK,eAAA;AACL,WAAK,YAAY,KAAK;AACtB,gCAA0B,KAAK,UAAU;AAAA,IAC3C;AAAA,IAEA,aAA0B;AACxB,aAAO,KAAK;AAAA,IACd;AAAA,IAEA,QAAa;AACX,YAAM,cAAc,gBAAgB,KAAK,SAAA,GAAY,KAAK,KAAK;AAE/D,qBAAe,KAAK,OAAO,KAAK,YAAY,WAAW;AAEvD,aAAO;AAAA,IACT;AAAA,EACF;ACxDO,QAAM,gBAAgB,CAAC,SAA2B,OAAkB,aAAgD;AACzH,UAAM,SAAsB,EAAE,MAAM,MAAM,MAAM,YAAY,GAAC;AAE7D,QAAI,MAAM,YAAY,SAAS,SAAS,GAAG;AACzC,aAAO,WAAW,KAAK,MAAM,QAAQ;AACrC,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,WAAW,SAAS,GAAG;AAChC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EChBA,MAAqB,mBAAmB,OAAO;AAAA,IAO7C,YAAY,OAAkB,YAAyB,UAAoB;;AACzE,YAAM,UAAU,OAAO,UAAU;AANnC,WAAQ,YAAmB,CAAA;AAC3B,WAAQ,cAAmB,CAAA;AAC3B,WAAQ,WAAkB,CAAA;AAC1B,WAAQ,UAAU;AAKhB,WAAK,UAAU,WAAW,cAAc,UAAU,MAAM,QAAQ,IAAI;AACpE,WAAK,aAAW,WAAM,aAAN,mBAAgB,SAAQ,CAAA;AACxC,WAAK,QAAA;AACL,WAAK,iBAAA;AAAA,IACP;AAAA,IAEA,UAAU;AACR,WAAK,QAAQ,iBAAiB,UAAU,CAAC,MAAa;;AACpD,cAAM,SAAS,OAAE,WAAF,mBAA+B;AAE9C,YAAI,OAAO;AACT,cAAI,WAAW,CAAA;AACf,mBAAS,QAAQ,OAAO;AACtB,qBAAS,KAAK,IAAI;AAAA,UACpB;AACA,eAAK,SAAS,QAAQ;AAAA,QACxB;AACA,8BAAsB,KAAK,OAAO,GAAG,MAAM,KAAK,QAAQ;AACxD,aAAK,MAAA;AAAA,MACP,CAAC;AAED,WAAK,SAAS,QAAQ,CAAC,SAAS;AAC9B,aAAK,OAAO,KAAK,WAAW;AAAA,MAC9B,CAAC;AAED,WAAK,YAAY,KAAK,QAAQ;AAAA,IAChC;AAAA,IAEA,cAAc;AACZ,YAAM,QAAQ,KAAK;AAEnB,YAAM,wBAAwB,KAAK,WAAW,cAAc,qBAAqB;AAEjF,4BAAsB,YAAY;AAAA;AAAA;AAAA;AAAA,qCAID,MAAM,QAAQ;AAAA,YACvCG,WAAS,WAAW,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAKvC,OAAO,uBAAuB,KAAK,CAAC;AAAA;AAAA;AAAA;AAKtC,WAAK,UAAU,sBAAsB,cAAc,UAAU,MAAM,QAAQ,IAAI;AAAA,IACjF;AAAA,IAEA,SAAS,OAAc;AACrB,UAAI,UAAU;AAEd,YAAM,WAAuB,CAAA;AAE7B,eAAS,QAAQ,OAAO;AACtB,cAAM,gBAAgB,KAAK,SAAS,OAAO,CAAC,aAAa,SAAS,YAAY,KAAK,QAAQ,SAAS,YAAY,KAAK,QAAQ,SAAS,gBAAgB,KAAK,YAAY;AAEvK,YAAI,cAAc,SAAS,EAAG;AAC9B,aAAK,WAAW;AAChB,aAAK,YAAY,KAAK,OAAO,IAAI;AAEjC,YAAI,cAAc;AAAA,UAChB,UAAU,KAAK;AAAA,UACf,MAAM,KAAK;AAAA,UACX,UAAU,KAAK;AAAA,UACf,cAAc,KAAK;AAAA,QAAA;AAGrB,iBAAS,KAAK,WAAW;AACzB,kBAAU;AAAA,MACZ;AACA,UAAI,SAAS;AACX,aAAK,YAAY,QAAQ;AACzB,aAAK,SAAS,KAAK,GAAG,QAAQ;AAAA,MAChC;AAAA,IACF;AAAA,IAEQ,YAAY,UAAsB,UAAgC;AACxE,YAAM,kBAAkB,KAAK,WAAW,cAAc,eAAe;AAErE,UAAI,iBAAiB;AACnB,YAAI,aAAa,MAAM;AACrB,0BAAgB,YAAY;AAAA,QAC9B;AAEA,cAAM,mBAA6B,CAAA;AAEnC,iBAAS,QAAQ,CAAC,SAAS;AACzB,2BAAiB,KAAK;AAAA,8CACgB,KAAK,IAAI;AAAA,YAC3C,KAAK,SAAS,wDAAwD,kDAAkD;AAAA,uCAC7F,KAAK,QAAQ;AAAA,eACrC;AAAA,QACT,CAAC;AAED,wBAAgB,mBAAmB,aAAa,iBAAiB,KAAK,EAAE,CAAC;AAEzE,iBAAS,QAAQ,CAAC,SAAS;AACzB,eAAK,gBAAgB,MAAM,eAAe;AAC1C,eAAK,kBAAkB,MAAM,eAAe;AAAA,QAC9C,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQQ,kBAAkB,MAAgB,iBAA0B;AAClE,YAAM,MAAM,gBAAgB,cAAc,cAAc,KAAK,IAAI,sBAAsB;AACvF,UAAI,KAAK;AACP,YAAI,iBAAiB,SAAS,CAAC,QAAe;AAC5C,gBAAM,kBAAmB,IAAI,OAAmB,QAAQ,eAAe;AAEvE,cAAI,iBAAiB;AACnB,kBAAM,UAAU,gBAAgB,aAAa,UAAU;AACvD,gBAAI,SAAS;AACX,oBAAM,MAAM,SAAS,SAAS,EAAE;AAChC,oBAAM,MAAM,KAAK,SAAS,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG;AAEzD,oBAAMC,QAAO,KAAK,SAAS,GAAG;AAE9B,kBAAIA,MAAK,KAAK,GAAG;AACf,yBAAS,OAAOA,MAAK,KAAK;AAC1B;AAAA,cACF;AAEA,kBAAI,KAAK,MAAM,cAAc;AAC3B,qBAAK,MAAM,aAAa,KAAK,MAAM,EAAE,MAAMA,OAAM,OAAO,KAAK,MAAA,CAAO;AACpE;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQQ,gBAAgB,MAAgB,iBAA0B;AAChE,YAAM,MAAM,gBAAgB,cAAc,cAAc,KAAK,IAAI,oBAAoB;AACrF,UAAI,KAAK;AACP,YAAI,iBAAiB,SAAS,CAAC,QAAe;AAC5C,gBAAM,kBAAmB,IAAI,OAAmB,QAAQ,eAAe;AAEvE,cAAI,iBAAiB;AACnB,kBAAM,UAAU,gBAAgB,aAAa,UAAU;AACvD,gBAAI,SAAS;AACX,oBAAM,MAAM,SAAS,SAAS,EAAE;AAChC,oBAAM,YAAY,KAAK,SAAS,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG;AAE/D,oBAAM,aAAa,KAAK,SAAS,SAAS;AAE1C,mBAAK,SAAS,OAAO,WAAW,CAAC;AACjC,qBAAO,KAAK,YAAY,GAAG;AAC3B,8BAAgB,OAAA;AAEhB,kBAAI,WAAW,QAAQ;AACrB,qBAAK,UAAU,KAAK,WAAW,MAAM;AAAA,cACvC;AAAA,YACF;AAAA,UACF;AACA,eAAK,MAAA;AAAA,QACP,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,WAAW;AACT,aAAO;AAAA,QACL,YAAY,OAAO,OAAO,KAAK,WAAW;AAAA,QAC1C,WAAW,KAAK;AAAA,MAAA;AAAA,IAEpB;AAAA,IAEO,cAAc,OAAkB;AACrC,WAAK,WAAW,CAAA;AAChB,WAAK,cAAc,CAAA;AACnB,WAAK,YAAY,CAAA;AACjB,eAAS,QAAQ,OAAO;AACtB,aAAK,OAAO,KAAK,WAAW;AAE5B,aAAK,SAAS,KAAK,IAAI;AAAA,MACzB;AAEA,WAAK,YAAY,KAAK,UAAU,IAAI;AAAA,IACtC;AAAA,IAEA,SAAS,OAAkB;AACzB,UAAI,QAAQ,KAAK,GAAG;AAClB,aAAK,cAAc,KAAK;AAAA,MAC1B;AACA,WAAK,QAAQ,QAAQ;AAAA,IACvB;AAAA,IAEA,QAAQ;AACN,WAAK,SAAS,EAAE;AAChB,WAAK,cAAc,EAAE;AACrB,gCAA0B,KAAK,UAAU;AAAA,IAC3C;AAAA,IAEA,aAA+B;AAC7B,aAAO,KAAK;AAAA,IACd;AAAA,IAEA,QAAa;AACX,YAAM,cAAc,cAAc,KAAK,SAAS,KAAK,OAAO,KAAK,QAAQ;AAEzE,qBAAe,KAAK,OAAO,KAAK,YAAY,WAAW;AAEvD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,ECvOA,MAAqB,qBAAqB,OAAO;AAAA,IAG/C,YAAY,OAAkB,YAAyB,UAAoB;AACzE,YAAM,UAAU,OAAO,UAAU;AACjC,UAAI,MAAM,UAAU;AAClB,aAAK,iBAAiB,MAAM;AAC5B,aAAK,QAAA;AACL,aAAK,iBAAA;AACL,aAAK,eAAA;AAAA,MACP,OAAO;AACL,aAAK,iBAAiB,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,IAEA,UAAU;AACR,UAAI,KAAK,eAAe,SAAS;AAC9B,aAAK,eAAe,QAAgB,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU;AAAA,MAC7E;AAAA,IACF;AAAA,IAEA,OAAO,eAAwB;AAC7B,aAAO;AAAA,IACT;AAAA,IAEA,cAAc;AACZ,YAAM,QAAQ,KAAK;AAEnB,YAAM,gBAAgBL,QAAc,MAAM,QAAQ,IAAI,KAAKJ,WAAe,MAAM,QAAQ,IAAI,MAAM,WAAW,MAAM,SAAA;AAEnH,YAAM,wBAAwB,KAAK,WAAW,cAAc,qBAAqB;AAEjF,4BAAsB,YAAY;AAAA,UAC5B,aAAa;AAAA;AAAA,YAEX,OAAO,uBAAuB,KAAK,CAAC;AAAA;AAAA,IAE9C;AAAA,IAEA,WAAW;AACT,UAAI,KAAK,eAAe,UAAU;AAChC,eAAQ,KAAK,eAAe,SAAiB,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU;AAAA,MACrF;AACA,aAAO;AAAA,IACT;AAAA,IAEA,SAAS,OAAY,iBAAiC;AACpD,UAAI,KAAK,eAAe,UAAU;AAChC,YAAI,oBAAoB,SAAS,KAAK,gBAAgB,KAAK,OAAO,MAAM,MAAM,KAAK,MAAM,OAAO;AAC9F,kBAAQ,KAAK,MAAM;AAAA,QACrB;AACC,aAAK,eAAe,SAAiB,KAAK,MAAM,OAAO,KAAK,OAAO,KAAK,UAAU;AAAA,MACrF;AAEA,WAAK,MAAM,SAAS;AAAA,IACtB;AAAA,IAEA,QAAQ;AACN,WAAK,eAAA;AACL,gCAA0B,KAAK,UAAU;AAAA,IAC3C;AAAA,IAEA,aAAa;AACX,UAAI,KAAK,eAAe,YAAY;AAClC,eAAQ,KAAK,eAAe,WAAmB,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU;AAAA,MACvF;AACA,aAAO;AAAA,IACT;AAAA,IAEA,QAAa;AACX,UAAI,KAAK,eAAe,OAAO;AAC7B,cAAMU,eAAe,KAAK,eAAe,MAAc,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU;AAE7F,uBAAe,KAAK,OAAO,KAAK,YAAYA,YAAW;AAEvD;AAAA,MACF;AACA,YAAM,cAAc,gBAAgB,KAAK,SAAA,GAAY,KAAK,KAAK;AAE/D,qBAAe,KAAK,OAAO,KAAK,YAAY,WAAW;AAEvD,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAKA,QAAc;AACZ,UAAI,KAAK,eAAe,OAAO;AAC5B,aAAK,eAAe,MAAc,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAAA,EC/FA,MAAqB,oBAAoB,OAAO;AAAA,IAC9C,YAAY,OAAkB,YAAyB,UAAoB;AACzE,YAAM,UAAU,OAAO,UAAU;AAAA,IACnC;AAAA,IAEO,UAAU;AAAA,IAAC;AAAA,IAElB,OAAO,eAAwB;AAC7B,aAAO;AAAA,IACT;AAAA,IAEA,cAAc;AACZ,aAAO;AAAA,IACT;AAAA,IAEA,WAAW;AACT,aAAO;AAAA,IACT;AAAA,IAEA,SAAS,OAAkB;AAAA,IAAC;AAAA,IAE5B,QAAQ;AAAA,IAAC;AAAA,IAET,aAA0B;AACxB,aAAO,KAAK;AAAA,IACd;AAAA,IAEA,QAAa;AACX,aAAO;AAAA,IACT;AAAA,IAEO,cAAc,SAAkB;AACrC,UAAI,eAAe,KAAK,WAAW,cAAc,qBAAqB;AAEtE,UAAI,cAAc;AAChB,qBAAa,OAAO,OAAO;AAAA,MAC7B,OAAO;AACL,aAAK,WAAW,OAAO,OAAO;AAAA,MAChC;AAAA,IACF;AAAA,IAEA,QAAc;AAAA,IAAC;AAAA,EACjB;AAAA,EC1CA,MAAqB,qBAAqB,OAAO;AAAA,IAC/C,YAAY,OAAkB,YAAyB,UAAoB;AACzE,YAAM,UAAU,OAAO,UAAU;AACjC,WAAK,MAAM,SAAS,MAAM;AAAA,IAC5B;AAAA,IAEA,UAAU;AAAA,IAAC;AAAA,IAEX,cAAc;AACZ,aAAO;AAAA,IACT;AAAA,IAEA,WAAW;AACT,aAAO,KAAK,MAAM;AAAA,IACpB;AAAA,IAEA,SAAS,OAAkB;AACzB,WAAK,MAAM,SAAS;AAAA,IACtB;AAAA,IAEA,QAAQ;AACN,WAAK,SAAS,KAAK,MAAM,YAAY;AAAA,IACvC;AAAA,IAEA,aAAa;AACX;AAAA,IACF;AAAA,IAEA,QAAa;AACX,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EC/BA,MAAqB,qBAAqB,OAAO;AAAA,IAC/C,YAAY,OAAkB,YAAyB,UAAoB;AACzE,YAAM,UAAU,OAAO,UAAU;AACjC,WAAK,QAAA;AACL,WAAK,iBAAA;AAAA,IACP;AAAA,IAEA,UAAU;;AACR,iBAAK,WAAW,cAAc,IAAI,KAAK,MAAM,IAAI,EAAE,MAAnD,mBAAsD,iBAAiB,SAAS,CAAC,QAAQ;AACvF,YAAI,KAAK,MAAM,SAAS;AACtB,eAAK,MAAM,QAAQ,KAAK,MAAM,KAAK,KAAK;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAAA,IAEA,OAAO,eAAwB;AAC7B,aAAO;AAAA,IACT;AAAA,IAEA,cAAc;AACZ,YAAM,QAAQ,KAAK;AAEnB,YAAM,wBAAwB,KAAK,WAAW,cAAc,qBAAqB;AAEjF,4BAAsB,YAAY;AAAA,kCACJ,MAAM,IAAI,oBAAoB,MAAM,KAAK,aAAa,OAAO,uBAAuB,KAAK,CAAC;AAAA;AAAA,IAE1H;AAAA,IAEA,WAAW;AACT,aAAO;AAAA,IACT;AAAA,IAEA,SAAS,OAAkB;AAAA,IAAC;AAAA,IAE5B,QAAQ;AACN,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,IAEA,aAAa;AACX,aAAO;AAAA,IACT;AAAA,IAEA,QAAa;AACX,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EC3CA,MAAqB,oBAAoB,OAAO;AAAA,IAI9C,YAAY,OAAkB,YAAyB,UAAoB;AACzE,YAAM,UAAU,OAAO,UAAU;AAEjC,WAAK,kBAAkB,WAAW,cAAc,eAAe;AAE/D,WAAK,QAAA;AACL,WAAK,iBAAA;AACL,WAAK,eAAA;AAAA,IACP;AAAA,IAEA,UAAU;AACR,WAAK,QAAQ,iBAAiB,SAAS,CAAC,MAAW;AACjD,aAAK,gBAAgB,YAAY,EAAE,OAAO;AAE1C,aAAK,QAAQ,aAAa,SAAS,EAAE,OAAO,KAAK;AACjD,8BAAsB,KAAK,OAAO,GAAG,MAAM,KAAK,UAAU;AAC1D,aAAK,MAAA;AAAA,MACP,CAAC;AAAA,IACH;AAAA,IAEA,cAAc;AACZ,YAAM,QAAQ,KAAK;AAEnB,YAAM,wBAAwB,KAAK,WAAW,cAAc,qBAAqB;AAEjF,4BAAsB,YAAY;AAAA;AAAA,yCAEG,MAAM,eAAe,MAAM,eAAe,CAAC;AAAA,wCAC5C,MAAM,QAAQ,sDAAsD,MAAM,KAAK,OAAO,UAAU,MAAM,KAAK,OAAO;AAAA;AAAA,UAEhJ,OAAO,uBAAuB,KAAK,CAAC;AAAA;AAAA;AAI1C,WAAK,UAAU,sBAAsB,cAAc,UAAU,MAAM,QAAQ,IAAI;AAAA,IACjF;AAAA,IAEA,WAAW;AACT,aAAO,KAAK,QAAQ;AAAA,IACtB;AAAA,IAEA,SAAS,OAAY,iBAAiC;AACpD,UAAI,oBAAoB,SAAS,KAAK,gBAAgB,KAAK,OAAO,MAAM,MAAM,KAAK,MAAM,OAAO;AAC9F,aAAK,QAAQ,QAAQ,KAAK,MAAM;AAChC;AAAA,MACF;AACA,WAAK,MAAM,SAAS;AACpB,WAAK,QAAQ,QAAQ;AAAA,IACvB;AAAA,IAEA,QAAQ;AACN,WAAK,eAAA;AACL,WAAK,YAAY,KAAK;AACtB,gCAA0B,KAAK,UAAU;AAAA,IAC3C;AAAA,IAEA,aAA0B;AACxB,aAAO,KAAK;AAAA,IACd;AAAA,IAEA,QAAa;AACX,YAAM,cAAc,gBAAgB,KAAK,SAAA,GAAY,KAAK,KAAK;AAE/D,qBAAe,KAAK,OAAO,KAAK,YAAY,WAAW;AAEvD,aAAO;AAAA,IACT;AAAA,EACF;AC3EA,WAAS,WAAW,OAAO;AACzB,WAAO,OAAO,UAAU;AAAA,EAC1B;AAsJA,WAAS,SAAS,OAAO;AACvB,WAAO,OAAO,UAAU;AAAA,EAC1B;AAOA,WAAS,MAAM,OAAO;AACpB,WAAO,UAAU,QAAQ,UAAU;AAAA,EACrC;AACA,WAAS,QAAQ,OAAO;AACtB,QAAI,MAAM,KAAK,GAAG;AAChB,aAAO;AAAA,IACT;AACA,QAAI,SAAS,KAAK,GAAG;AACnB,aAAO,MAAM,KAAI,MAAO;AAAA,IAC1B;AACA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO,MAAM,WAAW;AAAA,IAC1B;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,OAAO,KAAK,KAAK,EAAE,WAAW;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AACA,WAAS,UAAU,OAAO,aAAa,OAAO;AAC5C,QAAI,eAAe,KAAM,QAAO,CAAC,OAAO,MAAM,KAAK;AACnD,YAAQ,OAAO,UAAU,YAAY,SAAS,KAAK,KAAK,MAAM,KAAI,MAAO,MAAM,CAAC,MAAM,WAAW,KAAK,CAAC,MAAM,SAAS,OAAO,KAAK,CAAC;AAAA,EACrI;AAmDA,WAAS,QAAQ,KAAK,KAAK,KAAK,KAAK;AACnC,WAAO,IAAI,KAAK,KAAK,IAAI,GAAG;AAAA,EAC9B;AACA,WAAS,aAAa,KAAK,KAAK,KAAK,KAAK;AACxC,WAAO,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI;AAAA,EACpC;AAwCA,WAAS,IAAI,UAAU,MAAM,IAAI,OAAO,KAAK,SAAS,OAAO;AAC3D,QAAI,MAAM;AACV,QAAI,QAAQ,QAAQ,GAAG;AACrB,YAAM;AAAA,IACR,OAAO;AACL,YAAM,SAAS,QAAQ,IAAI,WAAW,GAAG,QAAQ;AAAA,IACnD;AACA,UAAM,YAAY,IAAI;AACtB,QAAI,YAAY,MAAM;AACpB,aAAO,SAAS,IAAI,MAAM,GAAG,IAAI,IAAI;AAAA,IACvC;AACA,UAAM,MAAM,OAAO;AACnB,QAAI,MAAM,EAAG,QAAO;AACpB,UAAM,SAAS,GAAG,OAAO,GAAG;AAC5B,WAAO,SAAS,MAAM,SAAS,MAAM,MAAM;AAAA,EAC7C;ACvSA,MAAIC,kBAAgB;AAAA,IAClB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,QAAQ;AAAA,MACN,MAAM,CAAC,WAAW,YAAY,SAAS,SAAS,OAAO,QAAQ,QAAQ,UAAU,aAAa,WAAW,YAAY,UAAU;AAAA,MAC/H,MAAM,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,IAC7F;AAAA,IACE,OAAO;AAAA,MACL,MAAM,CAAC,UAAU,UAAU,WAAW,aAAa,YAAY,UAAU,UAAU;AAAA,MACnF,MAAM,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,IAC1D;AAAA,EACA;AACA,MAAA,aAAA,MAAM,SAAS;AAAA,IACb,cAAc;AACZ,WAAK,OAAOA;AAAAA,IACd;AAAA,IACA,kBAAkB,MAAM;AACtBA,wBAAgB,OAAO,OAAOA,iBAAe,IAAI;AAAA,IACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,IAAI,MAAM;AACR,WAAK,OAAO,OAAO,OAAO,CAAA,GAAIA,iBAAe,IAAI;AAAA,IACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,WAAW,YAAY;AACrB,aAAO,KAAK,KAAK,UAAU;AAAA,IAC7B;AAAA,IACA,iBAAiB,KAAK,OAAO,QAAQ;AACnC,aAAO,KAAK,KAAK,OAAO,IAAI,EAAE,GAAG,KAAK;AAAA,IACxC;AAAA,IACA,gBAAgB,KAAK,OAAO,QAAQ;AAClC,aAAO,KAAK,KAAK,MAAM,IAAI,EAAE,GAAG,KAAK;AAAA,IACvC;AAAA,IACA,aAAa,KAAK,OAAO,QAAQ;AAC/B,aAAO,QAAQ,SAAS,KAAK,KAAK,OAAO,KAAK,QAAQ,GAAG,IAAI,KAAK,KAAK,OAAO,KAAK,QAAQ,GAAG;AAAA,IAChG;AAAA,IACA,YAAY,KAAK,OAAO,QAAQ;AAC9B,aAAO,QAAQ,SAAS,KAAK,KAAK,MAAM,KAAK,QAAQ,GAAG,IAAI,KAAK,KAAK,MAAM,KAAK,QAAQ,GAAG;AAAA,IAC9F;AAAA,EACF;AACA,QAAM,WAAW,IAAIH,WAAQ;AAC7B,QAAM,qBAAqB,CAAC,MAAM,QAAQ,QAAQ,OAAO,MAAM,KAAK,QAAQ,OAAO,MAAM,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO,QAAQ,OAAO,MAAM,KAAK,KAAK,GAAG;AACnM,MAAI,kBAAkB;AACtB,MAAI,iBAAiB;AAAA,IACnB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AACA,QAAM,kBAAkB,CAAC,YAAY,YAAY,YAAY,YAAY,YAAY,YAAY,UAAU;AAC3G,MAAI,eAAgC,kBAAC,kBAAkB;AACrD,kBAAc,MAAM,IAAI;AACxB,kBAAc,OAAO,IAAI;AACzB,kBAAc,MAAM,IAAI;AACxB,kBAAc,UAAU,IAAI;AAC5B,kBAAc,MAAM,IAAI;AACxB,WAAO;AAAA,EACT,GAAG,gBAAgB,CAAA,CAAE;AACrB,qBAAmB,QAAQ,CAAC,SAAS;AACnC,sBAAkB,KAAK,IAAI,KAAK,QAAQ,eAAe;AAAA,EACzD,CAAC;AACD,QAAM,SAAS,CAAC,MAAM,YAAY;AAChC,cAAU,WAAW;AACrB,UAAM,MAAM,QAAQ;AACpB,QAAI,SAAS,CAAA;AACb,aAAS,IAAI,GAAG,IAAI,OAAO;AACzB,UAAI,SAAS,KAAK,IAAI,iBAAiB,MAAM,CAAC;AAC9C,UAAI,IAAI;AACR,aAAO,IAAI,GAAG,KAAK;AACjB,cAAM,IAAI,QAAQ,UAAU,GAAG,IAAI,CAAC;AACpC,YAAI,mBAAmB,SAAS,CAAC,GAAG;AAClC,cAAI;AACF,mBAAO,KAAK,sBAAsB,CAAC,EAAE,IAAI,CAAC;AAAA,UAC5C,SAAS,GAAG;AACV,oBAAQ,IAAI,mBAAmB,SAAS,CAAC,GAAG,GAAG,CAAC;AAAA,UAClD;AACA;AAAA,QACF;AAAA,MACF;AACA,UAAI,IAAI,GAAG;AACT,eAAO,KAAK,QAAQ,UAAU,GAAG,IAAI,CAAC,CAAC;AACvC,aAAK;AAAA,MACP,OAAO;AACL,aAAK;AAAA,MACP;AAAA,IACF;AACA,WAAO,OAAO,KAAK,EAAE;AAAA,EACvB;AACA,QAAM,wBAAwB;AAAA,IAC5B,IAAI,CAAC,SAAS;AACZ,aAAO,OAAO,KAAK,YAAW,CAAE,EAAE,MAAM,EAAE;AAAA,IAC5C;AAAA,IACA,MAAM,CAAC,SAAS;AACd,aAAO,OAAO,KAAK,aAAa;AAAA,IAClC;AAAA,IACA,GAAG,CAAC,SAAS;AACX,aAAO,OAAO,KAAK,SAAQ,IAAK,CAAC;AAAA,IACnC;AAAA,IACA,IAAI,CAAC,SAAS;AACZ,aAAO,QAAQ,KAAK,SAAQ,IAAK,GAAG,CAAC;AAAA,IACvC;AAAA,IACA,KAAK,CAAC,SAAS;AACb,aAAO,SAAS,iBAAiB,KAAK,SAAQ,CAAE;AAAA,IAClD;AAAA,IACA,MAAM,CAAC,SAAS;AACd,aAAO,SAAS,iBAAiB,KAAK,SAAQ,GAAI,MAAM;AAAA,IAC1D;AAAA,IACA,GAAG,CAAC,SAAS;AACX,aAAO,OAAO,KAAK,SAAS;AAAA,IAC9B;AAAA,IACA,IAAI,CAAC,SAAS;AACZ,aAAO,QAAQ,KAAK,QAAO,GAAI,CAAC;AAAA,IAClC;AAAA,IACA,GAAG,CAAC,SAAS;AACX,aAAO,OAAO,KAAK,SAAS;AAAA,IAC9B;AAAA,IACA,IAAI,CAAC,SAAS;AACZ,aAAO,QAAQ,KAAK,QAAO,GAAI,CAAC;AAAA,IAClC;AAAA,IACA,KAAK,CAAC,SAAS;AACb,aAAO,SAAS,gBAAgB,KAAK,OAAM,CAAE;AAAA,IAC/C;AAAA,IACA,MAAM,CAAC,SAAS;AACd,aAAO,SAAS,gBAAgB,KAAK,OAAM,GAAI,MAAM;AAAA,IACvD;AAAA,IACA,GAAG,CAAC,SAAS;AACX,aAAO,OAAO,KAAK,UAAU;AAAA,IAC/B;AAAA,IACA,IAAI,CAAC,SAAS;AACZ,aAAO,QAAQ,KAAK,SAAQ,GAAI,CAAC;AAAA,IACnC;AAAA,IACA,GAAG,CAAC,SAAS;AACX,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,IACA,IAAI,CAAC,SAAS;AACZ,aAAO,QAAQ,KAAK,IAAI,GAAG,CAAC;AAAA,IAC9B;AAAA,IACA,GAAG,CAAC,SAAS;AACX,aAAO,OAAO,KAAK,YAAW,CAAE,EAAE,MAAM,EAAE;AAAA,IAC5C;AAAA,IACA,GAAG,CAAC,SAAS;AACX,aAAO,YAAY,IAAI;AAAA,IACzB;AAAA,IACA,GAAG,CAAC,SAAS;AACX,aAAO,OAAO,KAAK,YAAY;AAAA,IACjC;AAAA,IACA,IAAI,CAAC,SAAS;AACZ,aAAO,QAAQ,KAAK,WAAU,GAAI,CAAC;AAAA,IACrC;AAAA,IACA,GAAG,CAAC,SAAS;AACX,aAAO,OAAO,KAAK,YAAY;AAAA,IACjC;AAAA,IACA,IAAI,CAAC,SAAS;AACZ,aAAO,QAAQ,KAAK,WAAU,GAAI,CAAC;AAAA,IACrC;AAAA,IACA,KAAK,CAAC,SAAS;AACb,aAAO,QAAQ,KAAK,gBAAe,GAAI,CAAC;AAAA,IAC1C;AAAA,EACF;AACA,WAAS,KAAK,MAAM;AAClB,QAAI,OAAO,KAAK,SAAQ;AACxB,QAAI,OAAO,IAAI;AACb,cAAQ;AAAA,IACV,WAAW,OAAO,GAAG;AACnB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,WAAS,YAAY,MAAM,SAAS,SAAS;AAC3C,UAAM,OAAO,KAAK,SAAQ;AAC1B,QAAI,IAAI,OAAO,KAAK,OAAO;AAC3B,QAAI,SAAS,WAAW,CAAC;AACzB,QAAI,EAAE,YAAW;AACjB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,CAAC,SAAS,YAAY;AACnC,QAAI,QAAQ,SAAS,KAAK;AACxB,aAAO;AAAA,IACT;AACA,cAAU,WAAW,eAAe;AACpC,UAAM,WAAW;AAAA,MACf,OAAuB,oBAAI,KAAI,GAAI,YAAW;AAAA,MAC9C,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,MAAM;AAAA,MACN,KAAK;AAAA,MACL,SAAS;AAAA,IACb;AACE,UAAM,MAAM,QAAQ;AACpB,QAAI,WAAW;AACf,aAAS,IAAI,GAAG,IAAI,OAAO;AACzB,UAAI,SAAS,KAAK,IAAI,iBAAiB,MAAM,CAAC;AAC9C,UAAI,IAAI;AACR,aAAO,IAAI,GAAG,KAAK;AACjB,cAAM,IAAI,QAAQ,UAAU,GAAG,IAAI,CAAC;AACpC,YAAI,mBAAmB,SAAS,CAAC,GAAG;AAClC,gBAAM,UAAU,oBAAoB,CAAC;AACrC,gBAAM,MAAM,UAAU,QAAQ,UAAU,QAAQ,GAAG,QAAQ,CAAC,CAAC;AAC7D,kBAAQ,CAAC,EAAE,UAAU,GAAG;AACxB,sBAAY,IAAI;AAChB;AAAA,QACF;AAAA,MACF;AACA,UAAI,IAAI,GAAG;AACT,aAAK;AACL,oBAAY;AAAA,MACd,OAAO;AACL,aAAK;AAAA,MACP;AAAA,IACF;AACA,QAAI,SAAS,QAAQ,QAAQ,CAAC,SAAS,KAAK;AAC1C,UAAI,SAAS,QAAQ,CAAC,SAAS,SAAS,IAAI;AAC1C,iBAAS,OAAO,CAAC,SAAS,OAAO;AAAA,MACnC,WAAW,CAAC,SAAS,QAAQ,CAAC,SAAS,SAAS,IAAI;AAClD,iBAAS,OAAO;AAAA,MAClB;AAAA,IACF;AACA,QAAI;AACJ,WAAO,IAAI,KAAK,SAAS,MAAM,SAAS,OAAO,SAAS,KAAK,SAAS,MAAM,SAAS,QAAQ,SAAS,QAAQ,SAAS,WAAW;AAClI,WAAO;AAAA,EACT;AACA,QAAM,YAAY,CAAC,KAAKI,YAAW;AACjC,UAAM,QAAQA,QAAO,KAAK,GAAG;AAC7B,WAAO,SAAS,OAAO,KAAK,MAAM,CAAC;AAAA,EACrC;AACA,QAAM,cAAc;AAAA,IAClB,aAAa;AAAA,IACb,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACA,QAAM,OAAO;AACb,QAAM,sBAAsB;AAAA,IAC1B,IAAI;AAAA,MACF,YAAY,KAAK;AAAA,MACjB,CAAC,UAAU,QAAQ;AACjB,iBAAS,OAAO,GAAG,MAAsB,oBAAI,KAAI,GAAI,YAAW,GAAI,UAAU,GAAG,CAAC,IAAI;AACtF,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,MAAM;AAAA,MACJ,YAAY,MAAM;AAAA,MAClB,CAAC,UAAU,QAAQ;AACjB,iBAAS,OAAO,CAAC;AACjB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,GAAG;AAAA,MACD,YAAY,aAAa;AAAA,MACzB,CAAC,UAAU,QAAQ;AACjB,iBAAS,QAAQ,CAAC,MAAM;AACxB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,IAAI;AAAA,MACF,YAAY,KAAK;AAAA,MACjB,CAAC,UAAU,QAAQ;AACjB,iBAAS,QAAQ,CAAC,MAAM;AACxB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,KAAK;AAAA,MACH;AAAA,MACA,CAAC,UAAU,QAAQ;AACjB,iBAAS,QAAQ,SAAS,aAAa,KAAK,MAAM;AAClD,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,MAAM;AAAA,MACJ;AAAA,MACA,CAAC,UAAU,QAAQ;AACjB,iBAAS,QAAQ,SAAS,aAAa,KAAK,MAAM;AAClD,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,GAAG;AAAA,MACD,YAAY,aAAa;AAAA,MACzB,CAAC,UAAU,QAAQ;AACjB,iBAAS,MAAM,CAAC;AAChB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,IAAI;AAAA,MACF,YAAY,KAAK;AAAA,MACjB,CAAC,UAAU,QAAQ;AACjB,iBAAS,MAAM,CAAC;AAChB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,GAAG;AAAA,MACD,YAAY,aAAa;AAAA,MACzB,CAAC,UAAU,QAAQ;AACjB,iBAAS,MAAM,CAAC;AAChB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,IAAI;AAAA,MACF,YAAY,KAAK;AAAA,MACjB,CAAC,UAAU,QAAQ;AACjB,iBAAS,MAAM,CAAC;AAChB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,KAAK;AAAA,MACH;AAAA,MACA,CAAC,UAAU,QAAQ;AACjB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,MAAM;AAAA,MACJ;AAAA,MACA,CAAC,UAAU,QAAQ;AACjB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,GAAG;AAAA,MACD,YAAY,aAAa;AAAA,MACzB,CAAC,UAAU,QAAQ;AACjB,iBAAS,OAAO,CAAC;AACjB,iBAAS,MAAM;AACf,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,IAAI;AAAA,MACF,YAAY,KAAK;AAAA,MACjB,CAAC,UAAU,QAAQ;AACjB,iBAAS,OAAO,CAAC;AACjB,iBAAS,MAAM;AACf,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,GAAG;AAAA,MACD,YAAY,aAAa;AAAA,MACzB,CAAC,UAAU,QAAQ;AACjB,iBAAS,OAAO,CAAC;AACjB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,IAAI;AAAA,MACF,YAAY,KAAK;AAAA,MACjB,CAAC,UAAU,QAAQ;AACjB,iBAAS,OAAO,CAAC;AACjB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,GAAG;AAAA,MACD;AAAA,MACA,CAAC,UAAU,QAAQ;AACjB,YAAI,SAAS,WAAW,IAAI,KAAK,IAAI,YAAW,GAAI;AAClD,mBAAS,OAAO;AAAA,QAClB;AACA,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,GAAG;AAAA,MACD;AAAA,MACA,CAAC,UAAU,QAAQ;AACjB,YAAI,SAAS,WAAW,IAAI,KAAK,IAAI,YAAW,GAAI;AAClD,mBAAS,OAAO;AAAA,QAClB;AACA,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,GAAG;AAAA,MACD,YAAY,aAAa;AAAA,MACzB,CAAC,UAAU,QAAQ;AACjB,iBAAS,SAAS,CAAC;AACnB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,IAAI;AAAA,MACF,YAAY,KAAK;AAAA,MACjB,CAAC,UAAU,QAAQ;AACjB,iBAAS,SAAS,CAAC;AACnB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,GAAG;AAAA,MACD,YAAY,aAAa;AAAA,MACzB,CAAC,UAAU,QAAQ;AACjB,iBAAS,SAAS,CAAC;AACnB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,IAAI;AAAA,MACF,YAAY,KAAK;AAAA,MACjB,CAAC,UAAU,QAAQ;AACjB,iBAAS,SAAS,CAAC;AACnB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,IACE,KAAK;AAAA,MACH,YAAY,OAAO;AAAA,MACnB,CAAC,UAAU,QAAQ;AACjB,iBAAS,cAAc,CAAC;AACxB,eAAO;AAAA,MACT;AAAA,IACJ;AAAA,EACA;AACA,WAAS,eAAe,IAAI,cAAc;AACxC,QAAI,YAAY;AAChB,WAAO,WAAW;AAChB,UAAI,aAAa,cAAc;AAC7B,eAAO;AAAA,MACT;AACA,kBAAY,UAAU;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AAAA,IACb,YAAY,IAAI;AACd,WAAK,OAAO;AAAA,IACd;AAAA,IACA,QAAQ,KAAK;AACX,WAAK,KAAK,YAAY,GAAG;AACzB,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,KAAK;AACX,WAAK,KAAK,YAAY,KAAK,KAAK,YAAW,IAAK,GAAG;AACnD,aAAO;AAAA,IACT;AAAA,IACA,SAAS,KAAK;AACZ,WAAK,KAAK,SAAS,KAAK,KAAK,SAAQ,IAAK,GAAG;AAC7C,aAAO;AAAA,IACT;AAAA,IACA,SAAS,KAAK;AACZ,WAAK,KAAK,SAAS,GAAG;AACtB,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,KAAK;AACX,WAAK,KAAK,QAAQ,GAAG;AACrB,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,KAAK;AACX,WAAK,KAAK,QAAQ,KAAK,KAAK,QAAO,IAAK,GAAG;AAC3C,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,KAAK;AACX,WAAK,KAAK,QAAQ,KAAK,KAAK,QAAO,IAAK,MAAM,CAAC;AAC/C,aAAO;AAAA,IACT;AAAA,IACA,SAAS,KAAK;AACZ,WAAK,KAAK,SAAS,KAAK,KAAK,SAAQ,IAAK,GAAG;AAC7C,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,KAAK;AACX,WAAK,KAAK,SAAS,GAAG;AACtB,aAAO;AAAA,IACT;AAAA,IACA,WAAW,KAAK;AACd,WAAK,KAAK,WAAW,KAAK,KAAK,WAAU,IAAK,GAAG;AACjD,aAAO;AAAA,IACT;AAAA,IACA,WAAW,KAAK;AACd,WAAK,KAAK,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AAAA,IACA,WAAW,KAAK;AACd,WAAK,KAAK,WAAW,KAAK,KAAK,WAAU,IAAK,GAAG;AACjD,aAAO;AAAA,IACT;AAAA,IACA,gBAAgB,KAAK;AACnB,WAAK,KAAK,gBAAgB,KAAK,KAAK,gBAAe,IAAK,GAAG;AAC3D,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,MAAM;AACZ,UAAI,KAAK,KAAK,QAAO,IAAK,KAAK,QAAO,GAAI;AACxC,eAAO;AAAA,MACT,WAAW,KAAK,KAAK,QAAO,IAAK,KAAK,WAAW;AAC/C,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA,UAAU;AACR,aAAO,KAAK,KAAK,YAAW;AAAA,IAC9B;AAAA,IACA,WAAW;AACT,aAAO,KAAK,KAAK,SAAQ,IAAK;AAAA,IAChC;AAAA,IACA,UAAU;AACR,aAAO,KAAK,KAAK,QAAO;AAAA,IAC1B;AAAA,IACA,SAAS;AACP,aAAO,KAAK,KAAK,OAAM;AAAA,IACzB;AAAA,IACA,UAAU;AACR,aAAO,KAAK,KAAK,QAAO;AAAA,IAC1B;AAAA,IACA,OAAO,UAAU;AACf,aAAO,OAAO,KAAK,MAAM,QAAQ;AAAA,IACnC;AAAA,IACA,QAAQ;AACN,aAAO,IAAI,SAAS,IAAI,KAAK,KAAK,KAAK,QAAO,CAAE,CAAC;AAAA,IACnD;AAAA,EACF;AACA,MAAIC,oBAAkB;AAAA,IACpB,QAAQ;AAAA;AAAA,IAER,cAAc;AAAA,IACd,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO;AAAA,IACP,MAAM,aAAa;AAAA,IACnB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,gBAAgB,CAAC,OAAO;AACtB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,MACf;AAAA,IACE;AAAA,EACF;AACA,WAAS,gBAAgB;AACvB,QAAI;AACJ,QAAI,SAAS,eAAe,2BAA2B,KAAK,MAAM;AAChE,OAAC,KAAK,SAAS,cAAc,MAAM,MAAM,OAAO,SAAS,GAAG,mBAAmB,aAAa,2EAA2E;AAAA,IACzK;AACA,WAAO,SAAS,eAAe,2BAA2B;AAAA,EAC5D;AACA,MAAI,kBAAkB;AACtB,QAAM,kBAAkB,MAAMC,iBAAgB;AAAA,IAC5C,YAAY,UAAU,SAASP,UAAS;AACtC,UAAI;AACJ,WAAK,UAAU;AACf,WAAK,YAAY;AACjB,WAAK,UAAU;AACf,WAAK,UAAU;AACf,WAAK,WAAW;AAChB,WAAK,WAAW;AAChB,WAAK,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACpC,WAAK,sBAAsB,CAAC,MAAM;AAChC,YAAI,KAAK,aAAa,EAAE,UAAU,KAAK,iBAAiB,CAAC,eAAe,EAAE,QAAQ,KAAK,eAAe,GAAG;AACvG,eAAK,KAAI;AAAA,QACX;AAAA,MACF;AACA,WAAK,UAAU,OAAO,OAAO,CAAA,GAAIM,mBAAiB,OAAO;AACzD,yBAAmB;AACnB,UAAI;AACJ,UAAI,OAAO,aAAa,UAAU;AAChC,0BAAkB,SAAS,cAAc,QAAQ;AAAA,MACnD,OAAO;AACL,0BAAkB;AAAA,MACpB;AACA,UAAI,CAAC,iBAAiB;AACpB,cAAM,IAAI,MAAM,GAAG,QAAQ,mCAAmC;AAAA,MAChE;AACA,WAAK,YAAY,OAAO,KAAK,YAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,OAAO,aAAa;AAC1G,WAAK,WAAW,KAAK;AACrB,eAAS,IAAIN,QAAO;AACpB,UAAI,KAAK,YAAY,aAAa,MAAM;AACtC,aAAK,aAAa,KAAK,QAAQ,UAAU,eAAe;AAAA,MAC1D,WAAW,KAAK,YAAY,aAAa,OAAO;AAC9C,aAAK,aAAa,KAAK,QAAQ,UAAU,eAAe;AAAA,MAC1D,WAAW,KAAK,YAAY,aAAa,MAAM;AAC7C,aAAK,aAAa,KAAK,QAAQ,UAAU,eAAe;AAAA,MAC1D,WAAW,KAAK,YAAY,aAAa,UAAU;AACjD,aAAK,aAAa,KAAK,QAAQ,UAAU,eAAe;AAAA,MAC1D,OAAO;AACL,aAAK,aAAa,KAAK,QAAQ,UAAU,eAAe;AAAA,MAC1D;AACA,UAAI;AACJ,UAAI,KAAK,QAAQ,aAAa;AAC5B,YAAI,OAAO,KAAK,QAAQ,gBAAgB,UAAU;AAChD,qBAAW,IAAI,SAAS,OAAO,KAAK,QAAQ,aAAa,KAAK,UAAU,KAAqB,oBAAI,KAAI,CAAE;AAAA,QACzG,OAAO;AACL,qBAAW,IAAI,SAAS,KAAK,QAAQ,WAAW;AAAA,QAClD;AAAA,MACF,OAAO;AACL,mBAAW,IAAI,SAAyB,oBAAI,MAAM;AAClD,aAAK,QAAQ,cAAc,SAAS,OAAO,KAAK,UAAU;AAAA,MAC5D;AACA,WAAK,YAAW;AAChB,WAAK,YAAY,SAAS,OAAO,eAAe,IAAI;AACpD,WAAK,cAAc;AACnB,WAAK,gBAAgB;AACrB,WAAK,UAAU,KAAK,SAAQ;AAC5B,WAAK,UAAU,KAAK,SAAQ;AAC5B,UAAI,KAAK,QAAQ,QAAQ;AACvB,aAAK,kBAAkB;AACvB,aAAK,gBAAgB,YAAY,gCAAgC,eAAe;AAAA,MAClF,OAAO;AACL,aAAK,UAAU;AACf,aAAK,cAAc,aAAa,SAAS,SAAS,OAAO,KAAK,UAAU,CAAC;AACzE,cAAM,kBAAkB,SAAS,cAAc,KAAK;AACpD,wBAAgB,YAAY,gCAAgC,eAAe;AAC3E,wBAAgB,aAAa,SAAS,WAAW,KAAK,QAAQ,MAAM,GAAG;AACvE,SAAC,KAAK,oBAAoB,OAAO,SAAS,GAAG,YAAY,eAAe;AACxE,aAAK,kBAAkB;AACvB,aAAK,gBAAe;AAAA,MACtB;AACA,WAAK,uBAAsB;AAC3B,UAAI,KAAK,cAAc;AACrB,aAAK,eAAe,KAAK,gBAAgB,cAAc,YAAY;AACnE,aAAK,iBAAiB,KAAK,gBAAgB,cAAc,cAAc;AAAA,MACzE,OAAO;AACL,aAAK,eAAe,CAAA;AACpB,aAAK,iBAAiB,CAAA;AAAA,MACxB;AACA,WAAK,eAAe,KAAK,SAAS;AAClC,WAAK,gBAAe;AACpB,WAAK,cAAa;AAClB,WAAK,cAAa;AAAA,IACpB;AAAA,IACA,cAAc;AACZ,UAAI,eAAe,KAAK,QAAQ;AAChC,UAAI,gBAAgB,EAAG;AACvB,UAAI,eAAe,KAAK,eAAe,GAAG;AACxC,uBAAe;AAAA,MACjB;AACA,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAI,MAAM,eAAe;AACzB,aAAK,SAAS,CAAC,IAAI,MAAM,IAAI,MAAM,MAAM;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,OAAO,OAAO,UAAU,SAASA,UAAS;AACxC,aAAO,IAAIO,iBAAgB,UAAU,SAASP,QAAO;AAAA,IACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiBA,OAAO,iBAAiB,YAAY;AAClC,aAAO,OAAO,gBAAgB,UAAU;AAAA,IAC1C;AAAA,IACA,WAAW;AACT,UAAI,UAAU,KAAK,QAAQ;AAC3B,UAAI,WAAW,IAAI;AACjB,YAAI,OAAO,YAAY,UAAU;AAC/B,gBAAM,KAAK,OAAO,SAAS,KAAK,UAAU;AAC1C,cAAI,CAAC,IAAI;AACP,mBAAO;AAAA,UACT;AACA,oBAAU;AAAA,QACZ;AACA,aAAK,UAAU,QAAQ,YAAW;AAClC,aAAK,WAAW,EAAE,KAAK,UAAU,QAAQ,QAAQ,YAAY,CAAC;AAC9D,eAAO,IAAI,KAAK,QAAQ,YAAW,GAAI,QAAQ,YAAY,QAAQ,QAAO,GAAI,GAAG,CAAC,EAAE,QAAO;AAAA,MAC7F;AACA,aAAO;AAAA,IACT;AAAA,IACA,WAAW;AACT,UAAI,UAAU,KAAK,QAAQ;AAC3B,UAAI,WAAW,IAAI;AACjB,YAAI,OAAO,YAAY,UAAU;AAC/B,gBAAM,KAAK,OAAO,SAAS,KAAK,UAAU;AAC1C,cAAI,CAAC,IAAI;AACP,mBAAO;AAAA,UACT;AACA,oBAAU;AAAA,QACZ;AACA,aAAK,UAAU,QAAQ,YAAW;AAClC,aAAK,WAAW,EAAE,KAAK,UAAU,QAAQ,QAAQ,YAAY,CAAC;AAC9D,eAAO,IAAI,KAAK,QAAQ,YAAW,GAAI,QAAQ,YAAY,QAAQ,QAAO,GAAI,IAAI,EAAE,EAAE,QAAO;AAAA,MAC/F;AACA,aAAO;AAAA,IACT;AAAA,IACA,IAAI,SAAS,MAAM;AACjB,UAAI,KAAK,cAAc,MAAM;AAC3B;AAAA,MACF;AACA,WAAK,YAAY;AACjB,WAAK,eAAe,IAAI;AAAA,IAC1B;AAAA,IACA,IAAI,WAAW;AACb,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,eAAe,MAAM;AACnB,UAAI;AACJ,OAAC,KAAK,KAAK,gBAAgB,cAAc,gBAAgB,MAAM,OAAO,SAAS,GAAG,aAAa,aAAa,IAAI;AAChH,UAAI,SAAS,QAAQ;AACnB,aAAK,SAAQ;AAAA,MACf,WAAW,SAAS,SAAS;AAC3B,aAAK,UAAS;AAAA,MAChB,OAAO;AACL,aAAK,QAAO;AAAA,MACd;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,kBAAkB;AAChB,UAAI,IAAI,IAAI,IAAI;AAChB,YAAM,QAAQ,KAAK,QAAQ;AAC3B,OAAC,KAAK,KAAK,gBAAgB,cAAc,qBAAqB,MAAM,OAAO,SAAS,GAAG,iBAAiB,SAAS,CAAC,MAAM;AACtH,aAAK,SAAS,QAAQ,SAAS,QAAQ,CAAC;AAAA,MAC1C,CAAC;AACD,OAAC,KAAK,KAAK,gBAAgB,cAAc,qBAAqB,MAAM,OAAO,SAAS,GAAG,iBAAiB,SAAS,CAAC,MAAM;AACtH,aAAK,SAAS,QAAQ,SAAS,QAAQ,CAAC;AAAA,MAC1C,CAAC;AACD,OAAC,KAAK,KAAK,gBAAgB,cAAc,mBAAmB,MAAM,OAAO,SAAS,GAAG,iBAAiB,SAAS,CAAC,MAAM;AACpH,aAAK,WAAW,aAAa;AAAA,MAC/B,CAAC;AACD,OAAC,KAAK,KAAK,gBAAgB,cAAc,oBAAoB,MAAM,OAAO,SAAS,GAAG,iBAAiB,SAAS,CAAC,MAAM;AACrH,aAAK,WAAW,aAAa;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA,IAIA,gBAAgB;AACd,UAAI,IAAI;AACR,OAAC,KAAK,KAAK,gBAAgB,cAAc,gBAAgB,MAAM,OAAO,SAAS,GAAG,iBAAiB,SAAS,CAAC,MAAM;AACjH,YAAI;AACJ,cAAM,YAAY,EAAE;AACpB,YAAI,UAAU,UAAU,SAAS,UAAU,KAAK,UAAU,QAAQ,WAAW,GAAG;AAC9E,gBAAM,aAAa,UAAU,aAAa,UAAU,KAAK;AACzD,gBAAM,OAAO,WAAW,MAAM,GAAG;AACjC,eAAK,YAAY,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;AACtC,eAAK,YAAY,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjC,cAAI,KAAK,cAAc,KAAK,WAAW,GAAG;AACxC;AAAA,UACF;AACA,WAAC,MAAM,KAAK,gBAAgB,cAAc,SAAS,MAAM,OAAO,SAAS,IAAI,UAAU,OAAO,QAAQ;AACtG,oBAAU,UAAU,IAAI,QAAQ;AAChC,cAAI,KAAK,cAAc;AACrB,iBAAK,YAAY,QAAQ,CAAC,KAAK,aAAa,KAAK;AACjD,iBAAK,YAAY,WAAW,CAAC,KAAK,eAAe,KAAK;AAAA,UACxD;AACA,eAAK,gBAAgB,CAAC;AAAA,QACxB;AAAA,MACF,CAAC;AACD,OAAC,KAAK,KAAK,gBAAgB,cAAc,aAAa,MAAM,OAAO,SAAS,GAAG,iBAAiB,SAAS,CAAC,MAAM;AAC9G,cAAM,WAAW,IAAI,SAAS,OAAO,KAAK,WAAW,eAAe,IAAI,KAAqB,oBAAI,MAAM;AACvG,aAAK,YAAY,QAAQ,SAAS,QAAO,CAAE;AAC3C,aAAK,YAAY,SAAS,SAAS,SAAQ,IAAK,CAAC;AACjD,aAAK,YAAY,QAAQ,SAAS,QAAO,CAAE;AAC3C,aAAK,eAAe,KAAK,QAAQ;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,IACA,aAAa;AACX,aAAO,KAAK,cAAc,aAAa,QAAQ,KAAK,cAAc,aAAa;AAAA,IACjF;AAAA,IACA,mBAAmB,KAAK;AACtB,UAAI,CAAC,UAAU,GAAG,GAAG;AACnB,eAAO;AAAA,MACT;AACA,aAAO,SAAS,KAAK,EAAE;AAAA,IACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,gBAAgB;AACd,UAAI;AACJ,UAAI,CAAC,KAAK,aAAc;AACxB,UAAI,KAAK,KAAK,YAAY,OAAO,IAAI;AACrC,YAAM,kBAAkB,KAAK;AAC7B,YAAM,eAAe,gBAAgB,cAAc,YAAY;AAC/D,YAAM,eAAe,gBAAgB,cAAc,kBAAkB;AACrE,mBAAa,QAAQ;AACrB,mBAAa,QAAQ;AACrB,mBAAa,iBAAiB,SAAS,CAAC,MAAM;AAC5C,cAAM,gBAAgB,EAAE;AACxB,YAAI,MAAM,KAAK,mBAAmB,cAAc,KAAK;AACrD,YAAI,SAAS,aAAa,KAAK,GAAG,GAAG;AACrC,YAAI,SAAS,QAAQ,EAAE,IAAI,IAAI;AAC7B,mBAAS;AAAA,QACX;AACA,qBAAa,QAAQ;AACrB,qBAAa,QAAQ;AAAA,MACvB,CAAC;AACD,mBAAa,iBAAiB,SAAS,CAAC,MAAM;AAC5C,cAAM,gBAAgB,EAAE;AACxB,qBAAa,QAAQ,aAAa,cAAc,OAAO,GAAG,GAAG;AAAA,MAC/D,CAAC;AACD,UAAI,KAAK,KAAK,YAAY,OAAO,IAAI;AACrC,YAAM,iBAAiB,gBAAgB,cAAc,cAAc;AACnE,YAAM,iBAAiB,gBAAgB,cAAc,oBAAoB;AACzE,qBAAe,QAAQ;AACvB,qBAAe,QAAQ;AACvB,qBAAe,iBAAiB,SAAS,CAAC,MAAM;AAC9C,cAAM,gBAAgB,EAAE;AACxB,YAAI,MAAM,KAAK,mBAAmB,cAAc,KAAK;AACrD,YAAI,SAAS,aAAa,KAAK,GAAG,GAAG;AACrC,YAAI,SAAS,QAAQ,EAAE,IAAI,IAAI;AAC7B,mBAAS;AAAA,QACX;AACA,uBAAe,QAAQ;AACvB,uBAAe,QAAQ;AAAA,MACzB,CAAC;AACD,qBAAe,iBAAiB,SAAS,CAAC,MAAM;AAC9C,cAAM,gBAAgB,EAAE;AACxB,uBAAe,QAAQ,aAAa,cAAc,OAAO,GAAG,GAAG;AAAA,MACjE,CAAC;AACD,OAAC,KAAK,gBAAgB,cAAc,cAAc,MAAM,OAAO,SAAS,GAAG,iBAAiB,SAAS,CAAC,MAAM;AAC1G,aAAK,YAAY,QAAQ,CAAC,aAAa,KAAK;AAC5C,aAAK,YAAY,WAAW,CAAC,eAAe,KAAK;AACjD,aAAK,gBAAgB,CAAC;AAAA,MACxB,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,SAAS,UAAU,GAAG;AACpB,UAAI,KAAK,cAAc,aAAa,QAAQ,KAAK,cAAc,aAAa,UAAU;AACpF,aAAK,YAAY,QAAQ,CAAC;AAC1B,aAAK,YAAY,SAAS,WAAW,WAAW,KAAK,CAAC;AACtD,aAAK,QAAO;AACZ;AAAA,MACF;AACA,UAAI,KAAK,cAAc,aAAa,OAAO;AACzC,aAAK,YAAY,QAAQ,CAAC;AAC1B,aAAK,YAAY,QAAQ,WAAW,WAAW,KAAK,CAAC;AACrD,aAAK,UAAS;AACd;AAAA,MACF;AACA,UAAI,KAAK,cAAc,aAAa,MAAM;AACxC,aAAK,YAAY,QAAQ,CAAC;AAC1B,aAAK,YAAY,QAAQ,WAAW,WAAW,MAAM,EAAE;AACvD,aAAK,SAAQ;AAAA,MACf;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,eAAe;AACb,aAAO,KAAK,YAAY,OAAO,KAAK,UAAU;AAAA,IAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,OAAO,WAAW,SAAS;AACzBM,0BAAkB,OAAO,OAAO,CAAA,GAAIA,mBAAiB,OAAO;AAAA,IAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,OAAO;AACL,UAAI,KAAK,WAAW;AAClB;AAAA,MACF;AACA,WAAK,YAAY;AACjB,YAAM,UAAU,WAAU;AAC1B,WAAK,gBAAgB,UAAU,OAAO,MAAM;AAC5C,WAAK,gBAAgB,UAAU,IAAI,MAAM;AACzC,YAAM,OAAO,KAAK,cAAc,sBAAqB;AACrD,YAAM,YAAY,OAAO,WAAW,SAAS,gBAAgB;AAC7D,YAAM,aAAa,OAAO,WAAW,SAAS,gBAAgB;AAC9D,YAAM,gBAAgB,KAAK,gBAAgB;AAC3C,YAAM,sBAAsB,KAAK,cAAc,eAAe;AAC9D,UAAI,OAAO,KAAK,OAAO;AACvB,UAAI,MAAM;AACV,UAAI,KAAK,QAAQ,iBAAiB;AAChC,cAAM,KAAK,MAAM;AACjB,eAAO,KAAK;AAAA,MACd,OAAO;AACL,YAAI,KAAK,MAAM,sBAAsB,gBAAgB,QAAQ,gBAAgB,KAAK,OAAO,eAAe;AACtG,gBAAM,YAAY,KAAK,MAAM,gBAAgB;AAAA,QAC/C,OAAO;AACL,gBAAM,YAAY,KAAK,MAAM;AAAA,QAC/B;AAAA,MACF;AACA,WAAK,gBAAgB,aAAa,SAAS,GAAG,KAAK,QAAQ,kBAAkB,oBAAoB,EAAE,OAAO,GAAG,WAAW,IAAI,cAAc,KAAK,QAAQ,MAAM,EAAE;AAC/J,eAAS,iBAAiB,SAAS,KAAK,mBAAmB;AAAA,IAC7D;AAAA;AAAA;AAAA;AAAA,IAIA,OAAO;AACL,WAAK,YAAY;AACjB,UAAI,KAAK,QAAQ,SAAS;AACxB,YAAI,KAAK,QAAQ,QAAO,MAAO,OAAO;AACpC;AAAA,QACF;AAAA,MACF;AACA,WAAK,gBAAgB,UAAU,OAAO,MAAM;AAC5C,WAAK,gBAAgB,UAAU,IAAI,MAAM;AACzC,eAAS,oBAAoB,SAAS,KAAK,mBAAmB;AAAA,IAChE;AAAA;AAAA;AAAA;AAAA,IAIA,kBAAkB;AAChB,UAAI,KAAK,eAAe;AACtB,aAAK,cAAc,iBAAiB,SAAS,CAAC,MAAM;AAClD,eAAK,KAAI;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAIA,wBAAwB;AACtB,YAAM,cAAc,KAAK,YAAY,OAAO,KAAK,UAAU;AAC3D,UAAI,KAAK,QAAQ,yBAAyB,WAAW,KAAK,QAAQ,qBAAqB,GAAG;AACxF,aAAK,QAAQ,sBAAsB,aAAa,KAAK,QAAQ;AAAA,MAC/D;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,yBAAyB;AACvB,YAAM,cAAc,KAAK,YAAY,OAAO,KAAK,UAAU;AAC3D,UAAI,KAAK,QAAQ,0BAA0B,WAAW,KAAK,QAAQ,sBAAsB,GAAG;AAC1F,cAAM,QAAQ,KAAK,QAAQ,uBAAuB,aAAa,CAAC,WAAW;AACzE,cAAI,WAAW,OAAO;AACpB;AAAA,UACF;AACA,eAAK,QAAQ,KAAK;AAAA,QACpB,CAAC;AACD,YAAI,UAAU,OAAO;AACnB;AAAA,QACF;AACA,aAAK,QAAQ,KAAK;AAClB;AAAA,MACF;AACA,WAAK,QAAQ,KAAK;AAAA,IACpB;AAAA,IACA,gBAAgB,GAAG;AACjB,YAAM,cAAc,KAAK,YAAY,OAAO,KAAK,UAAU;AAC3D,UAAI,KAAK,QAAQ,UAAU;AACzB,YAAI,KAAK,QAAQ,SAAS,aAAa,KAAK,UAAU,CAAC,MAAM,OAAO;AAClE;AAAA,QACF;AAAA,MACF;AACA,UAAI,KAAK,SAAS;AAChB,aAAK,cAAc,aAAa,SAAS,WAAW;AAAA,MACtD;AACA,UAAI,CAAC,KAAK,QAAQ,UAAU,KAAK,QAAQ,WAAW;AAClD,aAAK,KAAI;AAAA,MACX;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAIA,yBAAyB;AACvB,YAAM,qBAAqB,KAAK,QAAQ;AACxC,UAAI,mBAAmB,6BAA6B,KAAK,QAAQ,QAAQ,QAAQ,EAAE,gBAAgB,KAAK,SAAS;AAAA;AAAA,+BAEtF,qBAAqB,qBAAqB,mBAAmB;AAAA,+BAC7D,qBAAqB,sBAAsB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wDAepC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,wDAChF,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,wDAChF,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,wDAChF,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,wDAChF,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,wDAChF,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,wDAChF,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sFAQlD,KAAK,QAAQ,iBAAiB,KAAK,eAAe,8CAA8C,SAAS,WAAW,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wEAkB1I,SAAS,WAAW,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW7F,WAAK,gBAAgB,YAAY;AAAA,IACnC;AAAA,IACA,QAAQ,6BAA6B;AACnC,UAAI,KAAK,cAAc,aAAa,QAAQ,KAAK,cAAc,aAAa,UAAU;AACpF,aAAK,QAAQ,2BAA2B;AACxC;AAAA,MACF;AACA,UAAI,KAAK,cAAc,aAAa,OAAO;AACzC,aAAK,UAAU,2BAA2B;AAC1C;AAAA,MACF;AACA,UAAI,KAAK,cAAc,aAAa,MAAM;AACxC,aAAK,SAAS,2BAA2B;AAAA,MAC3C;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAIA,SAAS,6BAA6B;AACpC,UAAI;AACJ,YAAM,cAAc,KAAK,YAAY,OAAO,MAAM;AAClD,UAAI,gCAAgC,SAAS,KAAK,YAAY,aAAa,MAAM;AAC/E,aAAK,uBAAsB;AAC3B;AAAA,MACF;AACA,YAAM,YAAY,CAAC,cAAc;AACjC,WAAK,gBAAgB,cAAc,mBAAmB,EAAE,cAAc,GAAG,SAAS,MAAM,YAAY,EAAE;AACtG,YAAM,qBAAqB,WAAW,KAAK,QAAQ,cAAc;AACjE,YAAM,mBAAmB,qBAAqB,KAAK,QAAQ,iBAAiB;AAC5E,YAAM,UAAU,CAAA;AAChB,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,OAAO,YAAY;AACzB,cAAM,WAAW,KAAK,eAAe,IAAI;AACzC,YAAI,iBAAiB,WAAW,cAAc;AAC9C,YAAI,UAAU;AACd,YAAI,sBAAsB,kBAAkB;AAC1C,gBAAM,QAAQ,iBAAiB,EAAE,MAAM,KAAK,WAAW,MAAM,MAAM;AACnE,4BAAkB,MAAM,QAAQ,MAAM,MAAM,QAAQ;AACpD,oBAAU,MAAM;AAChB,oBAAU,UAAU,UAAU,OAAO,MAAM;AAAA,QAC7C;AACA,gBAAQ,KAAK,yBAAyB,cAAc,gBAAgB,IAAI,KAAK,OAAO,IAAI,IAAI,QAAQ;AAAA,MACtG;AACA,WAAK,gBAAgB,cAAc,aAAa,EAAE,YAAY,QAAQ,KAAK,EAAE;AAC7E,UAAI,KAAK,YAAY,aAAa,MAAM;AACtC,aAAK,sBAAqB;AAAA,MAC5B;AACA,OAAC,KAAK,KAAK,gBAAgB,iBAAiB,YAAY,MAAM,OAAO,SAAS,GAAG,QAAQ,CAAC,YAAY;AACpG,gBAAQ,iBAAiB,SAAS,CAAC,MAAM;AACvC,gBAAM,YAAY,EAAE;AACpB,cAAI,WAAW;AACb,kBAAM,OAAO,UAAU,aAAa,WAAW;AAC/C,gBAAI,MAAM;AACR,oBAAM,UAAU,CAAC;AACjB,kBAAI,KAAK,eAAe,OAAO,GAAG;AAChC;AAAA,cACF;AACA,kBAAI,KAAK,YAAY,aAAa,MAAM;AACtC,oBAAI,KAAK,eAAe,OAAO,GAAG;AAChC;AAAA,gBACF;AACA,qBAAK,YAAY,QAAQ,OAAO;AAChC,qBAAK,gBAAgB,CAAC;AACtB;AAAA,cACF;AACA,mBAAK,YAAY,QAAQ,OAAO;AAChC,mBAAK,WAAW,KAAK;AAAA,YACvB;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA,IAIA,UAAU,6BAA6B;AACrC,UAAI;AACJ,UAAI,gCAAgC,SAAS,KAAK,YAAY,aAAa,OAAO;AAChF,aAAK,uBAAsB;AAC3B;AAAA,MACF;AACA,YAAM,OAAO,KAAK,YAAY,OAAO,MAAM;AAC3C,WAAK,gBAAgB,cAAc,mBAAmB,EAAE,cAAc,GAAG,IAAI;AAC7E,YAAM,gBAAgB,KAAK,gBAAgB,iBAAiB,4BAA4B;AACxF,UAAI,cAAc,SAAS,GAAG;AAC5B,YAAI,KAAK,eAAe,CAAC,IAAI,GAAG;AAC9B,wBAAc,QAAQ,CAAC,aAAa;AAClC,gBAAI,CAAC,SAAS,UAAU,SAAS,UAAU,GAAG;AAC5C,uBAAS,UAAU,IAAI,UAAU;AAAA,YACnC;AAAA,UACF,CAAC;AACD;AAAA,QACF;AACA,sBAAc,QAAQ,CAAC,UAAU,QAAQ;AACvC,cAAI,KAAK,gBAAgB,CAAC,MAAM,GAAG,GAAG;AACpC,gBAAI,CAAC,SAAS,UAAU,SAAS,UAAU,GAAG;AAC5C,uBAAS,UAAU,IAAI,UAAU;AAAA,YACnC;AAAA,UACF,OAAO;AACL,qBAAS,UAAU,OAAO,UAAU;AAAA,UACtC;AAAA,QACF,CAAC;AACD,YAAI,KAAK,YAAY,aAAa,OAAO;AACvC,eAAK,sBAAqB;AAAA,QAC5B;AACA;AAAA,MACF;AACA,WAAK,gBAAgB,cAAc,oBAAoB,EAAE,cAAc,KAAK,YAAY,OAAO,MAAM;AACrG,YAAM,qBAAqB,WAAW,KAAK,QAAQ,cAAc;AACjE,YAAM,mBAAmB,qBAAqB,KAAK,QAAQ,iBAAiB;AAC5E,YAAM,UAAU,CAAA;AAChB,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,WAAW,KAAK,gBAAgB,CAAC,MAAM,CAAC;AAC9C,YAAI,iBAAiB,WAAW,cAAc;AAC9C,YAAI,UAAU;AACd,YAAI,sBAAsB,kBAAkB;AAC1C,gBAAM,QAAQ,iBAAiB,EAAE,MAAM,KAAK,WAAW,MAAM,OAAO,OAAO,IAAI,GAAE,CAAE;AACnF,4BAAkB,MAAM,QAAQ,MAAM,MAAM,QAAQ;AACpD,oBAAU,MAAM;AAChB,oBAAU,UAAU,UAAU,OAAO,MAAM;AAAA,QAC7C;AACA,gBAAQ,KAAK,0BAA0B,cAAc,iBAAiB,CAAC,KAAK,OAAO,IAAI,SAAS,iBAAiB,GAAG,MAAM,CAAC,QAAQ;AAAA,MACrI;AACA,WAAK,gBAAgB,cAAc,cAAc,EAAE,YAAY,QAAQ,KAAK,EAAE;AAC9E,UAAI,KAAK,YAAY,aAAa,OAAO;AACvC,aAAK,sBAAqB;AAAA,MAC5B;AACA,OAAC,KAAK,KAAK,gBAAgB,iBAAiB,aAAa,MAAM,OAAO,SAAS,GAAG,QAAQ,CAAC,aAAa;AACtG,iBAAS,iBAAiB,SAAS,CAAC,MAAM;AACxC,gBAAM,YAAY,EAAE;AACpB,cAAI,WAAW;AACb,kBAAM,QAAQ,UAAU,aAAa,YAAY;AACjD,gBAAI,OAAO;AACT,kBAAI,KAAK,gBAAgB,KAAK,YAAY,QAAO,GAAI,CAAC,KAAK,GAAG;AAC5D,uBAAO;AAAA,cACT;AACA,kBAAI,KAAK,YAAY,aAAa,OAAO;AACvC,qBAAK,YAAY,SAAS,CAAC,KAAK;AAChC,qBAAK,gBAAgB,CAAC;AACtB;AAAA,cACF;AACA,mBAAK,YAAY,SAAS,CAAC,KAAK;AAChC,mBAAK,WAAW,KAAK;AACrB,mBAAK,QAAO;AAAA,YACd;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA,IAIA,QAAQ,6BAA6B;AACnC,UAAI,gCAAgC,UAAU,KAAK,YAAY,aAAa,QAAQ,KAAK,YAAY,aAAa,WAAW;AAC3H,aAAK,uBAAsB;AAC3B;AAAA,MACF;AACA,UAAI,iBAAiB,KAAK,YAAY,MAAK;AAC3C,YAAM,eAAe,eAAe,SAAQ;AAC5C,qBAAe,QAAQ,CAAC;AACxB,WAAK,gBAAgB,cAAc,mBAAmB,EAAE,cAAc,eAAe,OAAO,MAAM;AAClG,WAAK,gBAAgB,cAAc,oBAAoB,EAAE,cAAc,eAAe,OAAO,MAAM;AACnG,UAAI,MAAM,eAAe,OAAM;AAC/B,YAAM,MAAM,KAAK,SAAS,CAAC;AAC3B,UAAI,OAAO,GAAG;AACZ,uBAAe,QAAQ,CAAC,GAAG;AAAA,MAC7B,OAAO;AACL,uBAAe,QAAQ,EAAE,IAAI,IAAI;AAAA,MACnC;AACA,YAAM,qBAAqB,WAAW,KAAK,QAAQ,cAAc;AACjE,YAAM,mBAAmB,qBAAqB,KAAK,QAAQ,iBAAiB;AAC5E,YAAM,UAAU,CAAA;AAChB,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,YAAI;AACJ,YAAI,KAAK,GAAG;AACV,qBAAW;AAAA,QACb,OAAO;AACL,qBAAW,eAAe,QAAQ,QAAQ,CAAC;AAAA,QAC7C;AACA,cAAM,iBAAiB,SAAS,OAAO,eAAe,IAAI;AAC1D,YAAI,IAAI,KAAK,GAAG;AACd,kBAAQ,MAAM,KAAK,IAAI,KAAK,WAAW,MAAM;AAAA,QAC/C;AACA,YAAI,WAAW,KAAK,cAAc,QAAQ;AAC1C,YAAI,iBAAiB,gBAAgB,KAAK,SAAS,IAAI,CAAC,CAAC;AACzD,cAAM,gBAAgB,SAAS,SAAQ;AACvC,YAAI,iBAAiB,cAAc;AACjC,cAAI,gBAAgB,cAAc;AAChC,8BAAkB,iBAAiB,IAAI,SAAS;AAAA,UAClD,OAAO;AACL,8BAAkB,gBAAgB,KAAK,iBAAiB,KAAK,SAAS;AAAA,UACxE;AAAA,QACF;AACA,0BAAkB,KAAK,aAAa,iBAAiB,gBAAgB;AACrE,0BAAkB,WAAW,cAAc;AAC3C,YAAI,UAAU;AACd,YAAI,sBAAsB,kBAAkB;AAC1C,gBAAM,QAAQ,iBAAiB,EAAE,MAAM,KAAK,WAAW,MAAM,UAAU,MAAM,SAAS,OAAO,KAAK,UAAU,EAAC,CAAE;AAC/G,4BAAkB,MAAM,QAAQ,MAAM,MAAM,QAAQ;AACpD,4BAAkB,MAAM,QAAQ,gBAAgB;AAChD,oBAAU,MAAM;AAChB,oBAAU,UAAU,UAAU,OAAO,MAAM;AAAA,QAC7C;AACA,gBAAQ,KAAK,uBAAuB,cAAc,eAAe,SAAS,OAAO,KAAK,CAAC,KAAK,OAAO,GAAG;AACtG,gBAAQ,KAAK,SAAS,SAAS,OAAO,GAAG,CAAC,SAAS;AACnD,gBAAQ,KAAK,OAAO;AAAA,MACtB;AACA,cAAQ,KAAK,OAAO;AACpB,WAAK,gBAAgB,cAAc,gBAAgB,EAAE,YAAY,QAAQ,KAAK,EAAE;AAChF,UAAI,KAAK,YAAY,aAAa,QAAQ,KAAK,YAAY,aAAa,UAAU;AAChF,aAAK,sBAAqB;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,cAAc,UAAU;AACtB,UAAI,KAAK,WAAW,MAAM,KAAK,UAAU,SAAS,QAAO,KAAM,KAAK,WAAW,MAAM,KAAK,UAAU,SAAS,WAAW;AACtH,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA,eAAe,MAAM;AACnB,UAAI,KAAK,WAAW,MAAM,KAAK,UAAU,QAAQ,KAAK,WAAW,MAAM,KAAK,UAAU,MAAM;AAC1F,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA,gBAAgB,MAAM,OAAO;AAC3B,UAAI,KAAK,eAAe,IAAI,GAAG;AAC7B,eAAO;AAAA,MACT;AACA,UAAI,YAAY,EAAE,OAAO,QAAQ,OAAO,CAAC;AACzC,UAAI,KAAK,YAAY,MAAM,KAAK,WAAW,aAAa,KAAK,YAAY,MAAM,KAAK,WAAW,WAAW;AACxG,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA,OAAO,WAAWN,UAAS;AACzB,eAAS,kBAAkBA,QAAO;AAAA,IACpC;AAAA,EACF;AACA,kBAAgB,UAAU,GAAG,QAAQ;AACrC,kBAAgB,SAAS;AACzB,kBAAgB,SAAS;AACzB,MAAI,iBAAiB;AACrB,WAAS,aAAa;AACpB,WAAO;AAAA,MACL,cAAc,KAAK,IAAI,SAAS,gBAAgB,cAAc,OAAO,eAAe,CAAC;AAAA,MACrF,aAAa,KAAK,IAAI,SAAS,gBAAgB,aAAa,OAAO,cAAc,CAAC;AAAA,IACtF;AAAA,EACA;AAAA,EClwCA,MAAqB,mBAAmB,OAAO;AAAA,IAI7C,YAAY,OAAkB,YAAyB,UAAoB;AACzE,YAAM,UAAU,OAAO,UAAU;AAEjC,WAAK,QAAA;AACL,WAAK,iBAAA;AACL,WAAK,eAAA;AAAA,IACP;AAAA,IAEA,UAAU;AACR,UAAI;AACJ,WAAK,MAAM,kBAAkB,OAAO,OAAO,IAAI,KAAK,MAAM,eAAe;AACzE,UAAI,OAAO,KAAK,MAAM,gBAAgB,aAAa,aAAa;AAC9D,4BAAoB,KAAK,MAAM,gBAAgB;AAAA,MACjD;AAEA,UAAIT,YAAkB,KAAK,MAAM,gBAAgB,IAAI,GAAG;AACtD,YAAI,KAAK,MAAM,cAAc,eAAe,KAAK,MAAM,cAAc,YAAY;AAC/E,eAAK,MAAM,gBAAgB,OAAO,KAAK,MAAM,WAAW,QAAQ,QAAQ,EAAE;AAAA,QAC5E,OAAO;AACL,eAAK,MAAM,gBAAgB,OAAO,KAAK,MAAM;AAAA,QAC/C;AAAA,MACF;AAEA,WAAK,MAAM,gBAAgB,WAAW,CAAC,IAAS,MAAa;AAC3D,YAAIiB,aAAiB,iBAAiB,GAAG;AACvC,4BAAkB,IAAI,CAAC;AAAA,QACzB;AAEA,aAAK,SAAS,EAAE;AAEhB,aAAK,MAAA;AAAA,MACP;AAEA,WAAK,UAAU,IAAI,eAAe,KAAK,SAAS,KAAK,MAAM,iBAAiB,EAAS;AAAA,IACvF;AAAA,IAEA,cAAc;AACZ,YAAM,QAAQ,KAAK;AAEnB,YAAM,wBAAwB,KAAK,WAAW,cAAc,qBAAqB;AAEjF,4BAAsB,YAAY;AAAA;AAAA,iCAEL,MAAM,QAAQ;AAAA;AAAA,OAExC,OAAO,uBAAuB,KAAK,CAAC;AAAA;AAAA;AAIvC,WAAK,UAAU,sBAAsB,cAAc,UAAU,MAAM,QAAQ,IAAI;AAAA,IACjF;AAAA,IAEA,WAAW;AACT,aAAO,KAAK,QAAQ;AAAA,IACtB;AAAA,IAEA,SAAS,OAAY,iBAAiC;AACpD,UAAI,oBAAoB,SAAS,KAAK,gBAAgB,KAAK,OAAO,MAAM,MAAM,KAAK,MAAM,OAAO;AAC9F,aAAK,QAAQ,QAAQ,KAAK,MAAM;AAChC;AAAA,MACF;AAEA,WAAK,MAAM,SAAS;AACpB,WAAK,QAAQ,QAAQ;AAAA,IACvB;AAAA,IAEA,QAAQ;AACN,WAAK,eAAA;AACL,WAAK,YAAY,KAAK;AACtB,gCAA0B,KAAK,UAAU;AAAA,IAC3C;AAAA,IAEA,aAA+B;AAC7B,aAAO,KAAK;AAAA,IACd;AAAA,IAEA,QAAa;AACX,YAAM,cAAc,gBAAgB,KAAK,SAAA,GAAY,KAAK,KAAK;AAE/D,qBAAe,KAAK,OAAO,KAAK,YAAY,WAAW;AAEvD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,ECvFA,MAAqB,kBAAkB,OAAO;AAAA,IAG5C,YAAY,OAAkB,YAAyB,UAAoB;AACzE,YAAM,UAAU,OAAO,UAAU;AAEjC,UAAI,MAAM,UAAU;AAClB,aAAK,iBAAiB,MAAM;AAAA,MAC9B,OAAO;AACL,aAAK,iBAAiB,CAAA;AAAA,MACxB;AAEA,WAAK,QAAA;AAAA,IACP;AAAA,IAEA,UAAU;AACR,UAAI,KAAK,eAAe,SAAS;AAC9B,aAAK,eAAe,QAAgB,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU;AAAA,MAC7E;AAEA,WAAK,oBAAoB,iBAAiB,cAAc,EAAE,QAAQ,CAAC,YAAY;AAC7E,gBAAQ,iBAAiB,SAAS,CAAC,MAAW;AAC5C,eAAK,kBAAkB,SAAS,CAAC;AAAA,QACnC,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQQ,kBAAkB,SAAkB,KAAU;AACpD,WAAK,UAAU,QAAQ,aAAa,aAAa,KAAK,EAAE;AAAA,IAC1D;AAAA,IAEO,UAAU,OAAqB;;AACpC,YAAM,UAAU,KAAK,oBAAoB,cAAc,iBAAiB,KAAK,IAAI;AAEjF,UAAI,CAAC,QAAS;AAEd,UAAI,CAAC,QAAQ,UAAU,SAAS,QAAQ,GAAG;AACzC,iBAAS,UAAQ,wCAAS,kBAAT,mBAAwB,aAAY,CAAA,GAAI;AACvD,eAAK,UAAU,OAAO,QAAQ;AAAA,QAChC;AACA,gBAAQ,UAAU,IAAI,QAAQ;AAAA,MAChC;AAEA,YAAM,WAAW,KAAK,WAAW,cAAc,kBAAkB,KAAK,IAAI;AAE1E,UAAI,EAAC,qCAAU,UAAU,SAAS,YAAW;AAC3C,iBAAS,UAAQ,0CAAU,kBAAV,mBAAyB,aAAY,CAAA,GAAI;AACxD,eAAK,UAAU,OAAO,QAAQ;AAAA,QAChC;AAEA,6CAAU,UAAU,IAAI;AAAA,MAC1B;AAAA,IACF;AAAA,IAEA,OAAO,eAAwB;AAC7B,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,mBAA4B;AACjC,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,cAAc;;AACZ,YAAM,QAAQ,KAAK;AAEnB,YAAM,eAAe,KAAK,SAAS;AACnC,YAAM,UAAU,KAAK,SAAS,WAAA;AAE9B,YAAM,wBAAwB,KAAK,WAAW,cAAc,qBAAqB;AAGjF,UAAI,aAAa,kBAAkB,SAAS,KAAK;AAEjD,4BAAsB,YAAY;AAAA;AAAA,sCAEA,WAAW,aAAa;AAAA;AAAA;AAAA;AAK1D,UAAI,MAAM,UAAU;AAClB,YAAI,YAAY;AAEhB,cAAM,cAAc,KAAK,QAAA,EAAU,WAAA;AAEnC,YAAIC,cAAyB,kBAAkB,aAAa,OAAO,MAAM,aAAa,YAAY,KAAK,CAAC;AAExG,mBAAW,cAAc,MAAM,UAAU;AACvC,qBAAW,UAAU;AACrB,uBAAa,gBAAgB,UAAU;AACvC,cAAI,KAAK,WAAW;AAEpB,cAAI,cAAc,4BAA4B,YAAY,WAAW,EAAE,kBAAkB,EAAE,4BAA4B,WAAW,KAAK;AAEvI,cAAI,kBAAkB,4BAA4B,YAAY,WAAW,EAAE,mBAAmB,EAAE,KAAK,OAAO,uBAAuB,UAAU,CAAC;AAAA;AAAA;AAI9I,gBAAM,aAAaC,kBAAwB,WAAW;AACtD,gBAAM,iBAAiBA,kBAAwB,eAAe;AAE9D,sBAAY;AACZ,cAAI,YAAY;AACd,wCAAsB,cAAc,gBAAgB,MAApD,mBAAuD,YAAY;AAAA,UACrE;AAEA,cAAI,gBAAgB;AAClB,wCAAsB,cAAc,cAAc,MAAlD,mBAAqD,YAAY;AAEjE,gBAAI,WAAW,UAAU;AACvB,kBAAI,iBAAiB;AAAA,gBACnB,OAAO;AAAA,kBACL,OAAO,YAAY,MAAM,SAAS;AAAA,kBAClC,YAAY,YAAY,MAAM,cAAc;AAAA,kBAC5C,YAAY,YAAY,MAAM,cAAc;AAAA,kBAC5C,UAAU,YAAY,MAAM,YAAY;AAAA,gBAAA;AAAA,gBAE1C,cAAc,YAAY;AAAA,gBAC1B,YAAY;AAAA,gBACZ,iBAAiB;AAAA,gBACjB,QAAQ,CAAA;AAAA,cAAC;AAGX,yBAAW,WAAW,IAAI,SAAS,SAAS,cAAc,KAAK,GAAG,cAAc;AAEhF,yBAAW,YAAY,IAAK,WAAW,YAAoB,YAAY,iDAAgB,cAAc,kBAAkB,WAAW,QAAQ;AAE1I,yBAAW,SAAS,aAAa,cAAc,YAAYD,WAAU;AAAA,YACvE;AAAA,UACF;AAAA,QACF;AAEA,aAAK,sBAAsB;AAAA,MAC7B;AAAA,IACF;AAAA,IAEA,WAAgB;;AACd,UAAI,KAAK,eAAe,UAAU;AAChC,eAAQ,KAAK,eAAe,SAAiB,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU;AAAA,MACrF;AAEA,UAAI,cAAc,CAAA;AAElB,UAAI,eAAe,KAAK,QAAA,EAAU,aAAa;AAE/C,iBAAW,cAAc,KAAK,MAAM,UAAU;AAC5C,cAAM,mBAAkB,gBAAW,aAAX,mBAAqB,SAAS;AACtD,YAAI,cAAc;AAChB,sBAAY,WAAW,UAAU,IAAI;AAAA,QACvC,OAAO;AACL,mBAAS,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,eAAe,GAAG;AACxD,wBAAY,GAAG,IAAI;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IAEA,SAAS,OAAkB;;AACzB,iBAAW,cAAc,KAAK,MAAM,UAAU;AAC5C,YAAI,gBAAgB,MAAM,WAAW,UAAU;AAE/C,YAAI,eAAe;AACjB,2BAAW,aAAX,mBAAqB,SAAS;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA,IAEA,QAAQ;;AACN,iBAAW,cAAc,KAAK,MAAM,YAAY,CAAA,GAAI;AAClD,yBAAW,aAAX,mBAAqB;AAAA,MACvB;AAAA,IACF;AAAA,IAEA,aAAsB;AACpB,aAAO,KAAK;AAAA,IACd;AAAA,IAEA,QAAa;;AACX,UAAI,KAAK,eAAe,OAAO;AAC7B,cAAM,cAAe,KAAK,eAAe,MAAc,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU;AAE7F,uBAAe,KAAK,OAAO,KAAK,YAAY,WAAW;AAEvD;AAAA,MACF;AAEA,YAAM,QAAQ,KAAK;AAEnB,iBAAW,cAAc,MAAM,UAAU;AACvC,cAAM,eAAc,gBAAW,aAAX,mBAAqB;AAEzC,YAAI,eAAe,YAAY,SAAS,GAAG;AACzC,gBAAM,YAAY,YAAY,CAAC;AAE/B,cAAI,UAAU,SAAS;AACrB,sBAAU,UAAU,MAAM,KAAK,MAAM,QAAQ,OAAO,UAAU;AAE9D,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,QAAc;AAAA,IAAC;AAAA,EACjB;AC7NA,MAAI,QAAQ;AAAA,EAEZ,MAAqB,mBAAmB,OAAO;AAAA,IAK7C,YAAY,OAAkB,YAAyB,UAAoB;AACzE,YAAM,UAAU,OAAO,UAAU;AAHnC,WAAQ,gBAAgB,CAAA;AAKtB,UAAI,MAAM,UAAU;AAClB,aAAK,iBAAiB,MAAM;AAAA,MAC9B,OAAO;AACL,aAAK,iBAAiB,CAAA;AAAA,MACxB;AAEA,YAAM,kBAAkB;AAAA,QACtB,OAAO;AAAA,UACL,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,UAAU;AAAA,QAAA;AAAA,QAEZ,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,QAAQ,CAAA;AAAA,MAAC;AAGX,WAAK,WAAW,IAAI,SAAS,SAAS,cAAc,KAAK,GAAG,eAAe;AAE3E,WAAK,QAAA;AACL,WAAK,iBAAA;AACL,WAAK,eAAA;AAAA,IACP;AAAA,IAEA,UAAU;;AACR,WAAK,OAAA;AAEL,UAAI,KAAK,eAAe,SAAS;AAC9B,aAAK,eAAe,QAAgB,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU;AAAA,MAC7E;AAEA,iBAAK,WAAW,cAAc,sBAAsB,MAApD,mBAAuD,iBAAiB,SAAS,CAAC,QAAQ;AACxF,aAAK,OAAA;AAAA,MACP;AAAA,IACF;AAAA,IAEA,OAAO,eAAwB;AAC7B,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,mBAA4B;AACjC,aAAO;AAAA,IACT;AAAA,IAEA,cAAc;;AACZ,YAAM,QAAQ,KAAK;AAEnB,YAAM,wBAAwB,KAAK,WAAW,cAAc,qBAAqB;AAEjF,UAAI,gBAAgB,CAAA;AACpB,UAAI,mBAAmB,CAAA;AACvB,UAAI,iBAAiB,CAAA;AACrB,qBAAe,KAAK,EAAE;AAEtB,UAAI,MAAM,UAAU;AAClB,yBAAiB,KAAK,YAAY;AAElC,sBAAc,KAAK,MAAM;AAEzB,yBAAiB,KAAK,0BAA0B;AAChD,sBAAc,KAAK,MAAM;AACzB,cAAI,WAAM,oBAAN,mBAAuB,sBAAqB,MAAM;AACpD,wBAAc,KAAK,mHAAmH;AAAA,QACxI;AACA,sBAAc,KAAK,OAAO;AAE1B,mBAAW,cAAc,MAAM,UAAU;AACvC,2BAAiB,KAAK,uBAAqB,gBAAW,UAAX,mBAAkB,UAAS,GAAG,IAAI;AAC7E,wBAAc,KAAK,8BAA8B,WAAW,KAAK,OAAO;AAAA,QAC1E;AACA,yBAAiB,KAAK,aAAa;AACnC,sBAAc,KAAK,OAAO;AAAA,MAC5B;AAEA,4BAAsB,YAAY;AAAA;AAAA,QAE9B,eAAe,KAAK,EAAE,CAAC;AAAA,uCACM,WAAM,UAAN,mBAAa,aAAY,EAAE,qBAAmB,WAAM,oBAAN,mBAAuB,WAAU,MAAM;AAAA,iCACzF,iBAAiB,KAAK,EAAE,CAAC,UAAU,cAAc,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,IAIxF;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,WAAuB;;AAC5B,UAAI,cAAc,CAAA;AAElB,YAAM,UAAU,KAAK,SAAS,WAAA;AAC9B,YAAM,eAAe,KAAK,SAAS;AACnC,YAAM,aAAa,KAAK,MAAM;AAE9B,QAAE;AACF,UAAI,aAAa,CAAA;AACjB,kBAAY,KAAK,0BAA0B;AAE3C,kBAAY,KAAK,MAAM;AACvB,YAAI,UAAK,MAAM,oBAAX,mBAA4B,yBAAwB,MAAM;AAC5D,oBAAY,KAAK,uCAAuC,KAAK,qFAAqF;AAAA,MACpJ;AACA,kBAAY,KAAK,OAAO;AAExB,iBAAW,cAAc,KAAK,MAAM,UAAU;AAC5C,YAAI,aAAyB,kBAAkB,SAAS,YAAY,MAAM,IAAI;AAE9E,YAAI,cAAcE,MAAY,CAAA,GAAI,UAAU;AAE5C,mBAAW,KAAK,WAAW;AAC3B,oBAAY,SAAS;AACrB,oBAAY,OAAO,YAAY,OAAO,MAAM;AAC5C,oBAAY,WAAW,aAAa,MAAMC,gBAAsB,WAAW;AAE3E,qBAAa,gBAAgB,WAAW;AAExC,oBAAY,KAAK,WAAW,YAAY,QAAQ,oCAAoC,YAAY,WAAW,aAAa,EAAE,aAAa,WAAW,UAAU,eAAe;AAAA,MAC7K;AACA,kBAAY,KAAK,OAAO;AAExB,WAAK,cAAc,KAAK,IAAI;AAE5B,YAAM,gBAAgBF,kBAAwB,YAAY,KAAK,EAAE,CAAC;AAElE,UAAI,eAAe;AACjB,mBAAK,WAAW,cAAc,OAAO,MAArC,mBAAwC,OAAO;AAE/C,4BAAc,cAAc,qBAAqB,MAAjD,mBAAoD,iBAAiB,SAAS,CAAC,QAAQ;AACrF,eAAK,UAAU,GAAG;AAAA,QACpB;AAAA,MACF;AAEA,kBAAY,aAAa,CAAA;AACzB,eAAS,eAAe,YAAY;AAClC,oBAAY,YAAY,IAAK,YAAY,YAAoB,aAAa,+CAAe,cAAc,IAAI,YAAY,QAAQ,KAAK,KAAK,QAAQ;AAEjJ,YAAIG,YAAiB,WAAW,YAAY,OAAO,IAAI,GAAG;AACxD,sBAAY,UAAU,SAAS,UAAU,YAAY,OAAO,IAAI,CAAC;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,UAAU,KAAkB;;AAC1B,YAAM,SAAS,IAAI;AAEnB,YAAM,aAAa,OAAO,QAAQ,IAAI;AAEtC,UAAI,YAAY;AAGd,YAAI,WAAU,SAAI,kBAAJ,mBAA+B,aAAa,oBAAmB;AAE7E,aAAK,gBAAgB,MAAM;AAC3B,mBAAW,OAAA;AAAA,MACb;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,gBAAgB,QAAiB;AAC/B,UAAI,kBAAkB,CAAA;AAEtB,UAAIhB,QAAc,MAAM,GAAG;AACzB,iBAAS,OAAO,KAAK,eAAe;AAClC,4BAAkB,gBAAgB,OAAO,KAAK,cAAc,GAAG,CAAC;AAAA,QAClE;AACA,aAAK,gBAAgB,CAAA;AAAA,MACvB,WAAW,QAAQ;AACjB,cAAM,YAAY,SAAS,QAAQ,EAAE;AACrC,0BAAkB,gBAAgB,OAAO,KAAK,cAAc,SAAS,CAAC;AACtE,eAAO,KAAK,cAAc,SAAS;AAAA,MACrC;AAEA,eAAS,eAAe,iBAAiB;AACvC,aAAK,SAAS,gBAAA,EAAkB,gBAAgB,YAAY,IAAI;AAAA,MAClE;AAAA,IACF;AAAA,IAEA,eAAqB;;AACnB,iBAAK,WAAW,cAAc,OAAO,MAArC,mBAAwC;AACxC,WAAK,gBAAA;AAAA,IACP;AAAA,IAEA,WAAW;AACT,UAAI,KAAK,eAAe,UAAU;AAChC,eAAQ,KAAK,eAAe,SAAiB,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU;AAAA,MACrF;AACA,UAAI,SAAS,CAAA;AACb,YAAM,WAAW,KAAK,MAAM;AAC5B,YAAM,iBAAiB,SAAS;AAChC,eAAS,OAAO,KAAK,eAAe;AAClC,cAAM,aAAa,KAAK,cAAc,GAAG;AAEzC,YAAI,UAAU,CAAA;AACd,iBAAS,WAAW,GAAG,WAAW,gBAAgB,YAAY;AAC5D,cAAI,aAAa,SAAS,QAAQ;AAClC,kBAAQ,WAAW,IAAI,IAAI,KAAK,SAAS,cAAc,WAAW,QAAQ,EAAE,IAAI;AAAA,QAClF;AAEA,eAAO,KAAK,OAAO;AAAA,MACrB;AACA,aAAO;AAAA,IACT;AAAA,IAEA,SAAS,OAAkB;AACzB,WAAK,MAAM,SAAS;AAEpB,UAAI,WAAkB,CAAA;AACtB,UAAIH,QAAc,KAAK,GAAG;AACxB,mBAAW;AAAA,MACb,OAAO;AACL,YAAIoB,cAAoB,KAAK,GAAG;AAC9B,mBAAS,KAAK,KAAK;AAAA,QACrB;AAAA,MACF;AAEA,WAAK,aAAA;AAEL,eAAS,aAAa,UAAU;AAC9B,aAAK,OAAO,SAAS;AAAA,MACvB;AAAA,IACF;AAAA,IAEA,QAAQ;AACN,WAAK,eAAA;AACL,gCAA0B,KAAK,UAAU;AAAA,IAC3C;AAAA,IAEA,aAAa;AACX,UAAI,KAAK,eAAe,YAAY;AAClC,eAAQ,KAAK,eAAe,WAAmB,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU;AAAA,MACvF;AACA,aAAO;AAAA,IACT;AAAA,IAEA,QAAa;AACX,UAAI,KAAK,eAAe,OAAO;AAC7B,cAAMX,eAAe,KAAK,eAAe,MAAc,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU;AAE7F,uBAAe,KAAK,OAAO,KAAK,YAAYA,YAAW;AAEvD;AAAA,MACF;AAEA,YAAM,cAAc,KAAK,SAAS,UAAA;AAElC,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,YAAY,YAAY,CAAC;AAE/B,YAAI,UAAU,SAAS;AACrB,oBAAU,UAAU,MAAM,KAAK,MAAM,QAAQ,OAAO,UAAU;AAE9D,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,QAAc;AAAA,IAAC;AAAA,EACjB;AC9QO,QAAM,QAAQ;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,eAAe;AAAA,IACf,KAAK;AAAA,IACL,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAE1B,UAAU;AAAA,EAEZ;AAEO,QAAM,eAAe;AAErB,QAAM,kBAAuB;AAAA,IAClC,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,IACX,MAAM;AAAA,IACN,UAAU;AAAA,IACV,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AAkBO,QAAM,iBAAiB;AAAA,IAC5B,YAAY;AAAA,EAEd;AAQO,QAAM,uBAAuC;AAAA,IAClD,YAAY,CAAC,OAAO,aAAa;AAAA,IACjC,cAAc,CAAC,OAAO,eAAe;AAAA,IACrC,aAAa,CAAC,OAAO,cAAc;AAAA,IACnC,aAAa,CAAC,IAAI,aAAa;AAAA,IAC/B,eAAe,CAAC,IAAI,eAAe;AAAA,IACnC,cAAc,CAAC,IAAI,cAAc;AAAA,IACjC,eAAe,CAAC,SAAS,cAAc;AAAA,IACvC,gBAAgB,CAAC,SAAS,eAAe;AAAA,IACzC,cAAc,CAAC,SAAS,aAAa;AAAA,IACrC,eAAe,CAAC,UAAU,aAAa;AAAA,IACvC,iBAAiB,CAAC,UAAU,eAAe;AAAA,IAC3C,gBAAgB,CAAC,UAAU,cAAc;AAAA,EAC3C;AACA,uBAAqB,KAAK,IAAI,qBAAqB,UAAU;AAC7D,uBAAqB,OAAO,IAAI,qBAAqB,aAAa;AAClE,uBAAqB,MAAM,IAAI,qBAAqB,WAAW;AAC/D,uBAAqB,QAAQ,IAAI,qBAAqB,aAAa;ACnGnE,MAAI,gBAAyB;AAAA,IAC3B,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,QAAQ;AAAA,MACN,WAAW;AAAA,MACX,WAAW;AAAA,MACX,SAAS;AAAA,IAAA;AAAA,IAEX,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,SAAS;AAAA,MACT,kBAAkB;AAAA,MAClB,SAAS;AAAA,MACT,kBAAkB;AAAA,MAClB,SAAS;AAAA,MACT,qBAAqB;AAAA,MACrB,qBAAqB;AAAA,MACrB,wBAAwB;AAAA,IAAA;AAAA,IAE1B,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,eAAe;AAAA,MACf,cAAc;AAAA,MACd,sBAAsB;AAAA,MACtB,6BAA6B;AAAA,IAAA;AAAA,EAEjC;AAAA,EAQA,MAAM,SAAS;AAAA,IAAf,cAAA;AACE,WAAQ,OAAgB;AAAA,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQjB,IAAI,MAAgB;AACzB,WAAK,OAAO,OAAO,OAAO,CAAA,GAAI,eAAe,IAAI;AAAA,IACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASO,WAAW,YAAyB;AACzC,aAAQ,KAAK,KAAa,UAAU;AAAA,IACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUO,aAAa,OAAkB,aAAoC;AACxE,UAAI,gBAAgB;AAEpB,UAAI,iBAA2B,CAAA;AAE/B,UAAI,YAAY,QAAQ;AACtB,wBAAiB,KAAK,KAAK,OAAe,YAAY,MAAM;AAC5D,uBAAe,KAAK,aAAa;AAAA,MACnC;AAEA,OAAC,YAAY,cAAc,CAAA,GAAI,QAAQ,CAAC,eAAe;AACrD,YAAI,eAAe,MAAM,UAAU;AACjC,0BAAgB,QAAQ,KAAK,KAAK,UAAU,KAAK;AACjD,yBAAe,KAAK,aAAa;AAAA,QACnC;AAEA,YAAI,MAAM,cAAc,YAAY,MAAM,cAAc,SAAS;AAC/D,0BAAiB,KAAK,KAAK,OAAe,UAAU;AACpD,yBAAe,KAAK,aAAa;AAAA,QACnC,OAAO;AACL,0BAAiB,KAAK,KAAK,OAAe,UAAU;AACpD,yBAAe,KAAK,aAAa;AAAA,QACnC;AAAA,MACF,CAAC;AAED,YAAM,YAAsB,CAAA;AAE5B,YAAM,WAAW,OAAO,OAAO,CAAA,GAAI,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,MAAA,GAAS,MAAM,IAAI;AACvF,qBAAe,QAAQ,CAAC,cAAc;AACpC,YAAI,WAAW;AACb,oBAAU,KAAK,QAAQ,WAAW,QAAQ,CAAC;AAAA,QAC7C;AAAA,MACF,CAAC;AAED,UAAI,YAAY,WAAW;AACzB,kBAAU,KAAK,YAAY,UAAU,OAAO;AAAA,MAC9C;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,QAAQ,WAAmB,UAAuB;AACzD,WAAO,UAAU,QAAQ,mCAAmC,CAAC,OAAO,QAAQ;AAC1E,aAAO,OAAO,SAAS,GAAG,MAAM,cAAc,SAAS,GAAG,IAAI;AAAA,IAChE,CAAC;AAAA,EACH;AAEA,QAAA,aAAe,IAAI,SAAA;ACxHZ,QAAM,cAAc,CAAC,UAA6B;AACvD,QAAI;AACJ,QAAI,MAAM,YAAY;AACpB,eAAS,gBAAgB,MAAM,UAAU;AAAA,IAC3C;AAEA,QAAI,WAAW,OAAO,mBAAmB,SAAS,CAACZ,YAAkB,MAAM,IAAI,IAAI;AACjF,aAAO;AAAA,IACT;AAEA,QAAIA,YAAkB,MAAM,IAAI,GAAG;AACjC,UAAI,MAAM,UAAU;AAClB,eAAO,gBAAgB,OAAO;AAAA,MAChC,OAAO;AACL,eAAO,gBAAgB,QAAQ;AAAA,MACjC;AAAA,IACF;AAEA,WAAO,gBAAgB,MAAM;AAAA,EAC/B;AAAA,ECTA,MAAqB,aAAa;AAAA,IAahC,YAAY,UAAkB,MAAgB;AAZ9C,WAAQ,WAAW;AAEnB,WAAQ,eAA+B,CAAA;AAEvC,WAAQ,aAA8B,CAAA;AAEtC,WAAQ,kBAA4B,CAAA;AAOlC,WAAK,cAAc,GAAG,YAAY,IAAIwB,YAAkB,QAAQ,CAAC;AACjE,WAAK,OAAO;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,SAAS,OAAkB;AAChCC,sBAAsB,KAAK;AAC3B,WAAK,YAAY;AACjB,YAAM,OAAO,GAAG,KAAK,WAAW,IAAI,KAAK,QAAQ;AACjD,YAAM,aAAa,MAAM,QAAQ,MAAM;AACvC,WAAK,WAAW,MAAM,UAAU,IAAI,MAAM;AAC1C,WAAK,aAAa,MAAM,IAAI,IAAI;AAChC,YAAM,cAAc,YAAY,KAAK;AAErC,UAAI,MAAM,aAAa;AACrB,aAAK,gBAAgB,KAAK,MAAM,IAAI;AAAA,MACtC;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASO,aAAa,WAA8B;AAChD,aAAO,KAAK,aAAa,KAAK,WAAW,SAAS,CAAC;AAAA,IACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASO,IAAI,UAA6B;AACtC,aAAO,KAAK,aAAa,QAAQ;AAAA,IACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASO,aAAa,WAA4B;AAC9C,UAAI,KAAK,WAAW,SAAS,KAAK,KAAK,aAAa,KAAK,WAAW,SAAS,CAAC,GAAG;AAC/E,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,kBAAkC;AACvC,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,gBAAgB,WAAmB;AACxC,YAAM,WAAW,KAAK,WAAW,SAAS;AAE1C,UAAIzB,YAAkB,QAAQ,EAAG;AAEjC,WAAK,qBAAqB,QAAQ;AAClC,aAAO,KAAK,WAAW,SAAS;AAAA,IAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,qBAAqB,UAAkB;AAC5C,YAAM,YAAY,KAAK,aAAa,QAAQ;AAE5C,UAAI,aAAa,KAAK,WAAW,UAAU,UAAU,MAAM,UAAU;AACnE,eAAO,KAAK,WAAW,UAAU,UAAU;AAAA,MAC7C;AAEA,aAAO,KAAK,aAAa,QAAQ;AAEjC,WAAK,kBAAkB,KAAK,gBAAgB,OAAO,CAAC,QAAQ,QAAQ,QAAQ;AAAA,IAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASO,iBAAiB,WAAgB,iBAA0B;AAChE,YAAM,eAAe,KAAK,KAAK,WAAA,EAAa;AAE5C,UAAI,oBAAoB,MAAM;AAC5B,iBAAS,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,KAAK,YAAY,GAAG;AAC9D,sBAAY,aAAa,WAAW,WAAW,YAAY;AAAA,QAC7D;AACA,eAAO;AAAA,MACT;AAEA,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,iBAAS,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,KAAK,YAAY,GAAG;AAC9D,cAAI,CAAC,UAAU,UAAU,gBAAgB;AACvC;AAAA,UACF;AAEA,cAAI,aAAa,KAAK,mBAAmB,WAAW,IAAI;AAExD,cAAI,eAAe,MAAM;AACvB,mBAAO,IAAI,MAAM,WAAW,SAAS,EAAE,OAAO,WAAA,CAAY,CAAC;AAC3D;AAAA,UACF;AAEA,sBAAY,aAAa,WAAW,WAAW,YAAY;AAAA,QAC7D;AAEA,gBAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,IAEO,iBAAiB,WAAgB,iBAA0B;AAChE,UAAI,oBAAoB,MAAM;AAC5B,YAAI,QAAQ,IAAI,SAAA;AAEhB,iBAAS,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AAClD,gBAAM,IAAI,KAAK,KAAY;AAAA,QAC7B;AAEA,iBAAS,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,KAAK,YAAY,GAAG;AAC9D,2BAAiB,OAAO,WAAW,UAAU,UAAU,UAAU;AAAA,QACnE;AAEA,eAAO;AAAA,MACT;AAEA,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAI,QAAQ,IAAI,SAAA;AAEhB,iBAAS,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AAClD,gBAAM,IAAI,KAAK,KAAY;AAAA,QAC7B;AAEA,iBAAS,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,KAAK,YAAY,GAAG;AAC9D,cAAI,CAAC,UAAU,UAAU,gBAAgB;AACvC;AAAA,UACF;AAEA,cAAI,aAAa,KAAK,mBAAmB,WAAW,IAAI;AAExD,cAAI,eAAe,MAAM;AACvB,mBAAO,IAAI,MAAM,WAAW,SAAS,EAAE,OAAO,WAAA,CAAY,CAAC;AAC3D;AAAA,UACF;AAEA,2BAAiB,OAAO,WAAW,UAAU,UAAU,UAAU;AAAA,QACnE;AAEA,gBAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,sBAAsB,OAAkB;AAC7C,UAAI,SAAS;AAEb,aAAO,OAAO,WAAW,aAAa;AACpC,YAAI,CAAC,KAAK,iBAAiB,MAAM,GAAG;AAClC,iBAAO;AAAA,QACT;AAEA,iBAAS,OAAO;AAAA,MAClB;AAEA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,iBAAiB,OAAkB;AACxC,UAAI,CAAC,KAAK,gBAAgB,SAAS,MAAM,IAAI,GAAG;AAC9C,eAAO;AAAA,MACT;AAEA,UAAI,WAAW;AAEf,UAAI,MAAM,YAAY,QAAQ;AAC5B,mBAAW,MAAM,YAAY,OAAO,KAAK,MAAM,KAAK;AAAA,MACtD,OAAO;AACL,YAAI,MAAM,YAAY,OAAO;AAC3B,gBAAM,YAAY,KAAK,aAAa,MAAM,YAAY,KAAK;AAE3D,cAAI,WAAW;AACb,gBAAI,MAAM,YAAY,MAAM,UAAU,UAAU,YAAY;AAC1D,yBAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,iBAAiB;AACtB,WAAK,gBAAgB,QAAQ,CAAC,aAAa;AACzC,cAAM,YAAY,KAAK,aAAa,QAAQ;AAE5C,YAAI,WAAW,KAAK,iBAAiB,SAAS;AAE9C,YAAI,UAAU;AACZ,oBAAU,UAAU,KAAA;AAAA,QACtB,OAAO;AACL,oBAAU,UAAU,KAAA;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,mBAAmB,WAAsB,WAAgC;AAC9E,UAAI,CAAC,KAAK,sBAAsB,SAAS,GAAG;AAC1C,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,UAAU;AAC7B,UAAI,aAAa,WAAW,MAAA;AAE5B,UAAI,eAAe,KAAM,QAAO;AAEhC,UAAI,WAAW;AACb,mBAAW,MAAA;AAAA,MACb;AACA,mBAAa;AACb,UAAIA,YAAkB,WAAW,OAAO,GAAG;AACzC,mBAAW,UAAUU,WAAS,aAAa,WAAW,UAAU,EAAE,CAAC;AAAA,MACrE;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAQA,WAAS,aAAa,UAAe,WAAsB,cAAwB;AACjF,QAAIgB,iBAAuB,SAAS,GAAG;AACrC,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,UAAU,UAAU,SAAA;AAEvC,QAAI,UAAU,eAAe,QAAQ;AACnC,YAAM,cAAc,WAAW,YAAY;AAE3C,eAAS,UAAU,UAAU,IAAI;AACjC,eAAS,UAAU,aAAa,WAAW,IAAI,WAAW,WAAW;AAAA,IACvE,OAAO;AACL,UAAI,iBAAiB,MAAM;AACzB,YAAIC,UAAgB,SAAS,GAAG;AAC9B,mBAAS,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACnD,qBAAS,GAAG,IAAI;AAAA,UAClB;AAAA,QACF,OAAO;AACL,cAAI,CAACrB,QAAc,UAAU,IAAI,GAAG;AAClC,qBAAS,UAAU,IAAI,IAAI;AAAA,UAC7B;AAAA,QACF;AAAA,MACF,OAAO;AACL,iBAAS,UAAU,UAAU,IAAI;AAAA,MACnC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB,UAAoB,WAAsB,cAAwB;AAC1F,QAAIoB,iBAAuB,SAAS,GAAG;AACrC,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,UAAU,UAAU,SAAA;AAEvC,QAAI,UAAU,eAAe,QAAQ;AACnC,YAAM,cAAc,WAAW,YAAY;AAC3C,eAAS,OAAO,UAAU,UAAU;AACpC,eAAS,cAAc,aAAa;AAClC,iBAAS,OAAO,UAAU,YAAY,UAAU;AAAA,MAClD;AAEA,eAAS,IAAI,UAAU,aAAa,aAAa,WAAW,WAAW,CAAC;AAAA,IAC1E,OAAO;AACL,UAAI,iBAAiB,MAAM;AACzB,YAAIC,UAAgB,SAAS,GAAG;AAC9B,mBAAS,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACnD,qBAAS,IAAI,KAAK,KAAY;AAAA,UAChC;AAAA,QACF,OAAO;AACL,cAAI,CAACrB,QAAc,UAAU,IAAI,GAAG;AAClC,qBAAS,IAAI,UAAU,YAAY,UAAU;AAAA,UAC/C;AAAA,QACF;AAAA,MACF,OAAO;AACL,iBAAS,IAAI,UAAU,YAAY,UAAU;AAAA,MAC/C;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EC1WA,MAAqB,aAAa;AAAA,IAUhC,YAAY,UAAoB,aAAsB,cAA4B;AAFlF,WAAQ,eAAyB,CAAA;AAG/B,WAAK,WAAW;AAChB,WAAK,UAAU,SAAS,WAAA;AACxB,WAAK,cAAc;AAEnB,WAAK,eAAe;AAAA,IACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,OAAO,OAAkB;AAC9B,UAAI,KAAK,iBAAiB,KAAK,GAAG;AAChC;AAAA,MACF;AAEA,WAAK,eAAe,CAAA;AAEpB,WAAK,eAAe,KAAK;AAAA,IAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,eAAe,OAAwB;AAC5C,UAAI,gBAAgB,KAAK,YAAY,KAAK;AAE1C,UAAI,aAAyB,kBAAkB,KAAK,SAAS,OAAO,MAAM,aAAa;AAEvF,WAAK,gBAAgB,KAAK;AAE1B,YAAM,aAAaa,kBAAwB;AAAA,2CACJ,WAAW,UAAU,SAAS,MAAM,IAAI;AAAA,YACvE,gBAAgB,KAAK,wBAAwB,WAAW,UAAU,IAAI,WAAW,eAAe,YAAY,MAAM,SAAS,EAAE,YAAY,WAAW,UAAU,KAAK,KAAK,iBAAiB,KAAK,CAAC,QAAQ;AAAA;AAAA,2CAExK,WAAW,UAAU,IAAI,MAAM,WAAW,aAAa,EAAE,YAAY,WAAW,UAAU;AAAA;AAAA,KAEhI;AAED,UAAI,YAAY;AACd,aAAK,YAAY,OAAO,UAAU;AAClC,aAAK,YAAY,OAAO,UAAU;AAElC,YAAI,MAAM,UAAU;AAClB,eAAK,cAAc,OAAO,UAAU;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAAA,IAEO,YAAY,OAAkB,SAAwB;AAC3D,YAAM,YAAY,IAAK,MAAM,YAAoB,OAAO,SAAS,KAAK,QAAQ;AAAA,IAChF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASO,cAAc,OAAkB,kBAAoC;AACzE,UAAI,cAAyB;AAC7B,UAAI,YAAY;AAChB,UAAI,eAAe;AAEnB,UAAI,CAAE,MAAM,YAAoB,oBAAoB;AAClD;AAAA,MACF;AAEA,YAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,iBAAW,UAAU,IAAI,UAAU,iBAAiB,iBAAiB,EAAE;AAEvE,UAAI,MAAM;AAEV,iBAAW,cAAc,MAAM,UAAU;AACvC,YAAIb,QAAc,UAAU,GAAG;AAC7B,gBAAM,IAAI,MAAM,kBAAkB,MAAM,UAAU,qBAAqB,GAAG,aAAa,UAAU,GAAG;AAAA,QACtG;AAEA,mBAAW,UAAU;AACrB,UAAE;AAEF,YAAI,KAAK,iBAAiB,UAAU,GAAG;AACrC;AAAA,QACF;AAEA,aAAK,gBAAgB,UAAU;AAE/B,YAAI,WAAW;AACb,wBAAc;AAAA,QAChB;AAEA,YAAI,gBAAgB,KAAK,YAAY,UAAU;AAE/C,YAAI;AAEJ,YAAI,gBAAgB;AACpB,YAAI,eAAe;AACjB,4BAAkB,kBAAkB,KAAK,SAAS,YAAY,aAAa,CAAC,YAAY;AACxF,0BAAgB,eAAe,kCAAkC,gBAAgB,UAAU,YAAY,gBAAgB,UAAU,cAAc;AAAA,QACjJ,OAAO;AACL,4BAAkB,kBAAkB,KAAK,SAAS,YAAY,aAAa,KAAK;AAChF,0BAAgB,yBAAyB,gBAAgB,UAAU,IAAI,gBAAgB,eAAe,YAAY,WAAW,SAAS,EAAE,YAAY,gBAAgB,UAAU,KAAK,KAAK,iBAAiB,UAAU,CAAC;AAAA,QACtN;AAEA,cAAM,eAAea,kBAAwB,6BAA6B,gBAAgB,UAAU,YAAY,gBAAgB,UAAU,SAAS,WAAW,IAAI;AAAA,UAC9J,aAAa;AAAA,0CACmB,gBAAgB,UAAU,IAAI,WAAW,WAAW,aAAa,EAAE,YAAY,gBAAgB,UAAU;AAAA,aACtI;AAEP,YAAI,cAAc;AAChB,eAAK,YAAY,YAAY,YAAY;AACzC,qBAAW,OAAO,YAAY;AAE9B,cAAI,WAAW,UAAU;AACvB,iBAAK,cAAc,YAAY,WAAW,WAAW,kBAAkB,gBAAgB;AAAA,UACzF;AAAA,QACF;AACA,YAAI,CAAC,eAAe;AAClB,yBAAe;AAAA,QACjB;AAEA,oBAAY;AAAA,MACd;AAEA,YAAM,UAAU,cAAc,UAAU;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,iBAAiB,OAAkB;AACxC,YAAM,mBAAmB,MAAM,WAAW,mCAAmC;AAC7E,YAAM,kBAAkBZ,QAAc,MAAM,OAAO,IAAI,KAAK,2DAA2D,MAAM,OAAO;AAEpI,aAAO,+BAA+B,MAAM,SAAS,EAAE,WAAW,eAAe,IAAI,gBAAgB;AAAA,IACvG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,YAAY,OAA2B;;AAC5C,eAAO,WAAM,UAAN,mBAAa,cAAaP,YAAkB,MAAM,KAAK;AAAA,IAChE;AAAA,IAEO,iBAAiB,OAAkB;AACxC,UAAI4B,cAAoB,KAAK,GAAG;AAC9B,aAAK,aAAa,SAAS,KAAK;AAChC,cAAM,YAAY,IAAK,MAAM,YAAoB,OAAO,MAAM,KAAK,QAAQ;AAE3E,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,gBAAgB,OAAkB;AACvC,UAAI,CAACrB,QAAc,MAAM,IAAI,KAAK,KAAK,aAAa,aAAa,MAAM,IAAI,GAAG;AAC5E,cAAM,IAAI,MAAM,yBAAyB,MAAM,IAAI,GAAG;AAAA,MACxD;AAEA,WAAK,aAAa,SAAS,KAAK;AAChC,WAAK,aAAa,KAAK,MAAM,IAAI;AAAA,IACnC;AAAA,EACF;AC1MO,WAAS,gBAAgB,SAAmC;AACjE,UAAM,OAAO,MAAM,IAAI,iBAAiB,OAAO;AAC/C,SAAK,SAAS,gBAAgB,KAAK,MAAM;AAEzC,WAAO;AAAA,EACT;AAOO,WAAS,kBAAkB,SAAqC;AACrE,sBAAkB,MAAM,IAAI,iBAAiB,OAAO;AACpD,oBAAgB,SAAS,gBAAgB,gBAAgB,MAAM;AAAA,EACjE;AAGO,WAAS,gBAAgB,QAAmF;AACjH,YAAQ,UAAU,IAAI,OAAO,CAAC,UAA8B,SAAS,IAAI,EAAE,IAAI,CAAC,UAAU;AACxF,UAAI,MAAM,QAAQ,MAAM,QAAQ,EAAG,OAAM,WAAW,gBAAgB,MAAM,QAAQ;AAClF,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,MAAI,kBAAkB;AAAA,IACpB,OAAO;AAAA,MACL,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,UAAU;AAAA,IAAA;AAAA,IAEZ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,QAAQ,CAAA;AAAA,EACV;ACJA,QAAM,cAA2B,CAAA;AAEjC,QAAM,eAAe;AAErB,MAAI,gBAAgB;AAOb,QAAM,YAAN,MAAM,UAAS;AAAA,IAkBpB,YAAY,aAAsB,SAAsBE,UAAmB;AAN3E,WAAQ,YAAiB,CAAA;AAIzB,WAAQ,kBAAwC,CAAA;AAuEhD,WAAO,aAAa,CAAC,SAA0B;AAC7C,aAAK,QAAQ,OAAO;AACpB,aAAK,YAAY,aAAa,gBAAgB,IAAI;AAElD,cAAM,SAAS,KAAK,YAAY,iBAA6E,uDAAiE;AAE9K,YAAI,QAAQ,QAAQ;AAClB,iBAAO,QAAQ,CAAC,UAAU;AACxB,gBAAI,iBAAiB,kBAAkB;AACrC,oBAAM,WAAW;AAAA,YACnB;AAEA,gBAAI,iBAAiB,qBAAqB;AACxC,oBAAM,WAAW;AAAA,YACnB;AAAA,UACF,CAAC;AAAA,QACH,OAAO;AACL,iBAAO,QAAQ,CAAC,UAAU;AACxB,gBAAI,iBAAiB,kBAAkB;AACrC,oBAAM,WAAW;AAAA,YACnB;AAEA,gBAAI,iBAAiB,qBAAqB;AACxC,oBAAM,WAAW;AAAA,YACnB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAKA,WAAO,YAAY,MAAM;AACvB,cAAM,WAAW,KAAK,aAAa,gBAAA;AACnC,mBAAW,OAAO,UAAU;AAC1B,gBAAM,YAAY,SAAS,GAAG;AAC9B,gBAAM,aAAa,UAAU;AAE7B,cAAI,cAAc,OAAO,WAAW,UAAU,YAAY;AACxD,uBAAW,MAAA;AAAA,UACb;AAAA,QACF;AACA,aAAK,YAAY,CAAA;AACjB,aAAK,eAAA;AAAA,MACP;AAMA,WAAO,aAAa,CAAC,cAAsB;AACzC,aAAK,aAAa,aAAa,SAAS,EAAE,UAAU,MAAA;AACpD,aAAK,UAAU,SAAS,IAAI;AAC5B,aAAK,eAAA;AAAA,MACP;AA4BA,WAAO,gBAAgB,CAAC,cAAsB;AAC5C,cAAM,QAAQ,KAAK,aAAa,aAAa,SAAS;AAEtD,YAAI,OAAO;AACT,iBAAO,MAAM,UAAU,SAAA;AAAA,QACzB;AACA,eAAO;AAAA,MACT;AAOA,WAAO,WAAW,CAAC,YAA0B;AAC3C,eAAO,KAAK,aAAa,iBAAiB,KAAK,WAAW,OAAO;AAAA,MACnE;AAEA,WAAO,mBAAmB,CAAC,YAA0B;AACnD,eAAO,KAAK,aAAa,iBAAiB,KAAK,WAAW,OAAO;AAAA,MACnE;AAMA,WAAO,WAAW,CAAC,QAAa,cAAoC;AAClE,YAAI,cAAc,OAAO;AACvB,eAAK,UAAA;AAAA,QACP;AAEA,eAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,cAAc;AACzC,eAAK,eAAe,WAAW,OAAO,SAAS,CAAC;AAAA,QAClD,CAAC;AACD,aAAK,eAAA;AAAA,MACP;AAEA,WAAO,gBAAgB,CAAC,WAAmB,UAAe;AACxD,aAAK,eAAe,WAAW,KAAK;AACpC,aAAK,eAAA;AAAA,MACP;AAWA,WAAO,gBAAgB,CAAC,WAAmB,WAAgB;AACzD,cAAM,QAAQ,KAAK,aAAa,aAAa,SAAS;AAEtD,YAAI,OAAO;AACT,iBAAO,MAAM,UAAU,cAAc,MAAM;AAAA,QAC7C;AAAA,MACF;AAOA,WAAO,WAAW,CAAC,UAAqB;AACtC,YAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,OAAQ;AACtC,aAAK,QAAQ,OAAO,KAAK,KAAK;AAC9B,aAAK,aAAa,OAAO,KAAK;AAC9B,aAAK,eAAA;AAAA,MACP;AAOA,WAAO,cAAc,CAAC,cAAsB;AAC1C,cAAM,YAAY,KAAK,aAAa,aAAa,SAAS;AAE1D,YAAI,CAAC,UAAW;AAEhB,cAAM,eAAe,KAAK,gBAAgB,SAAS;AAEnD,qBAAa,QAAQ,CAAC,gBAAgB;AACpC,eAAK,gBAAgB,WAAW;AAAA,QAClC,CAAC;AAED,aAAK,mBAAmB,SAAS;AACjC,aAAK,uBAAuB,SAAS;AAErC,qBAAa,QAAQ,CAAC,gBAAgB;AACpC,eAAK,aAAa,qBAAqB,YAAY,IAAI;AAAA,QACzD,CAAC;AAED,aAAK,eAAA;AAAA,MACP;AA8GA,WAAO,cAAc,MAAe;AAClC,cAAM,SAAS,KAAK,UAAA;AAEpB,eAAO,OAAO,SAAS;AAAA,MACzB;AAOA,WAAO,YAAY,MAAa;AAC9B,YAAI,cAAc,CAAA;AAClB,YAAI,gBAAgB,KAAK,QAAQ,cAAc;AAC/C,YAAI,YAAY;AAEhB,cAAM,WAAW,KAAK,aAAa,gBAAA;AACnC,mBAAW,YAAY,UAAU;AAC/B,gBAAM,YAAY,SAAS,QAAQ;AAEnC,cAAI,aAAa,KAAK,aAAa,mBAAmB,WAAW,aAAa;AAE9E,cAAI,eAAe,MAAM;AACvB,4BAAgB;AAEhB,gBAAIoB,WAAiB,SAAS,GAAG;AAC/B,4BAAc,YAAY,OAAO,UAAU;AAAA,YAC7C,OAAO;AACL,kBAAI,WAAW;AACb,qBAAK,cAAc,SAAS;AAC5B,4BAAY;AAAA,cACd;AACA,0BAAY,KAAK,UAAU;AAAA,YAC7B;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAWA,WAAO,eAAe,CAAC,cAA+B;AACpD,cAAM,YAAY,KAAK,aAAa,aAAa,SAAS;AAE1D,YAAI7B,YAAkB,SAAS,GAAG;AAChC,gBAAM,IAAI,MAAM,eAAe,SAAS,aAAa;AAAA,QACvD;AAEA,cAAM,aAAa,UAAU;AAC7B,YAAI,YAAY;AACd,iBAAO,WAAW,YAAY;AAAA,QAChC;AAEA,eAAO;AAAA,MACT;AAKA,WAAO,aAAa,MAAM;AACxB,eAAO,KAAK;AAAA,MACd;AAeA,WAAO,YAAY,CAAC,aAA8C;AAChE,aAAK,gBAAgB,KAAK,QAAQ;AAElC,eAAO,MAAM;AACX,eAAK,kBAAkB,KAAK,gBAAgB,OAAO,CAAC,MAAM,MAAM,QAAQ;AAAA,QAC1E;AAAA,MACF;AA0BA,WAAO,UAAU,MAAM;AACrB,aAAK,YAAY,YAAY,KAAK;AAClC,aAAK,YAAY,gBAAA;AACjB,eAAO,YAAY,KAAK,QAAQ;AAEhC,mBAAW,OAAO,MAAM;AACtB,cAAIsB,YAAiB,MAAM,GAAG,GAAG;AAC/B,mBAAO,KAAK,GAAG;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AA6BA,WAAO,YAAY,MAAa;AAC9B,eAAO,KAAK,QAAQ;AAAA,MACtB;AAMA,WAAO,YAAY,CAAC,WAAkB;AACpC,aAAK,QAAQ,SAAS,gBAAgB,MAAM;AAC5C,aAAK,YAAY,gBAAA;AACjB,aAAK,YAAY,CAAA;AACjB,aAAK,WAAW,KAAK,QAAQ,MAAM;AAAA,MACrC;AA3gBE,WAAK,UAAU,gBAAgB,OAAO;AAEtCZ,iBAAS,IAAID,QAAO;AAEpB,UAAI,aAAa;AACf,aAAK,sBAAsB,YAAY;AACvC,oBAAY,UAAU,IAAI,aAAa;AAEvC,aAAK,WAAW,MAAM,EAAE,aAAa;AACrC,oBAAY,aAAa,QAAQ,KAAK,QAAQ;AAC9C,oBAAY,aAAa,cAAc,KAAK,QAAQ;AAEpD,YAAI,KAAK,QAAQ,MAAM,OAAO;AAC5B,sBAAY,aAAa,SAAS,SAAS,KAAK,QAAQ,MAAM,KAAK,GAAG;AAAA,QACxE;AAEA,aAAK,cAAc;AACnB,aAAK,WAAW,KAAK,QAAQ,QAAQ,KAAK;AAC1C,aAAK,WAAW,KAAK,QAAQ,MAAM;AAEnC,YAAI,KAAK,QAAQ,eAAe,OAAO;AACrC,sBAAY,KAAK,QAAQ,IAAI;AAAA,QAC/B;AAAA,MACF,OAAO;AACL,cAAM,IAAI,MAAM,GAAG,WAAW,0BAA0B;AAAA,MAC1D;AAAA,IACF;AAAA,IAEA,OAAc,OAAO,aAAsB,SAAsBA,UAA6B;AAC5F,aAAO,IAAI,UAAS,aAAa,SAASA,QAAO;AAAA,IACnD;AAAA,IAEA,OAAc,WAAWA,UAAwB;AAC/CC,iBAAS,IAAID,QAAO;AAAA,IACtB;AAAA,IAEA,OAAc,kBAAkB,SAAsBA,UAAyB;AAC7E,wBAAkB,OAAO;AAEzB,UAAIA,UAAS;AACXC,mBAAS,IAAID,QAAO;AAAA,MACtB;AAAA,IACF;AAAA,IAEQ,WAAW,QAAqB;AACtC,WAAK,eAAe,IAAI,aAAa,KAAK,UAAU,IAAI;AAExD,WAAK,eAAe,IAAI,aAAa,MAAM,KAAK,aAAa,KAAK,YAAY;AAE9E,UAAI,KAAK,QAAQ,eAAe,OAAO;AACrC;AAAA,MACF;AAEA,aAAO,QAAQ,CAAC,UAAU;AACxB,aAAK,aAAa,OAAO,KAAK;AAAA,MAChC,CAAC;AACD,WAAK,eAAA;AAEL,UAAI,KAAK,QAAQ,WAAW;AAC1B,aAAK,QAAQ,UAAU,KAAK,IAAI;AAAA,MAClC;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAqEO,gBAAgB,WAAmB;AACxC,YAAM,QAAQ,KAAK,aAAa,aAAa,SAAS;AAEtD,UAAI,+BAAO,WAAW;AACpB,eAAO,MAAM,UAAU,WAAA;AAAA,MACzB;AAEA,aAAO;AAAA,IACT;AAAA,IAEO,SAAS,WAA8B;AAC5C,aAAO,KAAK,aAAa,aAAa,SAAS;AAAA,IACjD;AAAA,IAkDQ,eAAe,WAAmB,OAAY;AACpD,WAAK,UAAU,SAAS,IAAI;AAC5B,YAAM,YAAY,KAAK,aAAa,aAAa,SAAS;AAE1D,UAAI,WAAW;AACb,kBAAU,UAAU,SAAS,KAAK;AAAA,MACpC;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAwDQ,gBAAgB,WAAsB,SAAsB,IAAiB;;AACnF,aAAO,KAAK,SAAS;AAErB,sBAAU,aAAV,mBAAoB,QAAQ,CAAC,eAAe;AAC1C,YAAI,cAAc,KAAK,aAAa,IAAI,WAAW,IAAI,MAAM,YAAY;AACvE,eAAK,gBAAgB,YAAY,MAAM;AAAA,QACzC;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOQ,mBAAmB,WAAsB;;AAC/C,YAAM,cAAc,UAAU;AAG9B,UAAI,eAAekB,UAAgB,WAAW,GAAG;AAC/C,cAAM,aAAa,YAAY,UAAU,WAAA;AACzC,cAAM,UAAU,WAAW,cAAc,iBAAiB,UAAU,IAAI,IAAI;AAC5E,cAAM,aAAa,mCAAS,UAAU,SAAS;AAE/C,2CAAS;AACT,yBAAW,cAAc,kBAAkB,UAAU,IAAI,IAAI,MAA7D,mBAAgE;AAEhE,cAAM,eAAe,WAAW,cAAc,6BAA6B;AAC3E,YAAI,cAAc,cAAc;AAC9B,sBAAY,UAAU,UAAU,aAAa,aAAa,aAAa,KAAK,EAAE;AAAA,QAChF;AACA;AAAA,MACF;AAGA,YAAM,cAAc,QAAQ,UAAU,IAAI;AAC1C,UAAI,WAAU,eAAU,cAAV,mBAAqB;AAGnC,UAAI,mBAAmB,YAAY,mBAAmB,gBAAgB;AACpE,kBAAU,QAAQ,CAAC,KAAK;AAAA,MAC1B;AAEA,YAAM,cAAc,mBAAmB,UAAU,QAAQ,QAAQ,WAAW,IAAI,SAAS,KAAK,YAAY,cAAc,WAAW;AACnI,YAAM,mBAAmB,yCAAY;AAErC,+CAAY;AAGZ,UAAI,gBAAe,qDAAkB,UAAU,SAAS,cAAa,iBAAiB,oBAAoB,GAAG;AAC3G,yBAAiB,OAAA;AAAA,MACnB;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQQ,uBAAuB,WAAsB;AACnD,YAAM,SAAkC,UAAU,UAAU,UAAU,QAAQ,WAAW,KAAK,QAAQ;AACtG,YAAM,MAAM,SAAS,OAAO,QAAQ,SAAS,IAAI;AAEjD,UAAI,MAAM,IAAI;AACZ,yCAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOQ,gBAAgB,WAAsB;AAC5C,YAAM,OAAO,CAAC,UAAU,MAAM,UAAU,UAAU;AAElD,UAAI,UAAU,eAAe,QAAQ;AACnC,aAAK,KAAK,UAAU,aAAa,WAAW;AAAA,MAC9C,WAAWA,UAAgB,SAAS,GAAG;AACrC,aAAK,KAAK,GAAG,OAAO,KAAK,UAAU,UAAU,cAAc,CAAA,CAAE,CAAC;AAAA,MAChE;AAGA,UAAI,UAAU,UAAU;AACtB,aAAK,KAAK,GAAG,OAAO,KAAK,UAAU,SAAS,SAAS,KAAK,KAAK,CAAA,CAAE,CAAC;AAAA,MACpE;AAEA,WAAK,QAAQ,CAAC,QAAQ;AACpB,YAAI,CAACpB,QAAc,GAAG,EAAG,QAAO,KAAK,UAAU,GAAG;AAAA,MACpD,CAAC;AAAA,IACH;AAAA,IA+CQ,cAAc,WAAsB;AAC1C,UAAI,UAAU,SAAS;AACrB,YAAI,UAAU,QAAQ,cAAc,OAAO;AACzC,oBAAU,QAAQ,UAAU,UAAU,UAAU,IAAI;AAAA,QACtD;AACA,aAAK,cAAc,UAAU,OAAO;AAAA,MACtC;AAAA,IACF;AAAA,IAwBO,iBAAiB;AACtB,WAAK,aAAa,eAAA;AAClB,WAAK,aAAA;AAAA,IACP;AAAA,IAkBQ,eAAe;AACrB,UAAI,KAAK,gBAAgB,SAAS,EAAG;AAErC,YAAM,QAAyB,EAAE,MAAM,KAAA;AACvC,WAAK,gBAAgB,QAAQ,CAAC,aAAa,SAAS,KAAK,CAAC;AAAA,IAC5D;AAAA,IAEO,iBAAiB,WAAmB,MAAe;AACxD,YAAM,YAAY,KAAK,aAAa,aAAa,SAAS;AAC1D,gBAAU,UAAU,YAAY,IAAI;AAAA,IACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASO,oBAAoB,WAAmB,MAAc;AAC1D,YAAM,YAAY,KAAK,aAAa,aAAa,SAAS;AAC1D,gBAAU,UAAU,eAAe,IAAI;AAAA,IACzC;AAAA,IA2BA,OAAc,SAAS,KAAuB;AAC5C,YAAM,UAAUL,WAAe,GAAG,IAAI,SAAS,cAAc,GAAG,IAAI;AACpE,UAAI,CAAC,QAAS,QAAO;AACrB,UAAI,WAAW,QAAQ,aAAa,YAAY;AAChD,UAAIK,QAAc,QAAQ,GAAG;AAC3B,cAAM,OAAO,OAAO,KAAK,WAAW;AACpC,YAAI,KAAK,SAAS,EAAG,OAAM,IAAI,MAAM,qBAAqB,QAAQ,GAAG;AACrE,mBAAW,KAAK,CAAC;AAAA,MACnB;AACA,aAAO,WAAW,YAAY,QAAQ,IAAI;AAAA,IAC5C;AAAA,IAmBO,kBAAkB;AACvB,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAliBE,YAAc,UAAU,GAAG,QAAW;AAqftC,YAAc,YAAY;AAAA,IACxB,QAAQ,CAAC,OAAe,UAAqB;AAC3C,aAAO,gBAAgB,OAAO,KAAK;AAAA,IACrC;AAAA,IACA,QAAQ,CAAC,OAAe,UAAqB;AAC3C,aAAO,gBAAgB,OAAO,KAAK;AAAA,IACrC;AAAA,IACA,QAAQ,CAAC,OAAe,UAAqB;AAC3C,UAAI,SAAsB,EAAE,MAAM,MAAM,MAAM,YAAY,GAAC;AAC3D,aAAO,gBAAgB,OAAO,OAAO,MAAM;AAAA,IAC7C;AAAA,EAAA;AAhgBG,MAAM,WAAN;ACjCP,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,SAAS,OAAO,UAAU,CAAA;AACjC,WAAO,OAAO,OAAO;AAAA,EACvB;;","x_google_ignoreList":[0,24,25]}
|