@ihabdevteam/core 0.133.0 → 0.134.0

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.
Files changed (42) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/dist/components.cjs.js +176 -176
  3. package/dist/components.esm.css +1 -1
  4. package/dist/hooks.cjs.js +1 -1
  5. package/dist/i18n.cjs.js +2 -2
  6. package/dist/ihabdevteam-core.cjs.js +181 -181
  7. package/dist/ihabdevteam-core.d.ts +8 -2
  8. package/dist/packages/core/src/components/Breadcrumb.js +5 -1
  9. package/dist/packages/core/src/components/Dialog.js +32 -9
  10. package/dist/packages/core/src/components/Header.css +2 -0
  11. package/dist/packages/core/src/components/Header.js +4 -1
  12. package/dist/packages/core/src/components/LandingHeader.js +18 -1
  13. package/dist/packages/core/src/components/Pagination.js +5 -2
  14. package/dist/packages/core/src/components/Panel.d.ts +1 -1
  15. package/dist/packages/core/src/components/Panel.js +4 -1
  16. package/dist/packages/core/src/components/PassCard/passCardProduct.js +6 -0
  17. package/dist/packages/core/src/components/PaymentPlan.d.ts +6 -0
  18. package/dist/packages/core/src/components/PaymentPlan.js +5 -3
  19. package/dist/packages/core/src/components/PromoBanner.js +1 -1
  20. package/dist/packages/core/src/components/SideNav.js +1 -1
  21. package/dist/packages/core/src/components/SoundCompass.js +10 -1
  22. package/dist/packages/core/src/components/Tooltip/MenuTooltip.js +7 -2
  23. package/dist/packages/core/src/components/Training/TrainingStepTextBox.js +1 -1
  24. package/dist/packages/core/src/components/Training/useNoiseFade.js +22 -1
  25. package/dist/packages/core/src/components/Training/useTTSPlayback.js +9 -0
  26. package/dist/packages/core/src/components/Word/WordSearchResultBlock.js +3 -2
  27. package/dist/packages/core/src/hooks/useWordTrainingFilter.js +9 -4
  28. package/dist/packages/core/src/hooks/wordTrainingFilterModel.d.ts +1 -1
  29. package/dist/packages/core/src/hooks/wordTrainingFilterModel.js +7 -2
  30. package/dist/packages/core/src/i18n/locales/en.json +11 -0
  31. package/dist/packages/core/src/i18n/locales/ko.json +11 -0
  32. package/dist/packages/core/src/utils/format.js +17 -1
  33. package/dist/packages/core/src/utils/koreanPronunciation.js +7 -0
  34. package/dist/packages/core/src/utils/pressable.js +4 -0
  35. package/dist/packages/core/src/utils/savedWordTables.js +2 -1
  36. package/dist/packages/core/src/utils/wordTrainingPool.d.ts +7 -0
  37. package/dist/packages/core/src/utils/wordTrainingPool.js +30 -0
  38. package/dist/packages/core/src/utils/wordTrainingRuntime.js +27 -13
  39. package/dist/packages/core/src/version.d.ts +1 -1
  40. package/dist/packages/core/src/version.js +1 -1
  41. package/dist/utils.cjs.js +2 -2
  42. package/package.json +1 -1
@@ -9,7 +9,23 @@ import { toKstYmd } from './date';
9
9
  * 입력에 대시가 있든 없든, 어떤 포맷이든 처리.
10
10
  */
