{
  "version": 3,
  "sources": ["../src/index.ts", "../../references/src/utils.ts", "../../references/src/data.ts", "../../references/src/last_verse.ts", "../../references/src/passage.ts", "../../references/src/detect.ts", "../../references/src/lists.ts", "../../references/src/stats.ts", "../src/assets/licenses.ts", "../src/assets/utils.ts", "../src/book/bible.ts", "../src/collection/bibles_extra.ts", "../src/collection/generic.ts", "../src/collection/bibles.ts", "../src/book/glosses.ts", "../src/collection/glosses.ts", "../src/book/notes.ts", "../src/collection/notes.ts", "../src/collection/collection.ts", "../src/book/crossref.ts", "../src/other/search.ts", "../src/assets/request.ts", "../src/client.ts", "../src/book/html.ts", "../src/assets/data.ts"],
  "sourcesContent": ["\n// Export everything intended for direct use (code and types)\n\n\n// CODE\n\n\n// Re-export everything from bible-references for convenience\nexport * from '@gracious.tech/bible-references'\nexport type * from '@gracious.tech/bible-references'\n\n\n// Internal code\n// NOTE Don't export classes not meant to be initiated directly, export them as types instead\nexport {FetchClient} from './client.js'\nexport {wrap_verse_parts, add_passage_class, rm_passage_class} from './book/html.js'\nexport {substantial_poetry} from './assets/data.js'\nexport {FetchNetworkError} from './assets/request.js'\n\n\n// TYPES\n// Only expose those relevant to the user and willing to support going forward)\n\nexport type * from './assets/types.js'\nexport type {FetchClientConfig} from './client.js'\nexport type {RequestHandler} from './assets/request.js'\n\n\nexport type {BookCrossref} from './book/crossref.js'\nexport type {GlossesBook, GlossesWord} from './book/glosses.js'\nexport type {NotesBook, RelevantNotes} from './book/notes.js'\nexport type {\n    GetHtmlOptions,\n    GetTxtOptions,\n    GetTypstOptions,\n    IndividualVerse,\n    BibleBook,\n    BibleBookHtml,\n    BibleBookTxt,\n    BibleBookUsfm,\n    BibleBookUsx,\n    BibleBookTypst,\n} from './book/bible.js'\n\n\nexport type {FetchCollection} from './collection/collection.js'\nexport type {BibleCollection} from './collection/bibles.js'\nexport type {\n    GetLanguagesOptions,\n    GetLanguagesItem,\n    GetResourcesOptions,\n    GetResourcesItem,\n    GetBooksOptions,\n    GetBooksItem,\n    GetCompletionReturn,\n} from './collection/generic.js'\n\n\nexport type {SearchWords, SearchWordsResults} from './other/search.js'\n\n\nexport type {\n    BookNames,\n    BibleJsonHtml,\n    TxtHeading,\n    TxtNote,\n    TxtContent,\n    BibleJsonTxt,\n    GlossesData,\n    NotesData,\n    SearchData,\n} from './assets/shared_types.js'\n", "\n// Safer integer parsing that returns null for invalid instead of NaN\nexport function parse_int(input:string, min?:number, max?:number):number|null{\n    let int = parseInt(input, 10)\n    if (Number.isNaN(int)){\n        return null\n    }\n    if (min !== undefined){\n        int = Math.max(int, min)\n    }\n    if (max !== undefined){\n        int = Math.min(int, max)\n    }\n    return int\n}\n", "\n// Bible book ids in traditional order\nexport const books_ordered:readonly string[] = Object.freeze([\n    'gen', 'exo', 'lev', 'num', 'deu', 'jos', 'jdg', 'rut', '1sa', '2sa', '1ki', '2ki', '1ch',\n    '2ch', 'ezr', 'neh', 'est', 'job', 'psa', 'pro', 'ecc', 'sng', 'isa', 'jer', 'lam', 'ezk',\n    'dan', 'hos', 'jol', 'amo', 'oba', 'jon', 'mic', 'nam', 'hab', 'zep', 'hag', 'zec', 'mal',\n    'mat', 'mrk', 'luk', 'jhn', 'act', 'rom', '1co', '2co', 'gal', 'eph', 'php', 'col', '1th',\n    '2th', '1ti', '2ti', 'tit', 'phm', 'heb', 'jas', '1pe', '2pe', '1jn', '2jn', '3jn', 'jud',\n    'rev',\n])\n\n\n// Usual English names of Bible books\nexport const book_names_english:Readonly<Record<string, string>> = Object.freeze({\n    'gen': \"Genesis\",\n    'exo': \"Exodus\",\n    'lev': \"Leviticus\",\n    'num': \"Numbers\",\n    'deu': \"Deuteronomy\",\n    'jos': \"Joshua\",\n    'jdg': \"Judges\",\n    'rut': \"Ruth\",\n    '1sa': \"1 Samuel\",\n    '2sa': \"2 Samuel\",\n    '1ki': \"1 Kings\",\n    '2ki': \"2 Kings\",\n    '1ch': \"1 Chronicles\",\n    '2ch': \"2 Chronicles\",\n    'ezr': \"Ezra\",\n    'neh': \"Nehemiah\",\n    'est': \"Esther\",\n    'job': \"Job\",\n    'psa': \"Psalms\",\n    'pro': \"Proverbs\",\n    'ecc': \"Ecclesiastes\",\n    'sng': \"Song of Songs\",\n    'isa': \"Isaiah\",\n    'jer': \"Jeremiah\",\n    'lam': \"Lamentations\",\n    'ezk': \"Ezekiel\",\n    'dan': \"Daniel\",\n    'hos': \"Hosea\",\n    'jol': \"Joel\",\n    'amo': \"Amos\",\n    'oba': \"Obadiah\",\n    'jon': \"Jonah\",\n    'mic': \"Micah\",\n    'nam': \"Nahum\",\n    'hab': \"Habakkuk\",\n    'zep': \"Zephaniah\",\n    'hag': \"Haggai\",\n    'zec': \"Zechariah\",\n    'mal': \"Malachi\",\n    'mat': \"Matthew\",\n    'mrk': \"Mark\",\n    'luk': \"Luke\",\n    'jhn': \"John\",\n    'act': \"Acts\",\n    'rom': \"Romans\",\n    '1co': \"1 Corinthians\",\n    '2co': \"2 Corinthians\",\n    'gal': \"Galatians\",\n    'eph': \"Ephesians\",\n    'php': \"Philippians\",\n    'col': \"Colossians\",\n    '1th': \"1 Thessalonians\",\n    '2th': \"2 Thessalonians\",\n    '1ti': \"1 Timothy\",\n    '2ti': \"2 Timothy\",\n    'tit': \"Titus\",\n    'phm': \"Philemon\",\n    'heb': \"Hebrews\",\n    'jas': \"James\",\n    '1pe': \"1 Peter\",\n    '2pe': \"2 Peter\",\n    '1jn': \"1 John\",\n    '2jn': \"2 John\",\n    '3jn': \"3 John\",\n    'jud': \"Jude\",\n    'rev': \"Revelation\",\n})\n\n\n// Usual English abbreviations of Bible books\n// NOTE Aiming for short but also easily recognisable\nexport const book_abbrev_english:Readonly<Record<string, string>> = Object.freeze({\n    'gen': \"Gen\",\n    'exo': \"Exo\",\n    'lev': \"Lev\",\n    'num': \"Num\",\n    'deu': \"Deut\",\n    'jos': \"Josh\",\n    'jdg': \"Judg\",\n    'rut': \"Ruth\",\n    '1sa': \"1 Sam\",\n    '2sa': \"2 Sam\",\n    '1ki': \"1 King\",\n    '2ki': \"2 King\",\n    '1ch': \"1 Chr\",\n    '2ch': \"2 Chr\",\n    'ezr': \"Ezra\",\n    'neh': \"Neh\",\n    'est': \"Est\",\n    'job': \"Job\",\n    'psa': \"Psalm\",\n    'pro': \"Prov\",\n    'ecc': \"Ecc\",\n    'sng': \"Song\",\n    'isa': \"Isa\",\n    'jer': \"Jer\",\n    'lam': \"Lam\",\n    'ezk': \"Ezek\",\n    'dan': \"Dan\",\n    'hos': \"Hos\",\n    'jol': \"Joel\",\n    'amo': \"Amos\",\n    'oba': \"Obad\",\n    'jon': \"Jonah\",\n    'mic': \"Micah\",\n    'nam': \"Nahum\",\n    'hab': \"Hab\",\n    'zep': \"Zeph\",\n    'hag': \"Hag\",\n    'zec': \"Zech\",\n    'mal': \"Mal\",\n    'mat': \"Matt\",\n    'mrk': \"Mark\",\n    'luk': \"Luke\",\n    'jhn': \"John\",\n    'act': \"Acts\",\n    'rom': \"Rom\",\n    '1co': \"1 Cor\",\n    '2co': \"2 Cor\",\n    'gal': \"Gal\",\n    'eph': \"Eph\",\n    'php': \"Phil\",\n    'col': \"Col\",\n    '1th': \"1 Thes\",\n    '2th': \"2 Thes\",\n    '1ti': \"1 Tim\",\n    '2ti': \"2 Tim\",\n    'tit': \"Titus\",\n    'phm': \"Philem\",\n    'heb': \"Heb\",\n    'jas': \"James\",\n    '1pe': \"1 Pet\",\n    '2pe': \"2 Pet\",\n    '1jn': \"1 John\",\n    '2jn': \"2 John\",\n    '3jn': \"3 John\",\n    'jud': \"Jude\",\n    'rev': \"Rev\",\n})\n\n\n// Special English abbreviations of book names\n// These could in theory abbreviate multiple books, and are only specified because of convention\n// See https://www.logos.com/bible-book-abbreviations\n// These are hard-coded so that they will result in a correct match if English default is kept\nexport const english_abbrev_include:readonly [string, string][] = Object.freeze([\n    // [code, abbrev]\n    ['num', \"nm\"],\n    ['ezr', \"ez\"],\n    ['mic', \"mc\"],\n    ['hab', \"hb\"],\n    ['jhn', \"jn\"],\n    ['php', \"phil\"],\n    ['phm', \"pm\"],\n    ['jas', \"jm\"],\n    ['jud', \"jud\"],\n    ['jud', \"jd\"],\n])\n\n\n// Abbreviations that should be ignored for being too vague\n// Words are only added if (1) common and (2) could actually match a book\n// E.g. \"So. 1\" is ok but not \"So 1 cat\"\nexport const english_abbrev_exclude:readonly string[] =\n    Object.freeze([\"is\", \"so\", \"at\", \"am\", \"me\", \"he\", \"hi\"])\n", "\n// The number of the last verse for every chapter of the Bible\n// NOTE Since some verses may be missing contents, it's not the number of verses in that sense\n// WARN Chapters are zero-indexed (i.e chapter 1 is at index 0)\nexport const last_verse:Readonly<Record<string, number[]>> = Object.freeze({\n    '1ch': [\n        54,\n        55,\n        24,\n        43,\n        26,\n        81,\n        40,\n        40,\n        44,\n        14,\n        47,\n        40,\n        14,\n        17,\n        29,\n        43,\n        27,\n        17,\n        19,\n        8,\n        30,\n        19,\n        32,\n        31,\n        31,\n        32,\n        34,\n        21,\n        30,\n    ],\n    '1co': [\n        31,\n        16,\n        23,\n        21,\n        13,\n        20,\n        40,\n        13,\n        27,\n        33,\n        34,\n        31,\n        13,\n        40,\n        58,\n        24,\n    ],\n    '1jn': [\n        10,\n        29,\n        24,\n        21,\n        21,\n    ],\n    '1ki': [\n        53,\n        46,\n        28,\n        34,\n        18,\n        38,\n        51,\n        66,\n        28,\n        29,\n        43,\n        33,\n        34,\n        31,\n        34,\n        34,\n        24,\n        46,\n        21,\n        43,\n        29,\n        53,\n    ],\n    '1pe': [\n        25,\n        25,\n        22,\n        19,\n        14,\n    ],\n    '1sa': [\n        28,\n        36,\n        21,\n        22,\n        12,\n        21,\n        17,\n        22,\n        27,\n        27,\n        15,\n        25,\n        23,\n        52,\n        35,\n        23,\n        58,\n        30,\n        24,\n        42,\n        15,\n        23,\n        29,\n        22,\n        44,\n        25,\n        12,\n        25,\n        11,\n        31,\n        13,\n    ],\n    '1th': [\n        10,\n        20,\n        13,\n        18,\n        28,\n    ],\n    '1ti': [\n        20,\n        15,\n        16,\n        16,\n        25,\n        21,\n    ],\n    '2ch': [\n        17,\n        18,\n        17,\n        22,\n        14,\n        42,\n        22,\n        18,\n        31,\n        19,\n        23,\n        16,\n        22,\n        15,\n        19,\n        14,\n        19,\n        34,\n        11,\n        37,\n        20,\n        12,\n        21,\n        27,\n        28,\n        23,\n        9,\n        27,\n        36,\n        27,\n        21,\n        33,\n        25,\n        33,\n        27,\n        23,\n    ],\n    '2co': [\n        24,\n        17,\n        18,\n        18,\n        21,\n        18,\n        16,\n        24,\n        15,\n        18,\n        33,\n        21,\n        14,\n    ],\n    '2jn': [\n        13,\n    ],\n    '2ki': [\n        18,\n        25,\n        27,\n        44,\n        27,\n        33,\n        20,\n        29,\n        37,\n        36,\n        21,\n        21,\n        25,\n        29,\n        38,\n        20,\n        41,\n        37,\n        37,\n        21,\n        26,\n        20,\n        37,\n        20,\n        30,\n    ],\n    '2pe': [\n        21,\n        22,\n        18,\n    ],\n    '2sa': [\n        27,\n        32,\n        39,\n        12,\n        25,\n        23,\n        29,\n        18,\n        13,\n        19,\n        27,\n        31,\n        39,\n        33,\n        37,\n        23,\n        29,\n        33,\n        43,\n        26,\n        22,\n        51,\n        39,\n        25,\n    ],\n    '2th': [\n        12,\n        17,\n        18,\n    ],\n    '2ti': [\n        18,\n        26,\n        17,\n        22,\n    ],\n    '3jn': [\n        15,  // Half of translations merge 15 into 14 (BSB,HCSB,etc) and half don't (NIV,ESV,etc)\n    ],\n    'act': [\n        26,\n        47,\n        26,\n        37,\n        42,\n        15,\n        60,\n        40,\n        43,\n        48,\n        30,\n        25,\n        52,\n        28,\n        41,\n        40,\n        34,\n        28,\n        41,\n        38,\n        40,\n        30,\n        35,\n        27,\n        27,\n        32,\n        44,\n        31,\n    ],\n    'amo': [\n        15,\n        16,\n        15,\n        13,\n        27,\n        14,\n        17,\n        14,\n        15,\n    ],\n    'col': [\n        29,\n        23,\n        25,\n        18,\n    ],\n    'dan': [\n        21,\n        49,\n        30,\n        37,\n        31,\n        28,\n        28,\n        27,\n        27,\n        21,\n        45,\n        13,\n    ],\n    'deu': [\n        46,\n        37,\n        29,\n        49,\n        33,\n        25,\n        26,\n        20,\n        29,\n        22,\n        32,\n        32,\n        18,\n        29,\n        23,\n        22,\n        20,\n        22,\n        21,\n        20,\n        23,\n        30,\n        25,\n        22,\n        19,\n        19,\n        26,\n        68,\n        29,\n        20,\n        30,\n        52,\n        29,\n        12,\n    ],\n    'ecc': [\n        18,\n        26,\n        22,\n        16,\n        20,\n        12,\n        29,\n        17,\n        18,\n        20,\n        10,\n        14,\n    ],\n    'eph': [\n        23,\n        22,\n        21,\n        32,\n        33,\n        24,\n    ],\n    'est': [\n        22,\n        23,\n        15,\n        17,\n        14,\n        14,\n        10,\n        17,\n        32,\n        3,\n    ],\n    'exo': [\n        22,\n        25,\n        22,\n        31,\n        23,\n        30,\n        25,\n        32,\n        35,\n        29,\n        10,\n        51,\n        22,\n        31,\n        27,\n        36,\n        16,\n        27,\n        25,\n        26,\n        36,\n        31,\n        33,\n        18,\n        40,\n        37,\n        21,\n        43,\n        46,\n        38,\n        18,\n        35,\n        23,\n        35,\n        35,\n        38,\n        29,\n        31,\n        43,\n        38,\n    ],\n    'ezk': [\n        28,\n        10,\n        27,\n        17,\n        17,\n        14,\n        27,\n        18,\n        11,\n        22,\n        25,\n        28,\n        23,\n        23,\n        8,\n        63,\n        24,\n        32,\n        14,\n        49,\n        32,\n        31,\n        49,\n        27,\n        17,\n        21,\n        36,\n        26,\n        21,\n        26,\n        18,\n        32,\n        33,\n        31,\n        15,\n        38,\n        28,\n        23,\n        29,\n        49,\n        26,\n        20,\n        27,\n        31,\n        25,\n        24,\n        23,\n        35,\n    ],\n    'ezr': [\n        11,\n        70,\n        13,\n        24,\n        17,\n        22,\n        28,\n        36,\n        15,\n        44,\n    ],\n    'gal': [\n        24,\n        21,\n        29,\n        31,\n        26,\n        18,\n    ],\n    'gen': [\n        31,\n        25,\n        24,\n        26,\n        32,\n        22,\n        24,\n        22,\n        29,\n        32,\n        32,\n        20,\n        18,\n        24,\n        21,\n        16,\n        27,\n        33,\n        38,\n        18,\n        34,\n        24,\n        20,\n        67,\n        34,\n        35,\n        46,\n        22,\n        35,\n        43,\n        55,\n        32,\n        20,\n        31,\n        29,\n        43,\n        36,\n        30,\n        23,\n        23,\n        57,\n        38,\n        34,\n        34,\n        28,\n        34,\n        31,\n        22,\n        33,\n        26,\n    ],\n    'hab': [\n        17,\n        20,\n        19,\n    ],\n    'hag': [\n        15,\n        23,\n    ],\n    'heb': [\n        14,\n        18,\n        19,\n        16,\n        14,\n        20,\n        28,\n        13,\n        28,\n        39,\n        40,\n        29,\n        25,\n    ],\n    'hos': [\n        11,\n        23,\n        5,\n        19,\n        15,\n        11,\n        16,\n        14,\n        17,\n        15,\n        12,\n        14,\n        16,\n        9,\n    ],\n    'isa': [\n        31,\n        22,\n        26,\n        6,\n        30,\n        13,\n        25,\n        22,\n        21,\n        34,\n        16,\n        6,\n        22,\n        32,\n        9,\n        14,\n        14,\n        7,\n        25,\n        6,\n        17,\n        25,\n        18,\n        23,\n        12,\n        21,\n        13,\n        29,\n        24,\n        33,\n        9,\n        20,\n        24,\n        17,\n        10,\n        22,\n        38,\n        22,\n        8,\n        31,\n        29,\n        25,\n        28,\n        28,\n        25,\n        13,\n        15,\n        22,\n        26,\n        11,\n        23,\n        15,\n        12,\n        17,\n        13,\n        12,\n        21,\n        14,\n        21,\n        22,\n        11,\n        12,\n        19,\n        12,\n        25,\n        24,\n    ],\n    'jas': [\n        27,\n        26,\n        18,\n        17,\n        20,\n    ],\n    'jdg': [\n        36,\n        23,\n        31,\n        24,\n        31,\n        40,\n        25,\n        35,\n        57,\n        18,\n        40,\n        15,\n        25,\n        20,\n        20,\n        31,\n        13,\n        31,\n        30,\n        48,\n        25,\n    ],\n    'jer': [\n        19,\n        37,\n        25,\n        31,\n        31,\n        30,\n        34,\n        22,\n        26,\n        25,\n        23,\n        17,\n        27,\n        22,\n        21,\n        21,\n        27,\n        23,\n        15,\n        18,\n        14,\n        30,\n        40,\n        10,\n        38,\n        24,\n        22,\n        17,\n        32,\n        24,\n        40,\n        44,\n        26,\n        22,\n        19,\n        32,\n        21,\n        28,\n        18,\n        16,\n        18,\n        22,\n        13,\n        30,\n        5,\n        28,\n        7,\n        47,\n        39,\n        46,\n        64,\n        34,\n    ],\n    'jhn': [\n        51,\n        25,\n        36,\n        54,\n        47,\n        71,\n        53,\n        59,\n        41,\n        42,\n        57,\n        50,\n        38,\n        31,\n        27,\n        33,\n        26,\n        40,\n        42,\n        31,\n        25,\n    ],\n    'job': [\n        22,\n        13,\n        26,\n        21,\n        27,\n        30,\n        21,\n        22,\n        35,\n        22,\n        20,\n        25,\n        28,\n        22,\n        35,\n        22,\n        16,\n        21,\n        29,\n        29,\n        34,\n        30,\n        17,\n        25,\n        6,\n        14,\n        23,\n        28,\n        25,\n        31,\n        40,\n        22,\n        33,\n        37,\n        16,\n        33,\n        24,\n        41,\n        30,\n        24,\n        34,\n        17,\n    ],\n    'jol': [\n        20,\n        32,\n        21,\n    ],\n    'jon': [\n        17,\n        10,\n        10,\n        11,\n    ],\n    'jos': [\n        18,\n        24,\n        17,\n        24,\n        15,\n        27,\n        26,\n        35,\n        27,\n        43,\n        23,\n        24,\n        33,\n        15,\n        63,\n        10,\n        18,\n        28,\n        51,\n        9,\n        45,\n        34,\n        16,\n        33,\n    ],\n    'jud': [\n        25,\n    ],\n    'lam': [\n        22,\n        22,\n        66,\n        22,\n        22,\n    ],\n    'lev': [\n        17,\n        16,\n        17,\n        35,\n        19,\n        30,\n        38,\n        36,\n        24,\n        20,\n        47,\n        8,\n        59,\n        57,\n        33,\n        34,\n        16,\n        30,\n        37,\n        27,\n        24,\n        33,\n        44,\n        23,\n        55,\n        46,\n        34,\n    ],\n    'luk': [\n        80,\n        52,\n        38,\n        44,\n        39,\n        49,\n        50,\n        56,\n        62,\n        42,\n        54,\n        59,\n        35,\n        35,\n        32,\n        31,\n        37,\n        43,\n        48,\n        47,\n        38,\n        71,\n        56,\n        53,\n    ],\n    'mal': [\n        14,\n        17,\n        18,\n        6,\n    ],\n    'mat': [\n        25,\n        23,\n        17,\n        25,\n        48,\n        34,\n        29,\n        34,\n        38,\n        42,\n        30,\n        50,\n        58,\n        36,\n        39,\n        28,\n        27,\n        35,\n        30,\n        34,\n        46,\n        46,\n        39,\n        51,\n        46,\n        75,\n        66,\n        20,\n    ],\n    'mic': [\n        16,\n        13,\n        12,\n        13,\n        15,\n        16,\n        20,\n    ],\n    'mrk': [\n        45,\n        28,\n        35,\n        41,\n        43,\n        56,\n        37,\n        38,\n        50,\n        52,\n        33,\n        44,\n        37,\n        72,\n        47,\n        // Mark's ending: 1-8 common, 9-20 long ending\n        // Some also add the alternate short ending to end of long ending with 21-22\n        // Not supporting 21-22 as whether ending abrupt/long/short it definitely wasn't both\n        20,\n    ],\n    'nam': [\n        15,\n        13,\n        19,\n    ],\n    'neh': [\n        11,\n        20,\n        32,\n        23,\n        19,\n        19,\n        73,\n        18,\n        38,\n        39,\n        36,\n        47,\n        31,\n    ],\n    'num': [\n        54,\n        34,\n        51,\n        49,\n        31,\n        27,\n        89,\n        26,\n        23,\n        36,\n        35,\n        16,\n        33,\n        45,\n        41,\n        50,\n        13,\n        32,\n        22,\n        29,\n        35,\n        41,\n        30,\n        25,\n        18,\n        65,\n        23,\n        31,\n        40,\n        16,\n        54,\n        42,\n        56,\n        29,\n        34,\n        13,\n    ],\n    'oba': [\n        21,\n    ],\n    'phm': [\n        25,\n    ],\n    'php': [\n        30,\n        30,\n        21,\n        23,\n    ],\n    'pro': [\n        33,\n        22,\n        35,\n        27,\n        23,\n        35,\n        27,\n        36,\n        18,\n        32,\n        31,\n        28,\n        25,\n        35,\n        33,\n        33,\n        28,\n        24,\n        29,\n        30,\n        31,\n        29,\n        35,\n        34,\n        28,\n        28,\n        27,\n        28,\n        27,\n        33,\n        31,\n    ],\n    'psa': [\n        6,\n        12,\n        8,\n        8,\n        12,\n        10,\n        17,\n        9,\n        20,\n        18,\n        7,\n        8,\n        6,\n        7,\n        5,\n        11,\n        15,\n        50,\n        14,\n        9,\n        13,\n        31,\n        6,\n        10,\n        22,\n        12,\n        14,\n        9,\n        11,\n        12,\n        24,\n        11,\n        22,\n        22,\n        28,\n        12,\n        40,\n        22,\n        13,\n        17,\n        13,\n        11,\n        5,\n        26,\n        17,\n        11,\n        9,\n        14,\n        20,\n        23,\n        19,\n        9,\n        6,\n        7,\n        23,\n        13,\n        11,\n        11,\n        17,\n        12,\n        8,\n        12,\n        11,\n        10,\n        13,\n        20,\n        7,\n        35,\n        36,\n        5,\n        24,\n        20,\n        28,\n        23,\n        10,\n        12,\n        20,\n        72,\n        13,\n        19,\n        16,\n        8,\n        18,\n        12,\n        13,\n        17,\n        7,\n        18,\n        52,\n        17,\n        16,\n        15,\n        5,\n        23,\n        11,\n        13,\n        12,\n        9,\n        9,\n        5,\n        8,\n        28,\n        22,\n        35,\n        45,\n        48,\n        43,\n        13,\n        31,\n        7,\n        10,\n        10,\n        9,\n        8,\n        18,\n        19,\n        2,\n        29,\n        176,\n        7,\n        8,\n        9,\n        4,\n        8,\n        5,\n        6,\n        5,\n        6,\n        8,\n        8,\n        3,\n        18,\n        3,\n        3,\n        21,\n        26,\n        9,\n        8,\n        24,\n        13,\n        10,\n        7,\n        12,\n        15,\n        21,\n        10,\n        20,\n        14,\n        9,\n        6,\n    ],\n    'rev': [\n        20,\n        29,\n        22,\n        11,\n        14,\n        17,\n        17,\n        13,\n        21,\n        11,\n        19,\n        18, // 12:18 Half of translations merge 18 into 17 (NIV,ESV...) and half don't (NET,NLT...)\n        18,\n        20,\n        8,\n        21,\n        18,\n        24,\n        21,\n        15,\n        27,\n        21,\n    ],\n    'rom': [\n        32,\n        29,\n        31,\n        25,\n        21,\n        23,\n        25,\n        39,\n        33,\n        21,\n        36,\n        21,\n        14,\n        // Some translations put Romans 16:25\u201327 at end of chapter 14 as Rom 14:24-26\n        // But only 1 of 6 early manuscripts support that, and only ~24 of 1000+ translations\n        // So best to append contents un-numbered to Rom 14:23 if it is included\n        23,  // Chapter 14\n        33,\n        27,\n    ],\n    'rut': [\n        22,\n        23,\n        18,\n        22,\n    ],\n    'sng': [\n        17,\n        17,\n        11,\n        16,\n        16,\n        13,\n        13,\n        14,\n    ],\n    'tit': [\n        16,\n        15,\n        15,\n    ],\n    'zec': [\n        21,\n        13,\n        10,\n        14,\n        11,\n        15,\n        14,\n        23,\n        17,\n        12,\n        17,\n        14,\n        9,\n        21,\n    ],\n    'zep': [\n        18,\n        15,\n        20,\n    ],\n})\n", "/* THEORY OF RANGES\n    When presented with \"Titus\", does it refer to the beginning of the book or whole contents?\n        E.g. When highlighting verses, should the whole book be highlighted or just first verse?\n    Likewise, does \"Titus 1\" refer to the start of the chapter or the whole chapter?\n\n    This module defaults to assuming \"Titus\" and \"Titus 1\" are _identifiers_ rather than ranges\n    And if a range is intended, then it should be presented as \"Titus 1-3\" or \"Titus 1:1-16\"\n\n    As for the other types, anything with a hyphen is obviously a range (1:1-2, 1-2, 1:1-2:2)\n    That only leaves single verses (1:1) which are identifiers and can never be a range\n    So it makes sense to consider books and chapters (no hyphens) as identifiers as well\n\n    However, when using methods that expect ranges, book/chapter types ARE interpreted as ranges.\n    For example: get_end(), is_after(), includes(), etc.\n    These methods treat book as a whole book range, and chapter as a whole chapter range.\n*/\n\n\nimport {parse_int} from './utils.js'\nimport {books_ordered, book_names_english, english_abbrev_include,\n    english_abbrev_exclude} from './data.js'\nimport {last_verse} from './last_verse.js'\n\n\nexport interface PassageArgs {\n    book:string\n    start_chapter?:number|undefined|null\n    start_verse?:number|undefined|null\n    end_chapter?:number|undefined|null\n    end_verse?:number|undefined|null\n}\n\nexport type ReferenceType = 'book'|'chapter'|'verse'|'range_verses'|'range_chapters'|'range_multi'\n\nexport type BookNamesArg = Record<string, string>|[string, string][]\n\n\nconst single_chapter_books = ['2jn', '3jn', 'jud', 'oba', 'phm']\n\n\n// Parse verses reference string into an object (but does not validate numbers)\nexport function _verses_str_to_obj(ref:string){\n\n    // Clean ref\n    ref = ref.replace(/ /g, '')  // Remove spaces\n        .replace(/\\./g, ':').replace(/\uFF1A/gu, ':')  // Normalise chap/verse seperators to common colon\n        .replace(/\\p{Dash}/gu, '-')  // Normalise range separators to common hyphen\n\n    // Init props\n    let start_chapter:number|undefined\n    let start_verse:number|undefined\n    let end_chapter:number|undefined\n    let end_verse:number|undefined\n\n    if (!ref.includes(':')){\n        // Dealing with chapters only\n        const parts = ref.split('-')\n        start_chapter = parse_int(parts[0]!) ?? undefined\n        end_chapter = parse_int(parts[1] ?? '') ?? undefined\n    } else {\n        // Includes verses\n        const parts = ref.split('-')\n        const start_parts = parts[0]!.split(':')\n        start_chapter = parse_int(start_parts[0]!) ?? undefined\n        start_verse = parse_int(start_parts[1] ?? '') ?? undefined\n        if (parts[1]){\n            // Is a range\n            const end_parts = parts[1].split(':')\n            if (end_parts.length > 1){\n                // Specifies end chapter\n                end_chapter = parse_int(end_parts[0]!) ?? undefined\n                end_verse = parse_int(end_parts[1]!) ?? undefined\n            } else {\n                // End verse is in same chapter\n                end_verse = parse_int(end_parts[0]!) ?? undefined\n            }\n        }\n    }\n\n    return {start_chapter, start_verse, end_chapter, end_verse}\n}\n\n\n// Get book USX code from the book name or an abbreviation of it\n// This should be language neutral (though some English special cases are included)\n// `book_names` is an array so that multiple names for same book can be provided\nexport function _detect_book(input:string, book_names:[string, string][],\n        exclude_book_names:string[]=[], match_from_start=true):string|null{\n\n    // Clean util to be used for both input and book names\n    const clean = (string:string) => {\n        return string\n            .trim().toLowerCase()\n            .replace(/^i /, '1').replace('1st ', '1').replace('first ', '1')\n            .replace(/^ii /, '2').replace('2nd ', '2').replace('second ', '2')\n            .replace(/^iii /, '3').replace('3rd ', '3').replace('third ', '3')\n            .replace(/[^\\d\\p{Letter}]/gui, '')\n    }\n\n    // Clean the input\n    input = clean(input)\n    if (!input){\n        return null  // So know have at least 1 char\n    }\n\n    // Ignore if excluded\n    exclude_book_names = exclude_book_names.map(name => clean(name))\n    if (exclude_book_names.includes(input)){\n        return null\n    }\n\n    // If a direct match to a code, just return it\n    // This allows passing a book code when the human name is not available\n    if (books_ordered.includes(input)){\n        return input\n    }\n\n    // Normalise book names and ensure no empty strings\n    const normalised = book_names.map(([code, name]) => ([code, clean(name)] as [string, string]))\n        .filter(([code, name]) => name)\n\n    // See if input matches or abbreviates any book name\n    const matches:[string, string][] = []\n    for (const [code, name] of normalised){\n        if (input === name){\n            return code  // Return straight away if an exact match (even if could prefix multiple)\n        } else if (name.startsWith(input)){\n            matches.push([code, name])\n        }\n    }\n\n    // Only return if unique match\n    if (matches.length === 1){\n        return matches[0]![0]\n    } else if (matches.length){\n        return null  // Multiple matches so input must be too vague\n    }\n\n    // Try fuzzy regex, since vowels are often removed in abbreviations\n    // NOTE Constructed regex should be safe as only digits and letters are allowed in input\n    let input_regex_str = input.split('').join('.{0,4}')\n    if (match_from_start){\n        if (['1', '2', '3'].includes(input[0]!)){\n            // Must match first two chars from start if first char is a number\n            input_regex_str = '^' + input[0]! + input.slice(1).split('').join('.{0,4}')\n        } else {\n            input_regex_str = '^' + input_regex_str\n        }\n    }\n    const input_regex = new RegExp(input_regex_str)\n    const fuzzy_matches = normalised.filter(([code, name]) => input_regex.test(name))\n    if (fuzzy_matches.length === 1){\n        return fuzzy_matches[0]![0]\n    }\n\n    return null\n}\n\n\nexport class PassageReference {\n\n    readonly type:ReferenceType\n    readonly range:boolean\n    readonly book:string\n    readonly ot:boolean\n    readonly nt:boolean\n    readonly start_chapter:number\n    readonly start_verse:number\n    readonly end_chapter:number\n    readonly end_verse:number\n    readonly args_valid:boolean  // Whether the original input was valid or not\n    readonly _args:PassageArgs  // The args originally given when creating this ref\n\n    /* Force a given passage reference to be valid (providing as much or as little as desired)\n    Chapter and verse numbers will be forced to their closest valid equivalent.\n    All properties are returned and `type`/`range` signifies what kind of reference it is.\n    */\n    constructor(book:string, chapter?:number, verse?:number)\n    constructor(reference:PassageArgs)\n    constructor(book_or_obj:string|PassageArgs, chapter?:number, verse?:number){\n\n        // Normalize args\n        if (typeof book_or_obj !== 'string'){\n            // Destructure so extraneous properties aren't preserved in `this._args`\n            this._args = {\n                book: book_or_obj.book,\n                start_chapter: book_or_obj.start_chapter,\n                start_verse: book_or_obj.start_verse,\n                end_chapter: book_or_obj.end_chapter,\n                end_verse: book_or_obj.end_verse,\n            }\n        } else {\n            this._args = {\n                book: book_or_obj,\n                start_chapter: chapter,\n                start_verse: verse,\n            }\n        }\n\n        // Detect what props are provided (will use later)\n        const chapters_given = typeof this._args.start_chapter === 'number'\n            || typeof this._args.end_chapter === 'number'\n        const verses_given = typeof this._args.start_verse === 'number'\n            || typeof this._args.end_verse === 'number'\n\n        // Provide defaults\n        this.book = this._args.book\n        this.start_chapter = this._args.start_chapter ?? 1\n        this.start_verse = this._args.start_verse ?? 1\n        this.end_chapter = this._args.end_chapter ?? this._args.start_chapter ?? 1\n        // If end_chapter given then dealing with whole chapters, otherwise a non-range\n        this.end_verse = this._args.end_verse ?? (this._args.end_chapter ? 999 : 1)\n\n        // Validate book\n        if (books_ordered.indexOf(this.book) === -1){\n            this.book = 'gen'\n        }\n\n        // Ensure start chapter is valid\n        const last_verse_book = last_verse[this.book]!\n        if (this.start_chapter < 1){\n            this.start_chapter = 1\n            this.start_verse = 1\n        } else if (this.start_chapter > last_verse_book.length){\n            this.start_chapter = last_verse_book.length\n            this.start_verse = last_verse_book[last_verse_book.length-1]!\n        }\n\n        // Ensure start verse is valid\n        this.start_verse = Math.min(Math.max(this.start_verse, 1),\n            last_verse_book[this.start_chapter-1]!)\n\n        // Ensure end is not before start\n        if (this.end_chapter < this.start_chapter ||\n                (this.end_chapter === this.start_chapter && this.end_verse < this.start_verse)){\n            this.end_chapter = this.start_chapter\n            this.end_verse = this.start_verse\n        }\n\n        // Ensure end chapter is not invalid (already know is same or later than start)\n        if (this.end_chapter > last_verse_book.length){\n            this.end_chapter = last_verse_book.length\n            this.end_verse = last_verse_book[last_verse_book.length-1]!\n        }\n\n        // Ensure end verse is valid\n        this.end_verse = Math.min(Math.max(this.end_verse, 1), last_verse_book[this.end_chapter-1]!)\n\n        // Determine type\n        const chapters_same = this.start_chapter === this.end_chapter\n        const verses_same = this.start_verse === this.end_verse\n        if (chapters_same && verses_same){\n            this.type = chapters_given ? (verses_given ? 'verse' : 'chapter') : 'book'\n        } else {\n            this.type = chapters_same ? 'range_verses' :\n                (verses_given ? 'range_multi': 'range_chapters')\n        }\n\n        // Identify if range completes chapters\n        if (this.type === 'range_multi' && this.start_verse === 1\n                && this.end_verse === last_verse_book[this.end_chapter-1]){\n            this.type = 'range_chapters'\n        }\n\n        // A chapter for a single chapter book is just the book\n        if (single_chapter_books.includes(this.book) && this.type === 'chapter'){\n            this.type = 'book'\n        }\n\n        // Determine range and testament properties\n        this.range = this.type.startsWith('range_')\n        this.ot = books_ordered.indexOf(this.book) < 39\n        this.nt = !this.ot\n\n        // Determine if original input was valid\n        const determine_args_valid = () => {\n\n            // Verify parts stayed same, but only those provided (ignoring undefined)\n            if (this._args.book !== this.book){\n                return false\n            }\n            const props = ['start_chapter', 'start_verse', 'end_chapter', 'end_verse'] as const\n            for (const prop of props){\n                if (Number.isInteger(this._args[prop]) && this._args[prop] !== this[prop]){\n                    return false\n                }\n            }\n\n            // Also fail if provided args don't make sense\n            // NOTE Already know that no numbers in ref are 0/false due to above\n            if (!this._args.start_chapter && (this._args.end_chapter || this._args.start_verse\n                    || this._args.end_verse)){\n                return false  // e.g. Matt :1\n            }\n            if (this._args.end_verse && !this._args.start_verse){\n                return false  // e.g. Matt 1:-1\n            }\n            if (this._args.start_verse && this._args.end_chapter && !this._args.end_verse){\n                return false  // e.g. Matt 1:1-2:\n            }\n\n            return true\n        }\n        this.args_valid = determine_args_valid()\n    }\n\n    // Parse passage reference string\n    // book_names can be a list if a single book has multiple names [[\"gen\", \"Genesis\"], ...]\n    static from_string(reference:string, book_names?:BookNamesArg, exclude_book_names?:string[],\n            min_chars=2, match_from_start=true):PassageReference|null{\n\n        // Default to English book names if none given\n        // NOTE Don't always include in case creates false positives in some languages\n        if (!book_names){\n            book_names = [...Object.entries(book_names_english), ...english_abbrev_include]\n            if (!exclude_book_names){\n                exclude_book_names = [...english_abbrev_exclude]\n            }\n        }\n\n        // Conform book_names to a list\n        const book_names_list = Array.isArray(book_names) ? book_names : Object.entries(book_names)\n\n        // Trim\n        reference = reference.trim()\n\n        // Find start of first digit, except if start of string (e.g. 1 Sam)\n        let verses_start = reference.slice(1).search(/\\d/) + 1\n        if (verses_start === 0){  // NOTE +1 above means never -1 and 0 is a no match\n            verses_start = reference.length\n        }\n\n        // Fail if book string is less than min chars\n        // Check before cleaning the value so that \"So. 1\" works but \"So 1\" doesn't (if min were 3)\n        const book_str = reference.slice(0, verses_start).trim()\n        if (book_str.length < min_chars){\n            return null\n        }\n\n        // If book can be parsed, ref is valid even if verse range can't be parsed\n        const book_code = _detect_book(book_str, book_names_list, exclude_book_names,\n            match_from_start)\n        if (!book_code){\n            return null\n        }\n\n        // Parse verses\n        const verses_str = reference.slice(verses_start)\n        let verses = _verses_str_to_obj(verses_str)\n\n        // Interpret single digits as verses for single chapter books\n        if (single_chapter_books.includes(book_code) && verses.start_chapter\n                && verses.start_verse === undefined && verses.end_verse === undefined){\n            verses = _verses_str_to_obj('1:' + verses_str)\n        }\n\n        return new PassageReference({book: book_code, ...verses})\n    }\n\n    // Return a new reference that extends from start of first ref to end of second ref\n    // NOTE get_end() used so that book/chapter types are treated as ranges\n    static from_refs(start:PassageReference, end:PassageReference){\n        const actual_end = end.get_end()  // Treat book/chapter types as ranges\n        return new PassageReference({\n            book: start.book,\n            start_chapter: start.start_chapter,\n            start_verse: start.start_verse,\n            end_chapter: actual_end.end_chapter,\n            end_verse: actual_end.end_verse,\n        })\n    }\n\n    // Restore reference from serialized form\n    // While deserializing using `from_string()` works, this method is faster & never returns null\n    static from_serialized(code:string){\n        const book = code.slice(0, 3)\n        const verses = code.slice(3)\n        return new PassageReference({book, ..._verses_str_to_obj(verses)})\n    }\n\n    // Get name for book (defaults to English when book names not provided)\n    get_book_string(book_names:Record<string, string>={}):string{\n        // WARN A value may be undefined or empty string\n        return book_names[this.book] || book_names_english[this.book]!\n    }\n\n    // Get string representation of verses\n    get_verses_string(verse_sep=':', range_sep='-'):string{\n\n        if (this.type === 'book'){\n            return ''\n        } else if (this.type === 'chapter'){\n            return `${this.start_chapter}`\n        } else if (this.type === 'range_chapters'){\n            return `${this.start_chapter}${range_sep}${this.end_chapter}`\n        } else if (this.type === 'verse'){\n            return `${this.start_chapter}${verse_sep}${this.start_verse}`\n        }\n\n        // Other ranges\n        let out = `${this.start_chapter}${verse_sep}${this.start_verse}${range_sep}`\n        if (this.end_chapter !== this.start_chapter){\n            out += `${this.end_chapter}${verse_sep}`\n        }\n        return out + `${this.end_verse}`\n    }\n\n    // Format passage reference to a readable string\n    toString(book_names:Record<string, string>={}, verse_sep=':', range_sep='-'):string{\n        const out = this.get_book_string(book_names) + ' '\n            + this.get_verses_string(verse_sep, range_sep)\n        return out.trim()\n    }\n\n    // Serialize reference to string that can be restored by `from_serialized()`\n    to_serialized(){\n        return this.book + this.get_verses_string()\n    }\n\n    // Whether this reference is the same as the one provided\n    equals(ref:PassageReference):boolean{\n        return this.type === ref.type\n            && this.book === ref.book\n            && this.start_chapter === ref.start_chapter\n            && this.start_verse === ref.start_verse\n            && this.end_chapter === ref.end_chapter\n            && this.end_verse === ref.end_verse\n    }\n\n    // Whether this reference ends before the given reference starts (no overlap)\n    // NOTE 'book'/'chapter' types are interpreted as ranges for this\n    is_before(chapter:number, verse:number):boolean\n    is_before(ref:PassageReference):boolean\n    is_before(chapter_or_ref:number|PassageReference, verse?:number):boolean{\n        const ref = typeof chapter_or_ref === 'number'\n            ? new PassageReference(this.book, chapter_or_ref, verse) : chapter_or_ref\n        if (this.book !== ref.book){\n            return books_ordered.indexOf(this.book) < books_ordered.indexOf(ref.book)\n        }\n        const this_end = this.get_end()  // Treat book/chapter types as ranges\n        return this_end.end_chapter < ref.start_chapter\n            || (this_end.end_chapter === ref.start_chapter && this_end.end_verse < ref.start_verse)\n    }\n\n    // Whether this reference starts after the given reference ends (no overlap)\n    // NOTE 'book'/'chapter' types are interpreted as ranges for this\n    is_after(chapter:number, verse:number):boolean\n    is_after(ref:PassageReference):boolean\n    is_after(chapter_or_ref:number|PassageReference, verse?:number):boolean{\n        const ref = typeof chapter_or_ref === 'number'\n            ? new PassageReference(this.book, chapter_or_ref, verse) : chapter_or_ref\n        if (this.book !== ref.book){\n            return books_ordered.indexOf(this.book) > books_ordered.indexOf(ref.book)\n        }\n        const ref_end = ref.get_end()  // Treat book/chapter types as ranges\n        return this.start_chapter > ref_end.end_chapter\n            || (this.start_chapter === ref_end.end_chapter && this.start_verse > ref_end.end_verse)\n    }\n\n    // Whether this reference includes all verses of given reference\n    // NOTE 'book'/'chapter' types are interpreted as ranges for this\n    includes(chapter:number, verse:number):boolean\n    includes(ref:PassageReference):boolean\n    includes(chapter_or_ref:number|PassageReference, verse?:number):boolean{\n        const ref = typeof chapter_or_ref === 'number'\n            ? new PassageReference(this.book, chapter_or_ref, verse) : chapter_or_ref\n        // ref must not start before `this`, and must not end after `this`\n        // NOTE get_start/get_end needed \u2014 without them is_before/is_after compares ref's end/start,\n        //      so a ref that overlaps but isn't fully contained would pass the check incorrectly\n        return !ref.get_start().is_before(this) && !ref.get_end().is_after(this)\n    }\n\n    // Whether this reference shares any verses with the given reference\n    // NOTE 'book'/'chapter' types are interpreted as ranges for this\n    overlaps(ref:PassageReference):boolean{\n        return !this.is_before(ref) && !this.is_after(ref)\n    }\n\n    // Get the total number of verses included in the range\n    total_verses(){\n\n        // If a book or chapter, will expect range even though they are identifiers\n        const {end_chapter, end_verse} = this.get_end()\n\n        // Handle same chapter case\n        if (this.start_chapter === end_chapter){\n            return end_verse - this.start_verse + 1\n        }\n\n        // First add verses from first chapter\n        const last_verse_book = last_verse[this.book]!\n        let count = last_verse_book[this.start_chapter-1]! - this.start_verse + 1\n\n        // Then add verses from middle chapters\n        for (let ch=this.start_chapter+1; ch < end_chapter; ch++){\n            count += last_verse_book[ch-1]!\n        }\n\n        // Finally add verses from last chapter\n        return count + end_verse\n    }\n\n    // Get a reference for just the start verse of this reference (no effect if single verse)\n    get_start(){\n        return new PassageReference({\n            book: this.book,\n            start_chapter: this.start_chapter,\n            start_verse: this.start_verse,\n        })\n    }\n\n    // Get a reference for just the end verse of this reference (no effect if single verse)\n    // NOTE 'book'/'chapter' types are interpreted as ranges for this\n    get_end(){\n        const last_verse_book = last_verse[this.book]!\n        if (this.type === 'book'){\n            // User will expect end of book, even though this type is an identifier and not range\n            return new PassageReference({\n                book: this.book,\n                start_chapter: last_verse_book.length,\n                start_verse: last_verse_book[last_verse_book.length-1],\n            })\n        } else if (this.type === 'chapter'){\n            // User will expect end of chapter, even though this type is an identifier and not range\n            return new PassageReference({\n                book: this.book,\n                start_chapter: this.start_chapter,\n                start_verse: last_verse_book[this.start_chapter-1],\n            })\n        }\n        return new PassageReference({\n            book: this.book,\n            start_chapter: this.end_chapter,\n            start_verse: this.end_verse,\n        })\n    }\n\n    // Get a reference for the verse previous to this one (accounting for chapters)\n    // It can optionally be relative to the end verse, but a range is never returned (single verse)\n    // NOTE 'book'/'chapter' types are interpreted as ranges for this\n    get_prev_verse(prev_to_end=false):PassageReference|null{\n\n        // Optionally relative to end rather than start (use get_end() in case book/chapter type)\n        const end = prev_to_end ? this.get_end() : null\n        let chapter = end ? end.end_chapter : this.start_chapter\n        let verse = end ? end.end_verse : this.start_verse\n\n        // Ensure action possible\n        if (chapter === 1 && verse === 1){\n            return null\n        }\n\n        // Go back a verse\n        if (verse === 1){\n            chapter -= 1\n            verse = last_verse[this.book]![chapter-1]!\n        } else {\n            verse -= 1\n        }\n\n        return new PassageReference({\n            book: this.book,\n            start_chapter: chapter,\n            start_verse: verse,\n        })\n    }\n\n    // Get a reference for the verse after this one (accounting for chapters)\n    // It can optionally be relative to the end verse, but a range is never returned (single verse)\n    // NOTE 'book'/'chapter' types are interpreted as ranges for this\n    get_next_verse(after_end=false):PassageReference|null{\n\n        // Optionally relative to end rather than start (use get_end() in case book/chapter type)\n        const end = after_end ? this.get_end() : null\n        let chapter = end ? end.end_chapter : this.start_chapter\n        let verse = end ? end.end_verse : this.start_verse\n\n        // Ensure action possible\n        const last_verse_book = last_verse[this.book]!\n        if (chapter === last_verse_book.length\n                && verse === last_verse_book[last_verse_book.length-1]){\n            return null\n        }\n\n        // Go forward a verse\n        if (verse === last_verse_book[chapter-1]){\n            chapter += 1\n            verse = 1\n        } else {\n            verse += 1\n        }\n\n        return new PassageReference({\n            book: this.book,\n            start_chapter: chapter,\n            start_verse: verse,\n        })\n    }\n\n    // Return new object that collapses ranges to a book/chapter type if possible\n    // NOTE This is not done automatically in constructor since book/chapter types are identifiers\n    //      and can refer to e.g. navigating to a chapter rather than selecting its contents\n    simplify():PassageReference {\n        const last_verse_book = last_verse[this.book]!\n\n        // If range_verses (single chapter) covers whole chapter, convert to chapter type\n        if (this.type === 'range_verses' && this.start_verse === 1\n                && this.end_verse === last_verse_book[this.start_chapter-1]){\n            return new PassageReference(this.book, this.start_chapter)\n        }\n\n        // If range_chapters covers whole book, convert to book type\n        if (this.type === 'range_chapters' && this.start_chapter === 1\n                && this.end_chapter === last_verse_book.length){\n            return new PassageReference(this.book)\n        }\n\n        return this\n    }\n}\n", "\nimport {PassageReference, BookNamesArg} from './passage.js'\n\n\nexport interface PassageReferenceMatch {\n    ref:PassageReference\n    text:string\n    index:number\n    index_from_prev_match:number\n    whole:boolean\n}\n\n\n// Regex strings used for identifying passage references in blocks of text\n// NOTE Allow two spaces but no more, to be forgiving but not match weird text\nconst regex_verse_sep = '[:\uFF1A\\\\.]'\nconst regex_book_num_prefix = '(?:(?:[123]|I{1,3}) ? ?)?'\nconst regex_book_name_tmpl = '\\\\p{Letter}[\\\\p{Letter}\\\\p{Dash} ]{MIN_MID,16}END_LETTER\\\\.? ? ?'\nconst regex_integer_with_opt_sep =\n    '\\\\d{1,3}[abc]?(?: ? ?' + regex_verse_sep + ' ? ?\\\\d{1,3}[abc]?)?'\nconst regex_verse_range = regex_integer_with_opt_sep + '(?: ? ?\\\\p{Dash} ? ?'\n    + regex_integer_with_opt_sep + ')?'\nconst regex_trailing = '(?![\\\\d\\\\p{Letter}@#$%])'  // Doesn't make sense to be followed by these\n\nconst regex_between_ranges = ' ? ?[,;] ? ?'\nconst regex_additional_range = regex_between_ranges + '(' + regex_verse_range + ')' + regex_trailing\n\n\n// Detect the text and position of passage references in a block of text\n// Whole books aren't detected (e.g. Philemon) only references with a range (e.g. Philemon 1)\nexport function* detect_references(text:string, book_names?:BookNamesArg,\n        exclude_book_names?:string[], min_chars=2, match_from_start=true)\n        :Generator<PassageReferenceMatch, null, undefined>{\n\n    // Shortcut for calling from_string\n    const from_string = (value:string) => {\n        return PassageReference.from_string(value, book_names, exclude_book_names, min_chars,\n            match_from_start)\n    }\n\n    // Generate regexs with dynamic value based on min_chars for book name\n    // MIN_MID is -2 as first and last char already specified\n    // END_LETTER is not present if min_chars is 1\n    const regex_book_name = regex_book_name_tmpl\n        .replace('MIN_MID', String(Math.max(0, min_chars - 2)))\n        .replace('END_LETTER', min_chars > 1 ? '\\\\p{Letter}' : '')\n    const regex_complete =\n        regex_book_num_prefix + regex_book_name + regex_verse_range + regex_trailing\n    const regex_book_check =\n        regex_between_ranges + '(' + regex_book_num_prefix + regex_book_name + ')'\n\n    // Create regex (will manually manipulate lastIndex property of it)\n    const regex = new RegExp(regex_complete, 'uig')\n\n    // Keep track of end of last match\n    // This is useful for callers to know if they modify the text as they go (changing its length)\n    let end_of_prev_match = 0\n\n    // Loop until find a valid ref (not all regex matches will be valid)\n    while (true){\n        const match = regex.exec(text)\n        if (!match){\n            return null  // Either no matches or no valid matches...\n        }\n\n        // Confirm match is actually a valid ref\n        const ref = from_string(match[0])\n        if (ref && ref.args_valid){\n            yield {\n                ref,\n                text: match[0],\n                index: match.index,\n                index_from_prev_match: match.index - end_of_prev_match,\n                whole: true,\n            }\n            end_of_prev_match = match.index + match[0].length\n\n            // See if additional ranges immediately after this ref\n            // WARN Sticky flag 'y' needed to ensure match is at start of lastIndex\n            const add_regex = new RegExp(regex_additional_range, 'uiy')\n            add_regex.lastIndex = regex.lastIndex  // Move up to where main regex is up to\n\n            // Additional refs all have same book as main ref, but chapter may change, so track\n            let prev_end_chapter = ref.end_chapter\n\n            while (true){\n\n                // If followed by a valid book name, skip check for additional ranges\n                // E.g. (John 1:1,3, 3 John 1)\n                // WARN Sticky flag 'y' needed to ensure match is at start of lastIndex\n                const book_look_ahead = new RegExp(regex_book_check, 'uiy')\n                book_look_ahead.lastIndex = add_regex.lastIndex\n                const possible_book = book_look_ahead.exec(text)\n                if (possible_book && from_string(possible_book[1]!)){\n                    break\n                }\n\n                const add_match = add_regex.exec(text)\n                if (!add_match){\n                    break\n                }\n\n                // Since this regex uses a capture group, need to get index of capture\n                const add_match_real_index = add_match.index + add_match[0].indexOf(add_match[1]!)\n\n                // Confirm valid ref, prefixing with book (and opt end chapter) from main ref\n                let prefix = ref.book\n                const has_verse_sep = new RegExp(regex_verse_sep).test(add_match[1]!)\n                if (!has_verse_sep && ['verse', 'range_verses', 'range_multi'].includes(ref.type)){\n                    prefix += `${prev_end_chapter}:`\n                }\n                const add_ref = from_string(prefix + add_match[1]!)\n                if (!add_ref || !add_ref.args_valid){\n                    break\n                }\n                yield {\n                    ref: add_ref,\n                    text: add_match[1]!,\n                    index: add_match_real_index,\n                    index_from_prev_match: add_match_real_index - end_of_prev_match,\n                    whole: false,\n                }\n                end_of_prev_match = add_match_real_index + add_match[1]!.length\n                prev_end_chapter = add_ref.end_chapter\n\n                // Move main regex up to where successful additional ranges regex is up to\n                // WARN Only if larger as lastIndex will reset to 0 at end of string\n                if (add_regex.lastIndex > regex.lastIndex){\n                    regex.lastIndex = add_regex.lastIndex\n                }\n            }\n\n        } else {\n            // If invalid, try next word as match might still have included a partial ref\n            // e.g. \"in 1 Corinthians 9\" -> \"in 1\" -> \"1 Corinthians 9\"\n            const chars_to_next_word = match[0].indexOf(' ', 1)\n            if (chars_to_next_word >= 1){\n                // Backtrack to exclude just first word of previous match\n                regex.lastIndex -= (match[0].length - chars_to_next_word - 1)\n            }\n        }\n    }\n}\n", "\nimport {PassageReference} from './passage.js'\nimport {books_ordered} from './data.js'\n\n\n// Sorts a list of references by verse in canonical order (or preserve existing book order)\nexport function sort_references(refs:PassageReference[], canonical=true):PassageReference[]{\n\n    // When not canonical, preserve existing book order by recording first appearance index per book\n    const book_first_index = new Map<string, number>()\n    if (!canonical){\n        refs.forEach((ref, i) => {\n            if (!book_first_index.has(ref.book)){\n                book_first_index.set(ref.book, i)\n            }\n        })\n    }\n\n    // Return new array\n    return refs.slice().sort((a, b) => {\n\n        // Sort by book order\n        const book_diff = canonical\n            ? books_ordered.indexOf(a.book) - books_ordered.indexOf(b.book)\n            : book_first_index.get(a.book)! - book_first_index.get(b.book)!\n        if (book_diff !== 0){\n            return book_diff\n        }\n\n        // Sort by start chapter, then start verse\n        if (a.start_chapter !== b.start_chapter){\n            return a.start_chapter - b.start_chapter\n        }\n        if (a.start_verse !== b.start_verse){\n            return a.start_verse - b.start_verse\n        }\n\n        // Same start verse, so sort by end position (smallest to largest)\n        // NOTE It's expected for book and chapter types to end at their first verse\n        //      E.g. Gen, Gen 2, Gen 2:2 and not Gen 2:2, Gen 2, Gen\n        if (a.end_chapter !== b.end_chapter){\n            return a.end_chapter - b.end_chapter\n        }\n        return a.end_verse - b.end_verse\n    })\n}\n\n\n// Returns references merged where possible, keeping merged refs at the position of the earlier ref\nexport function simplify_references(refs:PassageReference[]):PassageReference[]{\n\n    const result:PassageReference[] = []\n\n    for (const ref of refs){\n\n        // Find an earlier result entry that overlaps or is adjacent (no gap in either direction)\n        const merge_i = result.findIndex(prev => {\n            // Checking prev verse for both ensures order doesn't matter\n            return prev.overlaps(ref)\n                || ref.get_prev_verse()?.overlaps(prev) || prev.get_prev_verse()?.overlaps(ref)\n        })\n\n        // Just append if can't merge\n        if (merge_i === -1){\n            result.push(ref.simplify())\n            continue\n        }\n\n        // Determine which ref contributes the start and end of the merged result\n        const prev = result[merge_i]!\n        const start_ref = prev.get_start().is_after(ref.get_start()) ? ref : prev\n        const end_ref = ref.get_end().is_after(prev) ? ref : prev\n\n        // Construct merged ref then simplify in case needed\n        result[merge_i] = PassageReference.from_refs(start_ref, end_ref).simplify()\n    }\n\n    return result\n}\n\n\n// Render a list of references to string, making representation succinct where possible\n// E.g. Matt 1:1-2, Matt 1:5, Matt 5, Gen 1 -> Matt 1:1-2, 5; 5; Gen 1\nexport function references_to_string(refs:PassageReference[], book_names:Record<string, string>={},\n        verse_sep=':', range_sep='-', chapter_sep='; '):string{\n\n    let result = ''\n    let current_book:string|null = null\n    let current_chapter:number|null = null\n\n    for (const ref of refs){\n\n        const same_book = ref.book === current_book\n        const verse_level = ref.type === 'verse' || ref.type === 'range_verses'\n        const same_chapter = same_book && ref.start_chapter === current_chapter && verse_level\n\n        // Determine separator and display string based on shared context with previous ref\n        let sep:string\n        let display:string\n        if (result === ''){\n            sep = ''\n            display = ref.toString(book_names, verse_sep, range_sep)\n        } else if (same_chapter){\n            // Same book and chapter \u2014 show only the verse(s), no chapter prefix\n            sep = ', '\n            display = ref.type === 'verse'\n                ? `${ref.start_verse}`\n                : `${ref.start_verse}${range_sep}${ref.end_verse}`\n        } else if (same_book){\n            // Same book, different chapter \u2014 omit book name\n            sep = chapter_sep\n            display = ref.get_verses_string(verse_sep, range_sep)\n        } else {\n            // Different book \u2014 show full reference\n            sep = chapter_sep\n            display = ref.toString(book_names, verse_sep, range_sep)\n        }\n\n        result += sep + display\n\n        // Update context to track what was last rendered\n        current_book = ref.book\n        current_chapter = ref.start_chapter\n    }\n\n    return result\n}\n", "\nimport {last_verse} from './last_verse.js'\n\n\n// Get chapter numbers for a book\nexport function get_chapters(book:string):number[]{\n    // NOTE Need to +1 since chapter numbers are derived from place in last_verse array\n    return [...Array(last_verse[book]!.length).keys()].map(i => i + 1)\n}\n\n\n// Get verse numbers for a chapter\nexport function get_verses(book:string, chapter:number):number[]{\n    // WARN Position of each chapter is chapter-1 due to starting from 0\n    return [...Array(last_verse[book]![chapter-1]).keys()].map(i => i + 1)\n}\n", "\nimport type {UsageConfig, RuntimeLicense} from './types'\n\n\n// @internal\nexport function filter_licenses(licenses:RuntimeLicense[], usage:UsageConfig):RuntimeLicense[]{\n    // Filter licenses so only those that are compatible with intended use are present\n    return licenses.filter(license => {\n        const r = license.restrictions\n        return (\n            (!usage.commercial || !r.forbid_commercial)\n            && (!usage.attributionless || !r.forbid_attributionless)\n            && (!usage.derivatives || !r.forbid_derivatives || usage.derivatives === 'same-license'\n                && r.forbid_derivatives === 'same-license')\n            && (!usage.limitless || !r.forbid_limitless)\n        )\n    })\n}\n", "\n// @internal\nexport function deep_copy<T extends object>(source:T):T{\n    // Deep copy an object that originated from JSON (doesn't handle other edge cases)\n    const copy = (Array.isArray(source) ? [] : {}) as T\n    for (const key in source){\n        const value = source[key]\n        // @ts-ignore This util is only for simple JSON objects where as TS accounts for all cases\n        copy[key] = (typeof value === 'object' && value !== null) ? deep_copy(value) : value\n    }\n    return copy\n}\n\n\n// @internal Remove diacritics from a string\nexport function rm_diacritics(string:string):string{\n    // See https://stackoverflow.com/a/37511463/10262211\n    return string.normalize('NFKD').replace(/\\p{Diacritic}/gu, '')\n}\n\n\n// @internal Convert modern rendering of greek/hebrew word to orig, without diacritics/punct/etc\nexport function word_to_original(word:string){\n\n    // Remove diacritics\n    word = rm_diacritics(word)\n\n    // Make uppercase (for Greek)\n    word = word.toUpperCase()\n\n    // Remove all punctuation and non-orig chars\n    // Greek \\u0391-\\u03A9 = \u0391 \u0392 \u0393 \u0394 \u0395 \u0396 \u0397 \u0398 \u0399 \u039A \u039B \u039C \u039D \u039E \u039F \u03A0 \u03A1 \u03A3 \u03A4 \u03A5 \u03A6 \u03A7 \u03A8 \u03A9\n    // Hebrew \\u05D0-\\u05EA = \u05D0 \u05D1 \u05D2 \u05D3 \u05D4 \u05D5 \u05D6 \u05D7 \u05D8 \u05D9 \u05DB \u05DC \u05DE \u05E0 \u05E1 \u05E2 \u05E4 \u05E6 \u05E7 \u05E8 \u05E9 \u05EA\n    word = word.replace(/[^\\u0391-\\u03A9\\u05D0-\\u05EA]+/g, '')\n\n    return word\n}\n\n\n// @internal\nfunction _fuzzy_match(input:string, candidate:string):number{\n    // Simple fuzzy match algorithm for matching input to a single word candidate\n    // Returns 0 for perfect match, negative number for possible match, or -Infinity for no match\n    // WARN Both input & candidate should be normalized before being passed to this fn\n\n    // Can't match if empty strings\n    if (!input || !candidate){\n        return -Infinity\n    }\n\n    // Keep track of how many chars skipped\n    let skipped = 0\n\n    let input_i = 0\n    for (let cand_i = 0; cand_i < candidate.length; cand_i++){\n\n        // See if chars match\n        if (candidate[cand_i] === input[input_i]){\n            input_i++\n            if (input_i >= input.length){\n                // End of input so report success and subtract points for skips\n                return skipped * -1\n            }\n        } else if (input_i === 0){\n            // First letter must match as very rare to get that wrong\n            return -Infinity\n        } else {\n            // Input not matching so consider next candidate char\n            skipped++\n            if (skipped > 4){\n                // Just fail if skip too many chars\n                return -Infinity\n            }\n        }\n    }\n\n    // Reached end of candidate but still have more input chars, so fail\n    return -Infinity\n}\n\n\n// @internal\nexport function fuzzy_search<T>(input:string, candidates:T[], cand_to_str:(c:T)=>string):T[]{\n    // Return sorted candidates that fuzzy match input\n\n    // If no input, return all candidates as is (without changing sort order)\n    if (!input.trim()){\n        return candidates.slice()\n    }\n\n    // Normalize and break input into words\n    const input_words = rm_diacritics(input).toLowerCase().trim().split(' ')\n\n    // Generate scores for each candidate and filter out those that don't match enough\n    const items = candidates.map(candidate => {\n\n        // Normalize and break candidate str into words\n        // WARN Must normalize the same way input is so can match properly\n        const cand_words = rm_diacritics(cand_to_str(candidate)).toLowerCase().trim().split(' ')\n\n        // Calculate the score by summing for each input word\n        const score = input_words.reduce((prev, item) => {\n            // Select the best possible score for the best matching candidate word\n            return prev + Math.max(...cand_words.map(cand => _fuzzy_match(item, cand)))\n        }, 0)\n        return {candidate, score}\n    }).filter(item => item.score > -4)\n\n    // Order the candidates by relevance\n    items.sort((a, b) => b.score - a.score)\n\n    // Only return the candidates (without score)\n    return items.map(item => item.candidate)\n}\n\n\n// @internal\nexport function escape_html(text:string):string{\n    // Escape the given string for use in HTML\n    const escapes:Record<string, string> = {\n        '&': '&amp;',\n        '<': '&lt;',\n        '>': '&gt;',\n        '\"': '&quot;',\n        \"'\": '&#39;',\n    }\n    return text.replace(/[&<>\"']/g, char => escapes[char]!)\n}\n\n\n// @internal Escape characters that have special meaning in Typst content mode\nexport function escape_typst(text:string):string{\n    // Condense whitespace runs to single space\n    text = text.replace(/\\s+/g, ' ')\n    // eslint-disable-next-line no-useless-escape\n    return text.replace(/[\\\\#\\[\\]$*_`<>@~/+\\-]/g, '\\\\$&')\n}\n\n\n// @internal\nexport function num_to_letters(num:number):string{\n    // Return letters to represent a number (e.g. 1=a 2=b 26=z 27=aa)\n    if (num <= 0){\n        return ''\n    }\n    const ascii_offset = 97\n    return num_to_letters(Math.floor((num-1) / 26))\n        + String.fromCharCode((num-1) % 26 + ascii_offset)\n}\n", "\nimport {PassageReference} from '@gracious.tech/bible-references'\n\nimport {escape_html, escape_typst, num_to_letters} from '../assets/utils.js'\n\nimport type {RuntimeLicense, RuntimeCopyright} from '../assets/types.js'\nimport type {BibleJsonTxt, TxtContent,\n} from '../assets/shared_types.js'\n\n\nexport interface GetMarkupOptions {\n    attribute?:boolean|RuntimeLicense\n}\n\nexport type GetHtmlOptions = GetMarkupOptions\n\nexport type GetTypstOptions = GetMarkupOptions\n\nexport interface GetTxtOptions {\n    attribute?:boolean|RuntimeLicense\n    verse_nums?:boolean\n    headings?:boolean\n    notes?:boolean\n}\n\nexport interface IndividualVerse<T> {\n    id:number\n    chapter:number\n    verse:number\n    content:T\n}\n\n\n// @internal\nfunction validate_ref(start_chapter:number, start_verse:number, end_chapter:number,\n        end_verse:number):void{\n    // NOTE It's ok to give a range that doesn't exist, as long as values are logical\n\n    // General validation\n    for (const arg of [start_chapter, start_verse, end_chapter, end_verse]){\n        // Confusing non-breaking bugs can occur if strings passed (like '1' + 1 = '11')\n        if (typeof arg !== 'number'){\n            throw new Error(\"Chapter/verse arguments must all be numbers\")\n        } else if (arg < 0){\n            throw new Error(\"Chapter/verse arguments cannot be negative\")\n        }\n    }\n\n    // Ensure start is before end\n    if (start_chapter > end_chapter\n            || (start_chapter === end_chapter && start_verse > end_verse)){\n        throw new Error(\"Passage end is less than passage start\")\n    }\n}\n\n\n// @internal\nfunction _get_list<T>(contents:T[][][], start_chapter=1, start_verse=1, end_chapter?:number,\n        end_verse?:number):IndividualVerse<T[]>[][]{\n    // Get list of individual verses with metadata, grouped by chapter\n    // NOTE end_verse can be 0 to signify non-inclusion of the first verse/heading of chapter\n    // TODO Option for splitting at clean paragraph breaks (where new verse starts next para)\n\n    // Default to ending at end of book\n    if (!end_chapter){\n        end_chapter = contents.length\n        end_verse = 0\n    } else if (typeof end_verse !== 'number'){  // WARN May be 0 which is valid\n        end_chapter += 1\n        end_verse = 0\n    }\n\n    // Validate\n    validate_ref(start_chapter, start_verse, end_chapter, end_verse)\n\n    // Util for creating objects from verse data\n    const get_verses_for_ch = (chapter:number, start:number, end?:number) => {\n        const verses = contents[chapter]?.slice(start, end && end + 1) ?? []\n        return verses.map((verse, i) => {\n            const verse_num = start + i\n            return {\n                // Calculate an id for the verse that is reproducible and sortable\n                // e.g. Psalm 119:176 = 119176 (cccvvv)\n                id: chapter * 1000 + verse_num,\n                chapter,\n                verse: verse_num,\n                content: verse,\n            }\n        })\n    }\n\n    // If range is within a single chapter, need to limit how much is taken from it\n    const same_ch_end_verse = start_chapter === end_chapter ? end_verse : undefined\n\n    // Add verses of start chapter\n    const verses = [get_verses_for_ch(start_chapter, start_verse, same_ch_end_verse)]\n\n    // Add inbetween chapters\n    for (let ch = start_chapter + 1; ch < end_chapter; ch++){\n        verses.push(get_verses_for_ch(ch, 1))\n    }\n\n    // Add verses of end chapter\n    if (end_chapter > start_chapter){\n        verses.push(get_verses_for_ch(end_chapter, 1, end_verse))\n    }\n\n    return verses.filter(verses_for_ch => verses_for_ch.length)\n}\n\n\n// @internal\nfunction _ref_to_get_list_args(ref:PassageReference){\n    // PassageReference objects will have exact numbers except for `book` and `chapter`\n    let end_chapter:number|undefined = ref.end_chapter\n    let end_verse:number|undefined = ref.end_verse\n    if (ref.type === 'book'){\n        // `get_list()` defaults to going to end of book when no end given\n        end_chapter = undefined\n        end_verse = undefined\n    } else if (ref.type === 'chapter'){\n        // `get_list()` accepts 0 for end_verse to finish at end of previous chapter\n        end_chapter += 1\n        end_verse = 0\n    }\n    return [ref.start_chapter, ref.start_verse, end_chapter, end_verse]\n}\n\n\n// @internal\n// Shared base for markup formats (HTML, Typst) whose verses are [before, body, after] fragments\nabstract class BibleBookMarkup {\n\n    // @internal\n    _copyright:RuntimeCopyright|undefined\n    // @internal\n    _content:{contents:string[][][]}\n\n    // @internal\n    constructor(json:string, copyright?:RuntimeCopyright){\n        this._copyright = copyright\n        this._content = JSON.parse(json) as {contents:string[][][]}\n    }\n\n    // Get appropriate text for attribution (format depends on the subclass)\n    abstract get_attribution(license?:RuntimeLicense):string\n\n    // @internal\n    // Wrap a chapter's markup (subclasses may add a format-specific wrapper; default is none)\n    _wrap_chapter(chapter:number, inner:string):string{\n        return inner\n    }\n\n    // @internal\n    _attribution(license:RuntimeLicense|boolean|undefined):string{\n        // Helper for getting (or not getting) attribution string based on attribute arg\n        // NOTE Defaults to including attribution unless explicitly set to false\n        if (license === false){\n            return ''\n        }\n        return this.get_attribution((!license || license === true) ? undefined : license)\n    }\n\n    // Get the markup for the entire book\n    get_whole({attribute}:GetMarkupOptions={}):string{\n        return this._content.contents.flat().map(v => v[1]).join('') + this._attribution(attribute)\n    }\n\n    // Get markup for a specific passage\n    get_passage(start_chapter:number, start_verse:number, end_chapter:number, end_verse:number,\n            options:GetMarkupOptions={}):string{\n        const chapters =\n            _get_list(this._content.contents, start_chapter, start_verse, end_chapter, end_verse)\n        if (!chapters.length){\n            return ''\n        }\n\n        // Wrap each chapter in a div so users can style entire chapters at a time\n        // NOTE Not possible for verses since they flow across paragraphs\n        let out = ''\n        for (const verses_for_ch of chapters){\n            const inner = verses_for_ch[0]!.content[0]!\n                + verses_for_ch.map(v => v.content[1]).join('')\n                + verses_for_ch[verses_for_ch.length-1]!.content[2]!\n            out += this._wrap_chapter(verses_for_ch[0]!.chapter, inner)\n        }\n        return out + this._attribution(options.attribute)\n    }\n\n    // Get markup for a specific passage specified by a PassageReference object\n    get_passage_from_ref(ref:PassageReference, options:GetMarkupOptions={}):string{\n        if (ref.type === 'book'){\n            return this.get_whole(options)\n        }\n        if (ref.type === 'chapter' || ref.type === 'range_chapters'){\n            return this.get_chapters(ref.start_chapter, ref.end_chapter, options)\n        }\n        return this.get_passage(ref.start_chapter, ref.start_verse, ref.end_chapter, ref.end_verse,\n            options)\n    }\n\n    // Get markup for multiple chapters\n    get_chapters(first:number, last:number, options:GetMarkupOptions={}):string{\n        if (typeof first !== 'number' || typeof last !== 'number'){\n            throw new Error(\"First/last chapters must be numbers\")  // Protect against '1' + 1 = 11\n        }\n        return this.get_passage(first, 1, last + 1, 0, options)\n    }\n\n    // Get markup for a single chapter\n    get_chapter(chapter:number, options:GetMarkupOptions={}):string{\n        // @ts-ignore possible TS bug\n        return this.get_chapters(chapter, chapter, options)\n    }\n\n    // Get markup for a single verse\n    get_verse(chapter:number, verse:number, options:GetMarkupOptions={}):string{\n        return this.get_passage(chapter, verse, chapter, verse, options)\n    }\n\n    // Get markup as an array of individual verses (each verse will be in its own paragraph)\n    get_list(start_chapter?:number, start_verse?:number, end_chapter?:number, end_verse?:number)\n            :IndividualVerse<string>[]{\n        return _get_list(this._content.contents, start_chapter, start_verse, end_chapter, end_verse)\n            .flat().map(verse => {\n                return {\n                    ...verse,\n                    content: verse.content.join(''),  // Join ends to form valid paragraph\n                }\n            })\n    }\n\n    // Get markup as an array of individual verses by passing a PassageReference object\n    get_list_from_ref(ref:PassageReference):IndividualVerse<string>[]{\n        return this.get_list(..._ref_to_get_list_args(ref))\n    }\n}\n\n\n// Access to the HTML text of a Bible book\nexport class BibleBookHtml extends BibleBookMarkup {\n\n    // Get appropriate text for attribution (defaults to first license, optionally provide one)\n    get_attribution(license?:RuntimeLicense):string{\n        if (!this._copyright){\n            return ''  // Copyright not provided when creating instance (only by manual use)\n        }\n        if (!license){\n            license = this._copyright.licenses[0]!  // Always at least one\n        }\n        const url = this._copyright.attribution_url\n        const owner = escape_html(this._copyright.attribution)\n        const license_name = escape_html(license.name)\n        // NOTE Use <div> so <p> is reserved for actual bible content\n        return `\n            <div class=\"fb-attribution\">\n                <a href=\"${url}\" target=\"_blank\">${owner}</a>\n                (<a href=\"${license.url}\" target=\"_blank\">${license_name}</a>)\n            </div>\n        `\n    }\n\n    // @internal\n    // Wrap each chapter in a div so users can style entire chapters at a time\n    // NOTE Not possible for verses since they flow across paragraphs\n    override _wrap_chapter(chapter:number, inner:string):string{\n        return `<div class=\"fb-chapter\" data-c=\"${chapter}\">${inner}</div>`\n    }\n}\n\n\n// Access to the Typst markup of a Bible book (for compiling to print/PDF)\nexport class BibleBookTypst extends BibleBookMarkup {\n\n    // Get appropriate text for attribution (defaults to first license, optionally provide one)\n    get_attribution(license?:RuntimeLicense):string{\n        if (!this._copyright){\n            return ''  // Copyright not provided when creating instance (only by manual use)\n        }\n        if (!license){\n            license = this._copyright.licenses[0]!  // Always at least one\n        }\n        return escape_typst(`\\n\\n[${license.name} - ${this._copyright.attribution}]\\n`)\n    }\n}\n\n\n// Access to the USX3+ text of a Bible book\nexport class BibleBookUsx {\n\n    // @internal\n    _copyright:RuntimeCopyright|undefined\n    // @internal\n    _usx:string\n\n    // @internal\n    constructor(usx:string, copyright?:RuntimeCopyright){\n        this._copyright = copyright\n        this._usx = usx\n    }\n\n    // Get the USX for the entire book\n    get_whole(){\n        return this._usx\n    }\n}\n\n\n// Access to the USFM text of a Bible book\nexport class BibleBookUsfm {\n\n    // @internal\n    _copyright:RuntimeCopyright|undefined\n    // @internal\n    _usfm:string\n\n    // @internal\n    constructor(usfm:string, copyright?:RuntimeCopyright){\n        this._copyright = copyright\n        this._usfm = usfm\n    }\n\n    // Get the USFM for the entire book\n    get_whole(){\n        return this._usfm\n    }\n}\n\n\n// Convert a plain text array to a Markdown string\nfunction txt_array_to_markdown(contents:TxtContent[], headings=true, notes=true):string{\n\n    // Collect footnotes for later appending\n    const footnotes:string[] = []\n\n    // Convert all elements to strings\n    let result = contents.map(part => {\n        if (typeof part === 'string'){\n            return part\n        } else if (part.type === 'heading' && headings){\n            return '\\n' + '#'.repeat(part.level) + ' ' + part.contents\n        } else if (part.type === 'note' && notes){\n            footnotes.push(part.contents)\n            const note_letter = num_to_letters(footnotes.length)\n            return `[^${note_letter}]`\n        }\n        return ''  // Ignore\n    }).join('')\n\n    // Append footnotes if any\n    if (footnotes.length){\n        result += '\\n\\n\\n\\n'\n        result += footnotes.map((note, i) => `[^${num_to_letters(i+1)}]: ${note}`).join('\\n')\n    }\n\n    return result\n}\n\n\n// Access to the plain text of a Bible book (will be Markdown if headings/notes enabled)\nexport class BibleBookTxt {\n\n    // @internal\n    _copyright:RuntimeCopyright|undefined\n    // @internal\n    _txt:BibleJsonTxt\n\n    // @internal\n    constructor(txt:string, copyright?:RuntimeCopyright){\n        this._copyright = copyright\n        this._txt = JSON.parse(txt) as BibleJsonTxt\n    }\n\n    // Get appropriate text for attribution (defaults to first license, optionally provide one)\n    get_attribution(license?:RuntimeLicense):string{\n        if (!this._copyright){\n            return ''  // Copyright not provided when creating instance (only by manual use)\n        }\n        if (!license){\n            license = this._copyright.licenses[0]!  // Always at least one\n        }\n        return `\\n\\n\\n\\n[${license.name} - ${this._copyright.attribution}]`\n    }\n\n    // @internal\n    _attribution(license:RuntimeLicense|boolean|undefined):string{\n        // Helper for getting (or not getting) attribution string based on attribute arg\n        // NOTE Defaults to including attribution unless explicitly set to false\n        if (license === false){\n            return ''\n        }\n        return this.get_attribution((!license || license === true) ? undefined : license)\n    }\n\n    // Get the contents of entire book\n    get_whole(options:GetTxtOptions={}):string{\n        return this.get_passage(1, 1, this._txt.contents.length, 0, options)\n    }\n\n    // Get txt for a specific passage\n    get_passage(start_chapter:number, start_verse:number, end_chapter:number, end_verse:number,\n        options:GetTxtOptions={}):string{\n        // NOTE end_verse can be 0 to signify non-inclusion of the first verse of chapter\n\n        // Validate\n        validate_ref(start_chapter, start_verse, end_chapter, end_verse)\n\n        // Util for auto-adding verse numbers\n        const get_verses_for_ch = (chapter:number, start:number, end?:number)\n                :TxtContent[][] => {\n\n            // Get the verses\n            const verses = this._txt.contents[chapter]?.slice(start, end && end + 1) ?? []\n            if (!options.verse_nums){\n                return verses\n            }\n\n            // Auto-prefix each verse with a verse ref\n            return verses.map((verse, i) => {\n                let ref = ''\n                const verse_num = start + i\n                // Add chapter num too if first verse of range or of chapter (so 0 start still ok)\n                if (verse_num === 1 || (start > 1 && i === 0)){\n                    ref += `${chapter}:`\n                }\n                ref += verse_num\n                ref = `[${ref}] `\n                return [ref, ...verse]  // Deconstruct verse to avoid modifying original array\n            })\n        }\n\n        // If range is within a single chapter, need to limit how much is taken from it\n        const same_ch_end_verse = start_chapter === end_chapter ? end_verse : undefined\n\n        // Add verses of start chapter\n        const verses = get_verses_for_ch(start_chapter, start_verse, same_ch_end_verse)\n\n        // Add inbetween chapters\n        for (let ch = start_chapter + 1; ch < end_chapter; ch++){\n            verses.push(...get_verses_for_ch(ch, 1))\n        }\n\n        // Add verses of end chapter\n        if (end_chapter > start_chapter){\n            verses.push(...get_verses_for_ch(end_chapter, 1, end_verse))\n        }\n\n        // Merge into single string\n        const result = txt_array_to_markdown(verses.flat(), options.headings, options.notes)\n        return result + this._attribution(options.attribute)\n    }\n\n    // Get txt for a specific passage specified by a PassageReference object\n    get_passage_from_ref(ref:PassageReference, options:GetTxtOptions={}):string{\n        if (ref.type === 'book'){\n            return this.get_whole(options)\n        }\n        if (ref.type === 'chapter' || ref.type === 'range_chapters'){\n            return this.get_chapters(ref.start_chapter, ref.end_chapter, options)\n        }\n        return this.get_passage(ref.start_chapter, ref.start_verse, ref.end_chapter, ref.end_verse,\n            options)\n    }\n\n    // Get txt for multiple chapters\n    get_chapters(first:number, last:number, options:GetTxtOptions={}):string{\n        if (typeof first !== 'number' || typeof last !== 'number'){\n            throw new Error(\"First/last chapters must be numbers\")  // Protect against '1' + 1 = 11\n        }\n        return this.get_passage(first, 1, last + 1, 0, options)\n    }\n\n    // Get txt for a single chapter\n    get_chapter(chapter:number, options:GetTxtOptions={}):string{\n        return this.get_chapters(chapter, chapter, options)\n    }\n\n    // Get txt for a single verse\n    get_verse(chapter:number, verse:number, options:GetTxtOptions={}):string{\n        return this.get_passage(chapter, verse, chapter, verse, options)\n    }\n\n    // Get txt as an array of individual verses\n    get_list(start_chapter?:number, start_verse?:number, end_chapter?:number, end_verse?:number)\n            :IndividualVerse<TxtContent[]>[]{\n        return _get_list(this._txt.contents, start_chapter, start_verse, end_chapter, end_verse)\n            .flat()\n    }\n\n    // Get txt as an array of individual verses by passing a PassageReference object\n    get_list_from_ref(ref:PassageReference):IndividualVerse<TxtContent[]>[]{\n        return this.get_list(..._ref_to_get_list_args(ref))\n    }\n}\n\n\nexport type BibleBook = BibleBookHtml|BibleBookTxt|BibleBookUsfm|BibleBookUsx|BibleBookTypst\n", "\nimport {books_ordered} from '@gracious.tech/bible-references'\n\nimport type {DistTranslationExtra} from '../assets/shared_types'\n\n\n// Access to local book names, sections, and chapter headings for a translation\nexport class TranslationExtra {\n\n    // @internal\n    _extra:DistTranslationExtra\n\n    readonly wj_markup:boolean\n\n    // @internal\n    constructor(extra:DistTranslationExtra){\n        this._extra = extra\n        this.wj_markup = extra.wj_markup\n    }\n\n    // @internal\n    _ensure_book_exists(book:string){\n        // Util that throws if book doesn't exist\n        if (!books_ordered.includes(book)){\n            throw new Error(`Book id \"${book}\" is not valid (should be 3 letters lowercase)`)\n        }\n        if (!(book in this._extra.book_names)){\n            throw new Error(`Translation does not have book \"${book}\"`)\n        }\n    }\n\n    // Get local name data for a book.\n    // This will throw if the book doesn't exist or will contain empty strings if no data available.\n    // You should call `get_books()` on the collection instance for more intuitive access.\n    // It will automatically make use of local name data after fetching it.\n    get_book_name(book:string){\n        this._ensure_book_exists(book)\n        return {\n            ...this._extra.book_names[book]!,\n        }\n    }\n\n    // Get list of chapters for book which also includes a heading property for each\n    get_chapters(book:string){\n        this._ensure_book_exists(book)\n        return this._extra.chapter_headings[book]!.map((heading, number) => ({number, heading}))\n            .slice(1)\n    }\n\n    // Get the heading for a specific chapter\n    get_chapter_heading(book:string, chapter:number){\n        this._ensure_book_exists(book)\n        return this._extra.chapter_headings[book]![chapter]!\n    }\n\n    // Get list of sections for a book which includes a heading for each and verse range\n    get_sections(book:string){\n        this._ensure_book_exists(book)\n        return this._extra.sections[book]!.map(section => {\n\n            // Heading value will be null when starts at first verse of chapter\n            const heading = section.heading\n                ?? this._extra.chapter_headings[book]![section.start_chapter]!\n            return {\n                ...section,\n                heading,\n            }\n        })\n    }\n\n}\n", "// Common methods for resources with multiple options per language\n\nimport {book_names_english, books_ordered, book_abbrev_english,\n} from '@gracious.tech/bible-references'\n\nimport {filter_licenses} from '../assets/licenses.js'\nimport {deep_copy, fuzzy_search} from '../assets/utils.js'\n\nimport type {BookNames, MetaTag, MetaLanguage} from '../assets/shared_types.js'\nimport type {UsageOptions, UsageConfig, RuntimeLicense, RuntimeManifestItem}\n    from '../assets/types.js'\nimport type {RequestHandler} from '../assets/request.js'\n\n\n// No browser types since may be running in Node, so define as possibly existing\ndeclare const self:{navigator: {language:string, languages: string[]}}|undefined\n\n\n// Utils for forcing an interface's `object` property to be true or falsey\ntype ObjT<T> = Omit<T, 'object'> & {object:true}\ntype ObjF<T> = Omit<T, 'object'> & {object?:false}\n\n\n// Types for collection methods\n\nexport interface GetLanguagesOptions {\n    object?:boolean\n    exclude_old?:boolean\n    sort_by?:'local'|'english'|'population'|'population_L1'\n    search?:string\n}\n\nexport interface GetLanguagesItem {\n    code:string\n    name_local:string\n    name_english:string\n    name_bilingual:string\n    population:number|null\n}\n\nexport interface GetResourcesOptions {\n    language?:string\n    object?:boolean\n    sort_by_year?:boolean\n    usage?:UsageOptions\n    // Basic filtering using combination of factors (manually filter for more fine-tuned results)\n    exclude_obsolete?:boolean\n    exclude_incomplete?:boolean\n}\n\nexport interface GetResourcesItem {\n    // NOTE Keeps flat structure for better dev experience\n    id:string\n    language:string\n    direction:'ltr'|'rtl',\n    year:number\n    attribution:string\n    attribution_url:string\n    licenses:RuntimeLicense[]\n    tags:MetaTag[]\n    // Local name of resource (falls back to English)\n    name:string\n    // Local abbreviation of resource (falls back to English)\n    name_abbrev:string\n    // English name of resource (may not exist)\n    name_english:string\n    // English abbreviation of resource (may not exist)\n    name_english_abbrev:string\n    // Local name of resource (may not exist)\n    name_local:string\n    // Local abbreviation of resource (may not exist)\n    name_local_abbrev:string\n    // Local name of resource with the English name in brackets when it differs\n    name_bilingual:string\n    // Local abbreviation of resource with the English abbreviation in brackets when it differs\n    name_bilingual_abbrev:string\n}\n\nexport interface GetBooksOptions {\n    object?:boolean\n    sort_by_name?:boolean\n    testament?:'ot'|'nt'\n    whole?:boolean  // Include even those unavailable\n}\n\nexport interface GetBooksItem {\n    id:string\n    ot:boolean\n    nt:boolean\n    available:boolean\n    // Local name of book (falls back to English)\n    name:string\n    // Local abbreviation of book (falls back to English)\n    name_abbrev:string\n    // English name of book (always exists)\n    name_english:string\n    // English abbreviation of book (always exists)\n    name_english_abbrev:string\n    // Local name of book (may be empty string)\n    name_local:string\n    // Local abbreviation of book (may be empty string)\n    name_local_abbrev:string\n    // Local long name of book (may be empty string)\n    name_local_long:string\n    // Local name of book with the English name in brackets when it differs\n    name_bilingual:string\n    // Local abbreviation of book with the English abbreviation in brackets when it differs\n    name_bilingual_abbrev:string\n}\n\nexport interface GetCompletionReturn {\n    ot:{\n        available:string[]\n        missing:string[]\n    }\n    nt:{\n        available:string[]\n        missing:string[]\n    }\n}\n\n\nexport class GenericCollection {\n\n    // @internal\n    _items:Record<string, RuntimeManifestItem>\n    // @internal\n    _languages:Record<string, MetaLanguage>\n    // @internal\n    _language2to3:Record<string, string>\n    // @internal\n    _languages_most_spoken:string[]\n    // @internal\n    _usage:UsageConfig\n    // @internal\n    _modern_year = new Date().getFullYear() - 70\n    // @internal Must be set by subclass\n    _local_book_names:Record<string, Record<string, BookNames>> = {}\n\n    requester:RequestHandler\n\n    constructor(items:Record<string, RuntimeManifestItem>, requester:RequestHandler,\n            languages:Record<string, MetaLanguage>,\n            language2to3:Record<string, string>, languages_most_spoken:string[], usage:UsageConfig){\n\n        this.requester = requester\n        this._items = items\n        this._usage = usage\n\n        // Only include languages that have a resource\n        const included_langs = new Set(Object.keys(items).map(id => id.slice(0, 3)))\n        this._languages = Object.fromEntries(\n            Object.entries(languages).filter(([k, v]) => included_langs.has(k)))\n\n        // More language data that is useful but doesn't need filtering\n        this._language2to3 = language2to3\n        this._languages_most_spoken = languages_most_spoken\n    }\n\n    // @internal\n    _ensure_resource_exists(resource:string){\n        // Util that throws if resource doesn't exist\n        if (! this.has_resource(resource)){\n            throw new Error(`Resource with id \"${resource}\" does not exist in collection`)\n        }\n    }\n\n    // @internal\n    _ensure_book_exists(resource:string, book:string){\n        // Util that throws if book doesn't exist\n        this._ensure_resource_exists(resource)\n        if (!books_ordered.includes(book)){\n            throw new Error(`Book id \"${book}\" is not valid (should be 3 letters lowercase)`)\n        }\n        if (! this.has_book(resource, book)){\n            throw new Error(`Resource \"${resource}\" does not have book \"${book}\"`)\n        }\n    }\n\n    // Check if a language exists (must be 3 character id)\n    has_language(language:string):boolean{\n        return language in this._languages\n    }\n\n    // Check if a resource exists\n    has_resource(resource:string):boolean{\n        return resource in this._items\n    }\n\n    // Check if a book exists within a resource\n    has_book(resource:string, book:string):boolean{\n        this._ensure_resource_exists(resource)\n        const resource_meta = this._items[resource]!\n        return resource_meta.books_ot_list.includes(book)\n            || resource_meta.books_nt_list.includes(book)\n    }\n\n    // Get a language's metadata\n    get_language(code:string):GetLanguagesItem|undefined{\n        const data = this._languages[code]\n        if (!data){\n            return undefined\n        }\n        return {\n            code,\n            name_local: data.local,\n            name_english: data.english,\n            name_bilingual:\n                data.english === data.local ? data.local : `${data.local} (${data.english})`,\n            population: data.pop,\n        }\n    }\n\n    // Get available languages as either a list or an object\n    get_languages(options:ObjT<GetLanguagesOptions>):Record<string, GetLanguagesItem>\n    get_languages(options?:ObjF<GetLanguagesOptions>):GetLanguagesItem[]\n    get_languages({object, exclude_old, sort_by, search}:GetLanguagesOptions={}):\n            GetLanguagesItem[]|Record<string, GetLanguagesItem>{\n\n        // Start with list and dereference internal objects so manifest can't be modified\n        let list = Object.keys(this._languages).map(code => this.get_language(code)!)\n\n        // Optionally exclude non-living languages\n        if (exclude_old){\n            list = list.filter(item => item.population !== null)\n        }\n\n        // Optionally apply search\n        if (search !== undefined){\n            list = fuzzy_search(search, list, c => c.name_local + ' ' + c.name_english)\n        }\n\n        // Return object if desired\n        if (object){\n            return Object.fromEntries(list.map(item => [item.code, item]))\n        }\n\n        // Sort list and return it\n        if (!search){\n            if (sort_by === 'population_L1'){\n                list.sort((a, b) => {\n                    return (b.population ?? -1) - (a.population ?? -1)\n                })\n            } else if (sort_by === 'population'){\n                // Sorting by total speakers (L1+L2) so need to consult extra array\n                const item_to_pop = (item:typeof list[number]) => {\n                    const most_spoken_i = this._languages_most_spoken.indexOf(item.code)\n                    if (most_spoken_i !== -1){\n                        // First in most spoken list needs largest number\n                        // They all need to exceed 1 billion too, to override standard pop data\n                        const list_len = this._languages_most_spoken.length\n                        return (list_len - most_spoken_i) * 9999999999  // 10 billion - 1\n                    }\n                    return item.population ?? -1  // Fallback on L1-only pop data\n                }\n                list.sort((a, b) => {\n                    return item_to_pop(b) - item_to_pop(a)\n                })\n            } else {\n                list.sort((a, b) => {\n                    // Defaults to sorting by local name\n                    const name_key = sort_by === 'english' ? 'name_english' : 'name_local'\n                    return a[name_key].localeCompare(b[name_key])\n                })\n            }\n        }\n        return list\n    }\n\n    // Get the user's preferred available language (no arg required when used in browser)\n    get_preferred_language(preferences:string[]=[]):GetLanguagesItem{\n        return this.get_language(this._get_preferred_language_code(preferences))!\n    }\n\n    // @internal Get preferred language code\n    _get_preferred_language_code(preferences:string[]=[]):string{\n\n        // Default to navigator property when in browser\n        if (preferences.length === 0 && typeof self !== 'undefined'){\n            preferences = [...(self.navigator.languages ?? [self.navigator.language ?? 'eng'])]\n        }\n\n        // Loop through user's preferences (first is most preferred)\n        for (let code of preferences){\n\n            // Normalise the code to 2/3 lowercase char\n            code = code.toLowerCase().split('-')[0] ?? ''\n\n            // Convert 2 char codes to 3 chars\n            code = this._language2to3[code] ?? code\n\n            // If resources includes language, use it\n            if (code in this._languages){\n                return code\n            }\n        }\n\n        // Default to English if available, else random language\n        return 'eng' in this._languages ? 'eng' : Object.keys(this._languages)[0]!\n    }\n\n    // Get a resource's metadata\n    get_resource(id:string):GetResourcesItem|undefined{\n        return this._get_resource(id)\n    }\n\n    // @internal Version that takes a `usage` arg which is only useful for `get_resources()`\n    _get_resource(id:string, usage?:UsageOptions):GetResourcesItem|undefined{\n        const resource = this._items[id]\n        if (!resource){\n            return undefined\n        }\n\n        // Work out bilingual names\n        let bilingual = resource.name.local || resource.name.english\n        if (resource.name.local && resource.name.english &&\n                resource.name.local.toLowerCase() !== resource.name.english.toLowerCase()){\n            bilingual = `${resource.name.local} (${resource.name.english})`\n        }\n        let bilingual_abbrev = resource.name.local_abbrev || resource.name.english_abbrev\n        if (resource.name.local_abbrev && resource.name.english_abbrev &&\n                resource.name.local_abbrev !== resource.name.english_abbrev){\n            bilingual_abbrev = `${resource.name.local_abbrev} (${resource.name.english_abbrev})`\n        }\n\n        return {\n            id,\n            language: id.slice(0, 3),\n            direction: resource.direction,\n            year: resource.year,\n\n            name: resource.name.local || resource.name.english,\n            name_abbrev: resource.name.local_abbrev || resource.name.english_abbrev,\n            name_english: resource.name.english,\n            name_english_abbrev: resource.name.english_abbrev,\n            name_local: resource.name.local,\n            name_local_abbrev: resource.name.local_abbrev,\n            name_bilingual: bilingual,\n            name_bilingual_abbrev: bilingual_abbrev,\n\n            attribution: resource.copyright.attribution,\n            attribution_url: resource.copyright.attribution_url,\n            licenses: deep_copy(\n                filter_licenses(resource.copyright.licenses, {...this._usage, ...usage})),\n            tags: [...resource.tags],\n        } as GetResourcesItem\n    }\n\n    // Get available resources as either a list or an object\n    get_resources(options:ObjT<GetResourcesOptions>):Record<string, GetResourcesItem>\n    get_resources(options?:ObjF<GetResourcesOptions>):GetResourcesItem[]\n    get_resources({language, object, sort_by_year, usage, exclude_obsolete, exclude_incomplete}:\n            GetResourcesOptions={}):GetResourcesItem[]|Record<string, GetResourcesItem>{\n\n        // Start with list of resources, extracting properties that don't need extra processing\n        // NOTE Filters out resources not compatible with usage config\n        // WARN Careful to unpack all objects so originals can't be modified\n        let list = Object.keys(this._items).map(id => {\n            return this._get_resource(id, usage)!\n        }).filter(resource => resource.licenses.length)\n\n        // Optionally limit to single language\n        if (language){\n            list = list.filter(item => item.language === language)\n        }\n\n        // Optionally exclude obsolete resources (as long as better alternative exists)\n        // For each test, only apply if 1 resource remains (else try other tests)\n        if (exclude_obsolete){\n\n            // First filter out very old resources\n            const modern = list.filter(item => item.year >= this._modern_year)\n            if (modern.length){\n                list = modern\n            }\n\n            // Then try filter out obsolete-like tags\n            for (const tag of ['archaic', 'questionable', 'niche'] as MetaTag[]){\n                const reduced_list = list.filter(item => !item.tags.includes(tag))\n                if (reduced_list.length){\n                    list = reduced_list\n                }\n            }\n        }\n\n        // Optionally exclude incomplete resources\n        if (exclude_incomplete){\n            list = list.filter(item => {\n                const resource_meta = this._items[item.id]!\n                return resource_meta.books_ot === true && resource_meta.books_nt === true\n            })\n        }\n\n        // Reform as object if desired\n        if (object){\n            return Object.fromEntries(list.map(item => [item.id, item]))\n        }\n\n        // Sort list and return it\n        list.sort((a, b) => {\n            return sort_by_year ? b.year - a.year : a.name_local.localeCompare(b.name_local)\n        })\n        return list\n    }\n\n    // Get user's preferred available resource (provide language preferences if not in browser)\n    get_preferred_resource(languages:string[]=[]):GetResourcesItem{\n        return this.get_resource(this._get_preferred_resource_id(languages))!\n    }\n\n    // @internal Get preferred resource id\n    _get_preferred_resource_id(languages:string[]=[]):string{\n\n        // First get preferred language\n        const language = this._get_preferred_language_code(languages)\n\n        // Return recommended resource, or otherwise the most modern full resource\n        let candidate:string|null = null\n        let candidate_full = false\n        let candidate_year = -9999\n        for (const [id, data] of Object.entries(this._items)){\n\n            // Obviously must be desired language\n            if (id.slice(0, 3) === language){\n\n                // If recommended, don't bother checking any others\n                if (data.tags.includes('recommended')){\n                    return id\n                }\n\n                // Consider as a candidate until something better comes up\n                // NOTE Not considering tags as if any tagged then one would be recommended already\n                const full = data.books_ot === true && data.books_nt === true\n                if (\n                    !candidate  // Something better than nothing\n                    || (!candidate_full && full)  // Full resource better than partial\n                    // Otherwise only consider if more modern\n                    || (full && data.year > candidate_year)\n                ){\n                    candidate = id\n                    candidate_year = data.year\n                    candidate_full = full\n                }\n            }\n        }\n\n        // If no candidate for this language, just return the first resource whatever that is\n        return candidate ?? Object.keys(this._items)[0]!\n    }\n\n    // Get which books are available for a resource.\n    // If no resource is given, all books will be listed but marked as unavailable.\n    // If `fetch_translation_extras()` has already been called for a translation then local name\n    // data will also be available (otherwise only English book names will be available).\n    get_books(resource:string|undefined,\n        options:ObjT<GetBooksOptions>):Record<string, GetBooksItem>\n    get_books(resource?:string, options?:ObjF<GetBooksOptions>):GetBooksItem[]\n    get_books(resource?:string, {object, sort_by_name, testament, whole}:GetBooksOptions={}):\n            GetBooksItem[]|Record<string, GetBooksItem>{\n\n        // Determine what books are available if given a resource (otherwise list all)\n        let available = books_ordered\n        if (resource){\n            this._ensure_resource_exists(resource)\n            const resource_meta = this._items[resource]!\n            available = [...resource_meta.books_ot_list, ...resource_meta.books_nt_list]\n        }\n\n        // Get local book names if available\n        let local:Record<string, BookNames> = {}\n        if (resource && resource in this._local_book_names){\n            local = this._local_book_names[resource]!\n        }\n\n        // Create a list of the available books in traditional order\n        const slice = testament ? (testament === 'ot' ? [0, 39] : [39]) : []\n        const list = books_ordered.slice(...slice)\n            .filter(id => whole || available.includes(id))\n            .map(id => {\n                const ot = books_ordered.indexOf(id) < 39\n\n                // Work out bilingual names\n                const local_name = local[id]?.normal\n                let bilingual = book_names_english[id]!\n                if (local_name && bilingual.toLowerCase() !== local_name.toLowerCase()){\n                    bilingual = `${local_name} (${bilingual})`\n                }\n                const local_abbrev = local[id]?.abbrev\n                let bilingual_abbrev = book_abbrev_english[id]!\n                if (local_abbrev && bilingual_abbrev.toLowerCase() !== local_abbrev.toLowerCase()){\n                    bilingual_abbrev = `${local_abbrev} (${bilingual_abbrev})`\n                }\n\n                return {\n                    id,\n                    name: local_name || book_names_english[id]!,\n                    name_abbrev: local_abbrev || book_abbrev_english[id]!,\n                    name_english: book_names_english[id]!,\n                    name_english_abbrev: book_abbrev_english[id]!,\n                    name_local: local_name ?? '',\n                    name_local_abbrev: local_abbrev ?? '',\n                    name_local_long: local[id]?.long ?? '',\n                    name_bilingual: bilingual,\n                    name_bilingual_abbrev: bilingual_abbrev,\n                    ot,\n                    nt: !ot,\n                    available: !!resource && available.includes(id),\n                }\n            })\n\n        // Return as object if desired\n        if (object){\n            return Object.fromEntries(list.map(item => [item.id, item]))\n        }\n\n        // Optionally sort by name instead of traditional order\n        if (sort_by_name){\n            list.sort((a, b) => a.name_english.localeCompare(b.name_english))\n        }\n\n        return list\n    }\n\n    // Get book ids that are available/missing for a resource for each testament\n    get_completion(resource:string):GetCompletionReturn{\n\n        this._ensure_resource_exists(resource)\n\n        // Form object that will be returned\n        const data:GetCompletionReturn = {\n            nt: {available: [], missing: []},\n            ot: {available: [], missing: []},\n        }\n\n        // Look through books adding to either `available` or `missing`\n        const resource_meta = this._items[resource]!\n        const resource_books = [...resource_meta.books_ot_list, ...resource_meta.books_nt_list]\n        let testament:'ot'|'nt' = 'ot'\n        for (const book of books_ordered){\n            if (book === 'mat'){\n                testament = 'nt'  // Switch testament when reach Matthew (books ordered)\n            }\n            const status = resource_books.includes(book) ? 'available' : 'missing'\n            data[testament][status].push(book)\n        }\n\n        return data\n    }\n\n}\n", "\nimport {book_names_english, PassageReference, detect_references, english_abbrev_include,\n    english_abbrev_exclude, book_abbrev_english} from '@gracious.tech/bible-references'\n\nimport {BibleBook, BibleBookHtml, BibleBookUsx, BibleBookUsfm, BibleBookTxt, BibleBookTypst}\n    from '../book/bible.js'\nimport {TranslationExtra} from './bibles_extra.js'\nimport {GenericCollection} from './generic.js'\n\nimport type {DistTranslationExtra} from '../assets/shared_types'\n\n\nexport class BibleCollection extends GenericCollection {\n\n    // Get the URL for a book's content (useful for caching and manual retrieval)\n    get_book_url(resource:string, book:string, format:'html'|'usx'|'usfm'|'txt'|'typst'='html'){\n        this._ensure_book_exists(resource, book)\n        const endpoint = this._items[resource]!.endpoint\n        const ext = ['html', 'txt', 'typst'].includes(format) ? 'json' : format\n        return `${endpoint}bibles/${resource}/${format}/${book}.${ext}`\n    }\n\n    // Make request for the text for a book of a translation (returns object for accessing it)\n    async fetch_book(resource:string, book:string, format?:'html'):Promise<BibleBookHtml>\n    async fetch_book(resource:string, book:string, format:'usx'):Promise<BibleBookUsx>\n    async fetch_book(resource:string, book:string, format:'usfm'):Promise<BibleBookUsfm>\n    async fetch_book(resource:string, book:string, format:'txt'):Promise<BibleBookTxt>\n    async fetch_book(resource:string, book:string, format:'typst'):Promise<BibleBookTypst>\n    async fetch_book(resource:string, book:string, format:'html'|'usx'|'usfm'|'txt'|'typst'='html'):\n            Promise<BibleBook>{\n\n        // Check args valid\n        this._ensure_book_exists(resource, book)\n\n        // Fetch book in desired format\n        const url = this.get_book_url(resource, book, format)\n        const contents = await this.requester.request(url)\n\n        // Return in appropriate class\n        const format_class = {\n            html: BibleBookHtml,\n            usx: BibleBookUsx,\n            usfm: BibleBookUsfm,\n            txt: BibleBookTxt,\n            typst: BibleBookTypst,\n        }[format]\n        return new format_class(contents, this._items[resource]!.copyright)\n    }\n\n    // Make request for extra metadata for a translation (such as book names and section headings).\n    // This will also auto-provide local book names for future calls of `get_books()`.\n    async fetch_translation_extras(resource:string):Promise<TranslationExtra>{\n\n        // Check args valid\n        this._ensure_resource_exists(resource)\n\n        // Fetch data\n        const endpoint = this._items[resource]!.endpoint\n        const url = `${endpoint}bibles/${resource}/extra.json`\n        const contents = await this.requester.request(url)\n        const data = JSON.parse(contents) as DistTranslationExtra\n\n        // Extract local book names when done (regardless of `remember_fetches` setting)\n        this._local_book_names[resource] = data.book_names\n\n        // Return in class\n        return new TranslationExtra(data)\n    }\n\n    // @internal Auto-prepare args for from_string/detect_references based on translation\n    _from_string_args(resource:string|string[]=[], always_detect_english=true){\n\n        // Get book names and abbreviations for translations (if available)\n        const book_names:[string, string][] = []\n        const resources = typeof resource === 'string' ? [resource] : resource\n        for (const re of resources){\n            for (const [code, name_types] of Object.entries(this._local_book_names[re] ?? {})){\n                if (name_types.normal){\n                    book_names.push([code, name_types.normal])\n                }\n                if (name_types.abbrev){\n                    book_names.push([code, name_types.abbrev])\n                }\n            }\n        }\n\n        // Optionally add English last so is lowest priority\n        if (always_detect_english){\n            for (const [code, name] of Object.entries(book_names_english)){\n                book_names.push([code, name])\n            }\n            for (const [code, name] of english_abbrev_include){\n                book_names.push([code, name])\n            }\n        }\n\n        // Languages with Chinese-like characters\n        const chinese_like = [\n            'zho',  // Chinese macrolanguage group\n            'lzh', 'gan', 'hak', 'czh', 'cjy', 'cmn', 'mnp', 'cdo',  // Part of 'zho' group\n            'nan', 'czo', 'cnp', 'cpx', 'csp', 'wuu', 'hsn', 'yue',  // Part of 'zho' group\n            'jpn',  // Japanese\n            'kor',  // Korean\n        ]\n\n        // Detect language as whatever first translation given has\n        const lang = resources[0]?.split('_')[0] ?? 'eng'\n\n        // Set args based on whether a Chinese script or not\n        const exclude_book_names:string[]|undefined =\n            lang === 'eng' ? [...english_abbrev_exclude] : []\n        const min_chars:number = chinese_like.includes(lang) ? 1 : 2\n        const match_from_start = !chinese_like.includes(lang)\n\n        return [book_names, exclude_book_names, min_chars, match_from_start,\n        ] as [[string, string][], string[], number, boolean]\n    }\n\n    // Detect bible references in a block of text using book names of given translation(s).\n    // A generator is returned and can be passed updated text each time it yields a result.\n    // You must have first awaited a call to `fetch_translation_extras()` to be able to parse\n    //     non-English references.\n    detect_references(text:string, resource:string|string[]=[], always_detect_english=true){\n        return detect_references(text,\n            ...this._from_string_args(resource, always_detect_english))\n    }\n\n    // Parse a single bible reference string into a PassageReference object (validating it).\n    // Supports only single passages (for e.g. Matt 10:6,8 use `detect_references`).\n    // You must have first awaited a call to `fetch_translation_extras()` to be able to parse\n    //     non-English references.\n    string_to_reference(text:string, resource:string|string[]=[], always_detect_english=true){\n        return PassageReference.from_string(text,\n            ...this._from_string_args(resource, always_detect_english))\n    }\n\n    // Render a PassageReference object as a string using the given translation's book names.\n    // You must have first awaited a call to `fetch_translation_extras()` for the translation,\n    // or English will be used by default.\n    reference_to_string(reference:PassageReference, resource?:string, abbreviate?:boolean){\n\n        // Start with English names as `toString()` default will not account for `abbreviate` option\n        const book_names = {... abbreviate ? book_abbrev_english : book_names_english}\n\n        // Overwrite English defaults with translation's names if they are available\n        if (resource){\n            const name_prop = abbreviate ? 'abbrev' : 'normal'\n            for (const [book, props] of Object.entries(this._local_book_names[resource] ?? {})){\n                if (props[name_prop]){\n                    book_names[book] = props[name_prop]\n                }\n            }\n        }\n        return reference.toString(book_names)\n    }\n\n}\n", "\nimport {rm_diacritics} from '../assets/utils.js'\n\nimport type {PassageReference} from '@gracious.tech/bible-references'\nimport type {GlossesData} from '../assets/shared_types'\n\n\nexport interface GlossesWord {\n    word:string\n    original:string\n    gloss:string\n}\n\n\nexport class GlossesBook {\n\n    _data:GlossesData\n\n    constructor(json:string){\n        this._data = JSON.parse(json) as GlossesData\n    }\n\n    // Get words with glosses for given verse of book\n    get_words(reference:PassageReference):GlossesWord[]\n    get_words(chapter:number, verse:number):GlossesWord[]\n    get_words(ch_or_ref:number|PassageReference, verse=1):GlossesWord[]{\n\n        // Get chapter/verse from ref if given\n        if (typeof ch_or_ref !== 'number'){\n            verse = ch_or_ref.start_verse\n            ch_or_ref = ch_or_ref.start_chapter\n        }\n        // NOTE Clones objects before returning\n        return (this._data.contents[ch_or_ref]?.[verse] ?? [])\n            .map(([word, gloss]) => ({\n                word,\n                gloss,\n                // NOTE Hebrew is unicase, but harmless...\n                original: strip_unoriginal_chars(word),\n            }))\n    }\n}\n\n\n// Get original word, without any diacritics or punctuation etc.\nfunction strip_unoriginal_chars(word:string){\n\n    // Remove diacritics\n    word = rm_diacritics(word)\n\n    // Make uppercase (for Greek)\n    word = word.toUpperCase()\n\n    // Remove all punctuation and non-orig chars\n    // Greek \\u0391-\\u03A9 = \u0391 \u0392 \u0393 \u0394 \u0395 \u0396 \u0397 \u0398 \u0399 \u039A \u039B \u039C \u039D \u039E \u039F \u03A0 \u03A1 \u03A3 \u03A4 \u03A5 \u03A6 \u03A7 \u03A8 \u03A9\n    // Hebrew \\u05D0-\\u05EA = \u05D0 \u05D1 \u05D2 \u05D3 \u05D4 \u05D5 \u05D6 \u05D7 \u05D8 \u05D9 \u05DB \u05DC \u05DE \u05E0 \u05E1 \u05E2 \u05E4 \u05E6 \u05E7 \u05E8 \u05E9 \u05EA\n    word = word.replace(/[^\\u0391-\\u03A9\\u05D0-\\u05EA]+/g, '')\n\n    return word\n}\n", "\nimport {GenericCollection} from './generic.js'\nimport {GlossesBook} from '../book/glosses.js'\n\n\nexport class GlossesCollection extends GenericCollection {\n\n    // Get the URL for a book's glosses (useful for caching and manual retrieval)\n    get_book_url(resource:string, book:string){\n        this._ensure_book_exists(resource, book)\n        const endpoint = this._items[resource]!.endpoint\n        return `${endpoint}glosses/${resource}/json/${book}.json`\n    }\n\n    // Fetch glosses for book\n    async fetch_glosses(resource:string, book:string):Promise<GlossesBook>{\n        const url = this.get_book_url(resource, book)\n        const json = await this.requester.request(url)\n        return new GlossesBook(json)\n    }\n}\n", "\nimport {PassageReference} from '@gracious.tech/bible-references'\n\nimport type {NotesData} from '../assets/shared_types'\n\n\nexport interface RelevantNotes {\n    reference:PassageReference\n    contents:string\n}\n\n\nexport class NotesBook {\n\n    _data:NotesData\n\n    constructor(json:string){\n        this._data = JSON.parse(json) as NotesData\n    }\n\n    // Get notes for single verse (empty string if none)\n    get_verse_notes(chapter:number, verse:number):string{\n        return this._data.verses[chapter]?.[verse] ?? ''\n    }\n\n    // Get all notes that include given verse (whether specific or as part of a range)\n    get_relevant_notes(chapter:number, verse:number):RelevantNotes[]{\n        const relevant:RelevantNotes[] = []\n\n        // Add exact verse note if present\n        const verse_note = this._data.verses[chapter]?.[verse]\n        if (verse_note){\n            relevant.push({\n                reference: new PassageReference(this._data.book, chapter, verse),\n                contents: verse_note,\n            })\n        }\n\n        // Also add any ranges that include the verse\n        for (const range of this._data.ranges){\n            const reference = new PassageReference({book: this._data.book, ...range})\n            if (reference.includes(chapter, verse)){\n                relevant.push({\n                    reference,\n                    contents: range.contents,\n                })\n            }\n        }\n\n        // Sort by range size\n        relevant.sort((a, b) => a.reference.total_verses() - b.reference.total_verses())\n\n        return relevant\n    }\n\n    // TODO get_notes_within_range(ref)\n    // TODO get_notes_overlapping_range(ref)\n\n}\n", "\nimport {GenericCollection} from './generic.js'\nimport {NotesBook} from '../book/notes.js'\n\n\nexport class NotesCollection extends GenericCollection {\n\n    // Get the URL for a book's notes (useful for caching and manual retrieval)\n    get_book_url(resource:string, book:string, format:'html'|'txt'='html'){\n        this._ensure_book_exists(resource, book)\n        const endpoint = this._items[resource]!.endpoint\n        return `${endpoint}notes/${resource}/${format}/${book}.json`\n    }\n\n    // Fetch study notes for book\n    async fetch_notes(resource:string, book:string, format:'html'|'txt'='html'):Promise<NotesBook>{\n        const url = this.get_book_url(resource, book, format)\n        const json = await this.requester.request(url)\n        return new NotesBook(json)\n    }\n}\n", "\nimport {books_ordered} from '@gracious.tech/bible-references'\n\nimport {filter_licenses} from '../assets/licenses.js'\nimport {BibleCollection} from './bibles.js'\nimport {GlossesCollection} from './glosses.js'\nimport {NotesCollection} from './notes.js'\n\nimport type {DistManifest, MetaCopyright, MetaStandardLicense, OneOrMore}\n    from '../assets/shared_types.js'\nimport type {UsageConfig, RuntimeManifest, RuntimeLicense} from '../assets/types.js'\nimport type {RequestHandler} from '../assets/request.js'\n\n\n// Access to a collection's meta data, including languages and resources available\nexport class FetchCollection {\n\n    // @internal\n    _usage:UsageConfig\n    // @internal\n    _manifest:RuntimeManifest\n\n    requester:RequestHandler\n    bibles:BibleCollection\n    glosses:GlossesCollection\n    notes:NotesCollection\n\n    // @internal\n    constructor(usage:UsageConfig, requester:RequestHandler,\n            manifests:OneOrMore<[string, DistManifest]>){\n        // Merge the manifests given into a combined collection while remembering endpoints\n        // WARN Original manifests are not dereferenced and assumed to not be used outside here\n\n        this._usage = usage\n        this.requester = requester\n\n        // Start with an empty manifest with common metadata extracted from first manifest\n        this._manifest = {\n            bibles: {},\n            glosses: {},\n            notes: {},\n            languages: {},\n            language2to3: {},\n            // The following are the same in all manifests\n            languages_most_spoken: manifests[0][1].languages_most_spoken,  // Not filtered like ^\n            licenses: manifests[0][1].licenses,\n        }\n\n        // Process manifests in reverse such that the first will have priority\n        const manifests_reversed = [...manifests].reverse()  // reverse() modifies original\n        for (const [endpoint, manifest] of manifests_reversed){\n\n            // Combine language data\n            Object.assign(this._manifest.languages, manifest.languages)\n            Object.assign(this._manifest.language2to3, manifest.language2to3)\n\n            // Loop through endpoint's resources\n            const resource_types = ['bibles', 'glosses', 'notes'] as const\n            for (const type of resource_types){\n                for (const [resource, resource_data] of Object.entries(manifest[type])){\n\n                    // Get data for licenses compatible with _usage\n                    const licenses = resolve_license_data(manifest.licenses, this._usage,\n                        resource_data.copyright)\n                    if (!licenses.length){\n                        continue  // No compatible licenses so exclude resource\n                    }\n\n                    // Add the resource to the combined collection\n                    this._manifest[type][resource] = {\n                        ...resource_data,\n                        ...resolve_books(resource_data.books_ot, resource_data.books_nt),\n                        copyright: {\n                            ...resource_data.copyright,\n                            licenses,\n                        },\n                        endpoint,\n                    }\n                }\n            }\n        }\n\n        // Init resource subcollections\n        this.bibles = new BibleCollection(\n            this._manifest.bibles,\n            this.requester,\n            this._manifest.languages,\n            this._manifest.language2to3,\n            this._manifest.languages_most_spoken,\n            this._usage,\n        )\n        this.glosses = new GlossesCollection(\n            this._manifest.glosses,\n            this.requester,\n            this._manifest.languages,\n            this._manifest.language2to3,\n            this._manifest.languages_most_spoken,\n            this._usage,\n        )\n        this.notes = new NotesCollection(\n            this._manifest.notes,\n            this.requester,\n            this._manifest.languages,\n            this._manifest.language2to3,\n            this._manifest.languages_most_spoken,\n            this._usage,\n        )\n    }\n}\n\n\n// Resolve books data to list of books\nfunction resolve_books(ot:true|string[], nt:true|string[]){\n    // Work out exactly what books are included (interpret `true` for whole testament)\n    return {\n        books_ot_list: ot === true ? books_ordered.slice(0, 39) : ot,\n        books_nt_list: nt === true ? books_ordered.slice(39) : nt,\n    }\n}\n\n\n// Resolve raw license data to usable form\nfunction resolve_license_data(standard_licenses:Record<string, MetaStandardLicense>,\n        usage:UsageConfig, copyright:MetaCopyright){\n    const licenses:RuntimeLicense[] = copyright.licenses.map(item => {\n        if (typeof item.license === 'string'){\n            return {\n                id: item.license,\n                name: standard_licenses[item.license]!.name,\n                restrictions: standard_licenses[item.license]!.restrictions,\n                url: item.url,\n            }\n        } else {\n            return {\n                id: null,\n                name: \"Custom license\",\n                restrictions: item.license,\n                url: item.url,\n            }\n        }\n    })\n\n    // Remove licenses not compatible with the given usage restrictions\n    return filter_licenses(licenses, usage)\n}\n", "\nimport {PassageReference} from '@gracious.tech/bible-references'\n\nimport type {CrossrefData} from '../assets/shared_types'\n\n\n// Access to cross-reference data for a book\nexport class BookCrossref {\n\n    _data:CrossrefData\n\n    constructor(data:CrossrefData){\n        this._data = data\n    }\n\n    // Get cross-references for given verse of book\n    get_refs(reference:PassageReference):PassageReference[]\n    get_refs(chapter:number, verse:number):PassageReference[]\n    get_refs(ch_or_ref:number|PassageReference, verse=1):PassageReference[]{\n\n        // Get chapter/verse from ref if given\n        if (typeof ch_or_ref !== 'number'){\n            verse = ch_or_ref.start_verse\n            ch_or_ref = ch_or_ref.start_chapter\n        }\n        return this._data[ch_or_ref]?.[verse]?.map(crossref => {\n            return new PassageReference({\n                book: crossref[0],\n                start_chapter: crossref[1],\n                start_verse: crossref[2],\n                end_chapter: crossref[3],\n                end_verse: crossref[4],\n            })\n        }) ?? []\n    }\n}\n", "\nimport {PassageReference} from '@gracious.tech/bible-references'\n\nimport type {SearchData} from '../assets/shared_types'\n\n\nexport interface SearchWordsResults {\n    verse:PassageReference\n    word_indexes:number[]\n}\n\n\n// A generic class for searching any kind of representation of words over multiple books\n// This can be used for a single book, a testament, or the whole Bible\n// This can be used to search for strongs, lemmas, or original words\n// WARN Searching both testaments will be wasteful unless both are using same language/codes\nexport class SearchWords {\n\n    _books:Record<string, string[][][]>\n\n    readonly id:string\n    readonly source:string\n    readonly source_url:string\n\n    constructor(json:string){\n        const data = JSON.parse(json) as SearchData\n        this.id = data.id\n        this.source = data.source\n        this.source_url = data.url\n\n        // Verses are encoded as comma-separated string, so separate words\n        this._books = Object.fromEntries(Object.entries(data.books).map(([book, chapters]) => {\n            return [book, chapters.map(c => c.map(v => v ? v.split(',') : []))]\n        }))\n    }\n\n    // Get words for given verse reference (the values that represent the words that is)\n    get_words_for_ref(ref:PassageReference):string[]{\n        const words = this._books[ref.book]?.[ref.start_chapter]?.[ref.start_verse] ?? []\n        return [...words]  // Prevent accidental modification\n    }\n\n    // Search for given values (i.e. strongs codes or lemmas)\n    search(...values:string[]):SearchWordsResults[]{\n        const results:SearchWordsResults[] = []\n\n        // Make values to search for a set for slight performance boost\n        const find = new Set(values)\n\n        // Loop through books/chapters/verses\n        for (const book in this._books){\n            for (let chapter = 1; chapter < this._books[book]!.length; chapter++){\n                for (let verse = 1; verse < this._books[book]![chapter]!.length; verse++){\n\n                    // Collect indexes of matching words (to any value searching for)\n                    const matched_indexes = []\n\n                    // Add index of matching words\n                    const words = this._books[book]![chapter]![verse]!\n                    for (let word_i = 0; word_i < words.length; word_i++){\n                        if (find.has(words[word_i]!)){\n                            matched_indexes.push(word_i)\n                        }\n                    }\n\n                    // Add to results if a word matched\n                    if (matched_indexes.length){\n                        results.push({\n                            verse: new PassageReference(book, chapter, verse),\n                            word_indexes: matched_indexes,\n                        })\n                    }\n                }\n            }\n        }\n\n        // Sort results by frequency\n        results.sort((a, b) => {\n            return b.word_indexes.length - a.word_indexes.length\n        })\n\n        return results\n    }\n}\n", "\n\n// Request handler that has internal cache\nexport class RequestHandler {\n\n    readonly _remember:boolean  // Whether to save results of responses\n    _respond_from_cache = true  // Whether to serve cached responses (still saving them regardless)\n    _cache:Record<string, Promise<string>> = {}\n\n    constructor(remember:boolean){\n        this._remember = remember\n    }\n\n    // Request (text response)\n    request(url:string):Promise<string>{\n\n        // Return cached promise if available and caching enabled\n        if (url in this._cache && this._respond_from_cache){\n            return this._cache[url]!\n        }\n\n        // Send request\n        const promise = fetch(url, {mode: 'cors'}).catch(() => {\n            // Rethrow network errors as own type for clarity\n            throw new FetchNetworkError(url)\n        }).then(resp => {\n            if (resp.ok){\n                return resp.text()\n            }\n            throw new Error(`${resp.status} ${resp.statusText}: ${url}`)\n        })\n\n        // Cache request promise if desired\n        // NOTE Caching promise so that concurrent requests for same url result in one network call\n        if (this._remember){\n            this._cache[url] = promise\n            // Clear if unsuccessful so can retry if desired\n            promise.catch(() => {\n                delete this._cache[url]\n            })\n        }\n\n        // Return original request promise\n        return promise\n    }\n\n    // Clear cache\n    clear_cache(){\n        this._cache = {}\n    }\n\n    // Disable responding from cache to force fresh requests (which are still remembered)\n    disable_responding_from_cache(){\n        this._respond_from_cache = false\n    }\n\n    // Re-enable returning responses from cache\n    enable_responding_from_cache(){\n        this._respond_from_cache = true\n    }\n}\n\n\n// Custom error for network failure so can be easily caught separate to all other errors\nexport class FetchNetworkError extends Error {\n    constructor(message?:string){\n        super(message)\n        this.name = new.target.name\n    }\n}\n", "\nimport {FetchCollection} from './collection/collection.js'\nimport {BookCrossref} from './book/crossref.js'\nimport {GlossesBook} from './book/glosses.js'\nimport {NotesBook} from './book/notes.js'\nimport {TranslationExtra} from './collection/bibles_extra.js'\nimport {SearchWords} from './other/search.js'\nimport {BibleBook, BibleBookHtml, BibleBookTxt, BibleBookUsfm, BibleBookUsx} from './book/bible.js'\nimport {RequestHandler} from './assets/request.js'\n\nimport type {UsageOptions, UsageConfig} from './assets/types'\nimport type {CrossrefData, DistManifest, DistTranslationExtra, OneOrMore}\n    from './assets/shared_types'\n\n\n// The options available for configuring a FetchClient\nexport interface FetchClientConfig {\n\n    /* A list of CDN endpoints to connect to that defaults to the official CDN\n        (https://v1.fetch.bible/).\n    You can optionally host your own fetch(bible) collection and use that instead, or you could\n    use it in addition to the official CDN by listing it first.\n    The values can be relative URLs but all must end in a slash.\n    */\n    endpoints?:string[]\n\n    /* The endpoint desired for generic data like crossrefs, defaulting to the first endpoint. */\n    data_endpoint?:string\n\n    /* Configure how you'll be using resources to automatically filter out those\n        which have incompatible licenses. You can alternatively do this per resource when\n        fetching actual data.\n\n        All options default to `false` which results in having access to the most resources,\n        except for `limitless` which defaults to `true` to ensure full use is allowed.\n\n         * `commercial`: `true` if you will use resources in a commercial manner\n         * `attributionless`: `true` if you will be using resources without including\n                attribution to the owners\n         * `limitless`: `true` if you will be using resources in full without any limitations\n                to the number of verses that can be quoted\n         * `derivatives`: `true` if you'll be modifying the resources, or `same-license` if\n                you'll be sharing modifications under the same license as the original\n     */\n    usage?:UsageOptions\n\n    /* Whether to preserve in memory the results of `fetch_*` methods (default true).\n\n    This client will auto-preserve the results of `fetch_*` methods to avoid duplicate network\n    requests. It preserves them in memory so that caching works even if service workers or other\n    browser features are unimplemented or unavailable (such as in some iframes).\n\n    This is convenient for most users but may result in a large use of memory if a\n    significant amount of resources are requested. In such cases it is best to rely on service\n    worker caching, or self-preserving frequently used results of requests. Though it's unlikely\n    to be an issue as a whole bible is only around 14MB of memory (2MB compressed, 7MB disk space)\n\n    It is best practice to use service worker caching for browsers either way, as this will not\n    only speed up runtime execution but also revisits to your app.\n    */\n    remember_fetches?:boolean\n}\n\n\n// A client for interacting with a fetch(bible) CDN\nexport class FetchClient {\n\n    // @internal\n    _endpoints:string[]\n    // @internal\n    _data_endpoint:string\n    // @internal\n    _usage:UsageConfig = {\n        commercial: false,\n        attributionless: false,\n        derivatives: false,\n        limitless: true,  // Defaults to true since most apps will display entire bibles\n    }\n\n    // Synchronous access to collection if it has already been fetched with `fetch_collection()`\n    collection:FetchCollection|undefined\n    // Access to request handler and its caching methods\n    requester:RequestHandler\n\n    // Create a new FetchClient, defaulting to the official fetch(bible) collection\n    constructor(config:FetchClientConfig={}){\n        this._endpoints = config.endpoints ?? ['https://v1.fetch.bible/']\n        this._data_endpoint = config.data_endpoint ?? this._endpoints[0]!\n        this._usage = {...this._usage, ...config.usage}\n        this.requester = new RequestHandler(config.remember_fetches !== false)\n    }\n\n    // Fetch the collection's manifest and return a FetchCollection object for interacting with it\n    async fetch_collection():Promise<FetchCollection>{\n\n        // Request all manifests and combine into a single FetchCollection instance\n        return Promise.all(this._endpoints.map(async endpoint => {\n            const manifest_str = await this.requester.request(endpoint + 'manifest.json')\n            return [\n                endpoint,\n                JSON.parse(manifest_str) as DistManifest,\n            ]\n        })).then(manifests => {\n            // Store instance in `this.collection` for synchronous access\n            this.collection = new FetchCollection(this._usage, this.requester,\n                manifests as OneOrMore<[string, DistManifest]>)\n            return this.collection\n        })\n    }\n\n    // Manually fetch contents of book for a translation without needing to request FetchCollection\n    async fetch_book(resource:string, book:string, format?:'html'):Promise<BibleBookHtml>\n    async fetch_book(resource:string, book:string, format:'usx'):Promise<BibleBookUsx>\n    async fetch_book(resource:string, book:string, format:'usfm'):Promise<BibleBookUsfm>\n    async fetch_book(resource:string, book:string, format:'txt'):Promise<BibleBookTxt>\n    async fetch_book(resource:string, book:string, format:'html'|'usx'|'usfm'|'txt'='html'):\n            Promise<BibleBook>{\n        const ext = ['html', 'txt'].includes(format) ? 'json' : format\n        const url = `${this._data_endpoint}bibles/${resource}/${format}/${book}.${ext}`\n        return this.requester.request(url).then(contents => {\n            const format_class = {\n                html: BibleBookHtml,\n                usx: BibleBookUsx,\n                usfm: BibleBookUsfm,\n                txt: BibleBookTxt,\n            }[format]\n            return new format_class(contents)\n        })\n    }\n\n    // Manually fetch extra metadata for a translation without needing to request FetchCollection\n    async fetch_translation_extras(resource:string):Promise<TranslationExtra>{\n        const url = `${this._data_endpoint}bibles/${resource}/extra.json`\n        return this.requester.request(url).then(contents => {\n            const data = JSON.parse(contents) as DistTranslationExtra\n            return new TranslationExtra(data)\n        })\n    }\n\n    // Manually fetch glosses for book without needing to request FetchCollection\n    async fetch_glosses(resource:string, book:string):Promise<GlossesBook>{\n        const url = this._data_endpoint + `glosses/${resource}/json/${book}.json`\n        const json = await this.requester.request(url)\n        return new GlossesBook(json)\n    }\n\n    // Manually fetch study notes for book without needing to request FetchCollection\n    async fetch_notes(resource:string, book:string, format:'html'|'txt'='html'):Promise<NotesBook>{\n        const url = this._data_endpoint + `notes/${resource}/${format}/${book}.json`\n        const json = await this.requester.request(url)\n        return new NotesBook(json)\n    }\n\n    // Fetch cross-reference data for a book\n    async fetch_crossref(book:string, size:'small'|'medium'|'large'='medium'):Promise<BookCrossref>{\n        const url = this._data_endpoint + `crossref/${size}/${book}.json`\n        return this.requester.request(url).then(data => {\n            return new BookCrossref(JSON.parse(data) as CrossrefData)\n        })\n    }\n\n    // Fetch search data for a testament\n    async fetch_search(id:string, format:'strongs'|'original'):Promise<SearchWords>{\n        const url = this._data_endpoint + `search/${id}/${format}.json`\n        return this.requester.request(url).then(data => {\n            return new SearchWords(data)\n        })\n    }\n}\n", "// Utilities for working with HTML\n\nimport type {PassageReference} from '@gracious.tech/bible-references'\n\n\n// Wrap all parts of verses in spans with ids so they can be styled and interacted with\nexport function wrap_verse_parts(root:HTMLElement):void{\n\n    // Keep track of which verse contents belongs to\n    let current_verse_id = ''\n\n    // Process each paragraph\n    root.querySelectorAll('p').forEach(p => {\n\n        // Reference for current wrapper <span>\n        let wrapper:HTMLSpanElement|null = null\n\n        // Process each direct child of paragraph\n        Array.from(p.childNodes).forEach(child => {\n\n            // If encounter a verse marker, update id and end the wrapper span (if any)\n            if (child.nodeType === child.ELEMENT_NODE && child.nodeName === 'SUP'\n                    && (child as Element).hasAttribute('data-v')){\n                current_verse_id = (child as Element).getAttribute('data-v')!\n                wrapper = null\n                return\n            }\n\n            // Add children to the wrapper span\n            if (current_verse_id){  // Just in case any text before first verse marker\n\n                // If just started a new verse, will need a new wrapper span\n                if (!wrapper){\n                    wrapper = root.ownerDocument.createElement('span')\n                    wrapper.setAttribute('data-v', current_verse_id)\n                    p.insertBefore(wrapper, child)\n                }\n\n                // Add the child to the current wrapper\n                wrapper.appendChild(child)\n            }\n        })\n    })\n}\n\n\n// Add class to range of verses\n// NOTE This doesn't verify the book, it assumes container's verses belong to passage's book\nexport function add_passage_class(container:HTMLElement, passage:PassageReference, clas:string){\n    let begun = false\n    for (const span of container.querySelectorAll<HTMLSpanElement>('span[data-v]')){\n        const data_v_ints = span.dataset['v']!.split(':').map(part => parseInt(part))\n        if (passage.includes(data_v_ints[0]!, data_v_ints[1]!)){\n            span.classList.add(clas)\n            begun = true\n        } else if (begun){\n            break  // Have reached passage end\n        }\n    }\n}\n\n\n// Remove class from verses (that was previously added with `add_passage_class`)\nexport function rm_passage_class(container:HTMLElement, clas:string){\n    for (const element of container.querySelectorAll('.' + clas)){\n        element.classList.remove(clas)\n    }\n}\n", "\n// Books that have a substantial amount of poetry (not just a stanza here and there)\n// These are presented better with less indent since it applies to much of the book\nexport const substantial_poetry:readonly string[] = Object.freeze([\n    'job',  // Job\n    'psa',  // Psalms\n    'pro',  // Proverbs\n    'ecc',  // Ecclesiastes\n    'sng',  // Song of Songs\n    'isa',  // Isaiah\n    'jer',  // Jeremiah\n    'lam',  // Lamentations\n    'ezk',  // Ezekiel\n    // 'dan',  Daniel       (some stanzas but still part of the narrative)\n    'hos',  // Hosea\n    'jol',  // Joel\n    'amo',  // Amos\n    'oba',  // Obadiah\n    // 'jon',  Jonah        (just one prayer)\n    'mic',  // Micah\n    'nam',  // Nahum\n    'hab',  // Habakkuk\n    'zep',  // Zephaniah\n    'hag',  // Haggai\n    'zec',  // Zechariah\n    // 'mal',  Malachi      (dialogue, not stanzas)\n])\n"],
  "mappings": "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,yBACT,OAAO,OAAO,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC;;;AC9KrD,IAAM,aAAgD,OAAO,OAAO;EACvE,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;;IAIA;EACJ;EACA,OAAO;IACH;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;EACJ;EACA,OAAO;IACH;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;;IAIA;;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACJ;EACA,OAAO;IACH;IACA;IACA;EACJ;AACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;AC/wCD,IAAM,uBAAuB,CAAC,OAAO,OAAO,OAAO,OAAO,KAAK;AAIxD,SAAS,mBAAmB,KAAW;AAzC9C,MAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA;AA4CI,Q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",
  "names": ["__publicField", "prev", "verses"]
}
