PageSourceSearch

https://naemo.ai/_next/static/chunks/3119.1edecc22af663fb8.js

js naemo.ai collected 2026-10-02 01:14:19 UTC 77,038 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3119,5306],{16011:function(e,t,r){r.d(t,{Od:function(){return n},W:function(){return d},Y6:function(){return l},f9:function(){return a},getStudentMockExams:function(){return i},ln:function(){return c}}),r(83079);var s=r(12119),a=(0,s.$)("6f79f3df6ace84ec5011c9606d5126a283f0ce00"),n=(0,s.$)("fca6dd844ba9770f5af8e9b00b684ad694adaa4a");(0,s.$)("a23c7989ead4c3f0bbc34ab968897e577d69c34e");var l=(0,s.$)("25b3af908b23b7a432042fc7fc768d9a77983d41");(0,s.$)("6b3568d6b307d0ad395124e72ce56f40a95ffa5e");var i=(0,s.$)("8909e13eb61723a8c65f1da87ec810139ad46edd"),d=(0,s.$)("610035678b1f5c2ab1d276b66f1f6b8d7da99c5b"),c=(0,s.$)("fc5f94b04a0542d499822142b7b4f64c39012342")},43232:function(e,t,r){r.d(t,{O:function(){return a}});var s=r(57437);let a=e=>{let{size:t=32,className:r="",strokeWidth:a=1.9}=e;return(0,s.jsx)("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:a,strokeLinecap:"square",strokeLinejoin:"miter",className:r,children:(0,s.jsx)("path",{d:"M12 7 L17 12 L12 17 L7 12 Z"})})}},53834:function(e,t,r){r.d(t,{W:function(){return d}});var s=r(57437),a=r(29),n=r.n(a),l=r(93448),i=r(43232);let d=e=>{let{size:t=32,speed:r=1.5,className:a="",withPulse:d=!1}=e;return(0,s.jsxs)("div",{style:{animation:"spin ".concat(r,"s linear infinite").concat(d?", pulse 2s ease-in-out infinite":"")},className:"jsx-ba9b38e61bef3f8b "+((0,l.cn)("brand-logo-loader inline-flex items-center justify-center",a)||""),children:[(0,s.jsx)(i.O,{size:t}),(0,s.jsx)(n(),{id:"ba9b38e61bef3f8b",children:"@-webkit-keyframes spin{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes spin{from{-moz-transform:rotate(0deg);transform:rotate(0deg)}to{-moz-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes spin{from{-o-transform:rotate(0deg);transform:rotate(0deg)}to{-o-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{from{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}@-moz-keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}@-o-keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}@keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}"})]})}},83119:function(e,t,r){r.r(t),r.d(t,{default:function(){return X}});var s=r(57437),a=r(2265),n=r(16011);function l(e){var t,r,s,l;let i=e?JSON.stringify(e):"",[d,c]=(0,a.useState)(null),[o,u]=(0,a.useState)(0);(0,a.useEffect)(()=>{if(!i){c(null);return}let e=!0;return c(null),async function(){try{let t=await (0,n.f9)(JSON.parse(i));if(!e)return;if(!t.success){c({key:i,groups:[],personalCount:0,selections:{},includePersonal:!1,error:t.error});return}let r=Object.fromEntries(t.groups.filter(e=>1===e.exams.length).map(e=>[e.key,e.exams[0].id]));c({key:i,groups:t.groups,personalCount:t.personalCount,selections:r,includePersonal:!t.groups.length})}catch(t){e&&c({key:i,groups:[],personalCount:0,selections:{},includePersonal:!1,error:"시험 목록을 불러오지 못했습니다. 다시 시도해 주세요."})}}(),()=>{e=!1}},[i,o]);let x=(null==d?void 0:d.key)===i?d:null;return{active:!!i,loading:!!(i&&!x),error:null==x?void 0:x.error,groups:null!==(t=null==x?void 0:x.groups)&&void 0!==t?t:[],personalCount:null!==(r=null==x?void 0:x.personalCount)&&void 0!==r?r:0,selections:null!==(s=null==x?void 0:x.selections)&&void 0!==s?s:{},includePersonal:null!==(l=null==x?void 0:x.includePersonal)&&void 0!==l&&l,ready:!i||!!(x&&!x.error&&x.groups.every(e=>e.exams.length<2||x.selections[e.key])),select:(e,t)=>c(r=>(null==r?void 0:r.key)===i?{...r,selections:{...r.selections,[e]:t}}:r),togglePersonal:e=>c(t=>(null==t?void 0:t.key)===i?{...t,includePersonal:e}:t),retry:()=>{c(null),u(e=>e+1)}}}function i(e){let{choice:t,disabled:r=!1,deletion:n=!1}=e,l=(0,a.useId)();if(!t.active)return null;if(t.loading)return(0,s.jsx)("p",{role:"status",className:"py-2 text-sm text-zinc-600 dark:text-zinc-300",children:"시험 목록 확인 중…"});if(t.error)return(0,s.jsxs)("div",{role:"alert",className:"py-2 text-sm text-red-700 dark:text-red-300",children:[t.error," ",(0,s.jsx)("button",{type:"button",onClick:t.retry,disabled:r,className:"underline underline-offset-4 focus-visible:outline focus-visible:outline-2",children:"다시 시도"})]});let i=t.groups.filter(e=>e.exams.length>1);return i.length||n&&t.groups.length&&t.personalCount?(0,s.jsxs)("div",{className:"space-y-3 py-2",children:[i.length>0&&(0,s.jsxs)("p",{className:"text-sm text-zinc-600 dark:text-zinc-300",children:["같은 달에 시험이 여러 개 있습니다. ",n?"삭제할":"파일에 해당하는"," 시험을 선택해 주세요."]}),i.map((e,a)=>{var n;return(0,s.jsxs)("div",{children:[(0,s.jsxs)("label",{htmlFor:"".concat(l,"-").concat(a),className:"mb-1 block text-sm font-medium text-zinc-900 dark:text-zinc-100",children:[e.schoolName," \xb7 ",e.grade,"학년"]}),(0,s.jsxs)("select",{id:"".concat(l,"-").concat(a),value:null!==(n=t.selections[e.key])&&void 0!==n?n:"",disabled:r,onChange:r=>t.select(e.key,r.target.value),className:"w-full rounded-lg border border-zinc-300 bg-white px-3 py-2 text-sm text-zinc-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-blue-600 dar
1k:border-zinc-600 dark:bg-zinc-900 dark:text-zinc-100",children:[(0,s.jsx)("option",{value:"",children:"시험 선택"}),e.exams.map(e=>(0,s.jsx)("option",{value:e.id,children:e.label},e.id))]})]},e.key)}),n&&t.groups.length>0&&t.personalCount>0&&(0,s.jsxs)("label",{className:"flex items-start gap-2 text-sm text-zinc-700 dark:text-zinc-200",children:[(0,s.jsx)("input",{type:"checkbox",checked:t.includePersonal,disabled:r,onChange:e=>t.togglePersonal(e.target.checked),className:"mt-1 accent-blue-600"}),"학교에 연결하지 않은 개인 학생의 같은 달 성적도 삭제 (",t.personalCount,"건)"]})]}):null}var d=r(90982),c=r(78529),o=r(10136),u=r(41905),x=r(45675),m=r(30401),h=r(18930),p=r(48736),f=r(55900),b=r(37806),g=r(99397),v=r(32489),j=r(92735),N=r(76858),k=r(76865),y=r(59717),w=r(66109),z=r(88507),C=r(93448),E=r(4908),I=r(73369),S=r(83008),D=r(53834),F=r(45007),A=r(67920),_=r(27526),L=r(93202);r(83079);var P=r(12119),Z=(0,P.$)("1e17e29b0cdb1025b4b181a66c2946236226e00d"),B=(0,P.$)("16ec8a38244286f86515499ce5645f62ae04b383"),R=r(60706),M=r(98319),O=r(73348),T=r(7888),W=r(74791);function $(e){return e?"bg-[#EAEAEA] dark:bg-[#27272a] text-zinc-900 dark:text-white":"text-[#a1a1aa] hover:bg-[#EAEAEA]/50 dark:hover:bg-[#27272a]/50 hover:text-zinc-900 dark:hover:text-white"}function q(e){return(0,C.cn)("text-sm transition-colors file-upload-class-count text-zinc-500 dark:text-[#71717a]",!e&&"group-hover:text-zinc-900 dark:group-hover:text-white")}let U=e=>{let{cls:t,isActive:r,isEditing:a,count:n,editClassInput:l,setEditClassInput:i,setEditingClass:d,handleRenameClass:c,onClick:o}=e,m=(0,y.o)();return a?(0,s.jsx)(w.e,{value:t,dragListener:!1,children:(0,s.jsx)("form",{onSubmit:c,className:"px-1 py-1",children:(0,s.jsx)("input",{autoFocus:!0,value:l,onChange:e=>i(e.target.value),placeholder:"반 이름 입력 후 Enter",className:"w-full px-2 py-1.5 text-sm bg-black/20 border border-[#3f3f46] rounded focus:outline-none focus:border-blue-500 text-white",onBlur:()=>{l.trim()&&l.trim()!==t||d(null)},onKeyDown:e=>{"Escape"===e.key&&d(null)}})})},t):(0,s.jsxs)(w.e,{value:t,dragListener:!1,dragControls:m,layout:!0,transition:{type:"spring",stiffness:400,damping:30},className:(0,C.cn)("w-full flex items-center justify-between pl-2 pr-3 py-2.5 rounded-lg text-sm font-normal transition-colors group cursor-pointer select-none",$(r)),onClick:o,children:[(0,s.jsxs)("div",{className:"flex items-center gap-1 min-w-0",children:[(0,s.jsx)("div",{className:"cursor-grab active:cursor-grabbing text-zinc-400 hover:text-zinc-700 dark:text-zinc-500 dark:hover:text-white transition-colors drag-handle shrink-0",onPointerDown:e=>{m.start(e)},children:(0,s.jsx)(u.Z,{size:14})}),(0,s.jsx)("span",{className:"truncate flex-1 min-w-0",children:t})]}),(0,s.jsxs)("div",{className:"flex items-center gap-1.5 shrink-0",children:[(0,s.jsx)("button",{"aria-label":"수정",onClick:e=>{e.stopPropagation(),d(t),i(t)}
1,className:"p-1 opacity-100 [@media(hover:hover)]:opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 hover:bg-white/10 rounded transition",children:(0,s.jsx)(x.Z,{size:12})}),(0,s.jsxs)("span",{className:q(r),children:[n,"명"]})]})]},t)};function X(e){var t,u,x,y,w;let{onClose:P,minimal:X=!1,activeTabOverride:G,initialGradeFileType:V,hidePrimarySidebar:K=!1,studentId:J,autoAddClass:Y=!1}=e,[H,Q]=(0,a.useState)("student-list");(0,a.useEffect)(()=>{G&&Q(G)},[G]);let{isLoading:ee,error:et,classes:er,students:es,addClass:ea,removeClass:en,renameClass:el,reloadStudents:ei,updateClassOrder:ed}=(0,E.AF)(),{showToast:ec}=(0,M.pm)(),eo=(0,A.XC)(),eu=(0,o.N)(),[ex,em]=(0,a.useState)("담임 학급"),[eh,ep]=(0,a.useState)(Y),[ef,eb]=(0,a.useState)(""),[eg,ev]=(0,a.useState)(null),[ej,eN]=(0,a.useState)(""),[ek,ey]=(0,a.useState)([]),ew=(0,a.useRef)();(0,a.useEffect)(()=>{ey(er.filter(e=>"담임 학급"!==e))},[er]);let[ez,eC]=(0,a.useState)([]),[eE,eI]=(0,a.useState)(!1),[eS,eD]=(0,a.useState)(null),[eF,eA]=(0,a.useState)(!1),[e_,eL]=(0,a.useState)(!1),[eP,eZ]=(0,a.useState)(!1),[eB,eR]=(0,a.useState)(null),[eM,eO]=(0,a.useState)(!1),[eT,eW]=(0,a.useState)(!1),[e$,eq]=(0,a.useState)(!1),[eU,eX]=(0,a.useState)(!1),eG=(0,a.useRef)(null),[eV,eK]=(0,a.useState)([]),[eJ,eY]=(0,a.useState)(null),eH=(0,a.useRef)(null),eQ=(0,a.useRef)(null),e0=(0,a.useRef)(null),e1=(0,a.useRef)(null),[e2,e5]=(0,a.useState)(V||"school"),[e3,e4]=(0,a.useState)(null),[e7,e9]=(0,a.useState)([]),[e6,e8]=(0,a.useState)(null),[te,tt]=(0,a.useState)(null),[tr,ts]=(0,a.useState)(null),[ta,tn]=(0,a.useState)(!1),tl=null==e3?void 0:null===(t=e3.meta.test_date)||void 0===t?void 0:t.split("-").map(Number),ti=l(tl&&3===tl.length?{purpose:"upload",year:tl[0],month:tl[1],...(null==e3?void 0:e3.meta.grade)?{grade:e3.meta.grade}:{},...(null==e3?void 0:e3.meta.class_no)?{classNum:e3.meta.class_no}:{}}:null),td=l(tr&&""!==tr.year&&""!==tr.month?{purpose:"delete",year:tr.year,month:tr.month}:null),[tc,to]=(0,a.useState)(null),[tu,tx]=(0,a.useState)(null),{data:tm}=(0,_.kP)();a.useMemo(()=>{var e;return null!=tm&&!!tm.user&&(!!tm.user.isSystemAdmin||["OWNER","SCHOOL_ADMIN","GRADE_ADMIN"].includes((null===(e=tm.user.role)||void 0===e?void 0:e.toUpperCase())||""))},[tm]);let{uploadLifeRecord:th}=(0,L.l)(),tp=(e,t)=>{let r=(Number(e.grade)||0)-(Number(t.grade)||0);if(0!==r)return r;let s=(Number(e.classNum)||0)-(Number(t.classNum)||0);return 0!==s?s:(Number(e.number)||0)-(Number(t.number)||0)},{createStudent:tf,updateStudent:tb,deleteStudent:tg,bulkCreateStudents:tv,clearClassStudents:tj}=(0,I.N)(),tN=async(e,t)=>{eL(!0);let r=0,s=0,a=[],n=[],l=[];try{if(t.length>0&&(await Promise.allSettled(t.map(e=>tb.mutateAsync({id:e.id,...e.data})))).forEach((e,n)=>{if("fulfilled"===e.status)r++;else{var i;s++;let r=t[n];l.push(r),a.push("".concat((null===(i=r.data)||void 0===i?void 0:i.name)||r.id,": ").concat(e.reason instanceof Error?e.reason.message:"수정 실패"))}}),e.length>0)try{let t=await tv.mutateAsync({students:e});r+=t.count||0,s+=t.failureCount||0,t.results&&t.results.forEach((t,r)=>{if(!t.success){var s;a.push("".concat(t.student||(null===(s=e[r])||void 0===s?void 0:s.name),": ").concat(t.error||"등록 실패")),e[r]&&n.push(e[r])}})}catch(t){console.error(t),s+=e.length,n.push(...e),e.forEach(e=>a.push("".concat(e.name,": 일괄 등록 실패. 다시 처리해 주세요.")))}s>0?(eC([...n,...l.map(e=>({...e.data,id:e.id}))]),eD({success:r,errors:a})):(eI(!0),eD({success:r,errors:[]})),eW(s>0),eq(s>0),eX(s>0),await ei(),0===s?ec("학생 ".concat(r,"명을 반영했습니다."),"success"):ec("성공 ".concat(r,"명, 실패 ").concat(s,"명. 처리 결과에서 실패 내역을 확인해 주세요."),"error")}catch(e){console.error("Batch execution error:",e),ec("작업 중 오류가 발생했습니다.","error")}finally{eL(!1)}},tk=async()=>{if(0===ez.length)return;eL(!0);let e=[...ez].sort(tp);eC(e);try{let t=es.filter(e=>{var t;return e.homeClassId===ex||(null===(t=e.customClassIds)||void 0===t?void 0:t.includes(ex))}),r=[],s=[];e.forEach(e=>{let a=t.find(t=>t.number===e.number);if(a){var n;let t=null!==(n=a.homeClassId)&&void 0!==n?n:null,r=a.customClassIds||[],l=t,i=[...r];"담임 학급"===ex?(t&&"담임 학급"!==t&&(i=Array.from(new Set([...i,t]))),l="담임 학급"):t===ex||i.includes(ex)||(i=Array.from(new Set([...i,ex]))),i=i.filter(e=>e&&e!==l);let d={number:e.number,name:e.name,homeClassId:l,customClassIds:i,grade:e.grade||(null==a?void 0:a.grade)||1,classNum:e.classNum||(null==a?void 0:a.classNum),memo:e.memo||(null==a?void 0:a.memo),previousStudentId:void 0};s.push({id:a.id,data:d})}else r.push({number:e.number,name:e.name,homeClassId:ex,customClassIds:[],grade:e.grade||1,classNum:e.classNum,memo:e.memo,previousStudentId:void 0})}),await tN(r,s)}
1catch(e){console.error("Upload error:",e),ec("업로드 중 오류가 발생했습니다.","error"),eL(!1)}};(0,a.useEffect)(()=>{V&&e5(V)},[V]);let ty=async()=>{if(eB&&!e_){eL(!0);try{await en(eB),em("담임 학급"),eC([]),eq(!1),eX(!1),eR(null)}catch(e){ec("교실을 삭제하지 못했습니다. 다시 시도해 주세요.","error")}finally{eL(!1)}}},tw=async()=>{eL(!0);try{await tj.mutateAsync({homeClassId:ex}),eC([]),await ei(),ec("학생 명단을 모두 삭제했습니다.","success")}catch(e){console.error("Delete all error:",e),ec("삭제 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.","error")}finally{eL(!1),eZ(!1)}},tz=async e=>{if(e.preventDefault(),eg&&ej.trim()){if(ej.trim()===eg){ev(null);return}await el(eg,ej.trim()),ex===eg&&em(ej.trim()),eq(!1),eX(!1),ev(null),eN("")}};(0,a.useEffect)(()=>{eE&&!e_&&(eC(es.filter(e=>{var t;return e.homeClassId===ex||(null===(t=e.customClassIds)||void 0===t?void 0:t.includes(ex))}).map(e=>({...e,isValid:!0})).sort(tp)),eI(!1))},[eE,e_,es,ex]),(0,a.useEffect)(()=>{if(!eU&&es.length>0&&0===ez.length){let e=es.filter(e=>{var t;return e.homeClassId===ex||(null===(t=e.customClassIds)||void 0===t?void 0:t.includes(ex))}).map(e=>({...e,isValid:!0})).sort(tp);e.length>0&&eC(e)}},[es,ex,ez.length,eU]);let tC=async e=>{eO(!0);try{await new Promise(e=>setTimeout(e,1500));let t=await e.arrayBuffer(),{parseGradeExcel:s}=await Promise.all([r.e(1425),r.e(4635)]).then(r.bind(r,73947)),a=await s(t);if(!a.parsedData||0===a.parsedData.length){ec("파싱된 성적 데이터가 없습니다. 파일 형식을 확인해주세요.","error");return}let n=new Map;a.parsedData.forEach(e=>{let{studentNumber:t,studentName:r,currentGrade:s,currentClass:a}=e;n.has(t)||n.set(t,{studentNumber:t,studentName:r,studentId:void 0,currentGrade:s,currentClass:a,grades:[]}),n.get(t).grades.push({...e,classRank:null,percentile:null})});let l=[];n.forEach(e=>{let t=e.studentName.replace(/\s/g,""),r=e.studentNumber>100?e.studentNumber%100:e.studentNumber,s=es.find(s=>{let a=s.name.replace(/\s/g,""),n=s.number;if((n===e.studentNumber||n===r)&&a===t){let t=e.currentGrade,r=e.currentClass;return t>0&&r>0&&s.grade===t&&s.classNum,!0}return!1});l.push({...e,studentId:null==s?void 0:s.id})}),l.sort((e,t)=>e.studentNumber-t.studentNumber);let i=l.reduce((e,t)=>e+t.grades.length,0);eK(l),eY({gradeClass:a.gradeClass||"알 수 없음",totalRecords:i})}catch(e){console.error("Grade file parsing error:",e),ec((0,T.q)(e,"성적 파일을 분석하는 중 오류가 발생했습니다. 파일 형식을 확인해 주세요."),"error")}finally{eO(!1)}},tE=async e=>{eO(!0);try{await new Promise(e=>setTimeout(e,1500));let t=await e.arrayBuffer(),{parseMidtermExcel:s}=await Promise.all([r.e(1425),r.e(8588)]).then(r.bind(r,44004)),a=await s(t);if(!a.gradeData||0===a.gradeData.length){ec("중간고사 데이터를 찾지 못했습니다. 파일 형식을 확인해 주세요.","warning");return}let n=new Map;a.gradeData.forEach(e=>{let t="".concat(e.currentClass,"-").concat(e.studentNumber);n.has(t)||n.set(t,{studentNumber:e.studentNumber,studentName:e.studentName,studentId:void 0,currentGrade:e.currentGrade,currentClass:e.currentClass,grades:[]}),n.get(t).grades.push({...e,classRank:null,percentile:e.percentile||null})});let l=es.filter(e=>"담임 학급"===e.homeClassId),i=[];n.forEach(e=>{let t=e.studentName.replace(/\s/g,""),r=l.find(r=>r.name.replace(/\s/g,"")===t&&r.classNum===e.currentClass&&r.number===e.studentNumber);i.push({...e,studentId:null==r?void 0:r.id})}),i.sort((e,t)=>e.studentId&&!t.studentId?-1:!e.studentId&&t.studentId?1:e.currentClass-t.currentClass||e.studentNumber-t.studentNumber),i.filter(e=>e.studentId).length;let d=i.filter(e=>e.studentId).reduce((e,t)=>e+t.grades.length,0);e9(i),e8({gradeClass:"".concat(a.grade,"학년 전체"),totalRecords:d,totalStudents:a.students.length})}catch(e){console.error("Midterm file parsing error:",e),ec((0,T.q)(e,"파일을 분석하는 중 오류가 발생했습니다. 파일 형식을 확인해 주세요."),"error")}finally{eO(!1)}},tI=async()=>{if(0!==e7.length){eL(!0);try{let e=e7.filter(e=>e.studentId),t=e.flatMap(e=>e.grades),r=await B(t);r.success?(ec("중간고사 성적 ".concat(e.length,"명분을 저장했습니다. ").concat(r.message),"success"),e9([]),e8(null)):ec("저장 실패: ".concat(r.error),"error")}catch(e){console.error("Midterm upload error:",e),ec("저장 중 오류가 발생했습니다.","error")}finally{eL(!1)}}},tS=async e=>{e4(null),eO(!0);try{let t=e.name.toLowerCase();if(t.endsWith(".xlsx")||t.endsWith(".xls")){let t=await e.arrayBuffer(),s=await Promise.all([r.e(1425),r.e(6919)]).then(r.bind(r,2093)),a=s.read(t,{type:"array"}),n=a.Sheets[a.SheetNames[0]],l=s.utils.sheet_to_json(n,{header:1,defval:""});for(let e=0;e<Math.min(10,l.length);e++){let t=(l[e]||[]).join(" ").trim();if(t.includes("교과학습발달상황"))throw Error("내신 성적 파일로 보입니다. '모의고사' 대신 '내신 성적' 탭에서 업로드해주세요.");if(t.includes("전과목 성적 일람표"))throw Error("중간고사 성적 일람표로 보입니다. '모의고사' 대신 '중간고사 성적' 탭에서 업로드해주세요.")}throw Error("모의고사 탭은 PDF 파일만 업로드 가능합니다.")}await new Promise(e=>setTimeout(e,1500));let s=new FormData;s.append("file",e);let a=await (0,n.Od)(s);a.success&&a.data?e4(a.data):ec(a.error||"파일 분석에 실패했습니다.","error")}catch(e){console.error("Mock exam PDF processing error:",e),ec((0,T.q)(e,"파일ì
1„ 분석하는 중 오류가 발생했습니다. 파일 형식을 확인해 주세요."),"error")}finally{eO(!1)}},tD=async e=>{eO(!0);try{await new Promise(e=>setTimeout(e,300)),await tF(e)}finally{eO(!1)}},tF=async function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=e||(null==tc?void 0:tc.file);if(!r)return;let s=J||(null==tc?void 0:tc.studentId);if(s&&J&&!t){let e=es.find(e=>e.id===s);if(e)try{var a,n,l,i,d,c;let t=await new Promise((e,t)=>{let s=new FileReader;s.onload=()=>e(s.result.split(",")[1]),s.onerror=t,s.readAsDataURL(r)}),s=await (0,S.X)("checkLifeRecordStudentName",{fileBase64:t},eo),o=null==s?void 0:null===(a=s.data)||void 0===a?void 0:a.name,u=null==s?void 0:null===(n=s.data)||void 0===n?void 0:n.number,x=null!==(i=null==o?void 0:o.normalize("NFC").trim())&&void 0!==i?i:null,m=null!==(d=null===(l=e.name)||void 0===l?void 0:l.normalize("NFC").trim())&&void 0!==d?d:"",h=x&&x===m&&null!==u&&null!==e.number&&u!==e.number;if(x&&x!==m||h){tx({extractedName:o,extractedNumber:u,selectedStudentName:e.name,selectedStudentNumber:null!==(c=e.number)&&void 0!==c?c:null,file:r});return}}catch(e){}}eL(!0);try{await th({file:r,studentId:s,onSuccess:e=>{var t;let r=(null==e?void 0:e.matchedNames)||[];r.length>0&&(null===(t=es.find(e=>r.includes(e.name)))||void 0===t||t.id),P&&P()}}),to(null)}catch(e){console.error("Record upload error:",e)}finally{eL(!1)}},tA=async()=>{if(e3&&ti.ready){eL(!0);try{let e=await (0,n.Y6)(e3,ti.selections);e.success?(ec("모의고사 성적 ".concat(e3.students.length,"명분을 저장했습니다."),"success"),e4(null)):ec(e.error||"성적 저장에 실패했습니다.","error")}catch(e){console.error("Mock exam upload error:",e),ec((0,T.q)(e,"모의고사 성적을 저장하는 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요."),"error")}finally{eL(!1)}}},t_=async()=>{if(te&&""!==te.gradeLevel&&""!==te.semester){tn(!0);try{var e,t;let r=await (0,S.X)("deleteGradeRecordsBulk",{gradeLevel:te.gradeLevel,semester:te.semester,examType:te.examType},eo);if(!r.success){ec(r.error||"삭제 중 오류가 발생했습니다.","error");return}let s=null!==(t=null===(e=r.data)||void 0===e?void 0:e.deletedCount)&&void 0!==t?t:0;ec(s>0?"".concat(s,"ê±´ 삭제되었습니다."):"삭제할 성적이 없습니다.",s>0?"success":"info"),tt(null)}catch(e){console.error("Bulk delete grades error:",e),ec("삭제 중 오류가 발생했습니다.","error")}finally{tn(!1)}}},tL=async()=>{if(tr&&""!==tr.year&&""!==tr.month&&td.ready){tn(!0);try{var e;let t=await (0,n.ln)(tr.year,tr.month,td.selections,td.includePersonal);if(!t.success){ec(t.error||"삭제 중 오류가 발생했습니다.","error");return}let r=null!==(e=t.deletedCount)&&void 0!==e?e:0;ec(r>0?"".concat(r,"ê±´ 삭제되었습니다."):"삭제할 성적이 없습니다.",r>0?"success":"info"),ts(null)}catch(e){console.error("Bulk delete mock exams error:",e),ec("삭제 중 오류가 발생했습니다.","error")}finally{tn(!1)}}},tP=async()=>{if(0!==eV.length){eL(!0);try{let e=eV.flatMap(e=>e.grades),t=(null==eJ?void 0:eJ.gradeClass)||"",r=await Z(e,t,"school"===e2?"final":"mock");r.success?(ec(r.message||"성적 저장이 완료되었습니다.","success"),eK([]),eY(null)):ec(r.error||"성적 저장에 실패했습니다.","error")}catch(e){console.error("Grade upload error:",e),ec((0,T.q)(e,"성적을 저장하는 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요."),"error")}finally{eL(!1)}}},tZ=async e=>{eO(!0),await new Promise(e=>setTimeout(e,1500));try{let t=(await (0,W.DX)(e)).map(e=>({number:e.number,name:e.name,memo:e.memo,grade:e.grade,classNum:e.classNum,homeClassId:ex,customClassIds:[],isValid:!0})).sort(tp);eC(t),eW(!1),eq(!0),eX(!1)}catch(e){console.error(e),ec("파일을 분석하는 중 오류가 발생했습니다.","error")}finally{eO(!1)}},tB=(0,a.useCallback)(e=>{e.preventDefault(),eA(!1);let t=e.dataTransfer.files[0];t&&tZ(t)},[tZ]),tR=(e,t,r)=>{eC(s=>{let a=[...s];return a[e]={...a[e],[t]:r},a}),eW(!0)},tM=async e=>{let t=ez[e];if(!t.name||!t.number){ec("이름과 번호는 반드시 입력해야 합니다.","warning");return}try{let s=t.homeClassId||ex,a={number:t.number,name:t.name,homeClassId:s,customClassIds:[],grade:t.grade||1,classNum:t.classNum||void 0,memo:t.memo};if(t.id)await tb.mutateAsync({id:t.id,...a}
1),ec("학생 정보가 수정되었습니다.","success");else{let t=await tf.mutateAsync(a);if(t.success){var r;let s=(null===(r=t.data)||void 0===r?void 0:r.id)||t.id;s&&eC(t=>{let r=[...t];return r[e]={...r[e],id:s},r}),ec("학생이 등록되었습니다.","success")}}eW(!1)}catch(e){console.error("Save error:",e),ec("저장 중 오류가 발생했습니다.","error")}},tO=async e=>{var t,r;let s=ez[e];if(!(null==s?void 0:s.id)){eC(t=>t.filter((t,r)=>r!==e));return}let a=es.find(e=>e.id===s.id),n=null!==(t=null==a?void 0:a.homeClassId)&&void 0!==t?t:null,l=null!==(r=null==a?void 0:a.customClassIds)&&void 0!==r?r:[],i=0===Array.from(new Set([n,...l].filter(e=>!!e))).filter(e=>e!==ex).length;if(await eu(i?{title:"".concat(s.name," 학생을 삭제할까요?"),description:"개인 명단과 이 학생의 개인 기록을 삭제합니다. 학교 협업에 공유한 학생 명단\xb7자료는 유지됩니다.",consequences:["성적 기록","출결 기록","상담 일지","세특\xb7행동특성","활동 기록","설문 응답"]}:{title:"'".concat(ex,"' 학급에서 ").concat(s.name," 학생을 뺄까요?"),description:"다른 학급 소속은 그대로 유지됩니다.",confirmLabel:"학급에서 빼기",tone:"default"}))try{i?await tg.mutateAsync(s.id):await tb.mutateAsync({id:s.id,homeClassId:n===ex?null:n,customClassIds:l.filter(e=>e!==ex)}),eC(t=>t.filter((t,r)=>r!==e)),await ei(),ec("학급에서 제거되었습니다.","success")}catch(e){console.error("Delete error:",e),ec((0,T.q)(e,"삭제하는 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요."),"error")}};return ee&&0===es.length?(0,s.jsx)(d.ContentLoadingState,{variant:"table",label:"학생 명단을 불러오고 있어요"}):et&&0===es.length?(0,s.jsx)(c.A,{message:"학생 명단을 불러오지 못했어요.",onRetry:()=>void ei()}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:(0,C.cn)("w-full h-full bg-[#F7F7F5] [.dark_&]:bg-[#18181b] flex overflow-hidden",X&&"items-center justify-center p-8"),children:[(0,s.jsx)("input",{type:"file",ref:eG,accept:".xlsx,.xls,.csv",className:"hidden",onChange:e=>{var t;let r=null===(t=e.target.files)||void 0===t?void 0:t[0];r&&tZ(r),e.target.value=""}}),!X&&!K&&(0,s.jsxs)("div",{className:"w-[240px] bg-[#F7F7F5] [.dark_&]:bg-[#18181b] border-r border-zinc-200 dark:border-[#27272a] flex flex-col shrink-0",children:[(0,s.jsx)("div",{className:"p-4 shrink-0",children:(0,s.jsx)("h2",{className:"text-[15px] font-bold text-white",children:"파일 업로드"})}),(0,s.jsxs)("div",{className:"px-2 flex flex-col gap-2",children:[(0,s.jsxs)("button",{onClick:()=>{Q("student-list"),eC([]),eq(!1),eX(!1)},className:(0,C.cn)("flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition text-left",$("student-list"===H)),children:[(0,s.jsx)(p.Z,{size:18}),"학생 명단"]}),(0,s.jsxs)("button",{onClick:()=>{Q("grade-file"),eC([]),eq(!1),eX(!1)},className:(0,C.cn)("flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition text-left",$("grade-file"===H)),children:[(0,s.jsx)(f.Z,{size:18}),"성적 파일"]})]})]}),!X&&"student-list"===H&&(0,s.jsxs)("div",{className:"w-[240px] bg-[#F7F7F5] [.dark_&]:bg-[#18181b] border-r border-zinc-200 dark:border-[#27272a] flex flex-col shrink-0 animate-in slide-in-from-left-5 duration-200",children:[(0,s.jsx)("div",{className:"p-4 flex items-center justify-between shrink-0",children:(0,s.jsxs)("h2",{className:"text-[15px] font-medium text-white flex items-center gap-2",children:[(0,s.jsx)(b.Z,{size:18}),"나의 교실"]})}),(0,s.jsxs)("div",{className:"flex-1 overflow-y-auto px-2 flex flex-col custom-scrollbar",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 mb-2 px-1",children:[(0,s.jsx)("p",{className:"text-[11px] font-medium text-zinc-400 dark:text-zinc-500 uppercase tracking-wide whitespace-nowrap",children:"담임 학급"}),(0,s.jsx)("div",{className:"flex-1 h-px bg-zinc-200 dark:bg-[#3f3f46]"})]}),er.filter(e=>"담임 학급"===e).map(e=>{let t=es.filter(t=>{var r;return t.homeClassId===e||(null===(r=t.customClassIds)||void 0===r?void 0:r.includes(e))}).length,r=ex===e;return(0,s.jsxs)("div",{className:(0,C.cn)("w-full flex items-center justify-between px-3 py-2.5 rounded-lg text-sm font-normal transition group cursor-pointer",$(r)),onClick:()=>{em(e),eq(!1),eX(!1),eC(es.filter(t=>{var r;return t.homeClassId===e||(null===(r=t.customClassIds)||void 0===r?void 0:r.includes(e))}).map(e=>({...e,isValid:!0})).sort(tp))},children:[(0,s.jsx)("span",{className:"truncate",children:e}),(0,s.jsxs)("span",{className:q(r),children:[t,"명"]})]},e)}),(0,s.jsxs)("div",{className:"flex items-center gap-2 my-2 px-1",children:[(0,s.jsx)("p",{className:"text-[11px] font-medium text-zinc-400 dark:text-zinc-500 uppercase tracking-wide whitespace-nowrap",children:"교과 학급"}),(0,s.jsx)("div",{className:"flex-1 h-px bg-zinc-200 dark:bg-[#3f3f46]"})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,s.jsx)(z.M,{axis:"y",values:ek,onReorder:e=>{ey(e),ew.current&&clearTimeout(ew.current),ew.current=setTimeout(async()=>{try{await ed(e)}catch(e){console.error("Failed to update class order",e),ec("순서 변경에 실패했습니다.","error")}},500)},className:"flex flex-col gap-1",children:ek.map(e=>{let t=es.filter(t=>{var r;return t.homeClassId===e||(null===(r=t.customClassIds)||void 0===r?void 0:r.includes(e))}).length,r=ex===e,a=eg===e;return(0,s.jsx)(U,{cls:e,isActive:r,isEditing:a,count:t,editClassInput:ej,setEditClassInput:eN,setEditingClass:ev,handleRenameClass:tz,onClick:()=>{em(e),eq(!1),eX(!1),eC(es.filter(t=>{var r;return t.homeClassId===e||(null===(r=t.customClassIds)||void 0===r?void 0:r.includes(e))}).map(e=>({...e,isValid:!0})).sort(tp))}},e)})}),eh?(0,s.jsx)("form",{onSubmit:e=>{e.preventDefault(),ef.trim()&&(ea(ef.trim()),em(ef.trim()),eC([]),eq(!1),eX(!1),eb(""),ep(!1))},className:"px-1 py-1",children:(0,s.jsx)("input",{autoFocus:!0,value:ef,onChange:e=>eb(e.target.value),placeholder:"반 이름 입력 후 Enter",className:"w-full px-2 py-1.5 text-sm bg-black/20 border border-[#3f3f46] rounded focus:outline-none focus:border-blue-500 text-white",onBlur:()=>!ef&&ep(!1)})}):(0,s.jsx)("div",{className:"px-1 py-1 mt-1",children:(0,s.jsxs)("button",{onClick:()=>ep(!0),className:"flex items-center justify-center gap-2 w-full py-2 rounded-full border border-dashed border-zinc-300 dark:border-[#3f3f46] text-zinc-500 dark:text-[#a1a1aa] hover:text-zinc-900 dark:hover:text-white hover:border-zinc-400 dark:hover:border-[#52525b] hover:bg-zinc-100 dark:hover:bg-[#202023] transition text-[13px] font-medium",children:[(0,s.jsx)(g.Z,{size:14}),(0,s.jsx)("span",{children:"교과 학급 추가"})]})})]})]})]}),!X&&"grade-file"===H&&(0,s.jsxs)("div",{className:"w-[240px] bg-[#F7F7F5] [.dark_&]:bg-[#18181b] border-r border-zinc-200 dark:border-[#27272a] flex flex-col shrink-0 animate-in slide-in-from-left-5 duration-200",children:[(0,s.jsx)("div",{className:"p-4 flex items-center justify-between shrink-0",children:(0,s.jsx)("h2",{className:"text-[15px] font-medium text-white flex items-center gap-2",children:"성적 종류(고등학교 전용)"})}),(0,s.jsxs)("div",{className:"flex-1 overflow-y-auto px-2 flex flex-col gap-2 custom-scrollbar",children:[(0,s.jsx)("button",{onClick:()=>e5("school"),className:(0,C.cn)("w-full flex items-center justify-between px-3 py-2.5 rounded-lg text-sm font-normal transition group",$("school"===e2)),children:(0,s.jsx)("span",{className:"truncate",children:"내신 성적"})}),(0,s.jsx)("button",{onClick:()=>e5("mock"),className:(0,C.cn)("w-full flex items-center justify-between px-3 py-2.5 rounded-lg text-sm font-normal transition group",$("mock"===e2)),children:(0,s.jsx)("span",{className:"truncate",children:"모의고사 성적"})}),(0,s.jsx)("button",{onClick:()=>e5("midterm"),className:(0,C.cn)("w-full flex items-center justify-between px-3 py-2.5 rounded-lg text-sm font-normal transition group",$("midterm"===e2)),children:(0,s.jsx)("span",{className:"truncate",children:"중간고사 성적"})}),(0,s.jsx)("button",{onClick:()=>e5("record"),className:(0,C.cn)("w-full flex items-center justify-between px-3 py-2.5 rounded-lg text-sm font-normal transition group",$("record"===e2)),children:(0,s.jsx)("span",{className:"truncate",children:"생활기록부"})})]})]}),(0,s.jsxs)("div",{className:(0,C.cn)("flex-1 flex flex-col relative bg-[#F7F7F5] [.dark_&]:bg-[#18181b] overflow-hidden",X&&"w-full  max-w-2xl h-[600px] border border-[#27272a] rounded-2xl flex-none shadow-2xl"),children:[P&&(0,s.jsx)("button",{"aria-label":"닫기",onClick:P,className:"absolute top-4 right-4 p-1.5 text-[#a1a1aa] hover:text-white hover:bg-[#
1EBEBEA] [.dark_&]:hover:bg-[#202023] rounded-lg transition-colors z-10",children:(0,s.jsx)(v.Z,{size:16})}),"student-list"===H&&(0,s.jsxs)("div",{className:"absolute top-4 right-14 flex items-center gap-2 z-10",children:[e$&&ez.length>0&&(0,s.jsx)("button",{onClick:()=>{eC([]),eW(!1),eq(!1),eX(!0),eG.current&&(eG.current.value="")},disabled:e_,className:"px-3 py-1.5 text-xs text-zinc-500 dark:text-white/50 hover:text-zinc-900 dark:hover:text-white transition-colors disabled:opacity-50 disabled:cursor-not-allowed",children:"취소"}),ez.length>0&&(eT||ez.some(e=>!e.id))&&(0,s.jsxs)("button",{onClick:tk,disabled:e_,className:"px-3 py-1.5 text-xs text-white bg-blue-600 hover:bg-blue-700 rounded-md transition-colors font-medium flex items-center gap-1.5 disabled:opacity-50 global-save-btn",children:[(0,s.jsx)(m.Z,{size:12}),(0,s.jsx)("span",{children:e_?(0,s.jsx)(D.W,{size:18,className:"text-white"}):"전체 저장"})]}),0===ez.length&&(0,s.jsxs)("button",{onClick:W.RM,className:"flex items-center gap-1.5 px-2 py-1.5 text-xs !text-white bg-green-600 hover:bg-green-700 rounded-md transition-colors font-medium",children:[(0,s.jsx)(j.Z,{size:13}),"양식 다운로드"]}),"담임 학급"!==ex&&(0===ez.length||(null===(u=ez[0])||void 0===u?void 0:u.id))&&(0,s.jsxs)("button",{onClick:()=>{"담임 학급"!==ex&&eR(ex)},className:"px-2 py-1.5 text-xs text-white bg-red-600 hover:bg-red-700 rounded-md transition-colors font-medium flex items-center gap-1.5 delete-class-btn",children:[(0,s.jsx)("span",{children:"교실 삭제"}),(0,s.jsx)(h.Z,{size:12})]}),"담임 학급"===ex&&ez.length>0&&(null===(x=ez[0])||void 0===x?void 0:x.id)&&(0,s.jsxs)("button",{onClick:()=>eZ(!0),className:"px-2 py-1.5 text-xs text-white bg-red-600 hover:bg-red-700 rounded-md transition-colors font-medium flex items-center gap-1.5 delete-all-btn",children:[(0,s.jsx)("span",{children:e_?(0,s.jsx)(D.W,{size:18,className:"text-white"}):"전체 삭제"}),!e_&&(0,s.jsx)(h.Z,{size:12})]})]}),"grade-file"===H&&"school"===e2&&(0,s.jsxs)("div",{className:"absolute top-4 right-14 flex items-center gap-2 z-10",children:[(0,s.jsxs)("button",{onClick:()=>tt({examType:"final",gradeLevel:"",semester:""}),className:"px-3 py-1.5 text-xs text-red-500 hover:text-red-600 dark:text-red-400 dark:hover:text-red-300 transition-colors flex items-center gap-1.5",children:[(0,s.jsx)(h.Z,{size:12}),"이전 성적 삭제"]}),eV.length>0&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("button",{onClick:()=>{eK([]),eY(null)},className:"px-3 py-1.5 text-xs text-zinc-500 dark:text-white/50 hover:text-zinc-900 dark:hover:text-white transition-colors",children:"취소"}),(0,s.jsxs)("button",{onClick:tP,disabled:e_,className:"px-3 py-1.5 bg-[#007AFF] hover:bg-[#0069d9] text-white text-xs font-bold rounded-lg flex items-center gap-2 transition disabled:opacity-50 grade-upload-btn min-w-[100px] justify-center",children:[e_?(0,s.jsx)(D.W,{size:18,className:"text-white"}):"".concat(eV.filter(e=>e.studentId).length,"명 성적 저장"),!e_&&(0,s.jsx)(N.Z,{size:16})]})]})]}),"grade-file"===H&&"midterm"===e2&&(0,s.jsxs)("div",{className:"absolute top-4 right-14 flex items-center gap-2 z-10",children:[(0,s.jsxs)("button",{onClick:()=>tt({examType:"midterm",gradeLevel:"",semester:""}),className:"px-3 py-1.5 text-xs text-red-500 hover:text-red-600 dark:text-red-400 dark:hover:text-red-300 transition-colors flex items-center gap-1.5",children:[(0,s.jsx)(h.Z,{size:12}),"이전 성적 삭제"]}),e7.length>0&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("button",{onClick:()=>{e9([]),e8(null)},className:"px-3 py-1.5 text-xs text-zinc-500 dark:text-white/50 hover:text-zinc-900 dark:hover:text-white transition-colors",children:"취소"}),(0,s.jsxs)("button",{onClick:tI,disabled:e_,className:"px-3 py-1.5 bg-[#007AFF] hover:bg-[#0069d9] text-white text-xs font-bold rounded-lg flex items-center gap-2 transition disabled:opacity-50 min-w-[100px] justify-center",children:[e_?(0,s.jsx)(D.W,{size:18,className:"text-white"}):"".concat(e7.filter(e=>e.studentId).length,"명 성적 저장"),!e_&&(0,s.jsx)(N.Z,{size:16})]})]})]}),"grade-file"===H&&"mock"===e2&&(0,s.jsxs)("div",{className:"absolute top-4 right-14 flex items-center gap-2 z-10",children:[(0,s.jsxs)("button",{onClick:()=>ts({year:"",month:""}),className:"px-3 py-1.5 text-xs text-red-500 hover:text-red-600 dark:text-red-400 dark:hover:text-red-300 transition-colors flex items-center gap-1.5",children:[(0,s.jsx)(h.Z,{size:12}),"이전 성적 삭제"]}),e3&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("button",{onClick:()=>e4(null),className:"px-3 py-1.5 text-xs text-zinc-500 dark:text-white/50 hover:text-zinc-900 dark:hover:text-white transition-colors",children:"취소"}),(0,s.jsxs)("button",{onClick:tA,disabled:e_||!ti.ready,className:"px-3 py-1.5 bg-[#007AFF] hover:bg-[#0069d9] text-white text-xs font-bold rounded-lg flex items-center gap-2 transition disabled:opacity-50 mock-exam-upload-btn min-w-[100px] justify-center",children:[e_?(0,s.jsx)(D.W,{size:18,className:"text-white"}):"".concat(e3.students.length,"명 성적 저장"),!e_&&(0,s.jsx)(N.Z,{size:16})]})]})]}),(0,s.jsxs)("div",{className:"flex-1 p-4 flex flex-col overflow-hidden",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between mb-4 pr-12",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h3",{className:"text-[15px] font-medium text-zinc-900 dark:text-white",children:"student-list"===H?"".concat(ex," 학생 등록"):"school"===e2?"내신 성적 파일 업로드":"mock"===e2?"모의고사 성적 파일 업로드":"midterm"===e2?"중간고사 성적 파일 업로드":"생활기록부 파일 업로드"}),"grade-file"===H&&(0,s.jsxs)(s.Fragment,{children:["school"===e2&&eJ&&(0,s.jsxs)("p",{className:"text-xs text-zinc-500 dark:text-[#71717a] mt-1",children:[eJ.gradeClass," \xb7 ",eJ.totalRecords,"개 성적"]}),"mock"===e2&&e3&&(0,s.jsxs)("p",{className:"text-xs text-zinc-500 dark:text-[#71717a] mt-1",children:[(null===(y=e3.meta.test_date)||void 0===y?void 0:y.split("-")[0])||"2025","년 ",(null===(w=e3.meta.test_date)||void 0===w?void 0:w.split("-")[1])||"3","월 \xb7 ",e3.meta.grade,"학년 ",e3.meta.class_no?"".concat(e3.meta.class_no,"반"):""," \xb7 ",e3.students.length,"명"]}),"midterm"===e2&&e6&&(0,s.jsxs)("p",{className:"text-xs text-zinc-500 dark:text-[#71717a] mt-1",children:[e6.gradeClass," \xb7 전교 ",e6.totalStudents,"명 중 매칭 ",e7.filter(e=>e.studentId).length,"명 \xb7 ",e6.totalRecords,"개 성적"]})]})]}),"grade-file"===H&&"record"===e2&&tc&&(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("button",{onClick:()=>to(null),className:"px-3 py-1.5 text-xs text-zinc-500 dark:text-white/50 hover:text-zinc-900 dark:hover:text-white transition-colors",children:"취소"}),(0,s.jsxs)("button",{onClick:()=>tF(),disabled:e_||eM,className:"px-3 py-1.5 bg-[#007AFF] hover:bg-[#0069d9] text-white text-xs font-bold rounded-lg flex items-center gap-2 transition disabled:opacity-50 record-upload-btn min-w-[120px] justify-center",children:[e_?(0,s.jsx)(D.W,{size:18,className:"text-white"}):"생활기록부 저장",!e_&&(0,s.jsx)(N.Z,{size:16})]})]})]}),"grade-file"===H&&"mock"===e2&&e3&&(0,s.jsx)(i,{choice:ti,disabled:e_}),"student-list"===H&&eS&&(0,s.jsxs)("section",{"aria-label":"학생 처리 ê²°ê
1³¼",className:"mb-3 shrink-0 rounded-xl border border-zinc-200 dark:border-zinc-700 p-3 text-sm",children:[(0,s.jsxs)("p",{role:"status",className:"font-medium",children:["처리 ê²°ê³¼: 성공 ",eS.success,"명 \xb7 실패 ",eS.errors.length,"명"]}),eS.errors.length>0&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("p",{className:"mt-1 text-zinc-500",children:"아래 표에는 실패한 학생만 남겨 두었습니다. 수정 후 다시 저장할 수 있어요."}),(0,s.jsx)("ul",{className:"my-2 max-h-32 overflow-auto text-red-600 dark:text-red-400",children:eS.errors.map((e,t)=>(0,s.jsx)("li",{children:e},t))}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)("button",{type:"button",disabled:e_,className:"min-h-11 rounded-lg border border-zinc-300 dark:border-zinc-600 px-3",onClick:()=>void tk(),children:"실패한 행 다시 처리"}),(0,s.jsx)("button",{type:"button",className:"min-h-11 rounded-lg border border-zinc-300 dark:border-zinc-600 px-3",onClick:()=>{let e=URL.createObjectURL(new Blob([eS.errors.join("\n")],{type:"text/plain;charset=utf-8"})),t=document.createElement("a");t.href=e,t.download="학생-처리-오류.txt",t.click(),URL.revokeObjectURL(e)},children:"오류 목록 내려받기"})]})]}),(0,s.jsx)("button",{type:"button",className:"mt-2 min-h-11 px-3 text-zinc-500",onClick:()=>eD(null),children:"ê²°ê³¼ 닫기"})]}),"student-list"===H?0===ez.length?(0,s.jsx)(s.Fragment,{children:(0,s.jsxs)("div",{className:"flex-1 flex flex-col animate-in fade-in duration-300",children:[(0,s.jsxs)("div",{className:"text-[13px] text-zinc-500 dark:text-zinc-400 mb-3 leading-relaxed",children:["학번, 이름 열이 포함된 엑셀 파일을 업로드하세요. ",(0,s.jsx)("br",{}),(0,s.jsx)("span",{className:"text-xs text-zinc-400",children:"필수 열: [학번, 이름] 또는 [학년, 반, 번호, 이름]"})]}),(0,s.jsx)("div",{className:(0,C.cn)("flex-1 border-2 border-dashed rounded-xl flex flex-col items-center justify-center gap-4 transition cursor-pointer group bg-zinc-50/50 dark:bg-[#202023]/30 outline-none",eF?"border-[#2883DE] bg-[#2883DE]/10":"border-[#3f3f46]/50 hover:border-[#71717a] hover:bg-[#EBEBEA] [.dark_&]:hover:bg-[#202023] focus:border-[#2883DE] focus:bg-[#2883DE]/5"),tabIndex:0,role:"button","aria-label":"학생 명단 파일 업로드","aria-disabled":eM,onKeyDown:e=>{if(!eM&&("Enter"===e.key||" "===e.key)){var t;e.preventDefault(),null===(t=eG.current)||void 0===t||t.click()}},onPaste:e=>{e.preventDefault();let t="",r="";if("clipboardData"in e?(t=e.clipboardData.getData("text/html"),r=e.clipboardData.getData("text")):r=e.target.value,!r&&!t)return;let s=[],a=e=>{let t=e.map(e=>e.trim()).filter(e=>""!==e);if(0===t.length)return null;let r={number:0,name:"",grade:void 0,classNum:void 0,memo:"",isValid:!0,id:void 0};if(t.length>=4){let e=parseInt(t[0]),s=parseInt(t[1]),a=parseInt(t[2]);if(!isNaN(e)&&!isNaN(s)&&!isNaN(a))return r.grade=e,r.classNum=s,r.number=a,r.name=t[3],t[4]&&(r.memo=t.slice(4).join(" ")),r}if(2===t.length){let e=(0,R.T)(t[0]);if(e)return r.grade=e.grade,r.classNum=e.classNum,r.number=e.number,r.name=t[1],r}if(2===t.length){let e=parseInt(t[0]);if(!isNaN(e))return r.number=e,r.name=t[1],r}if(3===t.length){let e=parseInt(t[0]);if(!isNaN(e))return r.number=e,r.name=t[1],r.memo=t[2],r}return null},n=e=>{let t=a(e);return!!t&&(t.classNum||"담임 학급"===ex||isNaN(parseInt(ex))||(t.classNum=parseInt(ex)),s.push(t),!0)};if(t){let e=new DOMParser().parseFromString(t,"text/html").querySelectorAll("tr");e.length>0&&e.forEach(e=>{n(Array.from(e.querySelectorAll("td, th")).map(e=>e.textContent||""))})}0===s.length&&r&&r.trim().split(/\r?\n/).forEach(e=>{if(!e.trim()||e.includes("	")&&n(e.split("	")))return;let t=e.trim().split(/\s+/);t.length>=2&&n(t)}),s.length>0?(eC(e=>[...e,...s].sort(tp)),ec("".concat(s.length,"명을 붙여넣었습니다."),"success")):(t||r)&&ec("붙여넣은 내용을 알아보지 못했습니다. [학번, 이름] 또는 [학년, 반, 번호, 이름] 순서인지 확인해 주세요.","warning")},onClick:()=>{var e;return!eM&&(null===(e=eG.current)||void 0===e?void 0:e.click())},onDragOver:e=>{e.preventDefault(),eM||eA(!0)},onDragLeave:()=>eA(!1),onDrop:tB,children:eM?(0,s.jsxs)("div",{className:"flex flex-col items-center gap-3 animate-in fade-in duration-300",children:[(0,s.jsx)(D.W,{size:48}),(0,s.jsx)("p",{className:"text-sm text-zinc-500 font-medium animate-pulse",children:"파일 확인 중..."})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(F.w,{src:"/lordicons/wired-outline-92-file-upload-hover-swipe.json",size:40,target:".group",playOnMount:!0,className:(0,C.cn)("mb-2 transition-colors",eF?"text-[#2883DE]":"text-zinc-400 dark:text-zinc-500 group-hover:text-zinc-600 dark:group-hover:text-zinc-300")},"student-list-drop-".concat(H)),(0,s.jsxs)("div",{className:"text-center",children:[(0,s.jsx)("p",{className:"text-zinc-900 dark:text-white font-medium mb-1",children:"학생 명단 파일 업로드"}),(0,s.jsx)("p",{className:"text-sm text-zinc-400",children:"엑셀 파일(.xlsx) 업로드"})]})]})})]})}):(0,s.jsx)(s.Fragment,{children:(0,s.jsxs)("div",{className:"flex-1 flex flex-col overflow-hidden",children:[(0,s.jsx)("div",{className:"px-1 pt-0 pb-2 text-left shrink-0",children:(0,s.jsx)("p",{className:"text-xs text-zinc-400",children:"오류가 있다면 아래의 표에서 직접 수정할 수 있습니다."})}),(0,s.jsxs)("div",{className:"flex-1 overflow-auto bg-transparent dark:bg-[#18181b] relative",children:[(0,s.jsxs)("table",{className:"w-full text-sm",children:[(0,s.jsx)("thead",{className:"sticky top-0 bg-[#F7F7F5] [.dark_&]:bg-[#18181b] z-50 font-medium shadow-sm",children:(0,s.jsxs)("tr",{className:"text-zinc-500 dark:text-[#71717a] text-center border-b border-zinc-200 dark:border-[#27272a]",children:[(0,s.jsx)("th",{className:"py-2 px-1 w-[15%]",children:"학년"}),(0,s.jsx)("th",{className:"py-2 px-1 w-[15%]",children:"반"}),(0,s.jsx)("th",{className:"py-2 px-1 w-[15%]",children:"번호"}),(0,s.jsx)("th",{className:"py-2 px-1",children:"이름"}),(0,s.jsx)("th",{className:"py-2 px-1 w-[80px]"})]})}),(0,s.jsx)("tbody",{children:ez.map((e,t)=>(0,s.jsxs)("tr",{className:"border-b border-zinc-100 dark:border-[#27272a]/50 text-zinc-900 dark:text-white group/row hover:bg-amber-50/50 dark:hover:bg-[#202023]/30 transition-colors",children:[(0,s.jsx)("td",{className:"p-1",children:(0,s.jsx)("input",{type:"number",className:"w-full text-center bg-transparent focus:bg-white dark:focus:bg-[#27272a] rounded p-1.5 outline-none text-zinc-900 dark:text-zinc-200 focus:shadow-sm transition [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none","aria-label":"".concat(t+1,"행 학생 학년"),value:e.grade||"",placeholder:"-",onChange:e=>tR(t,"grade",parseInt(e.target.value)||void 0)})}),(0,s.jsx)("td",{className:"p-1",children:(0,s.jsx)("input",{type:"number",className:"w-full text-center bg-transparent focus:bg-white dark:focus:bg-[#27272a] rounded p-1.5 outline-none text-zinc-900 dark:text-zinc-200 focus:shadow-sm transition [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none","aria-label":"".concat(t+1,"행 학생 반"),value:e.classNum||"",placeholder:"-",onChange:e=>tR(t,"classNum",parseInt(e.target.value)||void 0)})}),(0,s.jsx)("td",{className:"p-1",children:(0,s.jsx)("input",{type:"number",className:"w-full text-center bg-transparent focus:bg-white dark:focus:bg-[#27272a] rounded p-1.5 outline-none font-medium text-zinc-900 dark:text-zinc-200 focus:shadow-sm transition [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none","aria-label":"".concat(t+1,"행 학생 번호"),value:e.number||"",onChange:e=>tR(t,"number",parseInt(e.target.value)||0)})}),(0,s.jsx)("td",{className:"p-1",children:(0,s.jsx)("input",{type:"text",className:"w-full text-center bg-transparent focus:bg-white dark:focus:bg-[#27272a] rounded p-1.5 outline-none text-zinc-900 dark:text-zinc-200 focus:shadow-sm transition","aria-label":"".concat(t+1,"행 학생 이름"),value:e.name,onChange:e=>tR(t,"name",e.target.value)})}),(0,s.jsx)("td",{className:"p-1 text-center",children:(0,s.jsxs)("div",{className:"flex items-center justify-center gap-1 opacity-100 [@media(hover:hover)]:opacity-0 group-hover/row:opacity-100 group-focus-within/row:opacity-100 transition-opacity",children:[(0,s.jsx)("button",{onClick:()=>tM(t),className:"p-1.5 text-zinc-400 hover:text-emerald-500 hover:bg-emerald-50 dark:hover:bg-emerald-500/10 rounded transition",title:"저장",children:(0,s.jsx)(m.Z,{size:14})}),(0,s.jsx)("button",{onClick:()=>tO(t),className:"p-1.5 text-zinc-300 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-500/10 rounded transition",title:"삭제",children:(0,s.jsx)(h.Z,{size:14})})]})})]},t))})]}),(0,s.jsx)("div",{className:"p-2 border-t border-dashed border-zinc-200 dark:border-[#27272a] text-center",children:(0,s.jsx)("button",{onClick:()=>{eC(e=>[...e,{grade:void 0,classNum:void 0,number:0,name:"",memo:"",isValid:!0,id:void 0}]),eW(!0)},className:"w-full py-2 text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 hover:bg-zinc-50 dark:hover:bg-[#202023] rounded-lg border border-transparent hover:border-zinc-200 dark:hover:border-[#3f3f46] border-dashed transition",children:"+ 빈 행 추가하기"})})]})]})}):(()=>
1{if("midterm"===e2){if(e7.length>0){let e=e7.filter(e=>e.studentId),t=e7.filter(e=>!e.studentId);return(0,s.jsx)("div",{className:"flex-1 flex flex-col overflow-hidden",children:(0,s.jsx)("div",{className:"flex-1 overflow-auto bg-transparent relative custom-scrollbar",children:(0,s.jsxs)("table",{className:"w-full text-sm",children:[(0,s.jsx)("thead",{className:"sticky top-0 bg-[#F7F7F5] [.dark_&]:bg-[#18181b] z-50 font-medium shadow-sm",children:(0,s.jsxs)("tr",{className:"text-zinc-500 dark:text-[#71717a] text-center border-b border-zinc-200 dark:border-[#27272a]",children:[(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-12",children:"반"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-12",children:"번호"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium text-center",children:"이름"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-20 text-center",children:"과목수"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-20 text-center",children:"상태"})]})}),(0,s.jsxs)("tbody",{className:"text-xs",children:[e.map((e,t)=>(0,s.jsxs)("tr",{className:"border-b border-zinc-100 dark:border-[#27272a]/50 text-zinc-900 dark:text-white group/row hover:bg-amber-50/50 dark:hover:bg-[#202023]/30 transition-colors",children:[(0,s.jsx)("td",{className:"py-2.5 px-2 text-center text-zinc-500 dark:text-zinc-400",children:e.currentClass}),(0,s.jsx)("td",{className:"py-2.5 px-2 text-center text-zinc-500 dark:text-zinc-400",children:e.studentNumber}),(0,s.jsx)("td",{className:"py-2.5 px-2 font-medium text-center",children:e.studentName}),(0,s.jsx)("td",{className:"py-2.5 px-2 text-center text-zinc-500 dark:text-zinc-400",children:e.grades.length}),(0,s.jsx)("td",{className:"py-2.5 px-2 text-center",children:(0,s.jsx)("span",{className:"text-green-500 text-xs",children:"매칭됨"})})]},"m-".concat(t))),t.length>0&&(0,s.jsx)("tr",{className:"bg-zinc-50 dark:bg-white/[0.03]",children:(0,s.jsxs)("td",{colSpan:5,className:"py-2 px-3 text-xs text-zinc-400",children:["미매칭 학생 ",t.length,"명 (저장되지 않음)"]})})]})]})})})}return(0,s.jsxs)("div",{className:"flex-1 flex flex-col",children:[(0,s.jsxs)("div",{className:"text-[13px] text-zinc-900 dark:text-zinc-400 mb-3 flex flex-col gap-1 text-left leading-relaxed",children:[(0,s.jsx)("p",{children:"중간고사 성적 파일은 평가 담당 선생님께서 다운로드 가능합니다."}),(0,s.jsxs)("p",{children:["경로: 나이스 - 성적조회/통계 - 학기말 성적 조회 - 성적일람표 전과목/전학생 -",(0,s.jsx)("br",{}),(0,s.jsx)("span",{className:"ml-[30px]",children:"'한 페이지로 출력' 체크 - 저장 - XLS"})]})]}),(0,s.jsxs)("div",{className:(0,C.cn)("flex-1 border-2 border-dashed rounded-xl flex flex-col items-center justify-center gap-4 transition cursor-pointer group",eF?"border-[#2883DE] bg-[#2883DE]/10":"border-[#3f3f46] hover:border-[#71717a] hover:bg-[#EBEBEA] [.dark_&]:hover:bg-[#202023]"),onClick:()=>{var e;return!eM&&(null===(e=e0.current)||void 0===e?void 0:e.click())},onDragOver:e=>{e.preventDefault(),eM||eA(!0)},onDragLeave:()=>eA(!1),onDrop:e=>{var t;e.preventDefault(),eA(!1);let r=null===(t=e.dataTransfer.files)||void 0===t?void 0:t[0];r&&tE(r)},children:[eM?(0,s.jsxs)("div",{className:"flex flex-col items-center gap-3 animate-in fade-in duration-300",children:[(0,s.jsx)(D.W,{size:64}),(0,s.jsx)("p",{className:"text-sm text-zinc-500 font-medium animate-pulse",children:"파일 확인 중..."})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(F.w,{src:"/lordicons/wired-outline-92-file-upload-hover-swipe.json",size:40,target:".group",playOnMount:!0,className:(0,C.cn)("mb-2 transition-colors",eF?"text-[#2883DE]":"text-zinc-400 dark:text-zinc-500 group-hover:text-zinc-600 dark:group-hover:text-zinc-300")},"midterm-drop-".concat(e2)),(0,s.jsx)("div",{className:"text-center",children:(0,s.jsxs)("p",{className:"text-zinc-900 dark:text-white font-medium mb-1",children:["중간고사 성적 일람표",(0,s.jsx)("br",{}),"엑셀(.xlsx) 업로드"]})})]}),(0,s.jsx)("input",{type:"file",ref:e0,accept:".xlsx,.xls",className:"hidden",onChange:e=>{var t;let r=null===(t=e.target.files)||void 0===t?void 0:t[0];r&&tE(r),e.target.value=""}})]})]})}return"mock"===e2?e3?(0,s.jsx)("div",{className:"flex-1 flex flex-col overflow-hidden",children:(0,s.jsx)("div",{className:"flex-1 overflow-auto bg-transparent relative custom-scrollbar",children:(0,s.jsxs)("table",{className:"w-full text-sm",children:[(0,s.jsx)("thead",{className:"sticky top-0 bg-[#F7F7F5] [.dark_&]:bg-[#18181b] z-50 font-medium shadow-sm",children:(0,s.jsxs)("tr",{className:"text-zinc-500 dark:text-[#71717a] text-center border-b border-zinc-200 dark:border-[#27272a]",children:[(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-16",children:"번호"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium text-center",children:"이름"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium text-center w-24",children:"과목수"})]})}),(0,s.jsx)("tbody",{className:"text-xs",children:e3.students.map((e,t)=>{let r=[e.kor_grade,e.math_grade,e.eng_grade,e.hist_grade,e.inq1_grade,e.inq2_grade].filter(e=>null!==e).length;return(0,s.jsxs)("tr",{className:"border-b border-zinc-100 dark:border-[#27272a]/50 text-zinc-900 dark:text-white group/row hover:bg-amber-50/50 dark:hover:bg-[#202023]/30 transition-colors",children:[(0,s.jsx)("td",{className:"py-2.5 px-2 text-center text-zinc-500 dark:text-zinc-400",children:e.student_no}),(0,s.jsx)("td",{className:"py-2.5 px-2 font-medium text-center",children:e.name}),(0,s.jsx)("td",{className:"py-2.5 px-2 text-center text-zinc-500 dark:text-zinc-400",children:r})]},t)})})]})})}):(0,s.jsxs)("div",{className:"flex-1 flex flex-col",children:[(0,s.jsx)("div",{className:"text-[13px] text-zinc-900 dark:text-zinc-400 mb-3 flex flex-col gap-1 text-left leading-relaxed",children:(0,s.jsx)("p",{children:"경로: 시험업무지원포털(www.csat.re.kr) - 성적출력 - 성적일람표"})}),(0,s.jsxs)("div",{className:(0,C.cn)("flex-1 border-2 border-dashed rounded-xl flex flex-col items-center justify-center gap-4 transition cursor-pointer group",eF?"border-[#2883DE] bg-[#2883DE]
1/10":"border-[#3f3f46] hover:border-[#71717a] hover:bg-[#EBEBEA] [.dark_&]:hover:bg-[#202023]"),onClick:()=>{var e;return!eM&&(null===(e=eQ.current)||void 0===e?void 0:e.click())},onDragOver:e=>{e.preventDefault(),eM||eA(!0)},onDragLeave:()=>eA(!1),onDrop:e=>{var t;e.preventDefault(),eA(!1);let r=null===(t=e.dataTransfer.files)||void 0===t?void 0:t[0];r&&tS(r)},children:[eM?(0,s.jsxs)("div",{className:"flex flex-col items-center gap-3 animate-in fade-in duration-300",children:[(0,s.jsx)(D.W,{size:64}),(0,s.jsx)("p",{className:"text-sm text-zinc-500 font-medium animate-pulse",children:"파일 확인 중..."})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(F.w,{src:"/lordicons/wired-outline-92-file-upload-hover-swipe.json",size:40,target:".group",playOnMount:!0,className:(0,C.cn)("mb-2 transition-colors",eF?"text-[#2883DE]":"text-zinc-400 dark:text-zinc-500 group-hover:text-zinc-600 dark:group-hover:text-zinc-300")},"mock-drop-".concat(e2)),(0,s.jsx)("div",{className:"text-center",children:(0,s.jsxs)("p",{className:"text-zinc-900 dark:text-white font-medium mb-1",children:["모의고사 학급별 성적일람표",(0,s.jsx)("br",{}),"PDF 업로드"]})})]}),(0,s.jsx)("input",{type:"file",ref:eQ,accept:".pdf",className:"hidden",onChange:e=>{var t;let r=null===(t=e.target.files)||void 0===t?void 0:t[0];r&&tS(r),e.target.value=""}})]})]}):"record"===e2?e_?(0,s.jsxs)("div",{className:"flex-1 flex flex-col items-center justify-center gap-6 animate-in fade-in duration-500",children:[(0,s.jsx)(D.W,{size:80}),(0,s.jsxs)("div",{className:"text-center space-y-2",children:[(0,s.jsx)("p",{className:"text-zinc-900 dark:text-white font-semibold text-lg text-pretty",children:"AI가 열심히 분석중이에요."}),(0,s.jsx)("p",{className:"text-[13px] text-zinc-500 dark:text-zinc-400 leading-relaxed text-pretty",children:"창을 닫고 1~2분 뒤 학생 관리 페이지에서 확인해 보세요."})]})]}):tc?null:(0,s.jsxs)("div",{className:"flex-1 flex flex-col",children:[(0,s.jsx)("div",{className:"text-[13px] text-zinc-900 dark:text-zinc-400 mb-3 flex justify-start",children:(0,s.jsxs)("div",{className:"flex gap-1.5 text-left leading-relaxed",children:[(0,s.jsx)("span",{className:"shrink-0",children:"경로:"}),(0,s.jsxs)("div",{className:"flex flex-col",children:[(0,s.jsx)("span",{children:"나이스 - 학급담임 - 학교생활기록부 - 학생부 조회 및 출력 -"}),(0,s.jsx)("span",{children:"학생부II 선택 - PDF로 저장"})]})]})}),(0,s.jsxs)("div",{className:(0,C.cn)("flex-1 border-2 border-dashed rounded-xl flex flex-col items-center justify-center gap-4 transition cursor-pointer group",eF?"border-[#2883DE] bg-[#2883DE]/10":"border-[#3f3f46] hover:border-[#71717a] hover:bg-[#EBEBEA] [.dark_&]:hover:bg-[#202023]"),onClick:()=>{var e;return null===(e=e1.current)||void 0===e?void 0:e.click()},onDragOver:e=>{e.preventDefault(),eA(!0)},onDragLeave:()=>eA(!1),onDrop:e=>{var t;e.preventDefault(),eA(!1);let r=null===(t=e.dataTransfer.files)||void 0===t?void 0:t[0];r&&tD(r)},children:[eM?(0,s.jsxs)("div",{className:"flex flex-col items-center gap-3 animate-in fade-in duration-300",children:[(0,s.jsx)(D.W,{size:64}),(0,s.jsx)("p",{className:"text-sm text-zinc-500 font-medium animate-pulse",children:"파일 확인 중..."})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(F.w,{src:"/lordicons/wired-outline-92-file-upload-hover-swipe.json",size:40,target:".group",playOnMount:!0,className:(0,C.cn)("mb-2 transition-colors",eF?"text-[#2883DE]":"text-zinc-400 dark:text-zinc-500 group-hover:text-zinc-600 dark:group-hover:text-zinc-300")},"record-drop-".concat(e2)),(0,s.jsx)("div",{className:"text-center",children:(0,s.jsxs)("p",{className:"text-zinc-900 dark:text-white font-medium mb-1",children:["학생 개인별",(0,s.jsx)("br",{}),"생활기록부 PDF 업로드"]})})]}),(0,s.jsx)("input",{type:"file",ref:e1,accept:".pdf",className:"hidden",onChange:async e=>{var t;let r=null===(t=e.target.files)||void 0===t?void 0:t[0];r&&tD(r),e.target.value=""}})]})]}):0===eV.length?(0,s.jsxs)("div",{className:"flex-1 flex flex-col",children:[(0,s.jsx)("div",{className:"text-[13px] text-zinc-900 dark:text-zinc-400 mb-3 flex justify-start",children:(0,s.jsxs)("div",{className:"flex gap-1.5 text-left leading-relaxed",children:[(0,s.jsx)("span",{className:"shrink-0",children:"경로:"}),(0,s.jsxs)("div",{className:"flex flex-col",children:[(0,s.jsx)("span",{children:"나이스 - 학급담임 - 학교생활기록부 -"}),(0,s.jsx)("span",{children:"학생부 항목별 조회 - 교과학습발달상황 - 저장 - XLS data"})]})]})}),(0,s.jsxs)("div",{className:(0,C.cn)("flex-1 border-2 border-dashed rounded-xl flex flex-col items-center justify-center gap-4 transition cursor-pointer group",eF?"border-[#2883DE] bg-[#2883DE]
1/10":"border-[#3f3f46] hover:border-[#71717a] hover:bg-[#EBEBEA] [.dark_&]:hover:bg-[#202023]"),onClick:()=>{var e;return!eM&&(null===(e=eH.current)||void 0===e?void 0:e.click())},onDragOver:e=>{e.preventDefault(),eM||eA(!0)},onDragLeave:()=>eA(!1),onDrop:e=>{var t;e.preventDefault(),eA(!1);let r=null===(t=e.dataTransfer.files)||void 0===t?void 0:t[0];r&&tC(r)},children:[eM?(0,s.jsxs)("div",{className:"flex flex-col items-center gap-3 animate-in fade-in duration-300",children:[(0,s.jsx)(D.W,{size:64}),(0,s.jsx)("p",{className:"text-sm text-zinc-500 font-medium animate-pulse",children:"파일 확인 중..."})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(F.w,{src:"/lordicons/wired-outline-92-file-upload-hover-swipe.json",size:40,target:".group",playOnMount:!0,className:(0,C.cn)("mb-2 transition-colors",eF?"text-[#2883DE]":"text-zinc-400 dark:text-zinc-500 group-hover:text-zinc-600 dark:group-hover:text-zinc-300")},"school-drop-".concat(e2)),(0,s.jsxs)("div",{className:"text-center",children:[(0,s.jsx)("p",{className:"text-zinc-900 dark:text-white font-medium mb-1",children:"내신 성적 파일"}),(0,s.jsx)("p",{className:"text-sm text-zinc-900 dark:text-white",children:"XLS data 업로드"})]})]}),(0,s.jsx)("input",{type:"file",ref:eH,accept:".xlsx,.xls,.csv",className:"hidden",onChange:e=>{var t;let r=null===(t=e.target.files)||void 0===t?void 0:t[0];r&&tC(r),e.target.value=""}})]})]}):(0,s.jsx)("div",{className:"flex-1 flex flex-col overflow-hidden",children:(0,s.jsx)("div",{className:"flex-1 overflow-auto bg-transparent relative custom-scrollbar",children:(0,s.jsxs)("table",{className:"w-full text-sm",children:[(0,s.jsx)("thead",{className:"sticky top-0 bg-[#F7F7F5] [.dark_&]:bg-[#18181b] z-50 font-medium shadow-sm",children:(0,s.jsxs)("tr",{className:"text-zinc-500 dark:text-[#71717a] text-center border-b border-zinc-200 dark:border-[#27272a]",children:[(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-16 text-center",children:"번호"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium text-center",children:"학생"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-24 text-center",children:"과목수"}),(0,s.jsx)("th",{className:"py-2.5 px-2 font-medium w-24 text-center",children:"상태"})]})}),(0,s.jsx)("tbody",{className:"text-xs",children:eV.map((e,t)=>(0,s.jsxs)("tr",{className:"border-t border-zinc-100 dark:border-[#27272a] hover:bg-zinc-100 dark:hover:bg-[#202023]/50 transition-colors",children:[(0,s.jsx)("td",{className:"py-2 px-2 text-zinc-500 dark:text-zinc-400 text-center w-16",children:e.studentNumber}),(0,s.jsx)("td",{className:"py-2 px-2 text-zinc-900 dark:text-white text-center font-medium",children:e.studentName}),(0,s.jsx)("td",{className:"py-2 text-center text-zinc-500 dark:text-zinc-400",children:e.grades.length}),(0,s.jsx)("td",{className:"py-2 text-center",children:e.studentId?(0,s.jsx)("span",{className:"text-emerald-500",children:"매칭됨"}):(0,s.jsx)("span",{className:"text-red-500",children:"미매칭"})})]},t))})]})})})})()]})]})]}),tu&&(0,s.jsxs)("div",{className:"modal-viewport z-[99999] flex items-center justify-center p-4",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-sm",onClick:()=>tx(null)}),(0,s.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"생활기록부 이름 확인",onKeyDown:e=>{"Escape"===e.key&&tx(null)},className:"relative bg-white dark:bg-[#1c1c1e] rounded-2xl shadow-2xl p-6 max-w-sm w-full border border-zinc-200 dark:border-white/10 animate-in zoom-in-95 fade-in duration-200",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,s.jsx)(k.Z,{size:20,className:"flex-shrink-0 text-amber-600 dark:text-amber-400"}),(0,s.jsx)("h3",{className:"font-semibold text-zinc-900 dark:text-white text-[15px]",children:tu.extractedName===tu.selectedStudentName?"동명이인 가능성이 있습니다":"학생 이름이 다릅니다"})]}),(0,s.jsxs)("div",{className:"space-y-2 mb-5 text-sm",children:[(0,s.jsxs)("div",{className:"bg-zinc-50 dark:bg-white/5 rounded-xl p-3 space-y-3",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsx)("span",{className:"text-zinc-500 dark:text-zinc-400 text-xs",children:"선택된 학생"}),(0,s.jsxs)("span",{className:"font-semibold text-zinc-900 dark:text-white",children:[tu.selectedStudentName,null!==tu.selectedStudentNumber&&(0,s.jsxs)("span",{className:"ml-1.5 text-xs font-normal text-zinc-400",children:[tu.selectedStudentNumber,"번"]})]})]}),(0,s.jsx)("div",{className:"w-full h-px bg-zinc-200 dark:bg-white/10"}),(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsx)("span",{className:"text-zinc-500 dark:text-zinc-400 text-xs",children:"PDF 내 학생"}),(0,s.jsxs)("span",{className:"font-semibold text-amber-600 dar
1k:text-amber-400",children:[tu.extractedName,null!==tu.extractedNumber&&(0,s.jsxs)("span",{className:"ml-1.5 text-xs font-normal text-amber-400/70",children:[tu.extractedNumber,"번"]})]})]})]}),(0,s.jsxs)("p",{className:"text-xs text-zinc-500 dark:text-zinc-400 leading-relaxed",children:["업로드한 생기부가 ",(0,s.jsx)("span",{className:"font-medium text-zinc-700 dark:text-zinc-300",children:tu.selectedStudentName})," 학생의 것이 맞는지 확인해 주세요."]})]}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)("button",{onClick:()=>tx(null),className:"flex-1 px-4 py-2 text-sm font-medium text-zinc-700 dark:text-zinc-300 bg-zinc-100 dark:bg-white/10 hover:bg-zinc-200 dark:hover:bg-white/15 rounded-xl transition-colors",children:"취소"}),(0,s.jsx)("button",{onClick:()=>{let e=tu.file;tx(null),tF(e,!0)},className:"flex-1 px-4 py-2 text-sm font-bold text-white bg-amber-500 hover:bg-amber-600 rounded-xl transition-colors",children:"그래도 저장"})]})]})]}),te&&(0,s.jsxs)("div",{className:"modal-viewport z-[99999] flex items-center justify-center p-4",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-sm",onClick:()=>!ta&&tt(null)}),(0,s.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"성적 일괄 삭제 확인",onKeyDown:e=>{"Escape"!==e.key||ta||tt(null)},className:"relative bg-white dark:bg-[#1c1c1e] rounded-2xl shadow-2xl p-6 max-w-sm w-full border border-zinc-200 dark:border-white/10 animate-in zoom-in-95 fade-in duration-200",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,s.jsx)(h.Z,{size:18,className:"flex-shrink-0 text-red-600 dark:text-red-400"}),(0,s.jsxs)("h3",{className:"font-semibold text-zinc-900 dark:text-white text-[15px]",children:["midterm"===te.examType?"중간고사":"기말고사"," 성적 삭제"]})]}),(0,s.jsxs)("div",{className:"space-y-3 mb-5",children:[(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsxs)("select",{value:te.gradeLevel,onChange:e=>tt({...te,gradeLevel:e.target.value?Number(e.target.value):""}),className:"flex-1 px-3 py-2 text-sm rounded-lg border border-zinc-200 dark:border-white/10 bg-white dark:bg-white/5 text-zinc-900 dark:text-white",children:[(0,s.jsx)("option",{value:"",children:"학년 선택"}),(0,s.jsx)("option",{value:1,children:"1학년"}),(0,s.jsx)("option",{value:2,children:"2학년"}),(0,s.jsx)("option",{value:3,children:"3학년"})]}),(0,s.jsxs)("select",{value:te.semester,onChange:e=>tt({...te,semester:e.target.value?Number(e.target.value):""}),className:"flex-1 px-3 py-2 text-sm rounded-lg border border-zinc-200 dark:border-white/10 bg-white dark:bg-white/5 text-zinc-900 dark:text-white",children:[(0,s.jsx)("option",{value:"",children:"학기 선택"}),(0,s.jsx)("option",{value:1,children:"1학기"}),(0,s.jsx)("option",{value:2,children:"2학기"})]})]}),""!==te.gradeLevel&&""!==te.semester&&(0,s.jsxs)("p",{className:"text-xs text-red-500 dark:text-red-400 leading-relaxed",children:["담임 학급 학생 전체의 ",te.gradeLevel,"학년 ",te.semester,"학기 ","midterm"===te.examType?"중간고사":"기말고사"," 성적을 삭제합니다.",(0,s.jsx)("br",{}),"되돌릴 수 없습니다."]})]}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)("button",{onClick:()=>tt(null),disabled:ta,className:"flex-1 px-4 py-2 text-sm font-medium text-zinc-700 dark:text-zinc-300 bg-zinc-100 dark:bg-white/10 hover:bg-zinc-200 dark:hover:bg-white/15 rounded-xl transition-colors disabled:opacity-50",children:"취소"}),(0,s.jsx)("button",{onClick:t_,disabled:ta||""===te.gradeLevel||""===te.semester,className:"flex-1 px-4 py-2 text-sm font-bold !text-white bg-red-500 hover:bg-red-600 rounded-xl transition-colors disabled:opacity-50",children:ta?(0,s.jsx)(D.W,{size:18,className:"text-white mx-auto"}):"삭제"})]})]})]}),tr&&(0,s.jsxs)("div",{className:"modal-viewport z-[99999] flex items-center justify-center p-4",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-sm",onClick:()=>!ta&&ts(null)}),(0,s.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"모의고사 성적 삭제 확인",onKeyDown:e=>{"Escape"!==e.key||ta||ts(null)},className:"relative bg-white dark:bg-[#1c1c1e] rounded-2xl shadow-2xl p-6 max-w-sm w-full max-h-[calc(100dvh-2rem)] overflow-y-auto border border-zinc-200 dark:border-white/10 animate-in zoom-in-95 fade-in duration-200",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,s.jsx)(h.Z,{size:18,className:"flex-shrink-0 text-red-600 dark:text-red-400"}),(0,s.jsx)("h3",{className:"font-semibold text-zinc-900 dark:text-white text-[15px]",children:"모의고사 성적 삭제"})]}),(0,s.jsxs)("div",{className:"space-y-3 mb-5",children:[(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsxs)("select",{"aria-label":"삭제할 모의고사 연도",disabled:ta,value:tr.year,onChange:e=>ts({...tr,year:e.target.value?Number(e.target.value):""}),className:"flex-1 px-3 py-2 text-sm rounded-lg border border-zinc-200 dark:border-white/10 bg-white dark:bg-white/5 text-zinc-900 dark:text-white",children:[(0,s.jsx)("option",{value:"",children:"연도 선택"}),(0,s.jsxs)("option",{value:2025,children:[2025,"년"]}),(0,s.jsxs)("option",{value:2026,children:[2026,"년"]}),(0,s.jsxs)("option",{value:2027,children:[2027,"년"]})]}),(0,s.jsxs)("select",{"aria-label":"삭제할 모의고사 월",disabled:ta,value:tr.month,onChange:e=>ts({...tr,month:e.target.value?Number(e.target.value):""}),className:"flex-1 px-3 py-2 text-sm rounded-lg border border-zinc-200 dark:border-white/10 bg-white dark:bg-white/5 text-zinc-900 dark:text-white",children:[(0,s.jsx)("option",{value:"",children:"월 선택"}),Array.from({length:12},(e,t)=>t+1).map(e=>(0,s.jsxs)("option",{value:e,children:[e,"월"]},e))]})]}),(0,s.jsx)(i,{choice:td,disabled:ta,deletion:!0}),""!==tr.year&&""!==tr.month&&(0,s.jsxs)("p",{className:"text-xs text-red-500 dark:text-red-400 leading-relaxed",children:["내 학생들의 ",tr.year,"년 ",tr.month,"월 모의고사 성적 중 선택한 범위를 삭제합니다.",(0,s.jsx)("br",{}),"되돌릴 수 없습니다."]})]}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)("button",{onClick:()=>
1ts(null),disabled:ta,className:"flex-1 px-4 py-2 text-sm font-medium text-zinc-700 dark:text-zinc-300 bg-zinc-100 dark:bg-white/10 hover:bg-zinc-200 dark:hover:bg-white/15 rounded-xl transition-colors disabled:opacity-50",children:"취소"}),(0,s.jsx)("button",{onClick:tL,disabled:ta||""===tr.year||""===tr.month||!td.ready,className:"flex-1 px-4 py-2 text-sm font-bold !text-white bg-red-500 hover:bg-red-600 rounded-xl transition-colors disabled:opacity-50",children:ta?(0,s.jsx)(D.W,{size:18,className:"text-white mx-auto"}):"삭제"})]})]})]}),(0,s.jsx)(O.Z,{open:eP,busy:e_,title:"학생 ".concat(ez.length,"명을 모두 삭제할까요?"),description:'"'.concat(ex,'"의 개인 학생 명단이 비워집니다. 학교 협업에 공유한 학생 명단\xb7자료는 유지됩니다.'),consequences:["학생별 성적 기록(내신\xb7모의고사)","출결 기록","상담 일지","세특\xb7행동특성 초안","자율\xb7진로 활동 기록과 첨부파일","설문 응답"],confirmLabel:"모두 삭제",onConfirm:tw,onCancel:()=>eZ(!1)}),(0,s.jsx)(O.Z,{open:null!==eB,busy:e_,title:'"'.concat(eB,'" 교실을 삭제할까요?'),description:"이 교실이 주 학급인 학생의 개인 기록도 삭제됩니다. 학교 협업에 공유한 학생 명단\xb7자료는 유지됩니다.",consequences:["이 교실의 자리 배치와 짝 지정","이 교실 기준으로 작성한 평가 기록"],confirmLabel:"교실 삭제",onConfirm:ty,onCancel:()=>eR(null)})]})}},7888:function(e,t,r){r.d(t,{q:function(){return s}});function s(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"요청을 처리하지 못했습니다. 잠시 후 다시 시도해 주세요.",r=e instanceof Error?e.message:String(null!=e?e:""),s=r.toLowerCase();return s.trim()?/[가-힣]/.test(r)&&!/error|exception|prisma|econn|timeout|undefined|null|\bp\d{4}\b|stack|<|\bat\s/i.test(r)?r:s.includes("unauthorized")||s.includes("unauthenticated")||s.includes("로그인 세션")?"로그인이 필요하거나 세션이 만료되었습니다. 페이지를 새로고침한 뒤 다시 시도해 주세요.":s.includes("permission denied")||s.includes("forbidden")||s.includes("access denied")||s.includes(" 403")?"이 작업을 수행할 권한이 없습니다.":s.includes("not found")||s.includes("no such")||s.includes("does not exist")?"대상을 찾을 수 없습니다. 목록을 새로고침한 뒤 다시 시도해 주세요.":s.includes("transaction")&&(s.includes("closed")||s.includes("timeout")||s.includes("aborted")||s.includes("expired"))?"한 번에 처리할 양이 많아 시간이 초과되었습니다. 나눠서 다시 시도해 주세요.":s.includes("econnreset")||s.includes("econnrefused")||s.includes("fetch failed")||s.includes("socket hang up")||s.includes("enotfound")||s.includes("network")?"서버 연결이 불안정합니다. 잠시 후 다시 시도해 주세요.":s.includes("timeout")||s.includes("timed out")||s.includes("etimedout")?"서버 응답 시간이 초과되었습니다. 잠시 후 다시 시도해 주세요.":s.includes("unique constraint")||s.includes("p2002")||s.includes("duplicate key")?"이미 등록되어 있는 항목입니다.":s.includes("no file provided")||s.includes("file provided")?"파일이 첨부되지 않았습니다. 파일을 선택한 뒤 다시 시도해 주세요.":s.includes("prisma")||/\bp\d{4}\b/.test(s)||s.includes("database")||s.includes("column ")||s.includes("relation ")?"데이터를 저장하는 중 문제가 발생했습니다. 잠시 후 다시 시도해 주세요.":t:t}},60706:function(e,t,r){r.d(t,{T:function(){return s}});function s(e){let t=String(e).trim().replace(/[^0-9]/g,"");return/^\d{5}$/.test(t)?{grade:parseInt(t[0]),classNum:parseInt(t.slice(1,3)),number:parseInt(t.slice(3))}:/^\d{4}$/.test(t)?{grade:parseInt(t[0]),classNum:parseInt(t[1]),number:parseInt(t.slice(2))}:null}},74791:function(e,t,r){r.d(t,{DX:function(){return i},RM:function(){return n}});var s=r(60706);let a=["학년","반","번호","이름"];async function n(){let e=await Promise.all([r.e(1425),r.e(6919)]).then(r.bind(r,2093)),t=e.utils.book_new(),s=e.utils.aoa_to_sheet([a]);
1["A1","B1","C1","D1"].forEach(e=>{s[e]&&(s[e].s={alignment:{horizontal:"center"}})}),e.utils.book_append_sheet(t,s,"Sheet1"),e.writeFile(t,"내모_학생명단_양식.xlsx")}async function l(e){let t=await Promise.all([r.e(1425),r.e(6919)]).then(r.bind(r,2093)),a=t.read(new Uint8Array(e),{type:"array"}),n=a.SheetNames[0],l=a.Sheets[n],i=t.utils.sheet_to_json(l,{header:1}),d=-1,c={grade:-1,class:-1,number:-1,name:-1,memo:-1};for(let e=0;e<Math.min(i.length,5);e++){let t=i[e];if(Array.isArray(t)&&(t.forEach((e,t)=>{let r=String(e).trim();r.includes("학년")&&(c.grade=t),("반"===r||r.includes("학급")||r.includes("반"))&&(c.class=t),r.includes("번호")&&(c.number=t),(r.includes("이름")||r.includes("성명"))&&(c.name=t),(r.includes("비고")||r.includes("기록")||r.includes("메모"))&&(c.memo=t)}),-1!==c.number&&-1!==c.name)){d=e;break}}let o=[];return(-1!==d?i.slice(d+1):i).forEach(e=>{let t,r;if(!Array.isArray(e)||0===e.length)return;let a=0,n="",l="",i="number"==typeof e[2]||/^\d+$/.test(e[2])?parseInt(e[2]):NaN,u=e[3];if(-1===d&&e.length>=4&&!isNaN(i)&&"string"==typeof u&&/^[가-힣a-zA-Z\s]{2,20}$/.test(u.trim()))t=parseInt(String(e[0]).replace(/[^0-9]/g,""))||void 0,r=String(e[1]).replace(/[^0-9]/g,""),a=i,n=u.trim();else if(-1!==d&&-1!==c.number&&-1!==c.name){let s=e[c.number],i=e[c.name];s&&i&&(a=parseInt(String(s).replace(/[^0-9]/g,"")),n=String(i).trim(),-1!==c.grade&&(t=parseInt(String(e[c.grade]).replace(/[^0-9]/g,""))||void 0),-1!==c.class&&(r=String(e[c.class]).replace(/[^0-9]/g,"")),-1!==c.memo&&(l=String(e[c.memo])))}else if(-1===d&&e.length>=2){let l=String(e[0]).trim(),i=String(e[1]).trim(),d=(0,s.T)(l);d&&/^[가-힣a-zA-Z\s]{2,20}$/.test(i)&&(t=d.grade,r=String(d.classNum),a=d.number,n=i)}n||e.forEach(e=>{if("number"!=typeof e||a){if("string"==typeof e){let t=e.trim();!a&&/^\d+$/.test(t)?a=parseInt(t):!n&&/^[가-힣a-zA-Z\s]{2,20}$/.test(t)&&(n=t.trim())}}else a=e}),a&&n&&o.push({number:a,name:n,memo:l,grade:t,classNum:r?parseInt(r,10):void 0})}),o.sort((e,t)=>{let r=(Number(e.grade)||0)-(Number(t.grade)||0);if(0!==r)return r;let s=(Number(e.classNum)||0)-(Number(t.classNum)||0);return 0!==s?s:(Number(e.number)||0)-(Number(t.number)||0)})}async function i(e){return l(await e.arrayBuffer())}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.