11
11
  export function formatPhone(raw) {
12
- const d = raw.replace(/\D/g, '').slice(0, 11);
12
+ const all = raw.replace(/\D/g, '');
13
+ /* **앞자리가 네 자리인 번호.** 050X 안심번호·0303 착신전환은 열두 자리까지 가고, 앞자리를 세 자리로 보면
14
+ `0507-1234-5678` 이 `050-7123-4567` 이 되어 **마지막 한 자리가 사라진 채** 멀쩡한 모양으로 저장됐다
15
+ (말귀가 formatPhoneKr 로 감싸 두었다 — 이제 걷어도 된다). */
16
+ if (/^(050\d|0303)/.test(all)) {
17
+ const d = all.slice(0, 12);
18
+ if (d.length <= 4)
19
+ return d;
20
+ if (d.length <= 8)
21
+ return `${d.slice(0, 4)}-${d.slice(4)}`;
22
+ return `${d.slice(0, 4)}-${d.slice(4, d.length - 4)}-${d.slice(d.length - 4)}`;
23
+ }
24
+ /* **대표번호**(1588·1544·1600·1899 …)는 여덟 자리 4-4 다 — 세 자리 앞자리로 보면 `158-8-1234` 가 됐다. */
25
+ if (/^1[5-9]\d{2}/.test(all) && all.length <= 8) {
26
+ return all.length <= 4 ? all : `${all.slice(0, 4)}-${all.slice(4)}`;
27
+ }
28
+ const d = all.slice(0, 11);
13
29
  if (d.startsWith('02')) {
14
30
  if (d.length <= 2)
15
31
  return d;
@@ -147,6 +147,13 @@ export function toStandardPronunciation(word) {
147
147
  cur.jong = cur.jong === JONG_NH ? JONG_N : cur.jong === JONG_RH ? JONG_R : JONG_NONE;
148
148
  continue;
149
149
  }
150
+ // 받침 ㅎ 계열 + 초성 ㅅ — ㅎ 은 떨어지고 ㅅ 은 된소리(표준발음법 제12항 2: 닿소 → 다쏘, 많소 → 만쏘, 싫소 → 실쏘).
151
+ // 전에는 이 갈래가 없어 끝소리 규칙으로 ㅎ 이 ㄷ 이 되어 '놓소 → 녿쏘' 가 나왔다.
152
+ if ((cur.jong === JONG_H || cur.jong === JONG_NH || cur.jong === JONG_RH) && next.cho === CHO_S) {
153
+ next.cho = CHO_SS;
154
+ cur.jong = cur.jong === JONG_NH ? JONG_N : cur.jong === JONG_RH ? JONG_R : JONG_NONE;
155
+ continue;
156
+ }
150
157
  // 받침 ㄱㄷㅂㅈ 계열 + 초성 ㅎ (먹히다 → 머키다, 앉히다 → 안치다, 읽히다 → 일키다)
151
158
  if (next.cho === CHO_H) {
152
159
  if (cur.jong === JONG_NJ) {
@@ -22,6 +22,10 @@ export function pressable(onPress, 옵션) {
22
22
  tabIndex: 0,
23
23
  ...(옵션?.selected === undefined ? {} : { 'aria-selected': 옵션.selected }),
24
24
  onKeyDown: (e) => {
25
+ /* **이 자리 자신에서 난 키만** 받는다. 안에 든 진짜 단추(랜딩 띠의 action 등)에서 누른 Enter 가 올라오면
26
+ 전에는 여기서 preventDefault 해 그 단추의 click 을 막고 이 자리의 onPress 를 대신 불렀다. */
27
+ if (e.target !== e.currentTarget)
28
+ return;
25
29
  if (e.key !== 'Enter' && e.key !== ' ')
26
30
  return;
27
31
  /* Space 는 그냥 두면 화면이 굴러간다 — 누름으로 바꾼다 */
@@ -56,11 +56,12 @@ export function duplicateTable(id) {
56
56
  const original = tables.find(t => t.id === id);
57
57
  if (!original)
58
58
  return null;
59
+ /* 사본도 설명·검색 구성·묶음을 가진다 — 전에는 items 만 옮겨, 사본을 '수정' 하면 검색 패널이 복원되지 않았다. */
59
60
  const copy = {
61
+ ...original,
60
62
  id: `${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,
61
63
  name: `${original.name} (복사)`,
62
64
  savedAt: new Date().toISOString(),
63
- items: original.items,
64
65
  };
65
66
  try {
66
67
  localStorage.setItem(STORAGE_KEY, JSON.stringify([copy, ...tables]));
@@ -49,3 +49,10 @@ export declare function buildUsablePool(opts: GenOptions): Promise<Array<{
49
49
  word: MvpWord;
50
50
  usable: string[];
51
51
  }>>;
52
+ /**
53
+ * 정답(문제) 단어 거르개 — **난이도 등급 · 단어 구성(초성/중성/종성/받침없음 · 음절 수)**.
54
+ * buildUsablePool 이 후보에 거는 것과 같은 규칙이다(글자입력=철자, 발음입력=표준발음으로 본다).
55
+ * 실단어를 직접 고르는 생성기(음소 합성·받침/자음 탈락·음절 바꾸기)가 이것을 안 걸어, 설정한 필터와 무관한
56
+ * 문제를 냈다(초성 ㄱ·1등급인데 '카·라·파…'). 거를 것이 없으면 null.
57
+ */
58
+ export declare function answerWordFilter(opts: GenOptions): ((w: MvpWord) => boolean) | null;
@@ -216,6 +216,36 @@ function _positionalPredicate(composition) {
216
216
  }
217
217
  // 대립(오답) 엔진은 공용 모듈 wordContrast.ts 로 분리 — hasStructureContrast, buildMultiPartPosContrast,
218
218
  // minimalPairDistractors 등은 거기서 import 한다(런타임과 훈련/단어표 만들기가 공유).
219
+ /**
220
+ * 정답(문제) 단어 거르개 — **난이도 등급 · 단어 구성(초성/중성/종성/받침없음 · 음절 수)**.
221
+ * buildUsablePool 이 후보에 거는 것과 같은 규칙이다(글자입력=철자, 발음입력=표준발음으로 본다).
222
+ * 실단어를 직접 고르는 생성기(음소 합성·받침/자음 탈락·음절 바꾸기)가 이것을 안 걸어, 설정한 필터와 무관한
223
+ * 문제를 냈다(초성 ㄱ·1등급인데 '카·라·파…'). 거를 것이 없으면 null.
224
+ */
225
+ export function answerWordFilter(opts) {
226
+ const gradeSet = opts.grade && opts.grade.length > 0 ? new Set(opts.grade) : null;
227
+ const composition = opts.composition ?? null;
228
+ const syllableSet = composition?.syllable != null
229
+ ? new Set(Array.isArray(composition.syllable) ? composition.syllable : [composition.syllable])
230
+ : null;
231
+ const preds = composition
232
+ ? [
233
+ _positionalPredicate(composition),
234
+ syllableSet ? (word) => syllableSet.has(syllableLength(word)) : null,
235
+ ].filter((p) => p != null)
236
+ : [];
237
+ if (!gradeSet && preds.length === 0)
238
+ return null;
239
+ const pron = opts.phonemeView === 'pron';
240
+ return (w) => {
241
+ if (gradeSet && (!w.grade || !gradeSet.has(w.grade)))
242
+ return false;
243
+ if (preds.length === 0)
244
+ return true;
245
+ const target = pron ? pronOfWord(w.w) : w.w;
246
+ return preds.every(pred => pred(target));
247
+ };
248
+ }
219
249
  async function _buildUsablePool(opts) {
220
250
  const { difficulty = null, choseong = null, composition = null, targetSyllable = null, excludeNoImage = false } = opts;
221
251
  // 난이도 등급('1'~'4') 필터 — 정답(후보) 단어에만 적용(구성 필터와 동일 원칙, 오답 풀은 무관)
@@ -17,7 +17,7 @@ export { CAPABILITY, cardGroupOf, isValidQuestionWord, hasQuestionWordConstraint
17
17
  import { CAPABILITY, QUESTION_WORD_RULE } from './wordTrainingRuntimeTypes';
18
18
  import { buildDropContrastProblem, buildDropContrast3Problem, buildDropCompoundProblem, buildDropFinalConsonantProblem, buildRemoveConsonantProblem, buildChangeWholeSyllableProblem, buildSyllableMaskIndex } from './wordTrainingGenerators';
19
19
  /* 재료 고르기(풀 추리기·캐시·오답 샘플링)는 wordTrainingPool 로 갈라 두었다. */
20
- import { MVP, buildUsablePool, filterByCachedImage, getPronMap, nextId, pickOne, sample, sampleDistinctPron, _poolCacheKey, _EMPTY_SET, } from './wordTrainingPool';
20
+ import { MVP, buildUsablePool, filterByCachedImage, getPronMap, nextId, pickOne, sample, sampleDistinctPron, _poolCacheKey, _EMPTY_SET, answerWordFilter, } from './wordTrainingPool';
21
21
  // ────────────────────────────────────────────────────────────────────────────
22
22
  // 카테고리별 generator
23
23
  // ────────────────────────────────────────────────────────────────────────────
@@ -100,11 +100,17 @@ async function genIncluded(opts) {
100
100
  async function genSameOrDiff(opts) {
101
101
  const { count = 10 } = opts;
102
102
  const pool = (await buildUsablePool(opts)).filter(e => e.usable.length >= 1);
103
- return Array.from({ length: count }, (_, i) => {
104
- const entry = pickOne(pool);
105
- if (!entry)
106
- return null;
107
- const isSame = i % 2 === 0;
103
+ if (!pool.length)
104
+ return [];
105
+ /* 같음·다름을 **절반씩 섞어** 둔다. 전에는 i % 2 로 정해 늘 같음·다름·같음… 순서라 듣지 않고도 답을 맞힐 수
106
+ 있었고, 단어를 복원추출(pickOne)해 풀이 작지 않아도 같은 단어가 여러 문항에 나왔다. 풀이 문항 수보다 크면
107
+ 겹치지 않게 뽑는다. */
108
+ const entries = pool.length >= count
109
+ ? sample(pool, count)
110
+ : shuffle(Array.from({ length: count }, (_, i) => pool[i % pool.length]));
111
+ const sameFlags = shuffle(Array.from({ length: count }, (_, i) => i < Math.ceil(count / 2)));
112
+ return entries.map((entry, i) => {
113
+ const isSame = sameFlags[i];
108
114
  let pair;
109
115
  if (isSame)
110
116
  pair = [entry.word.w, entry.word.w];
@@ -119,7 +125,7 @@ async function genSameOrDiff(opts) {
119
125
  pair,
120
126
  same: isSame,
121
127
  };
122
- }).filter((x) => Boolean(x));
128
+ });
123
129
  }
124
130
  /**
125
131
  * STARTS_WITH_SAME_SOUND
@@ -260,10 +266,14 @@ async function genChangeWholeSyll(N, opts, idPrefix) {
260
266
  const maskIndex = buildSyllableMaskIndex(wordSet);
261
267
  const phonemeView = opts.phonemeView ?? 'char';
262
268
  const comp = opts.composition ?? null;
269
+ // 등급은 정답(문제) 단어에만 건다 — 오답 탐색 풀(maskIndex)은 그대로(buildUsablePool 과 같은 원칙). 전에는 등급이 빠졌다.
270
+ const answerOk = answerWordFilter({ grade: opts.grade });
263
271
  const out = [];
264
272
  for (const w of shuffle(words)) {
265
273
  if (out.length >= count)
266
274
  break;
275
+ if (answerOk && !answerOk(w))
276
+ continue;
267
277
  const prob = buildChangeWholeSyllableProblem(w.w, comp, pronMap, phonemeView, maskIndex, null, null);
268
278
  if (!prob)
269
279
  continue;
@@ -449,13 +459,17 @@ async function genListenAndRememberOrder(opts) {
449
459
  // 음소 단위(합성/탈락) — 실단어 데이터 기반. 이미지 필터 적용.
450
460
  // ────────────────────────────────────────────────────────────────────────────
451
461
  /** N음절 실단어(이미지 필터 적용) 중 조건(pred: 첫 음절 분해값 기준)을 만족하는 것 */
452
- function realWordsOfLen(N, excludeNoImage, pred) {
462
+ function realWordsOfLen(N, opts, pred) {
453
463
  const all = MVP.filter(w => w.w && w.s === N);
454
- const ok = excludeNoImage ? filterByCachedImage(all.map(w => w.w)) : null;
464
+ const ok = opts.excludeNoImage ? filterByCachedImage(all.map(w => w.w)) : null;
465
+ // 설정한 등급·단어 구성도 건다 — 전에는 음절 수·이미지만 봐서 필터와 무관한 문제가 나왔다
466
+ const answerOk = answerWordFilter(opts);
455
467
  const out = [];
456
468
  for (const mw of all) {
457
469
  if (ok && !ok.has(mw.w))
458
470
  continue;
471
+ if (answerOk && !answerOk(mw))
472
+ continue;
459
473
  if (pred) {
460
474
  const s = parseSyllable(mw.w);
461
475
  if (!s || !pred(s))
@@ -467,7 +481,7 @@ function realWordsOfLen(N, excludeNoImage, pred) {
467
481
  }
468
482
  /** MERGE_2_PHONEMES — 초성+모음 합쳐 1음절(받침 없음). 실단어 데이터 기반 */
469
483
  function genMerge2Phonemes(opts) {
470
- const pool = realWordsOfLen(1, opts.excludeNoImage ?? false, s => s.jong === 0);
484
+ const pool = realWordsOfLen(1, opts, s => s.jong === 0);
471
485
  return sample(pool, opts.count ?? 10).map((e, i) => {
472
486
  const s = parseSyllable(e.w);
473
487
  return { id: nextId('M2P-item'), index: i + 1, parts: [CHOSEONG[s.cho], JUNGSEONG[s.jung]], answer: e.w, word: e.w };
@@ -476,7 +490,7 @@ function genMerge2Phonemes(opts) {
476
490
  /** MERGE_3_PHONEMES — 초성+모음+종성 합쳐 1음절(홑받침). 실단어 데이터 기반 */
477
491
  function genMerge3Phonemes(opts) {
478
492
  // 홑받침만(겹받침은 음소 2개라 '3음소'가 아니게 됨)
479
- const pool = realWordsOfLen(1, opts.excludeNoImage ?? false, s => s.jong > 0 && !JONG_DECOMPOSE[s.jong]);
493
+ const pool = realWordsOfLen(1, opts, s => s.jong > 0 && !JONG_DECOMPOSE[s.jong]);
480
494
  return sample(pool, opts.count ?? 10).map((e, i) => {
481
495
  const s = parseSyllable(e.w);
482
496
  return { id: nextId('M3P-item'), index: i + 1, parts: [CHOSEONG[s.cho], JUNGSEONG[s.jung], JONGSEONG[s.jong]], answer: e.w, word: e.w };
@@ -486,7 +500,7 @@ function genMerge3Phonemes(opts) {
486
500
  * 풀 조건은 QUESTION_WORD_RULE와 공유 — 편집기 무작위 선택/검증이 이 규칙을 그대로 쓴다. */
487
501
  function genDropFinalConsonant(opts) {
488
502
  const rule = QUESTION_WORD_RULE.DROP_FINAL_CONSONANT_FROM_1SYLL;
489
- const pool = realWordsOfLen(rule.syllables, opts.excludeNoImage ?? false, rule.syllable);
503
+ const pool = realWordsOfLen(rule.syllables, opts, rule.syllable);
490
504
  const pronMap = getPronMap();
491
505
  const out = [];
492
506
  for (const e of shuffle(pool)) {
@@ -506,7 +520,7 @@ function genDropFinalConsonant(opts) {
506
520
  function genRemoveConsonant(opts) {
507
521
  // 받침 없는 자음 초성 1음절만 → 자음을 빼면 순수 모음 음절(ㅇ+모음)이 남는다.
508
522
  const rule = QUESTION_WORD_RULE.REMOVE_CONSONANT_AND_IDENTIFY_PHONEME;
509
- const pool = realWordsOfLen(rule.syllables, opts.excludeNoImage ?? false, rule.syllable);
523
+ const pool = realWordsOfLen(rule.syllables, opts, rule.syllable);
510
524
  const pronMap = getPronMap();
511
525
  const out = [];
512
526
  for (const e of shuffle(pool)) {
@@ -46,4 +46,4 @@
46
46
  *
47
47
  * 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
48
48
  */
49
- export declare const CORE_VERSION = "0.133.0";
49
+ export declare const CORE_VERSION = "0.134.0";
@@ -46,4 +46,4 @@
46
46
  *
47
47
  * 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
48
48
  */
49
- export const CORE_VERSION = '0.133.0';
49
+ export const CORE_VERSION = '0.134.0';
package/dist/utils.cjs.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var cn=require("i18next"),$e=typeof document<"u"?document.currentScript:null;function At(e,{onEnd:n,rate:t=.9}={}){if(typeof window>"u"||typeof SpeechSynthesisUtterance>"u"||!("speechSynthesis"in window)){n?.();return}const o=window.speechSynthesis,u=()=>{o.cancel();const i=new SpeechSynthesisUtterance(e),r=o.getVoices().find(a=>a.lang.startsWith("ko"));r&&(i.voice=r),i.rate=t,i.onend=n?function(a){try{n()}catch{}}:null,o.speak(i)};o.getVoices().length>0?u():o.addEventListener("voiceschanged",u,{once:!0})}function pt(){typeof window<"u"&&"speechSynthesis"in window&&window.speechSynthesis.cancel()}const wt=/^(?:[a-z]+:)?\/\//i,Cn="__ihab_core_asset_base_url__";function bt(e){const n=String(e||"").trim();return n?n.replace(/\/+$/,""):""}function _t(e){globalThis[Cn]=bt(e)}function gn(){return globalThis[Cn]??""}function Bt(e){const n=String(e||"").trim();if(!n)return"";if(wt.test(n)||n.startsWith("data:")||n.startsWith("blob:"))return n;const t=n.startsWith("/")?n:`/${n}`,o=gn();return o?`${o}${t}`:t}const dn="__ihab_core_storage_resolvers__";function Q(){return globalThis[dn]??null}function Nt(e){globalThis[dn]=e}let ve=class extends Error{constructor(n){super(`
1
+ "use strict";var gn=require("i18next"),ve=typeof document<"u"?document.currentScript:null;function At(e,{onEnd:n,rate:t=.9}={}){if(typeof window>"u"||typeof SpeechSynthesisUtterance>"u"||!("speechSynthesis"in window)){n?.();return}const o=window.speechSynthesis,r=()=>{o.cancel();const i=new SpeechSynthesisUtterance(e),u=o.getVoices().find(a=>a.lang.startsWith("ko"));u&&(i.voice=u),i.rate=t,i.onend=n?function(a){try{n()}catch{}}:null,o.speak(i)};o.getVoices().length>0?r():o.addEventListener("voiceschanged",r,{once:!0})}function pt(){typeof window<"u"&&"speechSynthesis"in window&&window.speechSynthesis.cancel()}const wt=/^(?:[a-z]+:)?\/\//i,dn="__ihab_core_asset_base_url__";function bt(e){const n=String(e||"").trim();return n?n.replace(/\/+$/,""):""}function _t(e){globalThis[dn]=bt(e)}function fn(){return globalThis[dn]??""}function Bt(e){const n=String(e||"").trim();if(!n)return"";if(wt.test(n)||n.startsWith("data:")||n.startsWith("blob:"))return n;const t=n.startsWith("/")?n:`/${n}`,o=fn();return o?`${o}${t}`:t}const hn="__ihab_core_storage_resolvers__";function Q(){return globalThis[hn]??null}function Nt(e){globalThis[hn]=e}let Ge=class extends Error{constructor(n){super(`
2
2
  [ihabdevteam-core] ${n}() \uD638\uCD9C \uC2E4\uD328 \u2014 configureStorage()\uAC00 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
3
3
 
4
4
  \uC571 \uCD08\uAE30\uD654 \uC2DC\uC810(main.tsx \uB4F1)\uC5D0 \uC544\uB798\uC640 \uAC19\uC774 \uD55C \uBC88 \uD638\uCD9C\uD558\uC138\uC694:
@@ -17,4 +17,4 @@
17
17
  \uC124\uCE58 \uBA85\uB839\uC5B4 (\uC2A4\uD1A0\uB9AC\uC9C0 SDK \uBBF8\uC124\uCE58 \uC2DC):
18
18
  npm install @supabase/supabase-js
19
19
  pnpm add @supabase/supabase-js
20
- `),this.name="StorageNotConfiguredError"}};function Lt(e){Nt(e)}function Rt(e,n){if(!e)return null;const t=Q();return t?.resolvePath?t.resolvePath(e,n):n?`${n}/${e}.mp3`:null}async function fn(e){if(!e)return!1;const n=Q();if(!n)throw new ve("fileExists");if(n.exists)return n.exists(e);try{return await n.resolveUrl(e)!==null}catch{return!1}}async function hn(e){if(!e)return null;const n=Q();if(!n)throw new ve("getSignedOrPublicUrl");try{return await n.resolveUrl(e)}catch{return null}}async function jt(e){const n=Q();if(!n)throw new ve("downloadSound");return n.download(e)}function Ot(){return Q()?.noiseBaseUrl??"/sounds/noise"}function kt(){const e=Number(Q()?.noiseFileGain);return Number.isFinite(e)&&e>0?e:1}const Ge="__ihab_core_tts_config__";function It(e){globalThis[Ge]=e}function Mt(){return globalThis[Ge]?.urlResolver??null}function Pt(){return globalThis[Ge]?.fallbackUrlResolver??null}const $t=new Map;function vt(){$t.clear()}const mn="__ihab_core_pronunciation_resolver__";function Gt(e){globalThis[mn]=e}function Ft(){return globalThis[mn]??null}let Y=null;const te=new WeakMap,Fe=new WeakMap,xe=new WeakMap;let Sn=!1;const yn=e=>Math.max(0,Math.min(1,Number.isFinite(e)?e:0));function xt(){if(Sn||typeof document>"u")return;Sn=!0;const e=()=>{try{Y&&Y.state!=="running"&&Y.resume()}catch{}};for(const n of["pointerdown","touchend","keydown"])document.addEventListener(n,e,{capture:!0,passive:!0})}function Dn(){if(Y)return Y;try{const e=window.AudioContext||window.webkitAudioContext;return e?(Y=new e,xt(),Y):null}catch{return null}}function Wt(){try{Y?.resume()}catch{}}function We(e,n){const t=te.get(n);if(t)return t;try{const o=e.createMediaElementSource(n),u=e.createGain(),i=e.createAnalyser();i.fftSize=1024,i.smoothingTimeConstant=.6,u.gain.value=yn(Fe.get(n)??n.volume),o.connect(u),u.connect(i),u.connect(e.destination);try{n.volume=1}catch{}const r={gain:u,analyser:i};return te.set(n,r),r}catch{return null}}function En(e){if(!e)return Promise.resolve(null);const n=te.get(e);if(n)return Promise.resolve(n.analyser);const t=Dn();if(!t)return Promise.resolve(null);if(t.state==="running")return Promise.resolve(We(t,e)?.analyser??null);const o=xe.get(e);if(o)return o;const u=Promise.resolve().then(()=>t.resume()).then(()=>t.state==="running"?We(t,e)?.analyser??null:null).catch(()=>null).finally(()=>{xe.delete(e)});return xe.set(e,u),u}function Ht(e){if(!e)return null;const n=te.get(e);if(n)return n.analyser;const t=Dn();return t?t.state==="running"?We(t,e)?.analyser??null:(En(e),null):null}function Yt(e,n){const t=yn(n);Fe.set(e,t);const o=te.get(e);if(o){try{e.volume!==1&&(e.volume=1)}catch{}const u=o.gain.gain;try{const i=o.gain.context.currentTime;u.cancelScheduledValues(i),u.setTargetAtTime(t,i,.01)}catch{try{u.value=t}catch{}}return"gain"}try{e.volume=t}catch{}return"element"}function Kt(e){return Fe.get(e)??e.volume}function Ut(e,n){e.getFloatTimeDomainData(n);let t=0;for(let o=0;o<n.length;o++){const u=n[o];t+=u*u}return Math.sqrt(t/n.length)}const Tn="__ihab_core_image_config__";function Vt(e){globalThis[Tn]=e}function An(){return globalThis[Tn]??null}const oe="word_image_existence_map_v1";let I=null;const Ae=new Map;function ue(){if(I)return I;try{const e=typeof localStorage<"u"?localStorage.getItem(oe):null;I=e?JSON.parse(e):{}}catch{I={}}return I}let He=null;function Jt(){He||(He=setTimeout(()=>{He=null;try{typeof localStorage<"u"&&I&&localStorage.setItem(oe,JSON.stringify(I))}catch{}},200))}function pe(e,n){return`${e}_${n??1}`}async function pn(e,n){const t=ue(),o=pe(e,n);if(o in t)return t[o];if(Ae.has(o))return Ae.get(o);const u=An();if(!u)return!1;const i=u(e,n);if(!i)return!1;const r=fetch(i,{method:"HEAD",signal:AbortSignal.timeout(8e3)}).then(a=>a.ok).catch(()=>!1).then(a=>(t[o]=a,Jt(),Ae.delete(o),a));return Ae.set(o,r),r}function qt(e,n){const t=ue(),o=pe(e,n);return o in t?t[o]:void 0}async function Qt(e,n={}){const{force:t=!1,concurrency:o=16,onProgress:u}=n,i=ue(),r=t?Array.from(new Set(e)):Array.from(new Set(e)).filter(c=>!(pe(c)in i));let a=0;if(r.length>0){let c=0;const l=Array.from({length:Math.min(o,r.length)},async()=>{for(;c<r.length;){const g=c++,s=r[g],C=pe(s);if(!t&&C in i){a++,u?.(a,r.length);continue}try{await pn(s)}catch{}a++,u?.(a,r.length)}});await Promise.all(l)}try{typeof localStorage<"u"&&I&&localStorage.setItem(oe,JSON.stringify(I))}catch{}return{checked:r.length,cached:Object.keys(i).length,total:e.length}}function zt(){const e=ue(),n=Object.values(e);return n.length===0?null:{total:n.length,exists:n.filter(Boolean).length}}function Zt(e){const n=ue();Object.assign(n,e);try{typeof localStorage<"u"&&localStorage.setItem(oe,JSON.stringify(n))}catch{}}function Xt(){I={};try{typeof localStorage<"u"&&localStorage.removeItem(oe)}catch{}}const p=["\u3131","\u3132","\u3134","\u3137","\u3138","\u3139","\u3141","\u3142","\u3143","\u3145","\u3146","\u3147","\u3148","\u3149","\u314A","\u314B","\u314C","\u314D","\u314E"],_=["\u314F","\u3150","\u3151","\u3152","\u3153","\u3154","\u3155","\u3156","\u3157","\u3158","\u3159","\u315A","\u315B","\u315C","\u315D","\u315E","\u315F","\u3160","\u3161","\u3162","\u3163"],L=["","\u3131","\u3132","\u3133","\u3134","\u3135","\u3136","\u3137","\u3139","\u313A","\u313B","\u313C","\u313D","\u313E","\u313F","\u3140","\u3141","\u3142","\u3144","\u3145","\u3146","\u3147","\u3148","\u314A","\u314B","\u314C","\u314D","\u314E"];function m(e){if(!e)return null;const n=e.charCodeAt(0)-44032;return n<0||n>=11172?null:{cho:Math.floor(n/588),jung:Math.floor(n%588/28),jong:n%28}}function eo(){const e=new Map;return n=>{let t=e.get(n);return t||(t=[...n].map(o=>m(o)),e.set(n,t)),t}}function G(e,n,t=0){return String.fromCharCode(44032+(e*21+n)*28+t)}function no(e,n){if(!e||!n||e===n||e.length!==n.length)return"random";let t=0,o=null;for(let u=0;u<e.length;u++){const i=m(e[u]),r=m(n[u]);if(!i||!r)return"random";if(i.cho===r.cho&&i.jung===r.jung&&i.jong===r.jong)continue;t++;const a=i.cho!==r.cho,c=i.jung!==r.jung,l=i.jong!==r.jong;(a?1:0)+(c?1:0)+(l?1:0)>1?o="multi":a?o="cho":c?o="jung":o="jong"}return t!==1?"random":o==="cho"?"cho":o==="jung"?"jung":o==="jong"?"jong":"random"}function wn(e){const n=m(e[0]||"");return n?p[n.cho]:""}function bn(e){return[...e].map(n=>{const t=m(n);return t?p[t.cho]:n}).join("")}function _n(e){return!!e&&[...e].every(n=>p.includes(n))}function to(e,n){return n?_n(n)?bn(e).includes(n):e.toLowerCase().includes(n.toLowerCase()):!0}function we(e,n){if(!n)return!0;const t=[...n],o=a=>p.includes(a),u=a=>_.includes(a),i=t.map(a=>o(a)?"cho":u(a)?"jung":m(a)?"syl":"other");if(i.includes("other"))return e.toLowerCase().includes(n.toLowerCase());const r=[...e];for(let a=0;a+t.length<=r.length;a++){let c=!0;for(let l=0;l<t.length;l++){const g=r[a+l],s=i[l];if(s==="cho"){if(wn(g)!==t[l]){c=!1;break}}else if(s==="jung"){const C=m(g);if(!C||_[C.jung]!==t[l]){c=!1;break}}else{const C=m(t[l]);if(C&&C.jong===0){const h=m(g);if(!h||h.cho!==C.cho||h.jung!==C.jung){c=!1;break}}else if(g!==t[l]){c=!1;break}}}if(c)return!0}return!1}const Ye={3:["\u3131","\u3145"],5:["\u3134","\u3148"],6:["\u3134","\u314E"],9:["\u3139","\u3131"],10:["\u3139","\u3141"],11:["\u3139","\u3142"],12:["\u3139","\u3145"],13:["\u3139","\u314C"],14:["\u3139","\u314D"],15:["\u3139","\u314E"],18:["\u3142","\u3145"]},Bn=Object.fromEntries(Object.entries(Ye).map(([e,n])=>[n.join(""),L[Number(e)]]));function oo(e,n){if(!e||!n)return!1;for(const t of e){const o=m(t);if(o&&p[o.cho]===n)return!0}return!1}function uo(e,n){if(!e||!n)return!1;for(const t of e){const o=m(t);if(o&&_[o.jung]===n)return!0}return!1}function ro(e,n){if(!e||!n)return!1;for(const t of e){const o=m(t);if(!o||o.jong<=0)continue;if(L[o.jong]===n)return!0;const u=Ye[o.jong];if(u&&u.includes(n))return!0}return!1}function io(e){if(!e)return 0;let n=0;for(const t of e)m(t)&&n++;return n}function ao(e){if(!e)return!1;let n=!1;for(const t of e){const o=m(t);if(o&&(n=!0,o.jong>0))return!1}return n}function so(e,n){if(e.jong<=0)return!1;if(n.includes(L[e.jong]))return!0;const t=Ye[e.jong];return!!t&&t.some(o=>n.includes(o))}function lo(e,n,t){if(!e)return!1;const o=[...e],u=i=>{const r=m(o[i]);if(!r||n.cho&&!n.cho.includes(p[r.cho])||n.jung&&!n.jung.includes(_[r.jung]))return!1;if(n.jongNone){if(r.jong>0)return!1}else if(n.jong&&!so(r,n.jong))return!1;return!0};if(t==="head")return u(0);if(t==="tail")return u(o.length-1);if(t==="mid"){for(let i=1;i<o.length-1;i++)if(u(i))return!0;return!1}for(let i=0;i<o.length;i++)if(u(i))return!0;return!1}function Nn(e){return e.includes(",")||e.includes("_")}function Ln(e){if(e==="")return[{kind:"any"}];if(e.includes("_")){const n=[...e];if(n.length>4)return[{kind:"invalid"}];const t=n[0]??"_",o=n[1]??"_";let u=n.slice(2).join("");if(u.length===2){const i=Bn[u];if(!i)return[{kind:"invalid"}];u=i}return[{kind:"template",cho:t,jung:o,jong:u||"_"}]}return[...e].map(n=>m(n)?{kind:"syllable",ch:n}:p.includes(n)?{kind:"cho",jamo:n}:_.includes(n)?{kind:"jung",jamo:n}:{kind:"invalid"})}function co(e,n){switch(n.kind){case"any":return!0;case"syllable":{const t=m(n.ch);if(!t)return e===n.ch;if(t.jong===0){const o=m(e);return!!o&&o.cho===t.cho&&o.jung===t.jung}return e===n.ch}case"cho":{const t=m(e);return!!t&&p[t.cho]===n.jamo}case"jung":{const t=m(e);return!!t&&_[t.jung]===n.jamo}case"template":{const t=m(e);return!(!t||n.cho!=="_"&&p[t.cho]!==n.cho||n.jung!=="_"&&_[t.jung]!==n.jung||n.jong!=="_"&&L[t.jong]!==n.jong)}case"invalid":return!1}}function Rn(e,n){const t=n.split(",").flatMap(u=>Ln(u.trim()));if(t.length===0)return!0;const o=[...e];if(o.length<t.length)return!1;for(let u=0;u+t.length<=o.length;u++)if(t.every((i,r)=>co(o[u+r],i)))return!0;return!1}function Co(e){const n=e.split(",").flatMap(i=>Ln(i.trim())),t=new Set,o=new Set,u=new Set;for(const i of n)switch(i.kind){case"cho":t.add(i.jamo);break;case"jung":o.add(i.jamo);break;case"template":i.cho!=="_"&&t.add(i.cho),i.jung!=="_"&&o.add(i.jung),i.jong!=="_"&&u.add(i.jong);break;case"syllable":{const r=m(i.ch);r&&(t.add(p[r.cho]),o.add(_[r.jung]),r.jong!==0&&u.add(L[r.jong]));break}}return t.size===0&&o.size===0&&u.size===0?null:{cho:t.size?[...t]:null,jung:o.size?[...o]:null,jong:u.size?[...u]:null}}function go(e){return!!m(e)||p.includes(e)||_.includes(e)}function fo(e){const n=e.trim();if(!n)return{ok:!0};for(const t of n.split(",")){const o=t.trim();if(o!==""){if(o.includes("_")){const u=[...o];if(u.length>4)return{ok:!1};const i=u[0],r=u[1],a=u.slice(2).join(""),c=i===void 0||i==="_"||p.includes(i),l=r===void 0||r==="_"||_.includes(r),g=a===""||a==="_"||L.filter(Boolean).includes(a)||!!Bn[a];if(c&&l&&g)continue;return{ok:!1}}if(![...o].every(go))return{ok:!1}}}return{ok:!0}}p.length,_.length,L.length;function ho(e,n){const t=n.trim();if(!t||!/[^\s,_]/.test(t))return e;if(Nn(t))return e.filter(r=>Rn(r.word,t));const o=e.filter(r=>we(r.word,t)||we(r.pronunciation??"",t)),u=[...t].length,i=r=>!!r&&we(r.slice(0,u),t);return o.map(r=>({w:r,rank:i(r.word)||i(r.pronunciation??"")?0:1})).sort((r,a)=>r.rank-a.rank).map(r=>r.w)}const Ke="word_pair_index_v2",Ue="word_pair_index_sig_v2";let M=null,re=null;function jn(){try{if(typeof localStorage>"u")return null;const e=localStorage.getItem(Ke),n=localStorage.getItem(Ue);return!e||!n?null:{index:JSON.parse(e),sig:n}}catch{return null}}function mo(e,n){try{if(typeof localStorage>"u")return;localStorage.setItem(Ke,JSON.stringify(e)),localStorage.setItem(Ue,n)}catch{}}function So(e){const n=e.map(o=>`${o.word}|${o.pron??""}`).sort();let t=0;for(const o of n)for(let u=0;u<o.length;u++)t=(t<<5)-t+o.charCodeAt(u)|0;return`${n.length}-${t}`}async function yo(e,n){const t=new Set,o=[];for(const l of e){if(!l.word||t.has(l.word))continue;const g=l.pron||l.word,s=Array.from(g).map(m);s.some(C=>C===null)||s.length===Array.from(l.word).length&&(t.add(l.word),o.push({word:l.word,syls:s}))}const u={},i=o.length,r=new Map;for(const l of o){const g=l.syls.length;r.has(g)||r.set(g,[]),r.get(g).push(l)}let a=0;const c=["cho","jung","jong"];for(const l of r.values()){const g=l[0].syls.length;for(let s=0;s<g;s++)for(const C of c){const h=new Map;for(const S of l){let y="";for(let f=0;f<g;f++){f>0&&(y+="~");const d=S.syls[f];f===s?C==="cho"?y+=`*:${d.jung}:${d.jong}`:C==="jung"?y+=`${d.cho}:*:${d.jong}`:y+=`${d.cho}:${d.jung}:*`:y+=`${d.cho}:${d.jung}:${d.jong}`}let D=h.get(y);D||(D=[],h.set(y,D)),D.push(S)}for(const S of h.values())if(!(S.length<2))for(let y=0;y<S.length;y++){const D=S[y];for(let f=y+1;f<S.length;f++){const d=S[f];D.syls[s][C]!==d.syls[s][C]&&(u[D.word]||(u[D.word]={cho:[],jung:[],jong:[]}),u[d.word]||(u[d.word]={cho:[],jung:[],jong:[]}),u[D.word][C].push(d.word),u[d.word][C].push(D.word))}}}a+=l.length,n?.(a,i),await new Promise(s=>setTimeout(s,0))}return i>0&&n?.(i,i),u}async function Do(e,n={}){const t=So(e);if(!n.force){if(M&&re===t)return M;const u=jn();if(u&&u.sig===t)return M=u.index,re=t,M}const o=await yo(e,n.onProgress);return M=o,re=t,mo(o,t),o}function On(){if(M)return M;const e=jn();return e?(M=e.index,re=e.sig,M):null}function Eo(){M=null,re=null;try{typeof localStorage<"u"&&(localStorage.removeItem(Ke),localStorage.removeItem(Ue))}catch{}}const Ve={cho:p,jung:_,jong:L},j=e=>Array.isArray(e)?e.length>0:!!e;function Je(e,n){if(e.length!==n.length)return!1;for(let t=0;t<e.length;t++){const o=e[t],u=n[t];if(!(!o||!u)&&(o.cho!==u.cho&&p[o.cho]==="\u3147"!=(p[u.cho]==="\u3147")||o.jong!==u.jong&&o.jong===0!=(u.jong===0)))return!0}return!1}function kn(e,n,t){const o=t.pronOf(e),u=t.decompOf,i=t.sameStructureOnly&&u?u(o):null,r=[];for(const a of n)a!==e&&(t.okSet&&!t.okSet.has(a)||t.pronOf(a)!==o&&(i&&u&&Je(i,u(t.pronOf(a)))||r.push(a)));return r}function To(e,n,t){const o=n?.[e];if(!o)return[];const u=t.kind?o[t.kind]??[]:[...o.cho??[],...o.jung??[],...o.jong??[]];return kn(e,u,t)}function Ao(e,n,t,o,u,i,r){const a=["cho","jung","jong"].filter(C=>j(e[C])),c={};for(const C of a){const h=e[C];c[C]=new Set(Array.isArray(h)?h:[h])}const l=u==="pron",g=new Map;for(const C of n){const h=t(i(C));if(h.some(f=>!f))continue;let S=h;if(!l&&(S=t(C),S.length!==h.length||S.some(f=>!f)))continue;const y=h.length,D=g.get(y);D?D.push({w:C,dPron:h,dPos:S}):g.set(y,[{w:C,dPron:h,dPos:S}])}const s=new Map;for(const[C,h]of g){const S=new Map,y=(D,f)=>{const d=D.dPos[f];return d!=null&&a.every(E=>c[E].has(Ve[E][d[E]]))};for(const D of h){let f;if(r==="head")f=y(D,0)?0:-1;else if(r==="tail")f=y(D,C-1)?C-1:-1;else if(r==="mid"){f=-1;for(let E=1;E<C-1;E++)if(y(D,E)){f=E;break}}else f=D.dPos.findIndex(E=>E!=null&&a.every(T=>c[T].has(Ve[T][E[T]])));if(f<0)continue;const d=S.get(f);d?d.push(D):S.set(f,[D])}for(const[D,f]of S){const d=new Set(a.map(w=>D+":"+w)),E=w=>{let B="";for(let b=0;b<C;b++){const O=w[b];for(const H of["cho","jung","jong"])B+=(d.has(b+":"+H)?"*":O[H])+"."}return B},T=new Map;for(const w of h){const B=E(w.dPron),b=T.get(B);b?b.push(w):T.set(B,[w])}for(const w of f){const B=T.get(E(w.dPron))??[],b=[];for(const O of B){if(O.w===w.w)continue;let H=!0;for(const A of a){const v=w.dPron[D][A],U=O.dPron[D][A];if(U===v){H=!1;break}if(l&&c[A].has(Ve[A][U])){H=!1;break}}H&&(o&&Je(w.dPron,O.dPron)||b.push(O.w))}s.set(w.w,b)}}}return s}const be=0,In=1,V=2,qe=3,po=4,_e=5,Qe=6,Be=7,wo=8,Mn=9,ie=10,bo=11,ae=12,_o=13,se=14,Ne=15,Le=16,le=17,Bo=18,P=0,F=1,No=3,J=4,ze=5,Ze=6,$=7,N=8,Pn=9,$n=10,Re=11,vn=12,Xe=13,je=15,Oe=16,x=17,Gn=18,en=21,Fn=27,Lo=20,Ro={1:be,2:In,4:V,7:qe,8:_e,16:Qe,17:Be,19:Mn,20:ie,22:ae,23:se,24:Ne,25:Le,26:le},jo={[No]:[F,ie],[ze]:[J,ae],[Pn]:[N,be],[$n]:[N,Qe],[Re]:[N,Be],[vn]:[N,ie],[Xe]:[N,Le],14:[N,le],[Gn]:[x,ie]},Oo={[Ze]:V,[je]:_e},nn={2:F,24:F,3:F,9:F,5:J,6:J,19:$,20:$,22:$,23:$,25:$,27:$,11:N,12:N,13:N,15:N,10:Oe,14:x,18:x,26:x},xn={[be]:Ne,[qe]:Le,[Be]:le,[ae]:se},Wn={[be]:In,[qe]:po,[Be]:wo,[Mn]:ie,[ae]:_o},ko=new Set([ze,$n,Re,vn,Xe,je,Gn]),Io=new Set(["\uBC1F"]);function Mo(e){const n=(e??"").trim();if(!n)return"";const t=[...n],o=t.map(m);if(o.some(i=>i===null))return n;const u=o;for(let i=0;i<u.length;i++){const r=u[i],a=u[i+1],c=r.jong;if(!a){r.jong=nn[r.jong]??r.jong;break}if(r.jong===P)continue;if(a.cho===bo){if(a.jung===Lo){if(r.jong===$){r.jong=P,a.cho=ae;continue}if(r.jong===25){r.jong=P,a.cho=se;continue}if(r.jong===Xe){r.jong=N,a.cho=se;continue}}if(r.jong===Fn){r.jong=P;continue}const g=Oo[r.jong];if(g!==void 0){r.jong=P,a.cho=g;continue}const s=jo[r.jong];if(s){r.jong=s[0],a.cho=s[1];continue}const C=Ro[r.jong];C!==void 0&&(r.jong=P,a.cho=C);continue}if((r.jong===Fn||r.jong===Ze||r.jong===je)&&xn[a.cho]!==void 0){a.cho=xn[a.cho],r.jong=r.jong===Ze?J:r.jong===je?N:P;continue}if(a.cho===Bo){if(r.jong===ze){r.jong=J,a.cho=se;continue}if(r.jong===Pn){r.jong=N,a.cho=Ne;continue}if(r.jong===Re){r.jong=N,a.cho=le;continue}const g=nn[r.jong]??r.jong;if(g===F){r.jong=P,a.cho=Ne;continue}if(g===$){r.jong=P,a.cho=Le;continue}if(g===x){r.jong=P,a.cho=le;continue}}let l=nn[r.jong]??r.jong;c===Re&&Io.has(t[i])&&(l=x),r.jong=l,Wn[a.cho]!==void 0&&(l===F||l===$||l===x||ko.has(c))&&(a.cho=Wn[a.cho]),(a.cho===V||a.cho===Qe)&&(r.jong===F?r.jong=en:r.jong===$?r.jong=J:r.jong===x&&(r.jong=Oe)),a.cho===_e?r.jong===J?r.jong=N:r.jong===Oe||r.jong===en?a.cho=V:r.jong===F?(r.jong=en,a.cho=V):r.jong===x&&(r.jong=Oe,a.cho=V):r.jong===N&&a.cho===V&&(a.cho=_e)}return u.map(i=>G(i.cho,i.jung,i.jong)).join("")}const Po={\u3131:"\u3131",\u3132:"\u3131",\u314B:"\u3131",\u3133:"\u3131",\u313A:"\u3131",\u3134:"\u3134",\u3135:"\u3134",\u3136:"\u3134",\u3137:"\u3137",\u3145:"\u3137",\u3146:"\u3137",\u3148:"\u3137",\u314A:"\u3137",\u314C:"\u3137",\u314E:"\u3137",\u3139:"\u3139",\u313C:"\u3139",\u313D:"\u3139",\u313E:"\u3139",\u3140:"\u3139",\u3141:"\u3141",\u313B:"\u3141",\u3142:"\u3142",\u314D:"\u3142",\u313F:"\u3142",\u3144:"\u3142",\u3147:"\u3147"};function Hn(e){return Po[e]??e}const z=/[ㄱ-ㅎ]/,$o=/[ㅏ-ㅣ]/;function ce(e){for(let n=e.length-1;n>=0;n--){const t=e[n],o=t.charCodeAt(0);if(o>=44032&&o<=55203||z.test(t)||$o.test(t))return t}return null}function Yn(e){const n=ce(e);if(!n)return"\uAC00";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC774":"\uAC00":z.test(n)?"\uC774":"\uAC00"}function vo(e){return`${e}${Yn(e)}`}function Kn(e){const n=ce(e);if(!n)return"\uB97C";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC744":"\uB97C":z.test(n)?"\uC744":"\uB97C"}function Go(e){return`${e}${Kn(e)}`}function Un(e){const n=ce(e);if(!n)return"\uB294";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC740":"\uB294":z.test(n)?"\uC740":"\uB294"}function Fo(e){return`${e}${Un(e)}`}function Vn(e){const n=ce(e);if(!n)return"\uC640";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uACFC":"\uC640":z.test(n)?"\uACFC":"\uC640"}function xo(e){return`${e}${Vn(e)}`}function Jn(e){const n=ce(e);if(!n)return"\uB85C";const t=n.charCodeAt(0);if(t>=44032&&t<=55203){const o=(t-44032)%28;return o===0||o===8?"\uB85C":"\uC73C\uB85C"}return n==="\u3139"?"\uB85C":z.test(n)?"\uC73C\uB85C":"\uB85C"}function Wo(e){return`${e}${Jn(e)}`}function Ho(e,n,t){const o=e.slice(),[u]=o.splice(n,1);return o.splice(t,0,u),o}function R(e,n=Math.random){const t=e.slice();for(let o=t.length-1;o>0;o--){const u=Math.floor(n()*(o+1));[t[o],t[u]]=[t[u],t[o]]}return t}function W(e,n,t=Math.random){return!Array.isArray(e)||e.length===0||n<=0?[]:n>=e.length?R(e,t):R(e,t).slice(0,n)}const qn={SAME_SOUND_PICK:{difficulty:!0,choseong:!0,group:"discrimination"},SAME_OR_DIFF:{difficulty:!0,choseong:!0,group:"discrimination"},HEAR_AND_PICK_SAME:{difficulty:!0,choseong:!0,group:"discrimination"},HEAR_AND_PICK_INCLUDED:{difficulty:!0,choseong:!0,group:"discrimination"},STARTS_WITH_SAME_SOUND:{difficulty:!1,choseong:!0,group:"discrimination"},LISTEN_AND_REMEMBER_ORDER:{difficulty:!1,choseong:!0,group:"attention"},MERGE_2_SYLLABLES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_3_SYLLABLES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_2_PHONEMES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_3_PHONEMES:{difficulty:!1,choseong:!0,group:"synthesis"},DROP_1_FROM_2SYLL:{difficulty:!1,choseong:!0,group:"deletion"},DROP_1_FROM_3SYLL:{difficulty:!1,choseong:!0,group:"deletion"},DROP_PART_FROM_COMPOUND:{difficulty:!1,choseong:!0,group:"deletion"},DROP_FINAL_CONSONANT_FROM_1SYLL:{difficulty:!1,choseong:!0,group:"deletion"},REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:{difficulty:!1,choseong:!0,group:"deletion"},CHANGE_1_SYLL_IN_2SYLL:{difficulty:!0,choseong:!0,group:"substitution"},CHANGE_1_SYLL_IN_3SYLL:{difficulty:!0,choseong:!0,group:"substitution"},CHANGE_1_PHONEME_IN_1SYLL:{difficulty:!1,choseong:!0,group:"substitution"},CHANGE_1_PHONEME_IN_2SYLL:{difficulty:!0,choseong:!0,group:"substitution"}};function Yo(e){const n=e?qn[e]?.group:void 0;return n==="synthesis"||n==="deletion"||n==="substitution"?n:null}const Ko=p.indexOf("\u3147"),Qn={DROP_FINAL_CONSONANT_FROM_1SYLL:{syllables:1,syllable:e=>e.jong>0},REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:{syllables:1,syllable:e=>e.jong===0&&e.cho!==Ko},MERGE_2_SYLLABLES:{syllables:2,syllable:()=>!0},MERGE_3_SYLLABLES:{syllables:3,syllable:()=>!0},MERGE_2_PHONEMES:{syllables:1,syllable:e=>e.jong===0},MERGE_3_PHONEMES:{syllables:1,syllable:e=>e.jong>0}},Uo=new Set([]);function Vo(e){return e in Qn}function Jo(e,n){const t=Qn[e];if(!t)return!0;const o=[...n];if(o.length!==t.syllables)return!1;const u=m(o[0]);return!!u&&t.syllable(u)}function qo(e){return Uo.has(e)}function Qo(e){const n=e.charCodeAt((e.length||1)-1)||0;return n<44032||n>55203||(n-44032)%28===0?"\uC640":"\uACFC"}function tn(e){const n=e.charCodeAt((e.length||1)-1)||0;return n<44032||n>55203||(n-44032)%28===0?"\uB97C":"\uC744"}function zn(e){const n=e.charCodeAt((e.length||1)-1)||0;if(n<44032||n>55203)return"\uB85C";const t=(n-44032)%28;return t===0||t===8?"\uB85C":"\uC73C\uB85C"}function Zn(e){const n=e.charAt((e.length||1)-1),t=n.charCodeAt(0)||0;return t>=44032&&t<=55203?(t-44032)%28===0?"\uAC00":"\uC774":/[ㄱ-ㅎ]/.test(n)?"\uC774":"\uAC00"}const Xn={\u3131:"\uAE30\uC5ED",\u3132:"\uC30D\uAE30\uC5ED",\u3134:"\uB2C8\uC740",\u3137:"\uB514\uADFF",\u3138:"\uC30D\uB514\uADFF",\u3139:"\uB9AC\uC744",\u3141:"\uBBF8\uC74C",\u3142:"\uBE44\uC74D",\u3143:"\uC30D\uBE44\uC74D",\u3145:"\uC2DC\uC637",\u3146:"\uC30D\uC2DC\uC637",\u3147:"\uC774\uC751",\u3148:"\uC9C0\uC752",\u3149:"\uC30D\uC9C0\uC752",\u314A:"\uCE58\uC753",\u314B:"\uD0A4\uC754",\u314C:"\uD2F0\uC755",\u314D:"\uD53C\uC756",\u314E:"\uD788\uC757",\u3133:"\uAE30\uC5ED\uC2DC\uC637",\u3135:"\uB2C8\uC740\uC9C0\uC752",\u3136:"\uB2C8\uC740\uD788\uC757",\u313A:"\uB9AC\uC744\uAE30\uC5ED",\u313B:"\uB9AC\uC744\uBBF8\uC74C",\u313C:"\uB9AC\uC744\uBE44\uC74D",\u313D:"\uB9AC\uC744\uC2DC\uC637",\u313E:"\uB9AC\uC744\uD2F0\uC755",\u313F:"\uB9AC\uC744\uD53C\uC756",\u3140:"\uB9AC\uC744\uD788\uC757",\u3144:"\uBE44\uC74D\uC2DC\uC637",\u314F:"\uC544",\u3150:"\uC560",\u3151:"\uC57C",\u3152:"\uC598",\u3153:"\uC5B4",\u3154:"\uC5D0",\u3155:"\uC5EC",\u3156:"\uC608",\u3157:"\uC624",\u3158:"\uC640",\u3159:"\uC65C",\u315A:"\uC678",\u315B:"\uC694",\u315C:"\uC6B0",\u315D:"\uC6CC",\u315E:"\uC6E8",\u315F:"\uC704",\u3160:"\uC720",\u3161:"\uC73C",\u3162:"\uC758",\u3163:"\uC774"};function zo(e){if([...e].length!==1)return[e];const n=m(e);if(!n)return[e];const t=[p[n.cho],_[n.jung]];return n.jong!==0&&t.push(L[n.jong]),t}function et(e,n=!1){const t=e.filter(Boolean);if(t.length<2)return"";const o=a=>Xn[a]??a,u=t.slice(0,-1).map(a=>`"${a}"${Qo(o(a))}`).join(" "),i=t[t.length-1],r=`"${i}"${tn(o(i))}`;return`${u} ${r} \uD569\uCE58\uBA74 \uC5B4\uB5A4 ${n?"\uC18C\uB9AC":"\uB2E8\uC5B4"}\uAC00 \uB418\uB098\uC694?`}function Zo(e,n){return et(n,e==="MERGE_2_PHONEMES"||e==="MERGE_3_PHONEMES")}function Xo(e,n){const t=String(n?.word??n?.original??""),o=String(n?.changedFrom??""),u=String(n?.changedTo??"");return e==="CHANGE_1_PHONEME_IN_1SYLL"?`"${t}"${tn(t)} "${u}"${zn(u)} \uBC14\uAFB8\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`:`"${t}"\uC5D0\uC11C "${o}"${tn(o)} "${u}"${zn(u)} \uBC14\uAFB8\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`}function eu(e,n){const t=String(n?.word??n?.original??n?.base??""),o=String(n?.dropped??"");if(e==="DROP_FINAL_CONSONANT_FROM_1SYLL")return`"${t}"\uC5D0\uC11C \uBC1B\uCE68\uC774 \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uB9D0\uC774 \uB418\uB098\uC694?`;if(e==="REMOVE_CONSONANT_AND_IDENTIFY_PHONEME"){const u=String(n?.missingConsonant??"");return`"${t}"\uC5D0\uC11C "${u}"${Zn(u)} \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB418\uB098\uC694?`}return`"${t}"\uC5D0\uC11C "${o}"${Zn(o)} \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uB9D0\uC774 \uB418\uB098\uC694?`}function nu(e,n,t){switch(Yo(e)){case"synthesis":return Zo(e,t);case"substitution":return Xo(e,n);case"deletion":return eu(e,n);default:return""}}function tu(e){return e.replace(/"([ㄱ-ㅣ])"(으로|와|과|을|를|이|가|은|는|로)?/g,(n,t,o)=>{const u=Xn[t];if(!u)return n;if(!o)return`"${u}"`;const i=(u.charCodeAt(u.length-1)-44032)%28,r=i!==0;let a=o;return o==="\uC640"||o==="\uACFC"?a=r?"\uACFC":"\uC640":o==="\uC744"||o==="\uB97C"?a=r?"\uC744":"\uB97C":o==="\uC774"||o==="\uAC00"?a=r?"\uC774":"\uAC00":o==="\uC740"||o==="\uB294"?a=r?"\uC740":"\uB294":(o==="\uC73C\uB85C"||o==="\uB85C")&&(a=i===0||i===8?"\uB85C":"\uC73C\uB85C"),`"${u}"${a}`})}const ou=e=>e==null?[]:Array.isArray(e)?e:[e];function nt(e){if([...e].length!==1)return"";const n=m(e);if(!n)return"";const t=Hn(L[n.jong]),o=t===""?0:L.indexOf(t);return G(n.cho,n.jung,o<0?0:o)}function on(e,n){return n.get(e)||nt(e)||e}function ke(e){return e?j(e.cho)?"cho":j(e.jung)?"jung":j(e.jong)?"jong":null:null}function q(e,n){const t=(o,u)=>!j(o)||ou(o).includes(u);return t(n.cho,p[e.cho])&&t(n.jung,_[e.jung])&&t(n.jong,L[e.jong])}function Z(e,n,t){const o=[...e];if(t!=="pron")return o.map(i=>m(i));const u=[...n.get(e)||e];return u.length!==o.length?o.map(i=>m(i)):u.map(i=>m(i))}function X(e,n,t,o,u){const i=n==="cho"?p:n==="jung"?_:L,r=e[n],a=[],c=s=>n==="jung"?ru(on(s,u)):on(s,u),l=new Map([[c(t),-1]]),g=R(i.map((s,C)=>C).filter(s=>s!==r&&(n!=="cho"||i[s]!=="\u3147")&&(n!=="jong"||s!==0)));for(const s of g){if(a.length>=o)break;const C=n==="cho"?G(s,e.jung,e.jong):n==="jung"?G(e.cho,s,e.jong):G(e.cho,e.jung,s),h=c(C),S=l.get(h);if(S!==void 0){n==="jung"&&S>=0&&u.has(C)&&!u.has(a[S])&&(a[S]=C);continue}l.set(h,a.length),a.push(C)}return a}const uu={\u3154:"\u3150",\u3156:"\u3152",\u315A:"\u3159",\u315E:"\u3159"};function ru(e){if([...e].length!==1)return e;const n=m(e);if(!n)return e;const t=uu[_[n.jung]];return t?G(n.cho,_.indexOf(t),n.jong):e}function iu(e,n,t,o,u,i=null){const r=[...e];if(r.length!==2)return null;const a=r.map(s=>m(s));if(a.some(s=>!s))return null;const c=Z(e,t,o);if(c.some(s=>!s))return null;const l=ke(n);let g=l&&n?c.map((s,C)=>q(s,n)?C:-1).filter(s=>s>=0):[0,1];if(i!=null&&(g=g.filter(s=>s!==i)),!g.length)return null;for(const s of R(g)){const C=r[s];if(!u.has(C))continue;const h=X(a[s],l??"cho",C,40,t),S=[];for(const y of h)if(y!==C&&u.has(y)&&!S.includes(y)&&S.push(y),S.length>=2)break;if(!(S.length<2))return{question:e,distractors:[C,...S]}}return null}function au(e,n,t,o,u,i=null){const r=[...e];if(r.length!==3)return null;const a=r.map(s=>m(s));if(a.some(s=>!s))return null;const c=Z(e,t,o);if(c.some(s=>!s))return null;const l=ke(n),g=l&&n?c.map((s,C)=>q(s,n)?C:-1).filter(s=>s>=0):[0,1,2];if(!g.length)return null;for(const s of R(g))for(const C of R([0,1,2].filter(h=>h!==s&&(i==null||h===i)))){const h=[0,1,2].filter(d=>d!==C),S=h.map(d=>r[d]).join("");if(!u.has(S))continue;const y=h.indexOf(s),D=X(a[s],l??"cho",r[s],40,t),f=[];for(const d of D){const E=h.map(w=>r[w]);E[y]=d;const T=E.join("");if(T!==S&&u.has(T)&&!f.includes(T)&&f.push(T),f.length>=2)break}if(!(f.length<2))return{question:e,distractors:[S,...f]}}return null}function su(e,n,t,o,u,i=null){const r=[...e],a=r.length;if(a<2)return null;const c=[];for(let g=1;g<=a-1;g++)c.push({remain:r.slice(0,g).join(""),dropped:r.slice(g).join(""),droppedEnd:1}),c.push({remain:r.slice(a-g).join(""),dropped:r.slice(0,a-g).join(""),droppedEnd:0});const l=ke(n);for(const{remain:g,dropped:s,droppedEnd:C}of R(c)){if(i!=null&&C!==i||g===e||!u.has(g)||!u.has(s))continue;const h=[...g],S=h.map(f=>m(f));if(S.some(f=>!f))continue;const y=Z(g,t,o);if(y.some(f=>!f))continue;const D=l&&n?y.map((f,d)=>q(f,n)?d:-1).filter(f=>f>=0):h.map((f,d)=>d);if(D.length)for(const f of R(D)){const d=X(S[f],l??"cho",h[f],40,t),E=[];for(const T of d){const w=[...h];w[f]=T;const B=w.join("");if(B!==g&&u.has(B)&&!E.includes(B)&&E.push(B),E.length>=2)break}if(E.length>=2)return{question:e,distractors:[g,...E]}}}return null}function lu(e,n,t,o,u,i=null){if([...e].length!==1)return null;const r=m(t.get(e)||e);if(!r||r.jong===0)return null;const a=G(r.cho,r.jung,0),c=X({cho:r.cho,jung:r.jung,jong:0},"cho",a,2,t);return c.length<2?null:{question:e,distractors:[a,...c]}}const un=p.indexOf("\u3147");function cu(e,n,t,o,u,i=null){if([...e].length!==1)return null;const r=m(t.get(e)||e);if(!r||r.jong!==0||r.cho===un)return null;const a=G(un,r.jung,0),c=X({cho:un,jung:r.jung,jong:0},"jung",a,2,t);return c.length<2?null:{question:e,distractors:[a,...c]}}function Cu(e){const n=new Map;for(const t of e){const o=[...t],u=o.length;if(!(u<2||u>3))for(let i=0;i<u;i++){let r=u+"|"+i+"|";for(let c=0;c<u;c++)r+=c===i?"*":o[c];const a=n.get(r);a?a.push(t):n.set(r,[t])}}return n}function gu(e,n,t,o,u,i=null,r=null,a=2){const c=[...e],l=c.length;if(l<2||l>3)return null;const g=c.map(d=>m(d));if(g.some(d=>!d))return null;const s=Z(e,t,o);if(s.some(d=>!d))return null;const C=d=>t.get(d)??d,h=C(e),S=!!n&&(j(n.cho)||j(n.jung)||j(n.jong)),y=!!r&&(j(r.cho)||j(r.jung)||j(r.jong)),D=d=>{let E=l+"|"+d+"|";for(let T=0;T<l;T++)E+=T===d?"*":c[T];return E};let f;if(i!=null){if(i>=l||S&&!q(s[i],n))return null;f=[i]}else S?f=s.map((d,E)=>q(d,n)?E:-1).filter(d=>d>=0):f=Array.from({length:l},(d,E)=>E);for(const d of R(f)){const E=u.get(D(d))??[],T=[],w=[];for(const A of E){if(A===e)continue;const v=[...A].map(Te=>m(Te)),U=g[d],De=v[d];if(!U||!De)continue;let Ee=0;if(U.cho!==De.cho&&Ee++,U.jung!==De.jung&&Ee++,U.jong!==De.jong&&Ee++,!(Ee<a||C(A)===h))if(y){const Te=Z(A,t,o)[d];Te&&q(Te,r)?T.push(A):w.push(A)}else T.push(A)}if(!T.length)continue;const B=R(T)[0],b=[],O=new Set([h,C(B)]),H=y?w:T.filter(A=>A!==B);for(const A of R(H)){const v=C(A);if(!O.has(v)&&(O.add(v),b.push(A),b.length>=2))break}if(!y&&b.length<2)for(const A of R(E)){if(A===e||A===B)continue;const v=C(A);if(!O.has(v)&&(O.add(v),b.push(A),b.length>=2))break}if(!(b.length<2))return{question:e,distractors:[B,...b]}}return null}const du=()=>{const e="\uC54C \uC218 \uC5C6\uB294 \uC624\uB958",n=typeof cn?.t=="function"?cn.t("common.unknownError",{defaultValue:e}):void 0;return typeof n=="string"&&n?n:e};function fu(e,n){if(n===void 0&&(n=du()),e instanceof Error)return e.message||n;if(typeof e=="string")return e||n;if(e&&typeof e=="object"){const t=e;for(const o of[t.message,t.error_description,t.error])if(typeof o=="string"&&o)return o}return n}const tt="\uB124\uD2B8\uC6CC\uD06C \uC5F0\uACB0\uC774 \uBD88\uC548\uC815\uD569\uB2C8\uB2E4. \uC5F0\uACB0 \uC0C1\uD0DC\uB97C \uD655\uC778\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.";function ot(e){return e?/failed to fetch|load failed|networkerror|network request failed|fetcherror/i.test(e):!1}function hu(e){return ot(e)?tt:e}function mu(e,n){return e==="id"?void 0:`${e}|${n?"asc":"desc"}`}function Su(e){const[n,t]=e.split("|");return{key:n,asc:t==="asc"}}function yu(e){let n=e==null?"":String(e);return!(typeof e=="number"&&Number.isFinite(e))&&/^[=+\-@\t\r]/.test(n)&&(n=" "+n),/[",\n\r]/.test(n)?`"${n.replaceAll('"','""')}"`:n}function Du(e,n){const t=new Blob(["\uFEFF"+n],{type:"text/csv;charset=utf-8"}),o=URL.createObjectURL(t),u=document.createElement("a");u.href=o,u.download=e,u.click(),URL.revokeObjectURL(o)}const ut="__ihab_core_word_pool__";function Eu(){typeof window<"u"&&window.dispatchEvent(new CustomEvent("wordpool:update"))}function Tu(e,n){const t=new Map;for(const u of e)t.set(u.word,u);const o={entries:e,pairIndex:n??null,byWord:t};globalThis[ut]=o,Eu()}function rt(){return globalThis[ut]??null}const ee=globalThis;function rn(e,n){const t=o=>{};try{const o=n();o&&typeof o.catch=="function"&&o.catch(t)}catch(o){t(o)}}function Au(e){ee.__ihabTrainingTimeLogger=e}function pu(e){rn("time",()=>ee.__ihabTrainingTimeLogger?.(e))}function wu(e){ee.__ihabTrainingCompletionLogger=e}function bu(e){rn("completion",()=>ee.__ihabTrainingCompletionLogger?.(e))}function _u(e){ee.__ihabCrosswordLogger=e}function Bu(e){rn("crossword",()=>ee.__ihabCrosswordLogger?.(e))}function k(e){return typeof e=="string"?e.trim()||null:typeof e=="number"?String(e):null}function it(e){for(const n of["correct","isCorrect","heard","judgement"])if(typeof e[n]=="boolean")return e[n];return e.score===1?!0:e.score===0?!1:null}function Nu(e){return Array.isArray(e)?e.map((n,t)=>{const o=n??{};return{index:t,itemId:k(o.contextCode)??k(o.itemId)??k(o.itemCode)??k(o.id),question:k(o.question)??k(o.sentence)??k(o.word)??k(o.targetSyllable),answer:k(o.answer),selected:k(o.selectedText)??k(o.selected),correct:it(o)}}):[]}function Lu(e){return e.filter(n=>n.correct===!1)}let at=null,st=null,lt=null;function Ru(e){at=e}function ju(e){st=e}function Ou(e){lt=e}async function ku(e,n){try{return await at?.(e,n)??null}catch{return null}}async function Iu(){try{return await st?.()??null}catch{return null}}async function Mu(e,n){try{return await lt?.(e,n)??null}catch{return null}}const Ie=globalThis;function Pu(e){Ie.__ihabNoiseSettingsStore=e}async function $u(){try{return await Ie.__ihabNoiseSettingsStore?.load()??null}catch{return null}}function vu(e){const n=t=>{};try{const t=Ie.__ihabNoiseSettingsStore?.save(e);t&&typeof t.catch=="function"&&t.catch(n)}catch(t){n(t)}}function Gu(e){try{Ie.__ihabNoiseSettingsStore?.applied?.(e)}catch{}}function Me(e){const n=new TextEncoder().encode(String(e).normalize("NFC"));let t="";return n.forEach(o=>{t+=o.toString(16).padStart(2,"0")}),t}const Fu=Me;function xu(e,n){return`${e}/${Me(n)}.mp3`}function Wu(e={}){const n=e.storagePrefix??"audio-cache",t=e.voice??"ko-f",o=typeof e.speed=="number"?e.speed:1,u=e.filenameSanitizer??Me;return async function(i){const r=String(i||"").trim();if(!r)return"";const a=`${u(r)}_${t}.mp3`,c=`${n}/${a}`;try{if(await fn(c)){const l=await hn(c);if(l)return l}}catch{}if(e.generator)try{const l=await e.generator(r,c,e);if(l)return l}catch{}try{const l=`/api/tts?word=${encodeURIComponent(r)}&voice=${encodeURIComponent(t)}&speed=${encodeURIComponent(String(o))}`;return await fetch(l,{method:"GET"}),`/audio-cache/${a}`}catch{return`/audio-cache/${a}`}}}async function Hu(e){if(typeof document<"u"){const n=document.activeElement;let t=null;try{if(t=document.createElement("textarea"),t.value=e,t.setAttribute("readonly",""),t.style.position="fixed",t.style.top="0",t.style.left="0",t.style.opacity="0",t.style.pointerEvents="none",document.body.appendChild(t),t.focus(),t.select(),t.setSelectionRange(0,e.length),document.execCommand("copy"))return!0}catch{}finally{if(t?.parentNode&&t.parentNode.removeChild(t),n&&n!==document.activeElement&&typeof n.focus=="function"&&n.isConnected)try{n.focus({preventScroll:!0})}catch{}}}try{if(typeof navigator<"u"&&navigator.clipboard&&typeof navigator.clipboard.writeText=="function")return await navigator.clipboard.writeText(e),!0}catch{}return!1}const ne="Asia/Seoul";function Yu(e){return new Date(e).toLocaleDateString("ko-KR",{timeZone:ne,year:"numeric",month:"short",day:"numeric"})}function Ku(e){return new Date(e).toLocaleString("ko-KR",{timeZone:ne,year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit"})}function Uu(e,n){const t=n.startsWith("ko")?"ko-KR":"en-US";return new Date(e).toLocaleDateString(t,{timeZone:ne,year:"numeric",month:"short",day:"numeric"})}function Vu(e,n){const t=n.startsWith("ko")?"ko-KR":"en-US";return new Date(e).toLocaleString(t,{timeZone:ne,year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit"})}function Ju(e){return new Date(e).toLocaleString("ko-KR",{timeZone:ne,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}function qu(e){if(e==null||e==="")return"";const n=e instanceof Date?e:new Date(e);return isNaN(n.getTime())?"":new Intl.DateTimeFormat("en-GB",{timeZone:ne,hour:"2-digit",minute:"2-digit",hour12:!1}).format(n)}function ct(){return Ce(new Date)}function Ce(e){if(e==null||e==="")return"";const n=e instanceof Date?e:new Date(e);return isNaN(n.getTime())?"":new Intl.DateTimeFormat("fr-CA",{timeZone:"Asia/Seoul"}).format(n)}function Qu(e,n){if(!e)return"";const t=new Date(e).getTime();if(Number.isNaN(t))return"";const o=Math.max(0,Math.floor((Date.now()-t)/1e3)),u=Math.floor(o/60),i=Math.floor(u/60),r=Math.floor(i/24),a=Math.floor(r/7),c=Math.floor(r/30),l=Math.floor(r/365);return u<1?n("store.time.justNow","\uBC29\uAE08 \uC804"):u<60?n("store.time.minutesAgo",{n:u}):i<24?n("store.time.hoursAgo",{n:i}):r<7?n("store.time.daysAgo",{n:r}):a<5?n("store.time.weeksAgo",{n:a}):r<365?n("store.time.monthsAgo",{n:Math.min(c,11)}):n("store.time.yearsAgo",{n:l})}function zu(e,n={}){const{sep:t=".",pad:o=!0,trailingDot:u=!1,fallback:i="\u2014"}=n;if(!e)return i;const r=Ce(e instanceof Date?e:String(e));if(!r)return i;const[a,c,l]=r.split("-"),g=o?c:String(Number(c)),s=o?l:String(Number(l));return`${a}${t}${g}${t}${s}${u?".":""}`}function Zu(e){const n=e.replace(/\D/g,"").slice(0,11);return n.startsWith("02")?n.length<=2?n:n.length<=6?`${n.slice(0,2)}-${n.slice(2)}`:`${n.slice(0,2)}-${n.slice(2,n.length-4)}-${n.slice(n.length-4)}`:n.length<=3?n:n.length<=7?`${n.slice(0,3)}-${n.slice(3)}`:`${n.slice(0,3)}-${n.slice(3,n.length-4)}-${n.slice(n.length-4)}`}function Xu(e){if(e){if(/^\d{4}\.\d{2}\.\d{2}$/.test(e))return e;if(/^\d{8}$/.test(e))return`${e.slice(0,4)}.${e.slice(4,6)}.${e.slice(6,8)}`;if(/^\d{4}-\d{2}-\d{2}$/.test(e))return e.replace(/-/g,".");if(/^\d{4}-\d{2}-\d{2}T/.test(e)){const n=new Date(e);return isNaN(n.getTime())?void 0:Ce(n).replace(/-/g,".")}}}function er(e){if(e)return/^\d{4}\.\d{2}\.\d{2}$/.test(e)?e.replace(/\./g,"-"):e}function nr(e,n){if(!e)return"-";const t=/^(\d{1,2}):(\d{2})$/.exec(e.trim());if(!t)return e;const o=Number(t[1]),u=Number(t[2]),i=t[1].padStart(2,"0");return u===0?n("date.timeH",{h:o,hh:i,mm:t[2]}):n("date.timeHM",{h:o,hh:i,m:u,mm:t[2]})}function tr(e){return(e??0).toLocaleString("ko-KR")}const or=[{key:"FOOD",label:"\uC74C\uC2DD",icon:"salad",color:"#FF8A65",subs:[{key:"TRKRFD",label:"\uD55C\uAD6D \uC804\uD1B5\uC74C\uC2DD"},{key:"MDKRFD",label:"\uD55C\uAD6D \uD604\uB300\uC74C\uC2DD"},{key:"WRLDFD",label:"\uC138\uACC4\uC758 \uC74C\uC2DD"},{key:"MTRFRT",label:"\uC2DD\uC7AC\uB8CC\uC640 \uACFC\uC77C"},{key:"GEFDKL",label:"\uC74C\uC2DD \uC0C1\uC2DD"}]},{key:"HLTH",label:"\uAC74\uAC15",icon:"heart",color:"#66BB6A",subs:[{key:"HTETHB",label:"\uAC74\uAC15\uD55C \uC2DD\uC2B5\uAD00"},{key:"DISILL",label:"\uBCD1\uACFC \uC9C8\uD658"},{key:"EXCISE",label:"\uC6B4\uB3D9"},{key:"GEHTKL",label:"\uAC74\uAC15\uC0C1\uC2DD"}]},{key:"WETH",label:"\uB0A0\uC528",icon:"sun-medium",color:"#42A5F5",subs:[{key:"GESSKL",label:"\uACC4\uC808\uC0C1\uC2DD"},{key:"SNWRAN",label:"\uB208\uACFC \uBE44"},{key:"WTHFCT",label:"\uC77C\uAE30\uC608\uBCF4"},{key:"GEWTKL",label:"\uB0A0\uC528\uC0C1\uC2DD"}]},{key:"PRSN",label:"\uC778\uBB3C",icon:"user-round",color:"#AB47BC",subs:[{key:"JODYPS",label:"\uC870\uC120\uC2DC\uB300"},{key:"MDKRPS",label:"\uD55C\uAD6D \uADFC\uD604\uB300"},{key:"THKDPS",label:"\uC0BC\uAD6D\uC2DC\uB300"},{key:"WRLART",label:"\uC138\uACC4\uC758 \uC608\uC220\uAC00"},{key:"WRLPSN",label:"\uC138\uACC4\uC758 \uC778\uBB3C"}]},{key:"KRCT",label:"\uD55C\uAD6D\uBB38\uD654",icon:"bow-arrow",color:"#EC407A",subs:[{key:"KRLANG",label:"\uC6B0\uB9AC\uB9D0"},{key:"TRPLCT",label:"\uC804\uD1B5\uB180\uC774"},{key:"HERITG",label:"\uBB38\uD654\uC7AC"},{key:"EVTFES",label:"\uD589\uC0AC\uC640 \uCD95\uC81C"},{key:"GECTKL",label:"\uC0C1\uC2DD"}]},{key:"STRY",label:"\uC774\uC57C\uAE30",icon:"message-circle",color:"#8D6E63",subs:[{key:"FRYTAL",label:"\uB3D9\uD654"},{key:"AMZING",label:"\uC2E0\uAE30\uD55C \uC774\uC57C\uAE30"},{key:"DAYSTR",label:"\uC77C\uC0C1 \uC18D \uC774\uC57C\uAE30"}]},{key:"LOCA",label:"\uC9C0\uC5ED",icon:"map-pin",color:"#26A69A",subs:[{key:"KRLDMK",label:"\uD55C\uAD6D\uC758 \uBA85\uC18C"},{key:"SELNMK",label:"\uC11C\uC6B8\uC758 \uBA85\uC18C"},{key:"WRDTRB",label:"\uC138\uACC4\uC5EC\uD589"},{key:"NAVIGT",label:"\uAE38 \uCC3E\uAE30"}]},{key:"SOAR",label:"\uC0AC\uD68C\uC640 \uC608\uC220",icon:"landmark",color:"#5C6BC0",subs:[{key:"KRSOCI",label:"\uD55C\uAD6D"},{key:"ECONEW",label:"\uACBD\uC81C\uC640 \uB274\uC2A4"},{key:"GENART",label:"\uC608\uC220"},{key:"GELFKL",label:"\uC0DD\uD65C \uC0C1\uC2DD"}]},{key:"NTSC",label:"\uC790\uC5F0\uACFC \uACFC\uD559",icon:"leaf",color:"#9CCC65",subs:[{key:"ANIMAL",label:"\uB3D9\uBB3C"},{key:"PLANTS",label:"\uC2DD\uBB3C"},{key:"ETHPLT",label:"\uC9C0\uAD6C"},{key:"TOLELC",label:"\uB3C4\uAD6C\uC640 \uC804\uC790\uC81C\uD488"},{key:"GESCKL",label:"\uACFC\uD559\uC0C1\uC2DD"}]},{key:"SPRT",label:"\uC2A4\uD3EC\uCE20",icon:"trophy",color:"#FFCA28",subs:[{key:"INVDSP",label:"\uAC1C\uC778\uACBD\uAE30"},{key:"MARART",label:"\uACA9\uD22C\uAE30"},{key:"TEAMSP",label:"\uB2E8\uCCB4\uACBD\uAE30"},{key:"FOOTBL",label:"\uCD95\uAD6C"},{key:"GESPKL",label:"\uC2A4\uD3EC\uCE20 \uC0C1\uC2DD"}]}],ur=[{key:"LISTEN_IN_NOISE",label:"\uC18C\uC74C \uD558 \uBB38\uC7A5 \uB4E3\uAE30",icon:"party-popper",desc:"\uC18C\uC74C \uD658\uACBD \uC18D \uBB38\uC7A5 \uC774\uD574 \uD6C8\uB828"},{key:"SHORT_STORY",label:"\uC9E7\uC740 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square",desc:"\uC9E7\uC740 \uC774\uC57C\uAE30 + 4\uBB38\uC81C"},{key:"LONG_STORY",label:"\uAE34 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square-text",desc:"\uAE34 \uC774\uC57C\uAE30 \uC2EC\uD654 \uD6C8\uB828"},{key:"ORDERING_SENTENCE",label:"\uBB38\uC7A5 \uC21C\uC11C\uD654 \uD558\uAE30",icon:"align-start-vertical",desc:"\uC21C\uC11C \uBC30\uC5F4 \uD6C8\uB828"}];let an=null;function rr(e){an=e}function ir(){return an?.topicTypes??or}function ar(){return an?.trainingTypes??ur}const Ct="ihab_theme",sr="light";function gt(){try{const e=localStorage.getItem(Ct);if(e==="light"||e==="dark"||e==="auto")return e}catch{}return sr}function dt(e){try{document.documentElement.setAttribute("data-theme",e),localStorage.setItem(Ct,e)}catch{}}function lr(){dt(gt())}const ft="ihab_font_scale",cr="medium",Cr=["medium","large1","large2","large3"];function ht(){try{const e=localStorage.getItem(ft);if(Cr.includes(e))return e}catch{}return cr}function mt(e){try{document.documentElement.setAttribute("data-font-scale",e),localStorage.setItem(ft,e)}catch{}}function gr(){mt(ht())}const ge=[],de=[],fe=[],he=[],me={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},Se={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},dr={LISTEN_IN_NOISE:3,SHORT_STORY:2,LONG_STORY:1,ORDERING_SENTENCE:2};let sn=null,St=null,K=null;function yt({counts:e,forceRefresh:n}={}){const t=Object.assign({},dr,e||{}),o=ct(),u=Ce(new Date(`${o}T00:00:00+09:00`).getTime()-864e5),i=JSON.stringify(t);if(!n&&St===o&&sn===i&&K)return Object.assign(me,K.today),Object.assign(Se,K.yesterday?.selection||{LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]}),{today:me,yesterday:Se};const r={LISTEN_IN_NOISE:W(ge,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:W(de,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:W(fe,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:W(he,Math.max(0,Number(t.ORDERING_SENTENCE)||0))};let a=null;return K&&sn===i&&K.yesterday&&K.yesterday.date===u&&(a=K.yesterday.selection),a||(a={LISTEN_IN_NOISE:W(ge,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:W(de,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:W(fe,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:W(he,Math.max(0,Number(t.ORDERING_SENTENCE)||0))}),Object.assign(me,r),Object.assign(Se,a),St=o,sn=i,K={today:r,yesterday:{date:u,countsKey:i,selection:a}},{today:me,yesterday:Se}}function fr(){return{today:me,yesterday:Se}}function hr(){return{LISTEN_IN_NOISE:ge,SHORT_STORY:de,LONG_STORY:fe,ORDERING_SENTENCE:he}}let ln=!1,ye=null;async function mr(){try{const e={url:typeof document>"u"?require("url").pathToFileURL(__filename).href:$e&&$e.tagName.toUpperCase()==="SCRIPT"&&$e.src||new URL("utils.cjs.js",document.baseURI).href}&&void 0||"/",n=await fetch(`${e}data/allTrainingData.json`);return n.ok?await n.json():null}catch{return null}}async function Dt(){if(!ln)return ye||(ye=(async()=>{const e=await mr();if(!e){ye=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}try{for(const n of Object.keys(e||{})){const t=e[n]||[];for(const o of t){const u=o,i=String(u.training_type||n),r=String(u.category_main_code||u.category_main||u.category_0||""),a=String(u.category_sub_code||u.category_sub||u.category_1||""),c=Object.assign({},u,{training_type:i,category_0:r,category_1:a});i==="LISTEN_IN_NOISE"?ge.push(c):i==="SHORT_STORY"?de.push(c):i==="LONG_STORY"?fe.push(c):i==="ORDERING_SENTENCE"&&he.push(c)}}}catch{ye=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}try{window.dispatchEvent(new Event("speechear.data.updated"))}catch{}try{yt()}catch{}ln=!0})(),ye)}function Sr(){return ln}async function yr(e=3e3){const n=Dt();return Promise.race([n,new Promise(t=>setTimeout(t,e))])}const Dr=[{key:"LISTEN_IN_NOISE",label:"\uC18C\uC74C \uD558 \uBB38\uC7A5 \uB4E3\uAE30",icon:"party-popper",desc:"\uB2E4\uC591\uD55C \uC18C\uC74C \uD658\uACBD\uC5D0\uC11C \uBB38\uC7A5 \uCCAD\uB825\uC744 \uD6C8\uB828\uD569\uB2C8\uB2E4."},{key:"SHORT_STORY",label:"\uC9E7\uC740 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square",desc:"\uC9E7\uC740 \uC774\uC57C\uAE30\uB97C \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uBB38\uC81C\uB97C \uD480\uC5B4\uBD05\uB2C8\uB2E4."},{key:"LONG_STORY",label:"\uAE34 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square-text",desc:"\uAE34 \uC774\uC57C\uAE30\uB97C \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uB2E4\uC218\uC758 \uBB38\uC81C\uB97C \uD480\uC5B4\uBD05\uB2C8\uB2E4."},{key:"ORDERING_SENTENCE",label:"\uBB38\uC7A5 \uC21C\uC11C\uD654 \uD558\uAE30",icon:"align-start-vertical",desc:"\uC5EC\uB7EC\uAC1C\uC758 \uC9E7\uC740 \uBB38\uC7A5\uC744 \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uADF8 \uC21C\uC11C\uC5D0 \uB9DE\uAC8C \uBC30\uC5F4\uD569\uB2C8\uB2E4."}],Er=[{key:"FOOD",label:"\uC74C\uC2DD",icon:"salad",color:"#FF8A65",subs:[{key:"TRKRFD",label:"\uD55C\uAD6D \uC804\uD1B5\uC74C\uC2DD"},{key:"MDKRFD",label:"\uD55C\uAD6D \uD604\uB300\uC74C\uC2DD"},{key:"WRLDFD",label:"\uC138\uACC4\uC758 \uC74C\uC2DD"},{key:"MTRFRT",label:"\uC2DD\uC7AC\uB8CC\uC640 \uACFC\uC77C"},{key:"GEFDKL",label:"\uC74C\uC2DD \uC0C1\uC2DD"}]},{key:"HLTH",label:"\uAC74\uAC15",icon:"heart",color:"#66BB6A",subs:[{key:"HTETHB",label:"\uAC74\uAC15\uD55C \uC2DD\uC2B5\uAD00"},{key:"DISILL",label:"\uBCD1\uACFC \uC9C8\uD658"},{key:"EXCISE",label:"\uC6B4\uB3D9"},{key:"GEHTKL",label:"\uAC74\uAC15\uC0C1\uC2DD"}]},{key:"WETH",label:"\uB0A0\uC528",icon:"sun-medium",color:"#42A5F5",subs:[{key:"GESSKL",label:"\uACC4\uC808\uC0C1\uC2DD"},{key:"SNWRAN",label:"\uB208\uACFC \uBE44"},{key:"WTHFCT",label:"\uC77C\uAE30\uC608\uBCF4"},{key:"GEWTKL",label:"\uB0A0\uC528\uC0C1\uC2DD"}]},{key:"PRSN",label:"\uC778\uBB3C",icon:"user-round",color:"#AB47BC",subs:[{key:"JODYPS",label:"\uC870\uC120\uC2DC\uB300"},{key:"MDKRPS",label:"\uD55C\uAD6D \uADFC\uD604\uB300"},{key:"THKDPS",label:"\uC0BC\uAD6D\uC2DC\uB300"},{key:"WRLART",label:"\uC138\uACC4\uC758 \uC608\uC220\uAC00"},{key:"WRLPSN",label:"\uC138\uACC4\uC758 \uC778\uBB3C"}]},{key:"KRCT",label:"\uD55C\uAD6D\uBB38\uD654",icon:"bow-arrow",color:"#EC407A",subs:[{key:"KRLANG",label:"\uC6B0\uB9AC\uB9D0"},{key:"TRPLCT",label:"\uC804\uD1B5\uB180\uC774"},{key:"HERITG",label:"\uBB38\uD654\uC7AC"},{key:"EVTFES",label:"\uD589\uC0AC\uC640 \uCD95\uC81C"},{key:"GECTKL",label:"\uC0C1\uC2DD"}]},{key:"STRY",label:"\uC774\uC57C\uAE30",icon:"message-circle",color:"#8D6E63",subs:[{key:"FRYTAL",label:"\uB3D9\uD654"},{key:"AMZING",label:"\uC2E0\uAE30\uD55C \uC774\uC57C\uAE30"},{key:"DAYSTR",label:"\uC77C\uC0C1 \uC18D \uC774\uC57C\uAE30"}]},{key:"LOCA",label:"\uC9C0\uC5ED",icon:"map-pin",color:"#26A69A",subs:[{key:"KRLDMK",label:"\uD55C\uAD6D\uC758 \uBA85\uC18C"},{key:"SELNMK",label:"\uC11C\uC6B8\uC758 \uBA85\uC18C"},{key:"WRDTRB",label:"\uC138\uACC4\uC5EC\uD589"},{key:"NAVIGT",label:"\uAE38 \uCC3E\uAE30"}]},{key:"SOAR",label:"\uC0AC\uD68C\uC640 \uC608\uC220",icon:"landmark",color:"#5C6BC0",subs:[{key:"KRSOCI",label:"\uD55C\uAD6D"},{key:"ECONEW",label:"\uACBD\uC81C\uC640 \uB274\uC2A4"},{key:"GENART",label:"\uC608\uC220"},{key:"GELFKL",label:"\uC0DD\uD65C \uC0C1\uC2DD"}]},{key:"NTSC",label:"\uC790\uC5F0\uACFC \uACFC\uD559",icon:"leaf",color:"#9CCC65",subs:[{key:"ANIMAL",label:"\uB3D9\uBB3C"},{key:"PLANTS",label:"\uC2DD\uBB3C"},{key:"ETHPLT",label:"\uC9C0\uAD6C"},{key:"TOLELC",label:"\uB3C4\uAD6C\uC640 \uC804\uC790\uC81C\uD488"},{key:"GESCKL",label:"\uACFC\uD559\uC0C1\uC2DD"}]},{key:"SPRT",label:"\uC2A4\uD3EC\uCE20",icon:"trophy",color:"#FFCA28",subs:[{key:"INVDSP",label:"\uAC1C\uC778\uACBD\uAE30"},{key:"MARART",label:"\uACA9\uD22C\uAE30"},{key:"TEAMSP",label:"\uB2E8\uCCB4\uACBD\uAE30"},{key:"FOOTBL",label:"\uCD95\uAD6C"},{key:"GESPKL",label:"\uC2A4\uD3EC\uCE20 \uC0C1\uC2DD"}]}],Tr={LISTEN_IN_NOISE:"listenInNoise",SHORT_STORY:"shortStory",LONG_STORY:"longStory",ORDERING_SENTENCE:"orderingSentence"};let Pe=null,Et=null,Tt=null;function Ar(){const e=rt();if(e&&e.entries.length>0){const n=On();if(Pe&&Et===e&&Tt===n)return Pe;const t=new Set,o=[];for(const u of e.entries)!u.word||t.has(u.word)||(t.add(u.word),o.push({w:u.word,s:u.syllables,p:n?.[u.word]?[...n[u.word].cho??[],...n[u.word].jung??[],...n[u.word].jong??[]]:[],pron:u.pronunciation||u.word,grade:u.grade}));return Pe=o,Et=e,Tt=n,Pe}return[]}new Proxy([],{get(e,n){const t=Ar(),o=t[n];return typeof o=="function"?o.bind(t):o}});const pr={free:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},personal_standard:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},mgr_free:{maxCustomers:5,visitWord:!0,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},none:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},lite_word:{maxCustomers:10,visitWord:!0,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!1},lite_sentence:{maxCustomers:10,visitWord:!1,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!0},lite:{maxCustomers:10,visitWord:!0,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},standard:{maxCustomers:30,visitWord:!0,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},pro:{maxCustomers:50,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0},enterprise:{maxCustomers:1/0,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!0,managerManagement:!0,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!0,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!0,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!0,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0}},wr={none:0,free:1,personal_standard:3,mgr_free:4,lite_word:5,lite_sentence:5,lite:6,standard:7,pro:8,enterprise:9},br={free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1},personal_standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null},mgr_free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1,trainingItemMax:5,customerMax:5,homeworkSendDaily:1},lite:{sentenceTrainingDaily:5,wordTrainingDaily:5,gameDaily:5,trainingItemMax:10,customerMax:10,homeworkSendDaily:10},standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:30,customerMax:30,homeworkSendDaily:30},pro:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:50,homeworkSendDaily:50},enterprise:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:null,homeworkSendDaily:null}};function _r(e){const n=e.toLowerCase();return n.startsWith("manager_enterprise")?"enterprise":n.startsWith("manager_pro")?"pro":n.startsWith("manager_standard")?"standard":n.startsWith("manager_lite_word")?"lite_word":n.startsWith("manager_lite_sentence")?"lite_sentence":n.startsWith("manager_lite")||n.startsWith("mgr_lite")?"lite":n.startsWith("mgr_standard")?"standard":n.startsWith("mgr_pro")?"pro":n.startsWith("content_")||n.startsWith("speechear_")||n.startsWith("light_")||n==="light"?"personal_standard":"none"}const Br=5,Nr=5;function Lr({rank:e,voteCount:n,quota:t=5}){return e<t&&n>0}const Rr={selected:"ALREADY_SELECTED",added:"ALREADY_ADDED",rejected:"ALREADY_REJECTED"},jr="0.133.0";exports.CAPABILITY=qn,exports.CHOSEONG=p,exports.CORE_VERSION=jr,exports.JONGSEONG=L,exports.JUNGSEONG=_,exports.LONG_STORIES=fe,exports.NETWORK_ERROR_MESSAGE=tt,exports.NOISE_DATAS=ge,exports.ORDER_SETS=he,exports.PLAN_FEATURES=pr,exports.PLAN_LIMITS=br,exports.SHORT_STORIES=de,exports.TIER_RANK=wr,exports.TOPIC_TYPES=Er,exports.TRAINING_TYPES=Dr,exports.TRAINING_TYPE_I18N_KEY=Tr,exports.WORD_SUGGESTION_ACCOUNT_LIMIT=Nr,exports.WORD_SUGGESTION_EXISTING_ERROR=Rr,exports.WORD_SUGGESTION_WEEKLY_QUOTA=Br,exports.applyFontScale=mt,exports.applyTheme=dt,exports.buildChangeWholeSyllableProblem=gu,exports.buildDropCompoundProblem=su,exports.buildDropContrast3Problem=au,exports.buildDropContrastProblem=iu,exports.buildDropFinalConsonantProblem=lu,exports.buildMultiPartPosContrast=Ao,exports.buildPairIndex=Do,exports.buildRemoveConsonantProblem=cu,exports.buildSyllableMaskIndex=Cu,exports.bulkSetImageExistence=Zt,exports.cardQuestionTitle=nu,exports.checkImageExists=pn,exports.classifyPairDifficulty=no,exports.clearAudioExistsCache=vt,exports.clearImageExistenceCache=Xt,exports.clearPairIndexCache=Eo,exports.composeSyllable=G,exports.computeDailySelection=yt,exports.configureImageResolver=Vt,exports.configureNoiseSettingsStore=Pu,exports.configurePronunciationResolver=Gt,exports.configureStorage=Lt,exports.configureTTS=It,exports.configureTrainingCategories=rr,exports.copyText=Hu,exports.createDecompCache=eo,exports.createTTSUrlResolver=Wu,exports.dateToDb=er,exports.downloadCsvText=Du,exports.downloadSound=jt,exports.ensureTrainingDataLoaded=yr,exports.escapeCsvField=yu,exports.fileExists=fn,exports.filterContrastCandidates=kn,exports.finalToPhoneme=Hn,exports.firstChoseongOf=wn,exports.formatCount=tr,exports.formatDateKo=Yu,exports.formatDateLocale=Uu,exports.formatDateLongKo=Ku,exports.formatDateLongLocale=Vu,exports.formatDatetimeKo=Ju,exports.formatPhone=Zu,exports.formatRelativeTime=Qu,exports.formatTimeHM=nr,exports.formatYmd=zu,exports.getAssetBaseUrl=gn,exports.getDailySelection=fr,exports.getElementAnalyser=Ht,exports.getElementVolume=Kt,exports.getErrorMessage=fu,exports.getImageExistenceStats=zt,exports.getImageExistsCached=qt,exports.getImageResolver=An,exports.getNoiseBaseUrl=Ot,exports.getNoiseFileGain=kt,exports.getPairIndex=On,exports.getPlanTier=_r,exports.getPronunciationResolver=Ft,exports.getSavedFontScale=ht,exports.getSavedTheme=gt,exports.getSignedOrPublicUrl=hn,exports.getTTSFallbackUrlResolver=Pt,exports.getTTSUrlResolver=Mt,exports.getTodayKst=ct,exports.getTopicTypes=ir,exports.getTrainingPools=hr,exports.getTrainingTypes=ar,exports.getWordPool=rt,exports.hasQuestionWordConstraint=Vo,exports.hasSel=j,exports.hasStructureContrast=Je,exports.initFontScale=gr,exports.initTheme=lr,exports.isAllChoseong=_n,exports.isManualOnlyType=qo,exports.isNetworkErrorMessage=ot,exports.isSyllablePattern=Nn,exports.isThisWeekPick=Lr,exports.isTrainingDataLoaded=Sr,exports.isValidQuestionWord=Jo,exports.itemCorrectness=it,exports.jamoToNamesForSpeech=tu,exports.loadGameLeaderboard=Mu,exports.loadMyGameRanks=Iu,exports.loadNoiseSettings=$u,exports.loadTrainingData=Dt,exports.logCrossword=Bu,exports.logTrainingCompletion=bu,exports.logTrainingTime=pu,exports.matchSyllables=Z,exports.matchesChoseongSearch=to,exports.matchesSyllablePattern=Rn,exports.matchesWordQuery=we,exports.mergeQuestionText=et,exports.minimalPairDistractors=To,exports.normalizeDate=Xu,exports.officialSoundPath=xu,exports.parseSortValue=Su,exports.parseSyllable=m,exports.patternToComposition=Co,exports.phonemePartsOf=zo,exports.pickEuRo=Jn,exports.pickEulReul=Kn,exports.pickEunNeun=Un,exports.pickIga=Yn,exports.pickWaGwa=Vn,exports.prewarmImageCache=Qt,exports.primarySelPart=ke,exports.readLevel=Ut,exports.reorderArray=Ho,exports.reportAppliedNoiseSettings=Gu,exports.resolveAssetUrl=Bt,exports.resolveSoundPath=Rt,exports.resumeAudioMeter=Wt,exports.routeElementAudio=En,exports.sample=W,exports.saveNoiseSettings=vu,exports.searchAndRankWords=ho,exports.setAssetBaseUrl=_t,exports.setCrosswordLogger=_u,exports.setElementVolume=Yt,exports.setGameLeaderboardLoader=Ou,exports.setGameRanksLoader=ju,exports.setGameScoreSubmitter=Ru,exports.setTrainingCompletionLogger=wu,exports.setTrainingTimeLogger=Au,exports.setWordPool=Tu,exports.shuffle=R,exports.sortToValue=mu,exports.soundOf=on,exports.speak=At,exports.stopSpeaking=pt,exports.submitGameScore=ku,exports.syllMatchesComp=q,exports.syllableContrasts=X,exports.syllableLength=io,exports.syllablePron=nt,exports.toBase64UrlSafe=Fu,exports.toChoseong=bn,exports.toItemResults=Nu,exports.toKstHm=qu,exports.toKstYmd=Ce,exports.toStandardPronunciation=Mo,exports.toStorageName=Me,exports.toUserErrorMessage=hu,exports.validateSyllableSearchInput=fo,exports.withEuRo=Wo,exports.withEulReul=Go,exports.withEunNeun=Fo,exports.withIga=vo,exports.withWaGwa=xo,exports.wordContainsChoseong=oo,exports.wordContainsJongseong=ro,exports.wordContainsJungseong=uo,exports.wordHasNoCoda=ao,exports.wordHasSyllableMatching=lo,exports.wrongItems=Lu;
20
+ `),this.name="StorageNotConfiguredError"}};function Lt(e){Nt(e)}function Rt(e,n){if(!e)return null;const t=Q();return t?.resolvePath?t.resolvePath(e,n):n?`${n}/${e}.mp3`:null}async function mn(e){if(!e)return!1;const n=Q();if(!n)throw new Ge("fileExists");if(n.exists)return n.exists(e);try{return await n.resolveUrl(e)!==null}catch{return!1}}async function Sn(e){if(!e)return null;const n=Q();if(!n)throw new Ge("getSignedOrPublicUrl");try{return await n.resolveUrl(e)}catch{return null}}async function jt(e){const n=Q();if(!n)throw new Ge("downloadSound");return n.download(e)}function Ot(){return Q()?.noiseBaseUrl??"/sounds/noise"}function kt(){const e=Number(Q()?.noiseFileGain);return Number.isFinite(e)&&e>0?e:1}const Fe="__ihab_core_tts_config__";function It(e){globalThis[Fe]=e}function Mt(){return globalThis[Fe]?.urlResolver??null}function Pt(){return globalThis[Fe]?.fallbackUrlResolver??null}const $t=new Map;function vt(){$t.clear()}const yn="__ihab_core_pronunciation_resolver__";function Gt(e){globalThis[yn]=e}function Ft(){return globalThis[yn]??null}let Y=null;const ue=new WeakMap,xe=new WeakMap,We=new WeakMap;let Dn=!1;const En=e=>Math.max(0,Math.min(1,Number.isFinite(e)?e:0));function xt(){if(Dn||typeof document>"u")return;Dn=!0;const e=()=>{try{Y&&Y.state!=="running"&&Y.resume()}catch{}};for(const n of["pointerdown","touchend","keydown"])document.addEventListener(n,e,{capture:!0,passive:!0})}function Tn(){if(Y)return Y;try{const e=window.AudioContext||window.webkitAudioContext;return e?(Y=new e,xt(),Y):null}catch{return null}}function Wt(){try{Y?.resume()}catch{}}function He(e,n){const t=ue.get(n);if(t)return t;try{const o=e.createMediaElementSource(n),r=e.createGain(),i=e.createAnalyser();i.fftSize=1024,i.smoothingTimeConstant=.6,r.gain.value=En(xe.get(n)??n.volume),o.connect(r),r.connect(i),r.connect(e.destination);try{n.volume=1}catch{}const u={gain:r,analyser:i};return ue.set(n,u),u}catch{return null}}function An(e){if(!e)return Promise.resolve(null);const n=ue.get(e);if(n)return Promise.resolve(n.analyser);const t=Tn();if(!t)return Promise.resolve(null);if(t.state==="running")return Promise.resolve(He(t,e)?.analyser??null);const o=We.get(e);if(o)return o;const r=Promise.resolve().then(()=>t.resume()).then(()=>t.state==="running"?He(t,e)?.analyser??null:null).catch(()=>null).finally(()=>{We.delete(e)});return We.set(e,r),r}function Ht(e){if(!e)return null;const n=ue.get(e);if(n)return n.analyser;const t=Tn();return t?t.state==="running"?He(t,e)?.analyser??null:(An(e),null):null}function Yt(e,n){const t=En(n);xe.set(e,t);const o=ue.get(e);if(o){try{e.volume!==1&&(e.volume=1)}catch{}const r=o.gain.gain;try{const i=o.gain.context.currentTime;r.cancelScheduledValues(i),r.setTargetAtTime(t,i,.01)}catch{try{r.value=t}catch{}}return"gain"}try{e.volume=t}catch{}return"element"}function Kt(e){return xe.get(e)??e.volume}function Ut(e,n){e.getFloatTimeDomainData(n);let t=0;for(let o=0;o<n.length;o++){const r=n[o];t+=r*r}return Math.sqrt(t/n.length)}const pn="__ihab_core_image_config__";function Vt(e){globalThis[pn]=e}function wn(){return globalThis[pn]??null}const re="word_image_existence_map_v1";let M=null;const we=new Map;function ie(){if(M)return M;try{const e=typeof localStorage<"u"?localStorage.getItem(re):null;M=e?JSON.parse(e):{}}catch{M={}}return M}let Ye=null;function Jt(){Ye||(Ye=setTimeout(()=>{Ye=null;try{typeof localStorage<"u"&&M&&localStorage.setItem(re,JSON.stringify(M))}catch{}},200))}function be(e,n){return`${e}_${n??1}`}async function bn(e,n){const t=ie(),o=be(e,n);if(o in t)return t[o];if(we.has(o))return we.get(o);const r=wn();if(!r)return!1;const i=r(e,n);if(!i)return!1;const u=fetch(i,{method:"HEAD",signal:AbortSignal.timeout(8e3)}).then(a=>a.ok).catch(()=>!1).then(a=>(t[o]=a,Jt(),we.delete(o),a));return we.set(o,u),u}function qt(e,n){const t=ie(),o=be(e,n);return o in t?t[o]:void 0}async function Qt(e,n={}){const{force:t=!1,concurrency:o=16,onProgress:r}=n,i=ie(),u=t?Array.from(new Set(e)):Array.from(new Set(e)).filter(c=>!(be(c)in i));let a=0;if(u.length>0){let c=0;const l=Array.from({length:Math.min(o,u.length)},async()=>{for(;c<u.length;){const g=c++,s=u[g],C=be(s);if(!t&&C in i){a++,r?.(a,u.length);continue}try{await bn(s)}catch{}a++,r?.(a,u.length)}});await Promise.all(l)}try{typeof localStorage<"u"&&M&&localStorage.setItem(re,JSON.stringify(M))}catch{}return{checked:u.length,cached:Object.keys(i).length,total:e.length}}function zt(){const e=ie(),n=Object.values(e);return n.length===0?null:{total:n.length,exists:n.filter(Boolean).length}}function Zt(e){const n=ie();Object.assign(n,e);try{typeof localStorage<"u"&&localStorage.setItem(re,JSON.stringify(n))}catch{}}function Xt(){M={};try{typeof localStorage<"u"&&localStorage.removeItem(re)}catch{}}const p=["\u3131","\u3132","\u3134","\u3137","\u3138","\u3139","\u3141","\u3142","\u3143","\u3145","\u3146","\u3147","\u3148","\u3149","\u314A","\u314B","\u314C","\u314D","\u314E"],_=["\u314F","\u3150","\u3151","\u3152","\u3153","\u3154","\u3155","\u3156","\u3157","\u3158","\u3159","\u315A","\u315B","\u315C","\u315D","\u315E","\u315F","\u3160","\u3161","\u3162","\u3163"],L=["","\u3131","\u3132","\u3133","\u3134","\u3135","\u3136","\u3137","\u3139","\u313A","\u313B","\u313C","\u313D","\u313E","\u313F","\u3140","\u3141","\u3142","\u3144","\u3145","\u3146","\u3147","\u3148","\u314A","\u314B","\u314C","\u314D","\u314E"];function m(e){if(!e)return null;const n=e.charCodeAt(0)-44032;return n<0||n>=11172?null:{cho:Math.floor(n/588),jung:Math.floor(n%588/28),jong:n%28}}function eo(){const e=new Map;return n=>{let t=e.get(n);return t||(t=[...n].map(o=>m(o)),e.set(n,t)),t}}function G(e,n,t=0){return String.fromCharCode(44032+(e*21+n)*28+t)}function no(e,n){if(!e||!n||e===n||e.length!==n.length)return"random";let t=0,o=null;for(let r=0;r<e.length;r++){const i=m(e[r]),u=m(n[r]);if(!i||!u)return"random";if(i.cho===u.cho&&i.jung===u.jung&&i.jong===u.jong)continue;t++;const a=i.cho!==u.cho,c=i.jung!==u.jung,l=i.jong!==u.jong;(a?1:0)+(c?1:0)+(l?1:0)>1?o="multi":a?o="cho":c?o="jung":o="jong"}return t!==1?"random":o==="cho"?"cho":o==="jung"?"jung":o==="jong"?"jong":"random"}function _n(e){const n=m(e[0]||"");return n?p[n.cho]:""}function Bn(e){return[...e].map(n=>{const t=m(n);return t?p[t.cho]:n}).join("")}function Nn(e){return!!e&&[...e].every(n=>p.includes(n))}function to(e,n){return n?Nn(n)?Bn(e).includes(n):e.toLowerCase().includes(n.toLowerCase()):!0}function _e(e,n){if(!n)return!0;const t=[...n],o=a=>p.includes(a),r=a=>_.includes(a),i=t.map(a=>o(a)?"cho":r(a)?"jung":m(a)?"syl":"other");if(i.includes("other"))return e.toLowerCase().includes(n.toLowerCase());const u=[...e];for(let a=0;a+t.length<=u.length;a++){let c=!0;for(let l=0;l<t.length;l++){const g=u[a+l],s=i[l];if(s==="cho"){if(_n(g)!==t[l]){c=!1;break}}else if(s==="jung"){const C=m(g);if(!C||_[C.jung]!==t[l]){c=!1;break}}else{const C=m(t[l]);if(C&&C.jong===0){const h=m(g);if(!h||h.cho!==C.cho||h.jung!==C.jung){c=!1;break}}else if(g!==t[l]){c=!1;break}}}if(c)return!0}return!1}const Ke={3:["\u3131","\u3145"],5:["\u3134","\u3148"],6:["\u3134","\u314E"],9:["\u3139","\u3131"],10:["\u3139","\u3141"],11:["\u3139","\u3142"],12:["\u3139","\u3145"],13:["\u3139","\u314C"],14:["\u3139","\u314D"],15:["\u3139","\u314E"],18:["\u3142","\u3145"]},Ln=Object.fromEntries(Object.entries(Ke).map(([e,n])=>[n.join(""),L[Number(e)]]));function oo(e,n){if(!e||!n)return!1;for(const t of e){const o=m(t);if(o&&p[o.cho]===n)return!0}return!1}function uo(e,n){if(!e||!n)return!1;for(const t of e){const o=m(t);if(o&&_[o.jung]===n)return!0}return!1}function ro(e,n){if(!e||!n)return!1;for(const t of e){const o=m(t);if(!o||o.jong<=0)continue;if(L[o.jong]===n)return!0;const r=Ke[o.jong];if(r&&r.includes(n))return!0}return!1}function io(e){if(!e)return 0;let n=0;for(const t of e)m(t)&&n++;return n}function ao(e){if(!e)return!1;let n=!1;for(const t of e){const o=m(t);if(o&&(n=!0,o.jong>0))return!1}return n}function so(e,n){if(e.jong<=0)return!1;if(n.includes(L[e.jong]))return!0;const t=Ke[e.jong];return!!t&&t.some(o=>n.includes(o))}function lo(e,n,t){if(!e)return!1;const o=[...e],r=i=>{const u=m(o[i]);if(!u||n.cho&&!n.cho.includes(p[u.cho])||n.jung&&!n.jung.includes(_[u.jung]))return!1;if(n.jongNone){if(u.jong>0)return!1}else if(n.jong&&!so(u,n.jong))return!1;return!0};if(t==="head")return r(0);if(t==="tail")return r(o.length-1);if(t==="mid"){for(let i=1;i<o.length-1;i++)if(r(i))return!0;return!1}for(let i=0;i<o.length;i++)if(r(i))return!0;return!1}function Rn(e){return e.includes(",")||e.includes("_")}function jn(e){if(e==="")return[{kind:"any"}];if(e.includes("_")){const n=[...e];if(n.length>4)return[{kind:"invalid"}];const t=n[0]??"_",o=n[1]??"_";let r=n.slice(2).join("");if(r.length===2){const i=Ln[r];if(!i)return[{kind:"invalid"}];r=i}return[{kind:"template",cho:t,jung:o,jong:r||"_"}]}return[...e].map(n=>m(n)?{kind:"syllable",ch:n}:p.includes(n)?{kind:"cho",jamo:n}:_.includes(n)?{kind:"jung",jamo:n}:{kind:"invalid"})}function co(e,n){switch(n.kind){case"any":return!0;case"syllable":{const t=m(n.ch);if(!t)return e===n.ch;if(t.jong===0){const o=m(e);return!!o&&o.cho===t.cho&&o.jung===t.jung}return e===n.ch}case"cho":{const t=m(e);return!!t&&p[t.cho]===n.jamo}case"jung":{const t=m(e);return!!t&&_[t.jung]===n.jamo}case"template":{const t=m(e);return!(!t||n.cho!=="_"&&p[t.cho]!==n.cho||n.jung!=="_"&&_[t.jung]!==n.jung||n.jong!=="_"&&L[t.jong]!==n.jong)}case"invalid":return!1}}function On(e,n){const t=n.split(",").flatMap(r=>jn(r.trim()));if(t.length===0)return!0;const o=[...e];if(o.length<t.length)return!1;for(let r=0;r+t.length<=o.length;r++)if(t.every((i,u)=>co(o[r+u],i)))return!0;return!1}function Co(e){const n=e.split(",").flatMap(i=>jn(i.trim())),t=new Set,o=new Set,r=new Set;for(const i of n)switch(i.kind){case"cho":t.add(i.jamo);break;case"jung":o.add(i.jamo);break;case"template":i.cho!=="_"&&t.add(i.cho),i.jung!=="_"&&o.add(i.jung),i.jong!=="_"&&r.add(i.jong);break;case"syllable":{const u=m(i.ch);u&&(t.add(p[u.cho]),o.add(_[u.jung]),u.jong!==0&&r.add(L[u.jong]));break}}return t.size===0&&o.size===0&&r.size===0?null:{cho:t.size?[...t]:null,jung:o.size?[...o]:null,jong:r.size?[...r]:null}}function go(e){return!!m(e)||p.includes(e)||_.includes(e)}function fo(e){const n=e.trim();if(!n)return{ok:!0};for(const t of n.split(",")){const o=t.trim();if(o!==""){if(o.includes("_")){const r=[...o];if(r.length>4)return{ok:!1};const i=r[0],u=r[1],a=r.slice(2).join(""),c=i===void 0||i==="_"||p.includes(i),l=u===void 0||u==="_"||_.includes(u),g=a===""||a==="_"||L.filter(Boolean).includes(a)||!!Ln[a];if(c&&l&&g)continue;return{ok:!1}}if(![...o].every(go))return{ok:!1}}}return{ok:!0}}p.length,_.length,L.length;function ho(e,n){const t=n.trim();if(!t||!/[^\s,_]/.test(t))return e;if(Rn(t))return e.filter(u=>On(u.word,t));const o=e.filter(u=>_e(u.word,t)||_e(u.pronunciation??"",t)),r=[...t].length,i=u=>!!u&&_e(u.slice(0,r),t);return o.map(u=>({w:u,rank:i(u.word)||i(u.pronunciation??"")?0:1})).sort((u,a)=>u.rank-a.rank).map(u=>u.w)}const Ue="word_pair_index_v2",Ve="word_pair_index_sig_v2";let P=null,ae=null;function kn(){try{if(typeof localStorage>"u")return null;const e=localStorage.getItem(Ue),n=localStorage.getItem(Ve);return!e||!n?null:{index:JSON.parse(e),sig:n}}catch{return null}}function mo(e,n){try{if(typeof localStorage>"u")return;localStorage.setItem(Ue,JSON.stringify(e)),localStorage.setItem(Ve,n)}catch{}}function So(e){const n=e.map(o=>`${o.word}|${o.pron??""}`).sort();let t=0;for(const o of n)for(let r=0;r<o.length;r++)t=(t<<5)-t+o.charCodeAt(r)|0;return`${n.length}-${t}`}async function yo(e,n){const t=new Set,o=[];for(const l of e){if(!l.word||t.has(l.word))continue;const g=l.pron||l.word,s=Array.from(g).map(m);s.some(C=>C===null)||s.length===Array.from(l.word).length&&(t.add(l.word),o.push({word:l.word,syls:s}))}const r={},i=o.length,u=new Map;for(const l of o){const g=l.syls.length;u.has(g)||u.set(g,[]),u.get(g).push(l)}let a=0;const c=["cho","jung","jong"];for(const l of u.values()){const g=l[0].syls.length;for(let s=0;s<g;s++)for(const C of c){const h=new Map;for(const S of l){let y="";for(let f=0;f<g;f++){f>0&&(y+="~");const d=S.syls[f];f===s?C==="cho"?y+=`*:${d.jung}:${d.jong}`:C==="jung"?y+=`${d.cho}:*:${d.jong}`:y+=`${d.cho}:${d.jung}:*`:y+=`${d.cho}:${d.jung}:${d.jong}`}let D=h.get(y);D||(D=[],h.set(y,D)),D.push(S)}for(const S of h.values())if(!(S.length<2))for(let y=0;y<S.length;y++){const D=S[y];for(let f=y+1;f<S.length;f++){const d=S[f];D.syls[s][C]!==d.syls[s][C]&&(r[D.word]||(r[D.word]={cho:[],jung:[],jong:[]}),r[d.word]||(r[d.word]={cho:[],jung:[],jong:[]}),r[D.word][C].push(d.word),r[d.word][C].push(D.word))}}}a+=l.length,n?.(a,i),await new Promise(s=>setTimeout(s,0))}return i>0&&n?.(i,i),r}async function Do(e,n={}){const t=So(e);if(!n.force){if(P&&ae===t)return P;const r=kn();if(r&&r.sig===t)return P=r.index,ae=t,P}const o=await yo(e,n.onProgress);return P=o,ae=t,mo(o,t),o}function In(){if(P)return P;const e=kn();return e?(P=e.index,ae=e.sig,P):null}function Eo(){P=null,ae=null;try{typeof localStorage<"u"&&(localStorage.removeItem(Ue),localStorage.removeItem(Ve))}catch{}}const Je={cho:p,jung:_,jong:L},j=e=>Array.isArray(e)?e.length>0:!!e;function qe(e,n){if(e.length!==n.length)return!1;for(let t=0;t<e.length;t++){const o=e[t],r=n[t];if(!(!o||!r)&&(o.cho!==r.cho&&p[o.cho]==="\u3147"!=(p[r.cho]==="\u3147")||o.jong!==r.jong&&o.jong===0!=(r.jong===0)))return!0}return!1}function Mn(e,n,t){const o=t.pronOf(e),r=t.decompOf,i=t.sameStructureOnly&&r?r(o):null,u=[];for(const a of n)a!==e&&(t.okSet&&!t.okSet.has(a)||t.pronOf(a)!==o&&(i&&r&&qe(i,r(t.pronOf(a)))||u.push(a)));return u}function To(e,n,t){const o=n?.[e];if(!o)return[];const r=t.kind?o[t.kind]??[]:[...o.cho??[],...o.jung??[],...o.jong??[]];return Mn(e,r,t)}function Ao(e,n,t,o,r,i,u){const a=["cho","jung","jong"].filter(C=>j(e[C])),c={};for(const C of a){const h=e[C];c[C]=new Set(Array.isArray(h)?h:[h])}const l=r==="pron",g=new Map;for(const C of n){const h=t(i(C));if(h.some(f=>!f))continue;let S=h;if(!l&&(S=t(C),S.length!==h.length||S.some(f=>!f)))continue;const y=h.length,D=g.get(y);D?D.push({w:C,dPron:h,dPos:S}):g.set(y,[{w:C,dPron:h,dPos:S}])}const s=new Map;for(const[C,h]of g){const S=new Map,y=(D,f)=>{const d=D.dPos[f];return d!=null&&a.every(E=>c[E].has(Je[E][d[E]]))};for(const D of h){let f;if(u==="head")f=y(D,0)?0:-1;else if(u==="tail")f=y(D,C-1)?C-1:-1;else if(u==="mid"){f=-1;for(let E=1;E<C-1;E++)if(y(D,E)){f=E;break}}else f=D.dPos.findIndex(E=>E!=null&&a.every(T=>c[T].has(Je[T][E[T]])));if(f<0)continue;const d=S.get(f);d?d.push(D):S.set(f,[D])}for(const[D,f]of S){const d=new Set(a.map(w=>D+":"+w)),E=w=>{let B="";for(let b=0;b<C;b++){const O=w[b];for(const H of["cho","jung","jong"])B+=(d.has(b+":"+H)?"*":O[H])+"."}return B},T=new Map;for(const w of h){const B=E(w.dPron),b=T.get(B);b?b.push(w):T.set(B,[w])}for(const w of f){const B=T.get(E(w.dPron))??[],b=[];for(const O of B){if(O.w===w.w)continue;let H=!0;for(const A of a){const v=w.dPron[D][A],V=O.dPron[D][A];if(V===v){H=!1;break}if(l&&c[A].has(Je[A][V])){H=!1;break}}H&&(o&&qe(w.dPron,O.dPron)||b.push(O.w))}s.set(w.w,b)}}}return s}const Be=0,Pn=1,J=2,Qe=3,po=4,Ne=5,ze=6,Le=7,wo=8,Ze=9,z=10,bo=11,se=12,_o=13,le=14,Re=15,je=16,ce=17,Bo=18,k=0,F=1,No=3,K=4,Xe=5,Ce=6,$=7,N=8,$n=9,vn=10,Oe=11,Gn=12,en=13,Z=15,ke=16,x=17,Fn=18,nn=21,tn=27,Lo=20,Ro={1:Be,2:Pn,4:J,7:Qe,8:Ne,16:ze,17:Le,19:Ze,20:z,22:se,23:le,24:Re,25:je,26:ce},jo={[No]:[F,z],[Xe]:[K,se],[$n]:[N,Be],[vn]:[N,ze],[Oe]:[N,Le],[Gn]:[N,z],[en]:[N,je],14:[N,ce],[Fn]:[x,z]},Oo={[Ce]:J,[Z]:Ne},on={2:F,24:F,3:F,9:F,5:K,6:K,19:$,20:$,22:$,23:$,25:$,27:$,11:N,12:N,13:N,15:N,10:ke,14:x,18:x,26:x},xn={[Be]:Re,[Qe]:je,[Le]:ce,[se]:le},Wn={[Be]:Pn,[Qe]:po,[Le]:wo,[Ze]:z,[se]:_o},ko=new Set([Xe,vn,Oe,Gn,en,Z,Fn]),Io=new Set(["\uBC1F"]);function Mo(e){const n=(e??"").trim();if(!n)return"";const t=[...n],o=t.map(m);if(o.some(i=>i===null))return n;const r=o;for(let i=0;i<r.length;i++){const u=r[i],a=r[i+1],c=u.jong;if(!a){u.jong=on[u.jong]??u.jong;break}if(u.jong===k)continue;if(a.cho===bo){if(a.jung===Lo){if(u.jong===$){u.jong=k,a.cho=se;continue}if(u.jong===25){u.jong=k,a.cho=le;continue}if(u.jong===en){u.jong=N,a.cho=le;continue}}if(u.jong===tn){u.jong=k;continue}const g=Oo[u.jong];if(g!==void 0){u.jong=k,a.cho=g;continue}const s=jo[u.jong];if(s){u.jong=s[0],a.cho=s[1];continue}const C=Ro[u.jong];C!==void 0&&(u.jong=k,a.cho=C);continue}if((u.jong===tn||u.jong===Ce||u.jong===Z)&&xn[a.cho]!==void 0){a.cho=xn[a.cho],u.jong=u.jong===Ce?K:u.jong===Z?N:k;continue}if((u.jong===tn||u.jong===Ce||u.jong===Z)&&a.cho===Ze){a.cho=z,u.jong=u.jong===Ce?K:u.jong===Z?N:k;continue}if(a.cho===Bo){if(u.jong===Xe){u.jong=K,a.cho=le;continue}if(u.jong===$n){u.jong=N,a.cho=Re;continue}if(u.jong===Oe){u.jong=N,a.cho=ce;continue}const g=on[u.jong]??u.jong;if(g===F){u.jong=k,a.cho=Re;continue}if(g===$){u.jong=k,a.cho=je;continue}if(g===x){u.jong=k,a.cho=ce;continue}}let l=on[u.jong]??u.jong;c===Oe&&Io.has(t[i])&&(l=x),u.jong=l,Wn[a.cho]!==void 0&&(l===F||l===$||l===x||ko.has(c))&&(a.cho=Wn[a.cho]),(a.cho===J||a.cho===ze)&&(u.jong===F?u.jong=nn:u.jong===$?u.jong=K:u.jong===x&&(u.jong=ke)),a.cho===Ne?u.jong===K?u.jong=N:u.jong===ke||u.jong===nn?a.cho=J:u.jong===F?(u.jong=nn,a.cho=J):u.jong===x&&(u.jong=ke,a.cho=J):u.jong===N&&a.cho===J&&(a.cho=Ne)}return r.map(i=>G(i.cho,i.jung,i.jong)).join("")}const Po={\u3131:"\u3131",\u3132:"\u3131",\u314B:"\u3131",\u3133:"\u3131",\u313A:"\u3131",\u3134:"\u3134",\u3135:"\u3134",\u3136:"\u3134",\u3137:"\u3137",\u3145:"\u3137",\u3146:"\u3137",\u3148:"\u3137",\u314A:"\u3137",\u314C:"\u3137",\u314E:"\u3137",\u3139:"\u3139",\u313C:"\u3139",\u313D:"\u3139",\u313E:"\u3139",\u3140:"\u3139",\u3141:"\u3141",\u313B:"\u3141",\u3142:"\u3142",\u314D:"\u3142",\u313F:"\u3142",\u3144:"\u3142",\u3147:"\u3147"};function Hn(e){return Po[e]??e}const X=/[ㄱ-ㅎ]/,$o=/[ㅏ-ㅣ]/;function ge(e){for(let n=e.length-1;n>=0;n--){const t=e[n],o=t.charCodeAt(0);if(o>=44032&&o<=55203||X.test(t)||$o.test(t))return t}return null}function Yn(e){const n=ge(e);if(!n)return"\uAC00";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC774":"\uAC00":X.test(n)?"\uC774":"\uAC00"}function vo(e){return`${e}${Yn(e)}`}function Kn(e){const n=ge(e);if(!n)return"\uB97C";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC744":"\uB97C":X.test(n)?"\uC744":"\uB97C"}function Go(e){return`${e}${Kn(e)}`}function Un(e){const n=ge(e);if(!n)return"\uB294";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC740":"\uB294":X.test(n)?"\uC740":"\uB294"}function Fo(e){return`${e}${Un(e)}`}function Vn(e){const n=ge(e);if(!n)return"\uC640";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uACFC":"\uC640":X.test(n)?"\uACFC":"\uC640"}function xo(e){return`${e}${Vn(e)}`}function Jn(e){const n=ge(e);if(!n)return"\uB85C";const t=n.charCodeAt(0);if(t>=44032&&t<=55203){const o=(t-44032)%28;return o===0||o===8?"\uB85C":"\uC73C\uB85C"}return n==="\u3139"?"\uB85C":X.test(n)?"\uC73C\uB85C":"\uB85C"}function Wo(e){return`${e}${Jn(e)}`}function Ho(e,n,t){const o=e.slice(),[r]=o.splice(n,1);return o.splice(t,0,r),o}function R(e,n=Math.random){const t=e.slice();for(let o=t.length-1;o>0;o--){const r=Math.floor(n()*(o+1));[t[o],t[r]]=[t[r],t[o]]}return t}function W(e,n,t=Math.random){return!Array.isArray(e)||e.length===0||n<=0?[]:n>=e.length?R(e,t):R(e,t).slice(0,n)}const qn={SAME_SOUND_PICK:{difficulty:!0,choseong:!0,group:"discrimination"},SAME_OR_DIFF:{difficulty:!0,choseong:!0,group:"discrimination"},HEAR_AND_PICK_SAME:{difficulty:!0,choseong:!0,group:"discrimination"},HEAR_AND_PICK_INCLUDED:{difficulty:!0,choseong:!0,group:"discrimination"},STARTS_WITH_SAME_SOUND:{difficulty:!1,choseong:!0,group:"discrimination"},LISTEN_AND_REMEMBER_ORDER:{difficulty:!1,choseong:!0,group:"attention"},MERGE_2_SYLLABLES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_3_SYLLABLES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_2_PHONEMES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_3_PHONEMES:{difficulty:!1,choseong:!0,group:"synthesis"},DROP_1_FROM_2SYLL:{difficulty:!1,choseong:!0,group:"deletion"},DROP_1_FROM_3SYLL:{difficulty:!1,choseong:!0,group:"deletion"},DROP_PART_FROM_COMPOUND:{difficulty:!1,choseong:!0,group:"deletion"},DROP_FINAL_CONSONANT_FROM_1SYLL:{difficulty:!1,choseong:!0,group:"deletion"},REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:{difficulty:!1,choseong:!0,group:"deletion"},CHANGE_1_SYLL_IN_2SYLL:{difficulty:!0,choseong:!0,group:"substitution"},CHANGE_1_SYLL_IN_3SYLL:{difficulty:!0,choseong:!0,group:"substitution"},CHANGE_1_PHONEME_IN_1SYLL:{difficulty:!1,choseong:!0,group:"substitution"},CHANGE_1_PHONEME_IN_2SYLL:{difficulty:!0,choseong:!0,group:"substitution"}};function Yo(e){const n=e?qn[e]?.group:void 0;return n==="synthesis"||n==="deletion"||n==="substitution"?n:null}const Ko=p.indexOf("\u3147"),Qn={DROP_FINAL_CONSONANT_FROM_1SYLL:{syllables:1,syllable:e=>e.jong>0},REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:{syllables:1,syllable:e=>e.jong===0&&e.cho!==Ko},MERGE_2_SYLLABLES:{syllables:2,syllable:()=>!0},MERGE_3_SYLLABLES:{syllables:3,syllable:()=>!0},MERGE_2_PHONEMES:{syllables:1,syllable:e=>e.jong===0},MERGE_3_PHONEMES:{syllables:1,syllable:e=>e.jong>0}},Uo=new Set([]);function Vo(e){return e in Qn}function Jo(e,n){const t=Qn[e];if(!t)return!0;const o=[...n];if(o.length!==t.syllables)return!1;const r=m(o[0]);return!!r&&t.syllable(r)}function qo(e){return Uo.has(e)}function Qo(e){const n=e.charCodeAt((e.length||1)-1)||0;return n<44032||n>55203||(n-44032)%28===0?"\uC640":"\uACFC"}function un(e){const n=e.charCodeAt((e.length||1)-1)||0;return n<44032||n>55203||(n-44032)%28===0?"\uB97C":"\uC744"}function zn(e){const n=e.charCodeAt((e.length||1)-1)||0;if(n<44032||n>55203)return"\uB85C";const t=(n-44032)%28;return t===0||t===8?"\uB85C":"\uC73C\uB85C"}function Zn(e){const n=e.charAt((e.length||1)-1),t=n.charCodeAt(0)||0;return t>=44032&&t<=55203?(t-44032)%28===0?"\uAC00":"\uC774":/[ㄱ-ㅎ]/.test(n)?"\uC774":"\uAC00"}const Xn={\u3131:"\uAE30\uC5ED",\u3132:"\uC30D\uAE30\uC5ED",\u3134:"\uB2C8\uC740",\u3137:"\uB514\uADFF",\u3138:"\uC30D\uB514\uADFF",\u3139:"\uB9AC\uC744",\u3141:"\uBBF8\uC74C",\u3142:"\uBE44\uC74D",\u3143:"\uC30D\uBE44\uC74D",\u3145:"\uC2DC\uC637",\u3146:"\uC30D\uC2DC\uC637",\u3147:"\uC774\uC751",\u3148:"\uC9C0\uC752",\u3149:"\uC30D\uC9C0\uC752",\u314A:"\uCE58\uC753",\u314B:"\uD0A4\uC754",\u314C:"\uD2F0\uC755",\u314D:"\uD53C\uC756",\u314E:"\uD788\uC757",\u3133:"\uAE30\uC5ED\uC2DC\uC637",\u3135:"\uB2C8\uC740\uC9C0\uC752",\u3136:"\uB2C8\uC740\uD788\uC757",\u313A:"\uB9AC\uC744\uAE30\uC5ED",\u313B:"\uB9AC\uC744\uBBF8\uC74C",\u313C:"\uB9AC\uC744\uBE44\uC74D",\u313D:"\uB9AC\uC744\uC2DC\uC637",\u313E:"\uB9AC\uC744\uD2F0\uC755",\u313F:"\uB9AC\uC744\uD53C\uC756",\u3140:"\uB9AC\uC744\uD788\uC757",\u3144:"\uBE44\uC74D\uC2DC\uC637",\u314F:"\uC544",\u3150:"\uC560",\u3151:"\uC57C",\u3152:"\uC598",\u3153:"\uC5B4",\u3154:"\uC5D0",\u3155:"\uC5EC",\u3156:"\uC608",\u3157:"\uC624",\u3158:"\uC640",\u3159:"\uC65C",\u315A:"\uC678",\u315B:"\uC694",\u315C:"\uC6B0",\u315D:"\uC6CC",\u315E:"\uC6E8",\u315F:"\uC704",\u3160:"\uC720",\u3161:"\uC73C",\u3162:"\uC758",\u3163:"\uC774"};function zo(e){if([...e].length!==1)return[e];const n=m(e);if(!n)return[e];const t=[p[n.cho],_[n.jung]];return n.jong!==0&&t.push(L[n.jong]),t}function et(e,n=!1){const t=e.filter(Boolean);if(t.length<2)return"";const o=a=>Xn[a]??a,r=t.slice(0,-1).map(a=>`"${a}"${Qo(o(a))}`).join(" "),i=t[t.length-1],u=`"${i}"${un(o(i))}`;return`${r} ${u} \uD569\uCE58\uBA74 \uC5B4\uB5A4 ${n?"\uC18C\uB9AC":"\uB2E8\uC5B4"}\uAC00 \uB418\uB098\uC694?`}function Zo(e,n){return et(n,e==="MERGE_2_PHONEMES"||e==="MERGE_3_PHONEMES")}function Xo(e,n){const t=String(n?.word??n?.original??""),o=String(n?.changedFrom??""),r=String(n?.changedTo??"");return e==="CHANGE_1_PHONEME_IN_1SYLL"?`"${t}"${un(t)} "${r}"${zn(r)} \uBC14\uAFB8\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`:`"${t}"\uC5D0\uC11C "${o}"${un(o)} "${r}"${zn(r)} \uBC14\uAFB8\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`}function eu(e,n){const t=String(n?.word??n?.original??n?.base??""),o=String(n?.dropped??"");if(e==="DROP_FINAL_CONSONANT_FROM_1SYLL")return`"${t}"\uC5D0\uC11C \uBC1B\uCE68\uC774 \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uB9D0\uC774 \uB418\uB098\uC694?`;if(e==="REMOVE_CONSONANT_AND_IDENTIFY_PHONEME"){const r=String(n?.missingConsonant??"");return`"${t}"\uC5D0\uC11C "${r}"${Zn(r)} \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB418\uB098\uC694?`}return`"${t}"\uC5D0\uC11C "${o}"${Zn(o)} \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uB9D0\uC774 \uB418\uB098\uC694?`}function nu(e,n,t){switch(Yo(e)){case"synthesis":return Zo(e,t);case"substitution":return Xo(e,n);case"deletion":return eu(e,n);default:return""}}function tu(e){return e.replace(/"([ㄱ-ㅣ])"(으로|와|과|을|를|이|가|은|는|로)?/g,(n,t,o)=>{const r=Xn[t];if(!r)return n;if(!o)return`"${r}"`;const i=(r.charCodeAt(r.length-1)-44032)%28,u=i!==0;let a=o;return o==="\uC640"||o==="\uACFC"?a=u?"\uACFC":"\uC640":o==="\uC744"||o==="\uB97C"?a=u?"\uC744":"\uB97C":o==="\uC774"||o==="\uAC00"?a=u?"\uC774":"\uAC00":o==="\uC740"||o==="\uB294"?a=u?"\uC740":"\uB294":(o==="\uC73C\uB85C"||o==="\uB85C")&&(a=i===0||i===8?"\uB85C":"\uC73C\uB85C"),`"${r}"${a}`})}const ou=e=>e==null?[]:Array.isArray(e)?e:[e];function nt(e){if([...e].length!==1)return"";const n=m(e);if(!n)return"";const t=Hn(L[n.jong]),o=t===""?0:L.indexOf(t);return G(n.cho,n.jung,o<0?0:o)}function rn(e,n){return n.get(e)||nt(e)||e}function Ie(e){return e?j(e.cho)?"cho":j(e.jung)?"jung":j(e.jong)?"jong":null:null}function q(e,n){const t=(o,r)=>!j(o)||ou(o).includes(r);return t(n.cho,p[e.cho])&&t(n.jung,_[e.jung])&&t(n.jong,L[e.jong])}function ee(e,n,t){const o=[...e];if(t!=="pron")return o.map(i=>m(i));const r=[...n.get(e)||e];return r.length!==o.length?o.map(i=>m(i)):r.map(i=>m(i))}function ne(e,n,t,o,r){const i=n==="cho"?p:n==="jung"?_:L,u=e[n],a=[],c=s=>n==="jung"?ru(rn(s,r)):rn(s,r),l=new Map([[c(t),-1]]),g=R(i.map((s,C)=>C).filter(s=>s!==u&&(n!=="cho"||i[s]!=="\u3147")&&(n!=="jong"||s!==0)));for(const s of g){if(a.length>=o)break;const C=n==="cho"?G(s,e.jung,e.jong):n==="jung"?G(e.cho,s,e.jong):G(e.cho,e.jung,s),h=c(C),S=l.get(h);if(S!==void 0){n==="jung"&&S>=0&&r.has(C)&&!r.has(a[S])&&(a[S]=C);continue}l.set(h,a.length),a.push(C)}return a}const uu={\u3154:"\u3150",\u3156:"\u3152",\u315A:"\u3159",\u315E:"\u3159"};function ru(e){if([...e].length!==1)return e;const n=m(e);if(!n)return e;const t=uu[_[n.jung]];return t?G(n.cho,_.indexOf(t),n.jong):e}function iu(e,n,t,o,r,i=null){const u=[...e];if(u.length!==2)return null;const a=u.map(s=>m(s));if(a.some(s=>!s))return null;const c=ee(e,t,o);if(c.some(s=>!s))return null;const l=Ie(n);let g=l&&n?c.map((s,C)=>q(s,n)?C:-1).filter(s=>s>=0):[0,1];if(i!=null&&(g=g.filter(s=>s!==i)),!g.length)return null;for(const s of R(g)){const C=u[s];if(!r.has(C))continue;const h=ne(a[s],l??"cho",C,40,t),S=[];for(const y of h)if(y!==C&&r.has(y)&&!S.includes(y)&&S.push(y),S.length>=2)break;if(!(S.length<2))return{question:e,distractors:[C,...S]}}return null}function au(e,n,t,o,r,i=null){const u=[...e];if(u.length!==3)return null;const a=u.map(s=>m(s));if(a.some(s=>!s))return null;const c=ee(e,t,o);if(c.some(s=>!s))return null;const l=Ie(n),g=l&&n?c.map((s,C)=>q(s,n)?C:-1).filter(s=>s>=0):[0,1,2];if(!g.length)return null;for(const s of R(g))for(const C of R([0,1,2].filter(h=>h!==s&&(i==null||h===i)))){const h=[0,1,2].filter(d=>d!==C),S=h.map(d=>u[d]).join("");if(!r.has(S))continue;const y=h.indexOf(s),D=ne(a[s],l??"cho",u[s],40,t),f=[];for(const d of D){const E=h.map(w=>u[w]);E[y]=d;const T=E.join("");if(T!==S&&r.has(T)&&!f.includes(T)&&f.push(T),f.length>=2)break}if(!(f.length<2))return{question:e,distractors:[S,...f]}}return null}function su(e,n,t,o,r,i=null){const u=[...e],a=u.length;if(a<2)return null;const c=[];for(let g=1;g<=a-1;g++)c.push({remain:u.slice(0,g).join(""),dropped:u.slice(g).join(""),droppedEnd:1}),c.push({remain:u.slice(a-g).join(""),dropped:u.slice(0,a-g).join(""),droppedEnd:0});const l=Ie(n);for(const{remain:g,dropped:s,droppedEnd:C}of R(c)){if(i!=null&&C!==i||g===e||!r.has(g)||!r.has(s))continue;const h=[...g],S=h.map(f=>m(f));if(S.some(f=>!f))continue;const y=ee(g,t,o);if(y.some(f=>!f))continue;const D=l&&n?y.map((f,d)=>q(f,n)?d:-1).filter(f=>f>=0):h.map((f,d)=>d);if(D.length)for(const f of R(D)){const d=ne(S[f],l??"cho",h[f],40,t),E=[];for(const T of d){const w=[...h];w[f]=T;const B=w.join("");if(B!==g&&r.has(B)&&!E.includes(B)&&E.push(B),E.length>=2)break}if(E.length>=2)return{question:e,distractors:[g,...E]}}}return null}function lu(e,n,t,o,r,i=null){if([...e].length!==1)return null;const u=m(t.get(e)||e);if(!u||u.jong===0)return null;const a=G(u.cho,u.jung,0),c=ne({cho:u.cho,jung:u.jung,jong:0},"cho",a,2,t);return c.length<2?null:{question:e,distractors:[a,...c]}}const an=p.indexOf("\u3147");function cu(e,n,t,o,r,i=null){if([...e].length!==1)return null;const u=m(t.get(e)||e);if(!u||u.jong!==0||u.cho===an)return null;const a=G(an,u.jung,0),c=ne({cho:an,jung:u.jung,jong:0},"jung",a,2,t);return c.length<2?null:{question:e,distractors:[a,...c]}}function Cu(e){const n=new Map;for(const t of e){const o=[...t],r=o.length;if(!(r<2||r>3))for(let i=0;i<r;i++){let u=r+"|"+i+"|";for(let c=0;c<r;c++)u+=c===i?"*":o[c];const a=n.get(u);a?a.push(t):n.set(u,[t])}}return n}function gu(e,n,t,o,r,i=null,u=null,a=2){const c=[...e],l=c.length;if(l<2||l>3)return null;const g=c.map(d=>m(d));if(g.some(d=>!d))return null;const s=ee(e,t,o);if(s.some(d=>!d))return null;const C=d=>t.get(d)??d,h=C(e),S=!!n&&(j(n.cho)||j(n.jung)||j(n.jong)),y=!!u&&(j(u.cho)||j(u.jung)||j(u.jong)),D=d=>{let E=l+"|"+d+"|";for(let T=0;T<l;T++)E+=T===d?"*":c[T];return E};let f;if(i!=null){if(i>=l||S&&!q(s[i],n))return null;f=[i]}else S?f=s.map((d,E)=>q(d,n)?E:-1).filter(d=>d>=0):f=Array.from({length:l},(d,E)=>E);for(const d of R(f)){const E=r.get(D(d))??[],T=[],w=[];for(const A of E){if(A===e)continue;const v=[...A].map(pe=>m(pe)),V=g[d],Te=v[d];if(!V||!Te)continue;let Ae=0;if(V.cho!==Te.cho&&Ae++,V.jung!==Te.jung&&Ae++,V.jong!==Te.jong&&Ae++,!(Ae<a||C(A)===h))if(y){const pe=ee(A,t,o)[d];pe&&q(pe,u)?T.push(A):w.push(A)}else T.push(A)}if(!T.length)continue;const B=R(T)[0],b=[],O=new Set([h,C(B)]),H=y?w:T.filter(A=>A!==B);for(const A of R(H)){const v=C(A);if(!O.has(v)&&(O.add(v),b.push(A),b.length>=2))break}if(!y&&b.length<2)for(const A of R(E)){if(A===e||A===B)continue;const v=C(A);if(!O.has(v)&&(O.add(v),b.push(A),b.length>=2))break}if(!(b.length<2))return{question:e,distractors:[B,...b]}}return null}const du=()=>{const e="\uC54C \uC218 \uC5C6\uB294 \uC624\uB958",n=typeof gn?.t=="function"?gn.t("common.unknownError",{defaultValue:e}):void 0;return typeof n=="string"&&n?n:e};function fu(e,n){if(n===void 0&&(n=du()),e instanceof Error)return e.message||n;if(typeof e=="string")return e||n;if(e&&typeof e=="object"){const t=e;for(const o of[t.message,t.error_description,t.error])if(typeof o=="string"&&o)return o}return n}const tt="\uB124\uD2B8\uC6CC\uD06C \uC5F0\uACB0\uC774 \uBD88\uC548\uC815\uD569\uB2C8\uB2E4. \uC5F0\uACB0 \uC0C1\uD0DC\uB97C \uD655\uC778\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.";function ot(e){return e?/failed to fetch|load failed|networkerror|network request failed|fetcherror/i.test(e):!1}function hu(e){return ot(e)?tt:e}function mu(e,n){return e==="id"?void 0:`${e}|${n?"asc":"desc"}`}function Su(e){const[n,t]=e.split("|");return{key:n,asc:t==="asc"}}function yu(e){let n=e==null?"":String(e);return!(typeof e=="number"&&Number.isFinite(e))&&/^[=+\-@\t\r]/.test(n)&&(n=" "+n),/[",\n\r]/.test(n)?`"${n.replaceAll('"','""')}"`:n}function Du(e,n){const t=new Blob(["\uFEFF"+n],{type:"text/csv;charset=utf-8"}),o=URL.createObjectURL(t),r=document.createElement("a");r.href=o,r.download=e,r.click(),URL.revokeObjectURL(o)}const ut="__ihab_core_word_pool__";function Eu(){typeof window<"u"&&window.dispatchEvent(new CustomEvent("wordpool:update"))}function Tu(e,n){const t=new Map;for(const r of e)t.set(r.word,r);const o={entries:e,pairIndex:n??null,byWord:t};globalThis[ut]=o,Eu()}function rt(){return globalThis[ut]??null}const te=globalThis;function sn(e,n){const t=o=>{};try{const o=n();o&&typeof o.catch=="function"&&o.catch(t)}catch(o){t(o)}}function Au(e){te.__ihabTrainingTimeLogger=e}function pu(e){sn("time",()=>te.__ihabTrainingTimeLogger?.(e))}function wu(e){te.__ihabTrainingCompletionLogger=e}function bu(e){sn("completion",()=>te.__ihabTrainingCompletionLogger?.(e))}function _u(e){te.__ihabCrosswordLogger=e}function Bu(e){sn("crossword",()=>te.__ihabCrosswordLogger?.(e))}function I(e){return typeof e=="string"?e.trim()||null:typeof e=="number"?String(e):null}function it(e){for(const n of["correct","isCorrect","heard","judgement"])if(typeof e[n]=="boolean")return e[n];return e.score===1?!0:e.score===0?!1:null}function Nu(e){return Array.isArray(e)?e.map((n,t)=>{const o=n??{};return{index:t,itemId:I(o.contextCode)??I(o.itemId)??I(o.itemCode)??I(o.id),question:I(o.question)??I(o.sentence)??I(o.word)??I(o.targetSyllable),answer:I(o.answer),selected:I(o.selectedText)??I(o.selected),correct:it(o)}}):[]}function Lu(e){return e.filter(n=>n.correct===!1)}let at=null,st=null,lt=null;function Ru(e){at=e}function ju(e){st=e}function Ou(e){lt=e}async function ku(e,n){try{return await at?.(e,n)??null}catch{return null}}async function Iu(){try{return await st?.()??null}catch{return null}}async function Mu(e,n){try{return await lt?.(e,n)??null}catch{return null}}const Me=globalThis;function Pu(e){Me.__ihabNoiseSettingsStore=e}async function $u(){try{return await Me.__ihabNoiseSettingsStore?.load()??null}catch{return null}}function vu(e){const n=t=>{};try{const t=Me.__ihabNoiseSettingsStore?.save(e);t&&typeof t.catch=="function"&&t.catch(n)}catch(t){n(t)}}function Gu(e){try{Me.__ihabNoiseSettingsStore?.applied?.(e)}catch{}}function Pe(e){const n=new TextEncoder().encode(String(e).normalize("NFC"));let t="";return n.forEach(o=>{t+=o.toString(16).padStart(2,"0")}),t}const Fu=Pe;function xu(e,n){return`${e}/${Pe(n)}.mp3`}function Wu(e={}){const n=e.storagePrefix??"audio-cache",t=e.voice??"ko-f",o=typeof e.speed=="number"?e.speed:1,r=e.filenameSanitizer??Pe;return async function(i){const u=String(i||"").trim();if(!u)return"";const a=`${r(u)}_${t}.mp3`,c=`${n}/${a}`;try{if(await mn(c)){const l=await Sn(c);if(l)return l}}catch{}if(e.generator)try{const l=await e.generator(u,c,e);if(l)return l}catch{}try{const l=`/api/tts?word=${encodeURIComponent(u)}&voice=${encodeURIComponent(t)}&speed=${encodeURIComponent(String(o))}`;return await fetch(l,{method:"GET"}),`/audio-cache/${a}`}catch{return`/audio-cache/${a}`}}}async function Hu(e){if(typeof document<"u"){const n=document.activeElement;let t=null;try{if(t=document.createElement("textarea"),t.value=e,t.setAttribute("readonly",""),t.style.position="fixed",t.style.top="0",t.style.left="0",t.style.opacity="0",t.style.pointerEvents="none",document.body.appendChild(t),t.focus(),t.select(),t.setSelectionRange(0,e.length),document.execCommand("copy"))return!0}catch{}finally{if(t?.parentNode&&t.parentNode.removeChild(t),n&&n!==document.activeElement&&typeof n.focus=="function"&&n.isConnected)try{n.focus({preventScroll:!0})}catch{}}}try{if(typeof navigator<"u"&&navigator.clipboard&&typeof navigator.clipboard.writeText=="function")return await navigator.clipboard.writeText(e),!0}catch{}return!1}const oe="Asia/Seoul";function Yu(e){return new Date(e).toLocaleDateString("ko-KR",{timeZone:oe,year:"numeric",month:"short",day:"numeric"})}function Ku(e){return new Date(e).toLocaleString("ko-KR",{timeZone:oe,year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit"})}function Uu(e,n){const t=n.startsWith("ko")?"ko-KR":"en-US";return new Date(e).toLocaleDateString(t,{timeZone:oe,year:"numeric",month:"short",day:"numeric"})}function Vu(e,n){const t=n.startsWith("ko")?"ko-KR":"en-US";return new Date(e).toLocaleString(t,{timeZone:oe,year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit"})}function Ju(e){return new Date(e).toLocaleString("ko-KR",{timeZone:oe,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}function qu(e){if(e==null||e==="")return"";const n=e instanceof Date?e:new Date(e);return isNaN(n.getTime())?"":new Intl.DateTimeFormat("en-GB",{timeZone:oe,hour:"2-digit",minute:"2-digit",hour12:!1}).format(n)}function ct(){return de(new Date)}function de(e){if(e==null||e==="")return"";const n=e instanceof Date?e:new Date(e);return isNaN(n.getTime())?"":new Intl.DateTimeFormat("fr-CA",{timeZone:"Asia/Seoul"}).format(n)}function Qu(e,n){if(!e)return"";const t=new Date(e).getTime();if(Number.isNaN(t))return"";const o=Math.max(0,Math.floor((Date.now()-t)/1e3)),r=Math.floor(o/60),i=Math.floor(r/60),u=Math.floor(i/24),a=Math.floor(u/7),c=Math.floor(u/30),l=Math.floor(u/365);return r<1?n("store.time.justNow","\uBC29\uAE08 \uC804"):r<60?n("store.time.minutesAgo",{n:r}):i<24?n("store.time.hoursAgo",{n:i}):u<7?n("store.time.daysAgo",{n:u}):a<5?n("store.time.weeksAgo",{n:a}):u<365?n("store.time.monthsAgo",{n:Math.min(c,11)}):n("store.time.yearsAgo",{n:l})}function zu(e,n={}){const{sep:t=".",pad:o=!0,trailingDot:r=!1,fallback:i="\u2014"}=n;if(!e)return i;const u=de(e instanceof Date?e:String(e));if(!u)return i;const[a,c,l]=u.split("-"),g=o?c:String(Number(c)),s=o?l:String(Number(l));return`${a}${t}${g}${t}${s}${r?".":""}`}function Zu(e){const n=e.replace(/\D/g,"");if(/^(050\d|0303)/.test(n)){const o=n.slice(0,12);return o.length<=4?o:o.length<=8?`${o.slice(0,4)}-${o.slice(4)}`:`${o.slice(0,4)}-${o.slice(4,o.length-4)}-${o.slice(o.length-4)}`}if(/^1[5-9]\d{2}/.test(n)&&n.length<=8)return n.length<=4?n:`${n.slice(0,4)}-${n.slice(4)}`;const t=n.slice(0,11);return t.startsWith("02")?t.length<=2?t:t.length<=6?`${t.slice(0,2)}-${t.slice(2)}`:`${t.slice(0,2)}-${t.slice(2,t.length-4)}-${t.slice(t.length-4)}`:t.length<=3?t:t.length<=7?`${t.slice(0,3)}-${t.slice(3)}`:`${t.slice(0,3)}-${t.slice(3,t.length-4)}-${t.slice(t.length-4)}`}function Xu(e){if(e){if(/^\d{4}\.\d{2}\.\d{2}$/.test(e))return e;if(/^\d{8}$/.test(e))return`${e.slice(0,4)}.${e.slice(4,6)}.${e.slice(6,8)}`;if(/^\d{4}-\d{2}-\d{2}$/.test(e))return e.replace(/-/g,".");if(/^\d{4}-\d{2}-\d{2}T/.test(e)){const n=new Date(e);return isNaN(n.getTime())?void 0:de(n).replace(/-/g,".")}}}function er(e){if(e)return/^\d{4}\.\d{2}\.\d{2}$/.test(e)?e.replace(/\./g,"-"):e}function nr(e,n){if(!e)return"-";const t=/^(\d{1,2}):(\d{2})$/.exec(e.trim());if(!t)return e;const o=Number(t[1]),r=Number(t[2]),i=t[1].padStart(2,"0");return r===0?n("date.timeH",{h:o,hh:i,mm:t[2]}):n("date.timeHM",{h:o,hh:i,m:r,mm:t[2]})}function tr(e){return(e??0).toLocaleString("ko-KR")}const or=[{key:"FOOD",label:"\uC74C\uC2DD",icon:"salad",color:"#FF8A65",subs:[{key:"TRKRFD",label:"\uD55C\uAD6D \uC804\uD1B5\uC74C\uC2DD"},{key:"MDKRFD",label:"\uD55C\uAD6D \uD604\uB300\uC74C\uC2DD"},{key:"WRLDFD",label:"\uC138\uACC4\uC758 \uC74C\uC2DD"},{key:"MTRFRT",label:"\uC2DD\uC7AC\uB8CC\uC640 \uACFC\uC77C"},{key:"GEFDKL",label:"\uC74C\uC2DD \uC0C1\uC2DD"}]},{key:"HLTH",label:"\uAC74\uAC15",icon:"heart",color:"#66BB6A",subs:[{key:"HTETHB",label:"\uAC74\uAC15\uD55C \uC2DD\uC2B5\uAD00"},{key:"DISILL",label:"\uBCD1\uACFC \uC9C8\uD658"},{key:"EXCISE",label:"\uC6B4\uB3D9"},{key:"GEHTKL",label:"\uAC74\uAC15\uC0C1\uC2DD"}]},{key:"WETH",label:"\uB0A0\uC528",icon:"sun-medium",color:"#42A5F5",subs:[{key:"GESSKL",label:"\uACC4\uC808\uC0C1\uC2DD"},{key:"SNWRAN",label:"\uB208\uACFC \uBE44"},{key:"WTHFCT",label:"\uC77C\uAE30\uC608\uBCF4"},{key:"GEWTKL",label:"\uB0A0\uC528\uC0C1\uC2DD"}]},{key:"PRSN",label:"\uC778\uBB3C",icon:"user-round",color:"#AB47BC",subs:[{key:"JODYPS",label:"\uC870\uC120\uC2DC\uB300"},{key:"MDKRPS",label:"\uD55C\uAD6D \uADFC\uD604\uB300"},{key:"THKDPS",label:"\uC0BC\uAD6D\uC2DC\uB300"},{key:"WRLART",label:"\uC138\uACC4\uC758 \uC608\uC220\uAC00"},{key:"WRLPSN",label:"\uC138\uACC4\uC758 \uC778\uBB3C"}]},{key:"KRCT",label:"\uD55C\uAD6D\uBB38\uD654",icon:"bow-arrow",color:"#EC407A",subs:[{key:"KRLANG",label:"\uC6B0\uB9AC\uB9D0"},{key:"TRPLCT",label:"\uC804\uD1B5\uB180\uC774"},{key:"HERITG",label:"\uBB38\uD654\uC7AC"},{key:"EVTFES",label:"\uD589\uC0AC\uC640 \uCD95\uC81C"},{key:"GECTKL",label:"\uC0C1\uC2DD"}]},{key:"STRY",label:"\uC774\uC57C\uAE30",icon:"message-circle",color:"#8D6E63",subs:[{key:"FRYTAL",label:"\uB3D9\uD654"},{key:"AMZING",label:"\uC2E0\uAE30\uD55C \uC774\uC57C\uAE30"},{key:"DAYSTR",label:"\uC77C\uC0C1 \uC18D \uC774\uC57C\uAE30"}]},{key:"LOCA",label:"\uC9C0\uC5ED",icon:"map-pin",color:"#26A69A",subs:[{key:"KRLDMK",label:"\uD55C\uAD6D\uC758 \uBA85\uC18C"},{key:"SELNMK",label:"\uC11C\uC6B8\uC758 \uBA85\uC18C"},{key:"WRDTRB",label:"\uC138\uACC4\uC5EC\uD589"},{key:"NAVIGT",label:"\uAE38 \uCC3E\uAE30"}]},{key:"SOAR",label:"\uC0AC\uD68C\uC640 \uC608\uC220",icon:"landmark",color:"#5C6BC0",subs:[{key:"KRSOCI",label:"\uD55C\uAD6D"},{key:"ECONEW",label:"\uACBD\uC81C\uC640 \uB274\uC2A4"},{key:"GENART",label:"\uC608\uC220"},{key:"GELFKL",label:"\uC0DD\uD65C \uC0C1\uC2DD"}]},{key:"NTSC",label:"\uC790\uC5F0\uACFC \uACFC\uD559",icon:"leaf",color:"#9CCC65",subs:[{key:"ANIMAL",label:"\uB3D9\uBB3C"},{key:"PLANTS",label:"\uC2DD\uBB3C"},{key:"ETHPLT",label:"\uC9C0\uAD6C"},{key:"TOLELC",label:"\uB3C4\uAD6C\uC640 \uC804\uC790\uC81C\uD488"},{key:"GESCKL",label:"\uACFC\uD559\uC0C1\uC2DD"}]},{key:"SPRT",label:"\uC2A4\uD3EC\uCE20",icon:"trophy",color:"#FFCA28",subs:[{key:"INVDSP",label:"\uAC1C\uC778\uACBD\uAE30"},{key:"MARART",label:"\uACA9\uD22C\uAE30"},{key:"TEAMSP",label:"\uB2E8\uCCB4\uACBD\uAE30"},{key:"FOOTBL",label:"\uCD95\uAD6C"},{key:"GESPKL",label:"\uC2A4\uD3EC\uCE20 \uC0C1\uC2DD"}]}],ur=[{key:"LISTEN_IN_NOISE",label:"\uC18C\uC74C \uD558 \uBB38\uC7A5 \uB4E3\uAE30",icon:"party-popper",desc:"\uC18C\uC74C \uD658\uACBD \uC18D \uBB38\uC7A5 \uC774\uD574 \uD6C8\uB828"},{key:"SHORT_STORY",label:"\uC9E7\uC740 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square",desc:"\uC9E7\uC740 \uC774\uC57C\uAE30 + 4\uBB38\uC81C"},{key:"LONG_STORY",label:"\uAE34 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square-text",desc:"\uAE34 \uC774\uC57C\uAE30 \uC2EC\uD654 \uD6C8\uB828"},{key:"ORDERING_SENTENCE",label:"\uBB38\uC7A5 \uC21C\uC11C\uD654 \uD558\uAE30",icon:"align-start-vertical",desc:"\uC21C\uC11C \uBC30\uC5F4 \uD6C8\uB828"}];let ln=null;function rr(e){ln=e}function ir(){return ln?.topicTypes??or}function ar(){return ln?.trainingTypes??ur}const Ct="ihab_theme",sr="light";function gt(){try{const e=localStorage.getItem(Ct);if(e==="light"||e==="dark"||e==="auto")return e}catch{}return sr}function dt(e){try{document.documentElement.setAttribute("data-theme",e),localStorage.setItem(Ct,e)}catch{}}function lr(){dt(gt())}const ft="ihab_font_scale",cr="medium",Cr=["medium","large1","large2","large3"];function ht(){try{const e=localStorage.getItem(ft);if(Cr.includes(e))return e}catch{}return cr}function mt(e){try{document.documentElement.setAttribute("data-font-scale",e),localStorage.setItem(ft,e)}catch{}}function gr(){mt(ht())}const fe=[],he=[],me=[],Se=[],ye={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},De={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},dr={LISTEN_IN_NOISE:3,SHORT_STORY:2,LONG_STORY:1,ORDERING_SENTENCE:2};let cn=null,St=null,U=null;function yt({counts:e,forceRefresh:n}={}){const t=Object.assign({},dr,e||{}),o=ct(),r=de(new Date(`${o}T00:00:00+09:00`).getTime()-864e5),i=JSON.stringify(t);if(!n&&St===o&&cn===i&&U)return Object.assign(ye,U.today),Object.assign(De,U.yesterday?.selection||{LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]}),{today:ye,yesterday:De};const u={LISTEN_IN_NOISE:W(fe,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:W(he,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:W(me,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:W(Se,Math.max(0,Number(t.ORDERING_SENTENCE)||0))};let a=null;return U&&cn===i&&U.yesterday&&U.yesterday.date===r&&(a=U.yesterday.selection),a||(a={LISTEN_IN_NOISE:W(fe,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:W(he,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:W(me,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:W(Se,Math.max(0,Number(t.ORDERING_SENTENCE)||0))}),Object.assign(ye,u),Object.assign(De,a),St=o,cn=i,U={today:u,yesterday:{date:r,countsKey:i,selection:a}},{today:ye,yesterday:De}}function fr(){return{today:ye,yesterday:De}}function hr(){return{LISTEN_IN_NOISE:fe,SHORT_STORY:he,LONG_STORY:me,ORDERING_SENTENCE:Se}}let Cn=!1,Ee=null;async function mr(){try{const e={url:typeof document>"u"?require("url").pathToFileURL(__filename).href:ve&&ve.tagName.toUpperCase()==="SCRIPT"&&ve.src||new URL("utils.cjs.js",document.baseURI).href}&&void 0||"/",n=await fetch(`${e}data/allTrainingData.json`);return n.ok?await n.json():null}catch{return null}}async function Dt(){if(!Cn)return Ee||(Ee=(async()=>{const e=await mr();if(!e){Ee=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}try{for(const n of Object.keys(e||{})){const t=e[n]||[];for(const o of t){const r=o,i=String(r.training_type||n),u=String(r.category_main_code||r.category_main||r.category_0||""),a=String(r.category_sub_code||r.category_sub||r.category_1||""),c=Object.assign({},r,{training_type:i,category_0:u,category_1:a});i==="LISTEN_IN_NOISE"?fe.push(c):i==="SHORT_STORY"?he.push(c):i==="LONG_STORY"?me.push(c):i==="ORDERING_SENTENCE"&&Se.push(c)}}}catch{Ee=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}try{window.dispatchEvent(new Event("speechear.data.updated"))}catch{}try{yt()}catch{}Cn=!0})(),Ee)}function Sr(){return Cn}async function yr(e=3e3){const n=Dt();return Promise.race([n,new Promise(t=>setTimeout(t,e))])}const Dr=[{key:"LISTEN_IN_NOISE",label:"\uC18C\uC74C \uD558 \uBB38\uC7A5 \uB4E3\uAE30",icon:"party-popper",desc:"\uB2E4\uC591\uD55C \uC18C\uC74C \uD658\uACBD\uC5D0\uC11C \uBB38\uC7A5 \uCCAD\uB825\uC744 \uD6C8\uB828\uD569\uB2C8\uB2E4."},{key:"SHORT_STORY",label:"\uC9E7\uC740 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square",desc:"\uC9E7\uC740 \uC774\uC57C\uAE30\uB97C \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uBB38\uC81C\uB97C \uD480\uC5B4\uBD05\uB2C8\uB2E4."},{key:"LONG_STORY",label:"\uAE34 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square-text",desc:"\uAE34 \uC774\uC57C\uAE30\uB97C \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uB2E4\uC218\uC758 \uBB38\uC81C\uB97C \uD480\uC5B4\uBD05\uB2C8\uB2E4."},{key:"ORDERING_SENTENCE",label:"\uBB38\uC7A5 \uC21C\uC11C\uD654 \uD558\uAE30",icon:"align-start-vertical",desc:"\uC5EC\uB7EC\uAC1C\uC758 \uC9E7\uC740 \uBB38\uC7A5\uC744 \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uADF8 \uC21C\uC11C\uC5D0 \uB9DE\uAC8C \uBC30\uC5F4\uD569\uB2C8\uB2E4."}],Er=[{key:"FOOD",label:"\uC74C\uC2DD",icon:"salad",color:"#FF8A65",subs:[{key:"TRKRFD",label:"\uD55C\uAD6D \uC804\uD1B5\uC74C\uC2DD"},{key:"MDKRFD",label:"\uD55C\uAD6D \uD604\uB300\uC74C\uC2DD"},{key:"WRLDFD",label:"\uC138\uACC4\uC758 \uC74C\uC2DD"},{key:"MTRFRT",label:"\uC2DD\uC7AC\uB8CC\uC640 \uACFC\uC77C"},{key:"GEFDKL",label:"\uC74C\uC2DD \uC0C1\uC2DD"}]},{key:"HLTH",label:"\uAC74\uAC15",icon:"heart",color:"#66BB6A",subs:[{key:"HTETHB",label:"\uAC74\uAC15\uD55C \uC2DD\uC2B5\uAD00"},{key:"DISILL",label:"\uBCD1\uACFC \uC9C8\uD658"},{key:"EXCISE",label:"\uC6B4\uB3D9"},{key:"GEHTKL",label:"\uAC74\uAC15\uC0C1\uC2DD"}]},{key:"WETH",label:"\uB0A0\uC528",icon:"sun-medium",color:"#42A5F5",subs:[{key:"GESSKL",label:"\uACC4\uC808\uC0C1\uC2DD"},{key:"SNWRAN",label:"\uB208\uACFC \uBE44"},{key:"WTHFCT",label:"\uC77C\uAE30\uC608\uBCF4"},{key:"GEWTKL",label:"\uB0A0\uC528\uC0C1\uC2DD"}]},{key:"PRSN",label:"\uC778\uBB3C",icon:"user-round",color:"#AB47BC",subs:[{key:"JODYPS",label:"\uC870\uC120\uC2DC\uB300"},{key:"MDKRPS",label:"\uD55C\uAD6D \uADFC\uD604\uB300"},{key:"THKDPS",label:"\uC0BC\uAD6D\uC2DC\uB300"},{key:"WRLART",label:"\uC138\uACC4\uC758 \uC608\uC220\uAC00"},{key:"WRLPSN",label:"\uC138\uACC4\uC758 \uC778\uBB3C"}]},{key:"KRCT",label:"\uD55C\uAD6D\uBB38\uD654",icon:"bow-arrow",color:"#EC407A",subs:[{key:"KRLANG",label:"\uC6B0\uB9AC\uB9D0"},{key:"TRPLCT",label:"\uC804\uD1B5\uB180\uC774"},{key:"HERITG",label:"\uBB38\uD654\uC7AC"},{key:"EVTFES",label:"\uD589\uC0AC\uC640 \uCD95\uC81C"},{key:"GECTKL",label:"\uC0C1\uC2DD"}]},{key:"STRY",label:"\uC774\uC57C\uAE30",icon:"message-circle",color:"#8D6E63",subs:[{key:"FRYTAL",label:"\uB3D9\uD654"},{key:"AMZING",label:"\uC2E0\uAE30\uD55C \uC774\uC57C\uAE30"},{key:"DAYSTR",label:"\uC77C\uC0C1 \uC18D \uC774\uC57C\uAE30"}]},{key:"LOCA",label:"\uC9C0\uC5ED",icon:"map-pin",color:"#26A69A",subs:[{key:"KRLDMK",label:"\uD55C\uAD6D\uC758 \uBA85\uC18C"},{key:"SELNMK",label:"\uC11C\uC6B8\uC758 \uBA85\uC18C"},{key:"WRDTRB",label:"\uC138\uACC4\uC5EC\uD589"},{key:"NAVIGT",label:"\uAE38 \uCC3E\uAE30"}]},{key:"SOAR",label:"\uC0AC\uD68C\uC640 \uC608\uC220",icon:"landmark",color:"#5C6BC0",subs:[{key:"KRSOCI",label:"\uD55C\uAD6D"},{key:"ECONEW",label:"\uACBD\uC81C\uC640 \uB274\uC2A4"},{key:"GENART",label:"\uC608\uC220"},{key:"GELFKL",label:"\uC0DD\uD65C \uC0C1\uC2DD"}]},{key:"NTSC",label:"\uC790\uC5F0\uACFC \uACFC\uD559",icon:"leaf",color:"#9CCC65",subs:[{key:"ANIMAL",label:"\uB3D9\uBB3C"},{key:"PLANTS",label:"\uC2DD\uBB3C"},{key:"ETHPLT",label:"\uC9C0\uAD6C"},{key:"TOLELC",label:"\uB3C4\uAD6C\uC640 \uC804\uC790\uC81C\uD488"},{key:"GESCKL",label:"\uACFC\uD559\uC0C1\uC2DD"}]},{key:"SPRT",label:"\uC2A4\uD3EC\uCE20",icon:"trophy",color:"#FFCA28",subs:[{key:"INVDSP",label:"\uAC1C\uC778\uACBD\uAE30"},{key:"MARART",label:"\uACA9\uD22C\uAE30"},{key:"TEAMSP",label:"\uB2E8\uCCB4\uACBD\uAE30"},{key:"FOOTBL",label:"\uCD95\uAD6C"},{key:"GESPKL",label:"\uC2A4\uD3EC\uCE20 \uC0C1\uC2DD"}]}],Tr={LISTEN_IN_NOISE:"listenInNoise",SHORT_STORY:"shortStory",LONG_STORY:"longStory",ORDERING_SENTENCE:"orderingSentence"};let $e=null,Et=null,Tt=null;function Ar(){const e=rt();if(e&&e.entries.length>0){const n=In();if($e&&Et===e&&Tt===n)return $e;const t=new Set,o=[];for(const r of e.entries)!r.word||t.has(r.word)||(t.add(r.word),o.push({w:r.word,s:r.syllables,p:n?.[r.word]?[...n[r.word].cho??[],...n[r.word].jung??[],...n[r.word].jong??[]]:[],pron:r.pronunciation||r.word,grade:r.grade}));return $e=o,Et=e,Tt=n,$e}return[]}new Proxy([],{get(e,n){const t=Ar(),o=t[n];return typeof o=="function"?o.bind(t):o}});const pr={free:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},personal_standard:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},mgr_free:{maxCustomers:5,visitWord:!0,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},none:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},lite_word:{maxCustomers:10,visitWord:!0,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!1},lite_sentence:{maxCustomers:10,visitWord:!1,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!0},lite:{maxCustomers:10,visitWord:!0,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},standard:{maxCustomers:30,visitWord:!0,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},pro:{maxCustomers:50,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0},enterprise:{maxCustomers:1/0,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!0,managerManagement:!0,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!0,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!0,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!0,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0}},wr={none:0,free:1,personal_standard:3,mgr_free:4,lite_word:5,lite_sentence:5,lite:6,standard:7,pro:8,enterprise:9},br={free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1},personal_standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null},mgr_free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1,trainingItemMax:5,customerMax:5,homeworkSendDaily:1},lite:{sentenceTrainingDaily:5,wordTrainingDaily:5,gameDaily:5,trainingItemMax:10,customerMax:10,homeworkSendDaily:10},standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:30,customerMax:30,homeworkSendDaily:30},pro:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:50,homeworkSendDaily:50},enterprise:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:null,homeworkSendDaily:null}};function _r(e){const n=e.toLowerCase();return n.startsWith("manager_enterprise")?"enterprise":n.startsWith("manager_pro")?"pro":n.startsWith("manager_standard")?"standard":n.startsWith("manager_lite_word")?"lite_word":n.startsWith("manager_lite_sentence")?"lite_sentence":n.startsWith("manager_lite")||n.startsWith("mgr_lite")?"lite":n.startsWith("mgr_standard")?"standard":n.startsWith("mgr_pro")?"pro":n.startsWith("content_")||n.startsWith("speechear_")||n.startsWith("light_")||n==="light"?"personal_standard":"none"}const Br=5,Nr=5;function Lr({rank:e,voteCount:n,quota:t=5}){return e<t&&n>0}const Rr={selected:"ALREADY_SELECTED",added:"ALREADY_ADDED",rejected:"ALREADY_REJECTED"},jr="0.134.0";exports.CAPABILITY=qn,exports.CHOSEONG=p,exports.CORE_VERSION=jr,exports.JONGSEONG=L,exports.JUNGSEONG=_,exports.LONG_STORIES=me,exports.NETWORK_ERROR_MESSAGE=tt,exports.NOISE_DATAS=fe,exports.ORDER_SETS=Se,exports.PLAN_FEATURES=pr,exports.PLAN_LIMITS=br,exports.SHORT_STORIES=he,exports.TIER_RANK=wr,exports.TOPIC_TYPES=Er,exports.TRAINING_TYPES=Dr,exports.TRAINING_TYPE_I18N_KEY=Tr,exports.WORD_SUGGESTION_ACCOUNT_LIMIT=Nr,exports.WORD_SUGGESTION_EXISTING_ERROR=Rr,exports.WORD_SUGGESTION_WEEKLY_QUOTA=Br,exports.applyFontScale=mt,exports.applyTheme=dt,exports.buildChangeWholeSyllableProblem=gu,exports.buildDropCompoundProblem=su,exports.buildDropContrast3Problem=au,exports.buildDropContrastProblem=iu,exports.buildDropFinalConsonantProblem=lu,exports.buildMultiPartPosContrast=Ao,exports.buildPairIndex=Do,exports.buildRemoveConsonantProblem=cu,exports.buildSyllableMaskIndex=Cu,exports.bulkSetImageExistence=Zt,exports.cardQuestionTitle=nu,exports.checkImageExists=bn,exports.classifyPairDifficulty=no,exports.clearAudioExistsCache=vt,exports.clearImageExistenceCache=Xt,exports.clearPairIndexCache=Eo,exports.composeSyllable=G,exports.computeDailySelection=yt,exports.configureImageResolver=Vt,exports.configureNoiseSettingsStore=Pu,exports.configurePronunciationResolver=Gt,exports.configureStorage=Lt,exports.configureTTS=It,exports.configureTrainingCategories=rr,exports.copyText=Hu,exports.createDecompCache=eo,exports.createTTSUrlResolver=Wu,exports.dateToDb=er,exports.downloadCsvText=Du,exports.downloadSound=jt,exports.ensureTrainingDataLoaded=yr,exports.escapeCsvField=yu,exports.fileExists=mn,exports.filterContrastCandidates=Mn,exports.finalToPhoneme=Hn,exports.firstChoseongOf=_n,exports.formatCount=tr,exports.formatDateKo=Yu,exports.formatDateLocale=Uu,exports.formatDateLongKo=Ku,exports.formatDateLongLocale=Vu,exports.formatDatetimeKo=Ju,exports.formatPhone=Zu,exports.formatRelativeTime=Qu,exports.formatTimeHM=nr,exports.formatYmd=zu,exports.getAssetBaseUrl=fn,exports.getDailySelection=fr,exports.getElementAnalyser=Ht,exports.getElementVolume=Kt,exports.getErrorMessage=fu,exports.getImageExistenceStats=zt,exports.getImageExistsCached=qt,exports.getImageResolver=wn,exports.getNoiseBaseUrl=Ot,exports.getNoiseFileGain=kt,exports.getPairIndex=In,exports.getPlanTier=_r,exports.getPronunciationResolver=Ft,exports.getSavedFontScale=ht,exports.getSavedTheme=gt,exports.getSignedOrPublicUrl=Sn,exports.getTTSFallbackUrlResolver=Pt,exports.getTTSUrlResolver=Mt,exports.getTodayKst=ct,exports.getTopicTypes=ir,exports.getTrainingPools=hr,exports.getTrainingTypes=ar,exports.getWordPool=rt,exports.hasQuestionWordConstraint=Vo,exports.hasSel=j,exports.hasStructureContrast=qe,exports.initFontScale=gr,exports.initTheme=lr,exports.isAllChoseong=Nn,exports.isManualOnlyType=qo,exports.isNetworkErrorMessage=ot,exports.isSyllablePattern=Rn,exports.isThisWeekPick=Lr,exports.isTrainingDataLoaded=Sr,exports.isValidQuestionWord=Jo,exports.itemCorrectness=it,exports.jamoToNamesForSpeech=tu,exports.loadGameLeaderboard=Mu,exports.loadMyGameRanks=Iu,exports.loadNoiseSettings=$u,exports.loadTrainingData=Dt,exports.logCrossword=Bu,exports.logTrainingCompletion=bu,exports.logTrainingTime=pu,exports.matchSyllables=ee,exports.matchesChoseongSearch=to,exports.matchesSyllablePattern=On,exports.matchesWordQuery=_e,exports.mergeQuestionText=et,exports.minimalPairDistractors=To,exports.normalizeDate=Xu,exports.officialSoundPath=xu,exports.parseSortValue=Su,exports.parseSyllable=m,exports.patternToComposition=Co,exports.phonemePartsOf=zo,exports.pickEuRo=Jn,exports.pickEulReul=Kn,exports.pickEunNeun=Un,exports.pickIga=Yn,exports.pickWaGwa=Vn,exports.prewarmImageCache=Qt,exports.primarySelPart=Ie,exports.readLevel=Ut,exports.reorderArray=Ho,exports.reportAppliedNoiseSettings=Gu,exports.resolveAssetUrl=Bt,exports.resolveSoundPath=Rt,exports.resumeAudioMeter=Wt,exports.routeElementAudio=An,exports.sample=W,exports.saveNoiseSettings=vu,exports.searchAndRankWords=ho,exports.setAssetBaseUrl=_t,exports.setCrosswordLogger=_u,exports.setElementVolume=Yt,exports.setGameLeaderboardLoader=Ou,exports.setGameRanksLoader=ju,exports.setGameScoreSubmitter=Ru,exports.setTrainingCompletionLogger=wu,exports.setTrainingTimeLogger=Au,exports.setWordPool=Tu,exports.shuffle=R,exports.sortToValue=mu,exports.soundOf=rn,exports.speak=At,exports.stopSpeaking=pt,exports.submitGameScore=ku,exports.syllMatchesComp=q,exports.syllableContrasts=ne,exports.syllableLength=io,exports.syllablePron=nt,exports.toBase64UrlSafe=Fu,exports.toChoseong=Bn,exports.toItemResults=Nu,exports.toKstHm=qu,exports.toKstYmd=de,exports.toStandardPronunciation=Mo,exports.toStorageName=Pe,exports.toUserErrorMessage=hu,exports.validateSyllableSearchInput=fo,exports.withEuRo=Wo,exports.withEulReul=Go,exports.withEunNeun=Fo,exports.withIga=vo,exports.withWaGwa=xo,exports.wordContainsChoseong=oo,exports.wordContainsJongseong=ro,exports.wordContainsJungseong=uo,exports.wordHasNoCoda=ao,exports.wordHasSyllableMatching=lo,exports.wrongItems=Lu;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ihabdevteam/core",
3
- "version": "0.133.0",
3
+ "version": "0.134.0",
4
4
  "private": false,
5
5
  "main": "dist/ihabdevteam-core.cjs.js",
6
6
  "module": "dist/packages/core/src/index.js",