PageSourceSearch

https://naemo.ai/_next/static/chunks/8588.cc3683502b819d06.js

js naemo.ai collected 2026-09-24 14:31:55 UTC 14,994 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8588,6919,4635],{20067:function(){},72061:function(){},73947:function(e,t,n){"use strict";n.d(t,{_O:function(){return o},no:function(){return u},parseGradeExcel:function(){return g}});var r=n(2093);let l={국어:"국어","화법과 작문":"국어",독서:"국어","언어와 매체":"국어",문학:"국어","실용 국어":"국어","심화 국어":"국어","고전 읽기":"국어",공통국어1:"국어",공통국어2:"국어","화법과 언어":"국어","독서와 작문":"국어","주제 탐구 독서":"국어","문학과 영상":"국어","직무 의사소통":"국어","독서 토론과 글쓰기":"국어","매체 의사소통":"국어","언어생활 탐구":"국어",수학:"수학",수학Ⅰ:"수학",수학Ⅱ:"수학",미적분:"수학","확률과 통계":"수학","기본 수학":"수학","실용 수학":"수학","인공지능 수학":"수학",기하:"수학","경제 수학":"수학","수학과제 탐구":"수학",공통수학1:"수학",공통수학2:"수학",기본수학1:"수학",기본수학2:"수학",대수:"수학",미적분Ⅰ:"수학",미적분Ⅱ:"수학",직무수학:"수학","수학과 문화":"수학","실용 통계":"수학",영어:"영어","영어 회화":"영어",영어Ⅰ:"영어",영어Ⅱ:"영어","영어 독해와 작문":"영어","기본 영어":"영어","실용 영어":"영어","영어권 문화":"영어","진로 영어":"영어","영미 문학 읽기":"영어",공통영어1:"영어",공통영어2:"영어",기본영어1:"영어",기본영어2:"영어","영어 발표와 토론":"영어","심화 영어":"영어","심화 영어 독해와 작문":"영어","직무 영어":"영어","실생활 영어 회화":"영어","미디어 영어":"영어","세계 문화와 영어":"영어",한국사:"한국사",한국사1:"한국사",한국사2:"한국사",사회:"사회(역사/도덕 포함)",통합사회:"사회(역사/도덕 포함)",한국지리:"사회(역사/도덕 포함)",세계지리:"사회(역사/도덕 포함)",세계사:"사회(역사/도덕 포함)",동아시아사:"사회(역사/도덕 포함)",경제:"사회(역사/도덕 포함)","정치와 법":"사회(역사/도덕 포함)",사회·문화:"사회(역사/도덕 포함)","생활과 윤리":"사회(역사/도덕 포함)","윤리와 사상":"사회(역사/도덕 포함)",여행지리:"사회(역사/도덕 포함)","고전과 윤리":"사회(역사/도덕 포함)",통합사회1:"사회(역사/도덕 포함)",통합사회2:"사회(역사/도덕 포함)","세계시민과 지리":"사회(역사/도덕 포함)","사회와 문화":"사회(역사/도덕 포함)","현대사회와 윤리":"사회(역사/도덕 포함)","역사로 탐구하는 현대 세계":"사회(역사/도덕 포함)","사회문제 탐구":"사회(역사/도덕 포함)","금융과 경제생활":"사회(역사/도덕 포함)","윤리문제 탐구":"사회(역사/도덕 포함)","기후변화와 지속가능한 세계":"사회(역사/도덕 포함)","도시의 미래 탐구":"사회(역사/도덕 포함)","동아시아 역사 기행":"사회(역사/도덕 포함)","정치\xb7법과 사회":"사회(역사/도덕 포함)","국제 관계의 이해":"사회(역사/도덕 포함)","인문학과 윤리":"사회(역사/도덕 포함)",통합과학:"과학",과학탐구실험:"과학",물리학Ⅰ:"과학",물리학Ⅱ:"과학",화학Ⅰ:"과학",화학Ⅱ:"과학",생명과학Ⅰ:"과학",생명과학Ⅱ:"과학",지구과학Ⅰ:"과학",지구과학Ⅱ:"과학",융합과학:"과학",통합과학1:"과학",통합과학2:"과학",과학탐구실험1:"과학",과학탐구실험2:"과학",물리학:"과학",화학:"과학",생명과학:"과학",지구과학:"과학","역학과 에너지":"과학","전자기와 양자":"과학","물질과 에너지":"과학","화학반응의 세계":"과학","세포와 물질대사":"과학","생물의 유전":"과학",지구시스템과학:"과학",행성우주과학:"과학","과학의 역사와 문화":"과학","기후변화와 환경생태":"과학","융합과학 탐구":"과학",기술·가정:"기술\xb7가정/제2외국어/한문/교양",정보:"기술\xb7가정/제2외국어/한문/교양",일본어:"기술\xb7가정/제2외국어/한문/교양",중국어:"기술\xb7가정/제2외국어/한문/교양",일본어Ⅰ:"기술\xb7가정/제2외국어/한문/교양",중국어Ⅰ:"기술\xb7가정/제2외국어/한문/교양",일본어Ⅱ:"기술\xb7가정/제2외국어/한문/교양",중국어Ⅱ:"기술\xb7가정/제2외국어/한문/교양","진로와 직업":"기술\xb7가정/제2외국어/한문/교양",환경:"기술\xb7가정/제2외국어/한문/교양","보건 간호":"기술\xb7가정/제2외국어/한문/교양","인공지능 기초":"기술\xb7가정/제2외국어/한문/교양","데이터 과학":"기술\xb7가정/제2외국어/한문/교양","소프트웨어와 생활":"기술\xb7가정/제2외국어/한문/교양","인공지능과 미래 사회":"기술\xb7가정/제2외국어/한문/교양",체육:"체육","스포츠 생활":"체육","운동과 건강":"체육","스포츠 과학":"체육","스포츠 헬스케어":"체육",음악:"예술",미술:"예술","음악 연주":"예술","미술 창작":"예술","음악과 미디어":"예술","미술과 매체":"예술","예술적 감성과 표현":"예술"},i={Ⅰ:"1",Ⅱ:"2",Ⅲ:"3",Ⅳ:"4",Ⅴ:"5",Ⅵ:"6",Ⅶ:"7",Ⅷ:"8",Ⅸ:"9",Ⅹ:"10",ⅰ:"1",ⅱ:"2",ⅲ:"3",ⅳ:"4",ⅴ:"5"};function u(e){return e.replace(/[ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅰⅱⅲⅳⅴ]/g,e=>i[e]||e)}function s(e){return u(e).replace(/\s/g,"")}let a=Object.fromEntries(Object.entries(l).map(e=>{let[t,n]=e;return[s(t),n]})),c={NUM:"NUM",NAME:"NAME",YEAR:"YEAR",SEM:"SEM",CATE:"CATE",SUBJ:"SUBJ",UNIT:"UNIT",SCORE_INFO:"SCORE_INFO",ACH_INFO:"ACH_INFO",RANK:"RANK",DIST_RATIO:"DIST_RATIO"};function o(e,t){if(!e)return t||"";if(l[e])return l[e];let n=s(e);return a[n]?a[n]:e.includes("외국어")?"기술\xb7가정/제2외국어/한문/교양":t||""}function d(e){let t=e.map(e=>String(e).replace(/\s/g,""));return t.includes("번호")&&(t.includes("성명")||t.includes("이름"))}function f(e){if(!e||"-"===e)return{achievement:null,studentsCount:null};let t=e.replace(/\s/g,""),n=t.match(/^([A-EFP])\((\d+)\)$/);if(n)return{achievement:n[1],studentsCount:parseInt(n[2])};if(/^[A-EFP]$/.test(t))return{achievement:t,studentsCount:null};let r=t.match(/^(\d+)$/);return r?{achievement:null,studentsCount:parseInt(r[1])}:{achievement:null,studentsCount:null}}function m(e){if(!e||""===e.trim())return null;let t=e.trim();if("P"===t||"F"===t)return t;let n=parseFloat(t);return isNaN(n)?null:n}function h(e,t){let n={};return e.forEach((e,t)=>{let r=String(e).replace(/\s/g,"");r.includes("번호")?n[c.NUM]=t:r.includes("성명")||r.includes("이름")?n[c.NAME]=t:"학년"===r?n[c.YEAR]=t:"학기"===r?n[c.SEM]=t:r.includes("교과")?n[c.CATE]=t:"과목"===r?n[c.SUBJ]=t:r.
1includes("학점")||r.includes("단위")||r.includes("이수단위")?n[c.UNIT]=t:r.includes("원점수")&&r.includes("과목평균")?n[c.SCORE_INFO]=t:r.includes("성취도별분포비율")||r.includes("분포비율")?n[c.DIST_RATIO]=t:r.includes("성취도")||r.includes("수강자수")||r.includes("수강자")?n[c.ACH_INFO]=t:(r.includes("석차등급")||r.includes("석차")&&!r.includes("성취도"))&&(n[c.RANK]=t)}),n}async function g(e){var t,n;let l=r.read(e,{type:"array"}),i=l.SheetNames[0],s=l.Sheets[i],a=r.utils.sheet_to_json(s,{header:1,defval:""});for(let e=0;e<Math.min(10,a.length);e++)if((a[e]||[]).join(" ").trim().includes("전과목 성적 일람표"))throw Error("중간고사 성적 일람표로 보입니다. '내신 성적' 대신 '중간고사 성적' 탭에서 업로드해주세요.");let g=null,S=null;for(let e=0;e<Math.min(20,a.length);e++){let t=(a[e]||[]).join(" ").trim(),n=t.match(/(\d+)\s*학년\s*(\d+)\s*반/)||t.match(/(\d+)\s*-\s*(\d+)/);if(n){g=parseInt(n[1]),S=parseInt(n[2]);break}}let N=-1,p={};for(let e=0;e<Math.min(50,a.length);e++){let t=a[e]||[];if(d(t)){N=e,p=h(t,!1);break}}if(-1===N)throw Error("엑셀 파일에서 적절한 헤더를 찾을 수 없습니다. ('번호', '성명', '과목' 등 포함 필요)");let v=[],A=null,E=null,I=null,C=null,M=null,b=!1;for(let e=N+1;e<a.length;e++){let t=a[e];if(!t||0===t.length)continue;if(function(e){let t=e.join("");return t.includes("진로 선택 과목")||t.includes("진로선택과목")}(t)){b=!0;continue}if(d(t)){p=h(t,b);continue}if(function(e){let t=String(e[0]||"");return t.includes("이수학점 합계")||t.includes("이수학점합계")}(t)||String(t[0]).includes("고등학교"))continue;let n=void 0!==p[c.SUBJ]?String(t[p[c.SUBJ]]||"").trim():"";if(!n&&"5"in t&&(n=String(t[5]).trim()),!n||/\d+\/\d+/.test(n))continue;let r=void 0!==p[c.NUM]?t[p[c.NUM]]:null,l=void 0!==p[c.NAME]?t[p[c.NAME]]:null,i=void 0!==p[c.YEAR]?t[p[c.YEAR]]:null,s=void 0!==p[c.SEM]?t[p[c.SEM]]:null;if(r&&String(r).trim()){let e=parseInt(String(r));isNaN(e)||(A=e)}if(l&&String(l).trim()&&(E=String(l).trim()),i&&String(i).trim()){let e=String(i).match(/(\d+)/);e&&(I=parseInt(e[1]))}if(s&&String(s).trim()){let e=String(s).match(/(\d+)/);e&&(C=parseInt(e[1]))}if(!A||!E)continue;let N=void 0!==p[c.CATE]?String(t[p[c.CATE]]||""):"";!N&&"4"in t&&(N=String(t[4])),N.trim()&&(M=N.trim());let _=N.trim()||M||"",j=p[c.UNIT],O=void 0!==j&&parseInt(String(t[j]||"0"))||0,R=function(e,t){if(!e||""===e.trim())return{rawScore:null,subjectAverage:null,standardDeviation:null};let n=e.replace(/\s/g,""),r=n.match(/^(\d+(?:\.\d+)?)\/(\d+(?:\.\d+)?)\((\d+(?:\.\d+)?)\)$/);if(r)return{rawScore:parseFloat(r[1]),subjectAverage:parseFloat(r[2]),standardDeviation:parseFloat(r[3])};let l=n.match(/^(\d+(?:\.\d+)?)\/(\d+(?:\.\d+)?)$/);if(l)return{rawScore:parseFloat(l[1]),subjectAverage:t?null:parseFloat(l[2]),standardDeviation:null};let i=n.match(/^(\d+(?:\.\d+)?)$/);return i?{rawScore:parseFloat(i[1]),subjectAverage:null,standardDeviation:null}:{rawScore:null,subjectAverage:null,standardDeviation:null}}(void 0!==p[c.SCORE_INFO]?String(t[p[c.SCORE_INFO]]||""):"",b),F=1===g||2===g,w=null,T=null;if(void 0!==p[c.ACH_INFO]){let e=f(String(t[p[c.ACH_INFO]]||""));w=e.achievement,T=e.studentsCount}if(null===T&&!F&&void 0!==p[c.RANK]){let e=String(t[p[c.RANK]]||"").match(/\/(\d+)/);e&&(T=parseInt(e[1]))}if(!w)for(let e=7;e<=9;e++){if(!(String(e) in t))continue;let n=String(t[e]||"");if(!/\d+\/\d+/.test(n)){let e=f(n);if(e.achievement){w=e.achievement,e.studentsCount&&(T=e.studentsCount);break}}}let y=null;if(void 0!==p[c.RANK]&&(y=m(String(t[p[c.RANK]]||""))),null===y&&!b&&"9"in t){let e=String(t[9]||"");if(e.length<5&&!e.includes("/")){let t=m(e);null!==t&&(y=t)}}v.push({currentGrade:g||0,currentClass:S||0,studentNumber:A,studentName:E,year:I||g||0,semester:C||1,subjectCategory:o(n,_),subjectName:u(n),credits:O,rawScore:R.rawScore,subjectAverage:R.subjectAverage,standardDeviation:R.standardDeviation,achievement:w,studentsCount:T,gradeRank:y,isCareerSubject:b,...function(e){let t;if(!e||""===e.trim())return{};let n={},r=/([A-E])\(([\d.]+)\)/g;for(;null!==(t=r.exec(e));){let e=t[1],r=parseFloat(t[2]);
1isNaN(r)||(n["dist".concat(e)]=r)}return n}(void 0!==p[c.DIST_RATIO]?String(t[p[c.DIST_RATIO]]||""):"")})}return{schoolName:null,gradeClass:g&&S?"".concat(g,"학년 ").concat(S,"반"):null,totalStudents:new Set(v.map(e=>e.studentNumber)).size,totalRecords:v.length,year:(null===(t=v[0])||void 0===t?void 0:t.year)||g||null,semester:(null===(n=v[0])||void 0===n?void 0:n.semester)||1,parsedData:v}}},44004:function(e,t,n){"use strict";n.d(t,{parseMidtermExcel:function(){return s}});var r=n(2093),l=n(73947);let i=[10,34,66,90,100],u=[4,11,23,40,60,77,89,96,100];async function s(e){var t,n;let s=r.read(e,{type:"array"}),a=s.SheetNames[0],c=s.Sheets[a],o=r.utils.sheet_to_json(c,{header:1,defval:""});for(let e=0;e<Math.min(10,o.length);e++)if((o[e]||[]).join(" ").trim().includes("교과학습발달상황"))throw Error("내신 성적 파일로 보입니다. '중간고사' 대신 '내신 성적' 탭에서 업로드해주세요.");let d=0,f=0,m=0;for(let e=0;e<Math.min(10,o.length);e++){let t=(o[e]||[]).join(" ").trim(),n=t.match(/(\d{4})\s*학년도/);n&&(d=parseInt(n[1]));let r=t.match(/(?:제\s*)?(\d)\s*학기(?!도)/);r&&(f=parseInt(r[1]));let l=t.match(/(\d)\s*학년(?!도)/);l&&(m=parseInt(l[1]))}if(!m)throw Error("학년 정보를 찾을 수 없습니다. 파일 형식을 확인해주세요.");if(1!==f&&2!==f)throw Error("학기 정보(1학기/2학기)를 찾을 수 없습니다. 파일 위쪽에 '제1학기' 또는 '2학기'처럼 학기가 표시되어 있는지 확인해주세요.");let h=-1;for(let e=0;e<Math.min(20,o.length);e++){let t=(o[e]||[]).map(e=>String(e).trim()).join("");if(t.includes("반")&&t.includes("번호")&&t.includes("성명")){h=e;break}}if(-1===h)throw Error("헤더 행을 찾을 수 없습니다. ('반', '번호', '성명' 포함 필요)");let g=o[h],S=[],N=-1,p=-1,v=-1;for(let e=0;e<g.length;e++){let n=String(g[e]||"").trim();if("반"===n){N=e;continue}if("번호"===n){p=e;continue}if("성명"===n){v=e;continue}let r=function(e){if(!e||"string"!=typeof e)return null;let t=e.replace(/\s+/g," ").trim();if(["총점","평균","반","번호","성명",""].includes(t))return null;let n=t.match(/^(.+?)\s*\((\d+)\)$/);return n?{name:n[1].trim(),credits:parseInt(n[2])}:null}(n);r&&S.push({name:r.name,credits:r.credits,colIndex:e,category:(t=r.name,(0,l._O)(t,"기타"))})}if(0===S.length)throw Error("과목 정보를 찾을 수 없습니다.");let A=[];for(let e=h+1;e<o.length;e++){let t=o[e];if(!t||0===t.length)continue;let n=String(t[N]||"").trim(),r=String(t[p]||"").trim(),l=String(t[v]||"").trim();if("총점"===n||"평균"===n)continue;let i=parseInt(n),u=parseInt(r);if(isNaN(i)||isNaN(u)||!l)continue;let s=new Map;for(let e of S){let n=t[e.colIndex];if(""===n||null==n)s.set(e.name,null);else{let t=parseFloat(String(n));s.set(e.name,isNaN(t)?null:t)}}A.push({classNum:i,studentNumber:u,studentName:l,scores:s})}let E=[];for(let e of S){let t=[];for(let n of A){let r=n.scores.get(e.name);null!=r&&t.push({student:n,score:r})}if(0===t.length)continue;t.sort((e,t)=>t.score-e.score);let r=t.length,s=t.reduce((e,t)=>e+t.score,0)/r,a=Math.sqrt(t.reduce((e,t)=>e+Math.pow(t.score-s,2),0)/r),c=1;for(let o=0;o<t.length;o++){o>0&&t[o].score<t[o-1].score&&(c=o+1);let d=t[o],h=c,g=h/r*100,S=function(e,t){let n=t>=3?u:i;for(let t=0;t<n.length;t++)if(e<=n[t])return t+1;return n.length}(g,m),N=(n=d.score)>=90?"A":n>=80?"B":n>=70?"C":n>=60?"D":"E";E.push({currentGrade:m,currentClass:d.student.classNum,studentNumber:d.student.studentNumber,studentName:d.student.studentName,year:m,semester:f,subjectCategory:e.category,subjectName:(0,l.no)(e.name),credits:e.credits,rawScore:d.score,subjectAverage:Math.round(10*s)/10,standardDeviation:Math.round(10*a)/10,achievement:N,studentsCount:r,gradeRank:S,isCareerSubject:!1,rank:h,percentile:Math.round(10*g)/10})}}return{year:d,semester:f,grade:m,subjects:S,students:A,gradeData:E}}}}]);

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.