{"version":3,"file":"citeproc_commonjs-63813ea7.cjs","sources":["../../node_modules/citeproc/citeproc_commonjs.js"],"sourcesContent":["/*\nCopyright (c) 2009-2019 Frank Bennett\n\n\tThis program is free software: you can redistribute it and/or\n\tmodify it under EITHER\n\n      * the terms of the Common Public Attribution License (CPAL) as\n\t    published by the Open Source Initiative, either version 1 of\n\t    the CPAL, or (at your option) any later version; OR\n\n      * the terms of the GNU Affero General Public License (AGPL)\n        as published by the Free Software Foundation, either version\n        3 of the AGPL, or (at your option) any later version.\n\n\tThis program is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n\tAffero General Public License for more details.\n\n\tYou should have received copies of the Common Public Attribution\n    License and of the GNU Affero General Public License along with\n    this program.  If not, see <https://opensource.org/licenses/> or\n    <http://www.gnu.org/licenses/> respectively.\n*/\n/*global CSL: true */\n\n/**\n * A Javascript implementation of the CSL citation formatting language.\n *\n * <p>A configured instance of the process is built in two stages,\n * using {@link CSL.Core.Build} and {@link CSL.Core.Configure}.\n * The former sets up hash-accessible locale data and imports the CSL format file\n * to be applied to the citations,\n * transforming it into a one-dimensional token list, and\n * registering functions and parameters on each token as appropriate.\n * The latter sets jump-point information\n * on tokens that constitute potential branch\n * points, in a single back-to-front scan of the token list.\n * This\n * yields a token list that can be executed front-to-back by\n * body methods available on the\n * {@link CSL.Engine} class.</p>\n *\n * <p>This top-level {@link CSL} object itself carries\n * constants that are needed during processing.</p>\n * @namespace A CSL citation formatter.\n */\n\n// IE6 does not implement Array.indexOf().\n// IE7 neither, according to rumour.\n\n\n// Potential skip words:\n// under; along; out; between; among; outside; inside; amid; amidst; against; toward; towards.\n// See https://forums.zotero.org/discussion/30484/?Focus=159613#Comment_159613\n\n'use strict';\n\n\nvar CSL = {\n\n    PROCESSOR_VERSION: \"1.4.61\",\n\n    error: function(str) { // default error function\n        if (\"undefined\" === typeof Error) {\n            throw new Error(\"citeproc-js error: \" + str);\n        } else {\n            throw \"citeproc-js error: \" + str;\n        }\n    },\n    debug: function(str) { // default debug function\n        if (\"undefined\" === typeof console) {\n            dump(\"CSL: \" + str + \"\\n\");\n        } else {\n            console.log(\"citeproc-js warning: \" + str);\n        }\n    },\n\n    toLocaleUpperCase(str) {\n        var arr = this.tmp.lang_array;\n        try {\n            str = str.toLocaleUpperCase(arr);\n        } catch (e) {\n            str = str.toUpperCase();\n        }\n        return str;\n    },\n\n    toLocaleLowerCase(str) {\n        var arr = this.tmp.lang_array;\n        try {\n            str = str.toLocaleLowerCase(arr);\n        } catch (e) {\n            str = str.toLowerCase();\n        }\n        return str;\n    },\n\n    LOCATOR_LABELS_REGEXP: new RegExp(\"^((vrs|sv|subpara|op|subch|add|amend|annot|app|art|bibliog|bk|ch|cl|col|cmt|dec|dept|div|ex|fig|fld|fol|n|hypo|illus|intro|l|no|p|pp|para|pt|pmbl|princ|pub|r|rn|sched|sec|ser|subdiv|subsec|supp|tbl|tit|vol)\\\\.)\\\\s+(.*)\"),\n\n    STATUTE_SUBDIV_PLAIN_REGEX: /(?:(?:^| )(?:vrs|sv|subpara|op|subch|add|amend|annot|app|art|bibliog|bk|ch|cl|col|cmt|dec|dept|div|ex|fig|fld|fol|n|hypo|illus|intro|l|no|p|pp|para|pt|pmbl|princ|pub|r|rn|sched|sec|ser|subdiv|subsec|supp|tbl|tit|vol)\\. *)/,\n    STATUTE_SUBDIV_PLAIN_REGEX_FRONT: /(?:^\\s*[.,;]*\\s*(?:vrs|sv|subpara|op|subch|add|amend|annot|app|art|bibliog|bk|ch|cl|col|cmt|dec|dept|div|ex|fig|fld|fol|n|hypo|illus|intro|l|no|p|pp|para|pt|pmbl|princ|pub|r|rn|sched|sec|ser|subdiv|subsec|supp|tbl|tit|vol)\\. *)/,\n \n    STATUTE_SUBDIV_STRINGS: {\n        \"vrs.\": \"verse\",\n\t\t\"sv.\": \"sub-verbo\",\n        \"subpara.\": \"subparagraph\",\n        \"op.\": \"opus\",\n        \"subch.\": \"subchapter\",\n        \"add.\": \"addendum\",\n        \"amend.\": \"amendment\",\n        \"annot.\": \"annotation\",\n        \"app.\": \"appendix\",\n        \"art.\": \"article\",\n        \"bibliog.\": \"bibliography\",\n        \"bk.\": \"book\",\n        \"ch.\": \"chapter\",\n        \"cl.\": \"clause\",\n        \"col.\": \"column\",\n        \"cmt.\": \"comment\",\n        \"dec.\": \"decision\",\n        \"dept.\": \"department\",\n        \"ex.\": \"example\",\n        \"fig.\": \"figure\",\n        \"fld.\": \"field\",\n        \"fol.\": \"folio\",\n        \"n.\": \"note\",\n        \"hypo.\": \"hypothetical\",\n        \"illus.\": \"illustration\",\n        \"intro.\": \"introduction\",\n        \"l.\": \"line\",\n        \"no.\": \"issue\",\n        \"p.\": \"page\",\n        \"pp.\": \"page\",\n        \"para.\": \"paragraph\",\n        \"pt.\": \"part\",\n        \"pmbl.\": \"preamble\",\n        \"princ.\": \"principle\",\n        \"pub.\": \"publication\",\n        \"r.\": \"rule\",\n        \"rn.\": \"randnummer\",\n        \"sched.\": \"schedule\",\n        \"sec.\": \"section\",\n        \"ser.\": \"series,\",\n        \"subdiv.\": \"subdivision\",\n        \"subsec.\": \"subsection\",\n        \"supp.\": \"supplement\",\n        \"tbl.\": \"table\",\n        \"tit.\": \"title\",\n        \"vol.\": \"volume\"\n    },\n    STATUTE_SUBDIV_STRINGS_REVERSE: {\n        \"verse\": \"vrs.\",\n\t\t\"sub-verbo\": \"sv.\",\n        \"sub verbo\": \"sv.\",\n        \"subparagraph\": \"subpara.\",\n        \"opus\": \"op.\",\n        \"subchapter\": \"subch.\",\n        \"addendum\": \"add.\",\n        \"amendment\": \"amend.\",\n        \"annotation\": \"annot.\",\n        \"appendix\": \"app.\",\n        \"article\": \"art.\",\n        \"bibliography\": \"bibliog.\",\n        \"book\": \"bk.\",\n        \"chapter\": \"ch.\",\n        \"clause\": \"cl.\",\n        \"column\": \"col.\",\n        \"comment\": \"cmt.\",\n        \"decision\": \"dec.\",\n        \"department\": \"dept.\",\n        \"example\": \"ex.\",\n        \"figure\": \"fig.\",\n        \"field\": \"fld.\",\n        \"folio\": \"fol.\",\n        \"note\": \"n.\",\n        \"hypothetical\": \"hypo.\",\n        \"illustration\": \"illus.\",\n        \"introduction\": \"intro.\",\n        \"line\": \"l.\",\n        \"issue\": \"no.\",\n        \"page\": \"p.\",\n        \"paragraph\": \"para.\",\n        \"part\": \"pt.\",\n        \"preamble\": \"pmbl.\",\n        \"principle\": \"princ.\",\n        \"publication\": \"pub.\",\n        \"rule\": \"r.\",\n        \"randnummer\": \"rn.\",\n        \"schedule\": \"sched.\",\n        \"section\": \"sec.\",\n        \"series,\": \"ser.\",\n        \"subdivision\": \"subdiv.\",\n        \"subsection\": \"subsec.\",\n        \"supplement\": \"supp.\",\n        \"table\": \"tbl.\",\n        \"title\": \"tit.\",\n        \"volume\": \"vol.\"\n    },\n\n    LOCATOR_LABELS_MAP: {\n        \"vrs\": \"verse\",\n\t\t\"sv\": \"sub-verbo\",\n        \"subpara\": \"subparagraph\",\n        \"op\": \"opus\",\n        \"subch\": \"subchapter\",\n        \"add\": \"addendum\",\n        \"amend\": \"amendment\",\n        \"annot\": \"annotation\",\n        \"app\": \"appendix\",\n        \"art\": \"article\",\n        \"bibliog\": \"bibliography\",\n        \"bk\": \"book\",\n        \"ch\": \"chapter\",\n        \"cl\": \"clause\",\n        \"col\": \"column\",\n        \"cmt\": \"comment\",\n        \"dec\": \"decision\",\n        \"dept\": \"department\",\n        \"ex\": \"example\",\n        \"fig\": \"figure\",\n        \"fld\": \"field\",\n        \"fol\": \"folio\",\n        \"n\": \"note\",\n        \"hypo\": \"hypothetical\",\n        \"illus\": \"illustration\",\n        \"intro\": \"introduction\",\n        \"l\": \"line\",\n        \"no\": \"issue\",\n        \"p\": \"page\",\n        \"pp\": \"page\",\n        \"para\": \"paragraph\",\n        \"pt\": \"part\",\n        \"pmbl\": \"preamble\",\n        \"princ\": \"principle\",\n        \"pub\": \"publication\",\n        \"r\": \"rule\",\n        \"rn\": \"randnummer\",\n        \"sched\": \"schedule\",\n        \"sec\": \"section\",\n        \"ser\": \"series,\",\n        \"subdiv\": \"subdivision\",\n        \"subsec\": \"subsection\",\n        \"supp\": \"supplement\",\n        \"tbl\": \"table\",\n        \"tit\": \"title\",\n        \"vol\": \"volume\"\n    },\n    MODULE_MACROS: {\n        \"juris-pretitle\": true,\n        \"juris-title\": true,\n        \"juris-pretitle-short\": true,\n        \"juris-title-short\": true,\n        \"juris-main\": true,\n        \"juris-main-short\": true,\n        \"juris-tail\": true,\n        \"juris-tail-short\": true,\n        \"juris-locator\": true\n    },\n    MODULE_TYPES: {\n        \"legal_case\": true,\n        \"legislation\": true,\n        \"bill\": true,\n        \"hearing\": true,\n        \"gazette\": true,\n        \"report\": true,\n        \"regulation\": true,\n        \"standard\": true,\n        \"patent\": true,\n        \"locator\": true\n    },\n    checkNestedBrace: function(state) {\n        if (state.opt.xclass === \"note\") {\n            this.depth = 0;\n            this.update = function(str) {\n                \n                // Receives affix string, returns with flipped parens.\n                \n                var str = str ? str : \"\";\n                var lst = str.split(/([\\(\\)])/);\n                for (var i=1,ilen=lst.length;i<ilen;i += 2) {\n                    if (lst[i] === \"(\") {\n                        if (1 === (this.depth % 2)) {\n                            lst[i] = \"[\";\n                        }\n                        this.depth += 1;\n                    } else if (lst[i] === \")\") {\n                        if (0 === (this.depth % 2)) {\n                            lst[i] = \"]\";\n                        }\n                        this.depth -= 1;\n                    }\n                }\n                var ret = lst.join(\"\");\n                return ret;\n            };\n        } else {\n            this.update = function(str) {\n                return str;\n            };\n        }\n    },\n\n    MULTI_FIELDS: [\"event\", \"publisher\", \"publisher-place\", \"event-place\", \"title\", \"container-title\", \"collection-title\", \"authority\",\"genre\",\"title-short\",\"medium\",\"country\",\"jurisdiction\",\"archive\",\"archive-place\"],\n\n    LangPrefsMap: {\n        \"title\":\"titles\",\n        \"title-short\":\"titles\",\n        \"event\":\"titles\",\n        \"genre\":\"titles\",\n        \"medium\":\"titles\",\n        \"container-title\":\"journals\",\n        \"collection-title\":\"titles\",\n        \"archive\":\"journals\",\n        \"publisher\":\"publishers\",\n        \"authority\":\"publishers\",\n        \"publisher-place\": \"places\",\n        \"event-place\": \"places\",\n        \"archive-place\": \"places\",\n        \"jurisdiction\": \"places\",\n        \"number\": \"places\",\n        \"edition\":\"places\",\n        \"issue\":\"places\",\n        \"volume\":\"places\"\n    },\n\n    AbbreviationSegments: function () {\n        this[\"container-title\"] = {};\n        this[\"collection-title\"] = {};\n        this[\"institution-entire\"] = {};\n        this[\"institution-part\"] = {};\n        this.nickname = {};\n        this.number = {};\n        this.title = {};\n        this.place = {};\n        this.hereinafter = {};\n        this.classic = {};\n        this[\"container-phrase\"] = {};\n        this[\"title-phrase\"] = {};\n    },\n\n    getAbbrevsDomain: function (state, country, lang) {\n\t\tvar domain = null;\n        if (state.opt.availableAbbrevDomains && country && country !== \"default\") {\n\t        var globalDomainPreference = state.locale[state.opt.lang].opts[\"jurisdiction-preference\"];\n\t\t    var itemDomainPreference = null;\n\t\t    if (state.locale[lang]) {\n\t\t\t    itemDomainPreference = state.locale[lang].opts[\"jurisdiction-preference\"];\n\t\t    }\n\t\t    if (itemDomainPreference) {\n\t\t\t    for (var j=itemDomainPreference.length-1; j > -1; j--) {\n\t\t\t\t    if (state.opt.availableAbbrevDomains[country].indexOf(itemDomainPreference[j]) > -1) {\n\t\t\t\t\t    domain = itemDomainPreference[j];\n\t\t\t\t\t    break;\n\t\t\t\t    }\n\t\t\t    }\n\t\t    }\n\t\t    if (!domain && globalDomainPreference) {\n\t\t\t    for (var j=globalDomainPreference.length-1; j > -1; j--) {\n\t\t\t\t    if (state.opt.availableAbbrevDomains[country].indexOf(globalDomainPreference[j]) > -1) {\n\t\t\t\t\t    domain = globalDomainPreference[j];\n\t\t\t\t\t    break;\n\t\t\t\t    }\n\t\t\t    }\n\t\t    }\n        }\n        return domain;\n    },\n    \n    FIELD_CATEGORY_REMAP: {\n        \"title\": \"title\",\n        \"container-title\": \"container-title\",\n        \"collection-title\": \"collection-title\",\n        \"country\": \"place\",\n        \"number\": \"number\",\n        \"place\": \"place\",\n        \"archive\": \"container-title\",\n        \"title-short\": \"title\",\n        \"genre\": \"title\",\n        \"event\": \"title\",\n        \"medium\": \"title\",\n\t\t\"archive-place\": \"place\",\n\t\t\"publisher-place\": \"place\",\n\t\t\"event-place\": \"place\",\n\t\t\"jurisdiction\": \"place\",\n\t\t\"language-name\": \"place\",\n\t\t\"language-name-original\": \"place\",\n        \"call-number\": \"number\",\n        \"chapter-number\": \"number\",\n        \"collection-number\": \"number\",\n        \"edition\": \"number\",\n        \"page\": \"number\",\n        \"issue\": \"number\",\n        \"locator\": \"number\",\n        \"locator-extra\": \"number\",\n        \"number-of-pages\": \"number\",\n        \"number-of-volumes\": \"number\",\n        \"volume\": \"number\",\n        \"citation-number\": \"number\",\n        \"publisher\": \"institution-part\"\n    },\n    \n    parseLocator: function(item) {\n        if (this.opt.development_extensions.locator_date_and_revision) {\n            // Break out locator elements if necessary\n            if (item.locator) {\n                item.locator = \"\" + item.locator;\n                var idx = item.locator.indexOf(\"|\");\n                if (idx > -1) {\n                    var raw_locator = item.locator;\n                    item.locator = raw_locator.slice(0, idx);\n                    raw_locator = raw_locator.slice(idx + 1);\n                    var m = raw_locator.match(/^([0-9]{4}-[0-9]{2}-[0-9]{2}).*/);\n                    if (m) {\n                        item[\"locator-date\"] = this.fun.dateparser.parseDateToObject(m[1]);\n                        raw_locator = raw_locator.slice(m[1].length);\n                    }\n                    item[\"locator-extra\"] = raw_locator.replace(/^\\s+/, \"\").replace(/\\s+$/, \"\");\n                }\n            }\n        }\n        if (item.locator) {\n            item.locator = (\"\" + item.locator).replace(/\\s+$/, '');\n        }\n        return item;\n    },\n\n    normalizeLocaleStr: function(str) {\n        if (!str) {\n            return;\n        }\n        var lst = str.split('-');\n        lst[0] = lst[0].toLowerCase();\n        if (lst[1]) {\n            lst[1] = lst[1].toUpperCase();\n        }\n        return lst.join(\"-\");\n    },\n\n    parseNoteFieldHacks: function(Item, validFieldsForType, allowDateOverride) {\n        if (\"string\" !== typeof Item.note) {\n            return;\n        }\n        var elems = [];\n        var lines = Item.note.split('\\n');\n        // Normalize entries\n        for (var i=0, ilen=lines.length; i<ilen; i++) {\n            var line = lines[i];\n            var elems = [];\n            var m = line.match(CSL.NOTE_FIELDS_REGEXP);\n            if (m) {\n                var splt = line.split(CSL.NOTE_FIELDS_REGEXP);\n                for (var j=0,jlen=(splt.length-1);j<jlen;j++) {\n                    elems.push(splt[j]);\n                    elems.push(m[j]);\n                }\n                elems.push(splt[splt.length-1]);\n                for (var j=1,jlen=elems.length;j<jlen;j += 2) {\n                    // Abort conversions if preceded by unparseable text\n                    if (elems[j-1].trim() && (i>0 || j>1) && !elems[j-1].match(CSL.NOTE_FIELD_REGEXP)) {\n                        break;\n                    } else {\n                        elems[j] = '\\n' + elems[j].slice(2,-1).trim() + '\\n';\n                    }\n                }\n                lines[i] = elems.join('');\n            }\n        }\n        // Resplit\n        lines = lines.join('\\n').split('\\n');\n        var offset = 0;\n        var names = {};\n        for (var i=0,ilen=lines.length;i<ilen;i++) {\n            var line = lines[i];\n            var mm = line.match(CSL.NOTE_FIELD_REGEXP);\n            if (!line.trim()) {\n                continue;\n            } else if (!mm) {\n                if (i === 0) {\n                    continue;\n                } else {\n                    offset = i;\n                    break;\n                }\n            }\n            var key = mm[1];\n            var val = mm[2].replace(/^\\s+/, \"\").replace(/\\s+$/, \"\");\n            if (key === \"type\") {\n                Item.type = val;\n                lines[i] = \"\";\n            } else if (CSL.DATE_VARIABLES.indexOf(key.replace(/^alt-/, \"\")) > -1) {\n                if (!Item[key] || allowDateOverride) {\n                    Item[key] = CSL.DateParser.parseDateToArray(val);\n                    if (!validFieldsForType || (validFieldsForType[key] && this.isDateString(val))) {\n                        lines[i] = \"\";\n                    }\n                }\n            } else if (!Item[key]) {\n                if (CSL.NAME_VARIABLES.indexOf(key.replace(/^alt-/, \"\")) > -1) {\n                    if (!names[key]) {\n                        names[key] = [];\n                    }\n                    var lst = val.split(/\\s*\\|\\|\\s*/);\n                    if (lst.length === 1) {\n                        names[key].push({literal:lst[0]});\n                    } else if (lst.length === 2) {\n                        var name = {family:lst[0],given:lst[1]};\n                        CSL.parseParticles(name);\n                        names[key].push(name);\n                    }\n                } else {\n                    Item[key] = val;\n                }\n                if (!validFieldsForType || validFieldsForType[key]) {\n                    lines[i] = \"\";\n                }\n            }\n        }\n        for (var key in names) {\n            Item[key] = names[key];\n        }\n        // Final cleanup for validCslFields only: eliminate blank lines, add blank line to text\n        if (validFieldsForType) {\n            if (lines[offset].trim()) {\n                lines[offset] = '\\n' + lines[offset];\n            }\n            for (var i=offset-1;i>-1;i--) {\n                if (!lines[i].trim()) {\n                    lines = lines.slice(0, i).concat(lines.slice(i + 1));\n                }\n            }\n        }\n        Item.note = lines.join(\"\\n\").trim();\n    },\n\n    checkPrefixSpaceAppend: function (state, prefix) {\n        if (!prefix) {\n            prefix = \"\";\n        }\n        var sp = \"\";\n        // We need the raw string, without decorations\n        // of any kind. Markup scheme is known, though, so\n        // markup can be safely stripped at string level.\n        //\n        // U+201d = right double quotation mark\n        // U+2019 = right single quotation mark\n        // U+00bb = right double angle bracket (guillemet)\n        // U+202f = non-breaking thin space\n        // U+00a0 = non-breaking space\n        var test_prefix = prefix.replace(/<[^>]+>/g, \"\").replace(/[\"'\\u201d\\u2019\\u00bb\\u202f\\u00a0 ]+$/g,\"\");\n        var test_char = test_prefix.slice(-1);\n        if (test_prefix.match(CSL.ENDSWITH_ROMANESQUE_REGEXP)) {\n            sp = \" \";\n        } else if (CSL.TERMINAL_PUNCTUATION.slice(0,-1).indexOf(test_char) > -1) {\n            sp = \" \";\n        } else if (test_char.match(/[\\)\\],0-9]/)) {\n            sp = \" \";\n        }\n        // Protect against double spaces, which would trigger an extra,\n        // explicit, non-breaking space.\n        var prefix = (prefix + sp).replace(/\\s+/g, \" \");\n        return prefix;\n    },\n\n    checkIgnorePredecessor: function(state, prefix) {\n        var ignorePredecessor = false;\n        var test_prefix = prefix.replace(/<[^>]+>/g, \"\").replace(/[\"'\\u201d\\u2019\\u00bb\\u202f\\u00a0 ]+$/g,\"\");\n        var test_char = test_prefix.slice(-1);\n        if (CSL.TERMINAL_PUNCTUATION.slice(0,-1).indexOf(test_char) > -1 && prefix.trim().indexOf(\" \") > -1) {\n            state.tmp.term_predecessor = false;\n            return true;\n        }\n        return false;\n    },\n\n    checkSuffixSpacePrepend: function(state, suffix) {\n        if (!suffix) {\n            return \"\";\n        }\n        if (suffix.match(CSL.STARTSWITH_ROMANESQUE_REGEXP) || ['[','('].indexOf(suffix.slice(0,1)) > -1) {\n            suffix = \" \" + suffix;\n        }\n        return suffix;\n    },\n    \n    GENDERS: [\"masculine\", \"feminine\"],\n    \n    ERROR_NO_RENDERED_FORM: 1,\n\n    PREVIEW: \"Just for laughs.\",\n    ASSUME_ALL_ITEMS_REGISTERED: 2,\n\n    START: 0,\n    END: 1,\n    SINGLETON: 2,\n\n    SEEN: 6,\n    SUCCESSOR: 3,\n    SUCCESSOR_OF_SUCCESSOR: 4,\n    SUPPRESS: 5,\n\n    SINGULAR: 0,\n    PLURAL: 1,\n\n    LITERAL: true,\n\n    BEFORE: 1,\n    AFTER: 2,\n\n    DESCENDING: 1,\n    ASCENDING: 2,\n\n    PRIMARY: 1,\n    SECONDARY: 2,\n    \n    POSITION_FIRST: 0,\n    POSITION_SUBSEQUENT: 1,\n    POSITION_IBID: 2,\n    POSITION_IBID_WITH_LOCATOR: 3,\n    POSITION_CONTAINER_SUBSEQUENT: 4,\n\n    POSITION_MAP: {\n        \"0\": 0,\n        \"4\": 1,\n        \"1\": 2,\n        \"2\": 3,\n        \"3\": 4\n    },\n    \n    POSITION_TEST_VARS: [\"position\", \"first-reference-note-number\", \"near-note\"],\n\n    AREAS: [\"citation\", \"citation_sort\", \"bibliography\", \"bibliography_sort\", \"intext\"],\n\n    CITE_FIELDS: [\"first-reference-note-number\", \"first-container-reference-note-number\", \"locator\", \"locator-extra\"],\n\n    SWAPPING_PUNCTUATION: [\".\", \"!\", \"?\", \":\", \",\"],\n    TERMINAL_PUNCTUATION: [\":\", \".\", \";\", \"!\", \"?\", \" \"],\n\n    // update modes\n    NONE: 0,\n    NUMERIC: 1,\n    POSITION: 2,\n    TRIGRAPH: 3,\n\n    DATE_PARTS: [\"year\", \"month\", \"day\"],\n    DATE_PARTS_ALL: [\"year\", \"month\", \"day\", \"season\"],\n    DATE_PARTS_INTERNAL: [\"year\", \"month\", \"day\", \"year_end\", \"month_end\", \"day_end\"],\n\n    NAME_PARTS: [\"non-dropping-particle\", \"family\", \"given\", \"dropping-particle\", \"suffix\", \"literal\"],\n\n    DISAMBIGUATE_OPTIONS: [\n        \"disambiguate-add-names\",\n        \"disambiguate-add-givenname\",\n        \"disambiguate-add-year-suffix\"\n    ],\n\n    GIVENNAME_DISAMBIGUATION_RULES: [\n        \"all-names\",\n        \"all-names-with-initials\",\n        \"primary-name\",\n        \"primary-name-with-initials\",\n        \"by-cite\"\n    ],\n\n    NAME_ATTRIBUTES: [\n        \"and\",\n        \"delimiter-precedes-last\",\n        \"delimiter-precedes-et-al\",\n        \"initialize-with\",\n        \"initialize\",\n        \"name-as-sort-order\",\n        \"sort-separator\",\n        \"et-al-min\",\n        \"et-al-use-first\",\n        \"et-al-subsequent-min\",\n        \"et-al-subsequent-use-first\",\n        \"form\",\n        \"prefix\",\n        \"suffix\",\n        \"delimiter\"\n    ],\n\n    LOOSE: 0,\n    STRICT: 1,\n    TOLERANT: 2,\n\n    PREFIX_PUNCTUATION: /[.;:]\\s*$/,\n    SUFFIX_PUNCTUATION: /^\\s*[.;:,\\(\\)]/,\n\n    NUMBER_REGEXP: /(?:^\\d+|\\d+$)/,\n    //\n    // \\u0400-\\u042f are cyrillic and extended cyrillic capitals\n    // this is not fully smart yet.  can't do what this was trying to do\n    // with regexps, actually; we want to identify strings with a leading\n    // capital letter, and any subsequent capital letters.  Have to compare\n    // locale caps version with existing version, character by character.\n    // hard stuff, but if it breaks, that's what to do.\n    // \\u0600-\\u06ff is Arabic/Persian\n    // \\u200c-\\u200e and \\u202a-\\u202e are special spaces and left-right \n    // control characters\n\n\n\n    NAME_INITIAL_REGEXP: /^([A-Z\\u0e01-\\u0e5b\\u00c0-\\u017f\\u0400-\\u042f\\u0590-\\u05d4\\u05d6-\\u05ff\\u0600-\\u06ff\\u0370\\u0372\\u0376\\u0386\\u0388-\\u03ab\\u03e2\\u03e4\\u03e6\\u03e8\\u03ea\\u03ec\\u03ee\\u03f4\\u03f7\\u03fd-\\u03ff])([a-zA-Z\\u0e01-\\u0e5b\\u00c0-\\u017f\\u0400-\\u052f\\u0600-\\u06ff\\u0370-\\u03ff\\u1f00-\\u1fff]*|)(\\.)*/,\n    ROMANESQUE_REGEXP: /[-0-9a-zA-Z\\u0e01-\\u0e5b\\u00c0-\\u017f\\u0370-\\u03ff\\u0400-\\u052f\\u0590-\\u05d4\\u05d6-\\u05ff\\u1f00-\\u1fff\\u0600-\\u06ff\\u200c\\u200d\\u200e\\u0218\\u0219\\u021a\\u021b\\u202a-\\u202e]/,\n    ROMANESQUE_NOT_REGEXP: /[^a-zA-Z\\u0e01-\\u0e5b\\u00c0-\\u017f\\u0370-\\u03ff\\u0400-\\u052f\\u0590-\\u05d4\\u05d6-\\u05ff\\u1f00-\\u1fff\\u0600-\\u06ff\\u200c\\u200d\\u200e\\u0218\\u0219\\u021a\\u021b\\u202a-\\u202e]/g,\n    STARTSWITH_ROMANESQUE_REGEXP: /^[&a-zA-Z\\u0e01-\\u0e5b\\u00c0-\\u017f\\u0370-\\u03ff\\u0400-\\u052f\\u0590-\\u05d4\\u05d6-\\u05ff\\u1f00-\\u1fff\\u0600-\\u06ff\\u200c\\u200d\\u200e\\u0218\\u0219\\u021a\\u021b\\u202a-\\u202e]/,\n    ENDSWITH_ROMANESQUE_REGEXP: /[.;:&a-zA-Z\\u0e01-\\u0e5b\\u00c0-\\u017f\\u0370-\\u03ff\\u0400-\\u052f\\u0590-\\u05d4\\u05d6-\\u05ff\\u1f00-\\u1fff\\u0600-\\u06ff\\u200c\\u200d\\u200e\\u0218\\u0219\\u021a\\u021b\\u202a-\\u202e]$/,\n    ALL_ROMANESQUE_REGEXP: /^[a-zA-Z\\u0e01-\\u0e5b\\u00c0-\\u017f\\u0370-\\u03ff\\u0400-\\u052f\\u0590-\\u05d4\\u05d6-\\u05ff\\u1f00-\\u1fff\\u0600-\\u06ff\\u200c\\u200d\\u200e\\u0218\\u0219\\u021a\\u021b\\u202a-\\u202e]+$/,\n\n    VIETNAMESE_SPECIALS: /[\\u00c0-\\u00c3\\u00c8-\\u00ca\\u00cc\\u00cd\\u00d2-\\u00d5\\u00d9\\u00da\\u00dd\\u00e0-\\u00e3\\u00e8-\\u00ea\\u00ec\\u00ed\\u00f2-\\u00f5\\u00f9\\u00fa\\u00fd\\u0101\\u0103\\u0110\\u0111\\u0128\\u0129\\u0168\\u0169\\u01a0\\u01a1\\u01af\\u01b0\\u1ea0-\\u1ef9]/,\n\n    VIETNAMESE_NAMES: /^(?:(?:[.AaBbCcDdEeGgHhIiKkLlMmNnOoPpQqRrSsTtUuVvXxYy \\u00c0-\\u00c3\\u00c8-\\u00ca\\u00cc\\u00cd\\u00d2-\\u00d5\\u00d9\\u00da\\u00dd\\u00e0-\\u00e3\\u00e8-\\u00ea\\u00ec\\u00ed\\u00f2-\\u00f5\\u00f9\\u00fa\\u00fd\\u0101\\u0103\\u0110\\u0111\\u0128\\u0129\\u0168\\u0169\\u01a0\\u01a1\\u01af\\u01b0\\u1ea0-\\u1ef9]{2,6})(\\s+|$))+$/,\n\n    NOTE_FIELDS_REGEXP: /\\{:(?:[\\-_a-z]+|[A-Z]+):[^\\}]+\\}/g,\n    NOTE_FIELD_REGEXP: /^([\\-_a-z]+|[A-Z]+):\\s*([^\\}]+)$/,\n\n\tPARTICLE_GIVEN_REGEXP: /^([^ ]+(?:\\u02bb |\\u2019 | |\\' ) *)(.+)$/,\n\tPARTICLE_FAMILY_REGEXP: /^([^ ]+(?:\\-|\\u02bb|\\u2019| |\\') *)(.+)$/,\n\n    DISPLAY_CLASSES: [\"block\", \"left-margin\", \"right-inline\", \"indent\"],\n\n    NAME_VARIABLES: [\n        \"author\",\n        \"chair\",\n        \"collection-editor\",\n        \"compiler\",\n        \"composer\",\n        \"container-author\",\n        \"contributor\",\n        \"curator\",\n        \"director\",\n        \"editor\",\n        \"editor-translator\", \n        \"editorial-director\",\n        \"executive-producer\",\n        \"guest\",\n        \"host\",\n        \"illustrator\",\n        \"interviewer\",\n        \"narrator\", \n        \"organizer\",\n        \"original-author\",\n        \"performer\",\n        \"producer\",\n        \"recipient\",\n        \"reviewed-author\",\n        \"script-writer\",\n        \"series-creator\",\n        \"translator\",\n        \"commenter\"\n    ],\n    CREATORS: [\n        \"author\",\n        \"chair\",\n        \"collection-editor\",\n        \"compiler\",\n        \"composer\",\n        \"container-author\",\n        \"contributor\",\n        \"curator\",\n        \"director\",\n        \"editor\",\n        \"editor-translator\", \n        \"editorial-director\",\n        \"executive-producer\",\n        \"guest\",\n        \"host\",\n        \"illustrator\",\n        \"interviewer\",\n        \"narrator\", \n        \"organizer\",\n        \"original-author\",\n        \"performer\",\n        \"producer\",\n        \"recipient\",\n        \"reviewed-author\",\n        \"script-writer\",\n        \"series-creator\",\n        \"translator\",\n        \"commenter\"\n    ],\n    NUMERIC_VARIABLES: [\n        \"call-number\",\n        \"chapter-number\",\n        \"collection-number\",\n        \"division\",\n        \"edition\",\n        \"page\",\n        \"issue\",\n        \"locator\",\n        \"locator-extra\",\n        \"number\",\n        \"number-of-pages\",\n        \"number-of-volumes\",\n        \"part-number\",\n        \"printing-number\",\n        \"section\",\n        \"supplement-number\",\n        \"version\",\n        \"volume\",\n        \"supplement\", // maybe deprecated this? supplement-number should serve this purpose in standard CSL.\n        \"citation-number\"\n    ],\n    //var x = new Array();\n    //x = x.concat([\"title\",\"container-title\",\"issued\",\"page\"]);\n    //x = x.concat([\"locator\",\"collection-number\",\"original-date\"]);\n    //x = x.concat([\"reporting-date\",\"decision-date\",\"filing-date\"]);\n    //x = x.concat([\"revision-date\"]);\n    //NUMERIC_VARIABLES = x.slice();\n    DATE_VARIABLES: [\n        \"locator-date\", \n        \"issued\", \n        \"event-date\", \n        \"accessed\", \n        \"original-date\",\n        \"publication-date\",\n        \"available-date\",\n        \"submitted\",\n        \"alt-issued\",\n        \"alt-event\"\n    ],\n    VARIABLES_WITH_SHORT_FORM: [\n        \"title\",\n        \"container-title\"\n    ],\n    TITLE_FIELD_SPLITS: function(seg) {\n        var keys = [\"title\", \"short\", \"main\", \"sub\", \"subjoin\"];\n        var ret = {};\n        for (var i=0,ilen=keys.length;i<ilen;i++) {\n            ret[keys[i]] = seg + \"title\" + (keys[i] === \"title\" ? \"\" : \"-\" + keys[i]);\n        }\n        return ret;\n    },\n    \n    demoteNoiseWords: function (state, fld, drop_or_demote) {\n        var SKIP_WORDS = state.locale[state.opt.lang].opts[\"leading-noise-words\"];\n        if (fld && drop_or_demote) {\n            fld = fld.split(/\\s+/);\n            fld.reverse();\n            var toEnd = [];\n            for (var j  = fld.length - 1; j > -1; j += -1) {\n                if (SKIP_WORDS.indexOf(fld[j].toLowerCase()) > -1) {\n                    toEnd.push(fld.pop());\n                } else {\n                    break;\n                }\n            }\n            fld.reverse();\n            var start = fld.join(\" \");\n            var end = toEnd.join(\" \");\n            if (\"drop\" === drop_or_demote || !end) {\n                fld = start;\n            } else if (\"demote\" === drop_or_demote) {\n                fld = [start, end].join(\", \");\n            }\n        }\n        return fld;\n    },\n\n    extractTitleAndSubtitle: function (Item, narrowSpaceLocale) {\n        var narrowSpace = narrowSpaceLocale ? \"\\u202f\" : \"\";\n        // XXX In this function, split on split-char, but prefer exact match\n        // XXX of subtitle to a split-char in title if found.\n        var segments = [\"\"];\n        if (this.opt.development_extensions.split_container_title) {\n            segments.push(\"container-\");\n        }\n        for (var i=0,ilen=segments.length;i<ilen;i++) {\n            var seg = segments[i];\n            var title = CSL.TITLE_FIELD_SPLITS(seg);\n            var langs = [false];\n            if (Item.multi) {\n                for (var lang in Item.multi._keys[title.short]) {\n                    langs.push(lang);\n                }\n            }\n            for (var j=0,jlen=langs.length;j<jlen;j++) {\n                var lang = langs[j];\n                var vals = {};\n                if (lang) {\n                    if (Item.multi._keys[title.title]) {\n                        vals[title.title] = Item.multi._keys[title.title][lang];\n                    }\n                    if (Item.multi._keys[title[\"short\"]]) {\n                        vals[title[\"short\"]] = Item.multi._keys[title[\"short\"]][lang];\n                    }\n                } else {\n                    vals[title.title] = Item[title.title];\n                    vals[title[\"short\"]] = Item[title[\"short\"]];\n                }\n                vals[title.main] = vals[title.title];\n                vals[title.sub] = false;\n                var shortTitle = vals[title[\"short\"]];\n                if (vals[title.title]) {\n                    // Rules\n                    // TITLE_SPLIT eliminates split-points of period-space preceded by a capital letter.\n                    // If short title exists and matches exactly to a split-point, use that split-point only.\n                    // Otherwise if there is just one split-point, use that as main/sub split.\n                    // Otherwise use all split-points ... which is handled in titleCaseSentenceOrNormal, not here.\n                    if (shortTitle && shortTitle.toLowerCase() === vals[title.title].toLowerCase()) {\n                        vals[title.main] = vals[title.title];\n                        vals[title.subjoin] = \"\";\n                        vals[title.sub] = \"\";\n                    } else if (shortTitle) {\n                        // check for valid match to shortTitle\n                        var tail = vals[title.title].slice(shortTitle.replace(/[\\?\\!]+$/, \"\").length);\n                        var top = vals[title.title].replace(tail.replace(/^[\\?\\!]+/, \"\"), \"\").trim();\n                        var m = CSL.TITLE_SPLIT_REGEXP.matchfirst.exec(tail);\n                        if (m && top.toLowerCase() === shortTitle.toLowerCase()) {\n                            vals[title.main] = top;\n                            vals[title.subjoin] = m[1].replace(/[\\?\\!]+(\\s*)$/, \"$1\");\n                            vals[title.sub] = tail.replace(CSL.TITLE_SPLIT_REGEXP.matchfirst, \"\");\n                            if (this.opt.development_extensions.force_short_title_casing_alignment) {\n                                vals[title[\"short\"]] = vals[title.main];\n                            }\n                        } else {\n                            var splitTitle = CSL.TITLE_SPLIT(vals[title.title]);\n                            if (splitTitle.length == 3) {\n                                vals[title.main] = splitTitle[0];\n                                vals[title.subjoin] = splitTitle[1];\n                                vals[title.sub] = splitTitle[2];\n                            } else {\n                                vals[title.main] = vals[title.title];\n                                vals[title.subjoin] = \"\";\n                                vals[title.sub] = \"\";\n                            }\n                        }\n                    } else {\n                        var splitTitle = CSL.TITLE_SPLIT(vals[title.title]);\n                        if (splitTitle.length == 3) {\n                            vals[title.main] = splitTitle[0];\n                            vals[title.subjoin] = splitTitle[1];\n                            vals[title.sub] = splitTitle[2];\n                            if (this.opt.development_extensions.implicit_short_title && Item.type !== \"legal_case\") {\n                                if (!Item[title.short] && !vals[title.main].match(/^[\\-\\.[0-9]+$/)) {\n                                    var punct = vals[title.subjoin].trim();\n                                    if ([\"?\", \"!\"].indexOf(punct) === -1) {\n                                        punct = \"\";\n                                    }\n                                    vals[title.short] = vals[title.main] + punct;\n                                }\n                            }\n                        } else {\n                            vals[title.main] = vals[title.title];\n                            vals[title.subjoin] = \"\";\n                            vals[title.sub] = \"\";\n                        }\n                    }\n                    if (vals[title.subjoin]) {\n                        if (vals[title.subjoin].match(/([\\?\\!])/)) {\n                            var m = vals[title.subjoin].match(/(\\s*)$/)\n                            vals[title.main] = vals[title.main] + narrowSpace +vals[title.subjoin].trim();\n                            vals[title.subjoin] = m[1];\n                        }\n                    }\n                }\n                if (vals[title.subjoin]) {\n                    if (vals[title.subjoin].indexOf(\":\") > -1) {\n                        vals[title.subjoin] = narrowSpace + \": \";\n                    }\n                    if (vals[title.subjoin].indexOf(\"-\") > -1 || vals[title.subjoin].indexOf(\"—\") > -1) {\n                        vals[title.subjoin] = \"—\";\n                    }\n                }\n                if (lang) {\n                    for (var key in vals) {\n                        if (!Item.multi._keys[key]) {\n                            Item.multi._keys[key] = {};\n                        }\n                        Item.multi._keys[key][lang] = vals[key];\n                    }\n                } else {\n                    for (var key in vals) {\n                        Item[key] = vals[key];\n                    }\n                }\n            }\n        }\n    },\n\n    titlecaseSentenceOrNormal: function(state, Item, seg, lang, sentenceCase) {\n        // Hold on here.\n        // What is seg here?\n        // It's ... either \"\" or \"container-\". Which is ugly, but works.\n        // But this ALWAYS returns the full title, never short.\n        // So sentence-casing cannot be applied to short.\n        // Goes unnoticed because forced sentence-casing almost never appears in styles.\n        var title = CSL.TITLE_FIELD_SPLITS(seg);\n        var vals = {};\n        if (lang && Item.multi) {\n            if (Item.multi._keys[title.title]) {\n                vals[title.title] = Item.multi._keys[title.title][lang];\n            }\n            if (Item.multi._keys[title.main]) {\n                vals[title.main] = Item.multi._keys[title.main][lang];\n            }\n            if (Item.multi._keys[title.sub]) {\n                vals[title.sub] = Item.multi._keys[title.sub][lang];\n            }\n            if (Item.multi._keys[title.subjoin]) {\n                vals[title.subjoin] = Item.multi._keys[title.subjoin][lang];\n            }\n        } else {\n            vals[title.title] = Item[title.title];\n            vals[title.main] = Item[title.main];\n            vals[title.sub] = Item[title.sub];\n            vals[title.subjoin] = Item[title.subjoin];\n        }\n        if (vals[title.main] && vals[title.sub]) {\n            var mainTitle = vals[title.main];\n            var subJoin = vals[title.subjoin];\n            var subTitle = vals[title.sub];\n            if (sentenceCase) {\n                mainTitle = CSL.Output.Formatters.sentence(state, mainTitle);\n                subTitle = CSL.Output.Formatters.sentence(state, subTitle);\n            } else if (state.opt.development_extensions.uppercase_subtitles) {\n                subTitle = CSL.Output.Formatters[\"capitalize-first\"](state, subTitle);\n            }\n            return [mainTitle, subJoin, subTitle].join(\"\");\n        } else if (vals[title.title]) {\n            if (sentenceCase) {\n                return CSL.Output.Formatters.sentence(state, vals[title.title]);\n            } else if (state.opt.development_extensions.uppercase_subtitles) {\n                // Split and apply everywhere.\n                var splits = CSL.TITLE_SPLIT(vals[title.title]);\n                for (var i=0,ilen=splits.length; i<ilen; i += 2) {\n                    splits[i] = CSL.Output.Formatters[\"capitalize-first\"](state, splits[i]);\n                }\n                for (var i=1, ilen=splits.length-1; i < ilen; i += 2) {\n                    var m = splits[i].match(/([:\\?\\!] )/);\n                    if (m) {\n                        var narrowSpace = state.opt[\"default-locale\"][0].slice(0, 2).toLowerCase() === \"fr\" ? \"\\u202f\" : \"\";\n                        splits[i] = narrowSpace + m[1];\n                    }\n                    if (splits[i].indexOf(\"-\") > -1 || splits[i].indexOf(\"—\") > -1) {\n                        splits[i] = \"—\";\n                    }\n                }\n                vals[title.title] = splits.join(\"\");\n                return vals[title.title];\n            } else {\n                return vals[title.title];\n            }\n        } else {\n            return \"\";\n        }\n    },\n\n    getSafeEscape: function(state) {\n        if ([\"bibliography\", \"citation\"].indexOf(state.tmp.area) > -1) {\n            // Callback to apply thin space hack\n            // Callback to force LTR/RTL on parens and braces\n            // XXX Is this really necessary?\n            var callbacks = [];\n            if (state.opt.development_extensions.thin_non_breaking_space_html_hack && state.opt.mode === \"html\") {\n                callbacks.push(function (txt) {\n                    return txt.replace(/\\u202f/g, '<span style=\"white-space:nowrap\">&thinsp;</span>');\n                });\n            }\n            if (callbacks.length) {\n                return function (txt) {\n                    for (var i = 0, ilen = callbacks.length; i < ilen; i += 1) {\n                        txt = callbacks[i](txt);\n                    }\n                    return CSL.Output.Formats[state.opt.mode].text_escape(txt);\n                };\n            } else {\n                return CSL.Output.Formats[state.opt.mode].text_escape;\n            }\n        } else {\n            return function (txt) { return txt; };\n        }\n    },\n\n    SKIP_WORDS: [\"about\",\"above\",\"across\",\"afore\",\"after\",\"against\",\"al\", \"along\",\"alongside\",\"amid\",\"amidst\",\"among\",\"amongst\",\"anenst\",\"apropos\",\"apud\",\"around\",\"as\",\"aside\",\"astride\",\"at\",\"athwart\",\"atop\",\"barring\",\"before\",\"behind\",\"below\",\"beneath\",\"beside\",\"besides\",\"between\",\"beyond\",\"but\",\"by\",\"circa\",\"despite\",\"down\",\"during\",\"et\", \"except\",\"for\",\"forenenst\",\"from\",\"given\",\"in\",\"inside\",\"into\",\"lest\",\"like\",\"modulo\",\"near\",\"next\",\"notwithstanding\",\"of\",\"off\",\"on\",\"onto\",\"out\",\"over\",\"per\",\"plus\",\"pro\",\"qua\",\"sans\",\"since\",\"than\",\"through\",\" thru\",\"throughout\",\"thruout\",\"till\",\"to\",\"toward\",\"towards\",\"under\",\"underneath\",\"until\",\"unto\",\"up\",\"upon\",\"versus\",\"vs.\",\"v.\",\"vs\",\"v\",\"via\",\"vis-à-vis\",\"with\",\"within\",\"without\",\"according to\",\"ahead of\",\"apart from\",\"as for\",\"as of\",\"as per\",\"as regards\",\"aside from\",\"back to\",\"because of\",\"close to\",\"due to\",\"except for\",\"far from\",\"inside of\",\"instead of\",\"near to\",\"next to\",\"on to\",\"out from\",\"out of\",\"outside of\",\"prior to\",\"pursuant to\",\"rather than\",\"regardless of\",\"such as\",\"that of\",\"up to\",\"where as\",\"or\", \"yet\", \"so\", \"for\", \"and\", \"nor\", \"a\", \"an\", \"the\", \"de\", \"d'\", \"von\", \"van\", \"c\", \"ca\"],\n\n    FORMAT_KEY_SEQUENCE: [\n        \"@strip-periods\",\n        \"@font-style\",\n        \"@font-variant\",\n        \"@font-weight\",\n        \"@text-decoration\",\n        \"@vertical-align\",\n        \"@quotes\"\n    ],\n\n    INSTITUTION_KEYS: [\n        \"font-style\",\n        \"font-variant\",\n        \"font-weight\",\n        \"text-decoration\",\n        \"text-case\"\n    ],\n\n    SUFFIX_CHARS: \"a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z\",\n    ROMAN_NUMERALS: [\n        [ \"\", \"i\", \"ii\", \"iii\", \"iv\", \"v\", \"vi\", \"vii\", \"viii\", \"ix\" ],\n        [ \"\", \"x\", \"xx\", \"xxx\", \"xl\", \"l\", \"lx\", \"lxx\", \"lxxx\", \"xc\" ],\n        [ \"\", \"c\", \"cc\", \"ccc\", \"cd\", \"d\", \"dc\", \"dcc\", \"dccc\", \"cm\" ],\n        [ \"\", \"m\", \"mm\", \"mmm\", \"mmmm\", \"mmmmm\"]\n    ],\n\n    LANGS: {\n        \"af-ZA\":\"Afrikaans\",\n        \"ar\":\"Arabic\",\n        \"bg-BG\":\"Bulgarian\",\n        \"ca-AD\":\"Catalan\",\n        \"cs-CZ\":\"Czech\",\n        \"da-DK\":\"Danish\",\n        \"de-AT\":\"Austrian\",\n        \"de-CH\":\"German (CH)\",\n        \"de-DE\":\"German (DE)\",\n        \"el-GR\":\"Greek\",\n        \"en-GB\":\"English (GB)\",\n        \"en-US\":\"English (US)\",\n        \"es-ES\":\"Spanish\",\n        \"et-EE\":\"Estonian\",\n        \"eu\":\"European\",\n        \"fa-IR\":\"Persian\",\n        \"fi-FI\":\"Finnish\",\n        \"fr-CA\":\"French (CA)\",\n        \"fr-FR\":\"French (FR)\",\n        \"he-IL\":\"Hebrew\",\n        \"hr-HR\":\"Croatian\",\n        \"hu-HU\":\"Hungarian\",\n        \"is-IS\":\"Icelandic\",\n        \"it-IT\":\"Italian\",\n        \"ja-JP\":\"Japanese\",\n        \"km-KH\":\"Khmer\",\n        \"ko-KR\":\"Korean\",\n        \"lt-LT\":\"Lithuanian\",\n        \"lv-LV\":\"Latvian\",\n        \"mn-MN\":\"Mongolian\",\n        \"nb-NO\":\"Norwegian (Bokmål)\",\n        \"nl-NL\":\"Dutch\",\n        \"nn-NO\":\"Norwegian (Nynorsk)\",\n        \"pl-PL\":\"Polish\",\n        \"pt-BR\":\"Portuguese (BR)\",\n        \"pt-PT\":\"Portuguese (PT)\",\n        \"ro-RO\":\"Romanian\",\n        \"ru-RU\":\"Russian\",\n        \"sk-SK\":\"Slovak\",\n        \"sl-SI\":\"Slovenian\",\n        \"sr-RS\":\"Serbian\",\n        \"sv-SE\":\"Swedish\",\n        \"th-TH\":\"Thai\",\n        \"tr-TR\":\"Turkish\",\n        \"uk-UA\":\"Ukrainian\",\n        \"vi-VN\":\"Vietnamese\",\n        \"zh-CN\":\"Chinese (CN)\",\n        \"zh-TW\":\"Chinese (TW)\"\n    },\n\n    LANG_BASES: {\n        af: \"af_ZA\",\n        ar: \"ar\",\n        bg: \"bg_BG\",\n        ca: \"ca_AD\",\n        cs: \"cs_CZ\",\n        da: \"da_DK\",\n        de: \"de_DE\",\n        el: \"el_GR\",\n        en: \"en_US\",\n        es: \"es_ES\",\n        et: \"et_EE\",\n        eu: \"eu\",\n        fa: \"fa_IR\",\n        fi: \"fi_FI\",\n        fr: \"fr_FR\",\n        he: \"he_IL\",\n        hr: \"hr-HR\",\n        hu: \"hu_HU\",\n        is: \"is_IS\",\n        it: \"it_IT\",\n        ja: \"ja_JP\",\n        km: \"km_KH\",\n        ko: \"ko_KR\",\n        lt: \"lt_LT\",\n        lv: \"lv-LV\",\n        mn: \"mn_MN\",\n        nb: \"nb_NO\",\n        nl: \"nl_NL\",\n        nn: \"nn-NO\",\n        pl: \"pl_PL\",\n        pt: \"pt_PT\",\n        ro: \"ro_RO\",\n        ru: \"ru_RU\",\n        sk: \"sk_SK\",\n        sl: \"sl_SI\",\n        sr: \"sr_RS\",\n        sv: \"sv_SE\",\n        th: \"th_TH\",\n        tr: \"tr_TR\",\n        uk: \"uk_UA\",\n        vi: \"vi_VN\",\n        zh: \"zh_CN\"\n    },\n\n    SUPERSCRIPTS: {\n        \"\\u00AA\": \"\\u0061\",\n        \"\\u00B2\": \"\\u0032\",\n        \"\\u00B3\": \"\\u0033\",\n        \"\\u00B9\": \"\\u0031\",\n        \"\\u00BA\": \"\\u006F\",\n        \"\\u02B0\": \"\\u0068\",\n        \"\\u02B1\": \"\\u0266\",\n        \"\\u02B2\": \"\\u006A\",\n        \"\\u02B3\": \"\\u0072\",\n        \"\\u02B4\": \"\\u0279\",\n        \"\\u02B5\": \"\\u027B\",\n        \"\\u02B6\": \"\\u0281\",\n        \"\\u02B7\": \"\\u0077\",\n        \"\\u02B8\": \"\\u0079\",\n        \"\\u02E0\": \"\\u0263\",\n        \"\\u02E1\": \"\\u006C\",\n        \"\\u02E2\": \"\\u0073\",\n        \"\\u02E3\": \"\\u0078\",\n        \"\\u02E4\": \"\\u0295\",\n        \"\\u1D2C\": \"\\u0041\",\n        \"\\u1D2D\": \"\\u00C6\",\n        \"\\u1D2E\": \"\\u0042\",\n        \"\\u1D30\": \"\\u0044\",\n        \"\\u1D31\": \"\\u0045\",\n        \"\\u1D32\": \"\\u018E\",\n        \"\\u1D33\": \"\\u0047\",\n        \"\\u1D34\": \"\\u0048\",\n        \"\\u1D35\": \"\\u0049\",\n        \"\\u1D36\": \"\\u004A\",\n        \"\\u1D37\": \"\\u004B\",\n        \"\\u1D38\": \"\\u004C\",\n        \"\\u1D39\": \"\\u004D\",\n        \"\\u1D3A\": \"\\u004E\",\n        \"\\u1D3C\": \"\\u004F\",\n        \"\\u1D3D\": \"\\u0222\",\n        \"\\u1D3E\": \"\\u0050\",\n        \"\\u1D3F\": \"\\u0052\",\n        \"\\u1D40\": \"\\u0054\",\n        \"\\u1D41\": \"\\u0055\",\n        \"\\u1D42\": \"\\u0057\",\n        \"\\u1D43\": \"\\u0061\",\n        \"\\u1D44\": \"\\u0250\",\n        \"\\u1D45\": \"\\u0251\",\n        \"\\u1D46\": \"\\u1D02\",\n        \"\\u1D47\": \"\\u0062\",\n        \"\\u1D48\": \"\\u0064\",\n        \"\\u1D49\": \"\\u0065\",\n        \"\\u1D4A\": \"\\u0259\",\n        \"\\u1D4B\": \"\\u025B\",\n        \"\\u1D4C\": \"\\u025C\",\n        \"\\u1D4D\": \"\\u0067\",\n        \"\\u1D4F\": \"\\u006B\",\n        \"\\u1D50\": \"\\u006D\",\n        \"\\u1D51\": \"\\u014B\",\n        \"\\u1D52\": \"\\u006F\",\n        \"\\u1D53\": \"\\u0254\",\n        \"\\u1D54\": \"\\u1D16\",\n        \"\\u1D55\": \"\\u1D17\",\n        \"\\u1D56\": \"\\u0070\",\n        \"\\u1D57\": \"\\u0074\",\n        \"\\u1D58\": \"\\u0075\",\n        \"\\u1D59\": \"\\u1D1D\",\n        \"\\u1D5A\": \"\\u026F\",\n        \"\\u1D5B\": \"\\u0076\",\n        \"\\u1D5C\": \"\\u1D25\",\n        \"\\u1D5D\": \"\\u03B2\",\n        \"\\u1D5E\": \"\\u03B3\",\n        \"\\u1D5F\": \"\\u03B4\",\n        \"\\u1D60\": \"\\u03C6\",\n        \"\\u1D61\": \"\\u03C7\",\n        \"\\u2070\": \"\\u0030\",\n        \"\\u2071\": \"\\u0069\",\n        \"\\u2074\": \"\\u0034\",\n        \"\\u2075\": \"\\u0035\",\n        \"\\u2076\": \"\\u0036\",\n        \"\\u2077\": \"\\u0037\",\n        \"\\u2078\": \"\\u0038\",\n        \"\\u2079\": \"\\u0039\",\n        \"\\u207A\": \"\\u002B\",\n        \"\\u207B\": \"\\u2212\",\n        \"\\u207C\": \"\\u003D\",\n        \"\\u207D\": \"\\u0028\",\n        \"\\u207E\": \"\\u0029\",\n        \"\\u207F\": \"\\u006E\",\n        \"\\u2120\": \"\\u0053\\u004D\",\n        \"\\u2122\": \"\\u0054\\u004D\",\n        \"\\u3192\": \"\\u4E00\",\n        \"\\u3193\": \"\\u4E8C\",\n        \"\\u3194\": \"\\u4E09\",\n        \"\\u3195\": \"\\u56DB\",\n        \"\\u3196\": \"\\u4E0A\",\n        \"\\u3197\": \"\\u4E2D\",\n        \"\\u3198\": \"\\u4E0B\",\n        \"\\u3199\": \"\\u7532\",\n        \"\\u319A\": \"\\u4E59\",\n        \"\\u319B\": \"\\u4E19\",\n        \"\\u319C\": \"\\u4E01\",\n        \"\\u319D\": \"\\u5929\",\n        \"\\u319E\": \"\\u5730\",\n        \"\\u319F\": \"\\u4EBA\",\n        \"\\u02C0\": \"\\u0294\",\n        \"\\u02C1\": \"\\u0295\",\n        \"\\u06E5\": \"\\u0648\",\n        \"\\u06E6\": \"\\u064A\"\n    },\n    SUPERSCRIPTS_REGEXP: new RegExp(\"[\\u00AA\\u00B2\\u00B3\\u00B9\\u00BA\\u02B0\\u02B1\\u02B2\\u02B3\\u02B4\\u02B5\\u02B6\\u02B7\\u02B8\\u02E0\\u02E1\\u02E2\\u02E3\\u02E4\\u1D2C\\u1D2D\\u1D2E\\u1D30\\u1D31\\u1D32\\u1D33\\u1D34\\u1D35\\u1D36\\u1D37\\u1D38\\u1D39\\u1D3A\\u1D3C\\u1D3D\\u1D3E\\u1D3F\\u1D40\\u1D41\\u1D42\\u1D43\\u1D44\\u1D45\\u1D46\\u1D47\\u1D48\\u1D49\\u1D4A\\u1D4B\\u1D4C\\u1D4D\\u1D4F\\u1D50\\u1D51\\u1D52\\u1D53\\u1D54\\u1D55\\u1D56\\u1D57\\u1D58\\u1D59\\u1D5A\\u1D5B\\u1D5C\\u1D5D\\u1D5E\\u1D5F\\u1D60\\u1D61\\u2070\\u2071\\u2074\\u2075\\u2076\\u2077\\u2078\\u2079\\u207A\\u207B\\u207C\\u207D\\u207E\\u207F\\u2120\\u2122\\u3192\\u3193\\u3194\\u3195\\u3196\\u3197\\u3198\\u3199\\u319A\\u319B\\u319C\\u319D\\u319E\\u319F\\u02C0\\u02C1\\u06E5\\u06E6]\", \"g\"),\n\n    // I think we need to have separate args for prefix and term,\n    // since they have different effects between comma-safe and comma-safe-numbers-only.\n    // Either that, or -- oh, we could just bang the two together for the test where\n    // necessary.\n    \n    UPDATE_GROUP_CONTEXT_CONDITION: function (state, str, valueTerm, token, value) {\n        if (!state.opt.use_context_condition) return;\n        var flags = state.tmp.group_context.tip;\n        if (flags.condition) {\n            if (!flags.condition.termtxt) {\n                flags.condition.termtxt = str;\n                flags.condition.valueTerm = valueTerm;\n            }\n            if (!flags.value_seen && flags.condition.test === \"comma-safe-numbers-only\") {\n                if (value) {\n                    flags.value_seen = true;\n                    if (!value.match(/^[0-9]/)) {\n                        state.tmp.just_did_number = false;\n                    }\n                }\n            }\n        } else {\n            // If not inside a conditional group, raise numeric flag\n            // if and only if the current term string ends in a number.\n            if (token && token.decorations.filter(o => o[0] === \"@vertical-align\").length > 0) {\n                state.tmp.just_did_number = false;\n            } else if (token && token.strings.suffix) {\n                state.tmp.just_did_number = false;\n            } else if (str) {\n                if (str.match(/[0-9]$/)) {\n                    state.tmp.just_did_number = true;\n                } else {\n                    state.tmp.just_did_number = false;\n                }\n            }\n        }\n    },\n\n    EVALUATE_GROUP_CONDITION: function(state, flags) {\n        if (!state.opt.use_context_condition) return;\n        var testres;\n        var numbersOnly = flags.condition.test === \"comma-safe-numbers-only\";\n        if (flags.condition.test === \"empty-label\") {\n            testres = !flags.condition.termtxt;\n        } else if (flags.condition.test === \"empty-label-no-decor\") {\n            testres = !flags.condition.termtxt || flags.condition.termtxt.indexOf(\"%s\") > -1;\n        } else if ([\"comma-safe\", \"comma-safe-numbers-only\"].indexOf(flags.condition.test) > -1) {\n            var locale_term = flags.condition.termtxt;\n            var termStartAlpha = false;\n            if (flags.condition.termtxt) {\n                termStartAlpha = flags.condition.termtxt.slice(0,1).match(CSL.ALL_ROMANESQUE_REGEXP);\n            }\n            var num = state.tmp.just_did_number;\n            if (num) {\n                if (flags.condition.valueTerm) {\n                    testres = numbersOnly ? false : true;\n                } else if (!locale_term) {\n                    testres = true;\n                } else if (termStartAlpha) {\n                    testres = numbersOnly ? false : true;\n                } else if ([\"always\", \"after-number\"].indexOf(state.opt.require_comma_on_symbol) > -1) {\n                    testres = true;\n                } else {\n                    testres = false;\n                }\n            } else {\n                if (flags.condition.valueTerm) {\n                    testres = false;\n                } else if (!locale_term) {\n                    testres = false;\n                } else if (termStartAlpha) {\n                    testres = numbersOnly ? false : true;\n                } else if (state.opt.require_comma_on_symbol === \"always\") {\n                    testres = true;\n                } else {\n                    testres = false;\n                }\n            }\n        }\n        if (testres) {\n            var force_suppress = false;\n        } else {\n            var force_suppress = true;\n        }\n        if (flags.condition.not) {\n            force_suppress = !force_suppress;\n        }\n        return force_suppress;\n    },\n    \n    SYS_OPTIONS: [\n        \"prioritize_disambiguate_condition\",\n        \"csl_reverse_lookup_support\",\n        \"main_title_from_short_title\",\n        \"uppercase_subtitles\",\n        \"force_short_title_casing_alignment\",\n        \"implicit_short_title\",\n        \"split_container_title\"\n    ],\n\n    TITLE_SPLIT_REGEXP: (function() {\n        var splits = [\n            \"\\\\.\\\\s+\",\n            \"\\\\!\\\\s+\",\n            \"\\\\?\\\\s+\",\n            \"\\\\s*::*\\\\s+\",\n            \"\\\\s*—\\\\s*\",\n            \"\\\\s+\\\\-\\\\s+\",\n            \"\\\\s*\\\\-\\\\-\\\\-*\\\\s*\"\n        ]\n        return {\n            match: new RegExp(\"(\" + splits.join(\"|\") + \")\", \"g\"),\n            matchfirst: new RegExp(\"^(\" + splits.join(\"|\") + \")\"),\n            split: new RegExp(\"(?:\" + splits.join(\"|\") + \")\")\n        }\n    })(),\n\n    TITLE_SPLIT: function(str) {\n        if (!str) {\n            return str;\n        }\n        var m = str.match(CSL.TITLE_SPLIT_REGEXP.match);\n        var lst = str.split(CSL.TITLE_SPLIT_REGEXP.split);\n        for (var i=lst.length-2; i>-1; i--) {\n            lst[i] = lst[i].trim();\n            if (lst[i] && lst[i].slice(-1).toLowerCase() !== lst[i].slice(-1)) {\n                // recombine\n                lst[i] = lst[i] + m[i] + lst[i+1];\n                lst = lst.slice(0, i+1).concat(lst.slice(i+2))\n            } else {\n                // merge\n                lst = lst.slice(0, i+1).concat([m[i]]).concat(lst.slice(i+1))\n            }\n        }\n        return lst;\n    },\n    \n    GET_COURT_CLASS: function(state, Item, sortKey){\n        // Get authority as a string\n        var cls = \"\";\n        var authority = null;\n        var country = Item.jurisdiction ? Item.jurisdiction.split(\":\")[0] : null;\n        // inStyle versus in module\n        var classType = \"court_condition_classes\";\n        if (sortKey) {\n            classType = \"court_key_classes\";\n        }\n        if (country && Item.authority) {\n            if (\"string\" === typeof Item.authority) {\n                authority = Item.authority;\n            } else {\n                if (Item.authority[0] && Item.authority[0].literal) {\n                    authority = Item.authority[0].literal;\n                }\n            }\n        }\n        if (authority) {\n            if (this.lang && state.locale[this.lang].opts[classType] && state.locale[this.lang].opts[classType][country] && state.locale[this.lang].opts[classType][country][authority]) {\n                cls = state.locale[this.lang].opts[classType][country][authority];\n            } else if (state.locale[state.opt[\"default-locale\"][0]].opts[classType] && state.locale[state.opt[\"default-locale\"][0]].opts[classType][country] && state.locale[state.opt[\"default-locale\"][0]].opts[classType][country][authority]) {\n                cls = state.locale[state.opt[\"default-locale\"][0]].opts[classType][country][authority]\n            }\n        }\n        return cls;\n    },\n\n    SET_COURT_CLASSES: function(state, lang, myxml, dataObj) {\n        var nodes = myxml.getNodesByName(dataObj, 'court-class');\n        for (var pos = 0, len = myxml.numberofnodes(nodes); pos < len; pos += 1) {\n            var courtclass = nodes[pos];\n            var attributes = myxml.attributes(courtclass);\n            var cls = attributes[\"@name\"];\n            var country = attributes[\"@country\"];\n            var courts = attributes[\"@courts\"];\n            \n            // Okay, this is a hack.\n            // If state.registry IS NOT yet defined, this is an in-style declaration.\n            // If state.registry IS defined, this is an in-module declaration.\n            var classType = \"court_key_classes\";\n            if (state.registry) {\n                classType = \"court_condition_classes\";\n            }\n            \n            if (cls && country && courts) {\n                courts = courts.trim().split(/\\s+/);\n                if (!state.locale[lang].opts[classType]) {\n                    state.locale[lang].opts[classType] = {};\n                }\n                if (!state.locale[lang].opts[classType][country]) {\n                    state.locale[lang].opts[classType][country] = {};\n                }\n                for (var i=0,ilen=courts.length;i<ilen;i++) {\n                    state.locale[lang].opts[classType][country][courts[i]] = cls;\n                }\n            }\n        }\n    },\n\n    INIT_JURISDICTION_MACROS: function (state, Item, item, macroName) {\n        if (Item[\"best-jurisdiction\"]) {\n            return true;\n        }\n        if (!state.sys.retrieveStyleModule || !CSL.MODULE_MACROS[macroName] || !Item.jurisdiction) {\n            return false;\n        }\n        var jurisdictionList = state.getJurisdictionList(Item.jurisdiction);\n        // Set up a list of jurisdictions here, we will reuse it\n        if (!state.opt.jurisdictions_seen[jurisdictionList[0]]) {\n            var res = state.retrieveAllStyleModules(jurisdictionList);\n            // Okay. We have code for each of the novel modules in the\n            // hierarchy. Load them all into the processor.\n            for (var jurisdiction in res) {\n                var fallback = state.loadStyleModule(jurisdiction, res[jurisdiction]);\n                if (fallback) {\n                    if (!res[fallback]) {\n                        Object.assign(res, state.retrieveAllStyleModules([fallback]));\n                        state.loadStyleModule(fallback, res[fallback], true);\n                    }\n                }\n            }\n        }\n        var jurisdictionList = state.getJurisdictionList(Item.jurisdiction);\n        if (state.opt.parallel.enable) {\n            if (!state.parallel) {\n                state.parallel = new CSL.Parallel(state);\n            }\n        }\n        // Identify the best jurisdiction for the item and return true, otherwise return false\n        for (var i=0,ilen=jurisdictionList.length;i<ilen;i++) {\n            var jurisdiction = jurisdictionList[i];\n            if (item) {\n                if (state.juris[jurisdiction] && !item[\"best-jurisdiction\"] && state.juris[jurisdiction].types.locator) {\n                    Item[\"best-jurisdiction\"] = jurisdiction;\n                }\n            }\n            if(state.juris[jurisdiction] && state.juris[jurisdiction].types[Item.type]) {\n                Item[\"best-jurisdiction\"] = jurisdiction;\n                return true;\n            }\n        }\n        return false;\n    }\n};\n\n/**\n * Functions for parsing an XML object converted to JSON.\n */\n\n/*\n  Style and locale JSON should be formatted as follows. Note that\n  an empty literal should be set as an explicit empty strings within\n  children:[]\n  \n  {\n    name:\"term\",\n    children:[\n      \"\"\n    ],\n    attrs:{\n      name:\"author\"\n    }\n  }\n\n  The following script will generate correctly formatted JSON\n  from a CSL style or locale file:\n*/\n\nCSL.XmlJSON = function (dataObj) {\n    this.dataObj = dataObj;\n    this.institution = {\n        name:\"institution\",\n        attrs:{\n            \"institution-parts\":\"long\",\n            \"delimiter\":\", \"\n        },\n        children:[\n            {\n                name:\"institution-part\",\n                attrs:{\n                    name:\"long\"\n                },\n                children:[]\n            }\n        ]\n    };\n};\n\n/**\n * No need for cleaning with native JSON.\n */\nCSL.XmlJSON.prototype.clean = function (json) {\n    return json;\n};\n\n\n/**\n * Methods to call on a node.\n */\nCSL.XmlJSON.prototype.getStyleId = function (myjson, styleName) {\n    var tagName = 'id';\n    if (styleName) {\n        tagName = 'title';\n    }\n    var ret = \"\";\n    var children = myjson.children;\n    for (var i=0,ilen=children.length;i<ilen;i++) {\n        if (children[i].name === 'info') {\n            var grandkids = children[i].children;\n            for (var j=0,jlen=grandkids.length;j<jlen;j++) {\n                if (grandkids[j].name === tagName) {\n                    ret = grandkids[j].children[0];\n                }\n            }\n        }\n    }\n    return ret;\n};\n\nCSL.XmlJSON.prototype.children = function (myjson) {\n    //print(\"children()\");\n    if (myjson && myjson.children.length) {\n        return myjson.children.slice();\n    } else {\n        return false;\n    }\n};\n\nCSL.XmlJSON.prototype.nodename = function (myjson) {\n    //print(\"nodename()\");\n    return myjson ? myjson.name : null;\n};\n\nCSL.XmlJSON.prototype.attributes = function (myjson) {\n    //print(\"attributes()\");\n    var ret = {};\n    for (var attrname in myjson.attrs) {\n        ret[\"@\"+attrname] = myjson.attrs[attrname];\n    }\n    return ret;\n};\n\n\nCSL.XmlJSON.prototype.content = function (myjson) {\n    //print(\"content()\");\n    // xmldom.js and xmle4x.js have \"undefined\" as default\n    var ret = \"\";\n    // This only catches content at first level, but that is good enough\n    // for us.\n    if (!myjson || !myjson.children) {\n        return ret;\n    }\n    for (var i=0, ilen=myjson.children.length; i < ilen; i += 1) {\n        if (\"string\" === typeof myjson.children[i]) {\n            ret += myjson.children[i];\n        }\n    }\n    return ret;\n};\n\n\nCSL.XmlJSON.prototype.namespace = {}\n\nCSL.XmlJSON.prototype.numberofnodes = function (myjson) {\n    //print(\"numberofnodes()\");\n    if (myjson && \"number\" == typeof myjson.length) {\n        return myjson.length;\n    } else {\n        return 0;\n    }\n};\n\n// getAttributeName() removed. Looks like it was not being used.\n\nCSL.XmlJSON.prototype.getAttributeValue = function (myjson,name,namespace) {\n    //print(\"getAttributeValue()\");\n    var ret = \"\";\n    if (namespace) {\n        name = namespace+\":\"+name;\n    }\n    if (myjson) {\n        if (myjson.attrs) {\n            if (myjson.attrs[name]) {\n                ret = myjson.attrs[name];\n            } else {\n                ret = \"\";\n            }\n        }\n    }\n    return ret;\n}\n\nCSL.XmlJSON.prototype.getNodeValue = function (myjson,name) {\n    //print(\"getNodeValue()\");\n    var ret = \"\";\n    if (name){\n        for (var i=0, ilen=myjson.children.length; i < ilen; i += 1) {\n            if (myjson.children[i].name === name) {\n                // This will always be Object() unless empty\n                if (myjson.children[i].children.length) {\n                    ret = myjson.children[i];\n                } else {\n                    ret = \"\";\n                }\n            }\n        }\n    } else if (myjson) {\n        ret = myjson;\n    }\n    // Just being careful here, following the former DOM code. The JSON object we receive \n    // for this should be fully normalized.\n    if (ret && ret.children && ret.children.length == 1 && \"string\" === typeof ret.children[0]) {\n        ret = ret.children[0];\n    }\n    return ret;\n}\n\nCSL.XmlJSON.prototype.setAttributeOnNodeIdentifiedByNameAttribute = function (myjson,nodename,partname,attrname,val) {\n    //print(\"setAttributeOnNodeIdentifiedByNameAttribute()\");\n    var pos, len, xml, nodes, node;\n    if (attrname.slice(0,1) === '@'){\n        attrname = attrname.slice(1);\n    }\n    // In the one place this is used in citeproc-js code, it doesn't need to recurse.\n    for (var i=0,ilen=myjson.children.length; i<ilen; i += 1) {\n        if (myjson.children[i].name === nodename && myjson.children[i].attrs.name === partname) {\n            myjson.children[i].attrs[attrname] = val;\n        }\n    }\n}\n\nCSL.XmlJSON.prototype.deleteNodeByNameAttribute = function (myjson,val) {\n    //print(\"deleteNodeByNameAttribute()\");\n    var i, ilen;\n    for (i = 0, ilen = myjson.children.length; i < ilen; i += 1) {\n        if (!myjson.children[i] || \"string\" === typeof myjson.children[i]) {\n            continue;\n        }\n        if (myjson.children[i].attrs.name == val) {\n            myjson.children = myjson.children.slice(0,i).concat(myjson.children.slice(i+1));\n        }\n    }\n}\n\nCSL.XmlJSON.prototype.deleteAttribute = function (myjson,attrname) {\n    //print(\"deleteAttribute()\");\n    var i, ilen;\n    if (\"undefined\" !== typeof myjson.attrs[attrname]) {\n        myjson.attrs.pop(attrname);\n    }\n}\n\nCSL.XmlJSON.prototype.setAttribute = function (myjson,attr,val) {\n    //print(\"setAttribute()\");\n    myjson.attrs[attr] = val;\n    return false;\n}\n\nCSL.XmlJSON.prototype.nodeCopy = function (myjson,clone) {\n    //print(\"nodeCopy()\");\n    if (!clone) {\n        var clone = {};\n    }\n    if (\"object\" === typeof clone && \"undefined\" === typeof clone.length) {\n        // myjson is an object\n        for (var key in myjson) {\n            if (\"string\" === typeof myjson[key]) {\n                clone[key] = myjson[key];\n            } else if (\"object\" === typeof myjson[key]) {\n                if (\"undefined\" === typeof myjson[key].length) {\n                    clone[key] = this.nodeCopy(myjson[key],{});\n                } else {\n                    clone[key] = this.nodeCopy(myjson[key],[]);\n                }\n            }\n        }\n    } else {\n        // myjson is an array\n        for (var i=0,ilen=myjson.length;i<ilen; i += 1) {\n            if (\"string\" === typeof myjson[i]) {\n                clone[i] = myjson[i];\n            } else {\n                // If it's at the first level of an array, it's an object.\n                clone[i] = this.nodeCopy(myjson[i],{});\n            }\n        }\n    }\n    return clone;\n}\n\nCSL.XmlJSON.prototype.getNodesByName = function (myjson,name,nameattrval,ret) {\n    //print(\"getNodesByName()\");\n    var nodes, node, pos, len;\n    if (!ret) {\n        var ret = [];\n    }\n    if (!myjson || !myjson.children) {\n        return ret;\n    }\n    if (name === myjson.name) {\n        if (nameattrval) {\n            if (nameattrval === myjson.attrs.name) {\n                ret.push(myjson);\n            }\n        } else {\n            ret.push(myjson);\n        }\n    }\n    for (var i=0,ilen=myjson.children.length;i<ilen;i+=1){\n        if (\"object\" !== typeof myjson.children[i]) {\n            continue;\n        }\n        this.getNodesByName(myjson.children[i],name,nameattrval,ret);\n    }\n    return ret;\n}\n\nCSL.XmlJSON.prototype.nodeNameIs = function (myjson,name) {\n    //print(\"nodeNameIs()\");\n    if (typeof myjson === \"undefined\") {\n        return false;\n    }\n    if (name == myjson.name) {\n        return true;\n    }\n    return false;\n}\n\nCSL.XmlJSON.prototype.makeXml = function (myjson) {\n    //print(\"makeXml()\");\n    if (\"string\" === typeof myjson) {\n        if (myjson.slice(0, 1) === \"<\") {\n            myjson = this.jsonStringWalker.walkToObject(myjson);\n        } else {\n            myjson = JSON.parse(myjson);\n        }\n    }\n    return myjson;\n};\n\nCSL.XmlJSON.prototype.insertChildNodeAfter = function (parent,node,pos,datejson) {\n    //print(\"insertChildNodeAfter()\");\n    // Function is misnamed: this replaces the node\n    for (var i=0,ilen=parent.children.length;i<ilen;i+=1) {\n        if (node === parent.children[i]) {\n            parent.children = parent.children.slice(0,i).concat([datejson]).concat(parent.children.slice(i+1));\n            break;\n        }\n    }\n    return parent;\n};\n\n\nCSL.XmlJSON.prototype.insertPublisherAndPlace = function(myjson) {\n    if (myjson.name === \"group\") {\n        var useme = true;\n        var mustHaves = [\"publisher\",\"publisher-place\"];\n        for (var i=0,ilen=myjson.children.length;i<ilen;i+=1) {\n            var haveVarname = mustHaves.indexOf(myjson.children[i].attrs.variable);\n            var isText = myjson.children[i].name === \"text\";\n            if (isText && haveVarname > -1 && !myjson.children[i].attrs.prefix && !myjson.children[i].attrs.suffix) {\n                mustHaves = mustHaves.slice(0,haveVarname).concat(mustHaves.slice(haveVarname+1));\n            } else {\n                useme = false;\n                break;\n            }\n        }\n        if (useme && !mustHaves.length) {\n            myjson.attrs[\"has-publisher-and-publisher-place\"] = true;\n       }\n    }\n    for (var i=0,ilen=myjson.children.length;i<ilen;i+=1) {\n        if (\"object\" === typeof myjson.children[i]) {\n            this.insertPublisherAndPlace(myjson.children[i]);\n        }\n    }    \n}\n/*\nCSL.XmlJSON.prototype.insertPublisherAndPlace = function(myxml) {\n    var group = myxml.getElementsByTagName(\"group\");\n    for (var i = 0, ilen = group.length; i < ilen; i += 1) {\n        var node = group.item(i);\n        var skippers = [];\n        for (var j = 0, jlen = node.childNodes.length; j < jlen; j += 1) {\n            if (node.childNodes.item(j).nodeType !== 1) {\n                skippers.push(j);\n            }\n        }\n        if (node.childNodes.length - skippers.length === 2) {\n            var twovars = [];\n            for (var j = 0, jlen = 2; j < jlen; j += 1) {\n                if (skippers.indexOf(j) > -1) {\n                    continue;\n                }\n                var child = node.childNodes.item(j);                    \n                var subskippers = [];\n                for (var k = 0, klen = child.childNodes.length; k < klen; k += 1) {\n                    if (child.childNodes.item(k).nodeType !== 1) {\n                        subskippers.push(k);\n                    }\n                }\n                if (child.childNodes.length - subskippers.length === 0) {\n                    twovars.push(child.getAttribute('variable'));\n                    if (child.getAttribute('suffix')\n                        || child.getAttribute('prefix')) {\n                        twovars = [];\n                        break;\n                    }\n                }\n            }\n            if (twovars.indexOf(\"publisher\") > -1 && twovars.indexOf(\"publisher-place\") > -1) {\n                node.setAttribute('has-publisher-and-publisher-place', true);\n            }\n        }\n    }\n};\n*/\n\nCSL.XmlJSON.prototype.isChildOfSubstitute = function(parents) {\n    if (parents.length > 0) {\n        var myparents = parents.slice();\n        var parent = myparents.pop();\n        if (parent === \"substitute\") {\n            return true;\n        } else {\n            return this.isChildOfSubstitute(myparents);\n        }\n    }\n    return false;\n};\n\nCSL.XmlJSON.prototype.addMissingNameNodes = function(myjson,parents) {\n    if (!parents) {\n        parents = [];\n    }\n    if (myjson.name === \"names\") {\n        // Trawl through children to decide whether a name node is needed here\n        if (!this.isChildOfSubstitute(parents)) {\n            var addName = true;\n            for (var i=0,ilen=myjson.children.length;i<ilen;i++) {\n                if (myjson.children[i].name === \"name\") {\n                    addName = false;\n                    break;\n                }\n            }\n            if (addName) {\n                myjson.children = [{name:\"name\",attrs:{},children:[]}].concat(myjson.children);\n            }\n        }\n    }\n    parents.push(myjson.name);\n    for (var i=0,ilen=myjson.children.length;i<ilen;i+=1) {\n        if (\"object\" === typeof myjson.children[i]) {\n            this.addMissingNameNodes(myjson.children[i],parents);\n        }\n    }\n    parents.pop();\n}\n\n\nCSL.XmlJSON.prototype.addInstitutionNodes = function(myjson) {\n    //print(\"addInstitutionNodes()\");\n    var names, thenames, institution, theinstitution, name, thename, xml, pos, len;\n    // The idea here is to map relevant attributes from name and nampart=family\n    // to the \"long\" institution-part node, when and only when forcing insert\n    // of the default node.\n    if (myjson.name === \"names\") {\n        // do stuff\n        var attributes = {};\n        var insertPos = -1;\n        for (var i=0,ilen=myjson.children.length;i<ilen;i+=1) {\n            if (myjson.children[i].name == \"name\") {\n                for (var key in myjson.children[i].attrs) {\n                    attributes[key] = myjson.children[i].attrs[key];\n                }\n                attributes.delimiter = myjson.children[i].attrs.delimiter;\n                attributes.and = myjson.children[i].attrs.and;\n                insertPos = i;\n                for (var k=0,klen=myjson.children[i].children.length;k<klen;k+=1) {\n                    if (myjson.children[i].children[k].attrs.name !== 'family') {\n                        continue;\n                    }\n                    for (var key in myjson.children[i].children[k].attrs) {\n                        attributes[key] = myjson.children[i].children[k].attrs[key];\n                    }\n                }\n            }\n            if (myjson.children[i].name == \"institution\") {\n                insertPos = -1;\n                break;\n            }\n        }\n        if (insertPos > -1) {\n            var institution = this.nodeCopy(this.institution);\n            for (var i=0,ilen = CSL.INSTITUTION_KEYS.length;i<ilen;i+=1) {\n                var attrname = CSL.INSTITUTION_KEYS[i];\n                if (\"undefined\" !== typeof attributes[attrname]) {\n                    institution.children[0].attrs[attrname] = attributes[attrname];\n                }\n                if (attributes.delimiter) {\n                    institution.attrs.delimiter = attributes.delimiter;\n                }\n                if (attributes.and) {\n                    institution.attrs.and = attributes.and;\n                }\n            }\n            myjson.children = myjson.children.slice(0,insertPos+1).concat([institution]).concat(myjson.children.slice(insertPos+1));\n        }\n    }\n    for (var i=0,ilen=myjson.children.length;i<ilen;i+=1) {\n        if (\"string\" === typeof myjson.children[i]) {\n            continue;\n        }\n        // Recurse\n        this.addInstitutionNodes(myjson.children[i]);\n    }\n}\nCSL.XmlJSON.prototype.flagDateMacros = function(myjson) {\n    // print(\"flagDateMacros()\");\n    for (var i=0,ilen=myjson.children.length;i<ilen;i+=1) {\n        if (myjson.children[i].name === \"macro\") {\n            if (this.inspectDateMacros(myjson.children[i])) {\n                myjson.children[i].attrs[\"macro-has-date\"] = \"true\";\n            }\n        }\n    }\n}\nCSL.XmlJSON.prototype.inspectDateMacros = function(myjson) {\n    //print(\"inspectDateMacros()\");\n    if (!myjson || !myjson.children) {\n        return false;\n    }\n    if (myjson.name === \"date\") {\n        return true;\n    } else {\n        for (var i=0,ilen=myjson.children.length;i<ilen;i+=1) {\n            if (this.inspectDateMacros(myjson.children[i])) {\n                return true;\n            }\n        }\n    }\n    return false;\n}\n\n/*\n * Clean serialized XML\n */\nCSL.stripXmlProcessingInstruction = function (xml) {\n    if (!xml) {\n        return xml;\n    }\n    xml = xml.replace(/^<\\?[^?]+\\?>/, \"\");\n    xml = xml.replace(/<!--[^>]+-->/g, \"\");\n    xml = xml.replace(/^\\s+/g, \"\");\n    xml = xml.replace(/\\s+$/g, \"\");\n    return xml;\n};\n\n\n/*\n * String parser for XML inputs\n */\nCSL.parseXml = function(str) {\n\n    var _pos = 0;\n    var _obj = {children:[]};\n    var _stack = [_obj.children];\n\n    function _listifyString(str) {\n        str = str.split(/(?:\\r\\n|\\n|\\r)/).join(\" \").replace(/>[\t ]+</g, \"><\").replace(/<\\!--.*?-->/g, \"\");\n        var lst = str.split(\"><\");\n        var stylePos = null;\n        for (var i=0,ilen=lst.length;i<ilen;i++) {\n            if (i > 0) {\n                lst[i] = \"<\" + lst[i];\n            }\n            if (i < (lst.length-1)) {\n                lst[i] = lst[i] + \">\";\n            }\n            if (\"number\" != typeof stylePos) {\n                if (lst[i].slice(0, 7) === \"<style \" || lst[i].slice(0, 8) == \"<locale \") {\n                    stylePos = i;\n                }\n            }\n        }\n        lst = lst.slice(stylePos);\n        // Combine open/close elements for empty terms,\n        // so that they will be passed through correctly\n        // as empty strings.\n        for (var i=lst.length-2;i>-1;i--) {\n            if (lst[i].slice(1).indexOf(\"<\") === -1) {\n                var stub = lst[i].slice(0, 5);\n                if (lst[i].slice(-2) !== \"/>\") {\n                    if (stub === \"<term\") {\n                        if (lst[i+1].slice(0, 6) === \"</term\") {\n                            lst[i] = lst[i] + lst[i+1];\n                            lst = lst.slice(0, i+1).concat(lst.slice(i+2));\n                        }\n                    } else if ([\"<sing\", \"<mult\"].indexOf(stub) > -1) {\n                        if (lst[i].slice(-2) !== \"/>\" && lst[i+1].slice(0, 1) === \"<\") {\n                            lst[i] = lst[i] + lst[i+1];\n                            lst = lst.slice(0, i+1).concat(lst.slice(i+2));\n                        }\n                    }\n                }\n            }\n        }\n        return lst;\n    }\n\n    function _decodeHtmlEntities(str) {\n        return str\n            .split(\"&amp;\").join(\"&\")\n            .split(\"&quot;\").join(\"\\\"\")\n            .split(\"&gt;\").join(\">\").split(\"&lt;\").join(\"<\")\n            .replace(/&#([0-9]{1,6});/gi, function(match, numStr) {\n                var num = parseInt(numStr, 10); // read num as normal number\n                return String.fromCharCode(num);\n            })\n            .replace(/&#x([a-f0-9]{1,6});/gi, function(match, numStr){\n                var num = parseInt(numStr, 16); // read num as hex\n                return String.fromCharCode(num);\n            });\n    }\n\n    function _getAttributes(elem) {\n        var m = elem.match(/([^\\'\\\"=\t ]+)=(?:\\\"[^\\\"]*\\\"|\\'[^\\']*\\')/g);\n        if (m) {\n            for (var i=0,ilen=m.length;i<ilen;i++) {\n                m[i] = m[i].replace(/=.*/, \"\");\n            }\n        }\n        return m;\n    }\n\n    function _getAttribute(elem, attr) {\n        var rex = RegExp('^.*[\t ]+' + attr + '=(\\\"(?:[^\\\"]*)\\\"|\\'(?:[^\\']*)\\').*$');\n        var m = elem.match(rex);\n        return m ? m[1].slice(1, -1) : null;\n    }\n\n    function _getTagName(elem) {\n        var rex = RegExp(\"^<([^\t />]+)\");\n        var m = elem.match(rex);\n        return m ? m[1] : null;\n    }\n    \n\n    function _castObjectFromOpeningTag(elem) {\n        var obj = {};\n        obj.name = _getTagName(elem);\n        obj.attrs = {};\n        var attributes = _getAttributes(elem);\n        if (attributes) {\n            for (var i=0,ilen=attributes.length;i<ilen;i++) {\n                var attr = {\n                    name: attributes[i],\n                    value: _getAttribute(elem, attributes[i])\n                }\n                obj.attrs[attr.name] = _decodeHtmlEntities(attr.value);\n            }\n        }\n        obj.children = [];\n        return obj;\n    }\n\n    function _extractTextFromCompositeElement(elem) {\n        var m = elem.match(/^.*>([^<]*)<.*$/);\n        return _decodeHtmlEntities(m[1]);\n    }\n\n    function _appendToChildren(obj) {\n        _stack.slice(-1)[0].push(obj);\n    }\n\n    function _extendStackWithNewChildren(obj) {\n        _stack.push(obj.children);\n    }\n\n    function processElement(elem) {\n        var obj;\n        if (elem.slice(1).indexOf('<') > -1) {\n            // withtext\n            var tag = elem.slice(0, elem.indexOf('>')+1);\n            obj = _castObjectFromOpeningTag(tag);\n            obj.children = [_extractTextFromCompositeElement(elem)];\n            _appendToChildren(obj);\n        } else if (elem.slice(-2) === '/>') {\n            // singleton\n            obj = _castObjectFromOpeningTag(elem);\n            // Empty term as singleton\n            if (_getTagName(elem) === 'term') {\n                obj.children.push('');\n            }\n            _appendToChildren(obj);\n        } else if (elem.slice(0, 2) === '</') {\n            // close\n            _stack.pop();\n        } else {\n            // open\n            obj = _castObjectFromOpeningTag(elem);\n            _appendToChildren(obj)\n            _extendStackWithNewChildren(obj);\n        }\n    }\n\n    var lst = _listifyString(str);\n\n    for (var i=0,ilen=lst.length;i<ilen;i++) {\n        var elem = lst[i];\n        processElement(elem);\n    }\n    return _obj.children[0];\n}\n\n/**\n * Functions for parsing an XML object using E4X.\n */\n\nCSL.XmlDOM = function (dataObj) {\n    this.dataObj = dataObj;\n    if (\"undefined\" == typeof DOMParser) {\n        DOMParser = function() {};\n        DOMParser.prototype.parseFromString = function(str, contentType) {\n            if (\"undefined\" != typeof ActiveXObject) {\n                var xmldata = new ActiveXObject('MSXML.DomDocument');\n                xmldata.async = false;\n                xmldata.loadXML(str);\n                return xmldata;\n            } else if (\"undefined\" != typeof XMLHttpRequest) {\n                var xmldata = new XMLHttpRequest;\n                if (!contentType) {\n                    contentType = 'text/xml';\n                }\n                xmldata.open('GET', 'data:' + contentType + ';charset=utf-8,' + encodeURIComponent(str), false);\n                if(xmldata.overrideMimeType) {\n                    xmldata.overrideMimeType(contentType);\n                }\n                xmldata.send(null);\n                return xmldata.responseXML;\n            } else if (\"undefined\" != typeof marknote) {\n                var parser = new marknote.Parser();\n                return parser.parse(str);\n            }\n        };\n        this.hasAttributes = function (node) {\n            var ret;\n            if (node.attributes && node.attributes.length) {\n                ret = true;\n            } else {\n                ret = false;\n            }\n            return ret;\n        };\n    } else {\n        /*\n        this.hasAttributes = function (node) {\n            return node[\"hasAttributes\"]();\n        };\n        */\n        this.hasAttributes = function (node) {\n            var ret;\n            if (node.attributes && node.attributes.length) {\n                ret = true;\n            } else {\n                ret = false;\n            }\n            return ret;\n        };\n    }\n    this.importNode = function (doc, srcElement) {\n        var ret;\n        if (\"undefined\" == typeof doc.importNode) {\n            ret = this._importNode(doc, srcElement, true);\n        } else {\n            ret = doc.importNode(srcElement, true);\n        }\n        return ret;\n    };\n    // In case importNode is not available.\n    // Thx + hat tip to Anthony T. Holdener III\n    // http://www.alistapart.com/articles/crossbrowserscripting\n    // cases 3, 4, 8 = text, cdata, comment\n    this._importNode = function(doc, node, allChildren) {\n        switch (node.nodeType) {\n            // element node\n            case 1:\n                var newNode = doc.createElement(node.nodeName);\n                if (node.attributes && node.attributes.length > 0)\n                    for (var i = 0, il = node.attributes.length; i < il;)\n                        newNode.setAttribute(node.attributes[i].nodeName, node.getAttribute(node.attributes[i++].nodeName));\n                    if (allChildren && node.childNodes && node.childNodes.length > 0)\n                        for (var i = 0, il = node.childNodes.length; i < il;)\n                            newNode.appendChild(this._importNode(doc, node.childNodes[i++], allChildren));\n                return newNode;\n                break;\n            case 3:\n            case 4:\n            case 8:\n                // Drop comments on the floor as well.\n                //return doc.createTextNode(node.nodeValue);\n                //break;\n        }\n    };\n    this.parser = new DOMParser();\n\n    // This seems horribly tormented, but there might be a reason for it.\n    // Perhaps this was the only way I found to get namespacing to work ... ?\n    var str = \"<docco><institution institution-parts=\\\"long\\\" delimiter=\\\", \\\" substitute-use-first=\\\"1\\\" use-last=\\\"1\\\"><institution-part name=\\\"long\\\"/></institution></docco>\";\n    var inst_doc = this.parser.parseFromString(str, \"text/xml\");\n    var inst_node = inst_doc.getElementsByTagName(\"institution\");\n    this.institution = inst_node.item(0);\n    var inst_part_node = inst_doc.getElementsByTagName(\"institution-part\");\n    this.institutionpart = inst_part_node.item(0);\n    this.ns = \"http://purl.org/net/xbiblio/csl\";\n};\n\n/**\n * No need for cleaning with the DOM, I think.  This will probably just be a noop.\n * But first, let's get XML mode switching up and running.\n */\nCSL.XmlDOM.prototype.clean = function (xml) {\n    xml = xml.replace(/<\\?[^?]+\\?>/g, \"\");\n    xml = xml.replace(/<![^>]+>/g, \"\");\n    xml = xml.replace(/^\\s+/, \"\");\n    xml = xml.replace(/\\s+$/, \"\");\n    xml = xml.replace(/^\\n*/, \"\");\n    return xml;\n};\n\n\n/**\n * Methods to call on a node.\n */\nCSL.XmlDOM.prototype.getStyleId = function (myxml, styleName) {\n    var text = \"\";\n    var tagName = \"id\";\n    if (styleName) {\n        tagName = \"title\";\n    }\n    var node = myxml.getElementsByTagName(tagName);\n    if (node && node.length) {\n        node = node.item(0);\n    }\n    if (node) {\n        // W3C conformant browsers\n        text = node.textContent;\n    }\n    if (!text) {\n        // Opera, IE 6 & 7\n        text = node.innerText;\n    }\n    if (!text) {\n        // Safari\n        text = node.innerHTML;\n    }\n    return text;\n};\n\nCSL.XmlDOM.prototype.children = function (myxml) {\n    var children, pos, len, ret;\n    if (myxml) {\n        ret = [];\n        children = myxml.childNodes;\n        for (pos = 0, len = children.length; pos < len; pos += 1) {\n            if (children[pos].nodeName != \"#text\") {\n                ret.push(children[pos]);\n            }\n        }\n        return ret;\n    } else {\n        return [];\n    }\n};\n\nCSL.XmlDOM.prototype.nodename = function (myxml) {\n    var ret = myxml.nodeName;\n    return ret;\n};\n\nCSL.XmlDOM.prototype.attributes = function (myxml) {\n    var ret, attrs, attr, key, xml, pos, len;\n    ret = new Object();\n    if (myxml && this.hasAttributes(myxml)) {\n        attrs = myxml.attributes;\n        for (pos = 0, len=attrs.length; pos < len; pos += 1) {\n            attr = attrs[pos];\n            ret[\"@\" + attr.name] = attr.value;\n        }\n    }\n    return ret;\n};\n\n\nCSL.XmlDOM.prototype.content = function (myxml) {\n    var ret;\n    if (\"undefined\" != typeof myxml.textContent) {\n        ret = myxml.textContent;\n    } else if (\"undefined\" != typeof myxml.innerText) {\n        ret = myxml.innerText;\n    } else {\n        ret = myxml.txt;\n    }\n    return ret;\n};\n\n\nCSL.XmlDOM.prototype.namespace = {\n    \"xml\":\"http://www.w3.org/XML/1998/namespace\"\n}\n\nCSL.XmlDOM.prototype.numberofnodes = function (myxml) {\n    if (myxml) {\n        return myxml.length;\n    } else {\n        return 0;\n    }\n};\n\nCSL.XmlDOM.prototype.getAttributeName = function (attr) {\n    var ret = attr.name;\n    return ret;\n}\n\nCSL.XmlDOM.prototype.getAttributeValue = function (myxml,name,namespace) {\n    var ret = \"\";\n    if (namespace) {\n        name = namespace+\":\"+name;\n    }\n    if (myxml && this.hasAttributes(myxml) && myxml.getAttribute(name)) {\n        ret = myxml.getAttribute(name);\n    }\n    return ret;\n}\n\n//\n// Can't this be, you know ... simplified?\n//\nCSL.XmlDOM.prototype.getNodeValue = function (myxml,name) {\n    var ret = null;\n    if (name){\n        var vals = myxml.getElementsByTagName(name);\n        if (vals.length > 0) {\n            if (\"undefined\" != typeof vals[0].textContent) {\n                ret = vals[0].textContent;\n            } else if (\"undefined\" != typeof vals[0].innerText) {\n                ret = vals[0].innerText;\n            } else {\n                ret = vals[0].text;\n            }\n        }\n    }\n    if (ret === null && myxml && myxml.childNodes && (myxml.childNodes.length == 0 || (myxml.childNodes.length == 1 && myxml.firstChild.nodeName == \"#text\"))) {\n        if (\"undefined\" != typeof myxml.textContent) {\n            ret = myxml.textContent;\n        } else if (\"undefined\" != typeof myxml.innerText) {\n            ret = myxml.innerText;\n        } else {\n            ret = myxml.text;\n        }\n    }\n    if (ret === null) {\n        ret = myxml;\n    }\n    return ret;\n}\n\nCSL.XmlDOM.prototype.setAttributeOnNodeIdentifiedByNameAttribute = function (myxml,nodename,partname,attrname,val) {\n    var pos, len, xml, nodes, node;\n    if (attrname.slice(0,1) === '@'){\n        attrname = attrname.slice(1);\n    }\n    nodes = myxml.getElementsByTagName(nodename);\n    for (pos = 0, len = nodes.length; pos < len; pos += 1) {\n        node = nodes[pos];\n        if (node.getAttribute(\"name\") != partname) {\n            continue;\n        }\n        node.setAttribute(attrname, val);\n    }\n}\n\nCSL.XmlDOM.prototype.deleteNodeByNameAttribute = function (myxml,val) {\n    var pos, len, node, nodes;\n    nodes = myxml.childNodes;\n    for (pos = 0, len = nodes.length; pos < len; pos += 1) {\n        node = nodes[pos];\n        if (!node || node.nodeType == node.TEXT_NODE) {\n            continue;\n        }\n        if (this.hasAttributes(node) && node.getAttribute(\"name\") == val) {\n            myxml.removeChild(nodes[pos]);\n        }\n    }\n}\n\nCSL.XmlDOM.prototype.deleteAttribute = function (myxml,attr) {\n    myxml.removeAttribute(attr);\n}\n\nCSL.XmlDOM.prototype.setAttribute = function (myxml,attr,val) {\n    if (!myxml.ownerDocument) {\n        myxml = myxml.firstChild;\n    }\n    // \"unknown\" to satisfy IE8, which crashes when setAttribute\n    // is checked directly as a property, and report its type as\n    // \"unknown\".\n    // Many thanks to Phil Lord for tracing the cause of the fault.\n    if ([\"function\", \"unknown\"].indexOf(typeof myxml.setAttribute) > -1) {\n        myxml.setAttribute(attr, val);\n    }\n    return false;\n}\n\nCSL.XmlDOM.prototype.nodeCopy = function (myxml) {\n    var cloned_node = myxml.cloneNode(true);\n    return cloned_node;\n}\n\nCSL.XmlDOM.prototype.getNodesByName = function (myxml,name,nameattrval) {\n    var ret, nodes, node, pos, len;\n    ret = [];\n    nodes = myxml.getElementsByTagName(name);\n    for (pos = 0, len = nodes.length; pos < len; pos += 1) {\n        node = nodes.item(pos);\n        if (nameattrval && !(this.hasAttributes(node) && node.getAttribute(\"name\") == nameattrval)) {\n//        if (nameattrval && !(this.attributes && node.attributes.name && node.attributes.name.value == nameattrval)) {\n            continue;\n        }\n        ret.push(node);\n    }\n    return ret;\n}\n\nCSL.XmlDOM.prototype.nodeNameIs = function (myxml,name) {\n    if (name == myxml.nodeName) {\n        return true;\n    }\n    return false;\n}\n\nCSL.XmlDOM.prototype.makeXml = function (myxml) {\n    var ret, topnode;\n    if (!myxml) {\n        myxml = \"<docco><bogus/></docco>\";\n    }\n    myxml = myxml.replace(/\\s*<\\?[^>]*\\?>\\s*\\n*/g, \"\");\n    var nodetree = this.parser.parseFromString(myxml, \"application/xml\");\n    return nodetree.firstChild;\n};\n\nCSL.XmlDOM.prototype.insertChildNodeAfter = function (parent,node,pos,datexml) {\n    var myxml, xml;\n    myxml = this.importNode(node.ownerDocument, datexml);\n    parent.replaceChild(myxml, node);\n     return parent;\n};\n\nCSL.XmlDOM.prototype.insertPublisherAndPlace = function(myxml) {\n    var group = myxml.getElementsByTagName(\"group\");\n    for (var i = 0, ilen = group.length; i < ilen; i += 1) {\n        var node = group.item(i);\n        var skippers = [];\n        for (var j = 0, jlen = node.childNodes.length; j < jlen; j += 1) {\n            if (node.childNodes.item(j).nodeType !== 1) {\n                skippers.push(j);\n            }\n        }\n        if (node.childNodes.length - skippers.length === 2) {\n            var twovars = [];\n            for (var j = 0, jlen = 2; j < jlen; j += 1) {\n                if (skippers.indexOf(j) > -1) {\n                    continue;\n                }\n                var child = node.childNodes.item(j);                    \n                var subskippers = [];\n                for (var k = 0, klen = child.childNodes.length; k < klen; k += 1) {\n                    if (child.childNodes.item(k).nodeType !== 1) {\n                        subskippers.push(k);\n                    }\n                }\n                if (child.childNodes.length - subskippers.length === 0) {\n                    twovars.push(child.getAttribute('variable'));\n                    if (child.getAttribute('suffix')\n                        || child.getAttribute('prefix')) {\n                        twovars = [];\n                        break;\n                    }\n                }\n            }\n            if (twovars.indexOf(\"publisher\") > -1 && twovars.indexOf(\"publisher-place\") > -1) {\n                node.setAttribute('has-publisher-and-publisher-place', true);\n            }\n        }\n    }\n};\n\nCSL.XmlDOM.prototype.isChildOfSubstitute = function(node) {\n    if (node.parentNode) {\n        if (node.parentNode.tagName.toLowerCase() === \"substitute\") {\n            return true;\n        } else {\n            return this.isChildOfSubstitute(node.parentNode);\n        }\n    }\n    return false;\n};\n\nCSL.XmlDOM.prototype.addMissingNameNodes = function(myxml) {\n    var nameslist = myxml.getElementsByTagName(\"names\");\n    for (var i = 0, ilen = nameslist.length; i < ilen; i += 1) {\n        var names = nameslist.item(i);\n        var namelist = names.getElementsByTagName(\"name\");\n        if ((!namelist || namelist.length === 0)\n            && !this.isChildOfSubstitute(names)) {\n            \n            var doc = names.ownerDocument;\n            var name = doc.createElement(\"name\");\n            names.appendChild(name);\n        }\n    }\n};\n\n\nCSL.XmlDOM.prototype.addInstitutionNodes = function(myxml) {\n    var names, thenames, institution, theinstitution, theinstitutionpart, name, thename, xml, pos, len;\n    names = myxml.getElementsByTagName(\"names\");\n    for (pos = 0, len = names.length; pos < len; pos += 1) {\n        thenames = names.item(pos);\n        name = thenames.getElementsByTagName(\"name\");\n        if (name.length == 0) {\n            continue;\n        }\n        institution = thenames.getElementsByTagName(\"institution\");\n        if (institution.length == 0) {\n            theinstitution = this.importNode(myxml.ownerDocument, this.institution);\n            theinstitutionpart = theinstitution.getElementsByTagName(\"institution-part\").item(0);\n            thename = name.item(0);\n            thenames.insertBefore(theinstitution, thename.nextSibling);\n            for (var j = 0, jlen = CSL.INSTITUTION_KEYS.length; j < jlen; j += 1) {\n                var attrname = CSL.INSTITUTION_KEYS[j];\n                var attrval = thename.getAttribute(attrname);\n                if (attrval) {\n                    theinstitutionpart.setAttribute(attrname, attrval);\n                }\n            }\n            var nameparts = thename.getElementsByTagName(\"name-part\");\n            for (var j = 0, jlen = nameparts.length; j < jlen; j += 1) {\n                if ('family' === nameparts[j].getAttribute('name')) {\n                    for (var k = 0, klen = CSL.INSTITUTION_KEYS.length; k < klen; k += 1) {\n                        var attrname = CSL.INSTITUTION_KEYS[k];\n                        var attrval = nameparts[j].getAttribute(attrname);\n                        if (attrval) {\n                            theinstitutionpart.setAttribute(attrname, attrval);\n                        }\n                    }\n                }\n            }\n        }\n    }\n};\n\n\nCSL.XmlDOM.prototype.flagDateMacros = function(myxml) {\n    var pos, len, thenode, thedate;\n    var nodes = myxml.getElementsByTagName(\"macro\");\n    for (pos = 0, len = nodes.length; pos < len; pos += 1) {\n        thenode = nodes.item(pos);\n        thedate = thenode.getElementsByTagName(\"date\");\n        if (thedate.length) {\n            thenode.setAttribute('macro-has-date', 'true');\n        }\n    }\n};\n\n\n/*global CSL: true */\n\nCSL.setupXml = function(xmlObject) {\n    var dataObj = {};\n    var parser = null;\n    if (\"undefined\" !== typeof xmlObject) {\n        if (\"string\" === typeof xmlObject) {\n            xmlObject = xmlObject.replace(\"^\\uFEFF\", \"\")\n                .replace(/^\\s+/, \"\");\n            if (xmlObject.slice(0, 1) === \"<\") {\n                // Assume serialized XML\n                dataObj = CSL.parseXml(xmlObject);\n            } else {\n                // Assume serialized JSON\n                dataObj = JSON.parse(xmlObject);\n            }\n            parser = new CSL.XmlJSON(dataObj);\n        } else if (\"undefined\" !== typeof xmlObject.getAttribute) {\n            // Assume DOM instance\n            parser = new CSL.XmlDOM(xmlObject);\n        } else if (\"undefined\" !== typeof xmlObject.toXMLString) {\n            // Assume E4X object\n            parser = new CSL.XmlE4X(xmlObject);\n        } else {\n            // Assume JS object\n            parser = new CSL.XmlJSON(xmlObject);\n        }\n    } else {\n        CSL.error(\"unable to parse XML input\");\n    }\n    if (!parser) {\n        CSL.error(\"citeproc-js error: unable to parse CSL style or locale object\");\n    }\n    return parser;\n};\n\n/*global CSL: true */\n\nCSL.getSortCompare = function (default_locale) {\n    if (CSL.stringCompare) {\n        return CSL.stringCompare;\n    }\n    var me = this;\n    var strcmp;\n    var strcmp_opts = {\n        sensitivity:\"base\",\n        ignorePunctuation:true,\n        numeric:true\n    };\n    // In order, attempt the following:\n    //   (1) Set locale collation from processor language\n    //   (2) Use localeCompare()\n    if (!default_locale) {\n        default_locale = \"en-US\";\n    }\n    strcmp = function (a, b) {\n        return CSL.toLocaleLowerCase.call(me, a).localeCompare(CSL.toLocaleLowerCase.call(me, b),default_locale,strcmp_opts);\n    };\n    var stripPunct = function (str) {\n        return str.replace(/^[\\[\\]\\'\\\"]*/g, \"\");\n    };\n    var getBracketPreSort = function () {\n        if (!strcmp(\"[x\",\"x\")) {\n            return false;\n        } else {\n            return function (a, b) {\n                return strcmp(stripPunct(a), stripPunct(b));\n            };\n        }\n    };\n    var bracketPreSort = getBracketPreSort();\n    var sortCompare = function (a, b) {\n        if (bracketPreSort) {\n            return bracketPreSort(a, b);\n        } else {\n            return strcmp(a, b);\n        }\n    };\n    return sortCompare;\n};\n\n/*global CSL: true */\n\nCSL.ambigConfigDiff = function(a, b) {\n    var pos, len, ppos, llen;\n    // return of true means the ambig configs differ\n    if (a.names.length !== b.names.length) {\n        //print(\"   (1)\");\n        return 1;\n    } else {\n        for (pos = 0, len = a.names.length; pos < len; pos += 1) {\n            if (a.names[pos] !== b.names[pos]) {\n        //print(\"   (2) \"+a.names[pos]+\" \"+b.names[pos]);\n                return 1;\n            } else {\n                for (ppos = 0, llen = a.givens[pos]; ppos < llen; ppos += 1) {\n                    if (a.givens[pos][ppos] !== b.givens[pos][ppos]) {\n        //print(\"   (3): \"+a.givens[pos][ppos]+\" \"+b.givens[pos][ppos]+\" \"+pos+\"/\"+ppos+\" \"+b.givens[pos]);\n                        return 1;\n                    }\n                }\n            }\n        }\n    }\n    if (a.disambiguate != b.disambiguate) {\n        //print(\"   (4) \"+a.disambiguate+\" \"+b.disambiguate);\n        return 1;\n    }\n    if (a.year_suffix !== b.year_suffix) {\n        //print(\"   (5) \"+a.year_suffix+\" \"+b.year_suffix);\n        return 1;\n    }\n    return 0;\n};\n\nCSL.cloneAmbigConfig = function (config, oldconfig) {\n    var i, ilen, j, jlen, param;\n    var ret = {};\n    ret.names = [];\n    ret.givens = [];\n    ret.year_suffix = false;\n    ret.disambiguate = false;\n    for (i = 0, ilen = config.names.length; i < ilen; i += 1) {\n        param = config.names[i];\n        // Fixes update bug affecting plugins, without impacting\n        // efficiency with update of large numbers of year-suffixed\n        // items.\n        ret.names[i] = param;\n    }\n    for (i  = 0, ilen = config.givens.length; i < ilen; i += 1) {\n        param = [];\n        for (j = 0, jlen = config.givens[i].length; j < jlen; j += 1) {\n            // condition at line 312 of disambiguate.js protects against negative\n            // values of j\n            param.push(config.givens[i][j]);\n        }\n        ret.givens.push(param);\n    }\n    // XXXX Is this necessary at all?\n    if (oldconfig) {\n        ret.year_suffix = oldconfig.year_suffix;\n        ret.disambiguate = oldconfig.disambiguate;\n    } else {\n        ret.year_suffix = config.year_suffix;\n        ret.disambiguate = config.disambiguate;\n    }\n    return ret;\n};\n\n/**\n * Return current base configuration for disambiguation\n */\nCSL.getAmbigConfig = function () {\n    var config, ret;\n    config = this.tmp.disambig_request;\n    if (!config) {\n        config = this.tmp.disambig_settings;\n    }\n    var ret = CSL.cloneAmbigConfig(config);\n    return ret;\n};\n\n/**\n * Return max values for disambiguation\n */\nCSL.getMaxVals = function () {\n    return this.tmp.names_max.mystack.slice();\n};\n\n/**\n * Return min value for disambiguation\n */\nCSL.getMinVal = function () {\n    return this.tmp[\"et-al-min\"];\n};\n\n/*global CSL: true */\n\n/* For node execution pretty-printing (see below) */\n\n/*\nvar INDENT = \"\";\n*/\n\nCSL.tokenExec = function (token, Item, item) {\n    // Called on state object\n    var next, maybenext, exec, debug;\n    debug = false;\n    next = token.next;\n    maybenext = false;\n\n    /* Pretty-print node executions */\n\n    /*\n    if ([\"if\", \"else-if\", \"else\"].indexOf(token.name) === -1) {\n        if (token.tokentype == 1) {\n            INDENT = INDENT.slice(0, -2);\n        }\n    }\n    this.sys.print(INDENT + \"---> Token: \" + token.name + \" (\" + token.tokentype + \") in \" + this.tmp.area + \", \" + this.output.current.mystack.length);\n    if ([\"if\", \"else-if\", \"else\"].indexOf(token.name) === -1) {\n        if (token.tokentype == 0) {\n            INDENT += \"  \";\n        }\n    }\n    */\n\n    var record = function (result) {\n        if (result) {\n            this.tmp.jump.replace(\"succeed\");\n            return token.succeed;\n        } else {\n            this.tmp.jump.replace(\"fail\");\n            return token.fail;\n        }\n    };\n    if (token.test) {\n        next = record.call(this,token.test(Item, item));\n    }\n    for (var i=0,ilen=token.execs.length;i<ilen;i++) {\n        exec = token.execs[i];\n        maybenext = exec.call(token, this, Item, item);\n        if (maybenext) {\n            next = maybenext;\n        }\n    }\n    //SNIP-START\n    if (debug) {\n        CSL.debug(token.name + \" (\" + token.tokentype + \") ---> done\");\n    }\n    //SNIP-END\n    return next;\n};\n\n/**\n * Macro expander.\n * <p>Called on the state object.</p>\n */\nCSL.expandMacro = function (macro_key_token, target) {\n    var mkey, macro_nodes, end_of_macro, func;\n\n    mkey = macro_key_token.postponed_macro;\n\n    var sort_direction = macro_key_token.strings.sort_direction;\n    \n    // Decorations and affixes are in wrapper applied in cs:text\n    macro_key_token = new CSL.Token(\"group\", CSL.START);\n    \n    var hasDate = false;\n    var macroid = false;\n    macro_nodes = this.cslXml.getNodesByName(this.cslXml.dataObj, 'macro', mkey);\n    if (macro_nodes.length) {\n        macroid = this.cslXml.getAttributeValue(macro_nodes[0],'cslid');\n        hasDate = this.cslXml.getAttributeValue(macro_nodes[0], \"macro-has-date\");\n    }\n    if (hasDate) {\n        mkey = mkey + \"@\" + this.build.current_default_locale;\n        func = function (state) {\n            if (state.tmp.extension) {\n                state.tmp[\"doing-macro-with-date\"] = true;\n            }\n        };\n        macro_key_token.execs.push(func);\n    }\n\n    if (this.build.macro_stack.indexOf(mkey) > -1) {\n        CSL.error(\"CSL processor error: call to macro \\\"\" + mkey + \"\\\" would cause an infinite loop\");\n    } else {\n        this.build.macro_stack.push(mkey);\n    }\n\n    macro_key_token.cslid = macroid;\n\n    if (CSL.MODULE_MACROS[mkey]) {\n        macro_key_token.juris = mkey;\n        this.opt.update_mode = CSL.POSITION;\n    }\n    // Macro group is treated as a real node in the style\n    CSL.Node.group.build.call(macro_key_token, this, target, true);\n\n    // Node does not exist in the CSL\n    if (!this.cslXml.getNodeValue(macro_nodes)) {\n        CSL.error(\"CSL style error: undefined macro \\\"\" + mkey + \"\\\"\");\n    }\n\n    // Let's macro\n    var mytarget = CSL.getMacroTarget.call(this, mkey);\n    if (mytarget) {\n        CSL.buildMacro.call(this, mytarget, macro_nodes);\n        CSL.configureMacro.call(this, mytarget);\n    }\n    if (!this.build.extension) {\n        var func = (function(macro_name) {\n            return function (state, Item, item) {\n                var next = 0;\n                while (next < state.macros[macro_name].length) {\n                    next = CSL.tokenExec.call(state, state.macros[macro_name][next], Item, item);\n                }\n            };\n        }(mkey));\n        var text_node = new CSL.Token(\"text\", CSL.SINGLETON);\n        text_node.execs.push(func);\n        target.push(text_node);\n    }\n\n    // Decorations and affixes are in wrapper applied in cs:text\n    end_of_macro = new CSL.Token(\"group\", CSL.END);\n    end_of_macro.strings.sort_direction = sort_direction;\n    \n    if (hasDate) {\n        func = function (state) {\n            if (state.tmp.extension) {\n                state.tmp[\"doing-macro-with-date\"] = false;\n            }\n        };\n        end_of_macro.execs.push(func);\n    }\n    if (macro_key_token.juris) {\n        end_of_macro.juris = mkey;\n     }\n    // Macro group is treated as a real node in the style\n    CSL.Node.group.build.call(end_of_macro, this, target, true);\n\n    this.build.macro_stack.pop();\n};\n\nCSL.getMacroTarget = function (mkey) {\n    var mytarget = false;\n    if (this.build.extension) {\n        mytarget = this[this.build.root + this.build.extension].tokens;\n    } else if (!this.macros[mkey]) {\n        mytarget = [];\n        this.macros[mkey] = mytarget;\n    }\n    return mytarget;\n};\n\nCSL.buildMacro = function (mytarget, macro_nodes) {\n    var builder = CSL.makeBuilder(this, mytarget);\n    var mynode;\n    if (\"undefined\" === typeof macro_nodes.length) {\n        mynode = macro_nodes;\n    } else {\n        mynode = macro_nodes[0];\n    }\n    builder(mynode);\n};\n\nCSL.configureMacro = function (mytarget) {\n    if (!this.build.extension) {\n        this.configureTokenList(mytarget);\n    }\n};\n\n\n/**\n * Convert XML node to token.\n * <p>This is called on an XML node.  After extracting the name and attribute\n * information from the node, it performs three operations.  Attribute information\n * relating to output formatting is stored on the node as an array of tuples,\n * which fixes the sequence of execution of output functions to be invoked\n * in the next phase of processing.  Other attribute information is reduced\n * to functions, and is pushed into an array on the token in no particular\n * order, for later execution.  The element name is used as a key to\n * invoke the relevant <code>build</code> method of the target element.\n * Element methods are defined in {@link CSL.Node}.</p>\n * @param {Object} state  The state object returned by {@link CSL.Engine}.\n * @param {Int} tokentype  A CSL namespace constant (<code>CSL.START</code>,\n * <code>CSL.END</code> or <code>CSL.SINGLETON</code>.\n */\nCSL.XmlToToken = function (state, tokentype, explicitTarget, var_stack) {\n    var name, txt, attrfuncs, attributes, decorations, token, key, target;\n    name = state.cslXml.nodename(this);\n    //CSL.debug(tokentype + \" : \" + name);\n    if (state.build.skip && state.build.skip !== name) {\n        return;\n    }\n    if (!name) {\n        txt = state.cslXml.content(this);\n        if (txt) {\n            state.build.text = txt;\n        }\n        return;\n    }\n    if (!CSL.Node[state.cslXml.nodename(this)]) {\n        CSL.error(\"Undefined node name \\\"\" + name + \"\\\".\");\n    }\n    attrfuncs = [];\n    attributes = state.cslXml.attributes(this);\n    decorations = CSL.setDecorations.call(this, state, attributes);\n    token = new CSL.Token(name, tokentype);\n    if (tokentype !== CSL.END || name === \"if\" || name === \"else-if\" || name === \"layout\") {\n        //\n        // xml: more xml stuff\n        //\n        for (var key in attributes) {\n            if (attributes.hasOwnProperty(key)) {\n                if (tokentype === CSL.END && key !== \"@language\" && key !== \"@locale\") {\n                    continue;\n                }\n                if (attributes.hasOwnProperty(key)) {\n                    if (CSL.Attributes[key]) {\n                        try {\n                            CSL.Attributes[key].call(token, state, \"\" + attributes[key]);\n                        } catch (e) {\n                            CSL.error(key + \" attribute: \" + e);\n                        }\n                    } else {\n                        CSL.debug(\"warning: undefined attribute \\\"\"+key+\"\\\" in style\");\n                    }\n                }\n            }\n        }\n        token.decorations = decorations;\n        if (CSL.DATE_VARIABLES.indexOf(attributes['@variable']) > -1) {\n            var_stack.push(token.variables);\n        }\n    } else if (tokentype === CSL.END && attributes['@variable']) {\n        token.hasVariable = true;\n        if (CSL.DATE_VARIABLES.indexOf(attributes['@variable']) > -1) {\n            token.variables = var_stack.pop();\n        }\n    }\n    //\n    // !!!!!: eliminate diversion of tokens to separate\n    // token list (formerly used for reading in macros\n    // and terms).\n    //\n    if (explicitTarget) {\n        target = explicitTarget;\n    } else {\n        target = state[state.build.area].tokens;\n    }\n    // True flags real nodes in the style\n    CSL.Node[name].build.call(token, state, target, true);\n};\n\n\n\n/*global CSL: true */\n\n\nCSL.DateParser = function () {\n\n    /*\n     * Fixed values\n     */\n\n    // jse imperial years\n    var epochPairs = [\n        [\"\\u660E\\u6CBB\", 1867],\n        [\"\\u5927\\u6B63\", 1911],\n        [\"\\u662D\\u548C\", 1925],\n        [\"\\u5E73\\u6210\", 1988]\n    ];\n\n    // years by jse imperial epoch\n    var epochYearByName = {};\n    for (var i=0,ilen=epochPairs.length; i<ilen; i++) {\n        var key = epochPairs[i][0];\n        var val = epochPairs[i][1];\n        epochYearByName[key] = val;\n    }\n    \n    var epochMatchStrings = [];\n    var epochMap = {};\n    for (var i=0,ilen=epochPairs.length; i<ilen; i++) {\n        var pair = epochPairs[i];\n        var val = pair[0];\n        epochMatchStrings.push(val);\n        epochMap[pair[0]] = pair[1];\n    }\n    var epochMatchString = epochMatchStrings.join(\"|\");\n\n    // regular expression to trap year name and year\n    // (splitter and matcher, to cope with ancient JS implementations)\n    var epochSplitter = new RegExp(\"(?:\" + epochMatchString + \")(?:[0-9]+)\");\n    var epochMatcher = new RegExp(\"(?:\" + epochMatchString + \")(?:[0-9]+)\", \"g\");\n\n    // regular expression for month or day kanji label\n    var kanjiMonthDay = /(\\u6708|\\u5E74)/g;\n\n    // regular expression for year kanji label\n    var kanjiYear = /\\u65E5/g;\n\n    // regular expression for double-width Japanese range marker\n    var kanjiRange = /\\u301c/g;\n\n    // parsing regexps for normalized strings\n    //   raw materials\n    var yearLast = \"(?:[?0-9]{1,2}%%NUMD%%){0,2}[?0-9]{4}(?![0-9])\";\n    var yearFirst = \"[?0-9]{4}(?:%%NUMD%%[?0-9]{1,2}){0,2}(?![0-9])\";\n    var numberVal = \"[?0-9]{1,3}\";\n    var rangeSeparator = \"[%%DATED%%]\";\n    var fuzzyChar = \"[?~]\";\n    var chars = \"[^\\-\\/\\~\\?0-9]+\";\n    var rexString = \"(\" + yearFirst + \"|\" + yearLast + \"|\" + numberVal + \"|\" + rangeSeparator + \"|\" + fuzzyChar + \"|\" + chars + \")\";\n    //   composed regexps\n    var rexDash = new RegExp(rexString.replace(/%%NUMD%%/g, \"-\").replace(/%%DATED%%/g, \"-\"));\n    var rexDashSlash = new RegExp(rexString.replace(/%%NUMD%%/g, \"-\").replace(/%%DATED%%/g, \"\\/\"));\n    var rexSlashDash = new RegExp(rexString.replace(/%%NUMD%%/g, \"\\/\").replace(/%%DATED%%/g, \"-\"));\n\n    /*\n     * Mutable values\n     */\n\n    // months\n    var monthString = \"january february march april may june july august september october november december spring summer fall winter spring summer\";\n    this.monthStrings = monthString.split(\" \");\n\n    /*\n     * Configuration functions\n     */\n\n    this.setOrderDayMonth = function() {\n        // preferred ordering for numeric dates\n        this.monthGuess = 1;\n        this.dayGuess = 0;\n    };\n\n    this.setOrderMonthDay = function() {\n        // preferred ordering for numeric dates\n        this.monthGuess = 0;\n        this.dayGuess = 1;\n    };\n\n    this.resetDateParserMonths = function() {\n        // Function to reset months to default.\n        this.monthSets = [];\n        for (var i=0,ilen=this.monthStrings.length; i<ilen; i++) {\n            this.monthSets.push([this.monthStrings[i]]);\n        }\n        this.monthAbbrevs = [];\n        for (var i=0,ilen=this.monthSets.length; i<ilen; i++) {\n            this.monthAbbrevs.push([]);\n            for (var j=0,jlen=this.monthSets[i].length; j<jlen; j++) {\n                this.monthAbbrevs[i].push(this.monthSets[i][0].slice(0, 3));\n            }\n        }\n        this.monthRexes = [];\n        for (var i=0,ilen=this.monthAbbrevs.length; i<ilen; i++) {\n            this.monthRexes.push(new RegExp(\"(?:\" + this.monthAbbrevs[i].join(\"|\") + \")\"));\n        }\n    };\n\n    this.addDateParserMonths = function(lst) {\n        // Extend list of months with an additional set of month abbreviations,\n        // extending strings as required to resolve ambiguities.\n\n        // Normalize string to list\n        if (\"string\" === typeof lst) {\n            lst = lst.split(/\\s+/);\n        }\n\n        // Check that there are twelve (or sixteen) to add\n        if (lst.length !== 12 && lst.length !== 16) {\n            CSL.debug(\"month [+season] list of \"+lst.length+\", expected 12 or 16. Ignoring.\");\n            return;\n        }\n\n        // Extend as necessary to resolve ambiguities\n        // For each new month string ...\n        for (var i=0,ilen=lst.length; i<ilen; i++) {\n            var abbrevLength = null;\n            var skip = false;\n            var insert = 3;\n            var extendedSets = {};\n            for (var j=0,jlen=this.monthAbbrevs.length; j<jlen; j++) {\n                extendedSets[j] = {};\n                if (j === i) {\n                    // Mark for skipping if same as an existing abbreviation of same month\n                    for (var k=0,klen=this.monthAbbrevs[i].length; k<klen; k++) {\n                        if (this.monthAbbrevs[i][k] === lst[i].slice(0, this.monthAbbrevs[i][k].length)) {\n                            skip = true;\n                            break;\n                        }\n                    }\n                } else {\n                    // Mark for extending if same as existing abbreviation of any expression of another month\n                    for (var k=0,klen=this.monthAbbrevs[j].length; k<klen; k++) {\n                        abbrevLength = this.monthAbbrevs[j][k].length;\n                        if (this.monthAbbrevs[j][k] === lst[i].slice(0, abbrevLength)) {\n                            while (this.monthSets[j][k].slice(0, abbrevLength) === lst[i].slice(0, abbrevLength)) {\n                                // Abort when full length is hit, otherwise extend\n                                if (abbrevLength > lst[i].length || abbrevLength > this.monthSets[j][k].length) {\n                                    CSL.debug(\"unable to disambiguate month string in date parser: \"+lst[i]);\n                                    break;\n                                } else {\n                                    // Mark both new entry and existing abbrev for extension\n                                    abbrevLength += 1;\n                                }\n                            }\n                            insert = abbrevLength;\n                            extendedSets[j][k] = abbrevLength;\n                        }\n                    }\n                }\n                for (var jKey in extendedSets) {\n                    for (var kKey in extendedSets[jKey]) {\n                        abbrevLength = extendedSets[jKey][kKey];\n                        jKey = parseInt(jKey, 10);\n                        kKey = parseInt(kKey, 10);\n                        this.monthAbbrevs[jKey][kKey] = this.monthSets[jKey][kKey].slice(0, abbrevLength);\n                    }\n                }\n            }\n            // Insert here\n            if (!skip) {\n                this.monthSets[i].push(lst[i]);\n                this.monthAbbrevs[i].push(lst[i].slice(0, insert));\n            }\n        }\n\n        // Compose\n        this.monthRexes = [];\n        this.monthRexStrs = [];\n        for (var i=0,ilen=this.monthAbbrevs.length; i<ilen; i++) {\n            this.monthRexes.push(new RegExp(\"^(?:\" + this.monthAbbrevs[i].join(\"|\") + \")\"));\n            this.monthRexStrs.push(\"^(?:\" + this.monthAbbrevs[i].join(\"|\") + \")\");\n        }\n        if (this.monthAbbrevs.length === 18) {\n            for (var i=12,ilen=14; i<ilen; i++) {\n                this.monthRexes[i+4] = new RegExp(\"^(?:\" + this.monthAbbrevs[i].join(\"|\") + \")\");\n                this.monthRexStrs[i+4] = \"^(?:\" + this.monthAbbrevs[i].join(\"|\") + \")\";\n            }\n        }\n    };\n\n    /*\n     * Conversion functions\n     */\n\n    this.convertDateObjectToArray = function (thedate) {\n        // Converts object in place and returns object\n        thedate[\"date-parts\"] = [];\n        thedate[\"date-parts\"].push([]);\n        var slicelen = 0;\n        var part;\n        for (var i=0,ilen=3; i<ilen; i++) {\n            part = [\"year\", \"month\", \"day\"][i];\n            if (!thedate[part]) {\n                break;\n            }\n            slicelen += 1;\n            thedate[\"date-parts\"][0].push(thedate[part]);\n            delete thedate[part];\n        }\n        thedate[\"date-parts\"].push([]);\n        for (var i=0, ilen=slicelen; i<ilen; i++) {\n            part = [\"year_end\", \"month_end\", \"day_end\"][i];\n            if (!thedate[part]) {\n                break;\n            }\n            thedate[\"date-parts\"][1].push(thedate[part]);\n            delete thedate[part];\n        }\n        if (thedate[\"date-parts\"][0].length !== thedate[\"date-parts\"][1].length) {\n            thedate[\"date-parts\"].pop();\n        }\n        return thedate;\n    };\n\n    // XXXX String output is currently unable to represent ranges\n    this.convertDateObjectToString = function(thedate) {\n        // Returns string\n        var ret = [];\n        for (var i = 0, ilen = 3; i < ilen; i += 1) {\n            if (thedate[CSL.DATE_PARTS_ALL[i]]) {\n                ret.push(thedate[CSL.DATE_PARTS_ALL[i]]);\n            } else {\n                break;\n            }\n        }\n        return ret.join(\"-\");\n    };\n\n    /*\n     * Utility function\n     */\n\n    this._parseNumericDate = function (ret, delim, suff, txt) {\n        if (!suff) {\n            suff = \"\";\n        }\n        var lst = txt.split(delim);\n        \n        for (var i=0, ilen=lst.length; i<ilen; i++) {\n            if (lst[i].length === 4) {\n                ret[(\"year\" + suff)] = lst[i].replace(/^0*/, \"\");\n                if (!i) {\n                    lst = lst.slice(1);\n                } else {\n                    lst = lst.slice(0, i);\n                }\n                break;\n            }\n        }\n        for (var i=0,ilen=lst.length; i<ilen; i++) {\n            lst[i] = parseInt(lst[i], 10);\n        }\n        if (lst.length === 1 || (lst.length === 2 && !lst[1])) {\n            var month = lst[0];\n            if (month) {\n                ret[(\"month\" + suff)] = \"\" + lst[0];\n            }\n        } else if (lst.length === 2) {\n            if (lst[this.monthGuess] > 12) {\n                var month = lst[this.dayGuess];\n                var day = lst[this.monthGuess];\n                if (month) {\n                    ret[(\"month\" + suff)] = \"\" + month;\n                    if (day) {\n                        ret[(\"day\" + suff)] = \"\" + day;\n                    }\n                }\n            } else {\n                var month = lst[this.monthGuess];\n                var day = lst[this.dayGuess];\n                if (month) {\n                    ret[(\"month\" + suff)] = \"\" + month;\n                    if (day) {\n                        ret[(\"day\" + suff)] = \"\" + day;\n                    }\n                }\n            }\n        }\n    };\n\n    /*\n     * Parsing functions\n     */\n\n    this.parseDateToObject = function (txt) {\n        //\n        // Normalize the format and the year if it's a Japanese date\n        //\n        var orig = txt;\n        var slashPos = -1;\n        var dashPos = -1;\n        var yearIsNegative = false;\n        var lst;\n        if (txt) {\n            txt = txt.replace(/^(.*[0-9])T[0-9].*/, \"$1\");\n            // If string leads with a minus sign, strip and memo it.\n            if (txt.slice(0, 1) === \"-\") {\n                yearIsNegative = true;\n                txt = txt.slice(1);\n            }\n            \n            // If string is a number of 1 to 3 characters only, treat as year.\n            if (txt.match(/^[0-9]{1,3}$/)) {\n                while (txt.length < 4) {\n                    txt = \"0\" + txt;\n                }\n            }\n            \n            // Normalize to string\n            txt = \"\" + txt;\n            // Remove things that look like times\n            txt = txt.replace(/\\s*[0-9]{2}:[0-9]{2}(?::[0-9]+)/,\"\");\n            var m = txt.match(kanjiMonthDay);\n            if (m) {\n                txt = txt.replace(/\\s+/g, \"\");\n                txt = txt.replace(kanjiYear, \"\");\n                txt = txt.replace(kanjiMonthDay, \"-\");\n                txt = txt.replace(kanjiRange, \"/\");\n                txt = txt.replace(/\\-\\//g, \"/\");\n                txt = txt.replace(/-$/g,\"\");\n\n                // Tortuous workaround for IE6\n                var slst = txt.split(epochSplitter);\n                lst = [];\n                var mm = txt.match(epochMatcher);\n                if (mm) {\n                    var mmx = [];\n                    for (var i=0,ilen=mm.length; i<ilen; i++) {\n                        mmx = mmx.concat(mm[i].match(/([^0-9]+)([0-9]+)/).slice(1));\n                    }\n                    for (var i=0,ilen=slst.length; i<ilen; i++) {\n                        lst.push(slst[i]);\n                        if (i !== (ilen - 1)) {\n                            // pos is undeclared, and multiplying by 2 here is insane.\n                            var mmpos = (i * 2);\n                            lst.push(mmx[mmpos]);\n                            lst.push(mmx[mmpos + 1]);\n                        }\n                    }\n                } else {\n                    lst = slst;\n                }\n                // workaround duly applied, this now works\n                for (var i=1,ilen=lst.length; i<ilen; i+=3) {\n                    lst[i + 1] = epochMap[lst[i]] + parseInt(lst[i + 1], 10);\n                    lst[i] = \"\";\n                }\n                txt = lst.join(\"\");\n                txt = txt.replace(/\\s*-\\s*$/, \"\").replace(/\\s*-\\s*\\//, \"/\");\n                //\n                // normalize date and identify delimiters\n                //\n                txt = txt.replace(/\\.\\s*$/, \"\");\n\n                // not sure what this is meant to do\n                txt = txt.replace(/\\.(?! )/, \"\");\n\n                slashPos = txt.indexOf(\"/\");\n                dashPos = txt.indexOf(\"-\");\n            }\n        }\n        // drop punctuation from a.d., b.c.\n        txt = txt.replace(/([A-Za-z])\\./g, \"$1\");\n\n        var number = \"\";\n        var note = \"\";\n        var thedate = {};\n        var rangeDelim;\n        var dateDelim;\n        if (txt.slice(0, 1) === \"\\\"\" && txt.slice(-1) === \"\\\"\") {\n            thedate.literal = txt.slice(1, -1);\n            return thedate;\n        }\n        if (slashPos > -1 && dashPos > -1) {\n            var slashCount = txt.split(\"/\");\n            if (slashCount.length > 3) {\n                rangeDelim = \"-\";\n                txt = txt.replace(/\\_/g, \"-\");\n                dateDelim = \"/\";\n                lst = txt.split(rexSlashDash);\n            } else {\n                rangeDelim = \"/\";\n                txt = txt.replace(/\\_/g, \"/\");\n                dateDelim = \"-\";\n                lst = txt.split(rexDashSlash);\n            }\n        } else {\n            txt = txt.replace(/\\//g, \"-\");\n            txt = txt.replace(/\\_/g, \"-\");\n            rangeDelim = \"-\";\n            dateDelim = \"-\";\n            lst = txt.split(rexDash);\n        }\n        var ret = [];\n        for (var i=0,ilen=lst.length; i<ilen; i++) {\n            var m = lst[i].match(/^\\s*([\\-\\/]|[^\\-\\/\\~\\?0-9]+|[\\-~?0-9]+)\\s*$/);\n            if (m) {\n                ret.push(m[1]);\n            }\n        }\n        //\n        // Phase 2\n        //\n        var delimPos = ret.indexOf(rangeDelim);\n        var delims = [];\n        var isRange = false;\n        if (delimPos > -1) {\n            delims.push([0, delimPos]);\n            delims.push([(delimPos + 1), ret.length]);\n            isRange = true;\n        } else {\n            delims.push([0, ret.length]);\n        }\n        //\n        // For each side of a range divide ...\n        //\n        var suff = \"\";\n        \n        for (var i=0,ilen=delims.length; i<ilen; i++) {\n            var delim = delims[i];\n            //\n            // Process each element ...\n            //\n            var date = ret.slice(delim[0], delim[1]);\n            outer: \n            for (var j=0,jlen=date.length; j<jlen; j++) {\n                var element = date[j];\n                //\n                // If it's a numeric date, process it.\n                //\n                if (element.indexOf(dateDelim) > -1) {\n                    this._parseNumericDate(thedate, dateDelim, suff, element);\n                    continue;\n                }\n                //\n                // If it's an obvious year, record it.\n                //\n                if (element.match(/[0-9]{4}/)) {\n                    thedate[(\"year\" + suff)] = element.replace(/^0*/, \"\");\n                    continue;\n                }\n                //\n                // If it's a fuzzy marker, record it.\n                //\n                if (element === \"~\" || element === \"?\" || element === \"c\" || element.match(/^cir/)) {\n                    thedate.circa = true;\n                }\n                //\n                // If it's a month, record it.\n                //\n                for (var k=0,klen=this.monthRexes.length; k<klen; k++) {\n                    if (element.toLocaleLowerCase().match(this.monthRexes[k])) {\n                        thedate[(\"month\" + suff)] = \"\" + (parseInt(k, 10) + 1);\n                        continue outer;\n                    }\n                }\n                //\n                // If it's a number, make a note of it\n                //\n                if (element.match(/^[0-9]+$/)) {\n                    number = element;\n                }\n                //\n                // If it's a BC or AD marker, make a year of\n                // any note.  Separate, reverse the sign of the year\n                // if it's BC.\n                //\n                if (element.toLocaleLowerCase().match(/^bc/) && number) {\n                    thedate[(\"year\" + suff)] = \"\" + (number * -1);\n                    number = \"\";\n                    continue;\n                }\n                if (element.toLocaleLowerCase().match(/^ad/) && number) {\n                    thedate[(\"year\" + suff)] = \"\" + number;\n                    number = \"\";\n                    continue;\n                }\n                //\n                // If it's cruft, make a note of it\n                //\n                if (element.toLocaleLowerCase().match(/(?:mic|tri|hil|eas)/) && !thedate[(\"season\" + suff)]) {\n                    note = element;\n                    continue;\n                }\n            }\n            //\n            // If at the end of the string there's still a note\n            // hanging around, make a day of it.\n            //\n            if (number) {\n                thedate[(\"day\" + suff)] = number;\n                number = \"\";\n            }\n            //\n            // If at the end of the string there's cruft lying\n            // around, and the season field is empty, put the\n            // cruft there.\n            //\n            if (note && !thedate[(\"season\" + suff)]) {\n                thedate[(\"season\" + suff)] = note.trim();\n                note = \"\";\n            }\n            suff = \"_end\";\n        }\n        //\n        // update any missing elements on each side of the divide\n        // from the other\n        //\n        if (isRange) {\n            for (var j=0,jlen=CSL.DATE_PARTS_ALL.length; j<jlen; j++) {\n                var item = CSL.DATE_PARTS_ALL[j];\n                if (thedate[item] && !thedate[(item + \"_end\")]) {\n                    thedate[(item + \"_end\")] = thedate[item];\n                } else if (!thedate[item] && thedate[(item + \"_end\")]) {\n                    thedate[item] = thedate[(item + \"_end\")];\n                }\n            }\n        }\n        //\n        // If there's no year, or if there only a year and a day, it's a failure; pass through the literal\n        //\n        if (!thedate.year || (thedate.year && thedate.day && !thedate.month)) {\n            thedate = { \"literal\": orig };\n        }\n        var parts = [\"year\", \"month\", \"day\", \"year_end\", \"month_end\", \"day_end\"];\n        for (var i=0,ilen=parts.length; i<ilen; i++) {\n            var part = parts[i];\n            if (\"string\" === typeof thedate[part] && thedate[part].match(/^[0-9]+$/)) {\n                thedate[part] = parseInt(thedate[part], 10);\n            }\n            \n        }\n        if (yearIsNegative && Object.keys(thedate).indexOf(\"year\") > -1) {\n            thedate.year = (thedate.year * -1);\n        }\n        return thedate;\n    };\n\n    this.parseDateToArray = function(txt) {\n        return this.convertDateObjectToArray(this.parseDateToObject(txt));            \n    };\n\n    this.parseDateToString = function(txt) {\n        return this.convertDateObjectToString(this.parseDateToObject(txt));\n    };\n    \n    this.parse = function(txt) {\n        return this.parseDateToObject(txt);\n    };\n    \n    /*\n\n     * Setup\n     */\n\n    this.setOrderMonthDay();\n    this.resetDateParserMonths();\n};\nCSL.DateParser = new CSL.DateParser();\n\n/*global CSL: true */\n\nCSL.Engine = function (sys, style, lang, forceLang) {\n    var attrs, langspec;\n    this.processor_version = CSL.PROCESSOR_VERSION;\n    this.csl_version = \"1.0\";\n    this.sys = sys;\n    \n    if (typeof Object.assign != 'function') {\n        // Must be writable: true, enumerable: false, configurable: true\n        Object.defineProperty(Object, \"assign\", {\n            value: function assign(target) { // .length of function is 2\n                'use strict';\n                if (target == null) { // TypeError if undefined or null\n                    throw new TypeError('Cannot convert undefined or null to object');\n                }\n\n                var to = Object(target);\n\n                for (var index = 1; index < arguments.length; index++) {\n                    var nextSource = arguments[index];\n\n                    if (nextSource != null) { // Skip over if undefined or null\n                        for (var nextKey in nextSource) {\n                            // Avoid bugs when hasOwnProperty is shadowed\n                            if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n                                to[nextKey] = nextSource[nextKey];\n                            }\n                        }\n                    }\n                }\n                return to;\n            },\n            writable: true,\n            configurable: true\n        });\n    }\n\n    // XXX This may be excess code. Given the normalization performed on\n    // XXX the output queue before variableWrapper() is run, a single\n    // XXX space should be the most cruft that we ever see before a variable.\n    if (sys.variableWrapper) {\n        CSL.VARIABLE_WRAPPER_PREPUNCT_REX = new RegExp('^([' + [\" \"].concat(CSL.SWAPPING_PUNCTUATION).join(\"\") + ']*)(.*)');\n    }\n    // XXXX This should be restored -- temporarily suspended for testing of JSON style support.\n    if (CSL.retrieveStyleModule) {\n        this.sys.retrieveStyleModule = CSL.retrieveStyleModule;\n    }\n    if (CSL.getAbbreviation) {\n        this.sys.getAbbreviation = CSL.getAbbreviation;\n    }\n    if (this.sys.stringCompare) {\n        CSL.stringCompare = this.sys.stringCompare;\n    }\n    this.sys.AbbreviationSegments = CSL.AbbreviationSegments;\n\n    this.transform = new CSL.Transform(this);\n    // true or false\n    this.setParseNames = function (val) {\n        this.opt['parse-names'] = val;\n    };\n    \n    this.opt = new CSL.Engine.Opt();\n    this.tmp = new CSL.Engine.Tmp();\n    this.build = new CSL.Engine.Build();\n    this.fun = new CSL.Engine.Fun(this);\n\n    this.configure = new CSL.Engine.Configure();\n    // Build citation before citation_sort in order to pick up\n    // state.opt.update_mode, needed it determine whether\n    // a grouped sort should be performed.\n    this.citation_sort = new CSL.Engine.CitationSort();\n    this.bibliography_sort = new CSL.Engine.BibliographySort();\n    this.citation = new CSL.Engine.Citation(this);\n    this.bibliography = new CSL.Engine.Bibliography();\n    this.intext = new CSL.Engine.InText();\n\n    this.output = new CSL.Output.Queue(this);\n\n    //this.render = new CSL.Render(this);\n    //\n    // This latter queue is used for formatting date chunks\n    // before they are folded back into the main queue.\n    //\n    this.dateput = new CSL.Output.Queue(this);\n\n    this.cslXml = CSL.setupXml(style);\n\n    for (var i in CSL.SYS_OPTIONS) {\n        var option = CSL.SYS_OPTIONS[i];\n        if (\"boolean\" === typeof this.sys[option]) {\n            this.opt.development_extensions[option] = this.sys[option];\n        }\n        \n    }\n    if (this.opt.development_extensions.uppercase_subtitles || this.opt.development_extensions.implicit_short_title) {\n        this.opt.development_extensions.main_title_from_short_title = true;\n    }\n    if (this.opt.development_extensions.csl_reverse_lookup_support) {\n        this.build.cslNodeId = 0;\n        this.setCslNodeIds = function(myxml, nodename) {\n            var children = this.cslXml.children(myxml);\n            this.cslXml.setAttribute(myxml, 'cslid', this.build.cslNodeId);\n            this.opt.nodenames.push(nodename);\n            this.build.cslNodeId += 1;\n            for (var i = 0, ilen = this.cslXml.numberofnodes(children); i < ilen; i += 1) {\n                nodename = this.cslXml.nodename(children[i]);\n                if (nodename) {\n                    this.setCslNodeIds(children[i], nodename);\n                }\n            }\n        };\n        this.setCslNodeIds(this.cslXml.dataObj, \"style\");\n    }\n    // Preprocessing ops for the XML input\n    this.cslXml.addMissingNameNodes(this.cslXml.dataObj);\n    this.cslXml.addInstitutionNodes(this.cslXml.dataObj);\n    this.cslXml.insertPublisherAndPlace(this.cslXml.dataObj);\n    this.cslXml.flagDateMacros(this.cslXml.dataObj);\n    attrs = this.cslXml.attributes(this.cslXml.dataObj);\n    if (\"undefined\" === typeof attrs[\"@sort-separator\"]) {\n        this.cslXml.setAttribute(this.cslXml.dataObj, \"sort-separator\", \", \");\n    }\n    // This setting does the right thing and seems not to be side-effects\n    this.opt[\"initialize-with-hyphen\"] = true;\n\n    // Locale resolution\n    //\n    // (1) Get three locale strings \n    //     -- default-locale (stripped)\n    //     -- processor-locale\n    //     -- en_US\n    \n    this.setStyleAttributes();\n\n    this.opt.xclass = this.cslXml.getAttributeValue(this.cslXml.dataObj, \"class\");\n    this.opt[\"class\"] = this.opt.xclass;\n    this.opt.styleID = this.cslXml.getStyleId(this.cslXml.dataObj);\n    this.opt.styleName = this.cslXml.getStyleId(this.cslXml.dataObj, true);\n\n    if (this.opt.version.slice(0,4) === \"1.1m\") {\n        this.opt.development_extensions.consolidate_legal_items = true;\n        this.opt.development_extensions.consolidate_container_items = true;\n        this.opt.development_extensions.main_title_from_short_title = true;\n        this.opt.development_extensions.expect_and_symbol_form = true;\n        this.opt.development_extensions.require_explicit_legal_case_title_short = true;\n        this.opt.development_extensions.force_jurisdiction = true;\n        this.opt.development_extensions.force_title_abbrev_fallback = true;\n    }\n    // We seem to have two language specs flying around:\n    //   this.opt[\"default-locale\"], and this.opt.lang\n    // Keeping them aligned for safety's sake, pending\n    // eventual cleanup.\n    if (lang) {\n        lang = lang.replace(\"_\", \"-\");\n        lang = CSL.normalizeLocaleStr(lang);\n    }\n    if (this.opt[\"default-locale\"][0]) {\n        this.opt[\"default-locale\"][0] = this.opt[\"default-locale\"][0].replace(\"_\", \"-\");\n        this.opt[\"default-locale\"][0] = CSL.normalizeLocaleStr(this.opt[\"default-locale\"][0]);\n    }\n    if (lang && forceLang) {\n        this.opt[\"default-locale\"] = [lang];\n    }\n    if (lang && !forceLang && this.opt[\"default-locale\"][0]) {\n        lang = this.opt[\"default-locale\"][0];\n    }\n    if (this.opt[\"default-locale\"].length === 0) {\n        if (!lang) {\n            lang = \"en-US\";\n        }\n        this.opt[\"default-locale\"].push(\"en-US\");\n    }\n    if (!lang) {\n        lang = this.opt[\"default-locale\"][0];\n    }\n    langspec = CSL.localeResolve(lang);\n    this.opt.lang = langspec.best;\n    this.opt[\"default-locale\"][0] = langspec.best;\n    this.locale = {};\n    if (!this.opt[\"default-locale-sort\"]) {\n        this.opt[\"default-locale-sort\"] = this.opt[\"default-locale\"][0];\n    }\n    // Test processor against JS engine locale mess to find a field separator that works\n    if ('dale|'.localeCompare('daleb', this.opt[\"default-locale-sort\"]) > -1) {\n        this.opt.sort_sep = \"@\";\n    } else {\n        this.opt.sort_sep = \"|\";\n    }\n    this.localeConfigure(langspec);\n\n    // Build skip-word regexp\n    function makeRegExp(lst) {\n        var lst = lst.slice();\n        var ret = new RegExp( \"(?:(?:[?!:]*\\\\s+|-|^)(?:\" + lst.join(\"|\") + \")(?=[!?:]*\\\\s+|-|$))\", \"g\");\n        return ret;\n    }\n    this.locale[this.opt.lang].opts[\"skip-words-regexp\"] = makeRegExp(this.locale[this.opt.lang].opts[\"skip-words\"]);\n\n    this.output.adjust = new CSL.Output.Queue.adjust(this.getOpt('punctuation-in-quote'));\n\n    this.registry = new CSL.Registry(this);\n\n    // XXX For modular jurisdiction support, parameterize buildTokenLists().\n    // XXX Feed as arguments:\n    // XXX * actual node to be walked (cslXml)\n    // XXX * actual target array\n\n    this.macros = {};\n\n    this.build.area = \"citation\";\n    var area_nodes = this.cslXml.getNodesByName(this.cslXml.dataObj, this.build.area);\n    this.buildTokenLists(area_nodes, this[this.build.area].tokens);\n\n    this.build.area = \"bibliography\";\n    var area_nodes = this.cslXml.getNodesByName(this.cslXml.dataObj, this.build.area);\n    this.buildTokenLists(area_nodes, this[this.build.area].tokens);\n\n    this.build.area = \"intext\";\n    var area_nodes = this.cslXml.getNodesByName(this.cslXml.dataObj, this.build.area);\n    this.buildTokenLists(area_nodes, this[this.build.area].tokens);\n\n    if (this.opt.parallel.enable) {\n        this.parallel = new CSL.Parallel(this);\n    }\n\n    this.juris = {};\n\n    this.configureTokenLists();\n\n    this.disambiguate = new CSL.Disambiguation(this);\n\n    this.splice_delimiter = false;\n\n    //\n    // date parser\n    //\n    this.fun.dateparser = CSL.DateParser;\n    //\n    // flip-flopper for inline markup\n    //\n    this.fun.flipflopper = new CSL.Util.FlipFlopper(this);\n    //\n    // utility functions for quotes\n    //\n    this.setCloseQuotesArray();\n    //\n    // configure ordinal numbers generator\n    //\n    this.fun.ordinalizer.init(this);\n    //\n    // configure long ordinal numbers generator\n    //\n    this.fun.long_ordinalizer.init(this);\n    //\n    // set up page mangler\n    //\n    this.fun.page_mangler = CSL.Util.PageRangeMangler.getFunction(this, \"page\");\n    this.fun.year_mangler = CSL.Util.PageRangeMangler.getFunction(this, \"year\");\n\n    this.setOutputFormat(\"html\");\n};\n\nCSL.Engine.prototype.setCloseQuotesArray = function () {\n    var ret;\n    ret = [];\n    ret.push(this.getTerm(\"close-quote\"));\n    ret.push(this.getTerm(\"close-inner-quote\"));\n    ret.push('\"');\n    ret.push(\"'\");\n    this.opt.close_quotes_array = ret;\n};\n\n// Walker for preparsed XML input\nCSL.makeBuilder = function (me, target) {\n    var var_stack = [];\n    var node_stack = [];\n    function runStart (node) {\n        node_stack.push(node);\n        CSL.XmlToToken.call(node, me, CSL.START, target, var_stack);\n    }\n    function runEnd () {\n        var node = node_stack.pop();\n        CSL.XmlToToken.call(node, me, CSL.END, target, var_stack);\n    }\n    function runSingle (node) {\n        CSL.XmlToToken.call(node, me, CSL.SINGLETON, target, var_stack);\n    }\n    function buildStyle (nodes, parent, node_stack) {\n        if (!node_stack) {\n            node_stack = [];\n        }\n        if (!nodes) {\n            nodes = [];\n        }\n        if (\"undefined\" === typeof nodes.length) {\n            nodes = [nodes];\n        }\n        for (var i=0; i<nodes.length; i++) {\n            var node = nodes[i];\n            if (me.cslXml.nodename(node) === null) {\n                continue;\n            }\n            if (parent && me.cslXml.nodename(node) === \"date\") {\n                CSL.Util.fixDateNode.call(me, parent, i, node);\n                node = me.cslXml.children(parent)[i];\n            }\n            if (me.cslXml.numberofnodes(me.cslXml.children(node))) {\n                runStart(node);\n                buildStyle(me.cslXml.children(node), node, node_stack);\n                runEnd();\n            } else {\n                runSingle(node);\n            }\n        }\n    }\n    return buildStyle;\n};\n\n\nCSL.Engine.prototype.buildTokenLists = function (area_nodes, target) {\n    if (!this.cslXml.getNodeValue(area_nodes)) {\n        return;\n    }\n    var builder = CSL.makeBuilder(this, target);\n    var mynode;\n    if (\"undefined\" === typeof area_nodes.length) {\n        mynode = area_nodes;\n    } else {\n        mynode = area_nodes[0];\n    }\n    builder(mynode);\n};\n\n\nCSL.Engine.prototype.setStyleAttributes = function () {\n    var dummy, attributes, attrname;\n    // Protect against DOM engines that deliver a top-level document\n    // (needed for createElement) that does not contain our top-level node.\n    // \n    // The string coercion on this.cslXml.tagName addresses a bizarre\n    // condition on the top-level node in jsdom running under node.js, in which:\n    //   (1) typeof this.cslXml.tagName === \"undefined\"; and\n    //   (2) !this.cslXml.tagName === false\n    // Coerced, it becomes an empty string.\n    var dummy = {};\n    dummy.name = this.cslXml.nodename(this.cslXml.dataObj);\n    attributes = this.cslXml.attributes(this.cslXml.dataObj);\n    for (attrname in attributes) {\n        if (attributes.hasOwnProperty(attrname)) {\n            // attr = attributes[key];\n            CSL.Attributes[attrname].call(dummy, this, attributes[attrname]);\n        }\n    }\n};\n\nCSL.Engine.prototype.getTerm = function (term, form, plural, gender, mode, forceDefaultLocale) {\n    if (term && term.match(/[A-Z]/) && term === term.toUpperCase()) {\n        CSL.debug(\"Warning: term key is in uppercase form: \"+term);\n        term = term.toLowerCase();\n    }\n    var lang;\n    if (forceDefaultLocale) {\n        lang = this.opt[\"default-locale\"][0];\n    } else {\n        lang = this.opt.lang;\n    }\n    var ret = CSL.Engine.getField(CSL.LOOSE, this.locale[lang].terms, term, form, plural, gender);\n    // XXXXX Temporary, until locale term is deployed in CSL.\n    if (!ret && term === \"range-delimiter\") {\n        ret = \"\\u2013\";\n    }\n    // XXXXX Not so good if mode is neither strict nor tolerant ...\n    if (typeof ret === \"undefined\") {\n        if (mode === CSL.STRICT) {\n            CSL.error(\"Error in getTerm: term \\\"\" + term + \"\\\" does not exist.\");\n        } else if (mode === CSL.TOLERANT) {\n            ret = \"\";\n        }\n    }\n    if (ret) {\n        this.tmp.cite_renders_content = true;\n    }\n    return ret;\n};\n\nCSL.Engine.prototype.getDate = function (form, forceDefaultLocale) {\n    var lang;\n    if (forceDefaultLocale) {\n        lang = this.opt[\"default-locale\"];\n    } else {\n        lang = this.opt.lang;\n    }\n    if (this.locale[lang].dates[form]) {\n        return this.locale[lang].dates[form];\n    } else {\n        return false;\n    }\n};\n\nCSL.Engine.prototype.getOpt = function (arg) {\n    if (\"undefined\" !== typeof this.locale[this.opt.lang].opts[arg]) {\n        return this.locale[this.opt.lang].opts[arg];\n    } else {\n        return false;\n    }\n};\n\n\n\nCSL.Engine.prototype.getVariable = function (Item, varname, form, plural) {\n    return CSL.Engine.getField(CSL.LOOSE, Item, varname, form, plural);\n};\n\nCSL.Engine.prototype.getDateNum = function (ItemField, partname) {\n    if (\"undefined\" === typeof ItemField) {\n        return 0;\n    } else {\n        return ItemField[partname];\n    }\n};\n\nCSL.Engine.getField = function (mode, hash, term, form, plural, gender) {\n    var ret, forms, f, pos, len, hashterm;\n    ret = \"\";\n    if (\"undefined\" === typeof hash[term]) {\n        if (mode === CSL.STRICT) {\n            CSL.error(\"Error in getField: term \\\"\" + term + \"\\\" does not exist.\");\n        } else {\n            return undefined;\n        }\n    }\n    if (gender && hash[term][gender]) {\n        hashterm = hash[term][gender];\n    } else {\n        hashterm = hash[term];\n    }\n    forms = [];\n    if (form === \"symbol\") {\n        forms = [\"symbol\", \"short\"];\n    } else if (form === \"verb-short\") {\n        forms = [\"verb-short\", \"verb\"];\n    } else if (form !== \"long\") {\n        forms = [form];\n    }\n    forms = forms.concat([\"long\"]);\n    len = forms.length;\n    for (pos = 0; pos < len; pos += 1) {\n        f = forms[pos];\n        if (\"string\" === typeof hashterm || \"number\" === typeof hashterm) {\n            ret = hashterm;\n        } else if (\"undefined\" !== typeof hashterm[f]) {\n            if (\"string\" === typeof hashterm[f] || \"number\" === typeof hashterm[f]) {\n                ret = hashterm[f];\n            } else {\n                if (\"number\" === typeof plural) {\n                    ret = hashterm[f][plural];\n                } else {\n                    ret = hashterm[f][0];\n                }\n            }\n            break;\n        }\n    }\n    return ret;\n};\n\nCSL.Engine.prototype.configureTokenLists = function () {\n    var area, pos, len;\n    //for each (var area in [\"citation\", \"citation_sort\", \"bibliography\",\"bibliography_sort\"]) {\n    len = CSL.AREAS.length;\n    for (pos = 0; pos < len; pos += 1) {\n        //var ret = [];\n        area = CSL.AREAS[pos];\n        var tokens = this[area].tokens;\n        this.configureTokenList(tokens);\n    }\n    this.version = CSL.version;\n    return this.state;\n};\n\nCSL.Engine.prototype.configureTokenList = function (tokens) {\n    var dateparts_master, token, dateparts, part, ppos, pppos, llen, lllen;\n    dateparts_master = [\"year\", \"month\", \"day\"];\n    llen = tokens.length - 1;\n    for (ppos = llen; ppos > -1; ppos += -1) {\n        token = tokens[ppos];\n        //token.pos = ppos;\n        //ret.push(token);\n        if (\"date\" === token.name && CSL.END === token.tokentype) {\n            dateparts = [];\n        }\n        if (\"date-part\" === token.name && token.strings.name) {\n            lllen = dateparts_master.length;\n            for (pppos = 0; pppos < lllen; pppos += 1) {\n                part = dateparts_master[pppos];\n                if (part === token.strings.name) {\n                    dateparts.push(token.strings.name);\n                }\n            }\n        }\n        if (\"date\" === token.name && CSL.START === token.tokentype) {\n            dateparts.reverse();\n            token.dateparts = dateparts;\n        }\n        token.next = (ppos + 1);\n        if (token.name && CSL.Node[token.name].configure) {\n            CSL.Node[token.name].configure.call(token, this, ppos);\n        }\n    }\n};\n\nCSL.Engine.prototype.refetchItems = function (ids) {\n    var ret = [];\n    for (var i = 0, ilen = ids.length; i < ilen; i += 1) {\n        ret.push(this.refetchItem(\"\" + ids[i]));\n    }\n    return ret;\n};\n\nCSL.ITERATION = 0;\n\n// Wrapper for sys.retrieveItem supplied by calling application.\n// Adds experimental fields embedded in the note field for\n// style development trial and testing purposes.\nCSL.Engine.prototype.retrieveItem = function (id) {\n    var Item, m, i;\n\n    if (!this.tmp.loadedItemIDs[id]) {\n        this.tmp.loadedItemIDs[id] = true;\n    } else {\n        return this.registry.refhash[id];\n    }\n\n    if (this.opt.development_extensions.normalize_lang_keys_to_lowercase &&\n        \"boolean\" === typeof this.opt.development_extensions.normalize_lang_keys_to_lowercase) {\n        // This is a hack. Should properly be configured by a processor method after build.\n        for (var i=0,ilen=this.opt[\"default-locale\"].length; i<ilen; i+=1) {\n            this.opt[\"default-locale\"][i] = this.opt[\"default-locale\"][i].toLowerCase();\n        }\n        for (var i=0,ilen=this.opt[\"locale-translit\"].length; i<ilen; i+=1) {\n            this.opt[\"locale-translit\"][i] = this.opt[\"locale-translit\"][i].toLowerCase();\n        }\n        for (var i=0,ilen=this.opt[\"locale-translat\"].length; i<ilen; i+=1) {\n            this.opt[\"locale-translat\"][i] = this.opt[\"locale-translat\"][i].toLowerCase();\n        }\n        this.opt.development_extensions.normalize_lang_keys_to_lowercase = 100;\n    }\n\n    //Zotero.debug(\"XXX === ITERATION \" + CSL.ITERATION + \" \"+ id +\" ===\");\n    CSL.ITERATION += 1;\n\n    Item = JSON.parse(JSON.stringify(this.sys.retrieveItem(\"\" + id)));\n\n    // Optionally normalize keys to lowercase()\n    if (this.opt.development_extensions.normalize_lang_keys_to_lowercase) {\n        if (Item.multi) {\n            if (Item.multi._keys) {\n                for (var field in Item.multi._keys) {\n                    for (var key in Item.multi._keys[field]) {\n                        if (key !== key.toLowerCase()) {\n                            Item.multi._keys[field][key.toLowerCase()] = Item.multi._keys[field][key];\n                            delete Item.multi._keys[field][key];\n                        }\n                    }\n                }\n            }\n            if (Item.multi.main) {\n                for (var field in Item.multi.main) {\n                    Item.multi.main[field] = Item.multi.main[field].toLowerCase();\n                }\n            }\n        }\n        for (var i=0, ilen=CSL.NAME_VARIABLES.length; i>ilen; i+=1) {\n            var ctype = CSL.NAME_VARIABLES[i];\n            if (Item[ctype] && Item[ctype].multi) {\n                for (var j=0, jlen=Item[ctype].length; j<jlen; j+=1) {\n                    var creator = Item[ctype][j];\n                    if (creator.multi) {\n                        if (creator.multi._key) {\n                            for (var key in creator.multi._key) {\n                                if (key !== key.toLowerCase()) {\n                                    creator.multi._key[key.toLowerCase()] = creator.multi._key[key];\n                                    delete creator.multi._key[key];\n                                }\n                            }\n                        }\n                        if (creator.multi.main) {\n                            creator.multi.main = creator.multi.main.toLowerCase();\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    // Normalize language field into \"language\" and \"language-original\"\n    if (Item.language && Item.language.match(/[><]/)) {\n        // Attempt to split field in two\n        var m = Item.language.match(/(.*?)([<>])(.*)/);\n        if (m[2] === \"<\") {\n            Item[\"language-name\"] = m[1];\n            Item[\"language-name-original\"] = m[3];\n        } else {\n            Item[\"language-name\"] = m[3];\n            Item[\"language-name-original\"] = m[1];\n        }\n        if (this.opt.multi_layout) {\n            if (Item[\"language-name-original\"]) {\n                Item.language = Item[\"language-name-original\"];\n            }\n        } else {\n            if (Item[\"language-name\"]) {\n                Item.language = Item[\"language-name\"];\n            }\n        }\n    }\n\n    if (Item.page) {\n        Item[\"page-first\"] = Item.page;\n        var num = \"\" + Item.page;\n        var m = num.split(/\\s*(?:&|, |-|\\u2013)\\s*/);\n        if (m[0].slice(-1) !== \"\\\\\") {\n            Item[\"page-first\"] = m[0];\n        }\n    }\n    // Optional development extensions\n    if (this.opt.development_extensions.field_hack && Item.note) {\n        // false is for validFieldsForType (all conforming entries scrubbed when false)\n        CSL.parseNoteFieldHacks(Item, false, this.opt.development_extensions.allow_field_hack_date_override);\n    }\n    // not including locator-date\n    for (var key in Item) {\n        if (CSL.DATE_VARIABLES.indexOf(key.replace(/^alt-/, \"\")) > -1) {\n            var dateobj = Item[key];\n            if (dateobj) {\n                // raw date parsing is harmless, but can be disabled if desired\n                if (this.opt.development_extensions.raw_date_parsing) {\n                    if (dateobj.raw && (!dateobj[\"date-parts\"] || dateobj[\"date-parts\"].length === 0)) {\n                        dateobj = this.fun.dateparser.parseDateToObject(dateobj.raw);\n                    }\n                }\n                Item[key] = this.dateParseArray(dateobj);\n            }\n        }\n    }\n    if (this.opt.development_extensions.consolidate_legal_items) {\n        if (Item.type && [\"bill\",\"gazette\",\"legislation\",\"regulation\",\"treaty\"].indexOf(Item.type) > -1) {\n            var varname;\n            var elements = [\"type\", \"title\", \"jurisdiction\", \"genre\", \"volume\", \"container-title\"];\n            var legislation_id = [];\n            for (var i = 0, ilen = elements.length; i < ilen; i += 1) {\n                varname = elements[i];\n\t\t\t\tif (Item[varname]) {\n\t\t\t\t\tlegislation_id.push(Item[varname]);\n\t\t\t\t}\n\t\t\t}\n            elements = [\"original-date\", \"issued\"];\n\t\t\tfor (var i = 0, ilen=elements.length; i < ilen; i += 1) {\n                varname = elements[i];\n\t\t\t\tif (Item[varname] && Item[varname].year) {\n\t\t\t\t\tvar value = Item[varname].year;\n\t\t\t\t\tlegislation_id.push(value);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tItem.legislation_id = legislation_id.join(\"::\");\n        }\n    }\n    if (this.bibliography.opt.track_container_items) {\n        if (this.bibliography.opt.track_container_items.indexOf(Item.type) > -1) {\n            var varname;\n            var elements = [\"type\", \"container-title\", \"publisher\", \"edition\"];\n            var container_id = [];\n            for (var i = 0, ilen = elements.length; i < ilen; i += 1) {\n                varname = elements[i];\n\t\t\t\tif (Item[varname]) {\n\t\t\t\t\tcontainer_id.push(Item[varname]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tItem.container_id = container_id.join(\"::\");\n        }\n    }\n    // For authority to name shape in legal styles\n    if (this.opt.development_extensions.force_jurisdiction) {\n        if (\"string\" === typeof Item.authority) {\n            Item.authority = [\n                {\n                    literal: Item.authority,\n                    multi: {\n                        _key: {}\n                    }\n                }\n            ];\n            if (Item.multi && Item.multi._keys && Item.multi._keys.authority) {\n                Item.authority[0].multi._key = {};\n                for (var key in Item.multi._keys.authority) {\n                    Item.authority[0].multi._key[key] = {\n                        literal: Item.multi._keys.authority[key]\n                    };\n                }\n            }\n        }\n    }\n    // Add getAbbreviation() call for title-short and container-title-short\n    if (!Item[\"title-short\"]) {\n        Item[\"title-short\"] = Item.shortTitle;\n    }\n    // Add support for main_title_from_short_title\n    if (this.opt.development_extensions.main_title_from_short_title) {\n        var narrowSpaceLocale = this.opt[\"default-locale\"][0].slice(0, 2).toLowerCase() === \"fr\";\n        CSL.extractTitleAndSubtitle.call(this, Item, narrowSpaceLocale);\n    }\n    var isLegalType = [\"bill\",\"legal_case\",\"legislation\",\"gazette\",\"regulation\"].indexOf(Item.type) > -1;\n    if (this.opt.development_extensions.force_jurisdiction && isLegalType) {\n        if (!Item.jurisdiction) {\n            Item.jurisdiction = \"us\";\n        }\n    }\n    var normalizedKey;\n    if (!isLegalType && Item.title && this.sys.getAbbreviation) {\n        var noHints = false;\n        if (!Item.jurisdiction) {\n            noHints = true;\n        }\n        if (this.sys.normalizeAbbrevsKey) {\n             normalizedKey = this.sys.normalizeAbbrevsKey(\"title\", Item.title);\n        } else {\n            normalizedKey = Item.title;\n        }\n        var jurisdiction = this.transform.loadAbbreviation(Item.jurisdiction, \"title\", normalizedKey, Item.language);\n        if (this.transform.abbrevs[jurisdiction].title) {\n            if (this.transform.abbrevs[jurisdiction].title[normalizedKey]) {\n                Item[\"title-short\"] = this.transform.abbrevs[jurisdiction].title[normalizedKey];\n            }\n        }\n    }\n    if (!Item[\"container-title-short\"]) {\n        Item[\"container-title-short\"] = Item.journalAbbreviation;\n    }\n    if (Item[\"container-title\"] && this.sys.getAbbreviation) {\n        if (this.sys.normalizeAbbrevsKey) {\n            normalizedKey = this.sys.normalizeAbbrevsKey(Item[\"container-title\"]);\n        } else {\n            normalizedKey = Item[\"container-title\"];\n        }\n        var jurisdiction = this.transform.loadAbbreviation(Item.jurisdiction, \"container-title\", normalizedKey, Item.language);\n        if (this.transform.abbrevs[jurisdiction][\"container-title\"]) {\n            if (this.transform.abbrevs[jurisdiction][\"container-title\"][normalizedKey]) {\n                Item[\"container-title-short\"] = this.transform.abbrevs[jurisdiction][\"container-title\"][normalizedKey];\n            }\n        }\n    }\n    if (Item.jurisdiction) {\n        Item.country = Item.jurisdiction.split(\":\")[0];\n    }\n    if (this.registry.refhash[id]) {\n        if (JSON.stringify(this.registry.refhash[id]) != JSON.stringify(Item)) {\n            for (var key in this.registry.refhash[id]) {\n                delete this.registry.refhash[id][key];\n            }\n            this.tmp.taintedItemIDs[Item.id] = true;\n            Object.assign(this.registry.refhash[id], Item);\n        }\n    } else {\n        this.registry.refhash[id] = Item;\n    }\n    return this.registry.refhash[id];\n};\n\nCSL.Engine.prototype.refetchItem = function (id) {\n    return this.registry.refhash[id];\n};\n\n// Executed during style build\nCSL.Engine.prototype.setOpt = function (token, name, value) {\n    if (token.name === \"style\" || token.name === \"cslstyle\") {\n        this.opt.inheritedAttributes[name] = value;\n        this.citation.opt.inheritedAttributes[name] = value;\n        this.bibliography.opt.inheritedAttributes[name] = value;\n    } else if ([\"citation\", \"bibliography\"].indexOf(token.name) > -1) {\n        this[token.name].opt.inheritedAttributes[name] = value;\n    } else {\n        token.strings[name] = value;\n    }\n};\n\n// Executed at runtime, since macros can occur in the context of citation or bibliography\nCSL.Engine.prototype.inheritOpt = function (token, attrname, parentname, defaultValue) {\n    if (\"undefined\" !== typeof token.strings[attrname]) {\n        return token.strings[attrname];\n    } else {\n        var parentValue = this[this.tmp.root].opt.inheritedAttributes[parentname ? parentname : attrname];\n        if (\"undefined\" !== typeof parentValue) {\n            return parentValue;\n        } else {\n            return defaultValue;\n        }\n    }\n};\n\nCSL.Engine.prototype.remapSectionVariable = function (inputList) {\n    // We have items with a value in the section field (on Item) that must\n    // be mapped to the locator field (on item). We simply prepend it as\n    // a string here, and handle all parsing of the resulting string\n    // in processNumber(). Plurals and numeric are set in processNumber().\n    \n    // Because the target is in the citation item (lowercase), the\n    // remapping cannot take place when the Item data is received.\n    // Citation provides a list of Item/item pairs, hence the iteration\n    // used here.\n    for (var i = 0, ilen = inputList.length; i < ilen; i += 1) {\n        var Item = inputList[i][0];\n        var item = inputList[i][1];\n\n        if ([\"bill\",\"gazette\",\"legislation\",\"regulation\",\"treaty\"].indexOf(Item.type) > -1) {\n             // If a locator value exists, then\n            //   (a) Leave be an overriding label at the start of the locator field, defaulting to label value\n            if (item.locator) {\n                item.locator = item.locator.trim();\n                var m = item.locator.match(CSL.STATUTE_SUBDIV_PLAIN_REGEX_FRONT);\n                if (!m) {\n                    if (item.label) {\n                        item.locator = CSL.STATUTE_SUBDIV_STRINGS_REVERSE[item.label] + \" \" + item.locator;\n                    } else {\n                        item.locator = \"p. \" + item.locator;\n                    }\n                }\n            }\n            // If a section value exists, then\n            //   (a) Apply an overriding label at the start of the section field, defaulting to sec.\n            var sectionMasterLabel = null;\n            if (Item.section) {\n                Item.section = Item.section.trim();\n                var m = Item.section.match(CSL.STATUTE_SUBDIV_PLAIN_REGEX_FRONT);\n                if (!m) {\n                    Item.section = \"sec. \" + Item.section;\n                    sectionMasterLabel = \"sec.\";\n                } else {\n                    sectionMasterLabel = m[0].trim();\n                }\n            }\n            // If section is nil, then\n            //   (a) Do nothing\n            if (Item.section) {\n            // If section exists and locator is nil\n            //   (a) Set section string in locator field\n                if (!item.locator) {\n                    item.locator = Item.section;\n                } else {\n            // If both section and locator exist, then\n            //   (a) If locator starts with p., remove p., merge with space or no-space, and set in locator field\n            //   (b) If locator starts with non-p., prepend section value to locator with space, and set in locator field\n                    var m = item.locator.match(/^([^ ]*)\\s*(.*)/);\n                    var space = \" \";\n                    if (m) {\n                        if (m[1] === \"p.\" && sectionMasterLabel !== \"p.\") {\n                            item.locator = m[2];\n                        }\n                        if ([\"[\", \"(\", \".\", \",\", \";\", \":\", \"?\"].indexOf(item.locator.slice(0, 1)) > -1) {\n                            space = \"\";\n                        }\n                    } else {\n                       space = \"\"; \n                    }\n                    item.locator = Item.section + space + item.locator;\n                }\n                //Item.section = \"\";\n            }\n            item.label = \"\";\n            // And that's it. Pre-parse complete.\n        }\n    }\n};\n\n\nCSL.Engine.prototype.setNumberLabels = function (Item) {\n     if (Item.number\n        && [\"bill\", \"gazette\", \"legislation\",\"regulation\",\"treaty\"].indexOf(Item.type) > -1\n        && this.opt.development_extensions.consolidate_legal_items\n        && !this.tmp.shadow_numbers[\"number\"]) {\n\n        this.tmp.shadow_numbers[\"number\"] = {};\n        this.tmp.shadow_numbers[\"number\"].values = [];\n        this.tmp.shadow_numbers[\"number\"].plural = 0;\n        this.tmp.shadow_numbers[\"number\"].numeric = false;\n        this.tmp.shadow_numbers[\"number\"].label = false;\n        \n        // Labels embedded in number variable\n        var value = \"\" + Item.number;\n        value = value.split(\"\\\\\").join(\"\");\n        // Get first word, parse out labels only if it parses\n        var firstword = value.split(/\\s+/)[0];\n        var firstlabel = CSL.STATUTE_SUBDIV_STRINGS[firstword];\n        if (firstlabel) {\n            // Get list and match\n            var splt = value.split(CSL.STATUTE_SUBDIV_PLAIN_REGEX);\n            if (splt.length > 1) {\n                // Convert matches to localized form\n                var lst = [];\n                for (var j=1, jlen=splt.length; j < jlen; j += 1) {\n                    lst.push(splt[j].replace(/\\s*$/, \"\").replace(/^\\s*/, \"\"));\n                }\n                // Preemptively save to shadow_numbers\n                value = lst.join(\" \");\n            } else {\n                value = splt[0];\n            }\n            this.tmp.shadow_numbers[\"number\"].label = firstlabel;\n            this.tmp.shadow_numbers[\"number\"].values.push([\"Blob\", value, false]);\n            this.tmp.shadow_numbers[\"number\"].numeric = false;\n        } else {\n            this.tmp.shadow_numbers[\"number\"].values.push([\"Blob\", value, false]);\n            this.tmp.shadow_numbers[\"number\"].numeric = true;\n        }\n    }\n};\n\n/*global CSL: true */\n\nCSL.substituteOne = function (template) {\n    return function (state, list) {\n        if (!list) {\n            return \"\";\n        } else {\n            // (\"string\" === typeof list)\n            return template.replace(\"%%STRING%%\", list);\n        }\n    };\n};\n\n\n/**\n * Two-tiered substitutions gadget.\n * <p>This is used for\n * options like (now defunct) \"font-family\", where the option value\n * cannot be determined until the attribute is processed.\n * Need for this function might be reviewed at some point ...</p>\n * @param {String} template A template containing\n * <code>%%STRING%%</code> and <code>%%PARAM%%</code>\n * placeholders.  See {@link CSL.Output.Formats.html} for\n * examples.\n */\nCSL.substituteTwo = function (template) {\n    return function (param) {\n        var template2 = template.replace(\"%%PARAM%%\", param);\n        return function (state, list) {\n            if (!list) {\n                return \"\";\n            } else {\n                //(\"string\" === typeof list){\n                return template2.replace(\"%%STRING%%\", list);\n            }\n        };\n    };\n};\n\n/**\n * Generate string functions for designated output mode.\n * <p>Only \"html\" (the default) is supported at present.</p>\n * @param {String} mode Either \"html\" or \"rtf\", eventually.\n */\nCSL.Mode = function (mode) {\n    var decorations, params, param, func, val, args;\n    decorations = {};\n    params = CSL.Output.Formats[mode];\n    for (param in params) {\n        if (true) {\n\n            if (\"@\" !== param.slice(0, 1)) {\n                decorations[param] = params[param];\n                continue;\n            }\n            func = false;\n            val = params[param];\n            args = param.split('/');\n\n            if (typeof val === \"string\" && val.indexOf(\"%%STRING%%\") > -1)  {\n                if (val.indexOf(\"%%PARAM%%\") > -1) {\n                    func = CSL.substituteTwo(val);\n                } else {\n                    func = CSL.substituteOne(val);\n                }\n            } else if (typeof val === \"boolean\" && !val) {\n                func = CSL.Output.Formatters.passthrough;\n            } else if (typeof val === \"function\") {\n                func = val;\n            } else {\n                CSL.error(\"Bad \" + mode + \" config entry for \" + param + \": \" + val);\n            }\n\n            if (args.length === 1) {\n                decorations[args[0]] = func;\n            } else if (args.length === 2) {\n                if (!decorations[args[0]]) {\n                    decorations[args[0]] = {};\n                }\n                decorations[args[0]][args[1]] = func;\n            }\n        }\n    }\n    return decorations;\n};\n\n\n/**\n * Generate a separate list of formatting attributes.\n * <p>This generates a list of tuples containing attribute\n * information relevant to output formatting, in the order\n * fixed in the constant {@link CSL.FORMAT_KEY_SEQUENCE}.\n * This function is called during {@link CSL.Core.Build}.\n * Formatting hints are distilled to functions\n * later, in the second compilation pass ({@link CSL.Core.Configure}).</p>\n * @param {Object} state The state object returned by\n * {@link CSL.Engine}.\n * @param {Object} attributes The hash object containing\n * the attributes and values extracted from an XML node.\n */\nCSL.setDecorations = function (state, attributes) {\n    var ret, key, pos;\n    // This applies a fixed processing sequence\n    ret = [];\n    for (pos in CSL.FORMAT_KEY_SEQUENCE) {\n        if (true) {\n            var key = CSL.FORMAT_KEY_SEQUENCE[pos];\n            if (attributes[key]) {\n                ret.push([key, attributes[key]]);\n                delete attributes[key];\n            }\n        }\n    }\n    return ret;\n};\n\nCSL.Doppeler = function(rexStr, stringMangler) {\n    var matchRex = new RegExp(\"(\" + rexStr + \")\", \"g\");\n    var splitRex = new RegExp(rexStr, \"g\");\n    this.split = function (str) {\n        // Normalize markup\n        if (stringMangler) {\n            str = stringMangler(str);\n        }\n        var match = str.match(matchRex);\n        if (!match) {\n            return {\n                tags: [],\n                strings: [str]\n            };\n        }\n        var split = str.split(splitRex);\n        for (var i=match.length-1; i> -1; i--) {\n            if (typeof match[i] === \"number\") {\n                match[i] = \"\";\n            }\n            var tag = match[i];\n            if (tag === \"\\'\" && split[i+1].length > 0) {\n                // Fixes https://forums.zotero.org/discussion/comment/294317\n                split[i+1] = match[i] + split[i+1];\n                match[i] = \"\";\n            }\n        }\n        return {\n            tags: match,\n            strings: split,\n            origStrings: split.slice()\n        };\n    };\n    this.join = function (obj) {\n        var lst = obj.strings.slice(-1);\n        for (var i=obj.tags.length-1; i>-1; i--) {\n            lst.push(obj.tags[i]);\n            lst.push(obj.strings[i]);\n        }\n        lst.reverse();\n        return lst.join(\"\");\n    };\n};\n\nCSL.Engine.prototype.normalDecorIsOrphan = function (blob, params) {\n    //print(\"params: \"+JSON.stringify(params));\n    if (params[1] === \"normal\") {\n        var use_param = false;\n        var all_the_decor;\n        if (this.tmp.area === \"citation\") {\n            all_the_decor = [this.citation.opt.layout_decorations].concat(blob.alldecor);\n        } else {\n            all_the_decor = blob.alldecor;\n        }\n        for (var k = all_the_decor.length - 1; k > -1; k += -1) {\n            //print(\"  all decor: \"+JSON.stringify(all_the_decor[k]));\n            for (var n = all_the_decor[k].length - 1; n > -1; n += -1) {\n                //print(\"  superior param\"+n+\": \"+all_the_decor[k][n][0]);\n                if (all_the_decor[k][n][0] === params[0]) {\n                    //print(\"  HIT!\");\n                    if (all_the_decor[k][n][1] !== \"normal\") {\n                        use_param = true;\n                    }\n                }\n            }\n        }\n        if (!use_param) {\n            return true;\n        }\n    }\n    return false;\n};\n\n/*global CSL: true */\n\n\nCSL.Engine.prototype.getCitationLabel = function (Item) {\n    var label = \"\";\n    var params = this.getTrigraphParams();\n    var config = params[0];\n    var myname = this.getTerm(\"reference\", \"short\", 0);\n    if (\"undefined\" === typeof myname) {\n        myname = \"reference\";\n    }\n    myname = myname.replace(\".\", \"\");\n    myname = myname.slice(0, 1).toUpperCase() + myname.slice(1);\n    for (var i = 0, ilen = CSL.NAME_VARIABLES.length; i < ilen; i += 1) {\n        var n = CSL.NAME_VARIABLES[i];\n        if (Item[n]) {\n            var names = Item[n];\n            if (names.length > params.length) {\n                config = params[params.length - 1];\n            } else {\n                config = params[names.length - 1];\n            }\n            for (var j = 0, jlen = names.length; j < jlen; j += 1) {\n                if (j === config.authors.length) {\n                    break;\n                }\n                var res = this.nameOutput.getName(names[j], \"locale-translit\", true);\n                var name = res.name;\n                if (name && name.family) {\n                    myname = name.family;\n                    myname = myname.replace(/^([ \\'\\u2019a-z]+\\s+)/, \"\");\n\n                } else if (name && name.literal) {\n                    myname = name.literal;\n                }\n                var m = myname.toLowerCase().match(/^(a\\s+|the\\s+|an\\s+)/);\n                if (m) {\n                    myname = myname.slice(m[1].length);\n                }\n                myname = myname.replace(CSL.ROMANESQUE_NOT_REGEXP, \"\");\n                if (!myname) {\n                    break;\n                }\n                myname = myname.slice(0, config.authors[j]);\n                if (myname.length > 1) {\n                    myname = myname.slice(0, 1).toUpperCase() + myname.slice(1).toLowerCase();\n                } else if (myname.length === 1) {\n                    myname = myname.toUpperCase();\n                }\n                label += myname;\n            }\n            break;\n        }\n    }\n    if (!label) {\n        // Try for something using title\n        if (Item.title) {\n            var skipWords = this.locale[this.opt.lang].opts[\"skip-words\"];\n            var lst = Item.title.split(/\\s+/);\n            for (var i = lst.length - 1; i > -1; i--) {\n                if (skipWords.indexOf(lst[i]) > -1) {\n                    lst = lst.slice(0, i).concat(lst.slice(i + 1));\n                }\n            }\n            var str = lst.join('');\n            str = str.slice(0, params[0].authors[0]);\n            if (str.length > 1) {\n                str = str.slice(0, 1).toUpperCase() + str.slice(1).toLowerCase();\n            } else if (str.length === 1) {\n                str = str.toUpperCase();\n            }\n            label = str;\n        }\n    }\n    var year = \"0000\";\n    if (Item.issued) {\n        if (Item.issued.year) {\n            year = \"\" + Item.issued.year;\n        }\n    }\n    year = year.slice((config.year * -1));\n    label = label + year;\n    return label;\n};\n\nCSL.Engine.prototype.getTrigraphParams = function () {\n    var params = [];\n    var ilst = this.opt.trigraph.split(\":\");\n    if (!this.opt.trigraph || this.opt.trigraph.slice(0,1) !== \"A\") {\n        CSL.error(\"Bad trigraph definition: \"+this.opt.trigraph);\n    }\n    for (var i = 0, ilen = ilst.length; i < ilen; i += 1) {\n        var str = ilst[i];\n        var config = {authors:[], year:0};\n        for (var j = 0, jlen = str.length; j < jlen; j += 1) {\n            switch (str.slice(j,j+1)) {\n            case \"A\":\n                config.authors.push(1);\n                break;\n            case \"a\":\n                config.authors[config.authors.length - 1] += 1;\n                break;\n            case \"0\":\n                config.year += 1;\n                break;\n            default:\n                CSL.error(\"Invalid character in trigraph definition: \"+this.opt.trigraph);\n            }\n        }\n        params.push(config);\n    }\n    return params;\n};\n\n/*global CSL: true */\n\nCSL.Engine.prototype.setOutputFormat = function (mode) {\n    this.opt.mode = mode;\n    this.fun.decorate = CSL.Mode(mode);\n    if (!this.output[mode]) {\n        this.output[mode] = {};\n        this.output[mode].tmp = {};\n    }\n};\n\nCSL.Engine.prototype.getSortFunc = function () {\n    return function (a,b) {\n        a = a.split(\"-\");\n        b = b.split(\"-\");\n        if (a.length < b.length) {\n            return 1;\n        } else if (a.length > b.length) {\n            return -1;\n        } else {\n            a = a.slice(-1)[0];\n            b = b.slice(-1)[0];\n            if (a.length < b.length) {\n                return 1;\n            } else if (a.length > b.length) {\n                return -1;\n            } else {\n                return 0;\n            }\n        }\n    };\n};\n\nCSL.Engine.prototype.setLangTagsForCslSort = function (tags) {\n    var i, ilen;\n    if (tags) {\n        this.opt['locale-sort'] = [];\n        for (i = 0, ilen = tags.length; i < ilen; i += 1) {\n            this.opt['locale-sort'].push(tags[i]);\n        }\n    }\n    this.opt['locale-sort'].sort(this.getSortFunc());\n};\n    \nCSL.Engine.prototype.setLangTagsForCslTransliteration = function (tags) {\n    var i, ilen;\n    this.opt['locale-translit'] = [];\n    if (tags) {\n        for (i = 0, ilen = tags.length; i < ilen; i += 1) {\n            this.opt['locale-translit'].push(tags[i]);\n        }\n    }\n    this.opt['locale-translit'].sort(this.getSortFunc());\n};\n    \nCSL.Engine.prototype.setLangTagsForCslTranslation = function (tags) {\n    var i, ilen;\n    this.opt['locale-translat'] = [];\n    if (tags) {\n        for (i = 0, ilen = tags.length; i < ilen; i += 1) {\n            this.opt['locale-translat'].push(tags[i]);\n        }\n    }\n    this.opt['locale-translat'].sort(this.getSortFunc());\n};\n\nCSL.Engine.prototype.setLangPrefsForCites = function (obj, conv) {\n    var opt = this.opt['cite-lang-prefs'];\n    if (!conv) {\n        conv = function (key) {\n            return key.toLowerCase();\n        };\n    }\n    var segments = ['Persons', 'Institutions', 'Titles', 'Journals', 'Publishers', 'Places'];\n    // Set values in place\n    for (var i = 0, ilen = segments.length; i < ilen; i += 1) {\n        var clientSegment = conv(segments[i]);\n        var citeprocSegment = segments[i].toLowerCase();\n        if (!obj[clientSegment]) {\n            continue;\n        }\n        //\n        // Normalize the sequence of secondary and tertiary\n        // in the provided obj segment list.\n        //\n        var supplements = [];\n        while (obj[clientSegment].length > 1) {\n            supplements.push(obj[clientSegment].pop());\n        }\n        var sortval = {orig:1,translit:2,translat:3};\n        if (supplements.length === 2 && sortval[supplements[0]] < sortval[supplements[1]]) {\n            supplements.reverse();\n        }\n        while (supplements.length) {\n            obj[clientSegment].push(supplements.pop());\n        }\n        //\n        // normalization done.\n        //\n        var lst = opt[citeprocSegment];\n        while (lst.length) {\n            lst.pop();\n        }\n        for (var j = 0, jlen = obj[clientSegment].length; j < jlen; j += 1) {\n            lst.push(obj[clientSegment][j]);\n        }\n    }\n};\n\nCSL.Engine.prototype.setLangPrefsForCiteAffixes = function (affixList) {\n    if (affixList && affixList.length === 48) {\n        var affixes = this.opt.citeAffixes;\n        var count = 0;\n        var settings = [\"persons\", \"institutions\", \"titles\", \"journals\", \"publishers\", \"places\"];\n        var forms = [\"translit\", \"orig\", \"translit\", \"translat\"];\n        var value;\n        for (var i = 0, ilen = settings.length; i < ilen; i += 1) {\n            for (var j = 0, jlen = forms.length; j < jlen; j += 1) {\n                value = \"\";\n                if ((count % 8) === 4) {\n                    if (!affixes[settings[i]][\"locale-\"+forms[j]].prefix\n                        && !affixes[settings[i]][\"locale-\"+forms[j]].suffix) {\n\n                        value = affixList[count] ? affixList[count] : \"\";\n                        affixes[settings[i]][\"locale-\" + forms[j]].prefix = value;\n                        value = affixList[count] ? affixList[count + 1] : \"\";\n                        affixes[settings[i]][\"locale-\" + forms[j]].suffix = value;\n                    }\n                } else {\n                    value = affixList[count] ? affixList[count] : \"\";\n                    affixes[settings[i]][\"locale-\" + forms[j]].prefix = value;\n                    value = affixList[count] ? affixList[count + 1] : \"\";\n                    affixes[settings[i]][\"locale-\" + forms[j]].suffix = value;\n                }\n                count += 2;\n            }\n        }\n        this.opt.citeAffixes = affixes;\n    }\n};\n\nCSL.Engine.prototype.setAutoVietnameseNamesOption = function (arg) {\n    if (arg) {\n        this.opt[\"auto-vietnamese-names\"] = true;\n    } else {\n        this.opt[\"auto-vietnamese-names\"] = false;\n    }\n};\n\nCSL.Engine.prototype.setAbbreviations = function (arg) {\n    if (this.sys.setAbbreviations) {\n        this.sys.setAbbreviations(arg);\n    }\n};\n\nCSL.Engine.prototype.setSuppressTrailingPunctuation = function (arg) {\n    this.citation.opt.suppressTrailingPunctuation = !!arg;\n};\n\n/*global CSL: true */\n\nCSL.Output = {};\n/**\n * Output queue object.\n * @class\n */\nCSL.Output.Queue = function (state) {\n    this.levelname = [\"top\"];\n    this.state = state;\n    this.queue = [];\n    this.empty = new CSL.Token(\"empty\");\n    var tokenstore = {};\n    tokenstore.empty = this.empty;\n    this.formats = new CSL.Stack(tokenstore);\n    this.current = new CSL.Stack(this.queue);\n};\n\n// XXX This works, but causes a mismatch in api_cite\n// Could insert a placeholder\n// Better to have a function that spits out an independent blob.\n// Is that possible though?\n// Okay. Use queue.append() with fake_queue instead.\nCSL.Output.Queue.prototype.pop = function () {\n    // For some reason, state.output.current.value() here can be an array, \n    // not a blob ... ?\n    var drip = this.current.value();\n    if (drip.length) {\n        return drip.pop();\n    } else {\n        return drip.blobs.pop();\n    }\n};\n\nCSL.Output.Queue.prototype.getToken = function (name) {\n    var ret = this.formats.value()[name];\n    return ret;\n};\n\nCSL.Output.Queue.prototype.mergeTokenStrings = function (base, modifier) {\n    var base_token, modifier_token, ret, key;\n    base_token = this.formats.value()[base];\n    modifier_token = this.formats.value()[modifier];\n    ret = base_token;\n    if (modifier_token) {\n        if (!base_token) {\n            base_token = new CSL.Token(base, CSL.SINGLETON);\n            base_token.decorations = [];\n        }\n        ret = new CSL.Token(base, CSL.SINGLETON);\n        var key = \"\";\n        for (var key in base_token.strings) {\n            if (base_token.strings.hasOwnProperty(key)) {\n                ret.strings[key] = base_token.strings[key];\n            }\n        }\n        for (var key in modifier_token.strings) {\n            if (modifier_token.strings.hasOwnProperty(key)) {\n                ret.strings[key] = modifier_token.strings[key];\n            }\n        }\n        ret.decorations = base_token.decorations.concat(modifier_token.decorations);\n    }\n    return ret;\n};\n\n// Store a new output format token based on another\nCSL.Output.Queue.prototype.addToken = function (name, modifier, token) {\n    var newtok, attr;\n    newtok = new CSL.Token(\"output\");\n    if (\"string\" === typeof token) {\n        token = this.formats.value()[token];\n    }\n    if (token && token.strings) {\n        for (attr in token.strings) {\n            if (token.strings.hasOwnProperty(attr)) {\n                newtok.strings[attr] = token.strings[attr];\n            }\n        }\n        newtok.decorations = token.decorations;\n\n    }\n    if (\"string\" === typeof modifier) {\n        newtok.strings.delimiter = modifier;\n    }\n    this.formats.value()[name] = newtok;\n};\n\n//\n// newFormat adds a new bundle of formatting tokens to\n// the queue's internal stack of such bundles\nCSL.Output.Queue.prototype.pushFormats = function (tokenstore) {\n    if (!tokenstore) {\n        tokenstore = {};\n    }\n    tokenstore.empty = this.empty;\n    this.formats.push(tokenstore);\n};\n\n\nCSL.Output.Queue.prototype.popFormats = function () {\n    this.formats.pop();\n};\n\nCSL.Output.Queue.prototype.startTag = function (name, token) {\n    var tokenstore = {};\n    if (this.state.tmp[\"doing-macro-with-date\"] && this.state.tmp.extension) {\n        token = this.empty;\n        name = \"empty\";\n    }\n    tokenstore[name] = token;\n    this.pushFormats(tokenstore);\n    this.openLevel(name);\n};\n\nCSL.Output.Queue.prototype.endTag = function (name) {\n    this.closeLevel(name);\n    this.popFormats();\n};\n\n//\n// newlevel adds a new blob object to the end of the current\n// list, and adjusts the current pointer so that subsequent\n// appends are made to blob list of the new object.\n\nCSL.Output.Queue.prototype.openLevel = function (token) {\n    var blob, curr;\n    if (\"object\" === typeof token) {\n        // delimiter, prefix, suffix, decorations from token\n        blob = new CSL.Blob(undefined, token);\n    } else if (\"undefined\" === typeof token) {\n        blob = new CSL.Blob(undefined, this.formats.value().empty, \"empty\");\n    } else {\n        if (!this.formats.value() || !this.formats.value()[token]) {\n            CSL.error(\"CSL processor error: call to nonexistent format token \\\"\" + token + \"\\\"\");\n        }\n        // delimiter, prefix, suffix, decorations from token\n        blob = new CSL.Blob(undefined, this.formats.value()[token], token);\n    }\n    curr = this.current.value();\n    if (!this.state.tmp.just_looking && this.checkNestedBrace) {\n        blob.strings.prefix = this.checkNestedBrace.update(blob.strings.prefix);\n    }\n    curr.push(blob);\n    this.current.push(blob);\n};\n\n/**\n * \"merge\" used to be real complicated, now it's real simple.\n */\nCSL.Output.Queue.prototype.closeLevel = function (name) {\n    // CLEANUP: Okay, so this.current.value() holds the blob at the\n    // end of the current list.  This is wrong.  It should\n    // be the parent, so that we have  the choice of reading\n    // the affixes and decorations, or appending to its\n    // content.  The code that manipulates blobs will be\n    // much simpler that way.\n    if (name && name !== this.current.value().levelname) {\n        CSL.error(\"Level mismatch error:  wanted \" + name + \" but found \" + this.current.value().levelname);\n    }\n    var blob = this.current.pop();\n    if (!this.state.tmp.just_looking && this.checkNestedBrace) {\n        blob.strings.suffix = this.checkNestedBrace.update(blob.strings.suffix);\n    }\n};\n\n//\n// append does the same thing as newlevel, except\n// that the blob it pushes has text content,\n// and the current pointer is not moved after the push.\n\nCSL.Output.Queue.prototype.append = function (str, tokname, notSerious, ignorePredecessor, noStripPeriods) {\n    var token, blob, curr;\n    var useblob = true;\n    if (notSerious) {\n        ignorePredecessor = true;\n    }\n    // XXXXX Nasty workaround, but still an improvement\n    // over the reverse calls to the cs:date node build\n    // function that we had before.\n    if (this.state.tmp[\"doing-macro-with-date\"] && !notSerious) {\n        if (tokname !== \"macro-with-date\") {\n            return false;\n        }\n        if (tokname === \"macro-with-date\") {\n            tokname = \"empty\";\n        }\n    }\n    if (\"undefined\" === typeof str) {\n        return false;\n    }\n    if (\"number\" === typeof str) {\n        str = \"\" + str;\n    }\n    if (!notSerious \n        && this.state.tmp.element_trace \n        && this.state.tmp.element_trace.value() === \"suppress-me\") {\n        \n        return false;\n    }\n    blob = false;\n    if (!tokname) {\n        token = this.formats.value().empty;\n    } else if (tokname === \"literal\") {\n        token = true;\n        useblob = false;\n    } else if (\"string\" === typeof tokname) {\n        token = this.formats.value()[tokname];\n    } else {\n        token = tokname;\n    }\n    if (!token) {\n        CSL.error(\"CSL processor error: unknown format token name: \" + tokname);\n    }\n    // Unset delimiters must be left undefined until they reach the queue\n    // in order to discriminate unset from explicitly empty delimiters\n    // when inheriting a default value from a superior node. [??? really ???]\n    if (token.strings && \"undefined\" === typeof token.strings.delimiter) {\n        token.strings.delimiter = \"\";\n    }\n    if (\"string\" === typeof str && str.length) {\n\n        // Source (;?!»«): http://en.wikipedia.org/wiki/Space_(punctuation)#Breaking_and_non-breaking_spaces\n        // Source (:): http://forums.zotero.org/discussion/4933/localized-quotes/#Comment_88384\n        str = str.replace(/ ([:;?!\\u00bb])/g, \"\\u202f$1\").replace(/\\u00ab /g, \"\\u00ab\\u202f\");\n\n        this.last_char_rendered = str.slice(-1);\n        // This, and not the str argument below on flipflop, is the\n        // source of the flipflopper string source.\n        str = str.replace(/\\s+'/g, \" \\'\");\n        if (!notSerious) {\n            // this condition for sort_LeadingApostropheOnNameParticle\n            str = str.replace(/^'/g, \" \\'\");\n        }\n\n        // signal whether we end with terminal punctuation?\n        if (!ignorePredecessor) {\n            this.state.tmp.term_predecessor = true;\n            this.state.tmp.in_cite_predecessor = true;\n        } else if (notSerious) {\n            this.state.tmp.term_predecessor_name = true;\n        }\n    }\n    blob = new CSL.Blob(str, token);\n    curr = this.current.value();\n    if (\"undefined\" === typeof curr && this.current.mystack.length === 0) {\n        // XXXX An operation like this is missing somewhere, this should NOT be necessary.\n        // Addresses error triggered in multi-layouts.\n        this.current.mystack.push([]);\n        curr = this.current.value();\n    }\n    if (\"string\" === typeof blob.blobs) {\n        if (!ignorePredecessor) {\n            this.state.tmp.term_predecessor = true;\n            this.state.tmp.in_cite_predecessor = true;\n        } else if (notSerious) {\n            this.state.tmp.term_predecessor_name = true;\n        }\n    }\n    //\n    // Caution: The parallel detection machinery will blow up if tracking\n    // variables are not properly initialized elsewhere.\n    //\n    if (\"string\" === typeof str) {\n        if (\"string\" === typeof blob.blobs) {\n            if (blob.blobs.slice(0, 1) !== \" \") {\n                var blobPrefix = \"\";\n                var blobBlobs = blob.blobs;\n                while (CSL.TERMINAL_PUNCTUATION.indexOf(blobBlobs.slice(0, 1)) > -1) {\n                    blobPrefix = blobPrefix + blobBlobs.slice(0, 1);\n                    blobBlobs = blobBlobs.slice(1);\n                }\n                if (blobBlobs && blobPrefix) {\n                    blob.strings.prefix = blob.strings.prefix + blobPrefix;\n                    blob.blobs = blobBlobs;\n                }\n            }\n        }\n        if (blob.strings[\"text-case\"]) {\n            //\n            // This one is _particularly_ hard to follow.  It's not obvious,\n            // but the blob already contains the input string at this\n            // point, as blob.blobs -- it's a terminal node, as it were.\n            // The str variable also contains the input string, but\n            // that copy is not used for onward processing.  We have to\n            // apply our changes to the blob copy.\n            //\n            blob.blobs = CSL.Output.Formatters[blob.strings[\"text-case\"]](this.state, str);\n        }\n        if (this.state.tmp.strip_periods && !noStripPeriods) {\n            blob.blobs = blob.blobs.replace(/\\.([^a-z]|$)/g, \"$1\");\n        }\n        for (var i = blob.decorations.length - 1; i > -1; i += -1) {\n            if (blob.decorations[i][0] === \"@quotes\" && blob.decorations[i][1] !== \"false\") {\n                blob.punctuation_in_quote = this.state.getOpt(\"punctuation-in-quote\");\n            }\n            if (!blob.blobs.match(CSL.ROMANESQUE_REGEXP)) {\n                if (blob.decorations[i][0] === \"@font-style\") {\n                    blob.decorations = blob.decorations.slice(0, i).concat(blob.decorations.slice(i + 1));\n                }\n            }\n        }\n        //\n        // XXX: Beware superfluous code in your code.  str in this\n        // case is not the source of the final rendered string.\n        // See note above.\n        //\n        curr.push(blob);\n        this.state.fun.flipflopper.processTags(blob);\n    } else if (useblob) {\n        curr.push(blob);\n    } else {\n        curr.push(str);\n    }\n    return true;\n};\n\nCSL.Output.Queue.prototype.string = function (state, myblobs, blob) {\n    var i, ilen, j, jlen, b;\n    //if (blob && blob.strings.delimiter) {\n    //    print(\"DELIMITER: \"+blob.strings.delimiter+\" on \"+[x.blobs[0].num for each (x in myblobs)]);\n    //}\n    //var blobs, ret, blob_delimiter, i, params, blobjr, last_str, last_char, b, use_suffix, qres, addtoret, span_split, j, res, blobs_start, blobs_end, key, pos, len, ppos, llen, ttype, ltype, terminal, leading, delimiters, use_prefix, txt_esc;\n    var txt_esc = CSL.getSafeEscape(this.state);\n    var blobs = myblobs.slice();\n    var ret = [];\n    \n    if (blobs.length === 0) {\n        return ret;\n    }\n\n    var blob_delimiter = \"\";\n    if (blob) {\n        blob_delimiter = blob.strings.delimiter;\n    } else {\n        //print(\"=== Setting false to start ===\");\n        state.tmp.count_offset_characters = false;\n        state.tmp.offset_characters = 0;\n    }\n\n    if (blob && blob.new_locale) {\n        blob.old_locale = state.opt.lang;\n        state.opt.lang = blob.new_locale;\n    }\n\n    var blobjr, use_suffix, use_prefix, params;\n    for (var i = 0, ilen = blobs.length; i < ilen; i += 1) {\n        blobjr = blobs[i];\n\n        if (blobjr.strings.first_blob) {\n            // Being the Item.id of the the entry being rendered.\n            //print(\"  -- turning on counting\");\n            state.tmp.count_offset_characters = blobjr.strings.first_blob;\n        }\n\n        if (\"string\" === typeof blobjr.blobs) {\n            if (\"number\" === typeof blobjr.num) {\n                ret.push(blobjr);\n            } else if (blobjr.blobs) {\n                if (blobjr.particle) {\n                    blobjr.blobs = blobjr.particle + blobjr.blobs;\n                    blobjr.particle = \"\";\n                }\n                // (skips empty strings)\n                //b = txt_esc(blobjr.blobs);\n                b = txt_esc(blobjr.blobs);\n                var blen = b.length;\n\n                if (!state.tmp.suppress_decorations) {\n                    for (j = 0, jlen = blobjr.decorations.length; j < jlen; j += 1) {\n                        params = blobjr.decorations[j];\n                        if (params[0] === \"@showid\") {\n                            continue;\n                        }\n                        if (state.normalDecorIsOrphan(blobjr, params)) {\n                            continue;\n                        }\n                        b = state.fun.decorate[params[0]][params[1]].call(blobjr, state, b, params[2]);\n                    }\n                }\n                //\n                // because we will rip out portions of the output\n                // queue before rendering, group wrappers need\n                // to produce no output if they are found to be\n                // empty.\n                if (b && b.length) {\n                    b = txt_esc(blobjr.strings.prefix) + b + txt_esc(blobjr.strings.suffix);\n                    if (state.opt.development_extensions.csl_reverse_lookup_support && !state.tmp.suppress_decorations) {\n                        for (j = 0, jlen = blobjr.decorations.length; j < jlen; j += 1) {\n                            params = blobjr.decorations[j];\n\n                            if (params[0] === \"@showid\") {\n                                b = state.fun.decorate[params[0]][params[1]].call(blobjr, state, b, params[2]);\n                            }\n                        }\n                    }\n                    ret.push(b);\n                    if (state.tmp.count_offset_characters) {\n                        state.tmp.offset_characters += (blen + blobjr.strings.suffix.length + blobjr.strings.prefix.length);\n                    }\n                }\n            }\n        } else if (blobjr.blobs.length) {\n            var addtoret = state.output.string(state, blobjr.blobs, blobjr);\n            if (blob) {\n                // Patch up world-class weird bug in the ill-constructed code of mine.\n                if (\"string\" !== addtoret && addtoret.length > 1 && blobjr.strings.delimiter) {\n                    var numberSeen = false;\n                    for (var j=0,jlen=addtoret.length;j<jlen;j++) {\n                        if (\"string\" !== typeof addtoret[j]) {\n                            numberSeen = true;\n                        } else if (numberSeen) {\n                            addtoret[j] = (blobjr.strings.delimiter + addtoret[j]);\n                        }\n                    }\n                }\n            }\n            ret = ret.concat(addtoret);\n        }\n        if (blobjr.strings.first_blob && state.registry.registry[blobjr.strings.first_blob]) {\n            // The Item.id of the entry being rendered.\n            state.registry.registry[blobjr.strings.first_blob].offset = state.tmp.offset_characters;\n            state.tmp.count_offset_characters = false;\n        }\n    }\n\n    // Provide delimiters on adjacent numeric blobs\n    for (i=0,ilen=ret.length - 1;i<ilen;i+=1) {\n        if (\"number\" === typeof ret[i].num && \"number\" === typeof ret[i+1].num && !ret[i+1].UGLY_DELIMITER_SUPPRESS_HACK) {\n            // XXX watch this\n            ret[i].strings.suffix = ret[i].strings.suffix + (blob_delimiter ? blob_delimiter : \"\");\n            ret[i+1].successor_prefix = \"\";\n            ret[i+1].UGLY_DELIMITER_SUPPRESS_HACK = true;\n        }\n    }\n\n    var span_split = 0;\n    for (var i = 0, ilen = ret.length; i < ilen; i += 1) {\n        if (\"string\" === typeof ret[i]) {\n            span_split = (parseInt(i, 10) + 1);\n            if (i < ret.length - 1  && \"object\" === typeof ret[i + 1]) {\n                if (blob_delimiter && !ret[i + 1].UGLY_DELIMITER_SUPPRESS_HACK) {\n                    ret[i] += txt_esc(blob_delimiter);\n                }\n                // One bite of the apple\n                ret[i + 1].UGLY_DELIMITER_SUPPRESS_HACK = true;\n            }\n            //span_split = ret.length;\n            //print(\"XXX ret: \"+ret+\" -- \"+blob_delimiter);\n        }\n    }\n/*\n    if (blob && (blob.decorations.length || blob.strings.suffix || blob.strings.prefix)) {\n        span_split = ret.length;\n    }\n*/\n    if (blob && (blob.decorations.length || blob.strings.suffix)) {\n        span_split = ret.length;\n    } else if (blob && blob.strings.prefix) {\n        for (var i=0,ilen=ret.length;i<ilen;i++) {\n            if (\"undefined\" !== typeof ret[i].num) {\n                span_split = i;\n                if (i === 0) {\n                    ret[i].strings.prefix = blob.strings.prefix + ret[i].strings.prefix;\n                }\n                break;\n            }\n        }\n    }\n\n    var blobs_start = state.output.renderBlobs(ret.slice(0, span_split), blob_delimiter, false, blob);\n    if (blobs_start && blob && (blob.decorations.length || blob.strings.suffix || blob.strings.prefix)) {\n        if (!state.tmp.suppress_decorations) {\n            for (var i = 0, ilen = blob.decorations.length; i < ilen; i += 1) {\n                params = blob.decorations[i];\n                if ([\"@cite\",\"@bibliography\", \"@display\", \"@showid\"].indexOf(params[0]) > -1) {\n                    continue;\n                }\n                if (state.normalDecorIsOrphan(blobjr, params)) {\n                    continue;\n                }\n                if (!params[0]) continue;\n                if (\"string\" === typeof blobs_start) {\n                    blobs_start = state.fun.decorate[params[0]][params[1]].call(blob, state, blobs_start, params[2]);\n                }\n            }\n        }\n        //\n        // XXXX: cut-and-paste warning.  same as a code block above.\n        //\n        b = blobs_start;\n        use_suffix = blob.strings.suffix;\n        if (b && b.length) {\n            use_prefix = blob.strings.prefix;\n            b = txt_esc(use_prefix) + b + txt_esc(use_suffix);\n            if (state.tmp.count_offset_characters) {\n                state.tmp.offset_characters += (use_prefix.length + use_suffix.length);\n            }\n        }\n        blobs_start = b;\n        if (!state.tmp.suppress_decorations) {\n            for (var i = 0, ilen = blob.decorations.length; i < ilen; i += 1) {\n                params = blob.decorations[i];\n                if ([\"@cite\",\"@bibliography\", \"@display\", \"@showid\"].indexOf(params[0]) === -1) {\n                    continue;\n                }\n                if (\"string\" === typeof blobs_start) {\n                    blobs_start = state.fun.decorate[params[0]][params[1]].call(blob, state, blobs_start, params[2]);\n                }\n            }\n        }\n    }\n\n    var blobs_end = ret.slice(span_split, ret.length);\n    if (!blobs_end.length && blobs_start) {\n        ret = [blobs_start];\n    } else if (blobs_end.length && !blobs_start) {\n        ret = blobs_end;\n    } else if (blobs_start && blobs_end.length) {\n        ret = [blobs_start].concat(blobs_end);\n    }\n    //\n    // Blobs is now definitely a string with\n    // trailing blobs.  Return it.\n    if (\"undefined\" === typeof blob) {\n        this.queue = [];\n        this.current.mystack = [];\n        this.current.mystack.push(this.queue);\n        if (state.tmp.suppress_decorations) {\n            ret = state.output.renderBlobs(ret, undefined, false);\n        }\n    } else if (\"boolean\" === typeof blob) {\n        ret = state.output.renderBlobs(ret, undefined, true);\n    }\n\n    if (blob && blob.new_locale) {\n        state.opt.lang = blob.old_locale;\n    }\n    //if (!blob && !state.tmp.just_looking) {\n    //  print(\"QUEUE (\"+ state.tmp.just_looking +\"): \"+JSON.stringify(state.output.queue, [\"num\", \"strings\", \"decorations\", \"blobs\", \"prefix\", \"suffix\", \"delimiter\"], 2));\n    //}\n    return ret;\n};\n\nCSL.Output.Queue.prototype.clearlevel = function () {\n    var blob, pos, len;\n    blob = this.current.value();\n    len = blob.blobs.length;\n    for (pos = 0; pos < len; pos += 1) {\n        blob.blobs.pop();\n    }\n};\n\nCSL.Output.Queue.prototype.renderBlobs = function (blobs, delim, in_cite, parent) {\n    var state, ret, ret_last_char, use_delim, blob, pos, len, ppos, llen, str, params, txt_esc;\n    txt_esc = CSL.getSafeEscape(this.state);\n    if (!delim) {\n        delim = \"\";\n    }\n    state = this.state;\n    ret = \"\";\n    ret_last_char = [];\n    use_delim = \"\";\n    len = blobs.length;\n    if (this.state.tmp.area === \"citation\" && !this.state.tmp.just_looking && len === 1 && typeof blobs[0] === \"object\" && parent) {\n        blobs[0].strings.prefix = parent.strings.prefix + blobs[0].strings.prefix;\n        blobs[0].strings.suffix = blobs[0].strings.suffix + parent.strings.suffix;\n        blobs[0].decorations = blobs[0].decorations.concat(parent.decorations);\n        blobs[0].params = parent.params;\n        return blobs[0];\n    }\n    var start = true;\n    for (pos = 0; pos < len; pos += 1) {\n        if (blobs[pos].checkNext) {\n            blobs[pos].checkNext(blobs[pos + 1],start);\n            start = false;\n        } else if (blobs[pos+1] && blobs[pos+1].splice_prefix) {\n            start = false;\n            //blobs[pos+1].checkNext(blobs[pos + 1],start);\n        } else {\n            start = true;\n        }\n    }\n    \n    // print(\"LEN=\"+len+\" \"+JSON.stringify(blobs, null, 2));\n    // Fix last non-range join\n    var doit = true;\n    for (pos = blobs.length - 1; pos > 0; pos += -1) {\n        if (blobs[pos].checkLast) {\n            if (doit && blobs[pos].checkLast(blobs[pos - 1])) {\n                doit = false;\n            }\n        } else {\n            doit = true;\n        }\n    }\n    len = blobs.length;\n    for (pos = 0; pos < len; pos += 1) {\n        blob = blobs[pos];\n        if (ret) {\n            use_delim = delim;\n        }\n        if (\"string\" === typeof blob) {\n            ret += txt_esc(use_delim);\n            // XXX Blob should be run through flipflop and flattened here.\n            // (I think it must be a fragment of text around a numeric\n            // variable)\n            ret += blob;\n            if (state.tmp.count_offset_characters) {\n                //state.tmp.offset_characters += (use_delim.length + blob.length);\n                state.tmp.offset_characters += (use_delim.length);\n            }\n        } else if (in_cite) {\n            // pass\n            // Okay, so this does it -- but we're now not able to return a string!\n            if (ret) {\n                ret = [ret, blob];\n            } else {\n                ret = [blob];\n            }\n        } else if (blob.status !== CSL.SUPPRESS) {\n            if (blob.particle) {\n                str = blob.particle + blob.num;\n            } else {\n                str = blob.formatter.format(blob.num, blob.gender);\n            }\n            // Workaround to get a more or less accurate value.\n            var strlen = str.replace(/<[^>]*>/g, \"\").length;\n            // notSerious\n            this.append(str, \"empty\", true);\n            var str_blob = this.pop();\n            var count_offset_characters = state.tmp.count_offset_characters;\n            str = this.string(state, [str_blob], false);\n            state.tmp.count_offset_characters = count_offset_characters;\n            if (blob.strings[\"text-case\"]) {\n                str = CSL.Output.Formatters[blob.strings[\"text-case\"]](this.state, str);\n            }\n            if (str && this.state.tmp.strip_periods) {\n                str = str.replace(/\\.([^a-z]|$)/g, \"$1\");\n            }\n            if (!state.tmp.suppress_decorations) {\n                llen = blob.decorations.length;\n                for (ppos = 0; ppos < llen; ppos += 1) {\n                    params = blob.decorations[ppos];\n                    if (state.normalDecorIsOrphan(blob, params)) {\n                        continue;\n                    }\n                    str = state.fun.decorate[params[0]][params[1]].call(blob, state, str, params[2]);\n                }\n            }\n            str = txt_esc(blob.strings.prefix) + str + txt_esc(blob.strings.suffix);\n            var addme = \"\";\n            if (blob.status === CSL.END) {\n                //print(\"  CSL.END\");\n                addme = txt_esc(blob.range_prefix);\n            } else if (blob.status === CSL.SUCCESSOR) {\n                //print(\"  CSL.SUCCESSOR\");\n                addme = txt_esc(blob.successor_prefix);\n            } else if (blob.status === CSL.START) {\n                //print(\"  CSL.START\");\n                if (pos > 0 && !blob.suppress_splice_prefix) {\n                    addme = txt_esc(blob.splice_prefix);\n                } else {\n                    addme = \"\";\n                }\n            } else if (blob.status === CSL.SEEN) {\n                //print(\"  CSL.SEEN\");\n\n                // THIS IS NOT THE PROPER FUNCTION OF CSL.SEEN, IS IT?\n\n                addme = txt_esc(blob.splice_prefix);\n            }\n            ret += addme;\n            ret += str;\n            if (state.tmp.count_offset_characters) {\n                state.tmp.offset_characters += (addme.length + blob.strings.prefix.length + strlen + blob.strings.suffix.length);\n            }\n        }\n    }\n    return ret;\n};\n\nCSL.Output.Queue.purgeEmptyBlobs = function (parent) {\n    //print(\"START1\");\n    if (\"object\" !== typeof parent || \"object\" !== typeof parent.blobs || !parent.blobs.length) {\n        return;\n    }\n    // back-to-front, bottom-first\n    for (var i=parent.blobs.length-1;i>-1;i--) {\n        CSL.Output.Queue.purgeEmptyBlobs(parent.blobs[i]);\n        var child = parent.blobs[i];\n        if (!child || !child.blobs || !child.blobs.length) {\n            var buf = [];\n            while ((parent.blobs.length-1) > i) {\n                buf.push(parent.blobs.pop());\n            }\n            parent.blobs.pop();\n            while (buf.length) {\n                parent.blobs.push(buf.pop());\n            }\n        }\n    }\n    //print(\"   end\");\n};\n\n// Adjustments to be made:\n//\n// * Never migrate beyond a @quotes node\n// * Never migrate into a num node.\n\nCSL.Output.Queue.adjust = function (punctInQuote) {\n\n    var NO_SWAP_IN = {\n        \";\": true,\n        \":\": true\n    };\n\n    var NO_SWAP_OUT = {\n        \".\": true,\n        \"!\": true,\n        \"?\": true\n    };\n\n    var LtoR_MAP = {\n        \"!\": {\n            \".\": \"!\",\n            \"?\": \"!?\",\n            \":\": \"!\",\n            \",\": \"!,\",\n            \";\": \"!;\"\n        },\n        \"?\": {\n            \"!\": \"?!\",\n            \".\": \"?\",\n            \":\": \"?\",\n            \",\": \"?,\",\n            \";\": \"?;\"\n        },\n        \".\": {\n            \"!\": \".!\",\n            \"?\": \".?\",\n            \":\": \".:\",\n            \",\": \".,\",\n            \";\": \".;\"\n        },\n        \":\": {\n            \"!\": \"!\",\n            \"?\": \"?\",\n            \".\": \":\",\n            \",\": \":,\",\n            \";\": \":;\"\n        },\n        \",\": {\n            \"!\": \",!\",\n            \"?\": \",?\",\n            \":\": \",:\",\n            \".\": \",.\",\n            \";\": \",;\"\n        },\n        \";\": {\n            \"!\": \"!\",\n            \"?\": \"?\",\n            \":\": \";\",\n            \",\": \";,\",\n            \".\": \";\"\n        }\n    };\n\n    var SWAP_IN = {};\n    var SWAP_OUT = {};\n    var PUNCT = {};\n    var PUNCT_OR_SPACE = {};\n    for (var key in LtoR_MAP) {\n        PUNCT[key] = true;\n        PUNCT_OR_SPACE[key] = true;\n        if (!NO_SWAP_IN[key]) {\n            SWAP_IN[key] = true;\n        }\n        if (!NO_SWAP_OUT[key]) {\n            SWAP_OUT[key] = true;\n        }\n    }\n    PUNCT_OR_SPACE[\" \"] = true;\n    PUNCT_OR_SPACE[\" \"] = true;\n\n    var RtoL_MAP = {};\n    for (var key in LtoR_MAP) {\n        for (var subkey in LtoR_MAP[key]) {\n            if (!RtoL_MAP[subkey]) {\n                RtoL_MAP[subkey] = {};\n            }\n            RtoL_MAP[subkey][key] = LtoR_MAP[key][subkey];\n        }\n    }\n\n    function blobIsNumber(blob) {\n        return (\"number\" === typeof blob.num || (blob.blobs && blob.blobs.length === 1 && \"number\" === typeof blob.blobs[0].num));\n    }\n\n    function blobEndsInNumber(blob) {\n        if (\"number\" === typeof blob.num) {\n            return true;\n        }\n        if (!blob.blobs || \"object\" !==  typeof blob.blobs) {\n            return false;\n        }\n        if (blobEndsInNumber(blob.blobs[blob.blobs.length-1])) {\n            return true;\n        }\n    }\n    \n    function blobHasDecorations(blob,includeQuotes) {\n        var ret = false;\n        var decorlist = ['@font-style','@font-variant','@font-weight','@text-decoration','@vertical-align'];\n        if (includeQuotes) {\n            decorlist.push('@quotes');\n        }\n        if (blob.decorations) {\n            for (var i=0,ilen=blob.decorations.length;i<ilen;i++) {\n                if (decorlist.indexOf(blob.decorations[i][0]) > -1) {\n                    ret = true;\n                    break;\n                }\n            }\n        }\n        return ret;\n    }\n    \n    function blobHasDescendantQuotes(blob) {\n        if (blob.decorations) {\n            for (var i=0,ilen=blob.decorations.length;i<ilen;i++) {\n                if (blob.decorations[i][0] === '@quotes' && blob.decorations[i][1] !== \"false\") {\n                    return true;\n                }\n            }\n        }\n        if (\"object\" !== typeof blob.blobs) {\n            return false;\n        }\n        return blobHasDescendantQuotes(blob.blobs[blob.blobs.length-1]);\n        //if (blobHasDescendantQuotes(blob.blobs[blob.blobs.length-1])) {\n        //    return true\n        //};\n        //return false;\n    }\n    \n    function blobHasDescendantMergingPunctuation(parentChar,blob) {\n        var childChar = blob.strings.suffix.slice(-1);\n        if (!childChar && \"string\" === typeof blob.blobs) {\n            childChar = blob.blobs.slice(-1);\n        }\n        var mergedChars = RtoL_MAP[parentChar][childChar];\n        if (mergedChars && mergedChars.length === 1) {\n            return true;\n        }\n        if (\"object\" !== typeof blob.blobs) {\n            return false;\n        }\n        if (blobHasDescendantMergingPunctuation(parentChar,blob.blobs[blob.blobs.length-1])) {\n            return true;\n        }\n        return false;\n    }\n    \n    function matchLastChar(blob, chr) {\n        if (!PUNCT[chr]) {\n            return false;\n        }\n        if (\"string\" === typeof blob.blobs) {\n\n            if (blob.blobs.slice(-1) === chr) {\n                return true;\n            } else {\n                return false;\n            }\n        } else {\n            var child = blob.blobs[blob.blobs.length-1];\n            if (child) {\n                var childChar = child.strings.suffix.slice(-1);\n                if (!childChar) {\n                    return matchLastChar(child,chr);\n                } else if (child.strings.suffix.slice(-1) == chr) {\n                    return true;\n                } else {\n                    return false;\n                }\n            } else {\n                return false;\n            }\n        }\n    }\n    \n    function mergeChars (First, first, Second, second, merge_right) {\n        var FirstStrings = \"blobs\" === first ? First : First.strings;\n        var SecondStrings = \"blobs\" === second ? Second: Second.strings;\n        var firstChar = FirstStrings[first].slice(-1);\n        var secondChar = SecondStrings[second].slice(0,1);\n        function cullRight () {\n            SecondStrings[second] = SecondStrings[second].slice(1);\n        }\n        function cullLeft () {\n            FirstStrings[first] = FirstStrings[first].slice(0,-1);\n        }\n        function addRight (chr) {\n            SecondStrings[second] = chr + SecondStrings[second];\n        }\n        function addLeft (chr) {\n            FirstStrings[first] += chr;\n        }\n        var cull = merge_right ? cullLeft : cullRight;\n        function matchOnRight () {\n            return RtoL_MAP[secondChar];\n        }\n        function matchOnLeft () {\n            return LtoR_MAP[firstChar];\n        }\n        var match = merge_right ? matchOnLeft : matchOnRight;\n        function mergeToRight () {\n            var chr = LtoR_MAP[firstChar][secondChar];\n            if (\"string\" === typeof chr) {\n                cullLeft();\n                cullRight();\n                addRight(chr);\n            } else {\n                addRight(firstChar);\n                cullLeft();\n            }\n        }\n        function mergeToLeft () {\n            var chr = RtoL_MAP[secondChar][firstChar];\n            if (\"string\" === typeof chr) {\n                cullLeft();\n                cullRight();\n                addLeft(chr);\n            } else {\n                addLeft(secondChar);\n                cullRight();\n            }\n        }\n        var merge = merge_right ? mergeToRight: mergeToLeft;\n\n        var isDuplicate = firstChar === secondChar;\n        if (isDuplicate) {\n            cull();\n        } else {\n            if (match()) {\n                merge();\n            }\n        }\n    }\n\n    function upward (parent) {\n        //print(\"START2\");\n        // Terminus if no blobs\n        if (parent.blobs && \"string\" == typeof parent.blobs) {\n            if (PUNCT[parent.strings.suffix.slice(0,1)]\n                && parent.strings.suffix.slice(0,1) === parent.blobs.slice(-1)) {\n\n                parent.strings.suffix = parent.strings.suffix.slice(1);\n            }\n            return;\n        } else if (\"object\" !== typeof parent || \"object\" !== typeof parent.blobs || !parent.blobs.length) {\n            return;\n        }\n\n        // back-to-front, bottom-first\n        var parentDecorations = blobHasDecorations(parent,true);\n        for (var i=parent.blobs.length-1;i>-1;i--) {\n            this.upward(parent.blobs[i]);\n            var parentStrings = parent.strings;\n            var childStrings = parent.blobs[i].strings;\n            if (i === 0) {\n                // Remove leading space on first-position child node prefix if there is a trailing space on the node prefix above \n                if (\" \" === parentStrings.prefix.slice(-1) && \" \" === childStrings.prefix.slice(0, 1)) {\n                    childStrings.prefix = childStrings.prefix.slice(1);\n                }\n                // Migrate leading punctuation or space on a first-position prefix upward\n                var childChar = childStrings.prefix.slice(0, 1);\n                if (!parentDecorations && PUNCT_OR_SPACE[childChar] && !parentStrings.prefix) {\n                    parentStrings.prefix += childChar;\n                    childStrings.prefix = childStrings.prefix.slice(1);\n                }\n            }\n            if (i === (parent.blobs.length - 1)) {\n                // Migrate trailing space ONLY on a last-position suffix upward, controlling for duplicates\n                var childChar = childStrings.suffix.slice(-1);\n                // ZZZ Loosened to fix initialized names wrapped in a span and followed by a period\n                if (!parentDecorations && [\" \"].indexOf(childChar) > -1) {\n                    if (parentStrings.suffix.slice(0,1) !== childChar) {\n                        parentStrings.suffix = childChar + parentStrings.suffix;\n                    }\n                    childStrings.suffix = childStrings.suffix.slice(0, -1);\n                }\n            }\n            if (parentStrings.delimiter && i > 0) {\n                // Remove leading space on mid-position child node prefix if there is a trailing space on delimiter above\n                if (PUNCT_OR_SPACE[parentStrings.delimiter.slice(-1)]\n                    && parentStrings.delimiter.slice(-1) === childStrings.prefix.slice(0, 1)) {\n\n                    childStrings.prefix = childStrings.prefix.slice(1);\n                }\n            }\n            // Siblings are handled in adjustNearsideSuffixes()\n        }\n        //print(\"   end\");\n    }\n\n    function leftward (parent) {\n        // Terminus if no blobs\n        if (\"object\" !== typeof parent || \"object\" !== typeof parent.blobs || !parent.blobs.length) {\n            return;\n        }\n\n        for (var i=parent.blobs.length-1;i>-1;i--) {\n            this.leftward(parent.blobs[i]);\n            // This is a delicate one.\n            //\n            // Migrate if:\n            // * there is no umbrella delimiter [ok]\n            // * neither the child nor its sibling is a number [ok]\n            // * decorations exist neither on the child nor on the sibling [ok]\n            // * sibling prefix char is a swapping char [ok]\n            //\n            // Suppress without migration if:\n            // * sibling prefix char matches child suffix char or\n            // * child suffix is empty and sibling prefix char match last field char\n            if ((i < parent.blobs.length -1) && !parent.strings.delimiter) {\n                // If there is a trailing swappable character on a sibling prefix with no intervening delimiter, copy it to suffix,\n                // controlling for duplicates\n                var child = parent.blobs[i];\n                var childChar = child.strings.suffix.slice(-1);\n                var sibling = parent.blobs[i+1];\n                var siblingChar = sibling.strings.prefix.slice(0, 1);\n                var hasDecorations = blobHasDecorations(child) || blobHasDecorations(sibling);\n                var hasNumber = \"number\" === typeof childChar || \"number\" === typeof siblingChar;\n\n                if (!hasDecorations && !hasNumber && PUNCT[siblingChar] && !hasNumber) {\n                    var suffixAndPrefixMatch = siblingChar === child.strings.suffix.slice(-1);\n                    var suffixAndFieldMatch = (!child.strings.suffix && \"string\" === typeof child.blobs && child.blobs.slice(-1) === siblingChar);\n                    if (!suffixAndPrefixMatch && !suffixAndFieldMatch) {\n                        mergeChars(child, 'suffix', sibling, 'prefix');\n                        //child.strings.suffix += siblingChar;\n                    } else {\n                        sibling.strings.prefix = sibling.strings.prefix.slice(1);\n                    }\n                }\n            }\n        }\n    }\n\n    function downward (parent) {\n        //print(\"START3\");\n        // Terminus if no blobs\n        if (parent.blobs && \"string\" == typeof parent.blobs) {\n            if (PUNCT[parent.strings.suffix.slice(0,1)]\n                && parent.strings.suffix.slice(0,1) === parent.blobs.slice(-1)) {\n\n                parent.strings.suffix = parent.strings.suffix.slice(1);\n            }\n            return;\n        } else if (\"object\" !== typeof parent || \"object\" !== typeof parent.blobs || !parent.blobs.length) {\n            return;\n        }\n        //if (top) {\n        //    print(\"JSON \"+JSON.stringify(parent, [\"strings\", \"decorations\", \"blobs\", \"prefix\", \"suffix\", \"delimiter\"], 2));\n        //}\n\n        var parentStrings = parent.strings;\n        // Check for numeric child\n        var someChildrenAreNumbers = false;\n        for (var i=0,ilen=parent.blobs.length;i<ilen;i++) {\n            if (blobIsNumber(parent.blobs[i])) {\n                someChildrenAreNumbers = true;\n                break;\n            }\n        }\n        if (true || !someChildrenAreNumbers) {\n            // If there is a leading swappable character on delimiter, copy it to suffixes IFF none of the targets are numbers\n            if (parentStrings.delimiter && PUNCT[parentStrings.delimiter.slice(0, 1)]) {\n                var delimChar = parentStrings.delimiter.slice(0, 1);\n                for (var i=parent.blobs.length-2;i>-1;i--) {\n                    var childStrings = parent.blobs[i].strings;\n                    if (childStrings.suffix.slice(-1) !== delimChar) {\n                        childStrings.suffix += delimChar;\n                    }\n                }\n                parentStrings.delimiter = parentStrings.delimiter.slice(1);\n            }\n        }\n        // back-to-front, top-first\n        for (var i=parent.blobs.length-1;i>-1;i--) {\n            var child = parent.blobs[i];\n            var childStrings = parent.blobs[i].strings;\n            var childDecorations = blobHasDecorations(child, true);\n            var childIsNumber = blobIsNumber(child);\n\n            if (i === (parent.blobs.length - 1)) {\n\n                //if (blobHasDescendantQuotes(child)) {\n                //    print(\"JSON \"+JSON.stringify(parent, [\"strings\", \"decorations\", \"blobs\", \"prefix\", \"suffix\", \"delimiter\"]));\n                //}\n\n                if (true || !someChildrenAreNumbers) {\n                    // If we have decorations, drill down to see if there are quotes below.\n                    // If so, we allow migration anyway.\n                    // Original discussion is here:\n                    // https://forums.zotero.org/discussion/37091/citeproc-bug-punctuation-in-quotes/\n                    var parentChar = parentStrings.suffix.slice(0, 1);\n\n                    // Hmm.\n                    // Consider writing out the matching child from blobHasDescendant functions.\n                    // It should save some cycles, and produce the same result.\n\n                    var allowMigration = false;\n                    if (PUNCT[parentChar]) {\n                        allowMigration = blobHasDescendantMergingPunctuation(parentChar,child);\n                        if (!allowMigration && punctInQuote) {\n                            allowMigration = blobHasDescendantQuotes(child);\n                        }\n                    }\n                    if (allowMigration) {\n                        if (PUNCT[parentChar]) {\n                            if (!blobEndsInNumber(child)) {\n                                if (\"string\" === typeof child.blobs) {\n                                    mergeChars(child, 'blobs', parent, 'suffix');\n                                } else {\n                                    mergeChars(child, 'suffix', parent, 'suffix');\n                                }\n                                if (parentStrings.suffix.slice(0,1) === \".\") {\n                                    childStrings.suffix += parentStrings.suffix.slice(0,1);\n                                    parentStrings.suffix = parentStrings.suffix.slice(1);\n                                }\n                            }\n                        }\n                    }\n                    if (childStrings.suffix.slice(-1) === \" \" && parentStrings.suffix.slice(0,1) === \" \") {\n                        parentStrings.suffix = parentStrings.suffix.slice(1);\n                    }\n                    // More duplicates control\n                    if (PUNCT_OR_SPACE[childStrings.suffix.slice(0,1)]) {\n                        if (\"string\" === typeof child.blobs && child.blobs.slice(-1) === childStrings.suffix.slice(0,1)) {\n                            // Remove parent punctuation of it duplicates the last character of a field\n                            childStrings.suffix = childStrings.suffix.slice(1);\n                        }\n                        if (childStrings.suffix.slice(-1) === parentStrings.suffix.slice(0, 1)) {\n                            // Remove duplicate punctuation on child suffix\n                            parentStrings.suffix = parentStrings.suffix.slice(0, -1);\n                        }\n                    }\n                }\n                // Squash dupes\n                if (matchLastChar(parent,parent.strings.suffix.slice(0,1))) {\n                    parent.strings.suffix = parent.strings.suffix.slice(1);\n                }\n            } else if (parentStrings.delimiter) {\n                // Remove trailing space on mid-position child node suffix if there is a leading space on delimiter above\n                if (PUNCT_OR_SPACE[parentStrings.delimiter.slice(0,1)]\n                    && parentStrings.delimiter.slice(0, 1) === childStrings.suffix.slice(-1)) {\n\n                    parent.blobs[i].strings.suffix = parent.blobs[i].strings.suffix.slice(0, -1);\n                    \n                }\n            } else {\n                // Otherwise it's a sibling. We don't care about moving spaces here, just suppress a duplicate\n                var siblingStrings = parent.blobs[i+1].strings;\n                if (!blobIsNumber(child) \n                    && !childDecorations\n                    && PUNCT_OR_SPACE[childStrings.suffix.slice(-1)]\n                    && childStrings.suffix.slice(-1) === siblingStrings.prefix.slice(0, 1)) {\n\n                    siblingStrings.prefix = siblingStrings.prefix.slice(1);\n                }\n            }\n            // If field content ends with swappable punctuation, suppress swappable punctuation in style suffix.\n            if (!childIsNumber && !childDecorations && PUNCT[childStrings.suffix.slice(0,1)]\n                && \"string\" === typeof child.blobs) {\n                \n                mergeChars(child, 'blobs', child, 'suffix');\n            }\n            this.downward(parent.blobs[i]);\n        }\n/*\n        if (top) {\n\n            var seen = [];\n            print(JSON.stringify(parent, function(key, val) {\n                if (!val || key === 'alldecor') return;\n                if (typeof val == \"object\") {\n                    if (seen.indexOf(val) >= 0)\n                        return\n                    seen.push(val)\n                }\n                return val\n            },2));\n        }\n*/\n\n        //print(\"  end\");\n    }\n    // Abstract out a couple of utility functions, used in fix() below.\n    function swapToTheLeft (child) {\n        var childChar = child.strings.suffix.slice(0,1);\n        if (\"string\" === typeof child.blobs) {\n            while (SWAP_IN[childChar]) {\n                mergeChars(child, 'blobs', child, 'suffix');\n                childChar = child.strings.suffix.slice(0,1);\n            }                                \n        } else {\n            while (SWAP_IN[childChar]) {\n                mergeChars(child.blobs[child.blobs.length-1], 'suffix', child, 'suffix');\n                childChar = child.strings.suffix.slice(0,1);\n            }\n        }\n    }\n    function swapToTheRight (child) {\n        if (\"string\" === typeof child.blobs) {\n            var childChar = child.blobs.slice(-1);\n            while (SWAP_OUT[childChar]) {\n                mergeChars(child, 'blobs', child, 'suffix', true);\n                childChar = child.blobs.slice(-1);\n            }\n        } else {\n            var childChar = child.blobs[child.blobs.length-1].strings.suffix.slice(-1);\n            while (SWAP_OUT[childChar]) {\n                mergeChars(child.blobs[child.blobs.length-1], 'suffix', child, 'suffix', true);\n                childChar = child.blobs[child.blobs.length-1].strings.suffix.slice(-1);\n            }\n        }\n    }\n\n    function fix (parent) {\n        // Terminus if no blobs\n        if (\"object\" !== typeof parent || \"object\" !== typeof parent.blobs || !parent.blobs.length) {\n            return;\n        }\n        \n        //print(\"START4\");\n        // Do the swap, front-to-back, bottom-first\n        var lastChar;\n\n        // XXX Two things to fix with this:\n        // XXX (1) Stalls after one character\n        // XXX (2) Moves colon and semicolon, both of which SHOULD stall\n\n        for (var i=0,ilen=parent.blobs.length;i<ilen;i++) {\n            var child = parent.blobs[i];\n            var quoteSwap = false;\n            for (var j=0,jlen=child.decorations.length;j<jlen;j++) {\n                var decoration = child.decorations[j];\n                if (decoration[0] === \"@quotes\" && decoration[1] !== \"false\") {\n                    quoteSwap = true;\n                }\n            }\n            if (quoteSwap) {\n                if (punctInQuote) {\n                    swapToTheLeft(child);\n                } else {\n                    swapToTheRight(child);\n                }\n            }\n            lastChar = this.fix(parent.blobs[i]);\n            if (child.blobs && \"string\" === typeof child.blobs) {\n                lastChar = child.blobs.slice(-1);\n            }\n        }\n        return lastChar;\n    }\n    this.upward = upward;\n    this.leftward = leftward;\n    this.downward = downward;\n    this.fix = fix;\n};\n\n/*global CSL: true */\n\nCSL.Engine.Opt = function () {\n    this.parallel = {\n        enable: false,\n    },\n    this.has_disambiguate = false;\n    this.mode = \"html\";\n    this.dates = {};\n    this.jurisdictions_seen = {};\n    this.suppressedJurisdictions = {};\n    this.inheritedAttributes = {};\n    this[\"locale-sort\"] = [];\n    this[\"locale-translit\"] = [];\n    this[\"locale-translat\"] = [];\n    this.citeAffixes = {\n        persons:{\n            \"locale-orig\":{\n                prefix:\"\",\n                suffix:\"\"\n            },\n            \"locale-translit\":{\n                prefix:\"\",\n                suffix:\"\"\n            },\n            \"locale-translat\":{\n                prefix:\"\",\n                suffix:\"\"\n            }\n        },\n        institutions:{\n            \"locale-orig\":{\n                prefix:\"\",\n                suffix:\"\"\n            },\n            \"locale-translit\":{\n                prefix:\"\",\n                suffix:\"\"\n            },\n            \"locale-translat\":{\n                prefix:\"\",\n                suffix:\"\"\n            }\n        },\n        titles:{\n            \"locale-orig\":{\n                prefix:\"\",\n                suffix:\"\"\n            },\n            \"locale-translit\":{\n                prefix:\"\",\n                suffix:\"\"\n            },\n            \"locale-translat\":{\n                prefix:\"\",\n                suffix:\"\"\n            }\n        },\n        journals:{\n            \"locale-orig\":{\n                prefix:\"\",\n                suffix:\"\"\n            },\n            \"locale-translit\":{\n                prefix:\"\",\n                suffix:\"\"\n            },\n            \"locale-translat\":{\n                prefix:\"\",\n                suffix:\"\"\n            }\n        },\n        publishers:{\n            \"locale-orig\":{\n                prefix:\"\",\n                suffix:\"\"\n            },\n            \"locale-translit\":{\n                prefix:\"\",\n                suffix:\"\"\n            },\n            \"locale-translat\":{\n                prefix:\"\",\n                suffix:\"\"\n            }\n        },\n        places:{\n            \"locale-orig\":{\n                prefix:\"\",\n                suffix:\"\"\n            },\n            \"locale-translit\":{\n                prefix:\"\",\n                suffix:\"\"\n            },\n            \"locale-translat\":{\n                prefix:\"\",\n                suffix:\"\"\n            }\n        }\n    };\n    this[\"default-locale\"] = [];\n    this.update_mode = CSL.NONE;\n    this.bib_mode = CSL.NONE;\n    this.sort_citations = false;\n    /*\n     * Default values.\n     * The various et-al values are set globally,\n     * and the appropriate value is set by the names start\n     * tag at runtime, depending on whether the Item is a\n     * first or a subsequent reference.\n     */\n    this[\"et-al-min\"] = 0;\n    this[\"et-al-use-first\"] = 1;\n    this[\"et-al-use-last\"] = false;\n    this[\"et-al-subsequent-min\"] = false;\n    this[\"et-al-subsequent-use-first\"] = false;\n\n    this[\"demote-non-dropping-particle\"] = \"display-and-sort\";\n    // default of true, because none of our consuming\n    // applications so far store the various prefixes and \n    // suffixes we support in separate fields.\n    this[\"parse-names\"] = true;\n    // this[\"auto-vietnamese-names\"] = true;\n\n    this.citation_number_slug = false;\n    this.trigraph = \"Aaaa00:AaAa00:AaAA00:AAAA00\";\n\n    this.nodenames = [];\n\n    this.gender = {};\n    this['cite-lang-prefs'] = {\n        persons:['orig'],\n        institutions:['orig'],\n        titles:['orig'],\n        journals:['orig'],\n        publishers:['orig'],\n        places:['orig'],\n        number:['orig']\n    };\n\n    this.has_layout_locale = false;\n    this.disable_duplicate_year_suppression = [];\n    this.use_context_condition = false;\n\n    this.jurisdiction_fallbacks = {};\n\n    this.development_extensions = {};\n    this.development_extensions.field_hack = true;\n    this.development_extensions.allow_field_hack_date_override = true;\n    this.development_extensions.locator_date_and_revision = true;\n    this.development_extensions.locator_label_parse = true;\n    this.development_extensions.raw_date_parsing = true;\n    this.development_extensions.clean_up_csl_flaws = true;\n    this.development_extensions.consolidate_legal_items = false;\n    this.development_extensions.csl_reverse_lookup_support = false;\n    this.development_extensions.wrap_url_and_doi = false;\n    this.development_extensions.thin_non_breaking_space_html_hack = false;\n    this.development_extensions.apply_citation_wrapper = false;\n    this.development_extensions.main_title_from_short_title = false;\n    this.development_extensions.uppercase_subtitles = false;\n    this.development_extensions.normalize_lang_keys_to_lowercase = false;\n    this.development_extensions.strict_text_case_locales = false;\n    this.development_extensions.expect_and_symbol_form = false;\n    this.development_extensions.require_explicit_legal_case_title_short = false;\n    this.development_extensions.spoof_institutional_affiliations = false;\n    this.development_extensions.force_jurisdiction = false;\n    this.development_extensions.parse_names = true;\n    this.development_extensions.hanging_indent_legacy_number = false;\n    this.development_extensions.throw_on_empty = false;\n    this.development_extensions.strict_inputs = true;\n    this.development_extensions.prioritize_disambiguate_condition = false;\n    this.development_extensions.force_short_title_casing_alignment = true;\n    this.development_extensions.implicit_short_title = false;\n    this.development_extensions.force_title_abbrev_fallback = false;\n    this.development_extensions.split_container_title = false;\n    this.development_extensions.legacy_institution_name_ordering = false;\n    this.development_extensions.etal_min_etal_usefirst_hack = false;\n};\n\nCSL.Engine.Tmp = function () {\n    //\n    // scratch variable to display the total\n    // number of names in all rendered variables\n    // in a cite.  initialized to zero by the\n    // citation element, incremented by each\n    // name variable actually rendered\n    this.names_max = new CSL.Stack();\n    this.names_base = new CSL.Stack();\n    this.givens_base = new CSL.Stack();\n    //\n    // this holds the field values collected by the @value\n    // and @variable attributes, for processing by the\n    // element functions.\n    this.value = [];\n    /**\n     * Object to hold the decorations declared by a name-part\n     * element.\n     */\n    this.namepart_decorations = {};\n    /**\n     * String variable to hold the type of a name-part\n     * element.\n     */\n    this.namepart_type = false;\n    //\n    // scratch variable to flag whether we are processing\n    // a citation or a bibiliography.  this diverts token and\n    // configuration to the appropriateo objects inside\n    // state.  the default is \"citation\".\n    this.area = \"citation\";\n    this.root = \"citation\";\n    this.extension = \"\";\n    //\n    // controls the implicit conditional wrappers applied\n    // to top-level elements inside a names substitute span.\n    // false by default, names start tag pushes a new true level,\n    // names end tag pops it.  Output value check in @variable\n    // function of attributes.js sets level to false.  closing names\n    // tag maps a false value to superior level.\n    this.can_substitute = new CSL.Stack(0, CSL.LITERAL);\n    //\n    // notes whether the formatted elements of a date span\n    // rendered anything.  controls whether literal fallback\n    // is used.\n    this.element_rendered_ok = false;\n    //\n    // element_trace keeps a record of rendered elements.\n    // used to implement author-only.\n    //\n    this.element_trace = new CSL.Stack(\"style\");\n    //\n    // counter for total namesets\n    this.nameset_counter = 0;\n    //\n    /////  this.fun.check_for_output = CSL.check_for_output;\n    //\n    // stack flag used for term handling.  Set to true\n    // if at least one variable has tried to render, and\n    // no variables had content.\n    this.group_context = new CSL.Stack({\n        term_intended: false,\n        variable_attempt: false,\n        variable_success: false,\n        output_tip: undefined,\n        label_form:  undefined,\n        parallel_first: undefined,\n        parallel_last: undefined,\n        parallel_delimiter_override: undefined,\n        condition: false,\n        force_suppress: false,\n        done_vars: []\n    });\n    //\n    // boolean flag used to control first-letter capitalization\n    // of terms.  Set to true if any item preceding the term\n    // being handled has rendered successfully, otherwise\n    // false.\n    this.term_predecessor = false;\n    //\n    // boolean flag to control use of layout delimiter\n    // immediately before numbers. This hack is needed for\n    // some numeric styles.\n    this.in_cite_predecessor = false;\n    //\n    // stack flag used to control jumps in the closing\n    // token of a conditional.\n    this.jump = new CSL.Stack(0, CSL.LITERAL);\n    //\n    // holds string parameters for group formatting, between\n    // the start of a group and the closing token.\n    this.decorations = new CSL.Stack();\n    //\n    // token store stack.\n    this.tokenstore_stack = new CSL.Stack();\n\n    // for collapsing\n    this.last_suffix_used = \"\";\n    this.last_names_used = [];\n    this.last_years_used = [];\n    this.years_used = [];\n    this.names_used = [];\n\n    this.taintedItemIDs = {};\n    this.taintedCitationIDs = {};\n    //\n    // scratch stack containing initialize-with strings or null values\n    this.initialize_with = new CSL.Stack();\n    //\n    // this is used to set a requested set of\n    // disambiguation parameters in the output.\n    // for the array elements, the base array\n    // (either zero for each nameset, or full-up\n    // if givens are already used) is set\n    // during names processing, if no value\n    // is set in the processor before a rendering\n    // run.  to simplify things for the calling\n    // function, these are just bog-standard arrays,\n    // and can be safely overwritten.\n    this.disambig_request = false;\n    //\n    // scratch variable to toggle an attempt to set a\n    // name in sort order rather than display\n    // order.\n    this[\"name-as-sort-order\"] = false;\n    //\n    // suppress decorations (used for generating\n    // sort keys and disambiguation keys)\n    this.suppress_decorations = false;\n    //\n    // empty settings array, used to report settings used\n    // if disambig_request is not set at runtime\n    this.disambig_settings = new CSL.AmbigConfig();\n    //\n    // sort key array\n    this.bib_sort_keys = [];\n    //\n    // holds the prefix between the start of a group\n    // and the closing token.\n    this.prefix = new CSL.Stack(\"\", CSL.LITERAL);\n    //\n    // holds the suffix between the start of a group\n    // and the closing token.\n    this.suffix = new CSL.Stack(\"\", CSL.LITERAL);\n    //\n    // holds the group delimiter between the start of a group\n    // and the closing token.\n    this.delimiter = new CSL.Stack(\"\", CSL.LITERAL);\n    //\n    // Used for conditional locale switching.\n    this.cite_locales = [];\n    this.cite_affixes = {\n        citation: false, \n        bibliography: false,\n        citation_sort: false, \n        bibliography_sort: false\n    };\n    this.strip_periods = 0;\n    this.shadow_numbers = {};\n    this.authority_stop_last = 0;\n    this.loadedItemIDs = {};\n    //\n    // Push/pop array for set/unset of opt.lang setting, used\n    // in if locale=\"XX\" to force terms to language of item.\n    // @locale tests track their nesting level in a counter,\n    // and push the current value of state.opt.lang to one array,\n    // and the counter value to another. On the way back up,\n    // closing node decrements the counter, compares its value\n    // with the trailing value on the array, and pops both\n    // arrays, resetting state.opt.lang to the previous value.\n    // A hack to solve a surprisingly difficult problem caused\n    // by the use of an execution stack for the nested structure.\n    this.condition_counter = 0; //incremented/decremented on ALL conditions\n    this.condition_lang_val_arr = [];\n    this.condition_lang_counter_arr = [];\n};\n\n\nCSL.Engine.Fun = function (state) {\n    //\n    // matcher\n    this.match = new CSL.Util.Match();\n    //\n    // utility to get standard suffixes for disambiguation\n    this.suffixator = new CSL.Util.Suffixator(CSL.SUFFIX_CHARS);\n    //\n    // utility to romanize a numeric value\n    this.romanizer = new CSL.Util.Romanizer();\n    //\n    // utility to make an ordinal form of a number\n    this.ordinalizer = new CSL.Util.Ordinalizer(state);\n    //\n    // utility to make the long ordinal form of a number, if possible\n    this.long_ordinalizer = new CSL.Util.LongOrdinalizer();\n};\n\n\nCSL.Engine.Build = function () {\n    // Alternate et-al term\n    // Holds the localization key of the alternative term\n    // to be used for et-al in a names environment.  Reduced\n    // to a term object when the element tag is processed during\n    // Build.\n    this[\"alternate-term\"] = false;\n    //\n    // flags that we are in the bibliography area.\n    // used by sort.\n    this.in_bibliography = false;\n    //\n    // scratch variable to alter behaviour when processing\n    // locale files\n    this.in_style = false;\n    //\n    // used to ignore info\n    this.skip = false;\n    //\n    // the macro ATTRIBUTE stores a macro name on this\n    // scratch variable anywhere outside the layout area\n    // during build.  The macro name is picked up when\n    // the token is encountered inside the layout area,\n    // either through a direct call, or as part of a nested\n    // macro expansion, and the macro content is exploded\n    // into the token list.\n    this.postponed_macro = false;\n    //\n    // used especially for controlling macro expansion\n    // during Build.\n    this.layout_flag = false;\n    //\n    // (was buffer_name)\n    // scratch variable to hold the name of a macro\n    // or a term until its children have been collected.\n    this.name = false;\n    this.names_variables = [[]];\n    this.name_label = [{}];\n    //\n    // scratch variable to hold the value of a form\n    // attribute until other attributes needed for\n    // processing have been collected.\n    this.form = false;\n    this.term = false;\n    //\n    // the macros themselves are discarded after Build\n    this.macro = {};\n    //\n    // the macro build stack.  used to raise an error\n    // when macros would attempt to call themselves.\n    this.macro_stack = [];\n    //\n    // stores the content of an XML text node during processing\n    this.text = false;\n    //\n    // this is a scratch variable for holding an attribute\n    // value during processing\n    this.lang = false;\n    //\n    // should be able to run uninitialized; may attract some\n    // cruft this way.\n    this.area = \"citation\";\n    this.root = \"citation\";\n    this.extension = \"\";\n    //\n    // controls the application of implicit conditional wrappers\n    // to top-level elements inside a names substitute span.\n    // zero by default, build of names tag pushes a\n    // new level with value 1.  group start tag increments by 1,\n    // group end tag decrements by 1.  conditional wrappers are\n    // only applied if value is exactly 1.\n    this.substitute_level = new CSL.Stack(0, CSL.LITERAL);\n    this.names_level = 0;\n    this.render_nesting_level = 0;\n    this.render_seen = false;\n    this.bibliography_key_pos = 0;\n};\n\n\nCSL.Engine.Configure = function () {\n    //\n    // the fail and succeed arrays are used for stack\n    // processing during configure.\n    this.tests = [];\n    this.fail = [];\n    this.succeed = [];\n};\n\n\nCSL.Engine.Citation = function (state) {\n     // Citation options area.\n     // Holds a mixture of persistent and ephemeral\n     // options and scratch data used during processing of\n     // a citation.</p>\n    this.opt = {\n        inheritedAttributes: {}\n    };\n\n    this.tokens = [];\n    // Placeholder function\n    this.srt = new CSL.Registry.Comparifier(state, \"citation_sort\");\n    //\n    // configuration array to hold the collapse\n    // options, if any.\n    this.opt.collapse = [];\n    //\n    // disambiguate options\n    this.opt[\"disambiguate-add-names\"] = false;\n    this.opt[\"disambiguate-add-givenname\"] = false;\n    this.opt[\"disambiguate-add-year-suffix\"] = false;\n    this.opt[\"givenname-disambiguation-rule\"] = \"by-cite\";\n    this.opt[\"near-note-distance\"] = 5;\n\n    this.opt.topdecor = [];\n    this.opt.layout_decorations = [];\n    this.opt.layout_prefix = \"\";\n    this.opt.layout_suffix = \"\";\n    this.opt.layout_delimiter = \"\";\n    //\n    // sorting\n    this.opt.sort_locales = [];\n    this.opt.max_number_of_names = 0;\n    this.root = \"citation\";\n};\n\n\nCSL.Engine.Bibliography = function () {\n    this.opt = {\n        inheritedAttributes: {}\n    };\n    this.tokens = [];\n\n    this.opt.collapse = [];\n\n    this.opt.topdecor = [];\n    this.opt.layout_decorations = [];\n    this.opt.layout_prefix = \"\";\n    this.opt.layout_suffix = \"\";\n    this.opt.layout_delimiter = \"\";\n    this.opt[\"line-spacing\"] = 1;\n    this.opt[\"entry-spacing\"] = 1;\n    //\n    // sorting\n    this.opt.sort_locales = [];\n    this.opt.max_number_of_names = 0;\n    this.root = \"bibliography\";\n};\n\n\nCSL.Engine.BibliographySort = function () {\n    this.tokens = [];\n    this.opt = {};\n    this.opt.sort_directions = [];\n    this.opt.topdecor = [];\n    // Holds the final citation-number sort direction, for use\n    // in applying numbers in cs:citation and cs:bibliography.\n    // Value is exclusively controlled by cs:key in bibliography_sort\n    this.opt.citation_number_sort_direction = CSL.ASCENDING;\n    this.opt.citation_number_secondary = false;\n    this.tmp = {};\n    this.keys = [];\n    this.root = \"bibliography\";\n};\n\n\nCSL.Engine.CitationSort = function () {\n    this.tokens = [];\n    this.opt = {};\n    this.opt.sort_directions = [];\n    this.keys = [];\n    this.opt.topdecor = [];\n    this.root = \"citation\";\n};\n\nCSL.Engine.InText = function () {\n     // InText options area.\n     // Holds a mixture of persistent and ephemeral\n     // options and scratch data used during processing of\n     // a citation.</p>\n    this.opt = {\n        inheritedAttributes: {}\n    };\n\n    this.tokens = [];\n    // Placeholder function\n    //this.srt = new CSL.Registry.Comparifier(state, \"citation_sort\");\n    //\n    // configuration array to hold the collapse\n    // options, if any.\n    this.opt.collapse = [];\n    //\n    // disambiguate options\n    this.opt[\"disambiguate-add-names\"] = false;\n    this.opt[\"disambiguate-add-givenname\"] = false;\n    this.opt[\"disambiguate-add-year-suffix\"] = false;\n    this.opt[\"givenname-disambiguation-rule\"] = \"by-cite\";\n    this.opt[\"near-note-distance\"] = 5;\n\n    this.opt.topdecor = [];\n    this.opt.layout_decorations = [];\n    this.opt.layout_prefix = \"\";\n    this.opt.layout_suffix = \"\";\n    this.opt.layout_delimiter = \"\";\n    //\n    // sorting\n    this.opt.sort_locales = [];\n    this.opt.max_number_of_names = 0;\n    this.root = \"intext\";\n};\n\n/*global CSL: true */\n\nCSL.Engine.prototype.previewCitationCluster = function (citation, citationsPre, citationsPost, newMode) {\n    // Generate output for a hypothetical citation at the current position,\n    // Leave the registry in the same state in which it was found.\n    //print(\"################### previewCitationCluster() #################\");\n    var oldMode = this.opt.mode;\n    this.setOutputFormat(newMode);\n    // Avoids generating unwanted ibids, if the citationID already exists in document\n\tif (citation.citationID) {\n\t\tdelete citation.citationID;\n\t}\n    var ret = this.processCitationCluster(citation, citationsPre, citationsPost, CSL.PREVIEW);\n\n    this.setOutputFormat(oldMode);\n    return ret[1];\n};\n\nCSL.Engine.prototype.appendCitationCluster = function (citation) {\n    var citationsPre = [];\n    var len = this.registry.citationreg.citationByIndex.length;\n    for (var pos = 0; pos < len; pos += 1) {\n        var c = this.registry.citationreg.citationByIndex[pos];\n        citationsPre.push([\"\" + c.citationID, c.properties.noteIndex]);\n    }\n    // Drop the data segment to return a list of pos/string pairs.\n    return this.processCitationCluster(citation, citationsPre, [])[1];\n};\n\n\nCSL.Engine.prototype.processCitationCluster = function (citation, citationsPre, citationsPost, flag) {\n    var c, preCitation, postCitation, i, ilen, j, jlen, k, klen, n, nlen, key, Item, item, noteCitations, textCitations, m, citationsInNote;\n    this.debug = false;\n    this.tmp.loadedItemIDs = {};\n\n    // Revert citation dereference from 2ffc4664ae\n    //citation = JSON.parse(JSON.stringify(citation));\n    \n    //print(\"################### processCitationCluster() #################\");\n    this.tmp.citation_errors = [];\n    this.registry.return_data = {\"bibchange\": false};\n\n    // make sure this citation has a unique ID, and register it in citationById.\n    this.setCitationId(citation);\n\n    var oldCitationList;\n    var oldItemList;\n    var oldAmbigs;\n    if (flag === CSL.PREVIEW) {\n        //SNIP-START\n        if (this.debug) {\n            CSL.debug(\"****** start state save *********\");\n        }\n        //SNIP-END\n        //\n        // Simplify.\n\n        // Take a slice of existing citations.\n        oldCitationList = this.registry.citationreg.citationByIndex.slice();\n\n        // Take a slice of current items, for later use with update.\n        oldItemList = this.registry.reflist.slice();\n\n        // Make a list of preview citation ref objects. Omit the current\n        // citation, because it will not exist in registry if: (a) this is\n        // a new citation; or (b) the calling application is assigning\n        // new citationIDs for every transaction.\n        var newCitationList = citationsPre.concat(citationsPost);\n\n        // Make a full list of desired ids, for use in preview update,\n        // and a hash list of same while we're at it.\n        // First step through known citations, then step through\n        // the items in the citation for preview.\n        var newItemIds = {};\n        var newItemIdsList = [];\n        for (var i = 0, ilen = newCitationList.length; i < ilen; i += 1) {\n            c = this.registry.citationreg.citationById[newCitationList[i][0]];\n            for (j = 0, jlen = c.citationItems.length; j < jlen; j += 1) {\n                newItemIds[c.citationItems[j].id] = true;\n                newItemIdsList.push(\"\" + c.citationItems[j].id);\n            }\n        }\n        for (j = 0, jlen = citation.citationItems.length; j < jlen; j += 1) {\n            newItemIds[citation.citationItems[j].id] = true;\n            newItemIdsList.push(\"\" + citation.citationItems[j].id);\n        }\n\n        // Clone and save off disambigs of items that will be lost.\n        oldAmbigs = {};\n        for (var i = 0, ilen = oldItemList.length; i < ilen; i += 1) {\n            if (!newItemIds[oldItemList[i].id]) {\n                var oldAkey = this.registry.registry[oldItemList[i].id].ambig;\n                var ids = this.registry.ambigcites[oldAkey];\n                if (ids) {\n                    for (j = 0, jlen = ids.length; j < jlen; j += 1) {\n                        oldAmbigs[ids[j]] = CSL.cloneAmbigConfig(this.registry.registry[ids[j]].disambig);\n                    }\n                }\n            }\n        }\n\n        // Update items.  This will produce the base name data and sort things.\n        // Possibly unnecessary?\n        //this.updateItems(this.registry.mylist.concat(tmpItems));\n\n        //SNIP-START\n        if (this.debug) {\n            CSL.debug(\"****** end state save *********\");\n        }\n        //SNIP-END\n    }\n\n    this.tmp.taintedCitationIDs = {};\n    var sortedItems = [];\n\n    // Styles that use note backreferencing with a by-cite\n    // givenname disambiguation rule include the note number\n    // in the cite for disambiguation purposes. Correct resolution\n    // of disambiguate=\"true\" conditions on first-reference cites \n    // in certain editing scenarios (e.g. where a cite is moved across\n    // notes) requires that disambiguation be rerun on cites\n    // affected by the edit.\n    var rerunAkeys = {};\n\n    // retrieve item data and compose items for use in rendering\n    // attach pointer to item data to shared copy for good measure\n    for (var i = 0, ilen = citation.citationItems.length; i < ilen; i += 1) {\n        // Protect against caller-side overwrites to locator strings etc\n        item = {};\n        for (var key in citation.citationItems[i]) {\n            item[key] = citation.citationItems[i][key];\n        }\n        Item = this.retrieveItem(\"\" + item.id);\n        if (Item.id) {\n            this.transform.loadAbbreviation(\"default\", \"hereinafter\", Item.id, Item.language);\n        }\n        item = CSL.parseLocator.call(this, item);\n        if (this.opt.development_extensions.consolidate_legal_items) {\n            this.remapSectionVariable([[Item,item]]);\n        }\n        if (this.opt.development_extensions.locator_label_parse) {\n            if (item.locator && [\"bill\",\"gazette\",\"legislation\",\"regulation\",\"treaty\"].indexOf(Item.type) === -1 && (!item.label || item.label === 'page')) {\n                var m = CSL.LOCATOR_LABELS_REGEXP.exec(item.locator);\n                if (m) {\n                    var tryLabel = CSL.LOCATOR_LABELS_MAP[m[2]];\n                    if (this.getTerm(tryLabel)) {\n                        item.label = tryLabel;\n                        item.locator = m[3];\n                    }\n                }\n            }\n        }\n        var newitem = [Item, item];\n        sortedItems.push(newitem);\n        citation.citationItems[i].item = Item;\n    }\n\n    // ZZZ sort stuff moved from here.\n\n    // attach the sorted list to the citation item\n    citation.sortedItems = sortedItems;\n\n    // build reconstituted citations list in current document order\n    var citationByIndex = [];\n    var citationById = {};\n    var lastNotePos;\n    for (i=0, ilen=citationsPre.length; i<ilen; i += 1) {\n        preCitation = citationsPre[i];\n        if (this.opt.development_extensions.strict_inputs) {\n            if (citationById[preCitation[0]]) {\n                CSL.error(\"Previously referenced citationID \" + preCitation[0] + \" encountered in citationsPre\");\n            }\n            if (preCitation[1]) {\n                if (lastNotePos > preCitation[1]) {\n                    CSL.debug(\"Note index sequence is not sane at citationsPre[\" + i + \"]\");\n                }\n                lastNotePos = preCitation[1];\n            }\n        }\n        this.registry.citationreg.citationById[preCitation[0]].properties.noteIndex = preCitation[1];\n        citationByIndex.push(this.registry.citationreg.citationById[preCitation[0]]);\n        citationById[preCitation[0]] = this.registry.citationreg.citationById[preCitation[0]];\n    }\n    if (!citation.properties) {\n        citation.properties = {\n            noteIndex: 0\n        };\n    }\n    if (this.opt.development_extensions.strict_inputs) {\n        if (citationById[citation.citationID]) {\n            CSL.error(\"Citation with previously referenced citationID \" + citation.citationID);\n        }\n        if (citation.properties.noteIndex) {\n            if (lastNotePos > citation.properties.noteIndex) {\n                CSL.debug(\"Note index sequence is not sane for citation \" + citation.citationID);\n            }\n            lastNotePos = citation.properties.noteIndex;\n        }\n    }\n    citationByIndex.push(citation);\n    citationById[citation.citationID] = citation;\n    for (i=0, ilen=citationsPost.length; i<ilen; i += 1) {\n        postCitation = citationsPost[i];\n        if (this.opt.development_extensions.strict_inputs) {\n            if (citationById[postCitation[0]]) {\n                CSL.error(\"Previously referenced citationID \" + postCitation[0] + \" encountered in citationsPost\");\n            }\n            if (postCitation[1]) {\n                if (lastNotePos > postCitation[1]) {\n                    CSL.debug(\"Note index sequence is not sane at postCitation[\" + i + \"]\");\n                }\n                lastNotePos = postCitation[1];\n            }\n        }\n        this.registry.citationreg.citationById[postCitation[0]].properties.noteIndex = postCitation[1];\n        citationByIndex.push(this.registry.citationreg.citationById[postCitation[0]]);\n        citationById[postCitation[0]] = this.registry.citationreg.citationById[postCitation[0]];\n    }\n    this.registry.citationreg.citationByIndex = citationByIndex;\n    this.registry.citationreg.citationById = citationById;\n\n    //\n    // The processor provides three facilities to support\n    // updates following position reevaluation.\n    //\n    // (1) The updateItems() function reports tainted ItemIDs\n    // to state.tmp.taintedItemIDs.\n    //\n    // (2) The processor memos the type of style referencing as\n    // CSL.NONE, CSL.NUMERIC or CSL.POSITION in state.opt.update_mode.\n    //\n    // XXXX: NO LONGER\n    // (3) For citations containing cites with backreference note numbers,\n    // a string image of the rendered citation is held in\n    // citation.properties.backref_citation, and a list of\n    // ItemIDs to be used to update the backreference note numbers\n    // is memoed at citation.properties.backref_index.  When such\n    // citations change position, they can be updated with a\n    // series of simple find and replace operations, without\n    // need for rerendering.\n    //\n\n    //\n    // Position evaluation!\n    //\n    // set positions in reconstituted list, noting taints\n    this.registry.citationreg.citationsByItemId = {};\n    if (this.opt.update_mode === CSL.POSITION) {\n        textCitations = [];\n        noteCitations = [];\n        citationsInNote = {};\n    }\n    var update_items = [];\n    for (var i = 0, ilen = citationByIndex.length; i < ilen; i += 1) {\n        citationByIndex[i].properties.index = i;\n        for (j = 0, jlen = citationByIndex[i].sortedItems.length; j < jlen; j += 1) {\n            item = citationByIndex[i].sortedItems[j];\n            if (!this.registry.citationreg.citationsByItemId[item[1].id]) {\n                this.registry.citationreg.citationsByItemId[item[1].id] = [];\n                update_items.push(\"\" + item[1].id);\n            }\n            if (this.registry.citationreg.citationsByItemId[item[1].id].indexOf(citationByIndex[i]) === -1) {\n                this.registry.citationreg.citationsByItemId[item[1].id].push(citationByIndex[i]);\n            }\n        }\n        if (this.opt.update_mode === CSL.POSITION) {\n            if (citationByIndex[i].properties.noteIndex) {\n                noteCitations.push(citationByIndex[i]);\n            } else {\n                citationByIndex[i].properties.noteIndex = 0;\n                textCitations.push(citationByIndex[i]);\n            }\n        }\n    }\n    //\n    // update bibliography items here\n    //\n    if (flag !== CSL.ASSUME_ALL_ITEMS_REGISTERED) {\n        //SNIP-START\n        if (this.debug) {\n            CSL.debug(\"****** start update items *********\");\n        }\n        //SNIP-END\n        // true signals implicit updateItems (will not rerun sys.retrieveItem())\n        this.updateItems(update_items, null, null, true);\n        //SNIP-START\n        if (this.debug) {\n            CSL.debug(\"****** endo update items *********\");\n        }\n        //SNIP-END\n    }\n\n    if (!this.opt.citation_number_sort && sortedItems && sortedItems.length > 1 && this.citation_sort.tokens.length > 0) {\n        for (var i = 0, ilen = sortedItems.length; i < ilen; i += 1) {\n            sortedItems[i][1].sortkeys = CSL.getSortKeys.call(this, sortedItems[i][0], \"citation_sort\");\n        }\n\n        /* \n         * Grouped sort stuff (start)\n         */\n\n        if (this.opt.grouped_sort &&  !citation.properties.unsorted) {\n            // Insert authorstring as key.\n            for (var i = 0, ilen = sortedItems.length; i < ilen; i += 1) {\n                var sortkeys = sortedItems[i][1].sortkeys;\n                this.tmp.authorstring_request = true;\n                // Run getAmbiguousCite() with the current disambig\n                // parameters, and pick up authorstring from the registry.\n                var mydisambig = this.registry.registry[sortedItems[i][0].id].disambig;\n                \n                this.tmp.authorstring_request = true;\n                CSL.getAmbiguousCite.call(this, sortedItems[i][0], mydisambig);\n                var authorstring = this.registry.authorstrings[sortedItems[i][0].id];\n                this.tmp.authorstring_request = false;\n\n                sortedItems[i][1].sortkeys = [authorstring].concat(sortkeys);\n            }\n\n            sortedItems.sort(this.citation.srt.compareCompositeKeys);\n            // Replace authorstring key in items with same (authorstring) with the \n            // keystring of first normal key. This forces grouped sorts,\n            // as discussed here:\n            // https://github.com/citation-style-language/schema/issues/40\n            var lastauthor = false;\n            var thiskey = false;\n            var thisauthor = false;\n            for (var i = 0, ilen = sortedItems.length; i < ilen; i += 1) {\n                if (sortedItems[i][1].sortkeys[0] !== lastauthor) {\n                    thisauthor = sortedItems[i][1].sortkeys[0];\n                    thiskey =  sortedItems[i][1].sortkeys[1];\n                }\n                sortedItems[i][1].sortkeys[0] = \"\" + thiskey + i;\n                lastauthor = thisauthor;\n            }\n        }\n        /*\n         * Grouped sort stuff (end)\n         */\n\n        if (!citation.properties.unsorted) {\n            sortedItems.sort(this.citation.srt.compareCompositeKeys);\n        }\n    }\n\n    // evaluate parallels\n\n    if (this.opt.parallel.enable) {\n        this.parallel.StartCitation(citation.sortedItems);\n    }\n\n    var citations;\n    if (this.opt.update_mode === CSL.POSITION) {\n        for (var i = 0; i < 2; i += 1) {\n            var first_ref = {};\n            var last_ref = {};\n            var first_container_ref = {};\n            citations = [textCitations, noteCitations][i];\n            for (j = 0, jlen = citations.length; j < jlen; j += 1) {\n                var onecitation = citations[j];\n                if (!citations[j].properties.noteIndex) {\n                    citations[j].properties.noteIndex = 0;\n                }\n                citations[j].properties.noteIndex = parseInt(citations[j].properties.noteIndex, 10);\n                if (j > 0 && onecitation.properties.noteIndex && citations[j - 1].properties.noteIndex > onecitation.properties.noteIndex) {\n                    citationsInNote = {};\n                    first_ref = {};\n                    last_ref = {};\n                    first_container_ref = {};\n                }\n                for (k = 0, klen = onecitation.sortedItems.length; k < klen; k += 1) {\n                    if (onecitation.sortedItems[k][1].parallel && onecitation.sortedItems[k][1].parallel !== \"first\") {\n                        continue;\n                    }\n                    if (!citationsInNote[onecitation.properties.noteIndex]) {\n                        citationsInNote[onecitation.properties.noteIndex] = 1;\n                    } else {\n                        citationsInNote[onecitation.properties.noteIndex] += 1;\n                    }\n                }\n                // Set the following:\n                //\n                // (1) position as required (as per current Zotero)\n                // (2) first-reference-note-number as required (on onecitation item)\n                // (3) near-note as required (on onecitation item, according to\n                //     state.opt[\"near-note-distance\"] parameter)\n                // (4) state.registry.citationreg.citationsByItemId.\n                //\n                // Any state changes caused by unsetting or resetting should\n                // trigger a single entry for the citations in\n                // state.tmp.taintedCitationIDs (can block on presence of\n                // state.registry.citationreg.citationsByItemId).\n                //\n                for (k = 0, klen = citations[j].sortedItems.length; k < klen; k += 1) {\n                    item = citations[j].sortedItems[k];\n                    // Okay ...\n                    // We set up three IDs for use in position evaluation.\n                    // item_id is the real Item.id\n                    // first_id is the legislation_id or Item.id (so statutes backref to first in set, chapters to specific chapter)\n                    // last_id is the legislation_id or container_id (so statute AND chapter distance is from any ref in set)\n                    // (replaces myid)\n                    var item_id = item[0].id;\n                    var first_id = item[0].legislation_id ? item[0].legislation_id : item[0].id;\n                    var last_id = item[0].legislation_id ? item[0].legislation_id : item[0].container_id ? item[0].container_id : item[0].id;\n                    var myxloc = item[1][\"locator-extra\"];\n                    var mylocator = item[1].locator;\n                    var mylabel = item[1].label;\n                    var incitationid;\n                    var incitationxloc;\n                    if (k > 0) {\n                        // incitationid is only reached in the else branch\n                        // following \"undefined\" === typeof first_ref[myid]\n                        // below\n                        if (onecitation.sortedItems[k - 1][0].legislation_id) {\n                            incitationid = onecitation.sortedItems[k - 1][0].legislation_id;\n                        } else {\n                            incitationid = onecitation.sortedItems[k - 1][1].id;\n                            incitationxloc = onecitation.sortedItems[k - 1][1][\"locator-extra\"];\n                            //if (onecitation.sortedItems[k-1][1].parallel === \"last\") {\n                                for (var l=k-2; l>-1; l--) {\n                                    if (onecitation.sortedItems[l][1].parallel === \"first\") {\n                                        incitationid = onecitation.sortedItems[l][1].id;\n                                        incitationxloc = onecitation.sortedItems[l][1][\"locator-extra\"];\n                                    }\n                                }\n                            //}\n                        }\n                    }\n                    // Don't touch item data of other cites when previewing\n                    if (flag === CSL.PREVIEW) {\n                        if (onecitation.citationID != citation.citationID) {\n                            if (\"undefined\" === typeof first_ref[item[1].id]) {\n                                first_ref[first_id] = onecitation.properties.noteIndex;\n                                last_ref[last_id] = onecitation.properties.noteIndex;\n                            } else {\n                                last_ref[last_id] = onecitation.properties.noteIndex;\n                            }\n                            continue;\n                        }\n                    }\n                    var oldvalue = {};\n                    oldvalue.position = item[1].position;\n                    oldvalue[\"first-reference-note-number\"] = item[1][\"first-reference-note-number\"];\n                    oldvalue[\"first-container-reference-note-number\"] = item[1][\"first-container-reference-note-number\"];\n                    oldvalue[\"near-note\"] = item[1][\"near-note\"];\n                    item[1][\"first-reference-note-number\"] = 0;\n                    item[1][\"first-container-reference-note-number\"] = 0;\n                    item[1][\"near-note\"] = false;\n                    if (this.registry.citationreg.citationsByItemId[item_id]) {\n                        if (this.opt.xclass === 'note' && this.opt.has_disambiguate) {\n                            var oldCount = this.registry.registry[item[0].id][\"citation-count\"];\n                            var newCount = this.registry.citationreg.citationsByItemId[item_id].length;\n                            this.registry.registry[item[0].id][\"citation-count\"] = this.registry.citationreg.citationsByItemId[item_id].length;\n                            if (\"number\" === typeof oldCount) {\n                                var oldCountCheck = (oldCount < 2);\n                                var newCountCheck = (newCount < 2);\n                                if (oldCountCheck !== newCountCheck) {\n                                    for (var l=0,llen=this.registry.citationreg.citationsByItemId[item_id].length;l<llen;l++) {\n                                        rerunAkeys[this.registry.registry[item[0].id].ambig] = true;\n                                        this.tmp.taintedCitationIDs[this.registry.citationreg.citationsByItemId[item_id][l].citationID] = true;\n                                    }\n                                }\n                            } else {\n                                for (var l=0,llen=this.registry.citationreg.citationsByItemId[item_id].length;l<llen;l++) {\n                                    rerunAkeys[this.registry.registry[item[0].id].ambig] = true;\n                                    this.tmp.taintedCitationIDs[this.registry.citationreg.citationsByItemId[item_id][l].citationID] = true;\n                                }\n                            }\n                        }\n                    }\n                    var oldlastid;\n                    var oldlastxloc;\n                    \n                    // Okay, chill.\n                    // The first test needs to be for presence of last_ref[last_id]. Everything\n                    // after in subsequent evaluation depends on that.\n\n                    // HOWEVER, despite starting with this test, we need to catch every member\n                    // of the set, and set its first-container-reference-note-number to point at the\n                    // first.\n\n                    // ALSO, despite starting with this test, we need to set first-reference-note-number\n                    // on every item.\n                    \n                    // So ... we run an independent test on first_ref[first_id]], and let this ride.\n                    \n                    if (\"undefined\" === typeof last_ref[last_id] && onecitation.properties.mode !== \"author-only\") {\n                        first_ref[first_id] = onecitation.properties.noteIndex;\n                        last_ref[last_id] = onecitation.properties.noteIndex;\n                        first_container_ref[last_id] = onecitation.properties.noteIndex;\n                        item[1].position = CSL.POSITION_FIRST;\n                    } else {\n                        //\n                        // backward-looking position evaluation happens here.\n                        //\n                        //\n                        //\n                        var ibidme = false;\n                        var suprame = false;\n                        var prevCitation = null;\n                        if (j > 0) {\n                            var prevCitation = citations[j-1];\n                        }\n                        var thisCitation = citations[j];\n                        // XXX Ugly, but This is used in the second else-if branch condition below.\n                        if (j > 0) {\n                            var old_last_id_offset = 1;\n                            if (prevCitation.properties.mode === \"author-only\" && j > 1) {\n                                old_last_id_offset = 2;\n                            }\n                            var adjusted_offset = (j - old_last_id_offset);\n                            if (citations[adjusted_offset].sortedItems.length) {\n                                oldlastid =  citations[adjusted_offset].sortedItems.slice(-1)[0][1].id;\n                                oldlastxloc =  citations[j - old_last_id_offset].sortedItems.slice(-1)[0][1][\"locator-extra\"];\n                            }\n                            if (prevCitation.sortedItems.length) {\n                                if (prevCitation.sortedItems[0].slice(-1)[0].legislation_id) {\n                                    oldlastid = prevCitation.sortedItems[0].slice(-1)[0].legislation_id;\n                                }\n                            }\n                        }\n                        if (j > 0 && k === 0 && prevCitation.properties.noteIndex !== thisCitation.properties.noteIndex) {\n                            // Case 1: source in previous onecitation\n                            // (1) Threshold conditions\n                            //     (a) there must be a previous onecitation with one item\n                            //     (b) this item must be the first in this onecitation\n                            //     (c) the previous onecitation must contain a reference\n                            //         to the same item ...\n                            //     (d) the note numbers must be the same or consecutive.\n                            // (this has some jiggery-pokery in it for parallels)\n                            var useme = false;\n                            // XXX Can oldid be equated with oldlastid, I wonder ...\n                            var oldid = prevCitation.sortedItems[0][0].id;\n                            if (prevCitation.sortedItems[0][0].legislation_id) {\n                                oldid = prevCitation.sortedItems[0][0].legislation_id;\n                            }\n                            if ((oldid  == first_id && prevCitation.properties.noteIndex >= (thisCitation.properties.noteIndex - 1))) {\n                                var prevxloc = prevCitation.sortedItems[0][1][\"locator-extra\"];\n                                var thisxloc = thisCitation.sortedItems[0][1][\"locator-extra\"];\n                                if ((citationsInNote[prevCitation.properties.noteIndex] === 1 || prevCitation.properties.noteIndex === 0) && prevxloc === thisxloc) {\n                                    useme = true;\n                                }\n                            }\n                            if (useme) {\n                                ibidme = true;\n                            } else {\n                                suprame = true;\n                            }\n                        } else if (k > 0 && incitationid == first_id && incitationxloc == myxloc) {\n                            // Case 2: immediately preceding source in this onecitation\n                            // (1) Threshold conditions\n                            //     (a) there must be an imediately preceding reference to  the\n                            //         same item in this onecitation; and\n                            ibidme = true;\n                        } else if (k === 0 && j > 0 && prevCitation.properties.noteIndex == thisCitation.properties.noteIndex\n                                   && prevCitation.sortedItems.length \n                                   && oldlastid == first_id && oldlastxloc == myxloc) {\n                            // ... in case there are separate citations in the same note ...\n                            // Case 2 [take 2]: immediately preceding source in this onecitation\n                            // (1) Threshold conditions\n                            //     (a) there must be an imediately preceding reference to  the\n                            //         same item in this onecitation; and\n                            ibidme = true;\n                        } else {\n                            // everything else is definitely subsequent\n                            suprame = true;\n                        }\n                        // conditions\n                        var prev, prev_locator, prev_label, curr_locator, curr_label;\n                        if (ibidme) {\n                            if (k > 0) {\n                                prev = onecitation.sortedItems[(k - 1)][1];\n                            } else {\n                                prev = citations[(j - 1)].sortedItems[0][1];\n                            }\n                            if (prev.locator) {\n                                if (prev.label) {\n                                    prev_label = prev.label;\n                                } else {\n                                    prev_label = \"\";\n                                }\n                                prev_locator = \"\" + prev.locator + prev_label;\n                            } else {\n                                prev_locator = prev.locator;\n                            }\n                            if (mylocator) {\n                                if (mylabel) {\n                                    curr_label = mylabel;\n                                } else {\n                                    curr_label = \"\";\n                                }\n                                curr_locator = \"\" + mylocator + curr_label;\n                            } else {\n                                curr_locator = mylocator;\n                            }\n                        }\n                        // triage\n                        if (ibidme && prev_locator && !curr_locator) {\n                            ibidme = false;\n                            suprame = true;\n\n                        }\n                        if (ibidme) {\n                            if (!prev_locator && curr_locator) {\n                                //     (a) if the previous onecitation had no locator\n                                //         and this onecitation has one, use ibid+pages\n                                item[1].position = CSL.POSITION_IBID_WITH_LOCATOR;\n                            } else if (!prev_locator && !curr_locator) {\n                                //     (b) if the previous onecitation had no locator\n                                //         and this onecitation also has none, use ibid\n                                item[1].position = CSL.POSITION_IBID;\n                                //print(\"setting ibid in cmd_cite()\");\n                            } else if (prev_locator && curr_locator === prev_locator) {\n                                //     (c) if the previous onecitation had a locator\n                                //         (page number, etc.) and this onecitation has\n                                //         a locator that is identical, use ibid\n\n                                item[1].position = CSL.POSITION_IBID;\n                                //print(\"setting ibid in cmd_cite() [2]\");\n                            } else if (prev_locator && curr_locator && curr_locator !== prev_locator) {\n                                //     (d) if the previous onecitation had a locator,\n                                //         and this onecitation has one that differs,\n                                //         use ibid+pages\n                                item[1].position = CSL.POSITION_IBID_WITH_LOCATOR;\n                            } else {\n                                //     (e) if the previous onecitation had a locator\n                                //         and this onecitation has none, use subsequent\n                                //\n                                //     ... and everything else would be subsequent also\n                                ibidme = false; // just to be clear\n                                suprame = true;\n                            }\n                        }\n                        if (suprame) {\n                            item[1].position = CSL.POSITION_CONTAINER_SUBSEQUENT;\n                            if (\"undefined\" === typeof first_ref[first_id]) {\n                                first_ref[first_id] = onecitation.properties.noteIndex;\n                            } else {\n                                item[1].position = CSL.POSITION_SUBSEQUENT;\n                            }\n                        }\n                        if (suprame || ibidme) {\n                            if (onecitation.properties.mode === \"author-only\") {\n                                item[1].position = CSL.POSITION_FIRST;\n                            }\n                            if (first_container_ref[last_id] != onecitation.properties.noteIndex) {\n                                item[1]['first-container-reference-note-number'] = first_container_ref[last_id];\n                                if (this.registry.registry[item[0].id]) {\n                                    this.registry.registry[item[0].id]['first-container-reference-note-number'] = first_container_ref[last_id];\n                                }\n                            }\n                            if (first_ref[first_id] != onecitation.properties.noteIndex) {\n                                item[1][\"first-reference-note-number\"] = first_ref[first_id];\n                                if (this.registry.registry[item[0].id]) {\n                                    // This is either the earliest recorded number, or the number of the current citation, whichever is smaller.\n                                    /*\n                                    var oldFirst = this.registry.citationreg.citationsByItemId[item_id][0].properties.noteIndex;\n                                    var newFirst = onecitation.properties.noteIndex;\n                                    this.registry.registry[item[0].id]['first-reference-note-number'] = newFirst < oldFirst ? newFirst: oldFirst;\n                                     */\n                                    // Try this instead?\n                                    this.registry.registry[item[0].id]['first-reference-note-number'] = first_ref[first_id];\n                                }\n                            }\n                        }\n                    }\n                    if (onecitation.properties.noteIndex) {\n                        var note_distance = parseInt(onecitation.properties.noteIndex, 10) - parseInt(last_ref[last_id], 10);\n                        if (item[1].position !== CSL.POSITION_FIRST \n                            && note_distance <= this.citation.opt[\"near-note-distance\"]) {\n                            item[1][\"near-note\"] = true;\n                        }\n                        last_ref[last_id] = onecitation.properties.noteIndex;\n                    } else if (item[1].position !== CSL.POSITION_FIRST) {\n                        item[1][\"near-note\"] = true;\n                    }\n                    if (onecitation.citationID != citation.citationID) {\n                        for (n = 0, nlen = CSL.POSITION_TEST_VARS.length; n < nlen; n += 1) {\n                            var param = CSL.POSITION_TEST_VARS[n];\n                            if (item[1][param] !== oldvalue[param]) {\n                                if (this.registry.registry[item[0].id]) {\n                                    if (param === 'first-reference-note-number') {\n                                        rerunAkeys[this.registry.registry[item[0].id].ambig] = true;\n                                        this.tmp.taintedItemIDs[item[0].id] = true;\n                                    }\n                                }\n                                this.tmp.taintedCitationIDs[onecitation.citationID] = true;\n                            }\n                        }\n                    }\n                    if (this.sys.variableWrapper) {\n                        item[1].index = onecitation.properties.index;\n                        item[1].noteIndex = onecitation.properties.noteIndex;\n                    }\n                }\n            }\n        }\n    }\n    if (this.opt.citation_number_sort && sortedItems && sortedItems.length > 1 && this.citation_sort.tokens.length > 0) {\n        if (!citation.properties.unsorted) {\n            for (var i = 0, ilen = sortedItems.length; i < ilen; i += 1) {\n                sortedItems[i][1].sortkeys = CSL.getSortKeys.call(this, sortedItems[i][0], \"citation_sort\");\n            }\n            sortedItems.sort(this.citation.srt.compareCompositeKeys);\n        }\n    }\n    for (var key in this.tmp.taintedItemIDs) {\n        if (this.tmp.taintedItemIDs.hasOwnProperty(key)) {\n            citations = this.registry.citationreg.citationsByItemId[key];\n            // Current citation may be tainted but will not exist\n            // during previewing.\n            if (citations) {\n                for (var i = 0, ilen = citations.length; i < ilen; i += 1) {\n                    this.tmp.taintedCitationIDs[citations[i].citationID] = true;\n                }\n            }\n        }\n    }\n\n    var ret = [];\n    if (flag === CSL.PREVIEW) {\n        // If previewing, return only a rendered string\n        //SNIP-START\n        if (this.debug) {\n            CSL.debug(\"****** start run processor *********\");\n        }\n        //SNIP-END\n        try {\n            ret = this.process_CitationCluster.call(this, citation.sortedItems, citation);\n        } catch (e) {\n            CSL.error(\"Error running CSL processor for preview: \"+e);\n        }\n            \n        //SNIP-START\n        if (this.debug) {\n            CSL.debug(\"****** end run processor *********\");\n            CSL.debug(\"****** start state restore *********\");\n        }\n        //SNIP-END\n        // Wind out anything related to new items added for the preview.\n        // This means (1) names, (2) disambig state for affected items,\n        // (3) keys registered in the ambigs pool arrays, and (4) registry\n        // items.\n        //\n\n        // restore sliced citations\n        this.registry.citationreg.citationByIndex = oldCitationList;\n        this.registry.citationreg.citationById = {};\n        for (var i = 0, ilen = oldCitationList.length; i < ilen; i += 1) {\n            this.registry.citationreg.citationById[oldCitationList[i].citationID] = oldCitationList[i];\n        }\n\n        //SNIP-START\n        if (this.debug) {\n            CSL.debug(\"****** start final update *********\");\n        }\n        //SNIP-END\n        var oldItemIds = [];\n        for (var i = 0, ilen = oldItemList.length; i < ilen; i += 1) {\n            oldItemIds.push(\"\" + oldItemList[i].id);\n        }\n        this.updateItems(oldItemIds, null, null, true);\n        //SNIP-START\n        if (this.debug) {\n            CSL.debug(\"****** end final update *********\");\n        }\n        //SNIP-END\n        // Roll back disambig states\n        for (var key in oldAmbigs) {\n            if (oldAmbigs.hasOwnProperty(key)) {\n                this.registry.registry[key].disambig = oldAmbigs[key];\n            }\n        }\n        //SNIP-START\n        if (this.debug) {\n            CSL.debug(\"****** end state restore *********\");\n        }\n        //SNIP-END\n    } else {\n        // Rerun cites that have moved across citations or had a change\n        // in their number of subsequent references, so that disambiguate\n        // and subsequent-reference-count conditions are applied\n        // correctly in output.\n        for (var rerunAkey in rerunAkeys) {\n            this.disambiguate.run(rerunAkey, citation);\n        }\n        // Run taints only if not previewing\n        //\n        // Push taints to the return object\n        //\n        var obj;\n        for (var key in this.tmp.taintedCitationIDs) {\n            if (key == citation.citationID) {\n                continue;\n            }\n            var mycitation = this.registry.citationreg.citationById[key];\n            if (!mycitation.properties.unsorted) {\n                for (var i = 0, ilen = mycitation.sortedItems.length; i < ilen; i += 1) {\n                    mycitation.sortedItems[i][1].sortkeys = CSL.getSortKeys.call(this, mycitation.sortedItems[i][0], \"citation_sort\");\n                }\n                mycitation.sortedItems.sort(this.citation.srt.compareCompositeKeys);\n            }\n            // For error reporting\n            this.tmp.citation_pos = mycitation.properties.index;\n            this.tmp.citation_note_index = mycitation.properties.noteIndex;\n            this.tmp.citation_id = \"\" + mycitation.citationID;\n            obj = [];\n            obj.push(mycitation.properties.index);\n            obj.push(this.process_CitationCluster.call(this, mycitation.sortedItems, mycitation));\n            obj.push(mycitation.citationID);\n            ret.push(obj);\n        }\n        this.tmp.taintedItemIDs = {};\n        this.tmp.taintedCitationIDs = {};\n\n        // For error reporting again\n        this.tmp.citation_pos = citation.properties.index;\n        this.tmp.citation_note_index = citation.properties.noteIndex;\n        this.tmp.citation_id = \"\" + citation.citationID;\n\n        obj = [];\n        obj.push(citationsPre.length);\n        obj.push(this.process_CitationCluster.call(this, sortedItems, citation));\n        obj.push(citation.citationID);\n        ret.push(obj);\n        //\n        // note for posterity: Rhino and Spidermonkey produce different\n        // sort results for items with matching keys.  That discrepancy\n        // turned up a subtle bug in the parallel detection code, trapped\n        // at line 266, above, and in line 94 of util_parallel.js.\n        //\n        ret.sort(function (a, b) {\n            if (a[0] > b[0]) {\n                return 1;\n            } else if (a[0] < b[0]) {\n                return -1;\n            } else {\n                return 0;\n            }\n        });\n        //\n        // In normal rendering, return is a list of two-part arrays, with the first element\n        // a citation index number, and the second the text to be inserted.\n        //\n    }\n    this.registry.return_data.citation_errors = this.tmp.citation_errors.slice();\n    return [this.registry.return_data, ret];\n};\n\nCSL.Engine.prototype.process_CitationCluster = function (sortedItems, citation) {\n    var str = \"\";\n    if (citation && citation.properties && citation.properties.mode === \"composite\") {\n        citation.properties.mode = \"author-only\";\n        var firstChunk = CSL.getCitationCluster.call(this, sortedItems, citation);\n        citation.properties.mode = \"suppress-author\";\n        var secondChunk = \"\";\n        if (citation.properties.infix) {\n            this.output.append(citation.properties.infix);\n            secondChunk = this.output.string(this, this.output.queue);\n            // Had no idea this could return a single-element array! Go figure.\n            if (\"object\" === typeof secondChunk) {\n                secondChunk = secondChunk.join(\"\");\n            }\n        }\n        var thirdChunk = CSL.getCitationCluster.call(this, sortedItems, citation);\n        citation.properties.mode = \"composite\";\n        if (firstChunk && secondChunk && CSL.SWAPPING_PUNCTUATION.concat([\"\\u2019\", \"\\'\"]).indexOf(secondChunk[0]) > -1) {\n            firstChunk += secondChunk;\n            secondChunk = false;\n        }\n        str = [firstChunk, secondChunk, thirdChunk].filter(function(obj) {\n            return obj;\n        }).join(\" \");\n    } else {\n        str = CSL.getCitationCluster.call(this, sortedItems, citation);\n    }\n    return str;\n};\n\nCSL.Engine.prototype.makeCitationCluster = function (rawList) {\n    var inputList, newitem, str, pos, len, item, Item;\n    inputList = [];\n    len = rawList.length;\n    for (pos = 0; pos < len; pos += 1) {\n        item = {};\n        for (var key in rawList[pos]) {\n            item[key] = rawList[pos][key];\n        }\n        Item = this.retrieveItem(\"\" + item.id);\n        // Code block is copied from processCitationCluster() above\n        if (this.opt.development_extensions.locator_label_parse) {\n            if (item.locator && [\"bill\",\"gazette\",\"legislation\",\"regulation\",\"treaty\"].indexOf(Item.type) === -1 && (!item.label || item.label === 'page')) {\n                var m = CSL.LOCATOR_LABELS_REGEXP.exec(item.locator);\n                if (m) {\n                    var tryLabel = CSL.LOCATOR_LABELS_MAP[m[2]];\n                    if (this.getTerm(tryLabel)) {\n                        item.label = tryLabel;\n                        item.locator = m[3];\n                    }\n                }\n            }\n        }\n        if (item.locator) {\n            item.locator = (\"\" + item.locator).replace(/\\s+$/, '');\n        }\n        newitem = [Item, item];\n        inputList.push(newitem);\n    }\n    if (this.opt.development_extensions.consolidate_legal_items) {\n        this.remapSectionVariable(inputList);\n    }\n    if (inputList && inputList.length > 1 && this.citation_sort.tokens.length > 0) {\n        len = inputList.length;\n        for (pos = 0; pos < len; pos += 1) {\n            inputList[pos][1].sortkeys = CSL.getSortKeys.call(this, inputList[pos][0], \"citation_sort\");\n        }\n        inputList.sort(this.citation.srt.compareCompositeKeys);\n    }\n    this.tmp.citation_errors = [];\n    var str = CSL.getCitationCluster.call(this, inputList);\n    return str;\n};\n\n\n/**\n * Get the undisambiguated version of a cite, without decorations\n * <p>This is used internally by the Registry.</p>\n *\n * [object] CSL Item\n * [object] disambiguation parameters\n * [boolean] If true, include first-reference-note-number value in cite\n */\nCSL.getAmbiguousCite = function (Item, disambig, visualForm, item) {\n    var ret;\n    var flags = this.tmp.group_context.tip;\n    var oldTermSiblingLayer = {\n        term_intended: flags.term_intended,\n        variable_attempt: flags.variable_attempt,\n        variable_success: flags.variable_success,\n        output_tip: flags.output_tip,\n        label_form: flags.label_form,\n        non_parallel: flags.non_parallel,\n        parallel_last: flags.parallel_last,\n        parallel_first: flags.parallel_first,\n        parallel_last_override: flags.parallel_last_override,\n        parallel_delimiter_override: flags.parallel_delimiter_override,\n        parallel_delimiter_override_on_suppress: flags.parallel_delimiter_override_on_suppress,\n        condition: flags.condition,\n        force_suppress: flags.force_suppress,\n        done_vars: flags.done_vars.slice()\n    };\n    if (disambig) {\n        this.tmp.disambig_request = disambig;\n    } else {\n        this.tmp.disambig_request = false;\n    }\n    var itemSupp = {\n        position: CSL.POSITION_SUBSEQUENT,\n        \"near-note\": true\n    };\n\n    if (item) {\n        itemSupp.locator = item.locator;\n        itemSupp.label = item.label;\n    }\n\n    if (this.registry.registry[Item.id] \n        && this.registry.citationreg.citationsByItemId\n        && this.registry.citationreg.citationsByItemId[Item.id]\n        && this.registry.citationreg.citationsByItemId[Item.id].length \n        && visualForm) {\n        if (this.citation.opt[\"givenname-disambiguation-rule\"] === \"by-cite\") {\n            itemSupp['first-reference-note-number'] = this.registry.registry[Item.id]['first-reference-note-number'];\n        }\n    }\n    this.tmp.area = \"citation\";\n    this.tmp.root = \"citation\";\n    var origSuppressDecorations = this.tmp.suppress_decorations;\n    this.tmp.suppress_decorations = true;\n    this.tmp.just_looking = true;\n\n    CSL.getCite.call(this, Item, itemSupp, null, false);\n    // !!!\n    for (var i=0,ilen=this.output.queue.length;i<ilen;i+=1) {\n        CSL.Output.Queue.purgeEmptyBlobs(this.output.queue[i]);\n    }\n    if (this.opt.development_extensions.clean_up_csl_flaws) {\n        for (var j=0,jlen=this.output.queue.length;j<jlen;j+=1) {\n            this.output.adjust.upward(this.output.queue[j]);\n            this.output.adjust.leftward(this.output.queue[j]);\n            this.output.adjust.downward(this.output.queue[j]);\n            this.output.adjust.fix(this.output.queue[j]);\n        }\n    }\n    var ret = this.output.string(this, this.output.queue);\n    this.tmp.just_looking = false;\n    this.tmp.suppress_decorations = origSuppressDecorations;\n    // Cache the result.\n    this.tmp.group_context.replace(oldTermSiblingLayer);\n    return ret;\n};\n\n/**\n * Return delimiter for use in join\n * <p>Splice evaluation is done during cite\n * rendering, and this method returns the\n * result.  Evaluation requires three items\n * of information from the preceding cite, if\n * one is present: the names used; the years\n * used; and the suffix appended to the\n * citation.  These details are copied into\n * the state object before processing begins,\n * and are cleared by the processor on\n * completion of the run.</p>\n */\n\nCSL.getSpliceDelimiter = function (last_locator, last_collapsed, pos) {\n    //print(pos +  \" after-collapse-delimiter=\"+this.citation.opt[\"after-collapse-delimiter\"] + \"\\n  cite_group_delimiter=\" + this.tmp.use_cite_group_delimiter + \"\\n  last_collapsed=\" +last_collapsed + \"\\n  have_collapsed=\" +this.tmp.have_collapsed + \"\\n  last_locator=\" + last_locator)\n    if (undefined !== this.citation.opt[\"after-collapse-delimiter\"]) {\n        if (last_locator) {\n            this.tmp.splice_delimiter = this.citation.opt[\"after-collapse-delimiter\"];\n        } else if (last_collapsed && !this.tmp.have_collapsed) {\n            this.tmp.splice_delimiter = this.citation.opt[\"after-collapse-delimiter\"];\n        } else if (!last_collapsed && !this.tmp.have_collapsed && this.citation.opt.collapse !== \"year-suffix\") {\n            this.tmp.splice_delimiter = this.citation.opt[\"after-collapse-delimiter\"];\n        } else {\n            this.tmp.splice_delimiter = this.citation.opt.layout_delimiter;\n        }\n    } else if (this.tmp.use_cite_group_delimiter) {\n        this.tmp.splice_delimiter = this.citation.opt.cite_group_delimiter;\n    } else {\n        if (this.tmp.have_collapsed && this.opt.xclass === \"in-text\" && this.opt.update_mode !== CSL.NUMERIC) {\n            this.tmp.splice_delimiter = \", \";\n        } else if (this.tmp.cite_locales[pos - 1]) {\n            //\n            // Must have a value to take effect.  Use zero width space to force empty delimiter.\n            var alt_affixes = this.tmp.cite_affixes[this.tmp.area][this.tmp.cite_locales[pos - 1]];\n            if (alt_affixes && alt_affixes.delimiter) {\n                this.tmp.splice_delimiter = alt_affixes.delimiter;\n            }\n        } else if (!this.tmp.splice_delimiter) {\n            // This happens when no delimiter is set on cs:layout under cs:citation\n            this.tmp.splice_delimiter = \"\";\n        }\n    }\n\n/*\n    if (last_locator && \"string\" === typeof this.citation.opt[\"after-collapse-delimiter\"]) {\n        this.tmp.splice_delimiter = this.citation.opt[\"after-collapse-delimiter\"];\n    } else if (last_collapsed && !this.tmp.have_collapsed && \"string\" === typeof this.citation.opt[\"after-collapse-delimiter\"]) {\n        this.tmp.splice_delimiter = this.citation.opt[\"after-collapse-delimiter\"];\n    } else if (!last_collapsed && !this.tmp.have_collapsed && \"string\" === typeof this.citation.opt[\"after-collapse-delimiter\"] && !this.citation.opt.collapse === \"year-suffix\") {\n        this.tmp.splice_delimiter = this.citation.opt[\"after-collapse-delimiter\"];\n    } else if (this.tmp.use_cite_group_delimiter) {\n        this.tmp.splice_delimiter = this.citation.opt.cite_group_delimiter;\n    } else if (this.tmp.have_collapsed && this.opt.xclass === \"in-text\" && this.opt.update_mode !== CSL.NUMERIC) {\n        this.tmp.splice_delimiter = \", \";\n    } else if (this.tmp.cite_locales[pos - 1]) {\n        //\n        // Must have a value to take effect.  Use zero width space to force empty delimiter.\n        var alt_affixes = this.tmp.cite_affixes[this.tmp.area][this.tmp.cite_locales[pos - 1]];\n        if (alt_affixes && alt_affixes.delimiter) {\n            this.tmp.splice_delimiter = alt_affixes.delimiter;\n        }\n    } else if (!this.tmp.splice_delimiter) {\n        // This happens when no delimiter is set on cs:layout under cs:citation\n        this.tmp.splice_delimiter = \"\";\n    }\n*/\n    // Paranoia\n    //if (!this.tmp.splice_delimiter) {\n    //    this.tmp.splice_delimiter = \"\";\n    //}\n    return this.tmp.splice_delimiter;\n};\n\n/*\n * Compose individual cites into a single string, with\n * flexible inter-cite splicing.\n */\nCSL.getCitationCluster = function (inputList, citation) {\n    var result, objects, myparams, len, pos, item, last_collapsed, params, empties, composite, compie, myblobs, Item, llen, ppos, obj, preceding_item, txt_esc, error_object, citationID, authorOnly, suppressAuthor;\n    var citation_prefix = \"\";\n    this.output.checkNestedBrace = new CSL.checkNestedBrace(this);\n    if (citation) {\n        citationID = citation.citationID;\n        authorOnly = citation.properties.mode === \"author-only\" ? !!citation.properties.mode : false;\n        if (this.opt.xclass !== \"note\") {\n            suppressAuthor = citation.properties.mode === \"suppress-author\" ? !!citation.properties.mode : false;\n        }\n        if (citation.properties.prefix) {\n            citation_prefix = CSL.checkPrefixSpaceAppend(this, citation.properties.prefix);\n        }\n    }\n    inputList = inputList ? inputList : [];\n    this.tmp.last_primary_names_string = false;\n    txt_esc = CSL.getSafeEscape(this);\n    this.tmp.area = \"citation\";\n    this.tmp.root = \"citation\";\n    result = \"\";\n    objects = [];\n    this.tmp.last_suffix_used = \"\";\n    this.tmp.last_names_used = [];\n    this.tmp.last_years_used = [];\n    this.tmp.backref_index = [];\n    this.tmp.cite_locales = [];\n    if (!this.tmp.just_looking) {\n        this.tmp.abbrev_trimmer = {\n            QUASHES: {}\n        };\n    }\n\n    var use_layout_prefix = this.output.checkNestedBrace.update(this.citation.opt.layout_prefix + citation_prefix);\n    //var use_layout_prefix = this.citation.opt.layout_prefix;\n\n    var suppressTrailingPunctuation = false;\n    if (this.citation.opt.suppressTrailingPunctuation) {\n        suppressTrailingPunctuation = true;\n    }\n    if (citationID) {\n        //this.registry.citationreg.citationById[citationID].properties.backref_index = false;\n        //this.registry.citationreg.citationById[citationID].properties.backref_citation = false;\n        if (this.registry.citationreg.citationById[citationID].properties[\"suppress-trailing-punctuation\"]) {\n            suppressTrailingPunctuation = true;\n        }\n    }\n\n    // Adjust locator positions if that looks like a sensible thing to do.\n    if (this.opt.xclass === \"note\") {\n        var parasets = [];\n        var lastTitle = false;\n        var lastPosition = false;\n        var lastID = false;\n        var lst = [];\n        for (var i=0, ilen = inputList.length; i < ilen; i += 1) {\n            var type = inputList[i][0].type;\n            var title = inputList[i][0].title;\n            var position = inputList[i][1].position;\n            var id = inputList[i][0].id;\n            if (title && type === \"legal_case\" && id !== lastID && position) {\n                // Start a fresh sublist if the item title does not match the last one\n                if (title !== lastTitle || parasets.length === 0) {\n                    lst = [];\n                    parasets.push(lst);\n                }\n                lst.push(inputList[i][1]);\n            }\n            lastTitle = title;\n            lastPosition = position;\n            lastID = id;\n        }\n        // We now have a list of sublists, each w/matching titles\n        for (i=0, ilen=parasets.length; i < ilen; i += 1) {\n            lst = parasets[i];\n            if (lst.length < 2) {\n                continue;\n            }\n            // Get the locator in last position, but only if it's the only one in the set.\n            var locatorInLastPosition = lst.slice(-1)[0].locator;\n            if (locatorInLastPosition) {\n                for (var j=0, jlen=lst.length - 1; j < jlen; j += 1) {\n                    if (lst[j].locator) {\n                        locatorInLastPosition = false;\n                    }\n                }\n            }\n            // move the locator here, if it's called for.\n            if (locatorInLastPosition) {\n                lst[0].locator = locatorInLastPosition;\n                delete lst.slice(-1)[0].locator;\n                lst[0].label = lst.slice(-1)[0].label;\n                if (lst.slice(-1)[0].label) {\n                    delete lst.slice(-1)[0].label;\n                }\n            }\n       }\n    }\n    myparams = [];\n    len = inputList.length;\n    if (inputList[0] && inputList[0][1]) {\n        if (authorOnly) {\n            delete inputList[0][1][\"suppress-author\"];\n            inputList[0][1][\"author-only\"] = true;\n        } else if (suppressAuthor) {\n            delete inputList[0][1][\"author-only\"];\n            inputList[0][1][\"suppress-author\"] = true;\n        }\n    }\n    if (this.opt.parallel.enable) {\n        this.parallel.StartCitation(inputList);\n    }\n    for (pos = 0; pos < len; pos += 1) {\n\n        // Also for parallels only\n        this.tmp.cite_index = pos;\n\n        Item = inputList[pos][0];\n        item = inputList[pos][1];\n        item = CSL.parseLocator.call(this, item);\n        last_collapsed = this.tmp.have_collapsed;\n        var last_locator = false;\n        if (pos > 0 && inputList[pos-1][1]) {\n            last_locator = !!inputList[pos-1][1].locator;\n        }\n        params = {};\n        \n        // Reset shadow_numbers here, suppress reset in getCite()\n        this.tmp.shadow_numbers = {};\n        if (!this.tmp.just_looking && this.opt.hasPlaceholderTerm) {\n            var output = this.output;\n            this.output = new CSL.Output.Queue(this);\n            this.output.adjust = new CSL.Output.Queue.adjust();\n            CSL.getAmbiguousCite.call(this, Item, null, false, item);\n            this.output = output;\n        }\n\n        this.tmp.in_cite_predecessor = false;\n        // true is to block reset of shadow numbers\n        \n        \n        if (pos > 0) {\n            CSL.getCite.call(this, Item, item, \"\" + inputList[(pos - 1)][0].id, true);\n        } else {\n            this.tmp.term_predecessor = false;\n            CSL.getCite.call(this, Item, item, null, true);\n        }\n\n        // Make a note of any errors\n        if (!this.tmp.cite_renders_content) {\n            error_object = {\n                citationID: \"\" + this.tmp.citation_id,\n                index: this.tmp.citation_pos,\n                noteIndex: this.tmp.citation_note_index,\n                itemID: \"\" + Item.id,\n                citationItems_pos: pos,\n                error_code: CSL.ERROR_NO_RENDERED_FORM\n            };\n            this.tmp.citation_errors.push(error_object);\n        }\n        params.splice_delimiter = CSL.getSpliceDelimiter.call(this, last_locator, last_collapsed, pos);\n        // XXX This appears to be superfluous.\n        if (item && item[\"author-only\"]) {\n            this.tmp.suppress_decorations = true;\n        }\n\n        if (pos > 0) {\n            preceding_item = inputList[pos - 1][1];\n\n            // XXX OR if preceding suffix is empty, and the current prefix begins with a full stop.\n\n            var precedingEndsInPeriodOrComma = preceding_item.suffix && [\";\", \".\", \",\"].indexOf(preceding_item.suffix.slice(-1)) > -1;\n            var currentStartsWithPeriodOrComma = !preceding_item.suffix && item.prefix && [\";\", \".\", \",\"].indexOf(item.prefix.slice(0, 1)) > -1;\n            if (precedingEndsInPeriodOrComma || currentStartsWithPeriodOrComma) {\n                var spaceidx = params.splice_delimiter.indexOf(\" \");\n                if (spaceidx > -1 && !currentStartsWithPeriodOrComma) {\n                    params.splice_delimiter = params.splice_delimiter.slice(spaceidx);\n                } else {\n                    params.splice_delimiter = \"\";\n                }\n            }\n        }\n        params.suppress_decorations = this.tmp.suppress_decorations;\n        params.have_collapsed = this.tmp.have_collapsed;\n        //\n        // XXXXX: capture parameters to an array, which\n        // will be of the same length as this.output.queue,\n        // corresponding to each element.\n        //\n        myparams.push(params);\n        if (item[\"author-only\"]) {\n            break;\n        }\n    }\n    //\n    // output.queue is a simple array.  do a slice\n    // of it to get each cite item, setting params from\n    // the array that was built in the preceding loop.\n    //\n    empties = 0;\n    myblobs = this.output.queue.slice();\n\n    var citation_suffix = \"\";\n    if (citation) {\n        citation_suffix = CSL.checkSuffixSpacePrepend(this, citation.properties.suffix);\n    }\n    var suffix = this.citation.opt.layout_suffix;\n    var last_locale = this.tmp.cite_locales[this.tmp.cite_locales.length - 1];\n    //\n    // Must have a value to take effect.  Use zero width space to force empty suffix.\n    if (last_locale && this.tmp.cite_affixes[this.tmp.area][last_locale] && this.tmp.cite_affixes[this.tmp.area][last_locale].suffix) {\n        suffix = this.tmp.cite_affixes[this.tmp.area][last_locale].suffix;\n    }\n    if (CSL.TERMINAL_PUNCTUATION.slice(0, -1).indexOf(suffix.slice(0, 1)) > -1) {\n        suffix = suffix.slice(0, 1);\n    }\n    //print(\"=== FROM CITE ===\");\n    suffix = this.output.checkNestedBrace.update(citation_suffix + suffix);\n\n\n    for (var i=0,ilen=this.output.queue.length;i<ilen;i+=1) {\n        CSL.Output.Queue.purgeEmptyBlobs(this.output.queue[i]);\n    }\n    if (!this.tmp.suppress_decorations && this.output.queue.length) {\n        if (!(this.opt.development_extensions.apply_citation_wrapper\n              && this.sys.wrapCitationEntry\n               && !this.tmp.just_looking\n              && this.tmp.area === \"citation\")) { \n\n            if (!suppressTrailingPunctuation) {\n                this.output.queue[this.output.queue.length - 1].strings.suffix = suffix;\n            }\n            this.output.queue[0].strings.prefix = use_layout_prefix;\n        }\n    }\n    if (this.opt.development_extensions.clean_up_csl_flaws) {\n        for (var j=0,jlen=this.output.queue.length;j<jlen;j+=1) {\n            //print(\"OUTPUT[5]: \"+JSON.stringify(this.output.queue[j],['strings','prefix','suffix','delimiter','blobs','decorations'],2))\n            this.output.adjust.upward(this.output.queue[j]);\n            //print(\"OUTPUT[4]: \"+JSON.stringify(this.output.queue[j],['strings','prefix','suffix','delimiter','blobs','decorations'],2))\n            this.output.adjust.leftward(this.output.queue[j]);\n            //print(\"OUTPUT[3]: \"+JSON.stringify(this.output.queue[j],['strings','prefix','suffix','delimiter','blobs','decorations'],2))\n            this.output.adjust.downward(this.output.queue[j]);\n            //print(\"OUTPUT[2]: \"+JSON.stringify(this.output.queue[j],['strings','prefix','suffix','delimiter','blobs','decorations'],2))\n            this.tmp.last_chr = this.output.adjust.fix(this.output.queue[j]);\n            //print(\"OUTPUT[1]: \"+JSON.stringify(this.output.queue[j],['strings','prefix','suffix','delimiter','blobs','decorations','num'],2))\n        }\n    }\n    //print(\"this.tmp.last_chr=\"+this.tmp.last_chr);\n    for (pos = 0, len = myblobs.length; pos < len; pos += 1) {\n        var buffer = [];\n        this.output.queue = [myblobs[pos]];\n        this.tmp.suppress_decorations = myparams[pos].suppress_decorations;\n        this.tmp.splice_delimiter = myparams[pos].splice_delimiter;\n        //\n        // oh, one last second thought on delimiters ...\n        //\n\n        if (myblobs[pos].parallel_delimiter) {\n            this.tmp.splice_delimiter = myblobs[pos].parallel_delimiter;\n        }\n        this.tmp.have_collapsed = myparams[pos].have_collapsed;\n\n        composite = this.output.string(this, this.output.queue);\n\n        this.tmp.suppress_decorations = false;\n        // meaningless assignment\n        // this.tmp.handle_ranges = false;\n        if (\"string\" === typeof composite) {\n            this.tmp.suppress_decorations = false;\n            if (!composite) {\n                if (this.opt.development_extensions.throw_on_empty) {\n                    CSL.error(\"Citation would render no content\");\n                } else {\n                    composite = \"[NO_PRINTED_FORM]\";\n                }\n            }\n            return composite;\n        }\n        if (\"object\" === typeof composite && composite.length === 0 && !item[\"suppress-author\"]) {\n            if (pos === 0) {\n                var errStr = \"[CSL STYLE ERROR: reference with no printed form.]\";\n                var preStr = pos === 0 ? txt_esc(this.citation.opt.layout_prefix) : \"\";\n                var sufStr = pos === (myblobs.length - 1) ? txt_esc(this.citation.opt.layout_suffix) : \"\";\n                composite.push(preStr + errStr + sufStr);\n            } else if (pos === myblobs.length - 1) {\n                var tmpobj = objects[objects.length - 1];\n                if (typeof tmpobj === \"string\") {\n                    objects[objects.length -1] += (txt_esc(this.citation.opt.layout_suffix));\n                } else if (typeof tmpobj === \"object\") {\n                    tmpobj.strings.suffix += (txt_esc(this.citation.opt.layout_suffix));\n                }\n            }\n        }\n        if (buffer.length && \"string\" === typeof composite[0]) {\n            composite.reverse();\n            var tmpstr = composite.pop();\n            if (tmpstr && tmpstr.slice(0, 1) === \",\") {\n                buffer.push(tmpstr);\n            } else if (\"string\" == typeof buffer.slice(-1)[0] && buffer.slice(-1)[0].slice(-1) === \",\") {\n                buffer.push(\" \" + tmpstr);\n            } else if (tmpstr) {\n                buffer.push(txt_esc(this.tmp.splice_delimiter) + tmpstr);\n            }\n        } else {\n            composite.reverse();\n            compie = composite.pop();\n            if (\"undefined\" !== typeof compie) {\n                if (buffer.length && \"string\" === typeof buffer[buffer.length - 1]) {\n                    buffer[buffer.length - 1] += compie.successor_prefix;\n                }\n                buffer.push(compie);\n            }\n        }\n        // Seems odd, but this was unnecessary and broken.\n        //composite.reverse();\n        llen = composite.length;\n        for (ppos = 0; ppos < llen; ppos += 1) {\n            obj = composite[ppos];\n            if (\"string\" === typeof obj) {\n                buffer.push(txt_esc(this.tmp.splice_delimiter) + obj);\n                continue;\n            }\n            compie = composite.pop();\n            if (\"undefined\" !== typeof compie) {\n                buffer.push(compie);\n            }\n        }\n        if (buffer.length === 0 && !inputList[pos][1][\"suppress-author\"]) {\n            empties += 1;\n        }\n        if (buffer.length > 1 && typeof buffer[0] !== \"string\") {\n            buffer = [this.output.renderBlobs(buffer)];\n        }\n        if (buffer.length) {\n            if (\"string\" === typeof buffer[0]) {\n                if (pos > 0) {\n                    buffer[0] = txt_esc(this.tmp.splice_delimiter) + buffer[0];\n                }\n            } else {\n                if (pos > 0) {\n                    buffer[0].splice_prefix = this.tmp.splice_delimiter;\n                } else {\n                    buffer[0].splice_prefix = \"\";\n                }\n            }\n        }\n        objects = objects.concat(buffer);\n    }\n    // print(\"OBJECTS=\"+objects);\n    result += this.output.renderBlobs(objects);\n\n    if (result) {\n        //if (CSL.TERMINAL_PUNCTUATION.indexOf(this.tmp.last_chr) > -1 \n        //    && this.tmp.last_chr === use_layout_suffix.slice(0, 1)) {\n        //    use_layout_suffix = use_layout_suffix.slice(1);\n        //}\n        if (!this.tmp.suppress_decorations) {\n            len = this.citation.opt.layout_decorations.length;\n            for (pos = 0; pos < len; pos += 1) {\n                params = this.citation.opt.layout_decorations[pos];\n                // The \"normal\" formats in some output modes expect\n                // a superior nested decoration environment, and\n                // so should produce no output here.\n                if (params[1] === \"normal\") {\n                    continue;\n                }\n                if (!item || !item[\"author-only\"]) {\n                    result = this.fun.decorate[params[0]][params[1]](this, result);\n                }\n            }\n        }\n    }\n    this.tmp.suppress_decorations = false;\n    if (!result) {\n        if (this.opt.development_extensions.throw_on_empty) {\n            CSL.error(\"Citation would render no content\");\n        } else {\n            result = \"[NO_PRINTED_FORM]\"\n        }\n    }\n    return result;\n};\n\n/*\n * Render a single cite item.\n *\n * This is called on the state object, with a single\n * Item as input.  It iterates exactly once over the style\n * citation tokens, and leaves the result of rendering in\n * the top-level list in the relevant *.opt.output\n * stack, as a list item consisting of a single string.\n *\n * (This is dual-purposed for generating individual\n * entries in a bibliography.)\n */\nCSL.getCite = function (Item, item, prevItemID, blockShadowNumberReset) {\n    var next, error_object;\n    var areaOrig = this.tmp.area;\n    if (item && item[\"author-only\"] && this.intext && this.intext.tokens.length > 0) {\n            this.tmp.area = \"intext\";\n    }\n    this.tmp.cite_renders_content = false;\n    this.tmp.probably_rendered_something = false;\n    this.tmp.prevItemID = prevItemID;\n\n    CSL.citeStart.call(this, Item, item, blockShadowNumberReset);\n    next = 0;\n    this.tmp.name_node = {};\n    this.nameOutput = new CSL.NameOutput(this, Item, item);\n\n    // rerun?\n    while (next < this[this.tmp.area].tokens.length) {\n        next = CSL.tokenExec.call(this, this[this.tmp.area].tokens[next], Item, item);\n    }\n\n    CSL.citeEnd.call(this, Item, item);\n    // Odd place for this, but it seems to fit here\n    if (!this.tmp.cite_renders_content && !this.tmp.just_looking) {\n        if (this.tmp.area === \"bibliography\") {\n            error_object = {\n                index: this.tmp.bibliography_pos,\n                itemID: \"\" + Item.id,\n                error_code: CSL.ERROR_NO_RENDERED_FORM\n            };\n            this.tmp.bibliography_errors.push(error_object);\n        }\n    }\n    this.tmp.area = areaOrig;\n    return \"\" + Item.id;\n};\n\n\nCSL.citeStart = function (Item, item, blockShadowNumberReset) {\n    this.tmp.lang_array = [];\n    if (Item.language) {\n        // Guard against garbage locales in user input\n        var m = Item.language.match(/^([a-zA-Z]+).*/);\n        if (m) {\n            this.tmp.lang_array.push(m[1].toLowerCase());\n        }\n    }\n    this.tmp.lang_array.push(this.opt.lang);\n    if (!blockShadowNumberReset) {\n        this.tmp.shadow_numbers = {};\n    }\n    \n    this.tmp.disambiguate_count = 0;\n    this.tmp.disambiguate_maxMax = 0;\n    this.tmp.same_author_as_previous_cite = false;\n    if (!this.tmp.suppress_decorations) {\n        this.tmp.subsequent_author_substitute_ok = true;\n    } else {\n        this.tmp.subsequent_author_substitute_ok = false;\n    }\n    this.tmp.lastchr = \"\";\n    if (this.tmp.area === \"citation\" && this.citation.opt.collapse && this.citation.opt.collapse.length) {\n        //this.tmp.have_collapsed = \"year\";\n        this.tmp.have_collapsed = true;\n    } else {\n        this.tmp.have_collapsed = false;\n    }\n    this.tmp.render_seen = false;\n    if (this.tmp.disambig_request  && ! this.tmp.disambig_override) {\n        this.tmp.disambig_settings = this.tmp.disambig_request;\n    } else if (this.registry.registry[Item.id] && ! this.tmp.disambig_override) {\n        this.tmp.disambig_request = this.registry.registry[Item.id].disambig;\n        this.tmp.disambig_settings = this.registry.registry[Item.id].disambig;\n    } else {\n        this.tmp.disambig_settings = new CSL.AmbigConfig();\n    }\n    if (this.tmp.area !== 'citation') {\n        if (!this.registry.registry[Item.id]) {\n            this.tmp.disambig_restore = new CSL.AmbigConfig();\n        } else {\n            this.tmp.disambig_restore = CSL.cloneAmbigConfig(this.registry.registry[Item.id].disambig);\n            if (this.tmp.area === 'bibliography' && this.tmp.disambig_settings && this.tmp.disambig_override) {\n                if (this.opt[\"disambiguate-add-names\"]) {\n                    this.tmp.disambig_settings.names = this.registry.registry[Item.id].disambig.names.slice();\n                    if (this.tmp.disambig_request) {\n                        this.tmp.disambig_request.names = this.registry.registry[Item.id].disambig.names.slice();\n                    }\n                }\n                if (this.opt[\"disambiguate-add-givenname\"]) {\n                    // This is weird and delicate and not fully understood\n                    this.tmp.disambig_request = this.tmp.disambig_settings;\n                    this.tmp.disambig_settings.givens = this.registry.registry[Item.id].disambig.givens.slice();\n                    this.tmp.disambig_request.givens = this.registry.registry[Item.id].disambig.givens.slice();\n                    for (var i=0,ilen=this.tmp.disambig_settings.givens.length;i<ilen;i+=1) {\n                        this.tmp.disambig_settings.givens[i] = this.registry.registry[Item.id].disambig.givens[i].slice();\n                    }\n                    for (var i=0,ilen=this.tmp.disambig_request.givens.length;i<ilen;i+=1) {\n                        this.tmp.disambig_request.givens[i] = this.registry.registry[Item.id].disambig.givens[i].slice();\n                    }\n                }\n            }\n        }\n    }\n\n    this.tmp.names_used = [];\n    this.tmp.nameset_counter = 0;\n    this.tmp.years_used = [];\n    this.tmp.names_max.clear();\n    if (!this.tmp.just_looking) {\n        if (!item || item.parallel === \"first\" || !item.parallel) {\n            this.tmp.abbrev_trimmer = {\n                QUASHES: {}\n            };\n        }\n    }\n\n    this.tmp.splice_delimiter = this[this.tmp.area].opt.layout_delimiter;\n    //this.tmp.splice_delimiter = this[this.tmp.area].opt.delimiter;\n\n    this.bibliography_sort.keys = [];\n    this.citation_sort.keys = [];\n\n    this.tmp.has_done_year_suffix = false;\n    this.tmp.last_cite_locale = false;\n    // SAVE PARAMETERS HERE, IF APPROPRIATE\n    // (promiscuous addition of global parameters => death by a thousand cuts)\n    if (!this.tmp.just_looking && item && !item.position && this.registry.registry[Item.id]) {\n        this.tmp.disambig_restore = CSL.cloneAmbigConfig(this.registry.registry[Item.id].disambig);\n    }\n    // XXX This only applied to the \"number\" variable itself? Huh?\n    //this.setNumberLabels(Item);\n    this.tmp.first_name_string = false;\n    this.tmp.authority_stop_last = 0;\n};\n\nCSL.citeEnd = function (Item, item) {\n    // RESTORE PARAMETERS IF APPROPRIATE\n    if (this.tmp.disambig_restore && this.registry.registry[Item.id]) {\n        this.registry.registry[Item.id].disambig.names = this.tmp.disambig_restore.names.slice();\n        this.registry.registry[Item.id].disambig.givens = this.tmp.disambig_restore.givens.slice();\n        for (var i=0,ilen=this.registry.registry[Item.id].disambig.givens.length;i<ilen;i+=1) {\n            this.registry.registry[Item.id].disambig.givens[i] = this.tmp.disambig_restore.givens[i].slice();\n        }\n    }\n    this.tmp.disambig_restore = false;\n\n    if (item && item.suffix) {\n        //this.tmp.last_suffix_used = this.tmp.suffix.value();\n        this.tmp.last_suffix_used = item.suffix;\n    } else {\n        this.tmp.last_suffix_used = \"\";\n    }\n    this.tmp.last_years_used = this.tmp.years_used.slice();\n    this.tmp.last_names_used = this.tmp.names_used.slice();\n    this.tmp.cut_var = false;\n\n    // This is a hack, in a way; I have lost track of where\n    // the disambig (name rendering) settings used for rendering work their way\n    // into the registry.  This resets defaults to the subsequent form,\n    // when first cites are rendered.\n    //if (this.tmp.disambig_restore && this.registry.registry[Item.id]) {\n    //    this.registry.registry[Item.id].disambig = this.tmp.disambig_restore;\n    //}\n    //this.tmp.disambig_restore = false;\n    this.tmp.disambig_request = false;\n\n    this.tmp.cite_locales.push(this.tmp.last_cite_locale);\n\n    if (this.tmp.issued_date && this.tmp.renders_collection_number) {\n        var buf = [];\n        for (var i = this.tmp.issued_date.list.length - 1; i > this.tmp.issued_date.pos; i += -1) {\n            buf.push(this.tmp.issued_date.list.pop());\n        }\n        // Throw away the unwanted blob\n        this.tmp.issued_date.list.pop();\n        // Put the other stuff back\n        for (i = buf.length - 1; i > -1; i += -1) {\n            this.tmp.issued_date.list.push(buf.pop());\n        }\n    }\n    this.tmp.issued_date = false;\n    this.tmp.renders_collection_number = false;\n\n};\n\n/*global CSL: true */\n\nCSL.Engine.prototype.makeBibliography = function (bibsection) {\n    var debug, ret, params, maxoffset, item, len, pos, tok, tokk, tokkk, entry_ids, entry_strings;\n    debug = false;\n    if (!bibsection && (this.bibliography.opt.exclude_types || this.bibliography.opt.exclude_with_fields)) {\n        bibsection = {\n            exclude: []\n        };\n        if (this.bibliography.opt.exclude_types) {\n            for (var i in this.bibliography.opt.exclude_types) {\n                var val = this.bibliography.opt.exclude_types[i];\n                bibsection.exclude.push({\n                    field: \"type\",\n                    value: val\n                });\n            }\n        }\n        if (this.bibliography.opt.exclude_with_fields) {\n            for (var i in this.bibliography.opt.exclude_with_fields) {\n                var field = this.bibliography.opt.exclude_with_fields[i];\n                bibsection.exclude.push({\n                    field: field, value: true\n                });\n            }\n        }\n    }\n    // API change: added in version 1.0.51\n    if (!this.bibliography.tokens.length) {\n        return false;\n    }\n    if (\"string\" === typeof bibsection) {\n        this.opt.citation_number_slug = bibsection;\n        bibsection = false;\n    }\n    //SNIP-START\n    if (debug) {\n        len = this.bibliography.tokens.length;\n        for (pos = 0; pos < len; pos += 1) {\n            tok = this.bibliography.tokens[pos];\n            CSL.debug(\"bibtok: \" + tok.name);\n        }\n        CSL.debug(\"---\");\n        len = this.citation.tokens.length;\n        for (pos = 0; pos < len; pos += 1) {\n            tokk = this.citation.tokens[pos];\n            CSL.debug(\"cittok: \" + tok.name);\n        }\n        CSL.debug(\"---\");\n        len = this.bibliography_sort.tokens.length;\n        for (pos = 0; pos < len; pos += 1) {\n            tokkk = this.bibliography_sort.tokens[pos];\n            CSL.debug(\"bibsorttok: \" + tok.name);\n        }\n    }\n    //SNIP-END\n\n    // For paged returns\n    ret = CSL.getBibliographyEntries.call(this, bibsection);\n    entry_ids = ret[0];\n    entry_strings = ret[1];\n\n    // For paged returns\n    var done = ret[2];\n\n    params = {\n        \"maxoffset\": 0,\n        \"entryspacing\": this.bibliography.opt[\"entry-spacing\"],\n        \"linespacing\": this.bibliography.opt[\"line-spacing\"],\n        \"second-field-align\": false,\n        \"entry_ids\": entry_ids,\n        \"bibliography_errors\": this.tmp.bibliography_errors.slice(),\n        \"done\": done\n    };\n    if (this.bibliography.opt[\"second-field-align\"]) {\n        params[\"second-field-align\"] = this.bibliography.opt[\"second-field-align\"];\n    }\n    maxoffset = 0;\n    len = this.registry.reflist.length;\n    for (pos = 0; pos < len; pos += 1) {\n        item = this.registry.reflist[pos];\n        if (item.offset > params.maxoffset) {\n            params.maxoffset = item.offset;\n        }\n    }\n    if (this.bibliography.opt.hangingindent) {\n        params.hangingindent = this.bibliography.opt.hangingindent;\n    }\n    params.bibstart = this.fun.decorate.bibstart;\n    params.bibend = this.fun.decorate.bibend;\n\n    this.opt.citation_number_slug = false;\n    return [params, entry_strings];\n};\n\n/*\n * Compose individual cites into a single string.\n */\nCSL.getBibliographyEntries = function (bibsection) {\n    var ret, input, include, anymatch, allmatch, bib_entry, res, item, spec, lllen, pppos, topblobs, entry_item_ids, debug, i, ilen, siblings, skips, sortedItems, eyetem, entry_item_data, j, jlen;\n    ret = [];\n    entry_item_data = [];\n    this.tmp.area = \"bibliography\";\n    this.tmp.root = \"bibliography\";\n    this.tmp.last_rendered_name = false;\n    this.tmp.bibliography_errors = [];\n    this.tmp.bibliography_pos = 0;\n    \n    // For paged returns: disable generated entries and\n    // do not fetch full items as a batch (input variable\n    // consists of ids only in this case)\n    if (bibsection && bibsection.page_start && bibsection.page_length) {\n        input = this.registry.getSortedIds();        \n    } else {\n        input = this.refetchItems(this.registry.getSortedIds());\n    }\n    \n    this.tmp.disambig_override = true;\n    function eval_string(a, b) {\n        if (a === b) {\n            return true;\n        }\n        return false;\n    }\n    function eval_list(a, lst) {\n        lllen = lst.length;\n        for (pppos = 0; pppos < lllen; pppos += 1) {\n            if (eval_string(a, lst[pppos])) {\n                return true;\n            }\n        }\n        return false;\n    }\n    function eval_spec(a, b) {\n        if (\"boolean\" === typeof a || !a) {\n            if (a) {\n                return !!b;\n            } else {\n                return !b;\n            }\n        } else {\n            if (\"string\" === typeof b) {\n                return eval_string(a, b);\n            } else if (!b) {\n                return false;\n            } else {\n                return eval_list(a, b);\n            }\n        }\n    }\n\n    skips = {};\n\n    // For paged returns\n    var page_item_count;\n    if (bibsection && bibsection.page_start && bibsection.page_length) {\n        page_item_count = 0;\n        if (bibsection.page_start !== true) {\n            for (i = 0, ilen = input.length; i < ilen; i += 1) {\n                skips[input[i]] = true;\n                if (bibsection.page_start == input[i]) {\n                    break;\n                }\n            }\n        }\n    }\n\n    var processed_item_ids = [];\n\n    var consolidatedIDs = {};\n    this.tmp.container_item_count = {};\n    input = input.filter(o => {\n        var ret = o;\n        if (o.legislation_id) {\n            if (consolidatedIDs[o.legislation_id]) {\n                ret = false;\n            } else {\n                consolidatedIDs[o.legislation_id] = true;\n            }\n        } else if (o.container_id) {\n            if (!this.tmp.container_item_count[o.container_id]) {\n                this.tmp.container_item_count[o.container_id] = 0;\n            }\n            this.tmp.container_item_count[o.container_id]++;\n            if (this.bibliography.opt.consolidate_containers.indexOf(o.type) > -1) {\n                if (consolidatedIDs[o.container_id]) {\n                    ret = false;\n                } else {\n                    consolidatedIDs[o.container_id] = true;\n                }\n            }\n        }\n        return ret;\n    });\n\n    this.tmp.container_item_pos = {};\n\n    for (i = 0, ilen = input.length; i < ilen; i += 1) {\n        \n        // For paged returns\n        if (bibsection && bibsection.page_start && bibsection.page_length) {\n            if (skips[input[i]]) {\n                continue;\n            }\n            item = this.refetchItem(input[i]);\n            if (page_item_count === bibsection.page_length) {\n                break;\n            }\n        } else {\n            item = input[i];\n            if (skips[item.id]) {\n                continue;\n            }\n        }\n        if (bibsection) {\n            include = true;\n            if (bibsection.include) {\n                //\n                // Opt-in: these are OR-ed.\n                //\n                include = false;\n                for (j = 0, jlen = bibsection.include.length; j < jlen; j += 1) {\n                    spec = bibsection.include[j];\n                    if (eval_spec(spec.value, item[spec.field])) {\n                        include = true;\n                        break;\n                    }\n                }\n            } else if (bibsection.exclude) {\n                //\n                // Opt-out: these are also OR-ed.\n                //\n                anymatch = false;\n                for (j = 0, jlen = bibsection.exclude.length; j < jlen; j += 1) {\n                    spec = bibsection.exclude[j];\n                    if (eval_spec(spec.value, item[spec.field])) {\n                        anymatch = true;\n                        break;\n                    }\n                }\n                if (anymatch) {\n                    include = false;\n                }\n            } else if (bibsection.select) {\n                //\n                // Multiple condition opt-in: these are AND-ed.\n                //\n                include = false;\n                allmatch = true;\n                for (j = 0, jlen = bibsection.select.length; j < jlen; j += 1) {\n                    spec = bibsection.select[j];\n                    if (!eval_spec(spec.value, item[spec.field])) {\n                        allmatch = false;\n                    }\n                }\n                if (allmatch) {\n                    include = true;\n                }\n            }\n            if (bibsection.quash) {\n                //\n                // Stop criteria: These are AND-ed.\n                //\n                allmatch = true;\n                for (j = 0, jlen = bibsection.quash.length; j < jlen; j += 1) {\n                    spec = bibsection.quash[j];\n                    if (!eval_spec(spec.value, item[spec.field])) {\n                        allmatch = false;\n                    }\n                }\n                if (allmatch) {\n                    include = false;\n                }\n            }\n            if (!include) {\n                continue;\n            }\n        }\n        //SNIP-START\n        if (debug) {\n            CSL.debug(\"BIB: \" + item.id);\n        }\n\n        if (item.container_id) {\n            if (!this.tmp.container_item_pos[item.container_id]) {\n                this.tmp.container_item_pos[item.container_id] = 0;\n            }\n            this.tmp.container_item_pos[item.container_id]++;\n        }\n        \n        //SNIP-END\n        bib_entry = new CSL.Token(\"group\", CSL.START);\n        bib_entry.decorations = [[\"@bibliography\", \"entry\"]].concat(this.bibliography.opt.layout_decorations);\n        this.output.startTag(\"bib_entry\", bib_entry);\n        if (item.system_id && this.sys.embedBibliographyEntry) {\n            this.output.current.value().item_id = item.system_id;\n        } else {\n            this.output.current.value().system_id = item.id;\n        }\n\n        // 2019-06-25 Hacked to conform to new parallels evaluation method\n        // 2020-04-25 Revised to work with latest, and final, parallel-first/parallel-last attributes\n        entry_item_ids = [];\n        if (this.registry.registry[item.id].master\n            && !(bibsection && bibsection.page_start && bibsection.page_length)) {\n            // Fetch item content\n            sortedItems = [[item, {id: item.id}]];\n            siblings = this.registry.registry[item.id].siblings;\n            for (var j=0,jlen=siblings.length; j<jlen; j++) {\n               sortedItems.push([this.refetchItem(siblings[j]), {id: siblings[j]}]);\n            }\n            // Adjust parameters\n            this.parallel.StartCitation(sortedItems);\n            if (this.registry.registry[item.id].parallel_delimiter_override) {\n                this.output.queue[0].strings.delimiter = this.registry.registry[item.id].parallel_delimiter_override;\n            } else {\n                this.output.queue[0].strings.delimiter = \", \";\n            }\n            this.tmp.term_predecessor = false;\n            this.tmp.cite_index = 0;\n            // Run cites\n            for (j = 0, jlen = sortedItems.length; j < jlen; j += 1) {\n                if (j < (sortedItems.length - 1)) {\n                    this.tmp.parallel_and_not_last = true;\n                } else {\n                    delete this.tmp.parallel_and_not_last;\n                }\n                entry_item_ids.push(\"\" + CSL.getCite.call(this, sortedItems[j][0], sortedItems[j][1]));\n                this.tmp.cite_index++;\n                skips[sortedItems[j][0].id] = true;\n            }\n        } else if (!this.registry.registry[item.id].siblings) {\n            this.tmp.term_predecessor = false;\n            this.tmp.cite_index = 0;\n            entry_item_ids.push(\"\" + CSL.getCite.call(this, item));\n            if (bibsection && bibsection.page_start && bibsection.page_length) {\n                page_item_count += 1;\n            }\n            //skips[item.id] = true;\n        }\n        // For RDF support\n        entry_item_data.push(\"\");\n\n        this.tmp.bibliography_pos += 1;\n\n        processed_item_ids.push(entry_item_ids);\n        //\n        // XXX: loop to render parallels goes here\n        // XXX: just have to mark them somehow ...\n        //\n        this.output.endTag(\"bib_entry\");\n        //\n        // place layout prefix on first blob of each cite, and suffix\n        // on the last non-empty blob of each cite.  there be dragons\n        // here.\n        //\n        if (this.output.queue[0].blobs.length && this.output.queue[0].blobs[0].blobs.length) {\n            // The output queue stuff needs cleaning up.  the result of\n            // output.current.value() is sometimes a blob, sometimes its list\n            // of blobs.  this inconsistency is a source of confusion, and\n            // should be cleaned up across the code base in the first\n            // instance, before making any other changes to output code.\n            if (!this.output.queue[0].blobs[0].blobs[0].strings) {\n                topblobs = this.output.queue[0].blobs;\n            } else {\n                topblobs = this.output.queue[0].blobs[0].blobs;\n            }\n            topblobs[0].strings.prefix = this.bibliography.opt.layout_prefix + topblobs[0].strings.prefix;\n        }\n        for (j=0,jlen=this.output.queue.length;j<jlen;j+=1) {\n            CSL.Output.Queue.purgeEmptyBlobs(this.output.queue[j]);\n            //print(\"XXX: \"+JSON.stringify(this.output.queue[j],['strings','prefix','suffix','delimiter','blobs','decorations'],2))\n        }\n        for (j=0,jlen=this.output.queue.length;j<jlen;j+=1) {\n            this.output.adjust.upward(this.output.queue[j]);\n            this.output.adjust.leftward(this.output.queue[j]);\n            this.output.adjust.downward(this.output.queue[j],true);\n            this.output.adjust.fix(this.output.queue[j]);\n            //print(\"OUTPUT: \"+JSON.stringify(this.output.queue[j],['strings','prefix','suffix','delimiter','blobs','decorations'],2))\n        }\n\n        //print(\"DUMP \"+JSON.stringify(this.output.queue, [\"strings\", \"decorations\", \"prefix\", \"suffix\", \"delimiter\", \"blobs\"], 2));\n\n        // XXX Need to account for numeric blobs in input.\n        // XXX No idea how this could have worked previously.\n\n        //print(\"BLOBS \"+this.output.queue[0].blobs[0].blobs);\n\n        //print(\"JSON \"+JSON.stringify(this.output.queue[0].blobs, null, 2));\n\n        res = this.output.string(this, this.output.queue)[0];\n        \n        if (!res && this.opt.update_mode === CSL.NUMERIC) {\n            var err = (ret.length + 1) + \". [CSL STYLE ERROR: reference with no printed form.]\";\n            res = CSL.Output.Formats[this.opt.mode][\"@bibliography/entry\"](this, err);\n        }\n        if (res) {\n            ret.push(res);\n        }\n    }\n\n    var done = false;\n    if (bibsection && bibsection.page_start && bibsection.page_length) {\n        var last_expected_id = input.slice(-1)[0];\n        var last_seen_id = processed_item_ids.slice(-1)[0];\n        if (!last_expected_id || !last_seen_id || last_expected_id == last_seen_id) {\n            done = true;\n        }\n    }\n    this.tmp.disambig_override = false;\n\n    // XXX done\n    return [processed_item_ids, ret, done];\n};\n\n/*global CSL: true */\n\n\nCSL.Engine.prototype.setCitationId = function (citation, force) {\n    var ret, id, direction;\n    ret = false;\n    if (!citation.citationID || force) {\n        id = Math.floor(Math.random() * 100000000000000);\n        while (true) {\n            direction = 0;\n            if (!this.registry.citationreg.citationById[id]) {\n                // In case the ID is used as an HTML identifier in the\n                // calling application.\n                //   https://github.com/Juris-M/citeproc-js/issues/22\n                citation.citationID = \"a\" + id.toString(32);\n                break;\n            } else if (!direction && id < 50000000000000) {\n                direction = 1;\n            } else {\n                direction = -1;\n            }\n            if (direction === 1) {\n                id += 1;\n            } else {\n                id += -1;\n            }\n        }\n        ret = \"\" + id;\n    }\n    this.registry.citationreg.citationById[citation.citationID] = citation;\n    return ret;\n};\n\nCSL.Engine.prototype.rebuildProcessorState = function (citations, mode, uncitedItemIDs) {\n    // Rebuilds the processor from scratch, based on a list of citation\n    // objects. In a dynamic application, once the internal state of processor\n    // is established, citations should edited with individual invocations\n    // of processCitationCluster().\n\n    // citations is a list of citation objects in document order.\n    // mode is one of \"html\", \"text\" or \"rtf\".\n    // uncitedItemIDs is a list of itemIDs or a JS object with itemIDs as keys.\n    // Returns a list of [citationID,noteIndex,string] triples in document order.\n    // Set citation.properties.noteIndex to 0 for in-text citations.\n    // It is not necessary to run updateItems() before this function.\n    if (!citations) {\n        citations = [];\n    }\n    if (!mode) {\n        mode = 'html';\n    }\n    var doneIDs = {};\n    var itemIDs = [];\n    for (var i=0,ilen=citations.length;i<ilen;i+=1) {\n        for (var j=0,jlen=citations[i].citationItems.length;j<jlen;j+=1) {\n            var itemID = \"\" + citations[i].citationItems[j].id;\n            if (!doneIDs[itemID]) {\n                itemIDs.push(itemID);\n            }\n            doneIDs[itemID] = true;\n        }\n    }\n    this.updateItems(itemIDs);\n    var pre = [];\n    var post = [];\n    var ret = [];\n    var oldMode = this.opt.mode;\n    this.setOutputFormat(mode);\n    for (var i=0,ilen=citations.length;i<ilen;i+=1) {\n        // res contains a result report and a list of [index,string] pairs\n        // index begins at 0\n        var res = this.processCitationCluster(citations[i],pre,post,CSL.ASSUME_ALL_ITEMS_REGISTERED);\n        pre.push([citations[i].citationID,citations[i].properties.noteIndex]);\n        for (var j=0,jlen=res[1].length;j<jlen;j+=1) {\n            var index = res[1][j][0];\n            ret[index] = [\n                pre[index][0],\n                pre[index][1],\n                res[1][j][1]\n            ];\n        }\n    }\n    this.updateUncitedItems(uncitedItemIDs);\n    this.setOutputFormat(oldMode);\n    return ret;\n};\n\n\nCSL.Engine.prototype.restoreProcessorState = function (citations) {\n    var i, ilen, j, jlen, item, Item, newitem, citationList, itemList, sortedItems;\n    \n    // This function is deprecated.\n    // Use rebuildProcessorState() instead.\n\n    // Quickly restore state from citation details retained by\n    // calling application.\n    //\n    // if citations are provided, position details and sortkeys \n    // on the citation objects are are assumed to be correct.  Item\n    // data is retrieved, and sortedItems arrays are created and\n    // sorted as required by the current style.\n    //\n    // If citations is an empty list or nil, reset processor to\n    // empty state.\n    citationList = [];\n    itemList = [];\n    if (!citations) {\n        citations = [];\n    }\n    // Adjust citationIDs to avoid duplicates, save off index numbers\n    var indexNumbers = [];\n    var citationIds = {};\n    for (i = 0, ilen = citations.length; i < ilen; i += 1) {\n        if (citationIds[citations[i].citationID]) {\n            this.setCitationId(citations[i], true);\n        }\n        citationIds[citations[i].citationID] = true;\n        indexNumbers.push(citations[i].properties.index);\n    }\n    // Slice citations and sort by their declared index positions, if any,\n    // then reassign index and noteIndex numbers.\n    var oldCitations = citations.slice();\n    oldCitations.sort(\n        function (a,b) {\n            if (a.properties.index < b.properties.index) {\n                return -1;\n            } else if (a.properties.index > b.properties.index) {\n                return 1;\n            } else {\n                return 0;\n            }\n        }\n    );\n    for (i = 0, ilen = oldCitations.length; i < ilen; i += 1) {\n        oldCitations[i].properties.index = i;\n    }\n    for (i = 0, ilen = oldCitations.length; i < ilen; i += 1) {\n        sortedItems = [];\n        for (j = 0, jlen = oldCitations[i].citationItems.length; j < jlen; j += 1) {\n            item = oldCitations[i].citationItems[j];\n            if (\"undefined\" === typeof item.sortkeys) {\n                item.sortkeys = [];\n            }\n            Item = this.retrieveItem(\"\" + item.id);\n            newitem = [Item, item];\n            sortedItems.push(newitem);\n            oldCitations[i].citationItems[j].item = Item;\n            itemList.push(\"\" + item.id);\n        }\n        if (!oldCitations[i].properties.unsorted) {\n            sortedItems.sort(this.citation.srt.compareCompositeKeys);\n        }\n        oldCitations[i].sortedItems = sortedItems;\n        // Save citation data in registry\n        this.registry.citationreg.citationById[oldCitations[i].citationID] = oldCitations[i];\n    }\n    // Register Items\n    this.updateItems(itemList);\n\n    // Construct citationList from original copy\n    for (i = 0, ilen = citations.length; i < ilen; i += 1) {\n        citationList.push([\"\" + citations[i].citationID, citations[i].properties.noteIndex]);\n    }\n\n    var ret = [];\n    if (citations && citations.length) {\n        // Rendering one citation restores remainder of processor state.\n        // If citations is empty, rest to empty state.\n        ret = this.processCitationCluster(citations[0], [], citationList.slice(1));\n    } else {\n        this.registry = new CSL.Registry(this);\n        this.tmp = new CSL.Engine.Tmp();\n        this.disambiguate = new CSL.Disambiguation(this);\n    }\n    return ret;\n};\n\n\nCSL.Engine.prototype.updateItems = function (idList, nosort, rerun_ambigs, implicitUpdate) {\n    var debug = false;\n    var oldArea = this.tmp.area;\n    var oldRoot = this.tmp.root;\n    var oldExtension = this.tmp.extension;\n    if (this.bibliography_sort.tokens.length === 0) {\n        nosort = true;\n    }\n    this.tmp.area = \"citation\";\n    this.tmp.root = \"citation\";\n    this.tmp.extension = \"\";\n    if (!implicitUpdate) {\n        this.tmp.loadedItemIDs = {};\n    }\n    //CSL.debug = print\n    //SNIP-START\n    if (debug) {\n        CSL.debug(\"--> init <--\");\n    }\n    //SNIP-END\n    this.registry.init(idList);\n\n\tif (rerun_ambigs) {\n\t\tfor (var ambig in this.registry.ambigcites) {\n\t\t\tthis.registry.ambigsTouched[ambig] = true;\n\t\t}\n\t}\n\n    this.registry.dodeletes(this.registry.myhash);\n    \n    this.registry.doinserts(this.registry.mylist);\n    \n    this.registry.dorefreshes();\n\n    // *** affects reflist\n    this.registry.rebuildlist(nosort);\n    \n    this.registry.setsortkeys();\n\n    // taints always\n    this.registry.setdisambigs();\n\n    // *** affects reflist\n    this.registry.sorttokens(nosort);\n\n    // *** affects reflist\n    // taints if numbered style\n    this.registry.renumber();\n    \n    // taints always\n    //this.registry.yearsuffix();\n\n    this.tmp.extension = oldExtension;\n    this.tmp.area = oldArea;\n    this.tmp.root = oldRoot;\n\n    return this.registry.getSortedIds();\n};\n\nCSL.Engine.prototype.updateUncitedItems = function (idList, nosort) {\n    var idHash;\n    var oldArea = this.tmp.area;\n    var oldRoot = this.tmp.root;\n    var oldExtension = this.tmp.extension;\n    if (this.bibliography_sort.tokens.length === 0) {\n        nosort = true;\n    }\n    this.tmp.area = \"citation\";\n    this.tmp.root = \"citation\";\n    this.tmp.extension = \"\";\n    this.tmp.loadedItemIDs = {};\n    // This should be a utility function\n    if (!idList) {\n        idList = [];\n    }\n    if (\"object\" == typeof idList) {\n        if (\"undefined\" == typeof idList.length) {\n            idHash = idList;\n            idList = [];\n            for (var key in idHash) {\n                idList.push(key);\n            }\n        } else if (\"number\" == typeof idList.length) {\n            idHash = {};\n            for (var i=0,ilen=idList.length;i<ilen;i+=1) {\n                idHash[idList[i]] = true;\n            }\n        }\n    }\n\n    // prepare extended list of items\n    this.registry.init(idList, true);\n\n    // Use purge instead of delete.\n    // this.registry.dodeletes(this.registry.myhash);\n    this.registry.dopurge(idHash);\n\n    // everything else is the same as updateItems()\n    this.registry.doinserts(this.registry.mylist);\n\n    this.registry.dorefreshes();\n\n    this.registry.rebuildlist(nosort);\n\n    this.registry.setsortkeys();\n\n    this.registry.setdisambigs();\n\n    this.registry.sorttokens(nosort);\n\n    this.registry.renumber();\n\n    this.tmp.extension = oldExtension;\n    this.tmp.area = oldArea;\n    this.tmp.root = oldRoot;\n\n    return this.registry.getSortedIds();\n};\n\n/*global CSL: true */\n\nCSL.localeResolve = function (langstr, defaultLocale) {\n    var ret, langlst;\n    if (!defaultLocale) {\n        defaultLocale = \"en-US\";\n    }\n    if (!langstr) {\n        langstr = defaultLocale;\n    }\n    ret = {};\n    //if (\"undefined\" === typeof langstr) {\n    //    langstr = \"en_US\";\n    //}\n    langlst = langstr.split(/[\\-_]/);\n    ret.base = CSL.LANG_BASES[langlst[0]];\n    if (\"undefined\" === typeof ret.base) {\n        //CSL.debug(\"Warning: unknown locale \"+langstr+\", setting fallback to \"+defaultLocale);\n        return {base:defaultLocale, best:langstr, bare:langlst[0]};\n    }\n    if (langlst.length === 1) {\n        ret.generic = true;\n    }\n    if (langlst.length === 1 || langlst[1] === \"x\") {\n        ret.best = ret.base.replace(\"_\", \"-\");\n    } else {\n        ret.best = langlst.slice(0, 2).join(\"-\");\n    }\n    ret.base = ret.base.replace(\"_\", \"-\");\n    ret.bare = langlst[0];\n    return ret;\n};\n\n// Use call to invoke this.\nCSL.Engine.prototype.localeConfigure = function (langspec, beShy) {\n    var localexml;\n    if (beShy && this.locale[langspec.best]) {\n        return;\n    }\n    if (langspec.best === \"en-US\") {\n        localexml = CSL.setupXml(this.sys.retrieveLocale(\"en-US\"));\n        this.localeSet(localexml, \"en-US\", langspec.best);\n    } else if (langspec.best !== \"en-US\") {\n        if (langspec.base !== langspec.best) {\n            localexml = CSL.setupXml(this.sys.retrieveLocale(langspec.base));\n            this.localeSet(localexml, langspec.base, langspec.best);\n        }\n        localexml = CSL.setupXml(this.sys.retrieveLocale(langspec.best));\n        this.localeSet(localexml, langspec.best, langspec.best);        \n    }\n    this.localeSet(this.cslXml, \"\", langspec.best);\n    this.localeSet(this.cslXml, langspec.bare, langspec.best);\n    if (langspec.base !== langspec.best) {\n        this.localeSet(this.cslXml, langspec.base, langspec.best);\n    }\n    this.localeSet(this.cslXml, langspec.best, langspec.best);\n    if (\"undefined\" === typeof this.locale[langspec.best].terms[\"page-range-delimiter\"]) {\n        if ([\"fr\", \"pt\"].indexOf(langspec.best.slice(0, 2).toLowerCase()) > -1) {\n            this.locale[langspec.best].terms[\"page-range-delimiter\"] = \"-\";\n        } else {\n            this.locale[langspec.best].terms[\"page-range-delimiter\"] = \"\\u2013\";\n        }\n    }\n    if (\"undefined\" === typeof this.locale[langspec.best].terms[\"year-range-delimiter\"]) {\n        this.locale[langspec.best].terms[\"year-range-delimiter\"] = \"\\u2013\";\n    }\n    if (\"undefined\" === typeof this.locale[langspec.best].terms[\"citation-range-delimiter\"]) {\n        this.locale[langspec.best].terms[\"citation-range-delimiter\"] = \"\\u2013\";\n    }\n    if (this.opt.development_extensions.normalize_lang_keys_to_lowercase) {\n        var localeLists = [\"default-locale\",\"locale-sort\",\"locale-translit\",\"locale-translat\"];\n        for (var i=0,ilen=localeLists.length;i<ilen;i+=1) {\n            for (var j=0,jlen=this.opt[localeLists[i]].length;j<jlen;j+=1) {\n                this.opt[localeLists[i]][j] = this.opt[localeLists[i]][j].toLowerCase();\n            }\n        }\n        this.opt.lang = this.opt.lang.toLowerCase();\n    }\n};\n    \n//\n// XXXXX: Got it.  The locales objects need to be reorganized,\n// with a top-level local specifier, and terms, opts, dates\n// below.\n//\nCSL.Engine.prototype.localeSet = function (myxml, lang_in, lang_out) {\n    var blob, locale, nodes, attributes, pos, term, form, termname, styleopts, date, attrname, len, genderform, target, i, ilen;\n    lang_in = lang_in.replace(\"_\", \"-\");\n    lang_out = lang_out.replace(\"_\", \"-\");\n\n    if (this.opt.development_extensions.normalize_lang_keys_to_lowercase) {\n        lang_in = lang_in.toLowerCase();\n        lang_out = lang_out.toLowerCase();\n    }\n\n    if (!this.locale[lang_out]) {\n        this.locale[lang_out] = {};\n        this.locale[lang_out].terms = {};\n        this.locale[lang_out].opts = {};\n        // Set default skip words. Can be overridden in locale by attribute on style-options node.\n        this.locale[lang_out].opts[\"skip-words\"] = CSL.SKIP_WORDS;\n        // Initialise leading noise word to false. Actual assignment is below. Empty by default, can be overridden in locale by attribute on style-options node.\n        if (!this.locale[lang_out].opts[\"leading-noise-words\"]) {\n            this.locale[lang_out].opts[\"leading-noise-words\"] = [];\n        }\n        this.locale[lang_out].dates = {};\n        // For ordinals\n        this.locale[lang_out].ord = {'1.0.1':false,keys:{}};\n        this.locale[lang_out][\"noun-genders\"] = {};\n    }\n\n    //\n    // Xml: Test if node is \"locale\" (nb: ns declarations need to be invoked\n    // on every access to the xml object; bundle this with the functions\n    //\n    locale = myxml.makeXml();\n    if (myxml.nodeNameIs(myxml.dataObj, 'locale')) {\n        locale = myxml.dataObj;\n    } else {\n        //\n        // Xml: get a list of all \"locale\" nodes\n        //\n        nodes = myxml.getNodesByName(myxml.dataObj, \"locale\");\n        var foundLocale = false;\n        for (pos = 0, len = myxml.numberofnodes(nodes); pos < len; pos += 1) {\n            blob = nodes[pos];\n            //\n            // Xml: get locale xml:lang\n            //\n            // Iterate over all locales, but for non-matching nodes,\n            // we set jurisdiction_preference only (processing of the\n            // chosen one will process the attribute there,\n            // separately.\n            if (!foundLocale && myxml.getAttributeValue(blob, 'lang', 'xml') === lang_in) {\n                locale = blob;\n                foundLocale = true;\n            } else {\n                var lang = myxml.getAttributeValue(blob, 'lang', 'xml');\n                var style_options = myxml.getNodesByName(blob, 'style-options');\n                if (lang && style_options && style_options.length) {\n                    var jurispref = myxml.getAttributeValue(style_options[0], 'jurisdiction-preference');\n                    if (jurispref) {\n                        if (!this.locale[lang]) {\n                            this.locale[lang] = {\n                                opts: {}\n                            };\n                        }\n                        this.locale[lang].opts[\"jurisdiction-preference\"] = jurispref.split(/\\s+/);\n                    }\n                }\n            }\n        }\n    }\n    //\n    // Xml: get a list of any cs:type nodes within locale\n    //\n    nodes = myxml.getNodesByName(locale, 'type');\n    for (i = 0, ilen = myxml.numberofnodes(nodes); i < ilen; i += 1) {\n        var typenode = nodes[i];\n        var type = myxml.getAttributeValue(typenode, 'name');\n        var gender = myxml.getAttributeValue(typenode, 'gender');\n        this.opt.gender[type] = gender;\n    }\n    //\n    // Xml: get a list of term nodes within locale\n    //\n\n    // If we are setting CSL 1.0.1 ordinals inside a style, wipe the\n    // slate clean and start over.\n    var hasCslOrdinals101 = myxml.getNodesByName(locale, 'term', 'ordinal').length;\n    if (hasCslOrdinals101) {\n        for (var key in this.locale[lang_out].ord.keys) {\n            delete this.locale[lang_out].terms[key];\n        }\n        this.locale[lang_out].ord = {\"1.0.1\":false,keys:{}};\n    }\n\n    nodes = myxml.getNodesByName(locale, 'term');\n    // Collect ordinals info as for 1.0.1, but save only if 1.0.1 toggle triggers\n    var ordinals101 = {\"last-digit\":{},\"last-two-digits\":{},\"whole-number\":{}};\n    var ordinals101_toggle = false;\n    var genderized_terms = {};\n    for (pos = 0, len = myxml.numberofnodes(nodes); pos < len; pos += 1) {\n        term = nodes[pos];\n        //\n        // Xml: get string value of attribute\n        //\n        termname = myxml.getAttributeValue(term, 'name');\n        if (termname === \"sub verbo\") {\n            termname = \"sub-verbo\";\n        }\n        if (termname.slice(0,7) === \"ordinal\") {\n            if (termname === \"ordinal\") {\n                ordinals101_toggle = true;\n            } else {\n                var match = myxml.getAttributeValue(term, 'match');\n                var termstub = termname.slice(8);\n                var genderform = myxml.getAttributeValue(term, 'gender-form');\n                if (!genderform) {\n                    genderform = \"neuter\";\n                }\n                if (!match) {\n                    match = \"last-two-digits\";\n                    if (termstub.slice(0,1) === \"0\") {\n                        match = \"last-digit\";\n                    }\n                }\n                if (termstub.slice(0,1) === \"0\") {\n                    termstub = termstub.slice(1);\n                }\n                if (!ordinals101[match][termstub]) {\n                    ordinals101[match][termstub] = {};\n                }\n                ordinals101[match][termstub][genderform] = termname;\n            }\n            this.locale[lang_out].ord.keys[termname] = true;\n        }\n        if (\"undefined\" === typeof this.locale[lang_out].terms[termname]) {\n            this.locale[lang_out].terms[termname] = {};\n        }\n        form = \"long\";\n        genderform = false;\n        //\n        // Xml: get string value of form attribute, if any\n        //\n        if (myxml.getAttributeValue(term, 'form')) {\n            form = myxml.getAttributeValue(term, 'form');\n        }\n        //\n        // Xml: get string value of gender attribute, if any\n        // \n        if (myxml.getAttributeValue(term, 'gender-form')) {\n            genderform = myxml.getAttributeValue(term, 'gender-form');\n        }\n        //\n        // Xml: set global gender assignment for variable associated\n        // with term name\n        // \n        if (myxml.getAttributeValue(term, 'gender')) {\n            this.locale[lang_out][\"noun-genders\"][termname] = myxml.getAttributeValue(term, 'gender');\n        }\n        // Work on main segment or gender-specific sub-segment as appropriate\n        if (genderform) {\n            this.locale[lang_out].terms[termname][genderform] = {};\n            this.locale[lang_out].terms[termname][genderform][form] = [];\n            target = this.locale[lang_out].terms[termname][genderform];\n            genderized_terms[termname] = true;\n        } else {\n            this.locale[lang_out].terms[termname][form] = [];\n            target = this.locale[lang_out].terms[termname];\n        }\n        //\n        // Xml: test of existence of node\n        //\n        if (myxml.numberofnodes(myxml.getNodesByName(term, 'multiple'))) {\n            //\n            // Xml: get string value of attribute, plus\n            // Xml: get string value of node content\n            //\n            target[form][0] = myxml.getNodeValue(term, 'single');\n            if (target[form][0].indexOf(\"%s\") > -1) {\n                this.opt.hasPlaceholderTerm = true;\n            }\n            //\n            // Xml: get string value of attribute, plus\n            // Xml: get string value of node content\n            //\n            target[form][1] = myxml.getNodeValue(term, 'multiple');\n            if (target[form][1].indexOf(\"%s\") > -1) {\n                this.opt.hasPlaceholderTerm = true;\n            }\n        } else {\n            //\n            // Xml: get string value of attribute, plus\n            // Xml: get string value of node content\n            //\n            target[form] = myxml.getNodeValue(term);\n            if (target[form].indexOf(\"%s\") > -1) {\n                this.opt.hasPlaceholderTerm = true;\n            }\n        }\n    }\n    if (!this.locale[lang_out].terms.supplement) {\n        this.locale[lang_out].terms.supplement = {};\n    }\n    if (!this.locale[lang_out].terms.supplement[\"long\"]) {\n        this.locale[lang_out].terms.supplement[\"long\"] = [\"supplement\", \"supplements\"];\n    }\n    // If locale had a CSL 1.0.1-style ordinal definition, install the logic object\n    // and iterate over gendered terms, filling in default values for use by getTerm.\n    if (ordinals101_toggle) {\n        for (var ikey in genderized_terms) {\n            var gender_segments = {};\n            var form_segments = 0;\n            for (var jkey in this.locale[lang_out].terms[ikey]) {\n                if ([\"masculine\",\"feminine\"].indexOf(jkey) > -1) {\n                    gender_segments[jkey] = this.locale[lang_out].terms[ikey][jkey];\n                } else {\n                    form_segments += 1;\n                }\n            }\n            if (!form_segments) {\n                if (gender_segments.feminine) {\n                    // Link each feminine form segment to default\n                    // (no need to filter, these will not have gender segments mixed in)\n                    for (var jkey in gender_segments.feminine) {\n                        this.locale[lang_out].terms[ikey][jkey] = gender_segments.feminine[jkey];\n                    }\n                } else if (gender_segments.masculine) {\n                    // Otherwise link each masculine form segment to default \n                    for (var jkey in gender_segments.masculine) {\n                        this.locale[lang_out].terms[ikey][jkey] = gender_segments.masculine[jkey];\n                    }\n                }\n            }\n        }\n        this.locale[lang_out].ord['1.0.1'] = ordinals101;\n    }\n\n    // Iterate over main segments, and fill in any holes in gender-specific data\n    // sub-segments\n    for (termname in this.locale[lang_out].terms) {\n        for (i = 0, ilen = 2; i < ilen; i += 1) {\n            genderform = CSL.GENDERS[i];\n            if (this.locale[lang_out].terms[termname][genderform]) {\n                for (form in this.locale[lang_out].terms[termname]) {\n                    if (!this.locale[lang_out].terms[termname][genderform][form]) {\n                        this.locale[lang_out].terms[termname][genderform][form] = this.locale[lang_out].terms[termname][form];\n                    }\n                }\n            }\n        }\n    }\n    //\n    // Xml: get list of nodes by node type\n    //\n    nodes = myxml.getNodesByName(locale, 'style-options');\n    for (pos = 0, len = myxml.numberofnodes(nodes); pos < len; pos += 1) {\n        if (true) {\n            styleopts = nodes[pos];\n            //\n            // Xml: get list of attributes on a node\n            //\n            attributes = myxml.attributes(styleopts);\n            for (attrname in attributes) {\n                if (attributes.hasOwnProperty(attrname)) {\n                    if (attrname === \"@punctuation-in-quote\" || attrname === \"@limit-day-ordinals-to-day-1\") {\n                        if (attributes[attrname] === \"true\") {\n                            // trim off leading @\n                            this.locale[lang_out].opts[attrname.slice(1)] = true;\n                        } else {\n                            // trim off leading @\n                            this.locale[lang_out].opts[attrname.slice(1)] = false;\n                        }\n                    } else if (attrname === \"@jurisdiction-preference\") {\n                        var jurisdiction_preference = attributes[attrname].split(/\\s+/);\n                        this.locale[lang_out].opts[attrname.slice(1)] = jurisdiction_preference;\n                    } else if (attrname === \"@skip-words\") {\n                        var skip_words = attributes[attrname].split(/\\s*,\\s*/);\n                        this.locale[lang_out].opts[attrname.slice(1)] = skip_words;\n                    } else if (attrname === \"@leading-noise-words\") {\n                        var val = attributes[attrname].split(/\\s*,\\s*/);\n                        this.locale[lang_out].opts[\"leading-noise-words\"] = val;\n                    } else if (attrname === \"@name-as-sort-order\") {\n                        // Fallback is okay here.\n                        this.locale[lang_out].opts[\"name-as-sort-order\"] = {};\n                        var lst = attributes[attrname].split(/\\s+/);\n                        for (var i=0,ilen=lst.length;i<ilen;i+=1) {\n                            this.locale[lang_out].opts[\"name-as-sort-order\"][lst[i]] = true;\n                        }\n                    } else if (attrname === \"@name-as-reverse-order\") {\n                        // Fallback is okay here.\n                        this.locale[lang_out].opts[\"name-as-reverse-order\"] = {};\n                        var lst = attributes[attrname].split(/\\s+/);\n                        for (var i=0,ilen=lst.length;i<ilen;i+=1) {\n                            this.locale[lang_out].opts[\"name-as-reverse-order\"][lst[i]] = true;\n                        }\n                    } else if (attrname === \"@name-never-short\") {\n                        // Here too.\n                        this.locale[lang_out].opts[\"name-never-short\"] = {};\n                        var lst = attributes[attrname].split(/\\s+/);\n                        for (var i=0,ilen=lst.length;i<ilen;i+=1) {\n                            this.locale[lang_out].opts[\"name-never-short\"][lst[i]] = true;\n                        }\n                    }\n                }\n            }\n        }\n    }\n    //\n    // Xml: get list of nodes by type\n    //\n    nodes = myxml.getNodesByName(locale, 'date');\n    for (pos = 0, len = myxml.numberofnodes(nodes); pos < len; pos += 1) {\n        if (true) {\n            var date = nodes[pos];\n            //\n            // Xml: get string value of attribute\n            //\n            this.locale[lang_out].dates[myxml.getAttributeValue(date, \"form\")] = date;\n        }\n    }\n    //\n    // Xml: get list of nodes by node type\n    //\n    CSL.SET_COURT_CLASSES(this, lang_out, myxml, locale);\n};\n\n\nCSL.getLocaleNames = function (myxml, preferredLocale) {\n    var stylexml = CSL.setupXml(myxml);\n\n    function extendLocaleList(localeList, locale) {\n        var forms = [\"base\", \"best\"];\n        if (locale) {\n            var normalizedLocale = CSL.localeResolve(locale);\n            for (var i=0,ilen=forms.length;i<ilen;i++) {\n                if (normalizedLocale[forms[i]] && localeList.indexOf(normalizedLocale[forms[i]]) === -1) {\n                    localeList.push(normalizedLocale[forms[i]]);\n                }\n            }\n        }\n    }\n    \n    var localeIDs = [\"en-US\"];\n    \n    function sniffLocaleOnOneNodeName(nodeName) {\n        var nodes = stylexml.getNodesByName(stylexml.dataObj, nodeName);\n        for (var i=0,ilen=nodes.length;i<ilen;i++) {\n            var nodeLocales = stylexml.getAttributeValue(nodes[i], \"locale\");\n            if (nodeLocales) {\n                nodeLocales = nodeLocales.split(/ +/);\n                for (var j=0,jlen=nodeLocales.length;j<jlen;j++) {\n                    this.extendLocaleList(localeIDs, nodeLocales[j]);\n                }\n            }\n        }\n    }\n\n    extendLocaleList(localeIDs, preferredLocale);\n\n    var styleNode = stylexml.getNodesByName(stylexml.dataObj, \"style\")[0];\n    var defaultLocale = stylexml.getAttributeValue(styleNode, \"default-locale\");\n    extendLocaleList(localeIDs, defaultLocale);\n\n    var nodeNames = [\"layout\", \"if\", \"else-if\", \"condition\"];\n    for (var i=0,ilen=nodeNames.length;i<ilen;i++) {\n        sniffLocaleOnOneNodeName(stylexml, localeIDs, nodeNames[i]);\n    }\n    return localeIDs;\n};\n\n/*global CSL: true */\n\nCSL.Node = {};\n\nCSL.Node.bibliography = {\n    build: function (state, target) {\n        if (this.tokentype === CSL.START) {\n\n            state.build.area = \"bibliography\";\n            state.build.root = \"bibliography\";\n            state.build.extension = \"\";\n\n            var func = function(state) {\n                state.tmp.area = \"bibliography\";\n                state.tmp.root = \"bibliography\";\n                state.tmp.extension = \"\";\n            };\n            this.execs.push(func);\n\n        }\n        target.push(this);\n    }\n};\n\n\n/*global CSL: true */\n\nCSL.Node.choose = {\n    build: function (state, target) {\n        var func;\n        if (this.tokentype === CSL.START) {\n            //open condition\n            func = function (state) {\n                state.tmp.jump.push(undefined, CSL.LITERAL);\n            };\n        }\n        if (this.tokentype === CSL.END) {\n            //close condition\n            func = function (state) {\n                state.tmp.jump.pop();\n            };\n        }\n        this.execs.push(func);\n        target.push(this);\n    },\n\n    configure: function (state, pos) {\n        if (this.tokentype === CSL.END) {\n            state.configure.fail.push((pos));\n            state.configure.succeed.push((pos));\n        } else {\n            state.configure.fail.pop();\n            state.configure.succeed.pop();\n        }\n    }\n};\n\n/*global CSL: true */\n\nCSL.Node.citation = {\n    build: function (state, target) {\n        if (this.tokentype === CSL.START) {\n\n            state.build.area = \"citation\";\n            state.build.root = \"citation\";\n            state.build.extension = \"\";\n\n\n            var func = function(state) {\n                state.tmp.area = \"citation\";\n                state.tmp.root = \"citation\";\n                state.tmp.extension = \"\";\n            };\n            this.execs.push(func);\n\n/*\n            state.build.root = \"citation\";\n\n            OK state.fixOpt(this, \"names-delimiter\", \"delimiter\");\n            OK state.fixOpt(this, \"name-delimiter\", \"delimiter\");\n            OK state.fixOpt(this, \"name-form\", \"form\");\n            OK state.fixOpt(this, \"and\", \"and\");\n            OK state.fixOpt(this, \"delimiter-precedes-last\", \"delimiter-precedes-last\");\n            OK state.fixOpt(this, \"delimiter-precedes-et-al\", \"delimiter-precedes-et-al\");\n            OK state.fixOpt(this, \"initialize-with\", \"initialize-with\");\n            OK state.fixOpt(this, \"initialize\", \"initialize\");\n            OK state.fixOpt(this, \"name-as-sort-order\", \"name-as-sort-order\");\n            OK state.fixOpt(this, \"sort-separator\", \"sort-separator\");\n\n            OK state.fixOpt(this, \"et-al-min\", \"et-al-min\");\n            OK state.fixOpt(this, \"et-al-use-first\", \"et-al-use-first\");\n            OK state.fixOpt(this, \"et-al-use-last\", \"et-al-use-last\");\n            state.fixOpt(this, \"et-al-subsequent-min\", \"et-al-subsequent-min\");\n            state.fixOpt(this, \"et-al-subsequent-use-first\", \"et-al-subsequent-use-first\");\n*/\n        }\n        if (this.tokentype === CSL.END) {\n\n            // Open an extra key at first position for use in\n            // grouped sorts.\n            // print(\"in cs:citation END\");\n            state.opt.grouped_sort = state.opt.xclass === \"in-text\" \n                && (state.citation.opt.collapse \n                    && state.citation.opt.collapse.length)\n                || (state.citation.opt.cite_group_delimiter\n                    && state.citation.opt.cite_group_delimiter.length)\n                && state.opt.update_mode !== CSL.POSITION\n                && state.opt.update_mode !== CSL.NUMERIC;\n            \n            if (state.opt.grouped_sort \n                && state.citation_sort.opt.sort_directions.length) {\n                \n                var firstkey = state.citation_sort.opt.sort_directions[0].slice();\n                //print(\"extending sort keys \"+state.citation_sort.opt.sort_directions+\" with \"+firstkey);\n                state.citation_sort.opt.sort_directions = [firstkey].concat(state.citation_sort.opt.sort_directions);\n                // print(\"new key directions in effect: \"+state.citation_sort.opt.sort_directions);\n            }\n            // print(\"creating new comparifier\");\n            state.citation.srt = new CSL.Registry.Comparifier(state, \"citation_sort\");\n        }\n        target.push(this);\n    }\n};\n\n\n/*global CSL: true */\n\nCSL.Node[\"#comment\"] = {\n       // This is a comment in the CSL file.\n       build: function () {\n        // Save some space in the log files -- no need to mention this, really.\n        // CSL.debug(\"CSL processor warning: comment node reached\");\n       }\n};\n\n/*global CSL: true */\n\nCSL.Node.date = {\n    build: function (state, target) {\n        var func, date_obj, len, pos, part, dpx, parts, mypos, start, end;\n        if (this.tokentype === CSL.START || this.tokentype === CSL.SINGLETON) {\n            // used to collect rendered date part names in node_datepart,\n            // for passing through to node_key, for use in dates embedded\n            // in macros\n            state.dateput.string(state, state.dateput.queue);\n            state.tmp.date_token = CSL.Util.cloneToken(this);\n            state.tmp.date_token.strings.prefix = \"\";\n            state.tmp.date_token.strings.suffix = \"\";\n            state.dateput.openLevel(this);\n            state.build.date_parts = [];\n            state.build.date_variables = this.variables;\n            if (!state.build.extension) {\n                CSL.Util.substituteStart.call(this, state, target);\n            }\n            if (state.build.extension) {\n                func = CSL.dateMacroAsSortKey;\n            } else {\n                func = function (state, Item, item) {\n                    var dp;\n                    state.tmp.element_rendered_ok = false;\n                    state.tmp.donesies = [];\n                    state.tmp.dateparts = [];\n                    dp = [];\n                    //if (this.variables.length && Item[this.variables[0]]){\n                    if (this.variables.length\n                        && !(state.tmp.just_looking\n                             && this.variables[0] === \"accessed\")) {\n                        \n                        date_obj = Item[this.variables[0]];\n                        if (\"undefined\" === typeof date_obj) {\n                            date_obj = {\"date-parts\": [[0]] };\n                            if (state.opt.development_extensions.locator_date_and_revision) {\n                                if (item && this.variables[0] === \"locator-date\" && item[\"locator-date\"]) {\n                                    date_obj = item[\"locator-date\"];\n                                }\n                            }\n                        }\n                        state.tmp.date_object = date_obj;\n                        //\n                        // Call a function here to analyze the\n                        // data and set the name of the date-part that\n                        // should collapse for this range, if any.\n                        //\n                        // (1) build a filtered list, in y-m-d order,\n                        // consisting only of items that are (a) in the\n                        // date-parts and (b) in the *_end data.\n                        // (note to self: remember that season is a\n                        // fallback var when month and day are empty)\n                        \n                        //if (\"undefined\" === typeof this.dateparts) {\n                        //    this.dateparts = [\"year\", \"month\", \"day\"];\n                        //}\n                        len = this.dateparts.length;\n                        for (pos = 0; pos < len; pos += 1) {\n                            part = this.dateparts[pos];\n                            if (\"undefined\" !== typeof state.tmp.date_object[(part +  \"_end\")]) {\n                                dp.push(part);\n                            } else if (part === \"month\" && \"undefined\" !== typeof state.tmp.date_object.season_end) {\n                                dp.push(part);\n                            }\n                        }\n                        dpx = [];\n                        parts = [\"year\", \"month\", \"day\"];\n                        len = parts.length;\n                        for (pos = 0; pos < len; pos += 1) {\n                            if (dp.indexOf(parts[pos]) > -1) {\n                                dpx.push(parts[pos]);\n                            }\n                        }\n                        dp = dpx.slice();\n                        //\n                        // (2) Reverse the list and step through in\n                        // reverse order, popping each item if the\n                        // primary and *_end data match.\n                        mypos = 2;\n                        len = dp.length;\n                        for (pos = 0; pos < len; pos += 1) {\n                            part = dp[pos];\n                            start = state.tmp.date_object[part];\n                            end = state.tmp.date_object[(part + \"_end\")];\n                            if (start !== end) {\n                                mypos = pos;\n                                break;\n                            }\n                        }\n                        \n                        //\n                        // (3) When finished, the first item in the\n                        // list, if any, is the date-part where\n                        // the collapse should occur.\n\n                        // XXXXX: was that it?\n                        state.tmp.date_collapse_at = dp.slice(mypos);\n                        //\n                        // The collapse itself will be done by appending\n                        // string output for the date, less suffix,\n                        // placing a delimiter on output, then then\n                        // doing the *_end of the range, dropping only\n                        // the prefix.  That should give us concise expressions\n                        // of ranges.\n                        //\n                        // Numeric dates should not collapse, though,\n                        // and should probably use a slash delimiter.\n                        // Scope for configurability will remain (all over\n                        // the place), but this will do to get this feature\n                        // started.\n                        //\n                    } else {\n                        state.tmp.date_object = false;\n                    }\n                };\n            }\n            this.execs.push(func);\n\n            // newoutput\n            func = function (state, Item) {\n                if (!Item[this.variables[0]]) {\n                    return;\n                }\n                state.output.startTag(\"date\", this);\n                if (this.variables[0] === \"issued\"\n                    && (Item.type === \"legal_case\" || Item.type === \"legislation\")\n                    && state.opt.disable_duplicate_year_suppression.indexOf(Item.country) === -1\n                    && !state.tmp.extension\n                    && \"\" + Item[\"collection-number\"] === \"\" + state.tmp.date_object.year\n                    && this.dateparts.length === 1\n                    && this.dateparts[0] === \"year\") {\n\n                    // Set up to (maybe) suppress the year if we're not sorting, and\n                    // it's the same as the collection-number, and we would render\n                    // only the year, with not month or day, and this is a legal_case item.\n                    // We save a pointer to the blob parent and its position here. The\n                    // blob will be popped from output if at the end of processing for\n                    // this cite we find that we have rendered the collection-number\n                    // variable also.\n                    for (var key in state.tmp.date_object) {\n                        if (state.tmp.date_object.hasOwnProperty(key)) {\n                            if (key.slice(0, 4) === \"year\") {\n                                state.tmp.issued_date = {};\n                                var lst = state.output.current.mystack.slice(-2)[0].blobs;\n                                state.tmp.issued_date.list = lst;\n                                state.tmp.issued_date.pos = lst.length - 1;\n                            }\n                        }\n                    }\n                }\n            };\n            this.execs.push(func);\n        }\n\n        if (!state.build.extension && (this.tokentype === CSL.END || this.tokentype === CSL.SINGLETON)) {\n            // mergeoutput\n            func = function (state, Item) {\n                if (!Item[this.variables[0]]) {\n                    return;\n                }\n                state.output.endTag();\n            };\n            this.execs.push(func);\n        }\n        target.push(this);\n\n        if (this.tokentype === CSL.END || this.tokentype === CSL.SINGLETON) {\n            if (!state.build.extension) {\n                CSL.Util.substituteEnd.call(this, state, target);\n            }\n        }\n    }\n};\n\n/*global CSL: true */\n\nCSL.Node[\"date-part\"] = {\n    build: function (state, target) {\n        var func, pos, len, first_date, value, value_end, real, have_collapsed, invoked, precondition, known_year, bc, ad, bc_end, ad_end, ready, curr, dcurr, number, num, formatter, item, blob;\n        if (!this.strings.form) {\n            this.strings.form = \"long\";\n        }\n        // used in node_date, to send a list of rendering date parts\n        // to node_key, for dates embedded in macros.\n        state.build.date_parts.push(this.strings.name);\n        //\n        // Set delimiter here, if poss.\n        //\n\n        var date_variable = state.build.date_variables[0];\n\n        function formatAndStrip(myform, gender, val) {\n            if (!val) {\n                return val;\n            }\n            val = \"\" + CSL.Util.Dates[this.strings.name][myform](state, val, gender, this.default_locale);\n            if (\"month\" === this.strings.name) {\n                if (state.tmp.strip_periods) {\n                    val = val.replace(/\\./g, \"\");\n                } else {\n                    for (var i = 0, ilen = this.decorations.length; i < ilen; i += 1) {\n                        if (\"@strip-periods\" === this.decorations[i][0] && \"true\" === this.decorations[i][1]) {\n                            val = val.replace(/\\./g, \"\");\n                            break;\n                        }\n                    }\n                }\n            }\n            return val;\n        }\n\n        func = function (state, Item) {\n\n            if (!state.tmp.date_object) {\n                return;\n            } else {\n                state.tmp.probably_rendered_something = true;\n            }\n\n            var last_string_output = \"\";\n\n            first_date = true;\n            value = \"\";\n            value_end = \"\";\n            state.tmp.donesies.push(this.strings.name);\n\n            // Render literal only when year is included in date output\n            if (state.tmp.date_object.literal && \"year\" === this.strings.name) {\n                last_string_output = state.tmp.date_object.literal;\n                state.output.append(state.tmp.date_object.literal, this);\n            }\n\n            if (state.tmp.date_object) {\n                value = state.tmp.date_object[this.strings.name];\n                value_end = state.tmp.date_object[(this.strings.name + \"_end\")];\n            }\n            if (\"year\" === this.strings.name && value === 0 && !state.tmp.suppress_decorations) {\n                value = false;\n            }\n            real = !state.tmp.suppress_decorations;\n            have_collapsed = state.tmp.have_collapsed;\n            invoked = state[state.tmp.area].opt.collapse === \"year-suffix\" || state[state.tmp.area].opt.collapse === \"year-suffix-ranged\";\n            precondition = state.opt[\"disambiguate-add-year-suffix\"];\n            if (real && precondition && invoked) {\n                state.tmp.years_used.push(value);\n                known_year = state.tmp.last_years_used.length >= state.tmp.years_used.length;\n                if (known_year && have_collapsed) {\n                    if (state.tmp.last_years_used[(state.tmp.years_used.length - 1)] === value) {\n                        value = false;\n                    }\n                }\n            }\n            if (\"undefined\" !== typeof value) {\n                bc = false;\n                ad = false;\n                bc_end = false;\n                ad_end = false;\n                if (\"year\" === this.strings.name) {\n                    if (parseInt(value, 10) < 500 && parseInt(value, 10) > 0) {\n                        ad = state.getTerm(\"ad\");\n                    }\n                    if (parseInt(value, 10) < 0) {\n                        bc = state.getTerm(\"bc\");\n                        value = (parseInt(value, 10) * -1);\n                    }\n                    if (value_end) {\n                        if (parseInt(value_end, 10) < 500 && parseInt(value_end, 10) > 0) {\n                            ad_end = state.getTerm(\"ad\");\n                        }\n                        if (parseInt(value_end, 10) < 0) {\n                            bc_end = state.getTerm(\"bc\");\n                            value_end = (parseInt(value_end, 10) * -1);\n                        }\n                    }\n                }\n\n                // For gendered locales\n                var monthnameid = \"\"+state.tmp.date_object.month;\n                while (monthnameid.length < 2) {\n                    monthnameid = \"0\"+monthnameid;\n                }\n                monthnameid = \"month-\"+monthnameid;\n                var gender = state.locale[state.opt.lang][\"noun-genders\"][monthnameid];\n                if (this.strings.form) {\n                    var myform = this.strings.form;\n                    var myform_end = this.strings.form;\n                    if (this.strings.name === \"day\") {\n                        if (myform === \"ordinal\" && state.locale[state.opt.lang].opts[\"limit-day-ordinals-to-day-1\"]) {\n                            if (value != 1) {\n                                myform = \"numeric\";\n                            }\n                            if (value_end != 1) {\n                                myform_end = \"numeric\";\n                            }\n                        }\n                    }\n                    value = formatAndStrip.call(this, myform, gender, value);\n                    value_end = formatAndStrip.call(this, myform_end, gender, value_end);\n                }\n                state.output.openLevel(\"empty\");\n                if (state.tmp.date_collapse_at.length) {\n                    //state.output.startTag(this.strings.name,this);\n                    ready = true;\n                    len = state.tmp.date_collapse_at.length;\n                    for (pos = 0; pos < len; pos += 1) {\n                        item = state.tmp.date_collapse_at[pos];\n                        if (state.tmp.donesies.indexOf(item) === -1) {\n                            ready = false;\n                            break;\n                        }\n                    }\n                    if (ready) {\n                        if (\"\" + value_end !== \"0\") {\n                            if (state.dateput.queue.length === 0) {\n                                first_date = true;\n                            }\n\n                            // OK! So if the actual data has no month, day or season,\n                            // and we reach this block, then we can combine the dates\n                            // to a string, run minimial-two, and output the trailing\n                            // year right here. No impact on other functionality.\n\n                            if (state.opt[\"year-range-format\"]\n                                && state.opt[\"year-range-format\"] !== \"expanded\"\n                                && !state.tmp.date_object.day\n                                && !state.tmp.date_object.month\n                                && !state.tmp.date_object.season\n                                && this.strings.name === \"year\"\n                                && value && value_end) {\n\n                                // second argument adjusts collapse as required for years\n                                // See OSCOLA section 1.3.2\n                                value_end = state.fun.year_mangler(value + \"-\" + value_end, true);\n                                var range_delimiter = state.getTerm(\"year-range-delimiter\");\n                                value_end = value_end.slice(value_end.indexOf(range_delimiter) + 1);\n                            }\n                            last_string_output = value_end;\n                            state.dateput.append(value_end, this);\n                            if (first_date) {\n                                blob = state.dateput.current.value().blobs[0];\n                                if (blob) {\n                                    blob.strings.prefix = \"\";\n                                }\n\n                            }\n                        }\n                        last_string_output = value;\n                        state.output.append(value, this);\n                        curr = state.output.current.value();\n                        blob = curr.blobs[(curr.blobs.length - 1)];\n                        if (blob) {\n                            blob.strings.suffix = \"\";\n                        }\n\n                        if (this.strings[\"range-delimiter\"]) {\n                            state.output.append(this.strings[\"range-delimiter\"]);\n                        } else {\n                            state.output.append(state.getTerm(\"year-range-delimiter\"), \"empty\");\n                        }\n                        state.dateput.closeLevel();\n                        dcurr = state.dateput.current.value();\n                        curr.blobs = curr.blobs.concat(dcurr);\n                        // This may leave the stack pointer on a lower level.\n                        // It's not a problem because the stack will be clobbered\n                        // when the queue is initialized by the next cs:date node.\n                        state.dateput.string(state, state.dateput.queue);\n                        state.dateput.openLevel(state.tmp.date_token);\n                        state.tmp.date_collapse_at = [];\n                    } else {\n                        last_string_output = value;\n                        state.output.append(value, this);\n                        // print(\"collapse_at: \"+state.tmp.date_collapse_at);\n                        if (state.tmp.date_collapse_at.indexOf(this.strings.name) > -1) {\n                            //\n                            // Use ghost dateput queue\n                            //\n                            if (\"\" + value_end !== \"0\") {\n                                //\n                                // XXXXX: It's a workaround.  It's ugly.\n                                // There's another one above.\n                                //\n                                if (state.dateput.queue.length === 0) {\n                                    first_date = true;\n                                }\n                                state.dateput.openLevel(\"empty\");\n                                last_string_output = value_end;\n                                state.dateput.append(value_end, this);\n                                if (first_date) {\n                                    blob = state.dateput.current.value().blobs[0];\n                                    if (blob) {\n                                        blob.strings.prefix = \"\";\n                                    }\n                                }\n                                if (bc) {\n                                    last_string_output = bc;\n                                    state.dateput.append(bc);\n                                }\n                                if (ad) {\n                                    last_string_output = ad;\n                                    state.dateput.append(ad);\n                                }\n                                state.dateput.closeLevel();\n                            }\n                        }\n                    }\n                } else {\n                    last_string_output = value;\n                    state.output.append(value, this);\n                }\n\n                if (bc) {\n                    last_string_output = bc;\n                    state.output.append(bc);\n                }\n                if (ad) {\n                    last_string_output = ad;\n                    state.output.append(ad);\n                }\n                state.output.closeLevel();\n                //state.output.endTag();\n            } else if (\"month\" === this.strings.name) {\n                // XXX The simpler solution here will be to\n                // directly install season and season_end on\n                // month, with a value of 13, 14, 15, 16, or\n                // (to allow correct ranging with Down Under\n                // dates) 17 or 18.  That will allow ranging\n                // to take place in the normal way.  With this\n                // \"approach\", it doesn't.\n                //\n                // No value for this target variable\n                //\n                if (state.tmp.date_object.season) {\n                    value = \"\" + state.tmp.date_object.season;\n                    if (value && value.match(/^[1-4]$/)) {\n                        // XXXXXXXXXXXXXXXXXXX was replace([false, false, true]);\n                        //state.tmp.group_context.replace([false, false, true]);\n                        state.tmp.group_context.tip.variable_success = true;\n                        last_string_output = \"winter\";\n                        state.output.append(state.getTerm((\"season-0\" + value)), this);\n                    } else if (value) {\n                        last_string_output = value;\n                        state.output.append(value, this);\n                    }\n                }\n            }\n            state.tmp.value = [];\n            if (Item[date_variable] && (value || state.tmp.have_collapsed) && !state.opt.has_year_suffix && \"year\" === this.strings.name && !state.tmp.just_looking) {\n                if (state.registry.registry[Item.id] && state.registry.registry[Item.id].disambig.year_suffix !== false && !state.tmp.has_done_year_suffix) {\n                    state.tmp.has_done_year_suffix = true;\n                    last_string_output = \"x\";\n                    num = parseInt(state.registry.registry[Item.id].disambig.year_suffix, 10);\n                    // first argument is for number particle [a-zA-Z], never present on dates\n                    number = new CSL.NumericBlob(state, false, num, this, Item.id);\n                    this.successor_prefix = state[state.build.area].opt.layout_delimiter;\n                    this.splice_prefix = state[state.build.area].opt.layout_delimiter;\n                    formatter = new CSL.Util.Suffixator(CSL.SUFFIX_CHARS);\n                    number.setFormatter(formatter);\n                    if (state[state.tmp.area].opt.collapse === \"year-suffix-ranged\") {\n                        number.range_prefix = state.getTerm(\"citation-range-delimiter\");\n                    }\n                    if (state[state.tmp.area].opt.cite_group_delimiter) {\n                        number.successor_prefix = state[state.tmp.area].opt.cite_group_delimiter;\n                    } else if (state[state.tmp.area].opt[\"year-suffix-delimiter\"]) {\n                        number.successor_prefix = state[state.tmp.area].opt[\"year-suffix-delimiter\"];\n                    } else {\n                        number.successor_prefix = state[state.tmp.area].opt.layout_delimiter;\n                    }\n                    number.UGLY_DELIMITER_SUPPRESS_HACK = true;\n                    state.output.append(number, \"literal\");\n                }\n            }\n            if (last_string_output && !state.tmp.group_context.tip.condition) {\n                state.tmp.just_did_number = last_string_output.match(/[0-9]$/);\n                if (state.output.current.tip.strings.suffix) {\n                    state.tmp.just_did_number = false;\n                }\n            }\n        };\n        this.execs.push(func);\n        target.push(this);\n    }\n};\n\n/*global CSL: true */\n\nCSL.Node[\"else-if\"] = {\n    //\n    // these function are the same as those in if, might just clone\n    build: function (state, target) {\n        CSL.Conditions.TopNode.call(this, state, target);\n        target.push(this);\n    },\n    configure: function (state, pos) {\n        CSL.Conditions.Configure.call(this, state, pos);\n    }\n};\n\n/*global CSL: true */\n\nCSL.Node[\"else\"] = {\n    build: function (state, target) {\n        target.push(this);\n    },\n    configure: function (state, pos) {\n        if (this.tokentype === CSL.START) {\n            state.configure.fail[(state.configure.fail.length - 1)] = pos;\n        }\n    }\n};\n\n\n/*global CSL: true */\n\nCSL.Node[\"et-al\"] = {\n    build: function (state, target) {\n        if (state.build.area === \"citation\" || state.build.area === \"bibliography\") {\n            var func = function (state) {\n                state.tmp.etal_node = this;\n                if (\"string\" === typeof this.strings.term) {\n                    state.tmp.etal_term = this.strings.term;\n                }\n            };\n            this.execs.push(func);\n        }\n        target.push(this);\n    }\n};\n\n/*global CSL: true */\n\nCSL.Node.group = {\n    build: function (state, target, realGroup) {\n        var func, execs;\n        this.realGroup = realGroup;\n        if (this.tokentype === CSL.START) {\n            CSL.Util.substituteStart.call(this, state, target);\n            if (state.build.substitute_level.value()) {\n                state.build.substitute_level.replace((state.build.substitute_level.value() + 1));\n            }\n            if (!this.juris) {\n                target.push(this);\n            }\n\n            // newoutput\n            func = function (state) {\n                state.output.startTag(\"group\", this);\n                \n                if (this.strings.label_form_override) {\n                    if (!state.tmp.group_context.tip.label_form) {\n                        state.tmp.group_context.tip.label_form = this.strings.label_form_override;\n                    }\n                }\n                \n                if (this.strings.label_capitalize_if_first_override) {\n                    if (!state.tmp.group_context.tip.label_capitalize_if_first) {\n                        state.tmp.group_context.tip.label_capitalize_if_first = this.strings.label_capitalize_if_first_override;\n                    }\n                }\n                \n                if (this.realGroup) {\n                    \n                    if (state.tmp.group_context.tip.condition) {\n                        CSL.UPDATE_GROUP_CONTEXT_CONDITION(state, this.strings.prefix, null, this);\n                    }\n                    \n                    var condition = false;\n                    var force_suppress = false;\n\n                    // XXX Can we do something better for length here?\n                    if (state.tmp.group_context.mystack.length) {\n                        state.output.current.value().parent = state.tmp.group_context.tip.output_tip;\n                    }\n                    \n                    // fieldcontextflag\n                    var label_form = state.tmp.group_context.tip.label_form;\n                    if (!label_form) {\n                        label_form = this.strings.label_form_override;\n                    }\n                    \n                    var label_capitalize_if_first = state.tmp.group_context.tip.label_capitalize_if_first;\n                    if (!label_capitalize_if_first) {\n                        label_capitalize_if_first = this.strings.label_capitalize_if_first;\n                    }\n                    if (state.tmp.group_context.tip.condition) {\n                        condition = state.tmp.group_context.tip.condition;\n                        force_suppress = state.tmp.group_context.tip.force_suppress;\n                        //force_suppress: false;\n                    } else if (this.strings.reject) {\n                        condition = {\n                            test: this.strings.reject,\n                            not: true\n                        };\n                    } else if (this.strings.require) {\n                        condition = {\n                            test: this.strings.require,\n                            not: false\n                        };\n                    }\n                    var context = {\n                        old_term_predecessor: state.tmp.term_predecessor,\n                        term_intended: false,\n                        variable_attempt: false,\n                        variable_success: false,\n                        variable_success_parent: state.tmp.group_context.tip.variable_success,\n                        output_tip: state.output.current.tip,\n                        label_form: label_form,\n                        label_static: state.tmp.group_context.tip.label_static,\n                        label_capitalize_if_first: label_capitalize_if_first,\n                        parallel_delimiter_override: this.strings.set_parallel_delimiter_override,\n                        parallel_delimiter_override_on_suppress: this.strings.set_parallel_delimiter_override_on_suppress,\n                        condition: condition,\n                        force_suppress: force_suppress,\n                        done_vars: state.tmp.group_context.tip.done_vars.slice()\n                    };\n                    if(this.non_parallel) {\n                        var non_parallel = state.tmp.group_context.tip.non_parallel;\n                        if (!non_parallel) {\n                            non_parallel = {};\n                        }\n                        Object.assign(non_parallel, this.non_parallel);\n                        context.non_parallel = non_parallel;\n                    }\n                    if(this.parallel_first) {\n                        var parallel_first = state.tmp.group_context.tip.parallel_first;\n                        if (!parallel_first) {\n                            parallel_first = {};\n                        }\n                        Object.assign(parallel_first, this.parallel_first);\n                        context.parallel_first = parallel_first;\n                    }\n                    if(this.parallel_last) {\n                        var parallel_last = state.tmp.group_context.tip.parallel_last;\n                        if (!parallel_last) {\n                            parallel_last = {};\n                        }\n                        Object.assign(parallel_last, this.parallel_last);\n                        context.parallel_last = parallel_last;\n                    }\n                    if (state.tmp.abbrev_trimmer && state.tmp.abbrev_trimmer.LAST_TO_FIRST && context.parallel_last) {\n                        if (!context.parallel_first) {\n                            context.parallel_first = {};\n                        }\n                        for (var varname in state.tmp.abbrev_trimmer.LAST_TO_FIRST) {\n                            if (context.parallel_last[varname]) {\n                                context.parallel_first[varname] = true;\n                                delete context.parallel_last[varname];\n                            }\n                        }\n                    }\n                    \n                    /*\n                    if(this.parallel_last_override) {\n                        var parallel_last_override = state.tmp.group_context.tip.parallel_last_override;\n                        if (!parallel_last_override) {\n                            parallel_last_override = {};\n                        }\n                        Object.assign(parallel_last_override, this.parallel_last_override);\n                        context.parallel_last_override = parallel_last_override;\n                    }\n                     */\n                    state.tmp.group_context.push(context);\n\n                    if (state.tmp.abbrev_trimmer && this.parallel_last_to_first) {\n                        if (!state.tmp.abbrev_trimmer.LAST_TO_FIRST) {\n                            state.tmp.abbrev_trimmer.LAST_TO_FIRST = {};\n                        }\n                        for (var varname in this.parallel_last_to_first) {\n                            state.tmp.abbrev_trimmer.LAST_TO_FIRST[varname] = true;\n                        }\n                    }\n                    \n                    //if (!state.tmp.just_looking) {\n                    //    print(\"       flags=\"+JSON.stringify(state.tmp.group_context.tip, params))\n                    //}\n                }\n            };\n            //\n            // Paranoia.  Assure that this init function is the first executed.\n            execs = [];\n            execs.push(func);\n            this.execs = execs.concat(this.execs);\n\n            // \"Special handling\" for nodes that contain only\n            // publisher and place, with no affixes. For such\n            // nodes only, parallel publisher/place pairs\n            // will be parsed out and properly joined, piggybacking on\n            // join parameters set on cs:citation or cs:bibliography.\n            if (this.strings[\"has-publisher-and-publisher-place\"]) {\n                // Pass variable string values to the closing\n                // tag via a global, iff they conform to expectations.\n                state.build[\"publisher-special\"] = true;\n                if (this.strings[\"subgroup-delimiter\"]) {\n                    // Set the handling function only if name-delimiter\n                    // is set on the parent cs:citation or cs:bibliography\n                    // node.\n                    func = function (state, Item) {\n                        if (Item.publisher && Item[\"publisher-place\"]) {\n                            var publisher_lst = Item.publisher.split(/;\\s*/);\n                            var publisher_place_lst = Item[\"publisher-place\"].split(/;\\s*/);\n                            if (publisher_lst.length > 1\n                                && publisher_lst.length === publisher_place_lst.length) {\n                                state.publisherOutput = new CSL.PublisherOutput(state, this);\n                                state.publisherOutput[\"publisher-list\"] = publisher_lst;\n                                state.publisherOutput[\"publisher-place-list\"] = publisher_place_lst;\n                            }\n                        }\n                    };\n                    this.execs.push(func);\n                }\n            }\n\n            if (this.juris) {\n                // \"Special handling\" for jurisdiction macros\n                // We try to instantiate these as standalone token lists.\n                // If available, the token list is executed,\n                // the result is written directly into output,\n                // and control returns here.\n\n                // So we'll have something like this:\n                // * expandMacro() in util_node.js flags juris- macros\n                //   on build. [DONE]\n                // * Those are picked up here, and\n                //   - A runtime function attempts to fetch and instantiate\n                //     the macros in separate token lists under a segment\n                //     opened for the jurisdiction. We assume that the\n                //     jurisdiction has a full set of macros. That will need\n                //     to be enforced by validation. [DONE HERE, function is TODO]\n                //   - Success or failure is marked in a runtime flag object\n                //     (in citeproc.opt). [DONE]\n                //   - After the instantiation function comes a test, for\n                //     juris- macros only, which either runs diverted code,\n                //     or proceeds as per normal through the token list. [TODO]\n                // I think that's all there is to it.\n                \n                // Code for fetching an instantiating?\n\n                var choose_start = new CSL.Token(\"choose\", CSL.START);\n                CSL.Node.choose.build.call(choose_start, state, target);\n                \n                var if_start = new CSL.Token(\"if\", CSL.START);\n\n                func = (function (macroName) {\n                    return function (Item, item) {\n                        return CSL.INIT_JURISDICTION_MACROS(state, Item, item, macroName);\n                    }\n                }(this.juris));\n                \n                if_start.tests ? {} : if_start.tests = [];\n                if_start.tests.push(func);\n                if_start.test = state.fun.match.any(if_start, state, if_start.tests);\n                target.push(if_start);\n                var text_node = new CSL.Token(\"text\", CSL.SINGLETON);\n                func = function (state, Item, item) {\n                    // This will run the juris- token list.\n                    var itemItem = Item;\n                    if (item && item[\"best-jurisdiction\"] && this.juris === \"juris-locator\") {\n                        itemItem = item;\n                    }\n                    var next = 0;\n                    if (state.juris[itemItem[\"best-jurisdiction\"]][this.juris]) {\n                        while (next < state.juris[itemItem[\"best-jurisdiction\"]][this.juris].length) {\n                            next = CSL.tokenExec.call(state, state.juris[itemItem[\"best-jurisdiction\"]][this.juris][next], Item, item);\n                        }\n                    }\n                };\n                text_node.juris = this.juris;\n                text_node.execs.push(func);\n                target.push(text_node);\n\n                var if_end = new CSL.Token(\"if\", CSL.END);\n                CSL.Node[\"if\"].build.call(if_end, state, target);\n                var else_start = new CSL.Token(\"else\", CSL.START);\n                CSL.Node[\"else\"].build.call(else_start, state, target);\n            }\n        }\n\n        if (this.tokentype === CSL.END) {\n            \n            // Unbundle and print publisher lists\n            // Same constraints on creating the necessary function here\n            // as above. The full content of the group formatting token\n            // is apparently not available on the closing tag here,\n            // hence the global flag on state.build.\n            if (state.build[\"publisher-special\"]) {\n                state.build[\"publisher-special\"] = false;\n                func = function (state) {\n                    if (state.publisherOutput) {\n                        state.publisherOutput.render();\n                        state.publisherOutput = false;\n                    }\n                };\n                this.execs.push(func);\n            }\n            \n            // quashnonfields\n            func = function (state, Item, item) {\n                if (!state.tmp.group_context.tip.condition) {\n                    if (state.output.current.tip.strings.suffix) {\n                        state.tmp.just_did_number = false;\n                    }\n                }\n                state.output.endTag();\n                if (this.realGroup) {\n                    var flags = state.tmp.group_context.pop();\n                    if (flags.parallel_delimiter_override) {\n                        state.tmp.group_context.tip.parallel_delimiter_override = flags.parallel_delimiter_override;\n                        if (!state.tmp.just_looking && state.registry.registry[Item.id].master) {\n                            state.registry.registry[Item.id].parallel_delimiter_override = flags.parallel_delimiter_override;\n                        }\n                    }\n                    if (flags.parallel_delimiter_override_on_suppress) {\n                        state.tmp.group_context.tip.parallel_delimiter_override_on_suppress = flags.parallel_delimiter_override_on_suppress;\n                    }\n                    if (state.tmp.area === \"bibliography_sort\") {\n                        var citationNumberIdx = flags.done_vars.indexOf(\"citation-number\");\n                        if (this.strings.sort_direction && citationNumberIdx > -1 && state.tmp.group_context.length() == 1) {\n                            if (this.strings.sort_direction === CSL.DESCENDING) {\n                                state.bibliography_sort.opt.citation_number_sort_direction = CSL.DESCENDING;\n                            } else {\n                                state.bibliography_sort.opt.citation_number_sort_direction = CSL.ASCENDING;\n                            }\n                            flags.done_vars = flags.done_vars.slice(0, citationNumberIdx).concat(flags.done_vars.slice(citationNumberIdx + 1))\n                        }\n                    }\n                    //var params = [\"condition\", \"variable_success\", \"force_suppress\",\"term_intended\", \"variable_attempt\"]\n                    //if (!state.tmp.just_looking) {\n                    //    print(\"POP parent=\"+JSON.stringify(state.tmp.group_context.tip, params))\n                    //    print(\"    flags=\"+JSON.stringify(flags, params));\n                    //}\n                    if (flags.condition) {\n                        flags.force_suppress = CSL.EVALUATE_GROUP_CONDITION(state, flags);\n                    }\n                    if (state.tmp.group_context.tip.condition) {\n                        state.tmp.group_context.tip.force_suppress = flags.force_suppress;\n                    }\n                            \n                    if (!flags.force_suppress && (flags.variable_success || (flags.term_intended && !flags.variable_attempt))) {\n                        if (!this.isJurisLocatorLabel) {\n                            state.tmp.group_context.tip.variable_success = true;\n                        }\n                        var blobs = state.output.current.value().blobs;\n                        var pos = state.output.current.value().blobs.length - 1;\n\n                        if (!state.tmp.just_looking && (flags.non_parallel || flags.parallel_last || flags.parallel_first || flags.parallel_delimiter_override || flags.parallel_delimiter_override_on_suppress)) {\n                            // flags.parallel_last\n                            // flags.parallel_first\n\n                            // Returns true ONLY if all variables listed on this group are repeats.\n                            var hasRepeat = state.parallel.checkRepeats(flags);\n                            if (hasRepeat) {\n                                if (blobs) {\n                                    blobs.pop();\n                                }\n                            }\n                            if (state.tmp.cite_index > 0 && (hasRepeat || (!flags.parallel_first && !flags.parallel_last && !flags.non_parallel))) {\n                                //state.sys.print(`${state.tmp.cite_index} ${JSON.stringify(state.tmp.suppress_repeats, null, 2)}`)\n                                var info = state.tmp.suppress_repeats[state.tmp.cite_index-1];\n                                if (hasRepeat && flags.parallel_delimiter_override_on_suppress && (info.SIBLING || info.ORPHAN)) {\n                                    state.output.queue.slice(-1)[0].parallel_delimiter = flags.parallel_delimiter_override_on_suppress;\n                                } else if (flags.parallel_delimiter_override && info.SIBLING) {\n                                    state.output.queue.slice(-1)[0].parallel_delimiter = flags.parallel_delimiter_override;\n                                }\n                            }\n                        }\n                    } else {\n                        state.tmp.term_predecessor = flags.old_term_predecessor;\n                        state.tmp.group_context.tip.variable_attempt = flags.variable_attempt;\n                        if (flags.force_suppress && !state.tmp.group_context.tip.condition) {\n                            state.tmp.group_context.tip.variable_attempt = true;\n                            state.tmp.group_context.tip.variable_success = flags.variable_success_parent;\n                        }\n                        if (flags.force_suppress) {\n                            // 2019-04-15\n                            // This is removing variables done within the group we're leaveing from global\n                            // done_vars? How does that make sense?\n                            // Ah. This is a FAILURE. So removing from done_vars allows it to re-render\n                            // later in the cite if desired.\n                            // Currently no tests fail from removing the condition, but leaving it in.\n                            for (var i=0,ilen=flags.done_vars.length;i<ilen;i++) {\n                                var doneVar = flags.done_vars[i];\n                                for (var j=0,jlen=state.tmp.done_vars.length; j<jlen; j++) {\n                                    if (state.tmp.done_vars[j] === doneVar) {\n                                        state.tmp.done_vars = state.tmp.done_vars.slice(0, j).concat(state.tmp.done_vars.slice(j+1));\n                                    }\n                                }\n                            }\n                        }\n                        if (state.output.current.value().blobs) {\n                            state.output.current.value().blobs.pop();\n                        }\n                    }\n                }\n            };\n            this.execs.push(func);\n            \n            if (this.juris) {\n                var else_end = new CSL.Token(\"else\", CSL.END);\n                CSL.Node[\"else\"].build.call(else_end, state, target);\n                var choose_end = new CSL.Token(\"choose\", CSL.END);\n                CSL.Node.choose.build.call(choose_end, state, target);\n            }\n        }\n\n        if (this.tokentype === CSL.END) {\n            if (!this.juris) {\n                target.push(this);\n            }\n            if (state.build.substitute_level.value()) {\n                state.build.substitute_level.replace((state.build.substitute_level.value() - 1));\n            }\n            CSL.Util.substituteEnd.call(this, state, target);\n        }\n    }\n};\n\n/*global CSL: true */\n\nCSL.Node[\"if\"] = {\n    build: function (state, target) {\n        CSL.Conditions.TopNode.call(this, state, target);\n        target.push(this);\n    },\n    configure: function (state, pos) {\n        CSL.Conditions.Configure.call(this, state, pos);\n    }\n};\n\n\nCSL.Node[\"conditions\"] = {\n    build: function (state) {\n        if (this.tokentype === CSL.START) {\n            state.tmp.conditions.addMatch(this.match);\n        }\n        if (this.tokentype === CSL.END) {\n            state.tmp.conditions.matchCombine();\n        }\n    }\n};\n\nCSL.Node[\"condition\"] = {\n    build: function (state) {\n        if (this.tokentype === CSL.SINGLETON) {\n            var test = state.fun.match[this.match](this, state, this.tests);\n            state.tmp.conditions.addTest(test);\n        }\n    }\n};\n\nCSL.Conditions = {};\n\nCSL.Conditions.TopNode = function (state) {\n    var func;\n    if (this.tokentype === CSL.START || this.tokentype === CSL.SINGLETON) {\n        if (this.locale) {\n            state.opt.lang = this.locale;\n        }\n        if (!this.tests || !this.tests.length) {\n            // Set up the condition compiler with our current context\n            state.tmp.conditions = new CSL.Conditions.Engine(state, this);\n        } else {\n            // The usual.\n            this.test = state.fun.match[this.match](this, state, this.tests);\n        }\n        if (state.build.substitute_level.value() === 0) {\n            func = function(state) {\n                state.tmp.condition_counter++;\n            }\n            this.execs.push(func);\n        }\n    }\n    if (this.tokentype === CSL.END || this.tokentype === CSL.SINGLETON) {\n        if (state.build.substitute_level.value() === 0) {\n            func = function (state) {\n                state.tmp.condition_counter--;\n                if (state.tmp.condition_lang_counter_arr.length > 0) {\n                    var counter = state.tmp.condition_lang_counter_arr.slice(-1)[0];\n                    if (counter === state.tmp.condition_counter) {\n                        state.opt.lang = state.tmp.condition_lang_val_arr.pop();\n                        state.tmp.condition_lang_counter_arr.pop();\n                    }\n                }\n                if (this.locale_default) {\n                    // Open output tag with locale marker\n                    state.output.current.value().old_locale = this.locale_default;\n                    state.output.closeLevel(\"empty\");\n                    state.opt.lang = this.locale_default;\n                }\n            };\n            this.execs.push(func);\n        }\n        // closingjump\n        func = function (state) {\n            var next = this[state.tmp.jump.value()];\n            return next;\n        };\n        this.execs.push(func);\n        if (this.locale_default) {\n            state.opt.lang = this.locale_default;\n        }\n    }\n};\n\nCSL.Conditions.Configure = function (state, pos) {\n    if (this.tokentype === CSL.START) {\n        // jump index on failure\n        this.fail = state.configure.fail.slice(-1)[0];\n        this.succeed = this.next;\n        state.configure.fail[(state.configure.fail.length - 1)] = pos;\n    } else if (this.tokentype === CSL.SINGLETON) {\n        // jump index on failure\n        this.fail = this.next;\n        this.succeed = state.configure.succeed.slice(-1)[0];\n        state.configure.fail[(state.configure.fail.length - 1)] = pos;\n    } else {\n        // jump index on success\n        this.succeed = state.configure.succeed.slice(-1)[0];\n        this.fail = this.next;\n    }\n};\n\nCSL.Conditions.Engine = function (state, token) {\n    this.token = token;\n    this.state = state;\n};\n\nCSL.Conditions.Engine.prototype.addTest = function (test) {\n    this.token.tests ? {} : this.token.tests = [];\n    this.token.tests.push(test);\n};\n\nCSL.Conditions.Engine.prototype.addMatch = function (match) {\n    this.token.match = match;\n};\n\nCSL.Conditions.Engine.prototype.matchCombine = function () {\n    this.token.test = this.state.fun.match[this.token.match](this.token, this.state, this.token.tests);\n};\n\n/*global CSL: true */\n\nCSL.Node.info = {\n    build: function (state) {\n        if (this.tokentype === CSL.START) {\n            state.build.skip = \"info\";\n        } else {\n            state.build.skip = false;\n        }\n    }\n};\n\n\n/*global CSL: true */\n\nCSL.Node.institution = {\n    build: function (state, target) {\n        if ([CSL.SINGLETON, CSL.START].indexOf(this.tokentype) > -1) {\n\n            var func = function (state) {\n                if (\"string\" === typeof this.strings.delimiter) {\n                    state.tmp.institution_delimiter = this.strings.delimiter;\n                } else {\n                    state.tmp.institution_delimiter = state.tmp.name_delimiter;\n                }\n\n                // This is the same code for the same result as in node_name.js, \n                // but when cs:institution comes on stream, it may produce\n                // different results.\n                if (\"text\" === state.inheritOpt(this, \"and\")) {\n                    this.and_term = state.getTerm(\"and\", \"long\", 0);\n                } else if (\"symbol\" === state.inheritOpt(this, \"and\")) {\n                    if (state.opt.development_extensions.expect_and_symbol_form) {\n                        this.and_term = state.getTerm(\"and\", \"symbol\", 0);\n                    } else {\n                        this.and_term = \"&\";\n                    }\n                } else if (\"none\" === state.inheritOpt(this, \"and\")) {\n                    this.and_term = state.tmp.institution_delimiter;\n                }\n                if (\"undefined\" === typeof this.and_term && state.tmp.and_term) {\n                    // this.and_term = state.getTerm(\"and\", \"long\", 0);\n                    this.and_term = state.tmp.and_term;\n                }\n                if (CSL.STARTSWITH_ROMANESQUE_REGEXP.test(this.and_term)) {\n                    this.and_prefix_single = \" \";\n                    this.and_prefix_multiple = \", \";\n                    if (\"string\" === typeof state.tmp.institution_delimiter) {\n                        this.and_prefix_multiple = state.tmp.institution_delimiter;\n                    }\n                    this.and_suffix = \" \";\n                } else {\n                    this.and_prefix_single = \"\";\n                    this.and_prefix_multiple = \"\";\n                    this.and_suffix = \"\";\n                }\n                if (state.inheritOpt(this, \"delimiter-precedes-last\") === \"always\") {\n                    this.and_prefix_single = state.tmp.institution_delimiter;\n                } else if (state.inheritOpt(this, \"delimiter-precedes-last\") === \"never\") {\n                    // Slightly fragile: could test for charset here to make\n                    // this more certain.\n                    if (this.and_prefix_multiple) {\n                        this.and_prefix_multiple = \" \";\n                    }\n                }\n                \n                this.and = {};\n                if (\"undefined\" !== typeof this.and_term) {\n                    state.output.append(this.and_term, \"empty\", true);\n                    this.and.single = state.output.pop();\n                    this.and.single.strings.prefix = this.and_prefix_single;\n                    this.and.single.strings.suffix = this.and_suffix;\n                    state.output.append(this.and_term, \"empty\", true);\n                    this.and.multiple = state.output.pop();\n                    this.and.multiple.strings.prefix = this.and_prefix_multiple;\n                    this.and.multiple.strings.suffix = this.and_suffix;\n                } else if (\"undefined\" !== this.strings.delimiter) {\n                    this.and.single = new CSL.Blob(state.tmp.institution_delimiter);\n                    this.and.single.strings.prefix = \"\";\n                    this.and.single.strings.suffix = \"\";\n                    this.and.multiple = new CSL.Blob(state.tmp.institution_delimiter);\n                    this.and.multiple.strings.prefix = \"\";\n                    this.and.multiple.strings.suffix = \"\";\n                }\n                state.nameOutput.institution = this;\n            };\n            this.execs.push(func);\n        }\n        target.push(this);\n    },\n    configure: function (state) {\n        if ([CSL.SINGLETON, CSL.START].indexOf(this.tokentype) > -1) {\n            state.build.has_institution = true;\n        }\n    }\n};\n\n/*global CSL: true */\n\nCSL.Node[\"institution-part\"] = {\n    build: function (state, target) {\n        var func;\n        if (\"long\" === this.strings.name) {\n            if (this.strings[\"if-short\"]) {\n                func = function (state) {\n                    state.nameOutput.institutionpart[\"long-with-short\"] = this;\n                };\n            } else {\n                func = function (state) {\n                    state.nameOutput.institutionpart[\"long\"] = this;\n                };\n            }\n        } else if (\"short\" === this.strings.name) {\n            func = function (state) {\n                state.nameOutput.institutionpart[\"short\"] = this;\n            };\n        }\n        this.execs.push(func);\n        target.push(this);\n    }\n};\n\n/*global CSL: true */\n\nCSL.Node.key = {\n    build: function (state, target) {\n        \n        target = state[state.build.root + \"_sort\"].tokens;\n\n        var func;\n        var debug = false;\n        var start_key = new CSL.Token(\"key\", CSL.START);\n\n        state.tmp.root = state.build.root;\n\n        // The params object for build and runtime (tmp) really shouldn't have been separated.\n        // Oh, well.\n        start_key.strings[\"et-al-min\"] = state.inheritOpt(this, \"et-al-min\");\n        start_key.strings[\"et-al-use-first\"] = state.inheritOpt(this, \"et-al-use-first\");\n        start_key.strings[\"et-al-use-last\"] = state.inheritOpt(this, \"et-al-use-last\");\n\n\n        // initialize done vars\n        func = function (state) {\n            state.tmp.done_vars = [];\n        };\n        start_key.execs.push(func);\n\n        // initialize output queue\n        func = function (state) {\n            state.output.openLevel(\"empty\");\n        };\n        start_key.execs.push(func);\n\n        // sort direction\n        var sort_direction = [];\n        if (this.strings.sort_direction === CSL.DESCENDING) {\n            //print(\"sort: descending on \"+state.tmp.area);\n            sort_direction.push(1);\n            sort_direction.push(-1);\n        } else {\n            //print(\"sort: ascending\");\n            sort_direction.push(-1);\n            sort_direction.push(1);\n        }\n        state[state.build.area].opt.sort_directions.push(sort_direction);\n\n        if (CSL.DATE_VARIABLES.indexOf(this.variables[0]) > -1) {\n            state.build.date_key = true;\n        }\n\n        // et al init\n        func = function (state) {\n            state.tmp.sort_key_flag = true;\n            //print(\"== key node function ==\");\n            if (state.inheritOpt(this, \"et-al-min\")) {\n                state.tmp[\"et-al-min\"] = state.inheritOpt(this, \"et-al-min\");\n            }\n            if (state.inheritOpt(this, \"et-al-use-first\")) {\n                state.tmp[\"et-al-use-first\"] = state.inheritOpt(this, \"et-al-use-first\");\n            }\n            if (\"boolean\" === typeof state.inheritOpt(this, \"et-al-use-last\")) {\n                state.tmp[\"et-al-use-last\"] = state.inheritOpt(this, \"et-al-use-last\");\n                //print(\"  set tmp et-al-use-last: \"+this.strings[\"et-al-use-last\"])\n            }\n        };\n        start_key.execs.push(func);\n        target.push(start_key);\n        \n        //\n        // ops to initialize the key's output structures\n        if (this.variables.length) {\n            var variable = this.variables[0];\n            if (CSL.NAME_VARIABLES.indexOf(variable) > -1) {\n                //\n                // Start tag\n                var names_start_token = new CSL.Token(\"names\", CSL.START);\n                names_start_token.tokentype = CSL.START;\n                names_start_token.variables = this.variables;\n                CSL.Node.names.build.call(names_start_token, state, target);\n                //\n                // Name tag\n                var name_token = new CSL.Token(\"name\", CSL.SINGLETON);\n                name_token.tokentype = CSL.SINGLETON;\n                name_token.strings[\"name-as-sort-order\"] = \"all\";\n                name_token.strings[\"sort-separator\"] = \" \";\n                name_token.strings[\"et-al-use-last\"] = state.inheritOpt(this, \"et-al-use-last\");\n                name_token.strings[\"et-al-min\"] = state.inheritOpt(this, \"et-al-min\");\n                name_token.strings[\"et-al-use-first\"] = state.inheritOpt(this, \"et-al-use-first\");\n                CSL.Node.name.build.call(name_token, state, target);\n                //\n                // Institution tag\n                var institution_token = new CSL.Token(\"institution\", CSL.SINGLETON);\n                institution_token.tokentype = CSL.SINGLETON;\n                CSL.Node.institution.build.call(institution_token, state, target);\n                //\n                // End tag\n                var names_end_token = new CSL.Token(\"names\", CSL.END);\n                names_end_token.tokentype = CSL.END;\n                CSL.Node.names.build.call(names_end_token, state, target);\n            } else {\n                var single_text = new CSL.Token(\"text\", CSL.SINGLETON);\n                single_text.strings.sort_direction = this.strings.sort_direction;\n                single_text.dateparts = this.dateparts;\n                if (CSL.NUMERIC_VARIABLES.indexOf(variable) > -1) {\n                    // citation-number is virtualized. As a sort key it has no effect on registry\n                    // sort order per se, but if set to DESCENDING, it reverses the sequence of numbers representing\n                    // bib entries.\n                    if (variable === \"citation-number\") {\n                        func = function (state, Item) {\n                            if (state.tmp.area === \"bibliography_sort\") {\n                                if (this.strings.sort_direction === CSL.DESCENDING) {\n                                    state.bibliography_sort.opt.citation_number_sort_direction = CSL.DESCENDING;\n                                } else {\n                                    state.bibliography_sort.opt.citation_number_sort_direction = CSL.ASCENDING;\n                                }\n                            }\n                            if (state.tmp.area === \"citation_sort\" && state.bibliography_sort.tmp.citation_number_map) {\n                                var num = state.bibliography_sort.tmp.citation_number_map[state.registry.registry[Item.id].seq];\n                            } else {\n                                var num = state.registry.registry[Item.id].seq;\n                            }\n                            if (num) {\n                                // Code currently in util_number.js\n                                num = CSL.Util.padding(\"\" + num);\n                            }\n                            state.output.append(num, this);\n                        };\n                    } else {\n                        func = function (state, Item) {\n                            var num = false;\n                            num = Item[variable];\n                            // XXX What if this is NaN?\n                            if (num) {\n                                // Code currently in util_number.js\n                                num = CSL.Util.padding(num);\n                            }\n                            state.output.append(num, this);\n                        };\n                    }\n                } else if (variable === \"citation-label\") {\n                    func = function (state, Item) {\n                        var trigraph = state.getCitationLabel(Item);\n                        state.output.append(trigraph, this);\n                    };\n                } else if (CSL.DATE_VARIABLES.indexOf(variable) > -1) {\n                    func = CSL.dateAsSortKey;\n                    single_text.variables = this.variables;\n                } else if (\"title\" === variable) {\n                    var abbrevfam = \"title\";\n                    var abbrfall = false;\n                    var altvar = false;\n                    var transfall = true;\n                    func = state.transform.getOutputFunction(this.variables, abbrevfam, abbrfall, altvar, transfall);\n                } else if (\"court-class\" === variable) {\n                    func = function(state, Item, item) {\n                        CSL.INIT_JURISDICTION_MACROS(state, Item, item, \"juris-main\")\n                        // true is for sortKey mode\n                        var cls = CSL.GET_COURT_CLASS(state, Item, true);\n                        state.output.append(cls, \"empty\");\n                    }\n                } else {\n                    func = function (state, Item) {\n                        var varval = Item[variable];\n                        state.output.append(varval, \"empty\");\n                    };\n                }\n                single_text.execs.push(func);\n                target.push(single_text);\n            }\n        } else { // macro\n            //\n            // if it's not a variable, it's a macro\n            var token = new CSL.Token(\"text\", CSL.SINGLETON);\n            token.strings.sort_direction = this.strings.sort_direction;\n            token.postponed_macro = this.postponed_macro;\n            CSL.expandMacro.call(state, token, target);\n        }\n        //\n        // ops to output the key string result to an array go\n        // on the closing \"key\" tag before it is pushed.\n        // Do not close the level.\n        var end_key = new CSL.Token(\"key\", CSL.END);\n\n        // Eliminated at revision 1.0.159.\n        // Was causing non-fatal error \"wanted empty but found group\".\n        // Possible contributor to weird \"PAGES\" bug?\n        //func = function (state, Item) {\n        //state.output.closeLevel(\"empty\");\n        //};\n        //end_key.execs.push(func);\n        \n        // store key for use\n        func = function (state) {\n            var keystring = state.output.string(state, state.output.queue);\n            if (state.sys.normalizeUnicode) {\n                keystring = state.sys.normalizeUnicode(keystring);\n            }\n            keystring = keystring ? (keystring.split(\" \").join(state.opt.sort_sep) + state.opt.sort_sep) : \"\";\n            //SNIP-START\n            if (debug) {\n                CSL.debug(\"keystring: \" + keystring + \" \" + typeof keystring);\n            }\n            //print(\"keystring: (\" + keystring + \") \" + typeof keystring + \" \" + state.tmp.area);\n            //SNIP-END\n            //state.sys.print(\"keystring: (\" + keystring + \") \" + typeof keystring + \" \" + state.tmp.area);\n            if (\"\" === keystring) {\n                keystring = undefined;\n            }\n            if (\"string\" !== typeof keystring) {\n                keystring = undefined;\n                //state.tmp.empty_date = false;\n            }\n            state[state[state.tmp.area].root + \"_sort\"].keys.push(keystring);\n            state.tmp.value = [];\n        };\n        end_key.execs.push(func);\n\n        // Set year-suffix key on anything that looks like a date\n        if (state.build.date_key) {\n            if (state.build.area === \"citation\" && state.build.extension === \"_sort\") {\n                // ascending sort always\n                state[state.build.area].opt.sort_directions.push([-1,1]);\n                func = function (state, Item) {\n                    // year-suffix Key\n                    var year_suffix = state.registry.registry[Item.id].disambig.year_suffix;\n                    if (!year_suffix) {\n                        year_suffix = 0;\n                    }\n                    var key = CSL.Util.padding(\"\" + year_suffix);\n                    state[state.tmp.area].keys.push(key);\n                };\n                end_key.execs.push(func);\n            }\n            state.build.date_key = false;\n        }\n\n        // reset key params\n        func = function (state) {\n            // state.tmp.name_quash = new Object();\n\n            // XXX This should work, should be necessary, but doesn't and isn't.\n            //state.output.closeLevel(\"empty\");\n\n            state.tmp[\"et-al-min\"] = undefined;\n            state.tmp[\"et-al-use-first\"] = undefined;\n            state.tmp[\"et-al-use-last\"] = undefined;\n            state.tmp.sort_key_flag = false;\n        };\n        end_key.execs.push(func);\n        target.push(end_key);\n    }\n};\n\n/*global CSL: true */\n\nCSL.Node.label = {\n    build: function (state, target) {\n        \n        if (this.strings.term) {\n            // Non-names labels\n            var func = function (state, Item, item) {\n                // Must accomplish this without touching strings\n                // shared with the calling application: \"sub verbo\"\n                // and \"sub-verbo\" must both pass, as they stand.\n                //if (item && item.label === \"sub verbo\") {\n                //    item.label = \"sub-verbo\";\n                //}\n                // This is abstracted away, because the same\n                // logic must be run in cs:names.\n                var termtxt = CSL.evaluateLabel(this, state, Item, item);\n                if (item && this.strings.term === \"locator\") {\n\n                    item.section_form_override = this.strings.form;\n\n                }\n                if (termtxt) {\n                    state.tmp.group_context.tip.term_intended = true;\n                }\n                CSL.UPDATE_GROUP_CONTEXT_CONDITION(state, termtxt, null, this);\n                if (termtxt.indexOf(\"%s\") === -1) {\n                    // ^ Suppress output here if we have an embedded term\n                    if (this.strings.capitalize_if_first) {\n                        if (!state.tmp.term_predecessor && !(state.opt[\"class\"] === \"in-text\" && state.tmp.area === \"citation\")) {\n                            termtxt = CSL.Output.Formatters[\"capitalize-first\"](state, termtxt);\n                        }\n                    }\n                    state.output.append(termtxt, this);\n                }\n            };\n            this.execs.push(func);\n        } else {\n            if (!this.strings.form) {\n                this.strings.form = \"long\";\n            }\n            // Names labels\n            // Picked up in names END\n            var namevars = state.build.names_variables[state.build.names_variables.length-1];\n            var namelabels = state.build.name_label[state.build.name_label.length-1];\n            for (var i = 0, ilen = namevars.length; i < ilen; i += 1) {\n                if (!namelabels[namevars[i]]) {\n                    namelabels[namevars[i]] = {};\n                }\n            }\n            if (!state.build.name_flag) {\n                for (var i = 0, ilen = namevars.length; i < ilen; i += 1) {\n                    namelabels[namevars[i]].before = this;\n                }\n            } else {\n                for (var i = 0, ilen = namevars.length; i < ilen; i += 1) {\n                    namelabels[namevars[i]].after = this;\n                }\n            }\n        }\n        target.push(this);\n    }\n};\n\n/*global CSL: true */\n\nCSL.Node.layout = {\n    build: function (state, target) {\n        var func, prefix_token, suffix_token, tok;\n\n        function setSuffix() {\n            if (state.build.area === \"bibliography\") {\n                suffix_token = new CSL.Token(\"text\", CSL.SINGLETON);\n                func = function(state) {\n                    // Suppress suffix on all but the last item in bibliography parallels\n                    if (!state.tmp.parallel_and_not_last) {\n                        var suffix;\n                        if (state.tmp.cite_affixes[state.tmp.area][state.tmp.last_cite_locale]) {\n                            suffix = state.tmp.cite_affixes[state.tmp.area][state.tmp.last_cite_locale].suffix;\n                        } else {\n                            suffix = state.bibliography.opt.layout_suffix;\n                        }\n\n                        // If @display is used, layout suffix is placed on the last\n                        // immediate child of the layout, which we assume will be a\n                        // @display group node.\n                        var topblob = state.output.current.value();\n                        if (state.opt.using_display) {\n                            topblob.blobs[topblob.blobs.length-1].strings.suffix = suffix;\n                        } else {\n                            topblob.strings.suffix = suffix;\n                        }\n                    }\n                    if (state.bibliography.opt[\"second-field-align\"]) {\n                        // closes bib_other\n                        state.output.endTag(\"bib_other\");\n                    }\n                };\n                suffix_token.execs.push(func);\n                target.push(suffix_token);\n            }\n        }\n\n        if (this.tokentype === CSL.START) {\n\n            if (this.locale_raw) {\n                state.build.current_default_locale = this.locale_raw;\n            } else {\n                state.build.current_default_locale = state.opt[\"default-locale\"];\n            }\n\n            func = function (state, Item, item) {\n                if (state.opt.development_extensions.apply_citation_wrapper\n                    && state.sys.wrapCitationEntry\n                    && !state.tmp.just_looking\n                    && Item.system_id \n                    && state.tmp.area === \"citation\") { \n\n                    var cite_entry = new CSL.Token(\"group\", CSL.START);\n                    cite_entry.decorations = [[\"@cite\", \"entry\"]];\n                    state.output.startTag(\"cite_entry\", cite_entry);\n                    state.output.current.value().item_id = Item.system_id;\n                    if (item) {\n                        state.output.current.value().locator_txt = item.locator_txt;\n                        state.output.current.value().suffix_txt = item.suffix_txt;\n                    }\n                }\n            };\n            this.execs.push(func);\n        }\n\n        // XXX Works, but using state.tmp looks wrong here? We're in the build layer ...\n        if (this.tokentype === CSL.START && !state.tmp.cite_affixes[state.build.area]) {\n            //\n            // done_vars is used to prevent the repeated\n            // rendering of variables\n            //\n            // initalize done vars\n            func = function (state, Item, item) {\n\n                state.tmp.done_vars = [];\n                if (item && item[\"author-only\"]) {\n                    state.tmp.done_vars.push(\"locator\");\n                }\n                if (state.opt.suppressedJurisdictions[Item[\"country\"]]\n                    && Item[\"country\"]\n                    && [\"treaty\", \"patent\"].indexOf(Item.type) === -1) {\n                    \n                    state.tmp.done_vars.push(\"country\");\n                }\n                if (!state.tmp.just_looking && state.registry.registry[Item.id] && state.registry.registry[Item.id].parallel) {\n                    state.tmp.done_vars.push(\"first-reference-note-number\");\n                }\n                // trimmer is not available in getAmbiguousCite\n                if (!state.tmp.just_looking && state.tmp.abbrev_trimmer && Item.jurisdiction) {\n                    for (var field in state.tmp.abbrev_trimmer.QUASHES[Item.jurisdiction]) {\n                        state.tmp.done_vars.push(field);\n                    }\n                }\n\n                //CSL.debug(\" === init rendered_name === \");\n                state.tmp.rendered_name = false;\n            };\n            this.execs.push(func);\n            // set opt delimiter\n            func = function (state) {\n                // just in case\n                state.tmp.sort_key_flag = false;\n            };\n            this.execs.push(func);\n            \n            // reset nameset counter [all nodes]\n            func = function (state) {\n                state.tmp.nameset_counter = 0;\n            };\n            this.execs.push(func);\n\n            func = function (state, Item) {\n                var tok = new CSL.Token();\n                state.output.openLevel(tok);\n            };\n            this.execs.push(func);\n            target.push(this);\n\n            if (state.build.area === \"citation\") {\n                prefix_token = new CSL.Token(\"text\", CSL.SINGLETON);\n                func = function (state, Item, item) {\n                    if (item && item.prefix) {\n                        var prefix = CSL.checkPrefixSpaceAppend(state, item.prefix);\n                        if (!state.tmp.just_looking) {\n                            prefix = state.output.checkNestedBrace.update(prefix);\n                        }\n                        var ignorePredecessor = CSL.checkIgnorePredecessor(state, prefix);\n                        state.output.append(prefix, this, false, ignorePredecessor);\n                    }\n                };\n                prefix_token.execs.push(func);\n                target.push(prefix_token);\n            }\n        }\n\n        // Cast token to be used in one of the configurations below.\n        var my_tok;\n        if (this.locale_raw) {\n            my_tok = new CSL.Token(\"dummy\", CSL.START);\n            my_tok.locale = this.locale_raw;\n            my_tok.strings.delimiter = this.strings.delimiter;\n            my_tok.strings.suffix = this.strings.suffix;\n            if (!state.tmp.cite_affixes[state.build.area]) {\n                state.tmp.cite_affixes[state.build.area] = {};\n            }\n        }\n\n        if (this.tokentype === CSL.START) {\n            state.build.layout_flag = true;\n                            \n            // Only run the following once, to set up the final layout node ...\n            if (!this.locale_raw) {\n                //\n                // save out decorations for flipflop processing [final node only]\n                //\n                state[state.tmp.area].opt.topdecor = [this.decorations];\n                state[(state.tmp.area + \"_sort\")].opt.topdecor = [this.decorations];\n\n                state[state.build.area].opt.layout_prefix = this.strings.prefix;\n                state[state.build.area].opt.layout_suffix = this.strings.suffix;\n                state[state.build.area].opt.layout_delimiter = this.strings.delimiter;\n\n                state[state.build.area].opt.layout_decorations = this.decorations;\n                \n                // Only do this if we're running conditionals\n                if (state.tmp.cite_affixes[state.build.area]) {\n                    // if build_layout_locale_flag is true,\n                    // write cs:else START to the token list.\n                    tok = new CSL.Token(\"else\", CSL.START);\n                    CSL.Node[\"else\"].build.call(tok, state, target);\n                }\n\n            } // !this.locale_raw\n\n            // Conditionals\n            if (this.locale_raw) {\n                if (!state.build.layout_locale_flag) {\n                    // if layout_locale_flag is untrue,\n                    // write cs:choose START and cs:if START\n                    // to the token list.\n                    var choose_tok = new CSL.Token(\"choose\", CSL.START);\n                    CSL.Node.choose.build.call(choose_tok, state, target);\n                    my_tok.name = \"if\";\n                    CSL.Attributes[\"@locale-internal\"].call(my_tok, state, this.locale_raw);\n                    CSL.Node[\"if\"].build.call(my_tok, state, target);\n                } else {\n                    // if build_layout_locale_flag is true,\n                    // write cs:else-if START to the token list.\n                    my_tok.name = \"else-if\";\n                    CSL.Attributes[\"@locale-internal\"].call(my_tok, state, this.locale_raw);\n                    CSL.Node[\"else-if\"].build.call(my_tok, state, target);\n                }\n                // cite_affixes for this node\n                state.tmp.cite_affixes[state.build.area][my_tok.locale] = {};\n                state.tmp.cite_affixes[state.build.area][my_tok.locale].delimiter = this.strings.delimiter;\n                state.tmp.cite_affixes[state.build.area][my_tok.locale].suffix = this.strings.suffix;\n            }\n        }\n        if (this.tokentype === CSL.END) {\n            if (this.locale_raw) {\n                setSuffix();\n                if (!state.build.layout_locale_flag) {\n                    // If layout_locale_flag is untrue, write cs:if END\n                    // to the token list.\n                    my_tok.name = \"if\";\n                    my_tok.tokentype = CSL.END;\n                    CSL.Attributes[\"@locale-internal\"].call(my_tok, state, this.locale_raw);\n                    CSL.Node[\"if\"].build.call(my_tok, state, target);\n                    state.build.layout_locale_flag = true;\n                } else {\n                    // If layout_locale_flag is true, write cs:else-if END\n                    // to the token list.\n                    my_tok.name = \"else-if\";\n                    my_tok.tokentype = CSL.END;\n                    CSL.Attributes[\"@locale-internal\"].call(my_tok, state, this.locale_raw);\n                    CSL.Node[\"else-if\"].build.call(my_tok, state, target);\n                }\n            }\n            if (!this.locale_raw) {\n                setSuffix();\n                // Only add this if we're running conditionals\n                if (state.tmp.cite_affixes[state.build.area]) {\n                    // If layout_locale_flag is true, write cs:else END\n                    // and cs:choose END to the token list.\n                    if (state.build.layout_locale_flag) {\n                        tok = new CSL.Token(\"else\", CSL.END);\n                        CSL.Node[\"else\"].build.call(tok, state, target);\n                        tok = new CSL.Token(\"choose\", CSL.END);\n                        CSL.Node.choose.build.call(tok, state, target);\n                    }\n                }\n                state.build_layout_locale_flag = true;\n                if (state.build.area === \"citation\") {\n                    suffix_token = new CSL.Token(\"text\", CSL.SINGLETON);\n                    func = function (state, Item, item) {\n                        var sp;\n                        if (item && item.suffix) {\n                            var suffix = CSL.checkSuffixSpacePrepend(state, item.suffix);\n                            if (!state.tmp.just_looking) {\n                                suffix = state.output.checkNestedBrace.update(suffix);\n                            }\n                            state.output.append((suffix), this);\n                        }\n                    };\n                    suffix_token.execs.push(func);\n                    target.push(suffix_token);\n                }\n\n                // Closes wrapper token\n                func = function (state) {\n                    state.output.closeLevel();\n                };\n                this.execs.push(func);\n                func = function (state, Item) {\n                    if (state.opt.development_extensions.apply_citation_wrapper\n                        && state.sys.wrapCitationEntry\n                        && !state.tmp.just_looking\n                        && Item.system_id \n                        && state.tmp.area === \"citation\") { \n                        \n                        state.output.endTag(); // closes citation link wrapper\n                    }\n                };\n                this.execs.push(func);\n                target.push(this);\n                state.build.layout_flag = false;\n                state.build.layout_locale_flag = false;\n            } // !this.layout_raw\n        }\n    }\n};\n\n/*global CSL: true */\n\nCSL.Node.macro = {\n    build: function () {}\n};\n\n/*global CSL: true */\n\nCSL.Node.alternative = {\n    build: function (state, target) {\n        if (this.tokentype === CSL.START) {\n\n            var choose_tok = new CSL.Token(\"choose\", CSL.START);\n            CSL.Node[\"choose\"].build.call(choose_tok, state, target);\n\n            var if_tok = new CSL.Token(\"if\", CSL.START);\n            CSL.Attributes[\"@alternative-node-internal\"].call(if_tok, state);\n            CSL.Node[\"if\"].build.call(if_tok, state, target);\n\n            var func = function(state, Item) {\n\n                state.tmp.oldItem = Item;\n                state.tmp.oldLang = state.opt.lang;\n                state.tmp.abort_alternative = true;\n\n                if (Item[\"language-name\"] && Item[\"language-name-original\"]) {\n\n                    var newItem = JSON.parse(JSON.stringify(Item));\n\n                    newItem.language = newItem[\"language-name\"];\n                    var langspec = CSL.localeResolve(newItem.language, state.opt[\"default-locale\"][0]);\n\n                    if (state.opt.multi_layout) {\n                        for (var i in state.opt.multi_layout) {\n                            var locale_list = state.opt.multi_layout[i];\n                            var gotlang = false;\n                            for (var j in locale_list) {\n                                var tryspec = locale_list[j];\n                                if (langspec.best === tryspec.best || langspec.base === tryspec.base || langspec.bare === tryspec.bare) {\n                                    gotlang = locale_list[0].best;\n                                    break;\n                                }\n                            }\n                            if (!gotlang) {\n                                gotlang = state.opt[\"default-locale\"][0];\n                            }\n                            state.opt.lang = gotlang;\n                        }\n                    }\n\n                    for (var key in newItem) {\n                        if ([\"id\", \"type\", \"language\", \"multi\"].indexOf(key) === -1 && key.slice(0, 4) !== \"alt-\") {\n                            if (newItem.multi && newItem.multi._keys[key]) {\n                                var deleteme = true;\n                                for (var lang in newItem.multi._keys[key]) {\n                                    if (langspec.bare === lang.replace(/^([a-zA-Z]+).*/, \"$1\")) {\n                                        deleteme = false;\n                                        break;\n                                    }\n                                }\n                                if (deleteme) {\n                                    delete newItem[key];\n                                }\n                            } else {\n                                delete newItem[key];\n                            }\n                        }\n                    }\n                    for (var key in newItem) {\n                        if (key.slice(0, 4) === \"alt-\") {\n                            newItem[key.slice(4)] = newItem[key];\n                            state.tmp.abort_alternative = false;\n                        } else {\n                            if (newItem.multi && newItem.multi._keys) {\n                                if (!newItem[\"alt-\" + key] && newItem.multi._keys[key]) {\n                                    if (newItem.multi._keys[key][langspec.best]) {\n                                        newItem[key] = newItem.multi._keys[key][langspec.best];\n                                        state.tmp.abort_alternative = false;\n                                    } else if (newItem.multi._keys[key][langspec.base]) {\n                                        newItem[key] = newItem.multi._keys[key][langspec.base];\n                                        state.tmp.abort_alternative = false;\n                                    } else if (newItem.multi._keys[key][langspec.bare]) {\n                                        newItem[key] = newItem.multi._keys[key][langspec.bare];\n                                        state.tmp.abort_alternative = false;\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n\n                state.output.openLevel(this);\n                state.registry.refhash[Item.id] = newItem;\n                state.nameOutput = new CSL.NameOutput(state, newItem);\n            };\n            this.execs.push(func);\n            target.push(this);\n\n            var choose_tok = new CSL.Token(\"choose\", CSL.START);\n            CSL.Node[\"choose\"].build.call(choose_tok, state, target);\n\n            var if_tok = new CSL.Token(\"if\", CSL.START);\n            CSL.Attributes[\"@alternative-node-internal\"].call(if_tok, state);\n            var func = function(state) {\n                state.tmp.abort_alternative = true;\n            }\n            if_tok.execs.push(func);\n            CSL.Node[\"if\"].build.call(if_tok, state, target);\n\n        } else if (this.tokentype === CSL.END) {\n\n            var if_tok = new CSL.Token(\"if\", CSL.END);\n            CSL.Node[\"if\"].build.call(if_tok, state, target);\n\n            var choose_tok = new CSL.Token(\"choose\", CSL.END);\n            CSL.Node[\"choose\"].build.call(choose_tok, state, target);\n\n            var func = function(state, Item) {\n                state.output.closeLevel();\n                state.registry.refhash[Item.id] = state.tmp.oldItem;\n                state.opt.lang = state.tmp.oldLang;\n                state.nameOutput = new CSL.NameOutput(state, state.tmp.oldItem);\n                state.tmp.abort_alternative = false;\n            };\n            this.execs.push(func);\n            target.push(this);\n\n            var if_tok = new CSL.Token(\"if\", CSL.END);\n            CSL.Node[\"if\"].build.call(if_tok, state, target);\n\n            var choose_tok = new CSL.Token(\"choose\", CSL.END);\n            CSL.Node[\"choose\"].build.call(choose_tok, state, target);\n\n        }\n    }\n};\n\nCSL.Node[\"alternative-text\"] = {\n    build: function (state, target) {\n        if (this.tokentype === CSL.SINGLETON) {\n            // do stuff\n            var func = function(state, Item) {\n                var Item = state.refetchItem(Item.id);\n                CSL.getCite.call(state, Item);\n            };\n            this.execs.push(func);\n        }\n        target.push(this);\n    }\n};\n\n\n\n/*global CSL: true */\n\nCSL.NameOutput = function(state, Item, item) {\n    this.debug = false;\n    this.state = state;\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(1)\");\n    }\n    //SNIP-END\n    this.Item = Item;\n    this.item = item;\n    this.nameset_base = 0;\n    this.etal_spec = {};\n    this._first_creator_variable = false;\n    this._please_chop = false;\n};\n\nCSL.NameOutput.prototype.init = function (names) {\n    this.requireMatch = names.requireMatch;\n    if (this.state.tmp.term_predecessor) {\n        this.state.tmp.subsequent_author_substitute_ok = false;\n    }\n    if (this.nameset_offset) {\n        this.nameset_base = this.nameset_base + this.nameset_offset;\n    }\n    this.nameset_offset = 0;\n    this.names = names;\n    this.variables = names.variables;\n\n    this.state.tmp.value = [];\n    this.state.tmp.rendered_name = [];\n    this.state.tmp.label_blob = false;\n    this.state.tmp.etal_node = false;\n    this.state.tmp.etal_term = false;\n    for (var i = 0, ilen = this.variables.length; i < ilen; i += 1) {\n        if (this.Item[this.variables[i]] && this.Item[this.variables[i]].length) {\n            this.state.tmp.value = this.state.tmp.value.concat(this.Item[this.variables[i]]);\n        }\n    }\n    this[\"et-al\"] = undefined;\n    // REMOVE THIS\n    this[\"with\"] = undefined;\n\n    this.name = undefined;\n    // long, long-with-short, short\n    this.institutionpart = {};\n    // family, given\n    //this.namepart = {};\n    // before, after\n    //this.label = {};\n\n    this.state.tmp.group_context.tip.variable_attempt = true;\n\n    this.labelVariable = this.variables[0];\n\n    if (!this.state.tmp.value.length) {\n        return;\n    }\n\n    // Abort and proceed to the next substitution if a match is required,\n    // two variables are called, and they do not match.\n    var checkCommonTerm = this.checkCommonAuthor(this.requireMatch);\n    if (checkCommonTerm) {\n        this.state.tmp.can_substitute.pop();\n        this.state.tmp.can_substitute.push(true);\n        //this.state.tmp.group_context.mystack[this.state.tmp.group_context.mystack.length-1].variable_success = false;\n        for (var i in this.variables) {\n            var idx = this.state.tmp.done_vars.indexOf(this.variables[i]);\n            if (idx > -1) {\n                this.state.tmp.done_vars = this.state.tmp.done_vars.slice(0, idx).concat(this.state.tmp.done_vars.slice(i+1));\n            }\n        }\n        this.state.tmp.common_term_match_fail = true;\n        this.variables = [];\n    }\n};\n\n\nCSL.NameOutput.prototype.reinit = function (names, labelVariable) {\n    this.requireMatch = names.requireMatch;\n    this.labelVariable = labelVariable;\n\n    if (this.state.tmp.can_substitute.value()) {\n        this.nameset_offset = 0;\n        // What-all should be carried across from the subsidiary\n        // names node, and on what conditions? For each attribute,\n        // and decoration, is it an override, or is it additive?\n        this.variables = names.variables;\n        \n        // Not sure why this is necessary. Guards against a memory leak perhaps?\n        var oldval = this.state.tmp.value.slice();\n        this.state.tmp.value = [];\n\n        for (var i = 0, ilen = this.variables.length; i < ilen; i += 1) {\n            if (this.Item[this.variables[i]] && this.Item[this.variables[i]].length) {\n                this.state.tmp.value = this.state.tmp.value.concat(this.Item[this.variables[i]]);\n            }\n        }\n        if (this.state.tmp.value.length) {\n            this.state.tmp.can_substitute.replace(false, CSL.LITERAL);\n        }\n\n        this.state.tmp.value = oldval;\n\n    }\n    // Abort and proceed to the next substitution if a match is required,\n    // two variables are called, and they do not match.\n    var checkCommonTerm = this.checkCommonAuthor(this.requireMatch);\n    if (checkCommonTerm) {\n        this.state.tmp.can_substitute.pop();\n        this.state.tmp.can_substitute.push(true);\n        for (var i in this.variables) {\n            var idx = this.state.tmp.done_vars.indexOf(this.variables[i]);\n            if (idx > -1) {\n                this.state.tmp.done_vars = this.state.tmp.done_vars.slice(0, idx).concat(this.state.tmp.done_vars.slice(i+1));\n            }\n        }\n        this.variables = [];\n    }\n};\n\nCSL.NameOutput.prototype.outputNames = function () {\n    var i, ilen;\n    var variables = this.variables;\n    if (this.institution.and) {\n        if (!this.institution.and.single.blobs || !this.institution.and.single.blobs.length) {\n            this.institution.and.single.blobs = this.name.and.single.blobs;\n        }\n        if (!this.institution.and.multiple.blobs || !this.institution.and.multiple.blobs.length) {\n            this.institution.and.multiple.blobs = this.name.and.multiple.blobs;\n        }\n    }\n\n    this.variable_offset = {};\n    if (this.family) {\n        this.family_decor = CSL.Util.cloneToken(this.family);\n        this.family_decor.strings.prefix = \"\";\n        this.family_decor.strings.suffix = \"\";\n        // Sets text-case value (text-case=\"title\" is suppressed for items\n        // non-English with non-English value in Item.language)\n        for (i = 0, ilen = this.family.execs.length; i < ilen; i += 1) {\n            this.family.execs[i].call(this.family_decor, this.state, this.Item);\n        }\n    } else {\n        this.family_decor = false;\n    }\n\n    if (this.given) {\n        this.given_decor = CSL.Util.cloneToken(this.given);\n        this.given_decor.strings.prefix = \"\";\n        this.given_decor.strings.suffix = \"\";\n        // Sets text-case value (text-case=\"title\" is suppressed for items\n        // non-English with non-English value in Item.language)\n        for (i = 0, ilen = this.given.execs.length; i < ilen; i += 1) {\n            this.given.execs[i].call(this.given_decor, this.state, this.Item);\n        }\n    } else {\n        this.given_decor = false;\n    }\n\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(2)\");\n    }\n    //SNIP-END\n    // util_names_etalconfig.js\n    this.getEtAlConfig();\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(3)\");\n    }\n    //SNIP-END\n    // util_names_divide.js\n    this.divideAndTransliterateNames();\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(4)\");\n    }\n    //SNIP-END\n    // util_names_truncate.js\n\n    this.truncatePersonalNameLists();\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(5)\");\n    }\n    //SNIP-END\n\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(6)\");\n    }\n    //SNIP-END\n    // util_names_disambig.js\n    this.disambigNames();\n\n    // util_names_constraints.js\n    this.constrainNames();\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(7)\");\n    }\n    //SNIP-END\n    // form=\"count\"\n    if (this.name.strings.form === \"count\") {\n        if (this.state.tmp.extension || this.names_count != 0) {\n            this.state.output.append(this.names_count, \"empty\");\n            this.state.tmp.group_context.tip.variable_success = true;\n        }\n        return;\n    }\n\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(8)\");\n    }\n    //SNIP-END\n    this.setEtAlParameters();\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(9)\");\n    }\n    //SNIP-END\n    this.setCommonTerm(this.requireMatch);\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(10)\");\n    }\n    //SNIP-END\n    this.renderAllNames();\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(11)\");\n    }\n    //SNIP-END\n    var blob_list = [];\n    for (i = 0, ilen = variables.length; i < ilen; i += 1) {\n        var v = variables[i];\n        var institution_sets = [];\n        var institutions = false;\n        var varblob = null;\n        if (!this.state.opt.development_extensions.spoof_institutional_affiliations) {\n            varblob = this._join([this.freeters[v]], \"\");\n        } else {\n            //SNIP-START\n            if (this.debug) {\n                this.state.sys.print(\"(11a)\");\n            }\n            //SNIP-END\n            for (var j = 0, jlen = this.institutions[v].length; j < jlen; j += 1) {\n                institution_sets.push(this.joinPersonsAndInstitutions([this.persons[v][j], this.institutions[v][j]]));\n            }\n            //SNIP-START\n            if (this.debug) {\n                this.state.sys.print(\"(11b)\");\n            }\n            //SNIP-END\n            if (this.institutions[v].length) {\n                var pos = this.nameset_base + this.variable_offset[v];\n                if (this.freeters[v].length) {\n                    pos += 1;\n                }\n                institutions = this.joinInstitutionSets(institution_sets, pos);\n            }\n            //SNIP-START\n            if (this.debug) {\n                this.state.sys.print(\"(11c)\");\n            }\n            //SNIP-END\n            var varblob = this.joinFreetersAndInstitutionSets([this.freeters[v], institutions]);\n            //SNIP-START\n            if (this.debug) {\n                this.state.sys.print(\"(11d)\");\n            }\n            //SNIP-END\n        }\n        if (varblob) {\n            // Apply labels, if any\n            if (!this.state.tmp.extension) {\n                varblob = this._applyLabels(varblob, v);\n            }\n            blob_list.push(varblob);\n        }\n        //SNIP-START\n        if (this.debug) {\n            this.state.sys.print(\"(11e)\");\n        }\n        //SNIP-END\n        if (this.common_term) {\n            break;\n        }\n    }\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(12)\");\n    }\n    //SNIP-END\n    this.state.output.openLevel(\"empty\");\n    this.state.output.current.value().strings.delimiter = this.state.inheritOpt(this.names, \"delimiter\", \"names-delimiter\");\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(13)\");\n    }\n    //SNIP-END\n    for (i = 0, ilen = blob_list.length; i < ilen; i += 1) {\n        // notSerious\n        this.state.output.append(blob_list[i], \"literal\", true);\n    }\n    if (!this.state.tmp.just_looking && blob_list.length > 0) {\n        this.state.tmp.probably_rendered_something = true;\n    }\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(14)\");\n    }\n    //SNIP-END\n    this.state.output.closeLevel(\"empty\");\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(15)\");\n    }\n    //SNIP-END\n    var blob = this.state.output.pop();\n    this.state.tmp.name_node.top = blob;\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(16)\");\n    }\n    //SNIP-END\n\n    // Append will drop the names on the floor here if suppress-me is\n    // set on element_trace.\n    // Need to rescue the value for collapse comparison.\n    var namesToken = CSL.Util.cloneToken(this.names);\n    if (this.state.tmp.group_context.tip.condition) {\n        CSL.UPDATE_GROUP_CONTEXT_CONDITION(this.state, this.names.strings.prefix, null, this.names);\n    }\n    this.state.output.append(blob, namesToken);\n    if (this.state.tmp.term_predecessor_name) {\n        this.state.tmp.term_predecessor = true;\n    }\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(17)\");\n    }\n    //SNIP-END\n    // Also used in CSL.Util.substituteEnd (which could do with\n    // some cleanup at this writing).\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(18)\");\n    }\n    //SNIP-END\n    if (variables[0] !== \"authority\") {\n        // Just grab the string values in the name\n        var name_node_string = [];\n        var nameobjs = this.Item[variables[0]];\n        if (nameobjs) {\n            for (var i = 0, ilen = nameobjs.length; i < ilen; i += 1) {\n                var substring = CSL.Util.Names.getRawName(nameobjs[i]);\n                if (substring) {\n                    name_node_string.push(substring);\n                }\n            }\n        }\n        name_node_string = name_node_string.join(\", \");\n        if (name_node_string) {\n            this.state.tmp.name_node.string = name_node_string;\n        }\n    }\n    // for classic support\n    // This may be more convoluted than it needs to be. Or maybe not.\n    //\n    // Check for classic abbreviation\n    //\n    // If found, then (1) suppress title rendering, (2) replace the node\n    // with the abbreviation output [and (3) do not run this._collapseAuthor() ?]\n    if (this.state.tmp.name_node.string && !this.state.tmp.first_name_string) {\n        this.state.tmp.first_name_string = this.state.tmp.name_node.string;\n    }\n    if (\"classic\" === this.Item.type) {\n        if (this.state.tmp.first_name_string) {\n            var author_title = [];\n            author_title.push(this.state.tmp.first_name_string);\n            if (this.Item.title) {\n                author_title.push(this.Item.title);\n            }\n            author_title = author_title.join(\", \");\n            if (author_title && this.state.sys.getAbbreviation) {\n                if (this.state.sys.normalizeAbbrevsKey) {\n                    author_title = this.state.sys.normalizeAbbrevsKey(\"classic\", author_title);\n                }\n                this.state.transform.loadAbbreviation(\"default\", \"classic\", author_title, this.Item.language);\n                if (this.state.transform.abbrevs[\"default\"].classic[author_title]) {\n                    this.state.tmp.done_vars.push(\"title\");\n                    this.state.output.append(this.state.transform.abbrevs[\"default\"].classic[author_title], \"empty\", true);\n                    blob = this.state.output.pop();\n\t\t\t\t    this.state.tmp.name_node.top.blobs.pop();\n                    this.state.tmp.name_node.top.blobs.push(blob);\n                }\n            }\n        }\n    }\n\n    // Let's try something clever here.\n    this._collapseAuthor();\n\n    // For name_SubstituteOnNamesSpanNamesSpanFail\n    this.variables = [];\n    \n    // Reset stop-last after rendering\n    this.state.tmp.authority_stop_last = 0;\n\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"(19)\");\n    }\n    //SNIP-END\n};\n\nCSL.NameOutput.prototype._applyLabels = function (blob, v) {\n    var txt;\n    if (!this.label || !this.label[this.labelVariable]) {\n        return blob;\n    }\n    var plural = 0;\n    var num = this.freeters_count[v] + this.institutions_count[v];\n    if (num > 1) {\n        plural = 1;\n    } else {\n        for (var i = 0, ilen = this.persons[v].length; i < ilen; i += 1) {\n            num += this.persons_count[v][i];\n        }\n        if (num > 1) {\n            plural = 1;\n        }\n    }\n    // Some code duplication here, should be factored out.\n    if (this.label[this.labelVariable].before) {\n        if (\"number\" === typeof this.label[this.labelVariable].before.strings.plural) {\n            plural = this.label[this.labelVariable].before.strings.plural;\n        }\n        txt = this._buildLabel(v, plural, \"before\", this.labelVariable);\n        this.state.output.openLevel(\"empty\");\n        this.state.output.append(txt, this.label[this.labelVariable].before, true);\n        this.state.output.append(blob, \"literal\", true);\n        this.state.output.closeLevel(\"empty\");\n        blob = this.state.output.pop();\n    } else if (this.label[this.labelVariable].after) {\n        if (\"number\" === typeof this.label[this.labelVariable].after.strings.plural) {\n            plural = this.label[this.labelVariable].after.strings.plural;\n        }\n        txt = this._buildLabel(v, plural, \"after\", this.labelVariable);\n        this.state.output.openLevel(\"empty\");\n        this.state.output.append(blob, \"literal\", true);\n        this.state.output.append(txt, this.label[this.labelVariable].after, true);\n        this.state.tmp.label_blob = this.state.output.pop();\n        this.state.output.append(this.state.tmp.label_blob,\"literal\",true);\n        this.state.output.closeLevel(\"empty\");\n        blob = this.state.output.pop();\n    }\n    return blob;\n};\n\nCSL.NameOutput.prototype._buildLabel = function (term, plural, position, v) {\n    if (this.common_term) {\n        term = this.common_term;\n    }\n\n    var ret = false;\n    var node = this.label[v][position];\n    if (node) {\n        ret = CSL.castLabel(this.state, node, term, plural, CSL.TOLERANT);\n    }\n    return ret;\n};\n\n\nCSL.NameOutput.prototype._collapseAuthor = function () {\n    var myqueue, mystr, oldchars;\n    // collapse can be undefined, an array of length zero, and probably\n    // other things ... ugh.\n    if (this.state.tmp.name_node.top.blobs.length === 0) {\n        return;\n    }\n    if (this.nameset_base === 0 && this.Item[this.variables[0]] && !this._first_creator_variable) {\n        this._first_creator_variable = this.variables[0];\n    }\n    if ((this.state[this.state.tmp.area].opt.collapse\n            && this.state[this.state.tmp.area].opt.collapse.length)\n        || (this.state[this.state.tmp.area].opt.cite_group_delimiter \n            && this.state[this.state.tmp.area].opt.cite_group_delimiter.length)) {\n\n        if (this.state.tmp.authorstring_request) {\n            // Avoid running this on every call to getAmbiguousCite()?\n            mystr = \"\";\n            myqueue = this.state.tmp.name_node.top.blobs.slice(-1)[0].blobs;\n            oldchars = this.state.tmp.offset_characters;\n            if (myqueue) {\n                mystr = this.state.output.string(this.state, myqueue, false);\n            }\n            // Avoid side-effects on character counting: we're only interested\n            // in the final rendering.\n            this.state.tmp.offset_characters = oldchars;\n            this.state.registry.authorstrings[this.Item.id] = mystr;\n        } else if (!this.state.tmp.just_looking\n                   && !this.state.tmp.suppress_decorations && ((this.state[this.state.tmp.area].opt.collapse && this.state[this.state.tmp.area].opt.collapse.length) || this.state[this.state.tmp.area].opt.cite_group_delimiter && this.state[this.state.tmp.area].opt.cite_group_delimiter)) {\n            // XX1 this.state.sys.print(\"RENDER: \"+this.Item.id);\n            mystr = \"\";\n            myqueue = this.state.tmp.name_node.top.blobs.slice(-1)[0].blobs;\n            oldchars = this.state.tmp.offset_characters;\n            if (myqueue) {\n                mystr = this.state.output.string(this.state, myqueue, false);\n            }\n            if (mystr === this.state.tmp.last_primary_names_string) {\n                if (this.item[\"suppress-author\"] || (this.state[this.state.tmp.area].opt.collapse && this.state[this.state.tmp.area].opt.collapse.length)) {\n                    // XX1 this.state.sys.print(\"    CUT!\");\n                    this.state.tmp.name_node.top.blobs.pop();\n                    this.state.tmp.name_node.children = [];\n                    // If popped, avoid side-effects on character counting: we're only interested\n                    // in things that actually render.\n                    this.state.tmp.offset_characters = oldchars;\n                }\n                // Needed\n                if (this.state[this.state.tmp.area].opt.cite_group_delimiter && this.state[this.state.tmp.area].opt.cite_group_delimiter) {\n                    this.state.tmp.use_cite_group_delimiter = true;\n                }\n            } else {\n                // XX1 this.state.sys.print(\"remembering: \"+mystr);\n                this.state.tmp.last_primary_names_string = mystr;\n                // XXXXX A little more precision would be nice.\n                // This will clobber variable=\"author editor\" as well as variable=\"author\".\n\n                if (this.variables.indexOf(this._first_creator_variable) > -1 && this.item && this.item[\"suppress-author\"] && this.Item.type !== \"legal_case\") {\n                    this.state.tmp.name_node.top.blobs.pop();\n                    this.state.tmp.name_node.children = [];\n                    // If popped, avoid side-effects on character counting: we're only interested\n                    // in things that actually render.\n                    this.state.tmp.offset_characters = oldchars;\n\n                    // A wild guess, but will usually be correct\n                    this.state.tmp.term_predecessor = false;\n                }\n                // Arcane and probably unnecessarily complicated?\n                this.state.tmp.have_collapsed = false;\n                // Needed\n                if (this.state[this.state.tmp.area].opt.cite_group_delimiter && this.state[this.state.tmp.area].opt.cite_group_delimiter) {\n                    this.state.tmp.use_cite_group_delimiter = false;\n                }\n            }\n        }\n    }\n};\n\n/*\nCSL.NameOutput.prototype.suppressNames = function() {\n    suppress_condition = suppress_min && display_names.length >= suppress_min;\n    if (suppress_condition) {\n        continue;\n    }\n}\n*/\n\n/*global CSL: true */\n\nCSL.NameOutput.prototype.isPerson = function (value) {\n    if (value.literal\n        || (!value.given && value.family && value.isInstitution)) {\n        \n        return false;\n    } else {\n        return true;\n    }\n};\n\n/*global CSL: true */\n\nCSL.NameOutput.prototype.truncatePersonalNameLists = function () {\n    var v, i, ilen, j, jlen, chopvar, values;\n    // XXX Before truncation, make a note of the original number\n    // of names, for use in et-al evaluation.\n    this.freeters_count = {};\n    this.persons_count = {};\n    this.institutions_count = {};\n    // By key is okay here, as we don't care about sequence.\n    for (v in this.freeters) {\n        if (this.freeters.hasOwnProperty(v)) {\n            this.freeters_count[v] = this.freeters[v].length;\n            this.freeters[v] = this._truncateNameList(this.freeters, v);\n        }\n    }\n\n    for (v in this.persons) {\n        if (this.persons.hasOwnProperty(v)) {\n            this.institutions_count[v] = this.institutions[v].length;\n            this._truncateNameList(this.institutions, v);\n            this.persons[v] = this.persons[v].slice(0, this.institutions[v].length);\n            this.persons_count[v] = [];\n            for (j = 0, jlen = this.persons[v].length; j < jlen; j += 1) {\n                this.persons_count[v][j] = this.persons[v][j].length;\n                this.persons[v][j] = this._truncateNameList(this.persons, v, j);\n            }\n        }\n    }\n    if (this.state.opt.development_extensions.etal_min_etal_usefirst_hack\n        && this.etal_min === 1 && this.etal_use_first === 1 \n        && !(this.state.tmp.extension\n             || this.state.tmp.just_looking)) {\n        chopvar = v;\n    } else {\n        chopvar = false;\n    }\n    if (chopvar || this._please_chop) {\n        for (i = 0, ilen = this.variables.length; i < ilen; i += 1) {\n            v = this.variables[i];\n            if (this.freeters[v].length) {\n                if (this._please_chop === v) {\n                    this.freeters[v] = this.freeters[v].slice(1);\n                    this.freeters_count[v] += -1;\n                    this._please_chop = false;\n                } else if (chopvar && !this._please_chop) {\n                    this.freeters[v] = this.freeters[v].slice(0, 1);\n                    this.freeters_count[v] = 1;\n                    this.institutions[v] = [];\n                    this.persons[v] = [];\n                    this._please_chop = chopvar;\n                }\n            }\n            for (var j=0,jlen = this.persons[v].length;j<jlen;j++) {\n                if (this.persons[v][j].length) {\n                    if (this._please_chop === v) {\n                        this.persons[v][j] = this.persons[v][j].slice(1);\n                        this.persons_count[v][j] += -1;\n                        this._please_chop = false;\n                        break;\n                    } else if (chopvar && !this._please_chop) {\n                        this.freeters[v] = this.persons[v][j].slice(0, 1);\n                        this.freeters_count[v] = 1;\n                        this.institutions[v] = [];\n                        this.persons[v] = [];\n                        values = [];\n                        this._please_chop = chopvar;\n                        break;\n                    }\n                }\n            }\n            if (this.institutions[v].length) {\n                if (this._please_chop === v) {\n                    this.institutions[v] = this.institutions[v].slice(1);\n                    this.institutions_count[v] += -1;\n                    this._please_chop = false;\n                } else if (chopvar && !this._please_chop) {\n                    this.institutions[v] = this.institutions[v].slice(0, 1);\n                    this.institutions_count[v] = 1;\n                    values = [];\n                    this._please_chop = chopvar;\n                }\n            }\n        }\n    }\n\n    // Transliteration and abbreviation mapping\n\n    // Hmm. This could produce three lists for each nameset:\n    //   - primary (transformed in place)\n    //   - secondary\n    //   - tertiary\n    // with items that produce no result in the secondary and tertiary\n    // transforms set to false. Maybe.\n\n    // Actually that would be insane, so forget it.\n    // What we need is to add suitable parameters to getName(), and merge\n    // the single-name-level operations below into that function. Then the\n    // operation can be applied in util_names_render.js, and the logic\n    // becomes very similar to what we already have running in util_transform.js.\n\n/*\n    for (v in this.freeters) {\n        this._transformNameset(this.freeters[v]);\n    }\n    for (v in this.persons) {\n        for (i = 0, ilen = this.persons[v].length; i < ilen; i += 1) {\n            this._transformNameset(this.persons[v][i]);\n        }\n        this._transformNameset(this.institutions[v]);\n    }\n*/\n\n    // Could also be factored out to a separate function for clarity.\n    // ???? XXX Does this belong?\n    for (i = 0, ilen = this.variables.length; i < ilen; i += 1) {\n        if (this.institutions[v].length) {\n            this.nameset_offset += 1;\n        }\n        for (var j=0,jlen=this.persons[v].length;j<jlen;j++) {\n            if (this.persons[v][j].length) {\n                this.nameset_offset += 1;\n            }\n            // this.institutions[v][i] = this._splitInstitution(this.institutions[v][i], v, i);\n        }\n    }\n};\n\nCSL.NameOutput.prototype._truncateNameList = function (container, variable, index) {\n    var lst;\n    if (\"undefined\" === typeof index) {\n        lst = container[variable];\n    } else {\n        lst = container[variable][index];\n    }\n    if (this.state[this.state[this.state.tmp.area].root].opt.max_number_of_names \n        && lst.length > 50 \n        && lst.length > (this.state[this.state[this.state.tmp.area].root].opt.max_number_of_names + 2)) {\n\n        // Preserve the last name in the list, in case we're rendering with a PI ellipsis (et-al-use-last)\n        var limit = this.state[this.state[this.state.tmp.area].root].opt.max_number_of_names;\n        lst = lst.slice(0, limit+1).concat(lst.slice(-1));\n    }\n    return lst;\n};\n\n\n/*global CSL: true */\n\nCSL.NameOutput.prototype.divideAndTransliterateNames = function () {\n    var i, ilen, j, jlen;\n    var Item = this.Item;\n    var variables = this.variables;\n    this.varnames = variables.slice();\n    this.freeters = {};\n    this.persons = {};\n    this.institutions = {};\n    for (i = 0, ilen = variables.length; i < ilen; i += 1) {\n        var v = variables[i];\n        this.variable_offset[v] = this.nameset_offset;\n        var values = this._normalizeVariableValue(Item, v);\n        if (this.name.strings[\"suppress-min\"] && values.length >= this.name.strings[\"suppress-min\"]) {\n            values = [];\n        }\n        if (this.name.strings[\"suppress-max\"] && values.length <= this.name.strings[\"suppress-max\"]) {\n            values = [];\n        }\n        this._getFreeters(v, values);\n        this._getPersonsAndInstitutions(v, values);\n        if (this.state.opt.development_extensions.spoof_institutional_affiliations) {\n            if (this.name.strings[\"suppress-min\"] === 0) {\n                this.freeters[v] = [];\n                for (j = 0, jlen = this.persons[v].length; j < jlen; j += 1) {\n                    this.persons[v][j] = [];\n                }\n            } else if (this.institution.strings[\"suppress-min\"] === 0) {\n                this.institutions[v] = [];\n                this.freeters[v] = this.freeters[v].concat(this.persons[v]);\n                for (j = 0, jlen = this.persons[v].length; j < jlen; j += 1) {\n                    for (var k = 0, klen = this.persons[v][j].length; k < klen; k += 1) {\n                        this.freeters[v].push(this.persons[v][j][k]);\n                    }\n                }\n                this.persons[v] = [];\n            }\n        }\n    }\n};\n\nCSL.NameOutput.prototype._normalizeVariableValue = function (Item, variable) {\n    var names;\n    if (\"string\" === typeof Item[variable] || \"number\" === typeof Item[variable]) {\n        CSL.debug(\"name variable \\\"\" + variable + \"\\\" is string or number, not array. Attempting to fix.\");\n        names = [{literal: Item[variable] + \"\"}];\n    } else if (!Item[variable]) {\n        names = [];\n    } else if (\"number\" !== typeof Item[variable].length) {\n        CSL.debug(\"name variable \\\"\" + variable + \"\\\" is object, not array. Attempting to fix.\");\n        Item[variable] = [Item[variable]];\n        names = Item[variable].slice();\n    } else {\n        names = Item[variable].slice();\n    }\n    return names;\n};\n\nCSL.NameOutput.prototype._getFreeters = function (v, values) {\n    this.freeters[v] = [];\n    if (this.state.opt.development_extensions.spoof_institutional_affiliations) {\n        for (var i=values.length-1;i>-1;i--) {\n            if (this.isPerson(values[i])) {\n                var value = this._checkNickname(values.pop());\n                if (value) {\n                    this.freeters[v].push(value);\n                }\n            } else {\n                break;\n            }\n        }\n    } else {\n        for (var i=values.length-1;i>-1;i--) {\n            var value = values.pop();\n            if (this.isPerson(value)) {\n                var value = this._checkNickname(value);\n            }\n            this.freeters[v].push(value);\n        }\n    }\n    this.freeters[v].reverse();\n    if (this.freeters[v].length) {\n        this.nameset_offset += 1;\n    }\n};\n\nCSL.NameOutput.prototype._getPersonsAndInstitutions = function (v, values) {\n    this.persons[v] = [];\n    this.institutions[v] = [];\n    if (!this.state.opt.development_extensions.spoof_institutional_affiliations) {\n        return;\n    }\n    var persons = [];\n    var has_affiliates = false;\n    var first = true;\n    for (var i = values.length - 1; i > -1; i += -1) {\n        if (this.isPerson(values[i])) {\n            var value = this._checkNickname(values[i]);\n            if (value) {\n                persons.push(value);\n            }\n        } else {\n            has_affiliates = true;\n            this.institutions[v].push(values[i]);\n            if (!first) {\n                persons.reverse();\n                this.persons[v].push(persons);\n                persons = [];\n            }\n            first = false;\n        }\n    }\n    if (has_affiliates) {\n        persons.reverse();\n        this.persons[v].push(persons);\n        this.persons[v].reverse();\n        this.institutions[v].reverse();\n    }\n};\n\nCSL.NameOutput.prototype._clearValues = function (values) {\n    for (var i = values.length - 1; i > -1; i += -1) {\n        values.pop();\n    }\n};\n\nCSL.NameOutput.prototype._checkNickname = function (name) {\n    if ([\"interview\", \"personal_communication\"].indexOf(this.Item.type) > -1) {\n        var author = \"\";\n        author = CSL.Util.Names.getRawName(name);\n        if (author && this.state.sys.getAbbreviation && !(this.item && this.item[\"suppress-author\"])) {\n            var normalizedKey = author;\n            if (this.state.sys.normalizeAbbrevsKey) {\n                // The first argument does not have to be the exact variable name.\n                normalizedKey = this.state.sys.normalizeAbbrevsKey(\"author\", author);\n            }\n            this.state.transform.loadAbbreviation(\"default\", \"nickname\", normalizedKey, this.Item.language);\n            // XXX Why does this have to happen here?\n            var myLocalName = this.state.transform.abbrevs[\"default\"].nickname[normalizedKey];\n            if (myLocalName) {\n                if (myLocalName === \"!here>>>\") {\n                    name = false;\n                } else {\n                    name = {family:myLocalName,given:''};\n                }\n            }\n        }\n    }\n    return name;\n};\n\n/*global CSL: true */\n\nCSL.NameOutput.prototype._purgeEmptyBlobs = function (blobs) {\n    for (var i = blobs.length - 1; i > -1; i += -1) {\n        if (!blobs[i] || blobs[i].length === 0 || !blobs[i].blobs.length) {\n            blobs = blobs.slice(0, i).concat(blobs.slice(i + 1));\n        }\n    }\n    return blobs;\n};\n\nCSL.NameOutput.prototype.joinPersons = function (blobs, pos, j, tokenname) {\n    var ret;\n    blobs = this._purgeEmptyBlobs(blobs);\n    if (!tokenname) {\n        tokenname = \"name\";\n    }\n    if (\"undefined\" === typeof j) {\n        if (this.etal_spec[pos].freeters === 1) {\n           ret = this._joinEtAl(blobs);\n        } else if (this.etal_spec[pos].freeters === 2) {\n            ret = this._joinEllipsis(blobs);\n        } else if (!this.state.tmp.sort_key_flag) {\n            ret = this._joinAnd(blobs);\n        } else {\n            ret = this._join(blobs, this.state.inheritOpt(this.name, \"delimiter\", \"name-delimiter\", \", \"));\n        }\n    } else {\n        if (this.etal_spec[pos].persons[j] === 1) {\n            ret = this._joinEtAl(blobs);\n        } else if (this.etal_spec[pos].persons[j] === 2) {\n            ret = this._joinEllipsis(blobs);\n        } else if (!this.state.tmp.sort_key_flag) {\n            ret = this._joinAnd(blobs);\n        } else {\n            ret = this._join(blobs, this.state.inheritOpt(this.name, \"delimiter\", \"name-delimiter\", \", \"));\n        }\n    }\n    return ret;\n};\n\n\nCSL.NameOutput.prototype.joinInstitutionSets = function (blobs, pos) {\n    var ret;\n    blobs = this._purgeEmptyBlobs(blobs);\n    if (this.etal_spec[pos].institutions === 1) {\n        ret = this._joinEtAl(blobs, \"institution\");\n    } else if (this.etal_spec[pos].institutions === 2) {\n        ret = this._joinEllipsis(blobs, \"institution\");\n    } else {\n        ret = this._joinAnd(blobs);\n    }\n    return ret;\n};\n\n\nCSL.NameOutput.prototype.joinPersonsAndInstitutions = function (blobs) {\n    //\n    blobs = this._purgeEmptyBlobs(blobs);\n    var ret = this._join(blobs, this.state.tmp.name_delimiter);\n    ret.isInstitution = true;\n    return ret;\n};\n\n// LEGACY\n// This should go away eventually\nCSL.NameOutput.prototype.joinFreetersAndInstitutionSets = function (blobs) {\n    // Nothing, one or two, never more\n    blobs = this._purgeEmptyBlobs(blobs);\n    var ret = this._join(blobs, \"[never here]\", this[\"with\"].single, this[\"with\"].multiple);\n    //var ret = this._join(blobs, \"\");\n    return ret;\n};\n\nCSL.NameOutput.prototype._getAfterInvertedName = function(blobs, delimiter, finalJoin) {\n    if (finalJoin && blobs.length > 1) {\n        if (this.state.inheritOpt(this.name, \"delimiter-precedes-last\") === \"after-inverted-name\") {\n            var prevBlob = blobs[blobs.length - 2];\n            if (prevBlob.blobs.length > 0 && prevBlob.blobs[0].isInverted) {\n                finalJoin.strings.prefix = delimiter;\n            }\n        }\n    }\n    return finalJoin;\n}\n\nCSL.NameOutput.prototype._getAndJoin = function (blobs, delimiter) {\n    var finalJoin = false;\n    if (blobs.length > 1) {\n        var singleOrMultiple = \"single\";\n        if (blobs.length > 2) {\n            singleOrMultiple = \"multiple\";\n        }\n        if (blobs[blobs.length - 1].isInstitution) {\n            finalJoin = this.institution.and[singleOrMultiple];\n        } else {\n            finalJoin = this.name.and[singleOrMultiple];\n        }\n        // finalJoin = new CSL.Blob(finalJoin);\n        finalJoin = JSON.parse(JSON.stringify(finalJoin));\n        finalJoin = this._getAfterInvertedName(blobs, delimiter, finalJoin);\n    }\n    return finalJoin;\n};\n\nCSL.NameOutput.prototype._joinEtAl = function (blobs) {\n    var delimiter = this.state.inheritOpt(this.name, \"delimiter\", \"name-delimiter\", \", \");\n    var blob = this._join(blobs, delimiter);\n    \n    // notSerious\n    this.state.output.openLevel(this._getToken(\"name\"));\n    // Delimiter is applied from separately saved source in this case,\n    // for discriminate application of single and multiple joins.\n    this.state.output.current.value().strings.delimiter = \"\";\n    this.state.output.append(blob, \"literal\", true);\n    if (blobs.length > 1) {\n        this.state.output.append(this[\"et-al\"].multiple, \"literal\", true);\n    } else if (blobs.length === 1) {\n        this.state.output.append(this[\"et-al\"].single, \"literal\", true);\n    }\n    this.state.output.closeLevel();\n    return this.state.output.pop();\n};\n\n\nCSL.NameOutput.prototype._joinEllipsis = function (blobs) {\n    var delimiter = this.state.inheritOpt(this.name, \"delimiter\", \"name-delimiter\", \", \");\n    var finalJoin = false;\n    if (blobs.length > 1) {\n        var singleOrMultiple = \"single\";\n        if (blobs.length > 2) {\n            singleOrMultiple = \"multiple\";\n        }\n        finalJoin = JSON.parse(JSON.stringify(this.name.ellipsis[singleOrMultiple]));\n        finalJoin = this._getAfterInvertedName(blobs, delimiter , finalJoin);\n        \n    }\n    return this._join(blobs, delimiter, finalJoin);\n};\n\nCSL.NameOutput.prototype._joinAnd = function (blobs) {\n    var delimiter = this.state.inheritOpt(this.name, \"delimiter\", \"name-delimiter\", \", \");\n    var finalJoin = this._getAndJoin(blobs, delimiter);\n    return this._join(blobs, delimiter, finalJoin);\n};\n\n\nCSL.NameOutput.prototype._join = function (blobs, delimiter, finalJoin) {\n    var i, ilen;\n    if (!blobs) {\n        return false;\n    }\n    blobs = this._purgeEmptyBlobs(blobs);\n    if (!blobs.length) {\n        return false;\n    }\n    if (blobs.length > 1) {\n        if (blobs.length === 2) {\n            if (!finalJoin) {\n                blobs[0].strings.suffix += delimiter;\n            } else {\n                blobs = [blobs[0], finalJoin, blobs[1]];\n            }\n        } else {\n            var offset;\n            if (finalJoin) {\n                offset = 1;\n            } else {\n                offset = 0;\n            }\n            var blob = blobs.pop();\n            for (var i=0,ilen=blobs.length - offset;i<ilen;i++) {\n                blobs[i].strings.suffix += delimiter;\n            }\n            blobs.push(finalJoin);\n            blobs.push(blob);\n        }\n    }\n\n    //this.state.output.openLevel(this._getToken(tokenname));\n    this.state.output.openLevel();\n\n    //this.state.output.openLevel(this._getToken(\"empty\"));\n    // Delimiter is applied from separately saved source in this case,\n    // for discriminate application of single and multiple joins.\n    for (i = 0, ilen = blobs.length; i < ilen; i += 1) {\n        this.state.output.append(blobs[i], false, true);\n    }\n    this.state.output.closeLevel();\n    return this.state.output.pop();\n};\n\n\nCSL.NameOutput.prototype._getToken = function (tokenname) {\n    var token = this[tokenname];\n    if (tokenname === \"institution\") {\n        var newtoken = new CSL.Token();\n        // Which, hmm, is the same thing as \"empty\"\n        // Oh, well.\n        //newtoken.strings.prefix = token.prefix;\n        //newtoken.strings.suffix = token.suffix;\n        return newtoken;\n    }\n    return token;\n};\n\n/*global CSL: true */\n\nCSL.NameOutput.prototype.checkCommonAuthor = function(requireMatch) {\n    if (!requireMatch) {\n        return false;\n    }\n    var common_term = false;\n    if (this.variables.length === 2) {\n        var variables = this.variables;\n        var varnames = variables.slice();\n        varnames.sort();\n        common_term = varnames.join(\"\");\n    }\n    if (!common_term) {\n        return false;\n    }\n    var has_term = false;\n    if (this.state.locale[this.state.opt.lang].terms[common_term]) {\n        has_term = true;\n    }\n    if (!has_term) {\n        this.state.tmp.done_vars.push(this.variables[0]);\n        this.state.tmp.done_vars.push(this.variables[1]);\n        return false;\n    }\n    var firstSet = this.Item[this.variables[0]];\n    var secondSet = this.Item[this.variables[1]];\n    var perfectMatch = this._compareNamesets(firstSet, secondSet);\n    if (perfectMatch === true) {\n        this.state.tmp.done_vars.push(this.variables[0]);\n        this.state.tmp.done_vars.push(this.variables[1]);\n    }\n    // This may be counter-intuitive.\n    // This check controls whether we will fail on the this attempt at rendering\n    // and proceed with substitution. If the names match exactly (true), then\n    // we do *not* want to abort and continue with substitution.\n    return !perfectMatch;\n};\n\nCSL.NameOutput.prototype.setCommonTerm = function () {\n    var variables = this.variables;\n    var varnames = variables.slice();\n    varnames.sort();\n    this.common_term = varnames.join(\"\");\n    // When no varnames are on offer\n    if (!this.common_term) {\n        return;\n    }\n    var has_term = false;\n    if (this.label && this.label[this.variables[0]]) {\n        if (this.label[this.variables[0]].before) {\n            has_term = this.state.getTerm(this.common_term, this.label[this.variables[0]].before.strings.form, 0);\n        } else if (this.label[this.variables[0]].after) {\n            has_term = this.state.getTerm(this.common_term, this.label[this.variables[0]].after.strings.form, 0);\n        }\n     }\n\n    // When there is no common term\n    if (!this.state.locale[this.state.opt.lang].terms[this.common_term]\n        || !has_term\n        || this.variables.length < 2) {\n        this.common_term = false;\n        return;\n    }\n    var freeters_offset = 0;\n    for (var i = 0, ilen = this.variables.length - 1; i < ilen; i += 1) {\n        var v = this.variables[i];\n        var vv = this.variables[i + 1];\n        if (this.freeters[v].length || this.freeters[vv].length) {\n            if (this.etal_spec[v].freeters !== this.etal_spec[vv].freeters\n                || !this._compareNamesets(this.freeters[v], this.freeters[vv])) {\n                this.common_term = false;\n                return;\n            }\n            freeters_offset += 1;\n        }\n        if (this.persons[v].length !== this.persons[vv].length) {\n            this.common_term = false;\n            return;\n        }\n        for (var j = 0, jlen = this.persons[v].length; j < jlen; j += 1) {\n            if (this.etal_spec[v].persons[j] !== this.etal_spec[vv].persons[j]\n                || !this._compareNamesets(this.persons[v][j], this.persons[vv][j])) {\n                this.common_term = false;\n                return;\n            }\n        }\n    }\n};\n\nCSL.NameOutput.prototype._compareNamesets = function (base_nameset, nameset) {\n    if (!base_nameset || !nameset || base_nameset.length !== nameset.length) {\n        return false;\n    }\n    for (var i = 0, ilen = nameset.length; i < ilen; i += 1) {\n        for (var j = 0, jlen = CSL.NAME_PARTS.length; j < jlen; j += 1) {\n            var part = CSL.NAME_PARTS[j];\n            if (!base_nameset[i] || base_nameset[i][part] != nameset[i][part]) {\n                return false;\n            }\n        }\n    }\n    return true;\n};\n\n/*global CSL: true */\n\nCSL.NameOutput.prototype.constrainNames = function () {\n    // figure out how many names to include, in light of the disambig params\n    //\n    this.names_count = 0;\n    //var pos = 0;\n    var pos;\n    for (var i = 0, ilen = this.variables.length; i < ilen; i += 1) {\n        var v = this.variables[i];\n        pos = this.nameset_base + i;\n        // Constrain independent authors here\n        if (this.freeters[v].length) {\n            this.state.tmp.names_max.push(this.freeters[v].length, \"literal\");\n            this._imposeNameConstraints(this.freeters, this.freeters_count, v, pos);\n            this.names_count += this.freeters[v].length;\n        }\n\n        // Constrain institutions here\n        if (this.institutions[v].length) {\n            this.state.tmp.names_max.push(this.institutions[v].length, \"literal\");\n            this._imposeNameConstraints(this.institutions, this.institutions_count, v, pos);\n            this.persons[v] = this.persons[v].slice(0, this.institutions[v].length);\n            this.names_count += this.institutions[v].length;\n        }\n\n        for (var j = 0, jlen = this.persons[v].length; j < jlen; j += 1) {\n            // Constrain affiliated authors here\n            if (this.persons[v][j].length) {\n                this.state.tmp.names_max.push(this.persons[v][j].length, \"literal\");\n                this._imposeNameConstraints(this.persons[v], this.persons_count[v], j, pos);\n                this.names_count += this.persons[v][j].length;\n            }\n        }\n    }\n};\n\nCSL.NameOutput.prototype._imposeNameConstraints = function (lst, count, key, pos) {\n    // display_names starts as the original length of this list of names.\n    var display_names = lst[key];\n    var discretionary_names_length = this.state.tmp[\"et-al-min\"];\n    \n    // Mappings, to allow existing disambiguation machinery to\n    // remain untouched.\n    if (this.state.tmp.suppress_decorations) {\n        if (this.state.tmp.disambig_request && this.state.tmp.disambig_request.names[pos]) {\n            // Oh. Trouble.\n            // state.tmp.nameset_counter is the number of the nameset\n            // in the disambiguation try-sequence. Ouch.\n            discretionary_names_length = this.state.tmp.disambig_request.names[pos];\n        } else if (count[key] >= this.etal_min) {\n            discretionary_names_length = this.etal_use_first;\n        }\n    } else {\n        if (this.state.tmp.disambig_request \n            && this.state.tmp.disambig_request.names[pos] > this.etal_use_first) {\n\n            if (count[key] < this.etal_min) {\n                discretionary_names_length = count[key];\n            } else {\n                discretionary_names_length = this.state.tmp.disambig_request.names[pos];\n            }\n        } else if (count[key] >= this.etal_min) {\n            //discretionary_names_length = this.state.tmp[\"et-al-use-first\"];\n            discretionary_names_length = this.etal_use_first;\n        }\n        // XXXX: This is a workaround. Under some conditions.\n        // Where namesets disambiguate on one of the two names\n        // dropped here, it is possible for more than one\n        // in-text citation to be close (and indistinguishable)\n        // matches to a single bibliography entry.\n        //\n        // \n        if (this.etal_use_last && discretionary_names_length > (this.etal_min - 2)) {\n            discretionary_names_length = this.etal_min - 2;\n        }\n    }\n    var sane = this.etal_min >= this.etal_use_first;\n    var overlength = count[key] > discretionary_names_length;\n    // This var is used to control contextual join, and\n    // lies about the number of names when forceEtAl is true,\n    // unless normalized.\n    if (discretionary_names_length > count[key]) {\n\n        // Use actual truncated list length, to avoid overrun.\n        discretionary_names_length = display_names.length;\n    }\n    // forceEtAl is relevant when the author list is\n    // truncated to eliminate clutter.\n    if (sane && overlength) {\n        if (this.etal_use_last) {\n            lst[key] = display_names.slice(0, discretionary_names_length).concat(display_names.slice(-1));\n        } else {\n            lst[key] = display_names.slice(0, discretionary_names_length);\n        }\n    }\n    this.state.tmp.disambig_settings.names[pos] = lst[key].length;\n    this.state.disambiguate.padBase(this.state.tmp.disambig_settings);\n    \n\n    // ???\n    //if (!this.state.tmp.disambig_request) {\n    //    this.state.tmp.disambig_settings.givens[pos] = [];\n    //}\n};\n\n// Disambiguate names (the number of names is controlled externally, by successive\n// runs of the processor).\n\n/*global CSL: true */\n\nCSL.NameOutput.prototype.disambigNames = function () {\n    var pos;\n    for (var i = 0, ilen = this.variables.length; i < ilen; i += 1) {\n        var v = this.variables[i];\n        pos = this.nameset_base + i;\n        if (this.freeters[v].length) {\n            this._runDisambigNames(this.freeters[v], pos);\n        }\n        // Is this even necessary???\n        if (this.institutions[v].length) {\n            if (\"undefined\" === typeof this.state.tmp.disambig_settings.givens[pos]) {\n                this.state.tmp.disambig_settings.givens[pos] = [];\n            }\n            for (var j=0,jlen=this.institutions[v].length;j<jlen;j+=1) {\n                if (\"undefined\" === typeof this.state.tmp.disambig_settings.givens[pos][j]) {\n                    this.state.tmp.disambig_settings.givens[pos].push(2);\n                }\n            }\n        }\n        for (var j = 0, jlen = this.persons[v].length; j < jlen; j += 1) {\n            if (this.persons[v][j].length) {\n                this._runDisambigNames(this.persons[v][j], pos);\n            }\n        }\n    }\n};\n\nCSL.NameOutput.prototype._runDisambigNames = function (lst, pos) {\n    var chk, myform, myinitials, param, i, ilen, paramx;\n    //if (this.state.tmp.root === \"bibliography\") {\n    //    return;\n    //}\n    for (i = 0, ilen = lst.length; i < ilen; i += 1) {\n        //\n        // register the name in the global names disambiguation\n        // registry\n\n        if (!lst[i].given && !lst[i].family) {\n            continue;\n        }\n\n        myinitials = this.state.inheritOpt(this.name, \"initialize-with\");\n        this.state.registry.namereg.addname(\"\" + this.Item.id, lst[i], i);\n        chk = this.state.tmp.disambig_settings.givens[pos];\n        if (\"undefined\" === typeof chk) {\n            // Holes can appear in the list, probably due to institutional\n            // names that this doesn't touch. Maybe. This fills them up.\n            for (var j = 0, jlen = pos + 1; j < jlen; j += 1) {\n                if (!this.state.tmp.disambig_settings.givens[j]) {\n                    this.state.tmp.disambig_settings.givens[j] = [];\n                }\n            }\n        }\n        chk = this.state.tmp.disambig_settings.givens[pos][i];\n        //if (\"undefined\" !== typeof chk && this.state.tmp.root === 'citation') {\n            //this.state.tmp.disambig_settings.givens[pos] = [];\n            //chk = undefined;\n        //}\n        if (\"undefined\" === typeof chk) {\n            myform = this.state.inheritOpt(this.name, \"form\", \"name-form\", \"long\");\n            param = this.state.registry.namereg.evalname(\"\" + this.Item.id, lst[i], i, 0, myform, myinitials);\n            this.state.tmp.disambig_settings.givens[pos].push(param);\n        }\n        //\n        // set the display mode default for givennames if required\n        myform = this.state.inheritOpt(this.name, \"form\", \"name-form\", \"long\");\n        paramx = this.state.registry.namereg.evalname(\"\" + this.Item.id, lst[i], i, 0, myform, myinitials);\n        // this.state.registry.namereg.evalname(\"\" + this.Item.id, lst[i], i, 0, myform, myinitials);\n        if (this.state.tmp.disambig_request) {\n            //\n            // fix a request for initials that makes no sense.\n            // can't do this in disambig, because the availability\n            // of initials is not a global parameter.\n            var val = this.state.tmp.disambig_settings.givens[pos][i];\n            // This is limited to by-cite disambiguation.\n            // 2012-09-13: added lst[i].given check to condition\n            if (val === 1 && \n                this.state.citation.opt[\"givenname-disambiguation-rule\"] === \"by-cite\" && \n                (\"undefined\" === typeof this.state.inheritOpt(this.name, \"initialize-with\")\n                 || \"undefined\" === typeof lst[i].given)) {\n                val = 2;\n            }\n            param = val;\n            // 2012-09-13: lst[i].given check protects against personal names\n            // that have no first name element. These were causing an infinite loop,\n            // this prevents that.\n            if (this.state.opt[\"disambiguate-add-givenname\"] && lst[i].given) {\n                param = this.state.registry.namereg.evalname(\"\" + this.Item.id, lst[i], i, param, this.state.inheritOpt(this.name, \"form\", \"name-form\", \"long\"), this.state.inheritOpt(this.name, \"initialize-with\"));\n            }\n        } else {\n            //\n            // it clicks.  here is where we will put the\n            // call to the names register, to get the floor value\n            // for an individual name.\n            //\n            param = paramx;\n        }\n        // Need to save off the settings based on subsequent\n        // form, when first cites are rendered.\n        if (!this.state.tmp.just_looking && this.item && this.item.position === CSL.POSITION_FIRST) {\n            if (paramx > param) {\n                param = paramx;\n            }\n        }\n        if (!this.state.tmp.sort_key_flag) {\n            this.state.tmp.disambig_settings.givens[pos][i] = param;\n            if (\"string\" === typeof myinitials\n                && (\"undefined\" === typeof this.name.strings[\"initialize\"]\n                    || true === this.name.strings[\"initialize\"])) {\n\n                this.state.tmp.disambig_settings.use_initials = true;\n            }\n        }\n    }\n    //this.state.registry.registry[this.Item.id].disambig.givens = this.state.tmp.disambig_settings.givens.slice();\n};\n\n/*global CSL: true */\n\nCSL.NameOutput.prototype.getEtAlConfig = function () {\n    var item = this.item;\n    this[\"et-al\"] = {};\n\n    this.state.output.append(this.etal_term, this.etal_style, true);\n    this[\"et-al\"].single = this.state.output.pop();\n    this[\"et-al\"].single.strings.suffix = this.etal_suffix;\n    this[\"et-al\"].single.strings.prefix = this.etal_prefix_single;\n    \n    this.state.output.append(this.etal_term, this.etal_style, true);\n    this[\"et-al\"].multiple = this.state.output.pop();\n    this[\"et-al\"].multiple.strings.suffix = this.etal_suffix;\n    this[\"et-al\"].multiple.strings.prefix = this.etal_prefix_multiple;\n\n    // Et-al style parameters (may be sidestepped by disambiguation\n    // in util_names_constraints.js)\n    if (\"undefined\" === typeof item) {\n        item = {};\n    }\n    //print(\"== getEtAlConfig() == \"+this.state.tmp.area);\n\n    if (item.position) {\n        if (this.state.inheritOpt(this.name, \"et-al-subsequent-min\")) {\n            // XX\n            this.etal_min = this.state.inheritOpt(this.name, \"et-al-subsequent-min\");\n        } else {\n            // XX\n            this.etal_min = this.state.inheritOpt(this.name, \"et-al-min\");\n        }\n        if (this.state.inheritOpt(this.name, \"et-al-subsequent-use-first\")) {\n            // XX\n            this.etal_use_first = this.state.inheritOpt(this.name, \"et-al-subsequent-use-first\");\n        } else {\n            // XX\n            this.etal_use_first = this.state.inheritOpt(this.name, \"et-al-use-first\");\n        }\n    } else {\n        if (this.state.tmp[\"et-al-min\"]) {\n            this.etal_min = this.state.tmp[\"et-al-min\"];\n        } else {\n            // XX\n            this.etal_min = this.state.inheritOpt(this.name, \"et-al-min\");\n        }\n        if (this.state.tmp[\"et-al-use-first\"]) {\n            this.etal_use_first = this.state.tmp[\"et-al-use-first\"];\n        } else {\n            // XX\n            this.etal_use_first = this.state.inheritOpt(this.name, \"et-al-use-first\");\n        }\n        if (\"boolean\" === typeof this.state.tmp[\"et-al-use-last\"]) {\n            //print(\"  etal_use_last from tmp: \"+this.state.tmp[\"et-al-use-last\"]);\n            this.etal_use_last = this.state.tmp[\"et-al-use-last\"];\n        } else {\n            //print(\"  etal_use_last from name: \"+this.name.strings[\"et-al-use-last\"]);\n            // XX\n            this.etal_use_last = this.state.inheritOpt(this.name, \"et-al-use-last\");\n        }\n        //print(\"  etal_use_last: \"+this.etal_use_last);\n    }\n    // Provided for use as the starting level for disambiguation.\n    if (!this.state.tmp[\"et-al-min\"]) {\n        this.state.tmp[\"et-al-min\"] = this.etal_min;\n    }\n};\n\n/*global CSL: true */\n\nCSL.NameOutput.prototype.setEtAlParameters = function () {\n    var i, ilen, j, jlen;\n    for (i = 0, ilen = this.variables.length; i < ilen; i += 1) {\n        var v = this.variables[i];\n        if (\"undefined\" === typeof this.etal_spec[v]) {\n            this.etal_spec[v] = {freeters:0,institutions:0,persons:[]};\n        }\n        this.etal_spec[this.nameset_base + i] = this.etal_spec[v];\n        if (this.freeters[v].length) {\n            this._setEtAlParameter(\"freeters\", v);\n        }\n        for (j = 0, jlen = this.persons[v].length; j < jlen; j += 1) {\n            if (\"undefined\" === typeof this.etal_spec[v][j]) {\n                this.etal_spec[v].persons[j] = 0;\n            }\n            this._setEtAlParameter(\"persons\", v, j);\n        }\n        if (this.institutions[v].length) {\n            this._setEtAlParameter(\"institutions\", v);\n        }\n    }\n};\n\nCSL.NameOutput.prototype._setEtAlParameter = function (type, v, j) {\n    var lst, count;\n    if (type === \"persons\") {\n        lst = this.persons[v][j];\n        count = this.persons_count[v][j];\n    } else {\n        lst = this[type][v];\n        count = this[type + \"_count\"][v];\n    }\n    if (lst.length < count && !this.state.tmp.sort_key_flag) {\n        if (this.etal_use_last) {\n            if (type === \"persons\") {\n                this.etal_spec[v].persons[j] = 2;\n            } else {\n                this.etal_spec[v][type] = 2;\n            }\n        } else {\n            if (type === \"persons\") {\n                this.etal_spec[v].persons[j] = 1;\n            } else {\n                this.etal_spec[v][type] = 1;\n            }\n        }\n    } else {\n        if (type === \"persons\") {\n            this.etal_spec[v].persons[j] = 0;\n        } else {\n            this.etal_spec[v][type] = 0;\n        }\n    }\n};\n\n/*global CSL: true */\n\nCSL.NameOutput.prototype.renderAllNames = function () {\n    // Note that et-al/ellipsis parameters are set on the basis\n    // of rendering order through the whole cite.\n    var pos;\n    for (var i = 0, ilen = this.variables.length; i < ilen; i += 1) {\n        var v = this.variables[i];\n\n        if (this.freeters[v].length || this.institutions[v].length) {\n            if (!this.state.tmp.group_context.tip.condition) {\n                this.state.tmp.just_did_number = false;\n            }\n        }\n        \n        pos = this.nameset_base + i;\n        if (this.freeters[v].length) {\n            this.freeters[v] = this._renderNames(v, this.freeters[v], pos);\n        }\n        for (var j = 0, jlen = this.institutions[v].length; j < jlen; j += 1) {\n            this.persons[v][j] = this._renderNames(v, this.persons[v][j], pos, j);\n        }\n    }\n    this.renderInstitutionNames();\n};\n\nCSL.NameOutput.prototype.renderInstitutionNames = function () {\n    // Institutions are split to string list as\n    // this.institutions[v][\"long\"] and this.institutions[v][\"short\"]\n    for (var i = 0, ilen = this.variables.length; i < ilen; i += 1) {\n        var v = this.variables[i];\n        for (var j = 0, jlen = this.institutions[v].length; j < jlen; j += 1) {\n            var institution;\n\n            var name = this.institutions[v][j];\n\n            \n\n            // XXX Start here for institutions\n            // Figure out the three segments: primary, secondary, tertiary\n            var j, jlen, localesets;\n            if (this.state.tmp.extension) {\n                localesets = [\"sort\"];\n            } else if (name.isInstitution || name.literal) {\n                // Will never hit this in this function, but preserving\n                // in case we factor this out.\n                localesets = this.state.opt['cite-lang-prefs'].institutions;\n            } else {\n                localesets = this.state.opt['cite-lang-prefs'].persons;\n            }\n\n            var slot = {primary:'locale-orig',secondary:false,tertiary:false};\n\t        if (localesets) {\n\t\t        var slotnames = [\"primary\", \"secondary\", \"tertiary\"];\n\t\t        for (var k = 0, klen = slotnames.length; k < klen; k += 1) {\n\t\t\t        if (localesets.length - 1 <  k) {\n\t\t\t\t        break;\n\t\t\t        }\n                    if (localesets[k]) {\n\t\t\t            slot[slotnames[k]] = 'locale-' + localesets[k];\n                    }\n\t\t        }\n\t        } else {\n\t\t        slot.primary = 'locale-translat';\n\t        }\n\t        if (this.state.tmp.area !== \"bibliography\"\n\t\t        && !(this.state.tmp.area === \"citation\"\n\t\t\t         && this.state.opt.xclass === \"note\"\n\t\t\t         && this.item && !this.item.position)) {\n                \n\t\t        slot.secondary = false;\n\t\t        slot.tertiary = false;\n\t        }\n            // Get normalized name object for a start.\n            // true invokes fallback\n            this.setRenderedName(name);\n\n            // XXXX FROM HERE (instututions)\n            var institution = this._renderInstitutionName(v, name, slot, j);\n\n            //this.institutions[v][j] = this._join(institution, \"\");\n            this.institutions[v][j] = institution;\n        }\n    }\n};\n\nCSL.NameOutput.prototype._renderInstitutionName = function (v, name, slot, j) {\n    var secondary, tertiary, long_style, short_style, institution, institution_short, institution_long;\n    var res = this.getName(name, slot.primary, true);\n    var primary = res.name;\n    var usedOrig = res.usedOrig;\n    if (primary) {\n        //print(\"primary, v, j = \"+primary+\", \"+v+\", \"+j);\n        primary = this.fixupInstitution(primary, v, j);\n    }\n\tsecondary = false;\n\tif (slot.secondary) {\n        res = this.getName(name, slot.secondary, false, usedOrig);\n        var secondary = res.name;\n        usedOrig = res.usedOrig;\n        if (secondary) {\n\t\t\tsecondary = this.fixupInstitution(secondary, v, j);\n        }\n\t}\n    //Zotero.debug(\"XXX [2] secondary: \"+secondary[\"long\"].literal+\", slot.secondary: \"+slot.secondary);\n\ttertiary = false;\n\tif (slot.tertiary) {\n        res = this.getName(name, slot.tertiary, false, usedOrig);\n        tertiary = res.name;\n        if (tertiary) {\n\t\t\ttertiary = this.fixupInstitution(tertiary, v, j);\n        }\n\t}\n    var n = {\n        l: {\n            pri: false,\n            sec: false,\n            ter: false\n        },\n        s: {\n            pri: false,\n            sec: false,\n            ter: false\n        }\n    };\n    if (primary) {\n        n.l.pri = primary[\"long\"];\n        n.s.pri = primary[\"short\"].length ? primary[\"short\"] : primary[\"long\"];\n    }\n    if (secondary) {\n        n.l.sec = secondary[\"long\"];\n        n.s.sec = secondary[\"short\"].length ? secondary[\"short\"] : secondary[\"long\"];\n    }\n    if (tertiary) {\n        n.l.ter = tertiary[\"long\"];\n        n.s.ter = tertiary[\"short\"].length ? tertiary[\"short\"] : tertiary[\"long\"];\n    }\n    switch (this.institution.strings[\"institution-parts\"]) {\n    case \"short\":\n        // No multilingual for pure short form institution names.\n        if (primary[\"short\"].length) {\n            short_style = this._getShortStyle();\n            institution = [this._composeOneInstitutionPart([n.s.pri, n.s.sec, n.s.ter], slot, short_style, v)];\n        } else {\n            // Fail over to long.\n            long_style = this._getLongStyle(primary, v, j);\n            institution = [this._composeOneInstitutionPart([n.l.pri, n.l.sec, n.l.ter], slot, long_style, v)];\n        }\n        break;\n    case \"short-long\":\n        long_style = this._getLongStyle(primary, v, j);\n        short_style = this._getShortStyle();\n        institution_short = this._renderOneInstitutionPart(primary[\"short\"], short_style);\n        // true is to include multilingual supplement\n        institution_long = this._composeOneInstitutionPart([n.l.pri, n.l.sec, n.l.ter], slot, long_style, v);\n        institution = [institution_short, institution_long];\n        break;\n    case \"long-short\":\n        long_style = this._getLongStyle(primary, v, j);\n        short_style = this._getShortStyle();\n        institution_short = this._renderOneInstitutionPart(primary[\"short\"], short_style);\n        // true is to include multilingual supplement\n        institution_long = this._composeOneInstitutionPart([n.l.pri, n.l.sec, n.l.ter], slot, long_style, v);\n        institution = [institution_long, institution_short];\n        break;\n    default:\n        long_style = this._getLongStyle(primary, v, j);\n        // true is to include multilingual supplement\n        institution = [this._composeOneInstitutionPart([n.l.pri, n.l.sec, n.l.ter], slot, long_style, v)];\n        break;\n    }\n    var blob = this._join(institution, \" \");\n    if (blob) {\n        blob.isInstitution = true;\n    }\n    this.state.tmp.name_node.children.push(blob);\n    return blob;\n};\n\nCSL.NameOutput.prototype._composeOneInstitutionPart = function (names, slot, style) {\n    var primary = false, secondary = false, tertiary = false, primary_tok, secondary_tok, tertiary_tok;\n    if (names[0]) {\n        primary_tok = CSL.Util.cloneToken(style);\n        if (this.state.opt.citeAffixes[slot.primary]){\n            if (\"<i>\" === this.state.opt.citeAffixes.institutions[slot.primary].prefix) {\n                var hasItalic = false;\n                for (var i = 0, ilen = primary_tok.decorations.length; i < ilen; i += 1) {\n                    if (style.decorations[i][0] === \"@font-style\"\n                        && primary_tok.decorations[i][1] === \"italic\") {\n                        hasItalic = true;\n                    }\n                }\n                if (!hasItalic) {\n                    primary_tok.decorations.push([\"@font-style\", \"italic\"]);\n                }\n            }\n        }\n        primary = this._renderOneInstitutionPart(names[0], primary_tok);\n     }\n    if (names[1]) {\n        secondary = this._renderOneInstitutionPart(names[1], style);\n    }\n    if (names[2]) {\n        tertiary = this._renderOneInstitutionPart(names[2], style);\n    }\n    // Compose\n    var institutionblob;\n    if (secondary || tertiary) {\n        this.state.output.openLevel(\"empty\");\n\n        this.state.output.append(primary);\n\n        secondary_tok = CSL.Util.cloneToken(style);\n        if (slot.secondary) {\n            secondary_tok.strings.prefix = this.state.opt.citeAffixes.institutions[slot.secondary].prefix;\n            secondary_tok.strings.suffix = this.state.opt.citeAffixes.institutions[slot.secondary].suffix;\n            // Add a space if empty\n            if (!secondary_tok.strings.prefix) {\n                secondary_tok.strings.prefix = \" \";\n            }\n        }\n        var secondary_outer = new CSL.Token();\n        secondary_outer.decorations.push([\"@font-style\", \"normal\"]);\n        secondary_outer.decorations.push([\"@font-weight\", \"normal\"]);\n        this.state.output.openLevel(secondary_outer);\n        this.state.output.append(secondary, secondary_tok);\n        this.state.output.closeLevel();\n\n        tertiary_tok = CSL.Util.cloneToken(style);\n        if (slot.tertiary) {\n            tertiary_tok.strings.prefix = this.state.opt.citeAffixes.institutions[slot.tertiary].prefix;\n            tertiary_tok.strings.suffix = this.state.opt.citeAffixes.institutions[slot.tertiary].suffix;\n            // Add a space if empty\n            if (!tertiary_tok.strings.prefix) {\n                tertiary_tok.strings.prefix = \" \";\n            }\n        }\n        var tertiary_outer = new CSL.Token();\n        tertiary_outer.decorations.push([\"@font-style\", \"normal\"]);\n        tertiary_outer.decorations.push([\"@font-weight\", \"normal\"]);\n        this.state.output.openLevel(tertiary_outer);\n        this.state.output.append(tertiary, tertiary_tok);\n        this.state.output.closeLevel();\n\n        this.state.output.closeLevel();\n\n        institutionblob = this.state.output.pop();\n    } else {\n        institutionblob = primary;\n    }\n    return institutionblob;\n};\n\nCSL.NameOutput.prototype._renderOneInstitutionPart = function (blobs, style) {\n    for (var i = 0, ilen = blobs.length; i < ilen; i += 1) {\n        if (blobs[i]) {\n            var str = blobs[i];\n            // XXXXX Cut-and-paste code in multiple locations. This code block should be\n            // collected in a function.\n            // Tag: strip-periods-block\n            if (this.state.tmp.strip_periods) {\n                str = str.replace(/\\./g, \"\");\n            } else {\n                for (var j = 0, jlen = style.decorations.length; j < jlen; j += 1) {\n                    if (\"@strip-periods\" === style.decorations[j][0] && \"true\" === style.decorations[j][1]) {\n                        str = str.replace(/\\./g, \"\");\n                        break;\n                    }\n                }\n            }\n            //this.state.output.append(blobs[i], style, true);\n            this.state.tmp.group_context.tip.variable_success = true;\n            this.state.tmp.can_substitute.replace(false, CSL.LITERAL);\n            if (str === \"!here>>>\") {\n                blobs[i] = false;\n            } else {\n                this.state.output.append(str, style, true);\n                blobs[i] = this.state.output.pop();\n            }\n        }\n    }\n    if (\"undefined\" === typeof this.institution.strings[\"part-separator\"]) {\n        this.institution.strings[\"part-separator\"] = this.state.tmp.name_delimiter;\n    }\n    return this._join(blobs, this.institution.strings[\"part-separator\"]);\n};\n\nCSL.NameOutput.prototype._renderNames = function (v, values, pos, j) {\n    //\n    var ret = false;\n    if (values.length) {\n        var names = [];\n        for (var i = 0, ilen = values.length; i < ilen; i += 1) {\n            var name = values[i];\n            \n            // XXX We'll start here with attempts.\n            // Figure out the three segments: primary, secondary, tertiary\n            var ret, localesets;\n            \n            if (this.state.tmp.extension) {\n                localesets = [\"sort\"];\n            } else if (name.isInstitution || name.literal) {\n                // Will never hit this in this function, but preserving\n                // in case we factor this out.\n                localesets = this.state.opt['cite-lang-prefs'].institutions;\n            } else {\n                localesets = this.state.opt['cite-lang-prefs'].persons;\n            }\n            var slot = {primary:'locale-orig',secondary:false,tertiary:false};\n\t        if (localesets) {\n\t\t        var slotnames = [\"primary\", \"secondary\", \"tertiary\"];\n\t\t        for (var k = 0, klen = slotnames.length; k < klen; k += 1) {\n\t\t\t        if (localesets.length - 1 <  k) {\n\t\t\t\t        break;\n\t\t\t        }\n\t\t\t        slot[slotnames[k]] = 'locale-' + localesets[k];\n\t\t        }\n\t        } else {\n\t\t        slot.primary = 'locale-translat';\n\t        }\n\t        if (this.state.tmp.sort_key_flag || (this.state.tmp.area !== \"bibliography\"\n\t\t        && !(this.state.tmp.area === \"citation\"\n\t\t\t         && this.state.opt.xclass === \"note\"\n\t\t\t         && this.item && !this.item.position))) {\n                \n\t\t        slot.secondary = false;\n\t\t        slot.tertiary = false;\n\t        }\n\n            // primary\n            // true is for fallback\n            this.setRenderedName(name);\n\n            if (!name.literal && !name.isInstitution) {\n                var nameBlob = this._renderPersonalName(v, name, slot, pos, i, j);\n                var nameToken = CSL.Util.cloneToken(this.name);\n                this.state.output.append(nameBlob, nameToken, true);\n                names.push(this.state.output.pop());\n            } else {\n                names.push(this._renderInstitutionName(v, name, slot, j));\n            }\n        }\n        //ret = this._join(names, \"\");\n        ret = this.joinPersons(names, pos, j);\n    }\n    return ret;\n};\n\n\nCSL.NameOutput.prototype._renderPersonalName = function (v, name, slot, pos, i, j) {\n    // XXXX FROM HERE (persons)\n\n    var res = this.getName(name, slot.primary, true);\n    var primary = this._renderOnePersonalName(res.name, pos, i, j);\n\tvar secondary = false;\n\tif (slot.secondary) {\n        res = this.getName(name, slot.secondary, false, res.usedOrig);\n        if (res.name) {\n\t\t\tsecondary = this._renderOnePersonalName(res.name, pos, i, j);\n        }\n\t}\n\tvar tertiary = false;\n\tif (slot.tertiary) {\n        res = this.getName(name, slot.tertiary, false, res.usedOrig);\n        if (res.name) {\n\t\t\ttertiary = this._renderOnePersonalName(res.name, pos, i, j);\n        }\n\t}\n    // Now compose them to a unit\n    var personblob;\n    if (secondary || tertiary) {\n\n        this.state.output.openLevel(\"empty\");\n\n        this.state.output.append(primary);\n\n        var secondary_tok = new CSL.Token();\n        if (slot.secondary) {\n            secondary_tok.strings.prefix = this.state.opt.citeAffixes.persons[slot.secondary].prefix;\n            secondary_tok.strings.suffix = this.state.opt.citeAffixes.persons[slot.secondary].suffix;\n            // Add a space if empty\n            if (!secondary_tok.strings.prefix) {\n                secondary_tok.strings.prefix = \" \";\n            }\n        }\n        this.state.output.append(secondary, secondary_tok);\n\n        var tertiary_tok = new CSL.Token();\n        if (slot.tertiary) {\n            tertiary_tok.strings.prefix = this.state.opt.citeAffixes.persons[slot.tertiary].prefix;\n            tertiary_tok.strings.suffix = this.state.opt.citeAffixes.persons[slot.tertiary].suffix;\n            // Add a space if empty\n            if (!tertiary_tok.strings.prefix) {\n                tertiary_tok.strings.prefix = \" \";\n            }\n        }\n        this.state.output.append(tertiary, tertiary_tok);\n\n        this.state.output.closeLevel();\n\n        personblob = this.state.output.pop();\n    } else {\n        personblob = primary;\n    }\n    return personblob;\n};\n\nCSL.NameOutput.prototype._isRomanesque = function (name) {\n    // 0 = entirely non-romanesque\n    // 1 = mixed content\n    // 2 = pure romanesque\n    var ret = 2;\n    if (!name.family.replace(/\\\"/g, '').match(CSL.ROMANESQUE_REGEXP)) {\n        ret = 0;\n    }\n    if (!ret && name.given && name.given.match(CSL.STARTSWITH_ROMANESQUE_REGEXP)) {\n        ret = 1;\n    }\n    var top_locale;\n    if (ret == 2) {\n        if (name.multi && name.multi.main) {\n            top_locale = name.multi.main.slice(0, 2);\n        } else if (this.Item.language) {\n            top_locale = this.Item.language.slice(0, 2);\n        }\n        if ([\"ja\", \"zh\"].indexOf(top_locale) > -1) {\n            ret = 1;\n        }\n    }\n    //print(\"name: \"+name.given+\", multi: \"+name.multi+\", ret: \"+ret);\n    return ret;\n};\n\nCSL.NameOutput.prototype._renderOnePersonalName = function (value, pos, i, j) {\n    var name = value;\n    var dropping_particle = this._droppingParticle(name, pos, j);\n    var family = this._familyName(name);\n    var non_dropping_particle = this._nonDroppingParticle(name);\n    var givenInfo = this._givenName(name, pos, i);\n    var given = givenInfo.blob;\n    var suffix = this._nameSuffix(name);\n    if (given === false) {\n        dropping_particle = false;\n        suffix = false;\n    }\n    var sort_sep = this.state.inheritOpt(this.name, \"sort-separator\");\n    if (!sort_sep) {\n        sort_sep = \"\";\n    }\n    var suffix_sep;\n    if (name[\"comma-suffix\"]) {\n        suffix_sep = \", \";\n    } else {\n        suffix_sep = \" \";\n    }\n    var romanesque = this._isRomanesque(name);\n    function hasJoiningPunctuation(blob) {\n        if (!blob) {\n            return false;\n        } else if (\"string\" === typeof blob.blobs) {\n            if ([\"\\u2019\", \"\\'\", \"-\", \" \"].indexOf(blob.blobs.slice(-1)) > -1) {\n                return true;\n            } else {\n                return false;\n            }\n        } else {\n            return hasJoiningPunctuation(blob.blobs[blob.blobs.length-1]);\n        }\n    }\n    \n    var has_hyphenated_non_dropping_particle = hasJoiningPunctuation(non_dropping_particle);\n\n    var nbspace;\n    if ([\"fr\", \"ru\", \"cs\"].indexOf(this.state.opt[\"default-locale\"][0].slice(0, 2)) > -1) {\n        nbspace = \"\\u00a0\";\n    } else {\n        nbspace = \" \";\n    }\n\n    var blob, merged, first, second;\n    if (romanesque === 0) {\n        // XXX handle affixes for given and family\n        blob = this._join([non_dropping_particle, family, given], \"\");\n    } else if (romanesque === 1 || name[\"static-ordering\"]) { // entry likes sort order\n        merged = this._join([non_dropping_particle, family], nbspace);\n        blob = this._join([merged, given], \" \");\n    } else if (name[\"reverse-ordering\"]) { // entry likes reverse order\n        merged = this._join([non_dropping_particle, family], nbspace);\n        blob = this._join([given, merged], \" \");\n    } else if (this.state.tmp.sort_key_flag) {\n        // ok with no affixes here\n        if (this.state.opt[\"demote-non-dropping-particle\"] === \"never\") {\n            merged = this._join([non_dropping_particle, family], nbspace);\n            merged = this._join([merged, dropping_particle], \" \");\n            merged = this._join([merged, given], this.state.opt.sort_sep);\n            blob = this._join([merged, suffix], \" \");\n        } else {\n            second = this._join([given, dropping_particle, non_dropping_particle], \" \");\n            merged = this._join([family, second], this.state.opt.sort_sep);\n            blob = this._join([merged, suffix], \" \");\n        }\n    } else if (this.state.inheritOpt(this.name, \"name-as-sort-order\") === \"all\" || (this.state.inheritOpt(this.name, \"name-as-sort-order\") === \"first\" && i === 0 && (j === 0 || \"undefined\" === typeof j))) {\n        //\n        // Discretionary sort ordering and inversions\n        //\n        if ([\"Lord\", \"Lady\"].indexOf(name.given) > -1) {\n            sort_sep = \", \";\n        }\n\n        // XXX Needs a more robust solution than this\n        // XXX See https://forums.zotero.org/discussion/30974/any-idea-why-an-a-author-comes-last-in-the-bibliography/#Item_30\n\n        //if ([\"always\", \"display-and-sort\"].indexOf(this.state.opt[\"demote-non-dropping-particle\"]) > -1 && !has_hyphenated_non_dropping_particle) {\n        if ([\"always\", \"display-and-sort\"].indexOf(this.state.opt[\"demote-non-dropping-particle\"]) > -1) {\n            // Drop non-dropping particle\n            //second = this._join([given, dropping_particle, non_dropping_particle], \" \");\n            second = this._join([given, dropping_particle], (name[\"comma-dropping-particle\"] + \" \"));\n        \n            // This would be a problem with al-Ghazali. Avoided by has_hyphenated_non_dropping_particle check above.\n            second = this._join([second, non_dropping_particle], \" \");\n            if (second && this.given) {\n                second.strings.prefix = this.given.strings.prefix;\n                second.strings.suffix = this.given.strings.suffix;\n            }\n            if (family && this.family) {\n                family.strings.prefix = this.family.strings.prefix;\n                family.strings.suffix = this.family.strings.suffix;\n            }\n            merged = this._join([family, second], sort_sep);\n            blob = this._join([merged, suffix], sort_sep);\n        } else {\n            // Don't drop particle.\n            // Don't do this\n            //if (this.state.tmp.area === \"bibliography\" && !this.state.tmp.term_predecessor && non_dropping_particle) {\n            //    if (!has_hyphenated_non_dropping_particle) {\n            //        non_dropping_particle.blobs = CSL.Output.Formatters[\"capitalize-first\"](this.state, non_dropping_particle.blobs)\n            //    }\n            //}\n            if (has_hyphenated_non_dropping_particle) {\n                first = this._join([non_dropping_particle, family], \"\");\n            } else {\n                first = this._join([non_dropping_particle, family], nbspace);\n            }\n            if (first && this.family) {\n                first.strings.prefix = this.family.strings.prefix;\n                first.strings.suffix = this.family.strings.suffix;\n            }\n\n            second = this._join([given, dropping_particle], (name[\"comma-dropping-particle\"] + \" \"));\n            //second = this._join([given, dropping_particle], \" \");\n            if (second && this.given) {\n                second.strings.prefix = this.given.strings.prefix;\n                second.strings.suffix = this.given.strings.suffix;\n            }\n\n            merged = this._join([first, second], sort_sep);\n            blob = this._join([merged, suffix], sort_sep);\n        }\n        blob.isInverted = true;\n    } else { // plain vanilla\n        if (name[\"dropping-particle\"] && name.family && !name[\"non-dropping-particle\"]) {\n            var dp = name[\"dropping-particle\"];\n            var apostrophes = [\"'\",\"\\u02bc\",\"\\u2019\",\"-\"];\n            if (apostrophes.indexOf(dp.slice(-1)) > -1 && dp.slice(0, -1) !== \"de\") {\n                family = this._join([dropping_particle, family], \"\");\n                dropping_particle = false;\n            }\n        }\n\n        if (has_hyphenated_non_dropping_particle) {\n            second = this._join([non_dropping_particle, family], \"\");\n            second = this._join([dropping_particle, second], nbspace);\n        } else {\n            second = this._join([dropping_particle, non_dropping_particle, family], nbspace);\n        }\n        second = this._join([second, suffix], suffix_sep);\n        if (second && this.family) {\n            second.strings.prefix = this.family.strings.prefix;\n            second.strings.suffix = this.family.strings.suffix;\n        }\n        if (given && this.given) {\n            given.strings.prefix = this.given.strings.prefix;\n            given.strings.suffix = this.given.strings.suffix;\n        }\n        if (second.strings.prefix) {\n            name[\"comma-dropping-particle\"] = \"\";\n        }\n\n        var space;\n        if (this.state.inheritOpt(this.name, \"initialize-with\")\n            && this.state.inheritOpt(this.name, \"initialize-with\").match(/[\\u00a0\\ufeff]/)\n            && givenInfo.initializationLevel === 1) {\n            \n            space = nbspace;\n        } else {\n            space = \" \";\n        }\n        blob = this._join([given, second], (name[\"comma-dropping-particle\"] + space));\n    }\n    // XXX Just generally assume for the present that personal names render something\n    this.state.tmp.group_context.tip.variable_success = true;\n    this.state.tmp.can_substitute.replace(false, CSL.LITERAL);\n    this.state.tmp.term_predecessor = true;\n    // notSerious\n    //this.state.output.append(blob, \"literal\", true);\n    //var ret = this.state.output.pop();\n    this.state.tmp.name_node.children.push(blob);\n    return blob;\n};\n\n/*\n        // Do not include given name, dropping particle or suffix in strict short form of name\n\n        // initialize if appropriate\n*/\n\n// Input names should be touched by _normalizeNameInput()\n// exactly once: this is not idempotent.\nCSL.NameOutput.prototype._normalizeNameInput = function (value) {\n    var name = {\n        literal:value.literal,\n        family:value.family,\n        isInstitution:value.isInstitution,\n        given:value.given,\n        suffix:value.suffix,\n        \"comma-suffix\":value[\"comma-suffix\"],\n        \"non-dropping-particle\":value[\"non-dropping-particle\"],\n        \"dropping-particle\":value[\"dropping-particle\"],\n        \"static-ordering\":value[\"static-ordering\"],\n        \"static-particles\":value[\"static-particles\"],\n        \"reverse-ordering\":value[\"reverse-ordering\"],\n        \"full-form-always\": value[\"full-form-always\"],\n        \"parse-names\":value[\"parse-names\"],\n        \"comma-dropping-particle\": \"\",\n        block_initialize:value.block_initialize,\n        multi:value.multi\n    };\n    this._parseName(name);\n    return name;\n};\n\n// _transformNameset() replaced with enhanced transform.name().\n\nCSL.NameOutput.prototype._stripPeriods = function (tokname, str) {\n    var decor_tok = this[tokname + \"_decor\"];\n    if (str) {\n        if (this.state.tmp.strip_periods) {\n            str = str.replace(/\\./g, \"\");\n        } else  if (decor_tok) {\n            for (var i = 0, ilen = decor_tok.decorations.length; i < ilen; i += 1) {\n                if (\"@strip-periods\" === decor_tok.decorations[i][0] && \"true\" === decor_tok.decorations[i][1]) {\n                    str = str.replace(/\\./g, \"\");\n                    break;\n                }\n            }\n        }\n    }\n    return str;\n};\n\nCSL.NameOutput.prototype._nonDroppingParticle = function (name) {\n    var ndp = name[\"non-dropping-particle\"];\n    if (ndp && this.state.tmp.sort_key_flag) {\n        ndp = ndp.replace(/[\\'\\u2019]/, \"\");\n    }\n    var str = this._stripPeriods(\"family\", ndp);\n    if (this.state.output.append(str, this.family_decor, true)) {\n        return this.state.output.pop();\n    }\n    return false;\n};\n\nCSL.NameOutput.prototype._droppingParticle = function (name, pos, j) {\n    var dp = name[\"dropping-particle\"];\n    if (dp && this.state.tmp.sort_key_flag) {\n        dp = dp.replace(/[\\'\\u2019]/, \"\");\n    }\n    var str = this._stripPeriods(\"given\", dp);\n    if (name[\"dropping-particle\"] && name[\"dropping-particle\"].match(/^et.?al[^a-z]$/)) {\n        if (this.state.inheritOpt(this.name, \"et-al-use-last\")) {\n            if (\"undefined\" === typeof j) { \n                this.etal_spec[pos].freeters = 2;\n            } else {\n                this.etal_spec[pos].persons = 2;\n            }\n        } else {\n            if (\"undefined\" === typeof j) { \n                this.etal_spec[pos].freeters = 1;\n            } else {\n                this.etal_spec[pos].persons = 1;\n            }\n        }\n        name[\"comma-dropping-particle\"] = \"\";\n    } else if (this.state.output.append(str, this.given_decor, true)) {\n        return this.state.output.pop();\n    }\n    return false;\n};\n\nCSL.NameOutput.prototype._familyName = function (name) {\n    var str = this._stripPeriods(\"family\", name.family);\n    if (this.state.output.append(str, this.family_decor, true)) {\n        return this.state.output.pop();\n    }\n    return false;\n};\n\nCSL.NameOutput.prototype._givenName = function (name, pos, i) {\n    var ret;\n    // citation\n    //   use disambig as-is\n    // biblography\n    //   use disambig only if it boosts over the default\n    //   SO WHAT IS THE DEFAULT?\n    //   A: If \"form\" is short, it's 0.\n    //      If \"form\" is long, initialize-with exists (and initialize is not false) it's 1\n    //      If \"form\" is long, and initialize_with does not exist, it's 2.\n    var formIsShort = this.state.inheritOpt(this.name, \"form\", \"name-form\", \"long\") !== \"long\";\n    var initializeIsTurnedOn = this.state.inheritOpt(this.name, \"initialize\") !== false;\n    var hasInitializeWith = \"string\" === typeof this.state.inheritOpt(this.name, \"initialize-with\") && !name.block_initialize;\n    var defaultLevel;\n    var useLevel;\n    if (name[\"full-form-always\"]) {\n        useLevel = 2;\n    } else {\n        if (formIsShort) {\n            defaultLevel = 0;\n        } else if (hasInitializeWith) {\n            defaultLevel = 1;\n        } else {\n            defaultLevel = 2;\n        }\n        var requestedLevel = this.state.tmp.disambig_settings.givens[pos][i];\n        if (requestedLevel > defaultLevel) {\n            useLevel = requestedLevel;\n        } else {\n            useLevel = defaultLevel;\n        }\n    }\n    var gdropt = this.state.citation.opt[\"givenname-disambiguation-rule\"];\n   if (gdropt && gdropt.slice(-14) === \"-with-initials\") {\n        hasInitializeWith = true;\n    }\n    if (name.family && useLevel === 1) {\n        if (hasInitializeWith) {\n            var initialize_with = this.state.inheritOpt(this.name, \"initialize-with\", false, \"\");\n            name.given = CSL.Util.Names.initializeWith(this.state, name.given, initialize_with, !initializeIsTurnedOn);\n        } else {\n            name.given = CSL.Util.Names.unInitialize(this.state, name.given);\n        }\n    } else if (useLevel === 0) {\n        return {\n            blob: false\n        }\n    } else if (useLevel === 2) {\n        name.given = CSL.Util.Names.unInitialize(this.state, name.given);\n    }\n\n    var str = this._stripPeriods(\"given\", name.given);\n    var rendered = this.state.output.append(str, this.given_decor, true);\n    if (rendered) {\n        ret = this.state.output.pop();\n\t    return {\n            blob: ret,\n            initializationLevel: useLevel\n        };\n    }\n    return {\n        blob: false\n    };\n};\n\nCSL.NameOutput.prototype._nameSuffix = function (name) {\n\n    var str = name.suffix, ret;\n\n    if (str && \"string\" === typeof this.state.inheritOpt(this.name, \"initialize-with\")) {\n        str = CSL.Util.Names.initializeWith(this.state, str, this.state.inheritOpt(this.name, \"initialize-with\"), true);\n    }\n\n    str = this._stripPeriods(\"family\", str);\n    var toSuffix = '';\n    if (str && str.slice(-1) === '.') {\n\tstr = str.slice(0, -1);\n\ttoSuffix = '.';\n    }\n    var rendered = this.state.output.append(str, \"empty\", true);\n    if (rendered) {\n        ret = this.state.output.pop();\n\tret.strings.suffix = toSuffix + ret.strings.suffix;\n\treturn ret;\n    }\n    return false;\n};\n\nCSL.NameOutput.prototype._getLongStyle = function (name) {\n    var long_style;\n    if (name[\"short\"].length) {\n        if (this.institutionpart[\"long-with-short\"]) {\n            long_style = this.institutionpart[\"long-with-short\"];\n        } else {\n            long_style = this.institutionpart[\"long\"];\n        }\n    } else {\n        long_style = this.institutionpart[\"long\"];\n    }\n    if (!long_style) {\n        long_style = new CSL.Token();\n    }\n    return long_style;\n};\n\nCSL.NameOutput.prototype._getShortStyle = function () {\n    var short_style;\n    if (this.institutionpart[\"short\"]) {\n        short_style = this.institutionpart[\"short\"];\n    } else {\n        short_style = new CSL.Token();\n    }\n    return short_style;\n};\n\nCSL.NameOutput.prototype._parseName = function (name) {\n    if (!name[\"parse-names\"] && \"undefined\" !== typeof name[\"parse-names\"]) {\n        return name;\n    }\n    if (name.family && !name.given && name.isInstitution) {\n        name.literal = name.family;\n        name.family = undefined;\n        name.isInstitution = undefined;\n    }\n    var noparse;\n    if (name.family \n        && (name.family.slice(0, 1) === '\"' && name.family.slice(-1) === '\"')\n        || (!name[\"parse-names\"] && \"undefined\" !== typeof name[\"parse-names\"])) {\n\n        name.family = name.family.slice(1, -1);\n        noparse = true;\n        name[\"parse-names\"] = 0;\n    } else {\n        noparse = false;\n    }\n    if (this.state.opt.development_extensions.parse_names) {\n        if (!name[\"non-dropping-particle\"] && name.family && !noparse && name.given) {\n            if (!name[\"static-particles\"]) {\n                CSL.parseParticles(name, true);\n            }\n        }\n    }\n};\n\n/*\n * Return a single name object\n  */\n\n// The interface is a mess, but this should serve.\n\nCSL.NameOutput.prototype.getName = function (name, slotLocaleset, fallback, stopOrig) {\n\n    // Needs to tell us whether we used orig or not.\n    \n    if (stopOrig && slotLocaleset === 'locale-orig') {\n        return {name:false,usedOrig:stopOrig};\n    }\n\n    // Normalize to string\n    if (!name.family) {\n        name.family = \"\";\n    }\n    if (!name.given) {\n        name.given = \"\";\n    }\n\n    // Recognized params are:\n    //  block-initialize\n    //  transliterated\n    //  static-ordering\n    //  full-form-always\n    // All default to false, except for static-ordering, which is initialized\n    // with a sniff.\n    var name_params = {};\n    // Determines the default static-order setting based on the characters\n    // used in the headline field. Will be overridden by locale-based\n    // parameters evaluated against explicit lang tags set on the (sub)field.\n    name_params[\"static-ordering\"] = this.getStaticOrder(name);\n\n    var foundTag = true;\n    var langTag;\n    if (slotLocaleset !== 'locale-orig') {\n        foundTag = false;\n        if (name.multi) {\n            var langTags = this.state.opt[slotLocaleset];\n            for (var i = 0, ilen = langTags.length; i < ilen; i += 1) {\n                langTag = langTags[i];\n                if (name.multi._key[langTag]) {\n                    foundTag = true;\n                    var isInstitution = name.isInstitution;\n                    name = name.multi._key[langTag];\n                    name.isInstitution = isInstitution;\n                    // Set name formatting params\n                    name_params = this.getNameParams(langTag);\n                    name_params.transliterated = true;\n                    break;\n                }\n            }\n        }\n    }\n\n    if (!foundTag) {\n        langTag = false;\n        if (name.multi && name.multi.main) {\n            langTag = name.multi.main;\n        } else if (this.Item.language) {\n            langTag = this.Item.language;\n        }\n        if (langTag) {\n            name_params = this.getNameParams(langTag);\n        }\n    }\n\n    if (!fallback && !foundTag) {\n        return {name:false,usedOrig:stopOrig};\n    }\n    \n    // Normalize to string (again)\n    if (!name.family) {\n        name.family = \"\";\n    }\n    if (!name.given) {\n        name.given = \"\";\n    }\n    if (name.literal) {\n        delete name.family;\n        delete name.given;\n    }\n    // var clone the item before writing into it\n    name = {\n        family:name.family,\n        given:name.given,\n        \"non-dropping-particle\":name[\"non-dropping-particle\"],\n        \"dropping-particle\":name[\"dropping-particle\"],\n        suffix:name.suffix,\n        \"static-ordering\":name_params[\"static-ordering\"],\n        \"static-particles\":name[\"static-particles\"],\n        \"reverse-ordering\":name_params[\"reverse-ordering\"],\n        \"full-form-always\": name_params[\"full-form-always\"],\n        \"parse-names\":name[\"parse-names\"],\n        \"comma-suffix\":name[\"comma-suffix\"],\n        \"comma-dropping-particle\":name[\"comma-dropping-particle\"],\n        transliterated: name_params.transliterated,\n        block_initialize: name_params[\"block-initialize\"],\n        literal:name.literal,\n        isInstitution:name.isInstitution,\n        multi:name.multi\n    };\n    \n    if (!name.literal && (!name.given && name.family && name.isInstitution)) {\n        name.literal = name.family;\n    }\n    if (name.literal) {\n        delete name.family;\n        delete name.given;\n    }\n    name = this._normalizeNameInput(name);\n    var usedOrig;\n    if (stopOrig) {\n        usedOrig = stopOrig;\n    } else {\n        usedOrig = !foundTag;\n    }\n    return {name:name,usedOrig:usedOrig};\n};\n\nCSL.NameOutput.prototype.getNameParams = function (langTag) {\n    var ret = {};\n    var langspec = CSL.localeResolve(this.Item.language, this.state.opt[\"default-locale\"][0]);\n    var try_locale = this.state.locale[langspec.best] ? langspec.best : this.state.opt[\"default-locale\"][0];\n    var name_as_sort_order = this.state.locale[try_locale].opts[\"name-as-sort-order\"];\n    var name_as_reverse_order = this.state.locale[try_locale].opts[\"name-as-reverse-order\"];\n    var name_never_short = this.state.locale[try_locale].opts[\"name-never-short\"];\n    var field_lang_bare = langTag.split(\"-\")[0];\n    if (name_as_sort_order && name_as_sort_order[field_lang_bare]) {\n        ret[\"static-ordering\"] = true;\n        ret[\"reverse-ordering\"] = false;\n    }\n    if (name_as_reverse_order && name_as_reverse_order[field_lang_bare]) {\n        ret[\"reverse-ordering\"] = true;\n        ret[\"static-ordering\"] = false;\n    }\n    if (name_never_short && name_never_short[field_lang_bare]) {\n        ret[\"full-form-always\"] = true;\n    }\n    \n    if (ret[\"static-ordering\"]) {\n        ret[\"block-initialize\"] = true;\n    }\n    return ret;\n};\n\nCSL.NameOutput.prototype.setRenderedName = function (name) {\n    if (this.state.tmp.area === \"bibliography\") {\n        var strname = \"\";\n        for (var j=0,jlen=CSL.NAME_PARTS.length;j<jlen;j+=1) {\n            if (name[CSL.NAME_PARTS[j]]) {\n                strname += name[CSL.NAME_PARTS[j]];\n            }\n        }\n        this.state.tmp.rendered_name.push(strname);\n    }\n};\n\nCSL.NameOutput.prototype.fixupInstitution = function (name, varname, listpos) {\n    if (!name.literal && name.family) {\n        name.literal = name.family;\n        delete name.family;\n    }\n    var longNameStr = name.literal;\n    var shortNameStr = longNameStr;\n    var ret = {\n        \"long\": longNameStr.split(/\\s*\\|\\s*/),\n        \"short\": shortNameStr.split(/\\s*\\|\\s*/),\n    };\n    if (this.state.sys.getAbbreviation) {\n        // Normalize longNameStr and shortNameStr\n        if (this.institution.strings.form === \"short\") {\n            let jurisdiction = this.Item.jurisdiction;\n            jurisdiction = this.state.transform.loadAbbreviation(jurisdiction, \"institution-entire\", longNameStr, this.Item.language);\n            if (this.state.transform.abbrevs[jurisdiction][\"institution-entire\"][longNameStr]) {\n                longNameStr = this.state.transform.abbrevs[jurisdiction][\"institution-entire\"][longNameStr];\n            } else {\n                jurisdiction = this.Item.jurisdiction;\n                jurisdiction = this.state.transform.loadAbbreviation(jurisdiction, \"institution-part\", longNameStr, this.Item.language);\n                if (this.state.transform.abbrevs[jurisdiction][\"institution-part\"][longNameStr]) {\n                    longNameStr = this.state.transform.abbrevs[jurisdiction][\"institution-part\"][longNameStr];\n                }\n            }\n            longNameStr = this._quashChecks(jurisdiction, longNameStr);\n        }\n        if ([\"short\", \"short-long\", \"long-short\"].indexOf(this.institution.strings[\"institution-parts\"]) > -1) {\n            let jurisdiction = this.Item.jurisdiction;\n            jurisdiction = this.state.transform.loadAbbreviation(jurisdiction, \"institution-part\", shortNameStr, this.Item.language);\n            if (this.state.transform.abbrevs[jurisdiction][\"institution-part\"][shortNameStr]) {\n                shortNameStr = this.state.transform.abbrevs[jurisdiction][\"institution-part\"][shortNameStr];\n            }\n            shortNameStr = this._quashChecks(jurisdiction, shortNameStr);\n            if ([\"short-long\", \"long-short\"].indexOf(this.institution.strings[\"institution-parts\"]) > -1) {\n                if (shortNameStr === longNameStr) {\n                    shortNameStr = \"\";\n                }\n            }\n        }\n        // Split abbreviated strings\n        // For pure long, split and we're done.\n        ret[\"long\"] = longNameStr.split(/\\s*\\|\\s*/);\n        // For short, split and then try abbrev with institution-part on each element\n        ret[\"short\"] = shortNameStr.split(/\\s*\\|\\s*/);\n        if ([\"short\", \"short-long\", \"long-short\"].indexOf(this.institution.strings[\"institution-parts\"]) > -1) {\n            for (var j=ret[\"short\"].length-1; j>-1; j--) {\n                let jurisdiction = this.Item.jurisdiction;\n                var abbrevKey = ret[\"short\"][j];\n                jurisdiction = this.state.transform.loadAbbreviation(jurisdiction, \"institution-part\", abbrevKey, this.Item.language);\n                if (this.state.transform.abbrevs[jurisdiction][\"institution-part\"][abbrevKey]) {\n                    ret[\"short\"][j] = this.state.transform.abbrevs[jurisdiction][\"institution-part\"][abbrevKey];\n                }\n                if (ret[\"short\"][j].indexOf(\"|\") > -1) {\n                    let retShort = ret[\"short\"];\n                    let splitShort = retShort[j].split(/\\s*\\|\\s*/);\n                    ret[\"short\"] = retShort.slice(0, j).concat(splitShort).concat(retShort.slice(j+1));\n                }\n            }\n        }\n        if (this.state.opt.development_extensions.legacy_institution_name_ordering) {\n            ret[\"short\"].reverse();\n        }\n        ret[\"short\"] = this._trimInstitution(ret[\"short\"]);\n        if (this.institution.strings[\"reverse-order\"]) {\n            ret[\"short\"].reverse();\n        }\n        // trimmer is not available in getAmbiguousCite\n        if (!this.state.tmp.just_looking) {\n            if (this.Item.jurisdiction) {\n                let jurisdiction = this.Item.jurisdiction;\n                var trimmer = this.state.tmp.abbrev_trimmer;\n                if (trimmer && trimmer[jurisdiction] && trimmer[jurisdiction][varname]) {\n                    for (var i=0,ilen=ret[\"short\"].length;i<ilen;i++) {\n                        var frag = ret[\"short\"][i];\n                        ret[\"short\"][i] = frag.replace(trimmer[jurisdiction][varname], \"\").trim();\n                    }\n                }\n            }\n        }\n    }\n    if (this.state.opt.development_extensions.legacy_institution_name_ordering) {\n        ret[\"long\"].reverse();\n    }\n    ret[\"long\"] = this._trimInstitution(ret[\"long\"]);\n    if (this.institution.strings[\"reverse-order\"]) {\n        ret[\"long\"].reverse();\n    }\n\n    return ret;\n};\n\n\nCSL.NameOutput.prototype.getStaticOrder = function (name, refresh) {\n    var static_ordering_val = false;\n    if (!refresh && name[\"static-ordering\"]) {\n        static_ordering_val = true;\n    } else if (this._isRomanesque(name) === 0) {\n        static_ordering_val = true;\n    } else if ((!name.multi || !name.multi.main) && this.Item.language && ['vi', 'hu'].indexOf(this.Item.language) > -1) {\n        static_ordering_val = true;\n    } else if (name.multi && name.multi.main && ['vi', 'hu'].indexOf(name.multi.main.slice(0,2)) > -1) {\n        static_ordering_val = true;\n    } else {\n        if (this.state.opt['auto-vietnamese-names']\n            && (CSL.VIETNAMESE_NAMES.exec(name.family + \" \" + name.given)\n                && CSL.VIETNAMESE_SPECIALS.exec(name.family + name.given))) {\n            \n            static_ordering_val = true;\n        }\n    }\n    return static_ordering_val;\n};\n\nCSL.NameOutput.prototype._quashChecks = function (jurisdiction, str) {\n    var str = this.state.transform.quashCheck(jurisdiction, str);\n    // If the abbreviation has date cut-offs, find the most recent\n    // abbreviation within scope.\n    var lst = str.split(/>>[0-9]{4}>>/);\n    var m = str.match(/>>([0-9]{4})>>/);\n    str = lst.pop();\n    var date = this.Item[\"original-date\"] ? this.Item[\"original-date\"] : this.Item[\"issued\"];\n    if (date) {\n        date = parseInt(date.year, 10);\n        date = isNaN(date) ? false : date;\n    }\n    if (date) {\n        if (lst.length > 0) {\n            for (var k=m.length-1; k>0; k--) {\n                if (date >= parseInt(m[k], 10)) {\n                    break;\n                }\n                str = lst.pop();\n            }\n        }\n        str = str.replace(/\\s*\\|\\s*/g, \"|\");\n    }\n    return str;\n}\n\nCSL.NameOutput.prototype._trimInstitution = function (subunits) {\n\t// Oh! Good catch in the tests. This happens before abbrevs.\n    // Won't work that way. Need to do abbrev substitute first,\n    // and apply this separately to long and to short.\n    var use_first = false;\n    var stop_last = false;\n    var use_last = false;\n    var stop_first = false;\n    var s = subunits.slice();\n    if (this.institution) {\n        // If use_first, apply stop_last, then apply use_first;\n        // If use_last, apply stop_first, then apply use_last;\n        if (\"undefined\" !== typeof this.institution.strings[\"use-first\"]) {\n            // this.state.sys.print(\"use-first OK\");\n            use_first = this.institution.strings[\"use-first\"];\n        }\n        if (\"undefined\" !== typeof this.institution.strings[\"use-last\"]) {\n            // this.state.sys.print(\"use-last OK\");\n            use_last = this.institution.strings[\"use-last\"];\n        }\n        if (\"undefined\" !== typeof this.institution.strings[\"stop-first\"]) {\n            // this.state.sys.print(\"stop-first OK\");\n            stop_first = this.institution.strings[\"stop-first\"];\n        }\n        if (\"undefined\" !== typeof this.institution.strings[\"stop-last\"]) {\n            stop_last = this.institution.strings[\"stop-last\"];\n        }\n\n        if (use_first) {\n            if (stop_last) {\n                s = s.slice(0, stop_last * -1);\n            }\n            s = s.slice(0, use_first);\n        }\n        \n        if (use_last) {\n            var ss = subunits.slice();\n            if (use_first) {\n                stop_first = use_first;\n            } else {\n                s = [];\n            }\n            if (stop_first) {\n                ss = ss.slice(stop_first);\n            }\n            ss = ss.slice(use_last * -1);\n            s = s.concat(ss);\n        }\n        subunits = s;\n    }\n    return subunits;\n};\n\n/*global CSL: true */\n\nCSL.PublisherOutput = function (state, group_tok) {\n    this.state = state;\n    this.group_tok = group_tok;\n    this.varlist = [];\n};\n\nCSL.PublisherOutput.prototype.render = function () {\n    this.clearVars();\n    this.composeAndBlob();\n    this.composeElements();\n    this.composePublishers();\n    this.joinPublishers();\n};\n\n\n// XXX Figure out how to adapt this to the House of Lords / House of Commons\n// joint committee case\n\n// name_delimiter\n// delimiter_precedes_last\n// and\n\nCSL.PublisherOutput.prototype.composeAndBlob = function () {\n    this.and_blob = {};\n    var and_term = false;\n    if (this.group_tok.strings.and === \"text\") {\n        and_term = this.state.getTerm(\"and\");\n    } else if (this.group_tok.strings.and === \"symbol\") {\n        and_term = \"&\";\n    }\n    var tok = new CSL.Token();\n    tok.strings.suffix = \" \";\n    tok.strings.prefix = \" \";\n    this.state.output.append(and_term, tok, true);\n    var no_delim = this.state.output.pop();\n\n    tok.strings.prefix = this.group_tok.strings[\"subgroup-delimiter\"];\n    this.state.output.append(and_term, tok, true);\n    var with_delim = this.state.output.pop();\n    \n    this.and_blob.single = false;\n    this.and_blob.multiple = false;\n    if (and_term) {\n        if (this.group_tok.strings[\"subgroup-delimiter-precedes-last\"] === \"always\") {\n            this.and_blob.single = with_delim;\n        } else if (this.group_tok.strings[\"subgroup-delimiter-precedes-last\"] === \"never\") {\n            this.and_blob.single = no_delim;\n            this.and_blob.multiple = no_delim;\n        } else {\n            this.and_blob.single = no_delim;\n            this.and_blob.multiple = with_delim;\n        }\n    }\n};\n\n\nCSL.PublisherOutput.prototype.composeElements = function () {\n    for (var i = 0, ilen = 2; i < ilen; i += 1) {\n        var varname = [\"publisher\", \"publisher-place\"][i];\n        for (var j = 0, jlen = this[\"publisher-list\"].length; j < jlen; j += 1) {\n            var str = this[varname + \"-list\"][j];\n            var tok = this[varname + \"-token\"];\n            // notSerious\n            this.state.output.append(str, tok, true);\n            this[varname + \"-list\"][j] = this.state.output.pop();\n        }\n    }\n};\n\n\nCSL.PublisherOutput.prototype.composePublishers = function () {\n    var blobs;\n    for (var i = 0, ilen = this[\"publisher-list\"].length; i < ilen; i += 1) {\n        blobs = [this[this.varlist[0] + \"-list\"][i], this[this.varlist[1] + \"-list\"][i]];\n        this[\"publisher-list\"][i] = this._join(blobs, this.group_tok.strings.delimiter);\n    }\n};\n\n\nCSL.PublisherOutput.prototype.joinPublishers = function () {\n    var blobs = this[\"publisher-list\"];\n    var publishers = this._join(blobs, this.group_tok.strings[\"subgroup-delimiter\"], this.and_blob.single, this.and_blob.multiple, this.group_tok);\n    this.state.output.append(publishers, \"literal\");\n};\n\n\n// blobs, delimiter, single, multiple, tokenname\n// Tokenname is a key at top level of this object.\nCSL.PublisherOutput.prototype._join = CSL.NameOutput.prototype._join;\nCSL.PublisherOutput.prototype._getToken = CSL.NameOutput.prototype._getToken;\n\n\nCSL.PublisherOutput.prototype.clearVars = function () {\n    this.state.tmp[\"publisher-list\"] = false;\n    this.state.tmp[\"publisher-place-list\"] = false;\n    this.state.tmp[\"publisher-group-token\"] = false;\n    this.state.tmp[\"publisher-token\"] = false;\n    this.state.tmp[\"publisher-place-token\"] = false;\n};\n\n/*global CSL: true */\n\nCSL.evaluateLabel = function (node, state, Item, item) {\n    var myterm;\n    if (\"locator\" === node.strings.term) {\n        if (item && item.label) {\n            if (item.label === \"sub verbo\") {\n                myterm = \"sub-verbo\";\n            } else {\n                myterm = item.label;\n            }\n        }\n        if (!myterm) {\n            myterm = \"page\";\n        }\n    } else {\n        myterm = node.strings.term;\n    }\n    \n    // Plurals detection.\n    var plural = node.strings.plural;\n    if (\"number\" !== typeof plural) {\n        // (node, ItemObject, variable, type)\n        var theItem = (item && node.strings.term === \"locator\") ? item : Item;\n        if (theItem[node.strings.term]) {\n            state.processNumber(false, theItem, node.strings.term, Item.type);\n            plural = state.tmp.shadow_numbers[node.strings.term].plural;\n            if (!state.tmp.shadow_numbers[node.strings.term].labelForm\n                && !state.tmp.shadow_numbers[node.strings.term].labelDecorations) {\n                if (node.strings.form) {\n                    state.tmp.shadow_numbers[node.strings.term].labelForm = node.strings.form;\n                } else if (state.tmp.group_context.tip.label_form) {\n                    state.tmp.shadow_numbers[node.strings.term].labelForm = state.tmp.group_context.tip.label_form;\n                }\n                state.tmp.shadow_numbers[node.strings.term].labelCapitalizeIfFirst = node.strings.capitalize_if_first;\n                state.tmp.shadow_numbers[node.strings.term].labelDecorations = node.decorations.slice();\n            }\n            \n            if ([\"locator\", \"number\", \"page\"].indexOf(node.strings.term) > -1 && state.tmp.shadow_numbers[node.strings.term].label) {\n                myterm = state.tmp.shadow_numbers[node.strings.term].label;\n            }\n            if (node.decorations && state.opt.development_extensions.csl_reverse_lookup_support) {\n                node.decorations.reverse();\n                node.decorations.push([\"@showid\",\"true\", node.cslid]);\n                node.decorations.reverse();\n            }\n        }\n    }\n    return CSL.castLabel(state, node, myterm, plural, CSL.TOLERANT);\n};\n\nCSL.castLabel = function (state, node, term, plural, mode) {\n    var label_form = node.strings.form;\n    var label_capitalize_if_first = node.strings.capitalize_if_first;\n    if (state.tmp.group_context.tip.label_form) {\n        if (label_form === \"static\") {\n            state.tmp.group_context.tip.label_static = true;\n        } else {\n            label_form = state.tmp.group_context.tip.label_form;\n        }\n    }\n\n    if (state.tmp.group_context.tip.label_capitalize_if_first) {\n        label_capitalize_if_first = state.tmp.group_context.tip.label_capitalize_if_first;\n    }\n    var ret = state.getTerm(term, label_form, plural, false, mode, node.default_locale);\n    if (label_capitalize_if_first) {\n        ret = CSL.Output.Formatters[\"capitalize-first\"](state, ret);\n    }\n    // XXXXX Cut-and-paste code in multiple locations. This code block should be\n    // collected in a function.\n    // Tag: strip-periods-block\n    if (state.tmp.strip_periods) {\n        ret = ret.replace(/\\./g, \"\");\n    } else {\n        for (var i = 0, ilen = node.decorations.length; i < ilen; i += 1) {\n            if (\"@strip-periods\" === node.decorations[i][0] && \"true\" === node.decorations[i][1]) {\n                ret = ret.replace(/\\./g, \"\");\n                break;\n            }\n        }\n    }\n    return ret;\n};\n\n/*global CSL: true */\n\nCSL.Node.name = {\n    build: function (state, target) {\n        var func;\n        if ([CSL.SINGLETON, CSL.START].indexOf(this.tokentype) > -1) {\n            var oldTmpRoot;\n            if (\"undefined\" === typeof state.tmp.root) {\n                oldTmpRoot = undefined;\n                state.tmp.root = \"citation\";\n            } else {\n                oldTmpRoot = state.tmp.root;\n            }\n            // Many CSL styles set et-al-[min|use-first]\n            // and et-al-subsequent-[min|use-first] to the same\n            // value.\n            // Set state.opt.update_mode = CSL.POSITION if\n            // et-al-subsequent-min or et-al-subsequent-use-first\n            // are set AND their value differs from their plain\n            // counterparts.\n            if (state.inheritOpt(this, \"et-al-subsequent-min\")\n                && (state.inheritOpt(this, \"et-al-subsequent-min\") !== state.inheritOpt(this, \"et-al-min\"))) {\n                \n                state.opt.update_mode = CSL.POSITION;\n            }\n            if (state.inheritOpt(this, \"et-al-subsequent-use-first\")\n                && (state.inheritOpt(this, \"et-al-subsequent-use-first\") !== state.inheritOpt(this, \"et-al-use-first\"))) {\n                \n                state.opt.update_mode = CSL.POSITION;\n            }\n\n            state.tmp.root = oldTmpRoot;\n\n            func = function (state) {\n                // Et-al (onward processing in node_etal.js and node_names.js)\n                // XXXXX Why is this necessary? This is available on this.name, right?\n                state.tmp.etal_term = \"et-al\";\n\n                // Use default delimiter as fallback, in a way that allows explicit\n                // empty strings.\n                state.tmp.name_delimiter = state.inheritOpt(this, \"delimiter\", \"name-delimiter\", \", \");\n                state.tmp[\"delimiter-precedes-et-al\"] = state.inheritOpt(this, \"delimiter-precedes-et-al\");\n                \n                // And\n                if (\"text\" === state.inheritOpt(this, \"and\")) {\n                    this.and_term = state.getTerm(\"and\", \"long\", 0);\n                } else if (\"symbol\" === state.inheritOpt(this, \"and\")) {\n                    if (state.opt.development_extensions.expect_and_symbol_form) {\n                        this.and_term = state.getTerm(\"and\", \"symbol\", 0);\n                    } else {\n                        this.and_term = \"&\";\n                    }\n                }\n                state.tmp.and_term = this.and_term;\n                if (CSL.STARTSWITH_ROMANESQUE_REGEXP.test(this.and_term)) {\n                    this.and_prefix_single = \" \";\n                    this.and_prefix_multiple = \", \";\n                    // Workaround to allow explicit empty string\n                    // on cs:name delimiter.\n                    if (\"string\" === typeof state.tmp.name_delimiter) {\n                        this.and_prefix_multiple = state.tmp.name_delimiter;\n                    }\n                    this.and_suffix = \" \";\n\n                    // Really can't inspect these values in the build phase. Sorry.\n                    //state.build.name_delimiter = this.strings.delimiter;\n\n                } else {\n                    this.and_prefix_single = \"\";\n                    this.and_prefix_multiple = \"\";\n                    this.and_suffix = \"\";\n                }\n                if (state.inheritOpt(this, \"delimiter-precedes-last\") === \"always\") {\n                    this.and_prefix_single = state.tmp.name_delimiter;\n                } else if (state.inheritOpt(this, \"delimiter-precedes-last\") === \"never\") {\n                    // Slightly fragile: could test for charset here to make\n                    // this more certain.\n                    if (this.and_prefix_multiple) {\n                        this.and_prefix_multiple = \" \";\n                    }\n                } else if (state.inheritOpt(this, \"delimiter-precedes-last\") === \"after-inverted-name\") {\n                    if (this.and_prefix_single) {\n                        this.and_prefix_single = state.tmp.name_delimiter;\n                    }\n                    if (this.and_prefix_multiple) {\n                        this.and_prefix_multiple = \" \";\n                    }\n                }\n\n                this.and = {};\n                if (state.inheritOpt(this, \"and\")) {\n                    state.output.append(this.and_term, \"empty\", true);\n                    this.and.single = state.output.pop();\n                    this.and.single.strings.prefix = this.and_prefix_single;\n                    this.and.single.strings.suffix = this.and_suffix;\n                    state.output.append(this.and_term, \"empty\", true);\n                    this.and.multiple = state.output.pop();\n                    this.and.multiple.strings.prefix = this.and_prefix_multiple;\n                    this.and.multiple.strings.suffix = this.and_suffix;\n                } else if (state.tmp.name_delimiter) {\n                    // This is a little weird, but it works.\n                    this.and.single = new CSL.Blob(state.tmp.name_delimiter);\n                    this.and.single.strings.prefix = \"\";\n                    this.and.single.strings.suffix = \"\";\n                    this.and.multiple = new CSL.Blob(state.tmp.name_delimiter);\n                    this.and.multiple.strings.prefix = \"\";\n                    this.and.multiple.strings.suffix = \"\";\n                }\n\n                this.ellipsis = {};\n                if (state.inheritOpt(this, \"et-al-use-last\")) {\n                    // We use the dedicated Unicode ellipsis character because\n                    // it is recommended by some editors, and can be more easily\n                    // identified for find and replace operations.\n                    // Source: http://en.wikipedia.org/wiki/Ellipsis#Computer_representations\n                    //\n                    \n                    // Eventually, this should be localized as a term in CSL, with some\n                    // mechanism for triggering appropriate punctuation handling around\n                    // the ellipsis placeholder (Polish is a particularly tough case for that).\n                    this.ellipsis_term = \"\\u2026\";\n                    // Similar treatment to \"and\", above, will be needed\n                    // here when this becomes a locale term.\n                    this.ellipsis_prefix_single = \" \";\n                    this.ellipsis_prefix_multiple =  state.inheritOpt(this, \"delimiter\", \"name-delimiter\", \", \");\n                    this.ellipsis_suffix = \" \";\n                    this.ellipsis.single = new CSL.Blob(this.ellipsis_term);\n                    this.ellipsis.single.strings.prefix = this.ellipsis_prefix_single;\n                    this.ellipsis.single.strings.suffix = this.ellipsis_suffix;\n                    this.ellipsis.multiple = new CSL.Blob(this.ellipsis_term);\n                    this.ellipsis.multiple.strings.prefix = this.ellipsis_prefix_multiple;\n                    this.ellipsis.multiple.strings.suffix = this.ellipsis_suffix;\n                }\n\n                // et-al parameters are annoyingly incomprehensible\n                // again.\n                //\n                // Explanation probably just adds a further layer of\n                // irritation, but what's INTENDED here is that\n                // the state.tmp et-al variables are set from the\n                // cs:key element when composing sort keys, and a\n                // macro containing a name can be called from cs:key.\n                // So when cs:key sets et-al attributes, they are\n                // set on state.tmp, and when the key is finished\n                // processing, the state.tmp variables are reset to\n                // undefined. IN THEORY the state.tmp et-al variables\n                // will not be used in other contexts. I hope.\n                //\n                // Anyway, the current tests now seem to pass.\n                if (\"undefined\" === typeof state.tmp[\"et-al-min\"]) {\n                    state.tmp[\"et-al-min\"] = state.inheritOpt(this, \"et-al-min\");\n                }\n                if (\"undefined\" === typeof state.tmp[\"et-al-use-first\"]) {\n                    state.tmp[\"et-al-use-first\"] = state.inheritOpt(this, \"et-al-use-first\");\n                }\n                if (\"undefined\" === typeof state.tmp[\"et-al-use-last\"]) {\n                    //print(\"  setting et-al-use-last from name: \"+this.strings[\"et-al-use-last\"]);\n                    state.tmp[\"et-al-use-last\"] = state.inheritOpt(this, \"et-al-use-last\");\n                }\n\n                state.nameOutput.name = this;\n            };\n            \n            state.build.name_flag = true;\n\n            this.execs.push(func);\n        }\n        target.push(this);\n    }\n};\n\n\n\n/*global CSL: true */\n\nCSL.Node[\"name-part\"] = {\n    build: function (state) {\n        state.build[this.strings.name] = this;\n    }\n};\n\n/*global CSL: true */\n\nCSL.Node.names = {\n    build: function (state, target) {\n        var func;\n        // CSL.debug = print;\n\n        if (this.tokentype === CSL.START || this.tokentype === CSL.SINGLETON) {\n            CSL.Util.substituteStart.call(this, state, target);\n            state.build.substitute_level.push(1);\n        }\n        \n        if (this.tokentype === CSL.SINGLETON) {\n            state.build.names_variables[state.build.names_variables.length-1].concat(this.variables);\n            for (var i in this.variables) {\n                var variable = this.variables[i];\n                var name_labels = state.build.name_label[state.build.name_label.length-1];\n                if (Object.keys(name_labels).length) {\n                    name_labels[variable] = name_labels[Object.keys(name_labels)[0]];\n                }\n            }\n            func = function (state) {\n                state.nameOutput.reinit(this, this.variables_real[0]);\n            };\n            this.execs.push(func);\n        }\n\n        if (this.tokentype === CSL.START) {\n\n            state.build.names_flag = true;\n            state.build.name_flag = false;\n            state.build.names_level += 1;\n            state.build.names_variables.push(this.variables);\n            state.build.name_label.push({});\n            // init can substitute\n            // init names\n            func = function (state) {\n                state.tmp.can_substitute.push(true);\n                state.tmp.name_node = {};\n                state.tmp.name_node.children = [];\n                state.nameOutput.init(this);\n            };\n            this.execs.push(func);\n\n        }\n        \n        if (this.tokentype === CSL.END) {\n\n            // Set/reset name blobs if they exist, for processing\n            // by namesOutput()\n            for (var i = 0, ilen = 3; i < ilen; i += 1) {\n                var key = [\"family\", \"given\", \"et-al\"][i];\n                this[key] = state.build[key];\n                if (state.build.names_level === 1) {\n                    state.build[key] = undefined;\n                }\n            }\n            // Labels, if any\n            this.label = state.build.name_label[state.build.name_label.length-1];\n            state.build.names_level += -1;\n            state.build.names_variables.pop();\n            state.build.name_label.pop();\n\n            // The with term. This isn't the right place\n            // for this, but it's all hard-wired at the\n            // moment.\n\n            // \"and\" and \"ellipsis\" are set in node_name.js\n            func = function (state) {\n                // Et-al (strings only)\n                // Blob production has to happen inside nameOutput()\n                // since proper escaping requires access to the output\n                // queue.\n                if (state.tmp.etal_node) {\n                    this.etal_style = state.tmp.etal_node;\n                } else {\n                    this.etal_style = \"empty\";\n                }\n\n                this.etal_term = state.getTerm(state.tmp.etal_term, \"long\", 0);\n                this.etal_prefix_single = \" \";\n                // Should be name delimiter, not hard-wired.\n                this.etal_prefix_multiple = state.tmp.name_delimiter;\n                if (state.tmp[\"delimiter-precedes-et-al\"] === \"always\") {\n                    this.etal_prefix_single = state.tmp.name_delimiter;\n                } else if (state.tmp[\"delimiter-precedes-et-al\"] === \"never\") {\n                    this.etal_prefix_multiple = \" \";\n                } else if (state.tmp[\"delimiter-precedes-et-al\"] === \"after-inverted-name\") {\n                    this.etal_prefix_single = state.tmp.name_delimiter;\n                    this.etal_prefix_multiple = \" \";\n                }\n                this.etal_suffix = \"\";\n                if (!CSL.STARTSWITH_ROMANESQUE_REGEXP.test(this.etal_term)) {\n                    // Not sure what the correct treatment is here, but we should not suppress\n                    // a comma-space.\n                    // https://forums.zotero.org/discussion/76679/delimiter-precedes-et-al-always-dose-not-work-in-locale-zh-cn\n                    if (this.etal_prefix_single === \" \") {\n                        this.etal_prefix_single = \"\";\n                    }\n                    if (this.etal_prefix_multiple === \" \") {\n                        this.etal_prefix_multiple = \"\";\n                    }\n                    if (this.etal_suffix === \" \") {\n                        this.etal_suffix = \"\";\n                    }\n                }\n                // et-al affixes are further adjusted in nameOutput(),\n                // after the term (possibly changed in cs:et-al) is known.\n\n\n                for (var i = 0, ilen = 3; i < ilen; i += 1) {\n                    var key = [\"family\", \"given\"][i];\n                    state.nameOutput[key] = this[key];\n                }\n                state.nameOutput[\"with\"] = this[\"with\"];\n\n                // REMOVE THIS\n                var mywith = \"with\";\n                var with_default_prefix = \"\";\n                var with_suffix = \"\";\n                if (CSL.STARTSWITH_ROMANESQUE_REGEXP.test(mywith)) {\n                    with_default_prefix = \" \";\n                    with_suffix = \" \";\n                }\n                var thewith = {};\n                thewith.single = new CSL.Blob(mywith);\n                thewith.single.strings.suffix = with_suffix;\n                thewith.multiple = new CSL.Blob(mywith);\n                thewith.multiple.strings.suffix = with_suffix;\n                if (state.inheritOpt(state.nameOutput.name, \"delimiter-precedes-last\") === \"always\") {\n                    thewith.single.strings.prefix = state.inheritOpt(this, \"delimiter\", \"names-delimiter\");\n                    thewith.multiple.strings.prefix = state.inheritOpt(this, \"delimiter\", \"names-delimiter\");\n                } else if (state.inheritOpt(state.nameOutput.name, \"delimiter-precedes-last\") === \"contextual\") {\n                    thewith.single.strings.prefix = with_default_prefix;\n                    thewith.multiple.strings.prefix = state.inheritOpt(this, \"delimiter\", \"names-delimiter\");\n                } else if (state.inheritOpt(state.nameOutput.name, \"delimiter-precedes-last\") === \"after-inverted-name\") {\n                    thewith.single.strings.prefix = state.inheritOpt(this, \"delimiter\", \"names-delimiter\");\n                    thewith.multiple.strings.prefix = with_default_prefix;\n                } else {\n                    thewith.single.strings.prefix = with_default_prefix;\n                    thewith.multiple.strings.prefix = with_default_prefix;\n                }\n                state.nameOutput[\"with\"] = thewith;\n\n\n                // XXX label style should be set per variable, since they may differ\n                // XXX with full-form nested names constructs\n                state.nameOutput.label = this.label;\n\n                state.nameOutput.etal_style = this.etal_style;\n                state.nameOutput.etal_term = this.etal_term;\n                state.nameOutput.etal_prefix_single = this.etal_prefix_single;\n                state.nameOutput.etal_prefix_multiple = this.etal_prefix_multiple;\n                state.nameOutput.etal_suffix = this.etal_suffix;\n                state.nameOutput.outputNames();\n                state.tmp[\"et-al-use-first\"] = undefined;\n                state.tmp[\"et-al-min\"] = undefined;\n                state.tmp[\"et-al-use-last\"] = undefined;\n            };\n            this.execs.push(func);\n\n            // unsets\n            func = function (state) {\n                if (!state.tmp.can_substitute.pop()) {\n                    state.tmp.can_substitute.replace(false, CSL.LITERAL);\n                }\n                \n                // For posterity ...\n                //\n                // This was enough to fix the issue reported here:\n                //\n                //   http://forums.zotero.org/discussion/25223/citeproc-bug-substitute-doesnt-work-correctly-for-title-macro/\n                //\n                // The remainder of the changes applied in the same patch\n                // relate to a label assignments, which were found to be\n                // buggy while working on the issue. The test covering\n                // both problems is here:\n                //\n                //   https://bitbucket.org/bdarcus/citeproc-test/src/ab136a6aa8f2/processor-tests/humans/substitute_SuppressOrdinaryVariable.txt\n                if (state.tmp.can_substitute.mystack.length === 1) {\n                    state.tmp.can_block_substitute = false;\n                }\n            };\n            this.execs.push(func);\n\n            state.build.name_flag = false;\n        }\n        target.push(this);\n\n        if (this.tokentype === CSL.END || this.tokentype === CSL.SINGLETON) {\n            state.build.substitute_level.pop();\n            CSL.Util.substituteEnd.call(this, state, target);\n        }\n    }\n};\n\n/*global CSL: true */\n\nCSL.Node.number = {\n    build: function (state, target) {\n        var func;\n        CSL.Util.substituteStart.call(this, state, target);\n        //\n        // This should push a rangeable object to the queue.\n        //\n        if (this.strings.form === \"roman\") {\n            this.formatter = state.fun.romanizer;\n        } else if (this.strings.form === \"ordinal\") {\n            this.formatter = state.fun.ordinalizer;\n        } else if (this.strings.form === \"long-ordinal\") {\n            this.formatter = state.fun.long_ordinalizer;\n        }\n        if (\"undefined\" === typeof this.successor_prefix) {\n            this.successor_prefix = state[state.build.area].opt.layout_delimiter;\n        }\n        if (\"undefined\" === typeof this.splice_prefix) {\n            this.splice_prefix = state[state.build.area].opt.layout_delimiter;\n        }\n        // is this needed?\n        //if (\"undefined\" === typeof this.splice_prefix){\n        //    this.splice_prefix = state[state.tmp.area].opt.layout_delimiter;\n        //}\n        //\n        // Whether we actually stick a number object on\n        // the output queue depends on whether the field\n        // contains a pure number.\n        //\n        // push number or text\n        func = function (state, Item, item) {\n            // NOTE: this works because this is the ONLY function in this node.\n            // If further functions are added, they need to start with the same\n            // abort condition.\n            if (this.variables.length === 0) {\n                return;\n            }\n            var varname;\n            varname = this.variables[0];\n            if (\"undefined\" === typeof item) {\n                var item = {};\n            }\n            if ([\"locator\", \"locator-extra\"].indexOf(varname) > -1) {\n                if (state.tmp.just_looking) {\n                    return;\n                }\n                if (!item[varname]) {\n                    return;\n                }\n            } else {\n                if (!Item[varname]) {\n                    return;\n                }\n            }\n\n            if (varname === 'collection-number' && Item.type === 'legal_case') {\n                state.tmp.renders_collection_number = true;\n            }\n            \n            // For bill or legislation items that have a label-form\n            // attribute set on the cs:number node rendering the locator,\n            // the form and pluralism of locator terms are controlled\n            // separately from those of the initial label. Form is\n            // straightforward: the label uses the value set on\n            // the cs:label node that renders it, and the embedded\n            // labels use the value of label-form set on the cs:number\n            // node. Both default to \"long\".\n            //\n            // Pluralism is more complicated. For embedded labels,\n            // pluralism is evaluated using a simple heuristic that\n            // can be found below (it just looks for comma, ampersand etc).\n            // The item.label rendered independently via cs:label\n            // defaults to singular. It is always singular if embedded\n            // labels exist that (when expanded to their valid CSL\n            // value) do not match the value of item.label. Otherwise,\n            // if one or more matching embedded labels exist, the\n            // cs:label is set to plural.\n            //\n            // The code that does all this is divided between this module,\n            // util_static_locator.js, and util_label.js. It's not easy\n            // to follow, but seems to do the job. Let's home for good\n            // luck out there in the wild.\n            \n            var node = this;\n\n            if (state.tmp.group_context.tip.force_suppress) {\n                return false;\n            }\n\n            if ([\"locator\", \"locator-extra\"].indexOf(varname) > -1) {\n                // amazing that we reach this. should abort sooner if no content?\n                state.processNumber.call(state, node, item, varname, Item.type);\n            } else {\n                if (!state.tmp.group_context.tip.condition && Item[varname]) {\n                    state.tmp.just_did_number = (\"\" + Item[varname]).match(/[0-9]$/);\n                }\n                // UPDATE_GROUP_CONTEXT_CONDITION is run by processNumber\n                state.processNumber.call(state, node, Item, varname, Item.type);\n            }\n\n            if (this.substring) {\n                var val = Item[varname].slice(this.substring);\n                state.output.append(val, node);\n            } else {\n                CSL.Util.outputNumericField(state, varname, Item.id);\n            }\n\n            if ([\"locator\", \"locator-extra\"].indexOf(this.variables_real[0]) > -1\n               && !state.tmp.just_looking) {\n                state.tmp.done_vars.push(this.variables_real[0]);\n                state.tmp.group_context.tip.done_vars.push(this.variables_real[0]);\n            }\n        };\n        this.execs.push(func);\n        target.push(this);\n        \n        CSL.Util.substituteEnd.call(this, state, target);\n    }\n};\n\n/*global CSL: true */\n\n/*\n * Yikes, these functions were running out of scope for yonks.\n * now that they are set in the correct token list,\n * they might be useful for things.\n * FB 2013.11.09\n*/\n\nCSL.Node.sort = {\n    build: function (state, target) {\n        target = state[state.build.root + \"_sort\"].tokens;\n        if (this.tokentype === CSL.START) {\n            if (state.build.area === \"citation\") {\n                state.opt.sort_citations = true;\n            }\n            state.build.area = state.build.root + \"_sort\";\n            state.build.extension = \"_sort\";\n            \n            var func = function (state, Item) {\n                //state.tmp.area = state.tmp.root + \"_sort\";\n                //state.tmp.extension = \"_sort\";\n                if (state.opt.has_layout_locale) {\n                    var langspec = CSL.localeResolve(Item.language, state.opt[\"default-locale\"][0]);\n                    var sort_locales = state[state.tmp.area.slice(0,-5)].opt.sort_locales;\n                    var langForItem;\n                    for (var i=0,ilen=sort_locales.length;i<ilen;i+=1) {\n                        langForItem = sort_locales[i][langspec.bare];\n                        if (!langForItem) {\n                            langForItem = sort_locales[i][langspec.best];\n                        }\n                        if (langForItem) {\n                            break;\n                        }\n                    }\n                    if (!langForItem) {\n                        langForItem = state.opt[\"default-locale\"][0];\n                    }\n                    state.tmp.lang_sort_hold = state.opt.lang;\n                    state.opt.lang = langForItem;\n                }\n            };\n            this.execs.push(func);\n            \n        }\n        if (this.tokentype === CSL.END) {\n            state.build.area = state.build.root;\n            state.build.extension = \"\";\n            var func = function (state) {\n                if (state.opt.has_layout_locale) {\n                    state.opt.lang = state.tmp.lang_sort_hold;\n                    delete state.tmp.lang_sort_hold;\n                }\n                //state.tmp.area = state.tmp.root;\n                //state.tmp.extension = \"\";\n            };\n            this.execs.push(func);\n            /*\n            var func = function (state, Item) {\n                state.tmp.area = state.tmp.root;\n                state.tmp.extension = \"\";\n            }\n            this.execs.push(func);\n            */\n        }\n        target.push(this);\n    }\n};\n\n\n\n/*global CSL: true */\n\nCSL.Node.substitute = {\n    build: function (state, target) {\n        var func;\n        if (this.tokentype === CSL.START) {\n            /* */\n            // set conditional\n            var choose_start = new CSL.Token(\"choose\", CSL.START);\n            CSL.Node.choose.build.call(choose_start, state, target);\n            var if_singleton = new CSL.Token(\"if\", CSL.SINGLETON);\n            func = function() {\n                if (state.tmp.value.length && !state.tmp.common_term_match_fail) {\n                    return true;\n                }\n                return false;\n            }\n            if_singleton.tests = [func];\n            if_singleton.test = state.fun.match.any(if_singleton, state, if_singleton.tests);\n            target.push(if_singleton);\n\n            func = function (state) {\n                state.tmp.can_block_substitute = true;\n                if (state.tmp.value.length && !state.tmp.common_term_match_fail) {\n                    state.tmp.can_substitute.replace(false, CSL.LITERAL);\n                }\n                state.tmp.common_term_match_fail = false;\n            };\n            this.execs.push(func);\n            target.push(this);\n            /* */\n        }\n        if (this.tokentype === CSL.END) {\n            //var if_end = new CSL.Token(\"if\", CSL.END);\n            //CSL.Node[\"if\"].build.call(if_end, state, target);\n            /* */\n            target.push(this);\n            var choose_end = new CSL.Token(\"choose\", CSL.END);\n            CSL.Node.choose.build.call(choose_end, state, target);\n            /* */\n        }\n    }\n};\n\n\n\n/*global CSL: true */\n\nCSL.Node.text = {\n    build: function (state, target) {\n        var func, form, plural, id, num, number, formatter, firstoutput, specialdelimiter, label, suffix, term;\n        if (this.postponed_macro) {\n            var group_start = CSL.Util.cloneToken(this);\n            group_start.name = \"group\";\n            group_start.tokentype = CSL.START;\n            CSL.Node.group.build.call(group_start, state, target);\n\n            CSL.expandMacro.call(state, this, target);\n\n            var group_end = CSL.Util.cloneToken(this);\n            group_end.name = \"group\";\n            group_end.tokentype = CSL.END;\n            if (this.postponed_macro === 'juris-locator-label') {\n                group_end.isJurisLocatorLabel = true;\n            }\n            CSL.Node.group.build.call(group_end, state, target);\n\n        } else {\n            CSL.Util.substituteStart.call(this, state, target);\n            // ...\n            //\n            // Do non-macro stuff\n            \n            // Guess again. this.variables is ephemeral, adjusted by an initial\n            // function set on the node via @variable attribute setup.\n            //variable = this.variables[0];\n            \n            if (!this.variables_real) {\n                this.variables_real = [];\n            }\n            if (!this.variables) {\n                this.variables = [];\n            }\n\n            form = \"long\";\n            plural = 0;\n            if (this.strings.form) {\n                form = this.strings.form;\n            }\n            if (this.strings.plural) {\n                plural = this.strings.plural;\n            }\n            if (\"citation-number\" === this.variables_real[0] || \"year-suffix\" === this.variables_real[0] || \"citation-label\" === this.variables_real[0]) {\n                //\n                // citation-number and year-suffix are super special,\n                // because they are rangeables, and require a completely\n                // different set of formatting parameters on the output\n                // queue.\n                if (this.variables_real[0] === \"citation-number\") {\n\n                    if (state.build.root === \"citation\") {\n                        state.opt.update_mode = CSL.NUMERIC;\n                    }\n                    if (state.build.root === \"bibliography\") {\n                        state.opt.bib_mode = CSL.NUMERIC;\n                    }\n                    //this.strings.is_rangeable = true;\n                    if (\"citation-number\" === state[state.tmp.area].opt.collapse) {\n                        this.range_prefix = state.getTerm(\"citation-range-delimiter\");\n                    }\n                    this.successor_prefix = state[state.build.area].opt.layout_delimiter;\n                    this.splice_prefix = state[state.build.area].opt.layout_delimiter;\n                    func = function (state, Item, item) {\n\n                        id = \"\" + Item.id;\n                        if (!state.tmp.just_looking) {\n                            if (state.tmp.area.slice(-5) === \"_sort\" && this.variables[0] === \"citation-number\") {\n                                if (state.tmp.area === \"bibliography_sort\") {\n                                    state.tmp.group_context.tip.done_vars.push(\"citation-number\");\n                                }\n                                if (state.tmp.area === \"citation_sort\" && state.bibliography_sort.tmp.citation_number_map) {\n                                    var num = state.bibliography_sort.tmp.citation_number_map[state.registry.registry[Item.id].seq];\n                                } else {\n                                    var num = state.registry.registry[Item.id].seq;\n                                }\n                                if (num) {\n                                    // Code currently in util_number.js\n                                    num = CSL.Util.padding(\"\" + num);\n                                }\n                                state.output.append(num, this);\n                                return;\n                            }\n                            if (item && item[\"author-only\"]) {\n                                state.tmp.element_trace.replace(\"suppress-me\");\n                            }\n                            if (state.tmp.area !== \"bibliography_sort\" && state.bibliography_sort.tmp.citation_number_map && state.bibliography_sort.opt.citation_number_sort_direction === CSL.DESCENDING) {\n                                num = state.bibliography_sort.tmp.citation_number_map[state.registry.registry[id].seq];\n                            } else {\n                                num = state.registry.registry[id].seq;\n                            }\n                            if (state.opt.citation_number_slug) {\n                                state.output.append(state.opt.citation_number_slug, this);\n                            } else {\n                                number = new CSL.NumericBlob(state, false, num, this, Item.id);\n                                if (state.tmp.in_cite_predecessor) {\n                                    number.suppress_splice_prefix = true;\n                                }\n                                state.output.append(number, \"literal\");\n                            }\n                        }\n                    };\n                    this.execs.push(func);\n                } else if (this.variables_real[0] === \"year-suffix\") {\n\n                    state.opt.has_year_suffix = true;\n\n                    if (state[state.tmp.area].opt.collapse === \"year-suffix-ranged\") {\n                        //this.range_prefix = \"-\";\n                        this.range_prefix = state.getTerm(\"citation-range-delimiter\");\n                    }\n                    this.successor_prefix = state[state.build.area].opt.layout_delimiter;\n                    if (state[state.tmp.area].opt[\"year-suffix-delimiter\"]) {\n                        this.successor_prefix = state[state.build.area].opt[\"year-suffix-delimiter\"];\n                    }\n                    func = function (state, Item) {\n                        if (state.registry.registry[Item.id] && state.registry.registry[Item.id].disambig.year_suffix !== false && !state.tmp.just_looking) {\n                            //state.output.append(state.registry.registry[Item.id].disambig[2],this);\n                            num = parseInt(state.registry.registry[Item.id].disambig.year_suffix, 10);\n\n                            //if (state[state.tmp.area].opt.collapse === \"year-suffix-ranged\") {\n                            //    //this.range_prefix = \"-\";\n                            //    this.range_prefix = state.getTerm(\"citation-range-delimiter\");\n                            //}\n                            //this.successor_prefix = state[state.tmp.area].opt.layout_delimiter;\n                            if (state[state.tmp.area].opt.cite_group_delimiter) {\n                                this.successor_prefix = state[state.tmp.area].opt.cite_group_delimiter;\n                            }\n                            number = new CSL.NumericBlob(state, false, num, this, Item.id);\n                            formatter = new CSL.Util.Suffixator(CSL.SUFFIX_CHARS);\n                            number.setFormatter(formatter);\n                            state.output.append(number, \"literal\");\n                            firstoutput = false;\n                            // XXX Can we do something better for length here?\n                            for (var i=0,ilen=state.tmp.group_context.mystack.length; i<ilen; i++) {\n                                var flags = state.tmp.group_context.mystack[i];\n                                if (!flags.variable_success && (flags.variable_attempt || (!flags.variable_attempt && !flags.term_intended))) {\n                                    firstoutput = true;\n                                    break;\n                                }\n                            }\n                            specialdelimiter = state[state.tmp.area].opt[\"year-suffix-delimiter\"];\n                            if (firstoutput && specialdelimiter && !state.tmp.sort_key_flag) {\n                                state.tmp.splice_delimiter = state[state.tmp.area].opt[\"year-suffix-delimiter\"];\n                            }\n                        }\n                    };\n                    this.execs.push(func);\n                } else if (this.variables_real[0] === \"citation-label\") {\n                    if (state.build.root === \"bibliography\") {\n                        state.opt.bib_mode = CSL.TRIGRAPH;\n                    }\n                    state.opt.has_year_suffix = true;\n                    func = function (state, Item) {\n                        label = Item[\"citation-label\"];\n                        if (!label) {\n                            label = state.getCitationLabel(Item);\n                        }\n                        if (!state.tmp.just_looking) {\n                            suffix = \"\";\n                            if (state.registry.registry[Item.id] && state.registry.registry[Item.id].disambig.year_suffix !== false) {\n                                num = parseInt(state.registry.registry[Item.id].disambig.year_suffix, 10);\n                                suffix = state.fun.suffixator.format(num);\n                            }\n                            label += suffix;\n                        }\n                        state.output.append(label, this);\n                    };\n                    this.execs.push(func);\n                }\n            } else {\n                if (this.strings.term) {\n                    \n                    // printterm\n                    func = function (state, Item) {\n                        var gender = state.opt.gender[Item.type];\n                        var term = this.strings.term;\n                        term = state.getTerm(term, form, plural, gender, CSL.TOLERANT, this.default_locale);\n                        var myterm;\n                        // if the term is not an empty string, say\n                        // that we rendered a term\n                        if (term !== \"\") {\n                            state.tmp.group_context.tip.term_intended = true;\n                        }\n                        CSL.UPDATE_GROUP_CONTEXT_CONDITION(state, term, null, this);\n                        \n                        // capitalize the first letter of a term, if it is the\n                        // first thing rendered in a citation (or if it is\n                        // being rendered immediately after terminal punctuation,\n                        // I guess, actually).\n                        if (!state.tmp.term_predecessor && !(state.opt[\"class\"] === \"in-text\" && state.tmp.area === \"citation\")) {\n                            myterm = CSL.Output.Formatters[\"capitalize-first\"](state, term);\n                            //CSL.debug(\"Capitalize\");\n                        } else {\n                            myterm = term;\n                        }\n                        \n                        // XXXXX Cut-and-paste code in multiple locations. This code block should be\n                        // collected in a function.\n                        // Tag: strip-periods-block\n                        if (state.tmp.strip_periods) {\n                            myterm = myterm.replace(/\\./g, \"\");\n                        } else {\n                            for (var i = 0, ilen = this.decorations.length; i < ilen; i += 1) {\n                                if (\"@strip-periods\" === this.decorations[i][0] && \"true\" === this.decorations[i][1]) {\n                                    myterm = myterm.replace(/\\./g, \"\");\n                                    break;\n                                }\n                            }\n                        }\n                        state.output.append(myterm, this);\n                        if (state.tmp.can_block_substitute) {\n                            // Black magic here. This causes the cs:substitution condition to pass,\n                            // blocking further rendering within its scope. \n                            state.tmp.can_substitute.replace(false, CSL.LITERAL);\n                        }\n                    };\n                    this.execs.push(func);\n                    state.build.term = false;\n                    state.build.form = false;\n                    state.build.plural = false;\n                } else if (this.variables_real.length) {\n                    func = function (state, Item) {\n\n                        // If some text variable is rendered, we're not collapsing.\n                        if (this.variables_real[0] !== \"locator\") {\n                            state.tmp.have_collapsed = false;\n                        }\n\n                        if (!state.tmp.group_context.tip.condition && Item[this.variables[0]]) {\n                            state.tmp.just_did_number = false;\n                        }\n                        var val = Item[this.variables[0]];\n                        if (val && !state.tmp.group_context.tip.condition) {\n                            if ((\"\" + val).slice(-1).match(/[0-9]/)) {\n                                state.tmp.just_did_number = true;\n                            } else {\n                                state.tmp.just_did_number = false;\n                            }\n                        }\n                    };\n                    this.execs.push(func);\n\n                    // plain string fields\n\n                    // Deal with multi-fields and ordinary fields separately.\n                    if (CSL.MULTI_FIELDS.indexOf(this.variables_real[0]) > -1\n                        || this.variables_real[0].indexOf(\"-main\") > -1\n                        || this.variables_real[0].indexOf(\"-sub\") > -1\n                        || [\"language-name\", \"language-name-original\"].indexOf(this.variables_real[0]) > -1\n                       ) {\n\n                        // multi-fields\n                        // Initialize transform factory according to whether\n                        // abbreviation is desired.\n                        var abbrevfam = this.variables[0];\n                        var abbrfall = false;\n                        var altvar = false;\n                        var transfall = false;\n                        if (form === \"short\") {\n                            if (this.variables_real[0].slice(-6) !== \"-short\") {\n                                altvar = this.variables_real[0] + \"-short\";\n                            }\n                        } else {\n                            abbrevfam = false;\n                        }\n                        if (state.build.extension) {\n                            // multi-fields for sorting get a sort transform,\n                            // (abbreviated if the short form was selected)\n                            transfall = true;\n                        } else {\n                            transfall = true;\n                            abbrfall = true;\n\t\t\t\t\t\t}\n\n                        func = state.transform.getOutputFunction(this.variables, abbrevfam, abbrfall, altvar, transfall);\n                    } else {\n                        // ordinary fields\n                        if (CSL.CITE_FIELDS.indexOf(this.variables_real[0]) > -1) {\n                            // per-cite fields are read from item, rather than Item\n                            func = function (state, Item, item) {\n                                if (item && item[this.variables[0]]) {\n                                    // Code copied to page variable as well; both\n                                    // become cs:number in MLZ extended schema\n                                    \n                                    // If locator, use cs:number. Otherwise, render\n                                    // normally.\n\n                                    // XXX The code below is pretty-much copied from\n                                    // XXX node_number.js. Should be a common function.\n                                    // XXX BEGIN\n                                    state.processNumber(this, item, this.variables[0], Item.type);\n                                    CSL.Util.outputNumericField(state, this.variables[0], Item.id);\n                                    // XXX END\n\n                                    if ([\"locator\", \"locator-extra\"].indexOf(this.variables_real[0]) > -1\n                                       && !state.tmp.just_looking) { \n                                        state.tmp.done_vars.push(this.variables_real[0]);\n                                    }\n                                }\n                            };\n                        } else  if ([\"page\", \"page-first\", \"chapter-number\", \"collection-number\", \"edition\", \"issue\", \"number\", \"number-of-pages\", \"number-of-volumes\", \"volume\"].indexOf(this.variables_real[0]) > -1) {\n                            // page gets mangled with the correct collapsing\n                            // algorithm\n                            func = function(state, Item) {\n                                state.processNumber(this, Item, this.variables[0], Item.type);\n                                CSL.Util.outputNumericField(state, this.variables[0], Item.id);\n                            };\n                        } else if ([\"URL\", \"DOI\"].indexOf(this.variables_real[0]) > -1) {\n                            func = function (state, Item) {\n                                var value;\n                                if (this.variables[0]) {\n                                    value = state.getVariable(Item, this.variables[0], form);\n                                    if (value) {\n                                        if (this.variables[0] === \"URL\" && form === \"short\") {\n                                            value = value.replace(/(.*\\.[^\\/]+)\\/.*/, \"$1\");\n                                            if (value.match(/\\/\\/www\\./)) {\n                                                value = value.replace(/https?:\\/\\//, \"\");\n                                            }\n                                        }\n                                        // true is for non-suppression of periods\n                                        if (state.opt.development_extensions.wrap_url_and_doi) {\n                                            if (!this.decorations.length || this.decorations[0][0] !== \"@\" + this.variables[0]) {\n                                                // Special-casing to fix https://github.com/Juris-M/citeproc-js/issues/57\n                                                // clone current token, to avoid collateral damage\n                                                var clonetoken = CSL.Util.cloneToken(this);\n                                                // cast a group blob\n                                                var groupblob = new CSL.Blob(null, null, \"url-wrapper\");\n                                                // set the DOI decoration on the blob\n                                                groupblob.decorations.push([\"@DOI\", \"true\"]);\n                                                if (this.variables_real[0] === \"DOI\") {\n                                                    // strip a proper DOI prefix\n                                                    var prefix;\n                                                    if (this.strings.prefix && this.strings.prefix.match(/^.*https:\\/\\/doi\\.org\\/$/)) {\n                                                        value = value.replace(/^https?:\\/\\/doi\\.org\\//, \"\");\n                                                        if (value.match(/^https?:\\/\\//)) {\n                                                            // Do not tamper with another protocol + domain if already set in field value\n                                                            prefix = \"\";\n                                                        } else {\n                                                            // Otherwise https + domain\n                                                            prefix = \"https://doi.org/\";\n                                                        }\n                                                        // set any string prefix on the clone\n                                                        clonetoken.strings.prefix = this.strings.prefix.slice(0, clonetoken.strings.prefix.length-16);\n                                                    }\n                                                    // cast a text blob\n                                                    // set the prefix as the content of the blob\n                                                    var prefixblob = new CSL.Blob(prefix);\n                                                    // cast another text blob\n                                                    // set the value as the content of the second blob\n                                                    var valueblob = new CSL.Blob(value);\n                                                    // append new text token and clone to group token\n                                                    groupblob.push(prefixblob);\n                                                    groupblob.push(valueblob);\n                                                    // append group token to output\n                                                    state.output.append(groupblob, clonetoken, false, false, true);\n                                                } else {\n                                                    var valueblob = new CSL.Blob(value);\n                                                    // append new text token and clone to group token\n                                                    groupblob.push(valueblob);\n                                                    // append group token to output\n                                                    //this.decorations = [[\"@\" + this.variables[0], \"true\"]].concat(this.decorations);\n                                                    state.output.append(groupblob, clonetoken, false, false, true);\n                                                }\n                                            } else {\n                                                state.output.append(value, this, false, false, true);\n                                            }\n                                        } else {\n                                            // This is totally unnecessary, isn't it?\n                                            if (this.decorations.length) {\n                                                for (var i=this.decorations.length-1; i>-1; i--) {\n                                                    if (this.decorations[i][0] === \"@\" + this.variables[0]) {\n                                                        this.decorations = this.decorations.slice(0, i).concat(this.decorations.slice(i+1));\n                                                    }\n                                                }\n                                            }\n                                            state.output.append(value, this, false, false, true);\n                                        }\n                                    }\n                                }\n                            };\n                        } else if (this.variables_real[0] === \"section\") {\n                            // Sections for statutes are special. This is an uncommon\n                            // variable, so we save the cost of the runtime check\n                            // unless it's being used.\n                            func = function (state, Item) {\n                                var value;\n                                value = state.getVariable(Item, this.variables[0], form);\n                                if (value) {\n                                    state.output.append(value, this);\n                                }\n                            };\n                        } else if (this.variables_real[0] === \"hereinafter\") {\n                            func = function (state, Item) {\n                                var value = state.transform.abbrevs[\"default\"][\"hereinafter\"][Item.id];\n                                if (value) {\n                                    state.output.append(value, this);\n                                    state.tmp.group_context.tip.variable_success = true;\n                                }\n                            };\n                        } else {\n                            // anything left over just gets output in the normal way.\n                            func = function (state, Item) {\n                                var value;\n                                if (this.variables[0]) {\n                                    value = state.getVariable(Item, this.variables[0], form);\n                                    if (value) {\n                                        value = \"\" + value;\n                                        value = value.split(\"\\\\\").join(\"\");\n                                        state.output.append(value, this);\n                                    }\n                                }\n                            };\n                        }\n                    }\n                    this.execs.push(func);\n                } else if (this.strings.value) {\n                    // for the text value attribute.\n                    func = function (state) {\n                        state.tmp.group_context.tip.term_intended = true;\n                        // true flags that this is a literal-value term\n                        CSL.UPDATE_GROUP_CONTEXT_CONDITION(state, this.strings.value, true, this);\n                        state.output.append(this.strings.value, this);\n                        if (state.tmp.can_block_substitute) {\n                            // Black magic here. This causes the cs:substitution condition to pass,\n                            // blocking further rendering within its scope. \n                            state.tmp.can_substitute.replace(false, CSL.LITERAL);\n                        }\n                    };\n                    this.execs.push(func);\n                    // otherwise no output\n                }\n            }\n            target.push(this);\n            CSL.Util.substituteEnd.call(this, state, target);\n        }\n    }\n};\n\n\n\n/*global CSL: true */\n\nCSL.Node.intext = {\n    build: function (state, target) {\n        if (this.tokentype === CSL.START) {\n\n            state.build.area = \"intext\";\n            state.build.root = \"intext\";\n            state.build.extension = \"\";\n\n            var func = function(state, Item) {\n                state.tmp.area = \"intext\";\n                state.tmp.root = \"intext\";\n                state.tmp.extension = \"\";\n            }\n            this.execs.push(func);\n        }\n        if (this.tokentype === CSL.END) {\n\n            // Do whatever cs:citation does with sorting.\n            state.intext_sort = {\n                opt: {\n                    sort_directions: state.citation_sort.opt.sort_directions\n                }\n            }\n            state.intext.srt = state.citation.srt;\n        }\n        target.push(this);\n    }\n};\n\n\n/*global CSL: true */\n\nCSL.Attributes = {};\n\nCSL.Attributes[\"@disambiguate\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    if (arg === \"true\") {\n        state.opt.has_disambiguate = true;\n        var func = function (Item) {\n            if (state.tmp.area === \"bibliography\") {\n                if (state.tmp.disambiguate_count < state.registry.registry[Item.id].disambig.disambiguate) {\n                    state.tmp.disambiguate_count += 1;\n                    return true;\n                }\n            } else {\n                state.tmp.disambiguate_maxMax += 1;\n                if (state.tmp.disambig_settings.disambiguate\n                    && state.tmp.disambiguate_count < state.tmp.disambig_settings.disambiguate) {\n                    state.tmp.disambiguate_count += 1;\n                    return true;\n                }\n            }\n            return false;\n        };\n        this.tests.push(func);\n    } else if (arg === \"check-ambiguity-and-backreference\") {\n        var func = function (Item) {\n            if (state.registry.registry[Item.id].disambig.disambiguate && state.registry.registry[Item.id][\"citation-count\"] > 1) {\n                return true;\n            }\n            return false;\n        };\n        this.tests.push(func);\n    }\n};\n\nCSL.Attributes[\"@is-numeric\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var variables = arg.split(/\\s+/);\n    var maketest = function(variable) {\n        return function (Item, item) {\n            var myitem = Item;\n            if (item && [\"locator\",\"locator-extra\"].indexOf(variable) > -1) {\n                myitem = item;\n            }\n            if (!myitem[variable]) {\n                return false;\n            }\n            if (CSL.NUMERIC_VARIABLES.indexOf(variable) > -1) {\n                if (!state.tmp.shadow_numbers[variable]) {\n                    state.processNumber(false, myitem, variable, Item.type);\n                }\n                if (state.tmp.shadow_numbers[variable].numeric) {\n                    return true;\n                }\n            } else if ([\"title\",\"version\"].indexOf(variable) > -1) {\n                if (myitem[variable].slice(-1) === \"\" + parseInt(myitem[variable].slice(-1), 10)) {\n                    return true;\n                }\n            }\n            return false;\n        };\n    };\n    for (var i=0; i<variables.length; i+=1) {\n        this.tests.push(maketest(variables[i]));\n    }\n};\n\n\nCSL.Attributes[\"@is-uncertain-date\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var variables = arg.split(/\\s+/);\n    // Strip off any boolean prefix.\n    var maketest = function (myvariable) {\n        return function(Item) {\n            if (Item[myvariable] && Item[myvariable].circa) {\n                return true;\n            } else {\n                return false;\n            }\n        };\n    };\n    for (var i=0,ilen=variables.length;i<ilen;i+=1) {\n        this.tests.push(maketest(variables[i]));\n    }\n};\n\n\nCSL.Attributes[\"@locator\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var trylabels = arg.replace(\"sub verbo\", \"sub-verbo\");\n    trylabels = trylabels.split(/\\s+/);\n    // Strip off any boolean prefix.\n    var maketest = function (trylabel) {\n        return function(Item, item) {\n            var label;\n            state.processNumber(false, item, \"locator\");\n            label = state.tmp.shadow_numbers.locator.label;\n            if (label && trylabel === label) {\n                return true;\n            } else {\n                return false;\n            }\n        };\n    };\n    for (var i=0,ilen=trylabels.length;i<ilen;i+=1) {\n        this.tests.push(maketest(trylabels[i]));\n    }\n};\n\n\nCSL.Attributes[\"@position\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var tryposition;\n    state.opt.update_mode = CSL.POSITION;\n    var trypositions = arg.split(/\\s+/);\n    var testSubsequentNear = function (Item, item) {\n        if (item && CSL.POSITION_MAP[item.position] >= CSL.POSITION_MAP[CSL.POSITION_SUBSEQUENT] && item[\"near-note\"]) {\n            return true;\n        }\n        return false;\n    };\n    var testSubsequentNotNear = function (Item, item) {\n        if (item && CSL.POSITION_MAP[item.position] == CSL.POSITION_MAP[CSL.POSITION_SUBSEQUENT] && !item[\"near-note\"]) {\n            return true;\n        }\n        return false;\n    };\n    var maketest = function(tryposition) {\n        return function (Item, item) {\n            if (state.tmp.area === \"bibliography\") {\n                return false;\n            }\n            if (item && \"undefined\" === typeof item.position) {\n                item.position = 0;\n            }\n            if (item && typeof item.position === \"number\") {\n                if (item.position === 0 && tryposition === 0) {\n                    return true;\n                } else if (tryposition > 0 && CSL.POSITION_MAP[item.position] >= CSL.POSITION_MAP[tryposition]) {\n                    return true;\n                }\n            } else if (tryposition === 0) {\n                return true;\n            }\n            return false;\n        };\n    };\n    for (var i=0,ilen=trypositions.length;i<ilen;i+=1) {\n        var tryposition = trypositions[i];\n        if (tryposition === \"first\") {\n            tryposition = CSL.POSITION_FIRST;\n        } else if (tryposition === \"container-subsequent\") {\n            tryposition = CSL.POSITION_CONTAINER_SUBSEQUENT;\n        } else if (tryposition === \"subsequent\") {\n            tryposition = CSL.POSITION_SUBSEQUENT;\n        } else if (tryposition === \"ibid\") {\n            tryposition = CSL.POSITION_IBID;\n        } else if (tryposition === \"ibid-with-locator\") {\n            tryposition = CSL.POSITION_IBID_WITH_LOCATOR;\n        }\n        if (\"near-note\" === tryposition) {\n            this.tests.push(testSubsequentNear);\n        } else if (\"far-note\" === tryposition) {\n            this.tests.push(testSubsequentNotNear);\n        } else {\n            this.tests.push(maketest(tryposition));\n        }\n    }\n};\n\nCSL.Attributes[\"@type\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    // XXX This is ALWAYS composed as an \"any\" match\n    var types = arg.split(/\\s+/);\n    // Strip off any boolean prefix.\n    var maketest = function (mytype) {\n        return function(Item) {\n            var ret = (Item.type === mytype);\n            if (ret) {\n                return true;\n            } else {\n                return false;\n            }\n        };\n    };\n    var tests = [];\n    for (var i=0,ilen=types.length;i<ilen;i+=1) {\n        tests.push(maketest(types[i]));\n    }\n    this.tests.push(state.fun.match.any(this, state, tests));\n};\n\nCSL.Attributes[\"@variable\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var func;\n    this.variables = arg.split(/\\s+/);\n    this.variables_real = this.variables.slice();\n\n    // First the non-conditional code.\n    if (\"label\" === this.name && this.variables[0]) {\n        this.strings.term = this.variables[0];\n    } else if ([\"names\", \"date\", \"text\", \"number\"].indexOf(this.name) > -1) {\n        //\n        // An oddity of variable handling is that this.variables\n        // is actually ephemeral; the full list of variables is\n        // held in the variables_real var, and pushed into this.variables\n        // conditionally in order to suppress repeat renderings of\n        // the same item variable.  [STILL FUNCTIONAL? 2010.01.15]\n        //\n        // set variable names\n        func = function (state, Item, item) {\n            // Clear this.variables in place\n            for (var i = this.variables.length - 1; i > -1; i += -1) {\n                this.variables.pop();\n            }\n            for (var i=0,ilen=this.variables_real.length;i<ilen;i++) {\n                // set variable name if not quashed, and if not the title of a legal case w/suppress-author\n                if (state.tmp.done_vars.indexOf(this.variables_real[i]) === -1 \n// This looks nuts. Why suppress a case name if not required by context?\n//                    && !(item && Item.type === \"legal_case\" && item[\"suppress-author\"] && this.variables_real[i] === \"title\")\n                   ) {\n                    this.variables.push(this.variables_real[i]);\n                }\n                if (state.tmp.can_block_substitute) {\n                    state.tmp.done_vars.push(this.variables_real[i]);\n                }\n            }\n        };\n        this.execs.push(func);\n\n        // check for output\n        func = function (state, Item, item) {\n            var output = false;\n            for (var i=0,ilen=this.variables.length;i<ilen;i++) {\n                var variable = this.variables[i];\n                if ([\"authority\", \"committee\"].indexOf(variable) > -1\n                    && \"string\" === typeof Item[variable]\n                    && \"names\" === this.name) {\n\n                    // Great! So for each of these, we split.\n                    // And we only recombine everything if the length\n                    // of all the splits matches.\n                    \n                    // Preflight\n                    var isValid = true;\n                    var rawNames = Item[variable].split(/\\s*;\\s*/);\n                    var rawMultiNames = {};\n                    if (Item.multi && Item.multi._keys[variable]) {\n                        for (var langTag in Item.multi._keys[variable]) {\n                            rawMultiNames[langTag] = Item.multi._keys[variable][langTag].split(/\\s*;\\s*/);\n                            if (rawMultiNames[langTag].length !== rawNames.length) {\n                                isValid = false;\n                                break;\n                            }\n                        }\n                    }\n                    if (!isValid) {\n                        rawNames = [Item[variable]];\n                        rawMultiNames = Item.multi._keys[variable];\n                    }\n                    for (var j = 0, jlen = rawNames.length; j < jlen; j++) {\n                        var creatorParent = {\n                            literal:rawNames[j],\n                            multi:{\n                                _key:{}\n                            }\n                        };\n                        for (var langTag in rawMultiNames) {\n                            var creatorChild = {\n                                literal:rawMultiNames[langTag][j]\n                            };\n                            creatorParent.multi._key[langTag] = creatorChild;\n                        }\n                        rawNames[j] = creatorParent;\n                    }\n                    Item[variable] = rawNames;\n                }\n                if (this.strings.form === \"short\" && !Item[variable]) {\n                    if (variable === \"title\") {\n                        variable = \"title-short\";\n                    } else if (variable === \"container-title\") {\n                        variable = \"container-title-short\";\n                    }\n                }\n                if (variable === \"year-suffix\") {\n                    // year-suffix always signals that it produces output,\n                    // even when it doesn't. This permits it to be used with\n                    // the \"no date\" term inside a group used exclusively\n                    // to control formatting.\n                    output = true;\n                    break;\n                } else if (CSL.DATE_VARIABLES.indexOf(variable) > -1) {\n                    if (state.opt.development_extensions.locator_date_and_revision && \"locator-date\" === variable) {\n                        // If locator-date is set, it's valid.\n                        output = true;\n                        break;\n                    }\n                    if (Item[variable]) {\n                        for (var key in Item[variable]) {\n                            if (this.dateparts.indexOf(key) === -1 && \"literal\" !== key) {\n                                continue;\n                            }\n                            if (Item[variable][key]) {\n                                output = true;\n                                break;\n                            }\n                        }\n                        if (output) {\n                            break;\n                        }\n                    }\n                } else if (\"locator\" === variable) {\n                    if (item && item.locator) {\n                        output = true;\n                    }\n                    break;\n                } else if (\"locator-extra\" === variable) {\n                    if (item && item[\"locator-extra\"]) {\n                        output = true;\n                    }\n                    break;\n                } else if ([\"citation-number\",\"citation-label\"].indexOf(variable) > -1) {\n                    output = true;\n                    break;\n                } else if (\"first-reference-note-number\" === variable) {\n                    if (item && item[\"first-reference-note-number\"]) {\n                        output = true;\n                    }\n                    break;\n                } else if (\"first-container-reference-note-number\" === variable) {\n                    if (item && item[\"first-container-reference-note-number\"]) {\n                        output = true;\n                    }\n                    break;\n                } else if (\"hereinafter\" === variable) {\n                    if (state.transform.abbrevs[\"default\"].hereinafter[Item.id]\n                        && state.sys.getAbbreviation\n                        && Item.id) {\n\t\t\t\t\t\t\n                        output = true;\n                    }\n                    break;\n                } else if (\"object\" === typeof Item[variable]) {\n                    break;\n                } else if (\"string\" === typeof Item[variable] && Item[variable]) {\n                    output = true;\n                    break;\n                } else if (\"number\" === typeof Item[variable]) {\n                    output = true;\n                    break;\n                }\n                if (output) {\n                    break;\n                }\n            }\n            //print(\"-- VAR: \"+variable);\n            //flag = state.tmp.group_context.tip;\n            if (output) {\n                for (var i=0,ilen=this.variables_real.length;i<ilen;i++) {\n                    var variable = this.variables_real[i];\n                    if (variable !== \"citation-number\" || state.tmp.area !== \"bibliography\") {\n                        state.tmp.cite_renders_content = true;\n                    }\n                    //print(\"  setting [2] to true based on: \" + arg);\n                    state.tmp.group_context.tip.variable_success = true;\n                    // For util_substitute.js, subsequent-author-substitute\n                    if (state.tmp.can_substitute.value() \n                        && state.tmp.area === \"bibliography\"\n                        && \"string\" === typeof Item[variable]) {\n\n                        state.tmp.name_node.top = state.output.current.value();\n                        state.tmp.rendered_name.push(Item[variable]);\n                    }\n                }\n                state.tmp.can_substitute.replace(false,  CSL.LITERAL);\n            } else {\n                //print(\"  setting [1] to true based on: \" + arg);\n                state.tmp.group_context.tip.variable_attempt = true;\n            }\n            //state.tmp.group_context.replace(flag);\n        };\n        this.execs.push(func);\n    } else if ([\"if\",  \"else-if\", \"condition\"].indexOf(this.name) > -1) {\n        // Strip off any boolean prefix.\n        // Now the conditionals.\n        var maketest = function (variable) {\n            return function(Item,item){\n                var myitem = Item;\n                if (item && [\"locator\", \"locator-extra\", \"first-reference-note-number\", \"first-container-reference-note-number\", \"locator-date\"].indexOf(variable) > -1) {\n                    myitem = item;\n                }\n                // We don't run loadAbbreviation() here; it is run by the application-supplied\n                // retrieveItem() if hereinafter functionality is to be used, so this key will\n                // always exist in memory, possibly with a nil value.\n                if (variable === \"hereinafter\" && state.sys.getAbbreviation && myitem.id) {\n                    if (state.transform.abbrevs[\"default\"].hereinafter[myitem.id]) {\n                        return true;\n                    }\n                } else if (myitem[variable]) {\n                    if (\"number\" === typeof myitem[variable] || \"string\" === typeof myitem[variable]) {\n                        return true;\n                    } else if (\"object\" === typeof myitem[variable]) {\n                        //\n                        // this will turn true only for hash objects\n                        // that have at least one attribute, or for a\n                        // non-zero-length list\n                        //\n                        for (var key in myitem[variable]) {\n                            if (myitem[variable][key]) {\n                                return true;\n                            }\n                        }\n                    }\n                }\n                return false;\n            };\n        };\n        for (var i=0,ilen=this.variables.length;i<ilen;i+=1) {\n            this.tests.push(maketest(this.variables[i]));\n        }\n    }\n};\n\n\nCSL.Attributes[\"@page\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var trylabels = arg.replace(\"sub verbo\", \"sub-verbo\");\n    trylabels = trylabels.split(/\\s+/);\n    // Strip off any boolean prefix.\n    var maketest = function (trylabel) {\n        return function(Item) {\n            var label;\n            state.processNumber(false, Item, \"page\", Item.type);\n            if (!state.tmp.shadow_numbers.page.label) {\n                label = \"page\";\n            } else if (state.tmp.shadow_numbers.page.label === \"sub verbo\") {\n                label = \"sub-verbo\";\n            } else {\n                label = state.tmp.shadow_numbers.page.label;\n            }\n            if (state.tmp.shadow_numbers.page.values.length > 0) {\n                if (state.tmp.shadow_numbers.page.values[0].gotosleepability) {\n                    state.tmp.shadow_numbers.page.values[0].labelVisibility = false;\n                }\n            }\n            if (trylabel === label) {\n                return true;\n            } else {\n                return false;\n            }\n        };\n    };\n    for (var i=0,ilen=trylabels.length;i<ilen;i+=1) {\n        this.tests.push(maketest(trylabels[i]));\n    }\n};\n\n\n// a near duplicate of code above\nCSL.Attributes[\"@number\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var trylabels = arg.split(/\\s+/);\n    var maketest = function(trylabel) {\n        return function (Item) {\n            var label;\n            state.processNumber(false, Item, \"number\", Item.type);\n            if (!state.tmp.shadow_numbers.number.label) {\n                label = \"number\";\n            } else {\n                label = state.tmp.shadow_numbers.number.label;\n            }\n            if (trylabel === label) {\n                return true;\n            } else {\n                return false;\n            }\n        };\n    };\n    for (var i=0,ilen=trylabels.length;i<ilen;i+=1) {\n        this.tests.push(maketest(trylabels[i]));\n    }\n};\n\nCSL.Attributes[\"@jurisdiction\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var tryjurisdictions = arg.split(/\\s+/);\n    \n    // This forces a match=any method, similar to @type\n    var maketests = function (tryjurisdictions) {\n        return function(Item) {\n            if (!Item.jurisdiction) {\n                return false;\n            }\n            var jurisdiction = Item.jurisdiction;\n            for (var i=0,ilen=tryjurisdictions.length;i<ilen;i++) {\n                if (jurisdiction === tryjurisdictions[i]) {\n                    return true;\n                }\n            }\n            return false;\n        };\n    };\n    this.tests.push(maketests(tryjurisdictions));\n};\n\nCSL.Attributes[\"@country\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var trycountries = arg.split(/\\s+/);\n    \n    // This forces a match=any method, similar to @type\n    var maketests = function (trycountries) {\n        return function(Item) {\n            if (!Item.country) {\n                return false;\n            }\n            var country = Item.country;\n            for (var i=0,ilen=trycountries.length;i<ilen;i++) {\n                if (country === trycountries[i]) {\n                    return true;\n                }\n            }\n            return false;\n        };\n    };\n    this.tests.push(maketests(trycountries));\n};\n\nCSL.Attributes[\"@context\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var func = function () {\n        if ([\"bibliography\", \"citation\"].indexOf(arg) > -1) {\n\t\t    var area = state.tmp.area.slice(0, arg.length);\n\t\t    if (area === arg) {\n\t\t\t    return true;\n\t\t    }\n\t\t    return false;\n        } else if (\"alternative\" === arg) {\n            return !!state.tmp.abort_alternative;\n        }\n    };\n    this.tests.push(func);\n};\n\nCSL.Attributes[\"@has-year-only\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var trydates = arg.split(/\\s+/);\n    var maketest = function (trydate) {\n        return function(Item) {\n            var date = Item[trydate];\n            if (!date || date.month || date.season) {\n                return false;\n            } else {\n                return true;\n            }\n        };\n    };\n    for (var i=0,ilen=trydates.length;i<ilen;i+=1) {\n        this.tests.push(maketest(trydates[i]));\n    }\n};\n\nCSL.Attributes[\"@has-to-month-or-season\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var trydates = arg.split(/\\s+/);\n    var maketest = function (trydate) {\n        return function(Item) {\n            var date = Item[trydate];\n            if (!date || (!date.month && !date.season) || date.day) {\n                return false;\n            } else {\n                return true;\n            }\n        };\n    };\n    for (var i=0,ilen=trydates.length;i<ilen;i+=1) {\n        this.tests.push(maketest(trydates[i]));\n    }\n};\n\nCSL.Attributes[\"@has-day\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var trydates = arg.split(/\\s+/);\n    var maketest = function (trydate) {\n        return function(Item) {\n            var date = Item[trydate];\n            if (!date || !date.day) {\n                return false;\n            } else {\n                return true;\n            }\n        };\n    };\n    for (var i=0,ilen=trydates.length;i<ilen;i+=1) {\n        this.tests.push(maketest(trydates[i]));\n    }\n};\n\nCSL.Attributes[\"@is-plural\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var func = function (Item) {\n        var nameList = Item[arg];\n        if (nameList && nameList.length) {\n            var persons = 0;\n            var institutions = 0;\n            var last_is_person = false;\n            for (var i = 0, ilen = nameList.length; i < ilen; i += 1) {\n                if (state.opt.development_extensions.spoof_institutional_affiliations\n                    && (nameList[i].literal || (nameList[i].isInstitution && nameList[i].family && !nameList[i].given))) {\n                    institutions += 1;\n                    last_is_person = false;\n                } else {\n                    persons += 1;\n                    last_is_person = true;\n                }\n            }\n            if (persons > 1) {\n                return true;\n            } else if (institutions > 1) {\n                return true;\n            } else if (institutions && last_is_person) {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.tests.push(func);\n};\n\nCSL.Attributes[\"@is-multiple\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var func = function (Item) {\n        var val = (\"\" + Item[arg]);\n        var lst = val.split(/(?:,\\s|\\s(?:tot\\sen\\smet|līdz|oraz|and|bis|έως|και|och|až|do|en|et|in|ir|ja|og|sa|to|un|und|és|și|i|u|y|à|e|a|и|-|–)\\s|—|\\&)/);\n        if (lst.length > 1) {\n            return true;\n        }\n        return false;\n    };\n    this.tests.push(func);\n};\n\n\n\n\nCSL.Attributes[\"@locale\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var ret, langspec, lang, lst, i, ilen;\n    // Style default\n    var locale_default = state.opt[\"default-locale\"][0];\n\n    if (this.name === \"layout\") {\n        // For layout\n        this.locale_raw = arg;\n        if (this.tokentype === CSL.START) {\n            if (!state.opt.multi_layout) {\n                state.opt.multi_layout = [];\n            }\n            var locale_data = [];\n            // Register the primary locale in the set, and others that \"map\" to it, \n            // so that they can be used when generating sort keys. See node_sort.js.\n            // Not idempotent. Only do this once.\n            var locales = arg.split(/\\s+/);\n            var sort_locale = {};\n            var localeMaster = CSL.localeResolve(locales[0], locale_default);\n            locale_data.push(localeMaster);\n            if (localeMaster.generic) {\n                sort_locale[localeMaster.generic] = localeMaster.best;\n            } else {\n                sort_locale[localeMaster.best] = localeMaster.best;\n            }\n            for (var i=1,ilen=locales.length;i<ilen;i+=1) {\n                var localeServant = CSL.localeResolve(locales[i], locale_default);\n                locale_data.push(localeServant);\n                if (localeServant.generic) {\n                    sort_locale[localeServant.generic] = localeMaster.best;\n                } else {\n                    sort_locale[localeServant.best] = localeMaster.best;\n                }\n\n            }\n            state[state.build.area].opt.sort_locales.push(sort_locale);\n            state.opt.multi_layout.push(locale_data);\n        }\n        state.opt.has_layout_locale = true;\n    } else {\n        // For if and if-else\n\n        // Split argument\n        lst = arg.split(/\\s+/);\n\n        // Expand each list element\n        var locale_bares = [];\n        for (i = 0, ilen = lst.length; i < ilen; i += 1) {\n            // Parse out language string\n            lang = lst[i];\n        \n            // Analyze the locale\n            langspec = CSL.localeResolve(lang, locale_default);\n            if (lst[i].length === 2) {\n                // For fallback\n                locale_bares.push(langspec.bare);\n            }\n            // Load the locale terms etc.\n            // (second argument causes immediate return if locale already exists)\n            state.localeConfigure(langspec, true);\n            \n            // Replace string with locale spec object\n            lst[i] = langspec;\n        }\n        // Locales to test\n        var locale_list = lst.slice();\n\n        // check for variable value\n        // Closure probably not necessary here.\n        var maketest = function (locale_list, locale_default,locale_bares) {\n            return function (Item) {\n                var res;\n                ret = [];\n                res = false;\n                var langspec = false;\n\n                var lang;\n                if (!Item.language) {\n                    lang = locale_default;\n                } else {\n                    lang = Item.language;\n                }\n                langspec = CSL.localeResolve(lang, locale_default);\n                for (i = 0, ilen = locale_list.length; i < ilen; i += 1) {\n                    if (langspec.best === locale_list[i].best) {\n                        state.tmp.condition_lang_counter_arr.push(state.tmp.condition_counter);\n                        state.tmp.condition_lang_val_arr.push(state.opt.lang);\n                        state.opt.lang = locale_list[0].best;\n                        res = true;\n                        break;\n                    }\n                }\n                if (!res && locale_bares.indexOf(langspec.bare) > -1) {\n                    state.tmp.condition_lang_counter_arr.push(state.tmp.condition_counter);\n                    state.tmp.condition_lang_val_arr.push(state.opt.lang);\n                    state.opt.lang = locale_list[0].best;\n                    res = true;\n                }\n                return res;\n            };\n        };\n        this.tests.push(maketest(locale_list,locale_default,locale_bares));\n    }\n};\n\nCSL.Attributes[\"@alternative-node-internal\"] = function (state) {\n    if (!this.tests) {this.tests = []; };\n    var maketest = function () {\n        return function() {\n            return !state.tmp.abort_alternative;\n        };\n    };\n    var me = this;\n    this.tests.push(maketest(me));\n};\n\nCSL.Attributes[\"@locale-internal\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var langspec, lang, lst, i, ilen;\n        // For if and if-else\n\n        // Split argument\n        lst = arg.split(/\\s+/);\n\n        // Expand each list element\n        this.locale_bares = [];\n        for (i = 0, ilen = lst.length; i < ilen; i += 1) {\n            // Parse out language string\n            lang = lst[i];\n        \n            // Analyze the locale\n            langspec = CSL.localeResolve(lang, state.opt[\"default-locale\"][0]);\n            if (lst[i].length === 2) {\n                // For fallback\n                this.locale_bares.push(langspec.bare);\n            }\n            // Load the locale terms etc.\n            state.localeConfigure(langspec);\n            \n            // Replace string with locale spec object\n            lst[i] = langspec;\n        }\n        // Set locale tag on node\n        this.locale_default = state.opt[\"default-locale\"][0];\n        // The locale to set on node children if match is successful\n        this.locale = lst[0].best;\n        // Locales to test\n        this.locale_list = lst.slice();\n        \n        // check for variable value\n        // Closure probably not necessary here.\n        var maketest = function (me) {\n            return function (Item) {\n                var ret, res;\n                ret = [];\n                res = false;\n                var langspec = false;\n                if (Item.language) {\n                    lang = Item.language;\n                    langspec = CSL.localeResolve(lang, state.opt[\"default-locale\"][0]);\n                    if (langspec.best === state.opt[\"default-locale\"][0]) {\n                        langspec = false;\n                    }\n                }\n                if (langspec) {\n                    // We attempt to match a specific locale from the\n                    // list of parameters.  If that fails, we fall back\n                    // to the base locale of the first element.  The\n                    // locale applied is always the first local \n                    // in the list of parameters (or base locale, for a \n                    // single two-character language code) \n                    for (i = 0, ilen = me.locale_list.length; i < ilen; i += 1) {\n                        if (langspec.best === me.locale_list[i].best) {\n                            state.opt.lang = me.locale;\n                            state.tmp.last_cite_locale = me.locale;\n                            // Set empty group open tag with locale set marker\n                            state.output.openLevel(\"empty\");\n                            state.output.current.value().new_locale = me.locale;\n                            res = true;\n                            break;\n                        }\n                    }\n                    if (!res && me.locale_bares.indexOf(langspec.bare) > -1) {\n                        state.opt.lang = me.locale;\n                        state.tmp.last_cite_locale = me.locale;\n                        // Set empty group open tag with locale set marker\n                        state.output.openLevel(\"empty\");\n                        state.output.current.value().new_locale = me.locale;\n                        res = true;\n                    }\n                }\n                return res;\n            };\n        };\n        var me = this;\n        this.tests.push(maketest(me));\n};\n\n\nCSL.Attributes[\"@court-class\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n\tvar tryclasses = arg.split(/\\s+/);\n    var maketest = function (tryclass) {\n        return function(Item) {\n            var cls = CSL.GET_COURT_CLASS(state, Item);\n            if (cls === tryclass) {\n                return true;\n            } else {\n                return false;\n            }\n        };\n    };\n    for (var i=0,ilen=tryclasses.length; i<ilen; i++) {\n        this.tests.push(maketest(tryclasses[i]));\n    }\n};\n\nCSL.Attributes[\"@container-multiple\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n\tvar retval = \"true\" === arg ? true : false;\n    var maketest = function (retval) {\n        return function(Item) {\n            if (!state.tmp.container_item_count[Item.container_id]) {\n                return !retval;\n            } else if (state.tmp.container_item_count[Item.container_id] > 1) {\n                return retval;\n            }\n            return !retval;\n        };\n    };\n    this.tests.push(maketest(retval));\n};\n\nCSL.Attributes[\"@container-subsequent\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n\tvar retval = \"true\" === arg ? true : false;\n    var maketest = function (retval) {\n        return function(Item) {\n            if (state.tmp.container_item_pos[Item.container_id] > 1) {\n                return retval;\n            }\n            return !retval;\n        };\n    };\n    this.tests.push(maketest(retval));\n};\n\nCSL.Attributes[\"@has-subunit\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var maketest = function(namevar) {\n        return function (Item) {\n            var subunit_count = 0;\n            for (var i in Item[namevar]) {\n                var name = Item[namevar][i];\n                if (!name.given) {\n                    var institution = name.literal ? name.literal : name.family;\n                    var length = institution.split(\"|\").length;\n                    if (subunit_count === 0 || length < subunit_count) {\n                        subunit_count = length;\n                    }\n                }\n            }\n            return (subunit_count > 1);\n        };\n    };\n    this.tests.push(maketest(arg));\n}\n\nCSL.Attributes[\"@cite-form\"] = function (state, arg) {\n    if (!this.tests) {this.tests = []; };\n    var maketest = function(citeForm) {\n        return function (Item) {\n            if (Item[\"cite-form\"] === citeForm) {\n                return true;\n            }\n            return false;\n        };\n    };\n    this.tests.push(maketest(arg));\n}\n\nCSL.Attributes[\"@disable-duplicate-year-suppression\"] = function (state, arg) {\n\tstate.opt.disable_duplicate_year_suppression = arg.split(/\\s+/);\n}\n\nCSL.Attributes[\"@consolidate-containers\"] = function (state, arg) {\n    CSL.Attributes[\"@track-containers\"](state, arg);\n    var args = arg.split(/\\s+/);\n    state.bibliography.opt.consolidate_containers = args;\n}\n\nCSL.Attributes[\"@track-containers\"] = function (state, arg) {\n    var args = arg.split(/\\s+/);\n    if (!state.bibliography.opt.track_container_items) {\n        state.bibliography.opt.track_container_items = [];\n    }\n    if (!state.bibliography.opt.consolidate_containers) {\n        state.bibliography.opt.consolidate_containers = [];\n    }\n    state.bibliography.opt.track_container_items = state.bibliography.opt.track_container_items.concat(args);\n}\n\n// These are not evaluated as conditions immediately: they only\n// set parameters that are picked up during processing.\nCSL.Attributes[\"@parallel-first\"] = function (state, arg) {\n    state.opt.parallel.enable = true;\n    var vars = arg.split(/\\s+/);\n    if (!state.opt.track_repeat) {\n        state.opt.track_repeat = {};\n    }\n    this.parallel_first = {};\n    for (var i in vars) {\n        var v = vars[i];\n        this.parallel_first[v] = true;\n        state.opt.track_repeat[v] = true;\n    }\n};\nCSL.Attributes[\"@parallel-last\"] = function (state, arg) {\n    state.opt.parallel.enable = true;\n    var vars = arg.split(/\\s+/);\n    if (!state.opt.track_repeat) {\n        state.opt.track_repeat = {};\n    }\n    this.parallel_last = {};\n    for (var i in vars) {\n        var v = vars[i];\n        this.parallel_last[v] = true;\n        state.opt.track_repeat[v] = true;\n    }\n};\nCSL.Attributes[\"@parallel-last-to-first\"] = function (state, arg) {\n    state.opt.parallel.enable = true;\n    var vars = arg.split(/\\s+/);\n    this.parallel_last_to_first = {};\n    for (var i=0,ilen=vars.length;i<ilen;i++) {\n        this.parallel_last_to_first[vars[i]] = true;\n    }\n};\nCSL.Attributes[\"@parallel-delimiter-override\"] = function (state, arg) {\n    state.opt.parallel.enable = true;\n    this.strings.set_parallel_delimiter_override = arg;\n};\nCSL.Attributes[\"@parallel-delimiter-override-on-suppress\"] = function (state, arg) {\n    state.opt.parallel.enable = true;\n    this.strings.set_parallel_delimiter_override_on_suppress = arg;\n};\nCSL.Attributes[\"@no-repeat\"] = function (state, arg) {\n    state.opt.parallel.enable = true;\n    var vars = arg.split(/\\s+/);\n    if (!state.opt.track_repeat) {\n        state.opt.track_repeat = {};\n    }\n    this.non_parallel = {};\n    for (var i in vars) {\n        var v = vars[i];\n        this.non_parallel[v] = true;\n        state.opt.track_repeat[v] = true;\n    }\n};\n\nCSL.Attributes[\"@require\"] = function (state, arg) {\n    state.opt.use_context_condition = true;\n    this.strings.require = arg;\n\n    // Introduced to constrain rendering of the group with a\n    // requirement that it either render an alpha term via cs:label or\n    // cs:text at least once, or render without any label. That\n    // behaviour is invoked with \"label-empty-or-alpha\" as arg.\n\n    // This attribute is a complement to @label-form and modular\n    // jurisdiction support, as it makes macros that adapt to shifting\n    // local term definitions possible.\n};\n\nCSL.Attributes[\"@reject\"] = function (state, arg) {\n    state.opt.use_context_condition = true;\n    this.strings.reject = arg;\n\n    // Introduced to constrain rendering of the group with a\n    // requirement that it render some label via cs:label or cs:text,\n    // and that it NOT be alpha. That behaviour is invoked with\n    // \"label-empty-or-alpha\" as arg.\n\n    // This attribute is a complement to @label-form and modular\n    // jurisdiction support, as it makes macros that adapt to shifting\n    // local term definitions possible.\n};\n\nCSL.Attributes[\"@require-comma-on-symbol\"] = function (state, arg) {\n    state.opt.require_comma_on_symbol = arg;\n}\n\nCSL.Attributes[\"@gender\"] = function (state, arg) {\n    this.gender = arg;\n};\n\nCSL.Attributes[\"@cslid\"] = function (state, arg) {\n    // @cslid is a noop\n    // The value set on this attribute is used to\n    // generate reverse lookup wrappers on output when \n    // this.development_extensions.csl_reverse_lookup_support is\n    // set to true in state.js (there is no runtime option,\n    // it must be set in state.js)\n    //\n    // See the @showid method in the html output\n    // section of formats.js for the function that\n    // renders the wrappers.\n    this.cslid = parseInt(arg, 10);\n};\n\nCSL.Attributes[\"@capitalize-if-first\"] = function (state, arg) {\n    this.strings.capitalize_if_first_override = arg;\n};\n\nCSL.Attributes[\"@label-capitalize-if-first\"] = function (state, arg) {\n    this.strings.label_capitalize_if_first_override = arg;\n};\n\nCSL.Attributes[\"@label-form\"] = function (state, arg) {\n    this.strings.label_form_override = arg;\n};\n\nCSL.Attributes[\"@part-separator\"] = function (state, arg) {\n    this.strings[\"part-separator\"] = arg;\n};\n\nCSL.Attributes[\"@leading-noise-words\"] = function (state, arg) {\n    this[\"leading-noise-words\"] = arg;\n};\n\nCSL.Attributes[\"@name-never-short\"] = function (state, arg) {\n    this[\"name-never-short\"] = arg;\n};\n\nCSL.Attributes[\"@class\"] = function (state, arg) {\n    state.opt[\"class\"] = arg;\n};\n\nCSL.Attributes[\"@version\"] = function (state, arg) {\n    state.opt.version = arg;\n};\n\n/**\n * Store the value attribute on the token.\n * @name CSL.Attributes.@value\n * @function\n */\nCSL.Attributes[\"@value\"] = function (state, arg) {\n    this.strings.value = arg;\n};\n\n\n/**\n * Store the name attribute (of a macro or term node)\n * on the state object.\n * <p>For reference when the closing node of a macro\n * or locale definition is encountered.</p>\n * @name CSL.Attributes.@name\n * @function\n */\nCSL.Attributes[\"@name\"] = function (state, arg) {\n    this.strings.name = arg;\n};\n\n/**\n * Store the form attribute (of a term node) on the state object.\n * <p>For reference when the closing node of a macro\n * or locale definition is encountered.</p>\n * @name CSL.Attributes.@form\n * @function\n */\nCSL.Attributes[\"@form\"] = function (state, arg) {\n    this.strings.form = arg;\n};\n\nCSL.Attributes[\"@date-parts\"] = function (state, arg) {\n    this.strings[\"date-parts\"] = arg;\n};\n\nCSL.Attributes[\"@range-delimiter\"] = function (state, arg) {\n    this.strings[\"range-delimiter\"] = arg;\n};\n\n/**\n * Store macro tokens in a buffer on the state object.\n * <p>For reference when the enclosing text token is\n * processed.</p>\n * @name CSL.Attributes.@macro\n * @function\n */\nCSL.Attributes[\"@macro\"] = function (state, arg) {\n    this.postponed_macro = arg;\n};\n\n/*\n * CSL.Attributes[\"@prefer-jurisdiction\"] = function (state, arg) {\n *    this.prefer_jurisdiction = true;\n * };\n */\n\nCSL.Attributes[\"@term\"] = function (state, arg) {\n    if (arg === \"sub verbo\") {\n        this.strings.term = \"sub-verbo\";\n    } else {\n        this.strings.term = arg;\n    }\n};\n\n\n/*\n * Ignore xmlns attribute.\n * <p>This should always be <p>http://purl.org/net/xbiblio/csl</code>\n * anyway.  At least for the present we will blindly assume\n * that it is.</p>\n * @name CSL.Attributes.@xmlns\n * @function\n */\nCSL.Attributes[\"@xmlns\"] = function () {};\n\n\n/*\n * Store language attribute to a buffer field.\n * <p>Will be placed in the appropriate location\n * when the element is processed.</p>\n * @name CSL.Attributes.@lang\n * @function\n */\nCSL.Attributes[\"@lang\"] = function (state, arg) {\n    if (arg) {\n        state.build.lang = arg;\n    }\n};\n\n\n// Used as a flag during dates processing\nCSL.Attributes[\"@lingo\"] = function () {};\n\n// Used as a flag during dates processing\nCSL.Attributes[\"@macro-has-date\"] = function () {\n    this[\"macro-has-date\"] = true;\n};\n\n/*\n * Store suffix string on token.\n * @name CSL.Attributes.@suffix\n * @function\n */\nCSL.Attributes[\"@suffix\"] = function (state, arg) {\n    this.strings.suffix = arg;\n};\n\n\n/*\n * Store prefix string on token.\n * @name CSL.Attributes.@prefix\n * @function\n */\nCSL.Attributes[\"@prefix\"] = function (state, arg) {\n    this.strings.prefix = arg;\n};\n\n\n/*\n * Store delimiter string on token.\n * @name CSL.Attributes.@delimiter\n * @function\n */\nCSL.Attributes[\"@delimiter\"] = function (state, arg) {\n    this.strings.delimiter = arg;\n};\n\n\n/*\n * Store match evaluator on token.\n */\nCSL.Attributes[\"@match\"] = function (state, arg) {\n    this.match = arg;\n};\n\n\nCSL.Attributes[\"@names-min\"] = function (state, arg) {\n    var val = parseInt(arg, 10);\n    if (state[state.build.area].opt.max_number_of_names < val) {\n        state[state.build.area].opt.max_number_of_names = val;\n    }\n    this.strings[\"et-al-min\"] = val;\n};\n\nCSL.Attributes[\"@names-use-first\"] = function (state, arg) {\n    this.strings[\"et-al-use-first\"] = parseInt(arg, 10);\n};\n\nCSL.Attributes[\"@names-use-last\"] = function (state, arg) {\n    if (arg === \"true\") {\n        this.strings[\"et-al-use-last\"] = true;\n    } else {\n        this.strings[\"et-al-use-last\"] = false;\n    }\n};\n\nCSL.Attributes[\"@sort\"] = function (state, arg) {\n    if (arg === \"descending\") {\n        this.strings.sort_direction = CSL.DESCENDING;\n    }\n};\n\nCSL.Attributes[\"@plural\"] = function (state, arg) {\n    // Accepted values of plural attribute differ on cs:text\n    // and cs:label nodes.\n    if (\"always\" === arg || \"true\" === arg) {\n        this.strings.plural = 1;\n    } else if (\"never\" === arg || \"false\" === arg) {\n        this.strings.plural = 0;\n    } else if (\"contextual\" === arg) {\n        this.strings.plural = false;\n    }\n};\n\nCSL.Attributes[\"@has-publisher-and-publisher-place\"] = function () {\n    this.strings[\"has-publisher-and-publisher-place\"] = true;\n};\n\nCSL.Attributes[\"@publisher-delimiter-precedes-last\"] = function (state, arg) {\n    this.strings[\"publisher-delimiter-precedes-last\"] = arg;\n};\n\nCSL.Attributes[\"@publisher-delimiter\"] = function (state, arg) {\n    this.strings[\"publisher-delimiter\"] = arg;\n};\n\nCSL.Attributes[\"@publisher-and\"] = function (state, arg) {\n    this.strings[\"publisher-and\"] = arg;\n};\n\nCSL.Attributes[\"@givenname-disambiguation-rule\"] = function (state, arg) {\n    if (CSL.GIVENNAME_DISAMBIGUATION_RULES.indexOf(arg) > -1) {\n        state.citation.opt[\"givenname-disambiguation-rule\"] = arg;\n    }\n};\n\nCSL.Attributes[\"@collapse\"] = function (state, arg) {\n    // only one collapse value will be honoured.\n    if (arg) {\n        state[this.name].opt.collapse = arg;\n    }\n};\n\nCSL.Attributes[\"@cite-group-delimiter\"] = function (state, arg) {\n    if (arg) {\n        state[state.tmp.area].opt.cite_group_delimiter = arg;\n    }\n};\n\n\n\nCSL.Attributes[\"@names-delimiter\"] = function (state, arg) {\n    state.setOpt(this, \"names-delimiter\", arg);\n};\n\nCSL.Attributes[\"@name-form\"] = function (state, arg) {\n    state.setOpt(this, \"name-form\", arg);\n};\n\nCSL.Attributes[\"@subgroup-delimiter\"] = function (state, arg) {\n    this.strings[\"subgroup-delimiter\"] = arg;\n};\n\nCSL.Attributes[\"@subgroup-delimiter-precedes-last\"] = function (state, arg) {\n    this.strings[\"subgroup-delimiter-precedes-last\"] = arg;\n};\n\n\nCSL.Attributes[\"@name-delimiter\"] = function (state, arg) {\n    state.setOpt(this, \"name-delimiter\", arg);\n};\n\nCSL.Attributes[\"@et-al-min\"] = function (state, arg) {\n    var val = parseInt(arg, 10);\n    if (state[state.build.area].opt.max_number_of_names < val) {\n        state[state.build.area].opt.max_number_of_names = val;\n    }\n    state.setOpt(this, \"et-al-min\", val);\n};\n\nCSL.Attributes[\"@et-al-use-first\"] = function (state, arg) {\n    state.setOpt(this, \"et-al-use-first\", parseInt(arg, 10));\n};\n\nCSL.Attributes[\"@et-al-use-last\"] = function (state, arg) {\n    if (arg === \"true\") {\n        state.setOpt(this, \"et-al-use-last\", true);\n    } else {\n        state.setOpt(this, \"et-al-use-last\", false);\n    }\n};\n\nCSL.Attributes[\"@et-al-subsequent-min\"] = function (state, arg) {\n    var val = parseInt(arg, 10);\n    if (state[state.build.area].opt.max_number_of_names < val) {\n        state[state.build.area].opt.max_number_of_names = val;\n    }\n    state.setOpt(this, \"et-al-subsequent-min\", val);\n};\n\nCSL.Attributes[\"@et-al-subsequent-use-first\"] = function (state, arg) {\n    state.setOpt(this, \"et-al-subsequent-use-first\", parseInt(arg, 10));\n};\n\nCSL.Attributes[\"@suppress-min\"] = function (state, arg) {\n    this.strings[\"suppress-min\"] = parseInt(arg, 10);\n};\n\nCSL.Attributes[\"@suppress-max\"] = function (state, arg) {\n    this.strings[\"suppress-max\"] = parseInt(arg, 10);\n};\n\n\nCSL.Attributes[\"@and\"] = function (state, arg) {\n    state.setOpt(this, \"and\", arg);\n};\n\nCSL.Attributes[\"@delimiter-precedes-last\"] = function (state, arg) {\n    state.setOpt(this, \"delimiter-precedes-last\", arg);\n};\n\nCSL.Attributes[\"@delimiter-precedes-et-al\"] = function (state, arg) {\n    state.setOpt(this, \"delimiter-precedes-et-al\", arg);\n};\n\nCSL.Attributes[\"@initialize-with\"] = function (state, arg) {\n    state.setOpt(this, \"initialize-with\", arg);\n};\n\nCSL.Attributes[\"@initialize\"] = function (state, arg) {\n    if (arg === \"false\") {\n        state.setOpt(this, \"initialize\", false);\n    }\n};\n\nCSL.Attributes[\"@name-as-reverse-order\"] = function (state, arg) {\n    this[\"name-as-reverse-order\"] = arg;\n};\n\nCSL.Attributes[\"@name-as-sort-order\"] = function (state, arg) {\n    if (this.name === \"style-options\") {\n        this[\"name-as-sort-order\"] = arg;\n    } else {\n        state.setOpt(this, \"name-as-sort-order\", arg);\n    }\n};\n\nCSL.Attributes[\"@sort-separator\"] = function (state, arg) {\n    state.setOpt(this, \"sort-separator\", arg);\n};\n\nCSL.Attributes[\"@require-match\"] = function (state, arg) {\n    if (arg === \"true\") {\n        this.requireMatch = true;\n    }\n};\n\nCSL.Attributes[\"@exclude-types\"] = function (state, arg) {\n    state.bibliography.opt.exclude_types = arg.split(/\\s+/);\n};\n\nCSL.Attributes[\"@exclude-with-fields\"] = function (state, arg) {\n    state.bibliography.opt.exclude_with_fields = arg.split(/\\s+/);\n};\n\n\nCSL.Attributes[\"@year-suffix-delimiter\"] = function (state, arg) {\n    state[this.name].opt[\"year-suffix-delimiter\"] = arg;\n};\n\nCSL.Attributes[\"@after-collapse-delimiter\"] = function (state, arg) {\n    state[this.name].opt[\"after-collapse-delimiter\"] = arg;\n};\n\nCSL.Attributes[\"@subsequent-author-substitute\"] = function (state, arg) {\n    state[this.name].opt[\"subsequent-author-substitute\"] = arg;\n};\n\nCSL.Attributes[\"@subsequent-author-substitute-rule\"] = function (state, arg) {\n    state[this.name].opt[\"subsequent-author-substitute-rule\"] = arg;\n};\n\nCSL.Attributes[\"@disambiguate-add-names\"] = function (state, arg) {\n    if (arg === \"true\") {\n        state.opt[\"disambiguate-add-names\"] = true;\n    }\n};\n\nCSL.Attributes[\"@disambiguate-add-givenname\"] = function (state, arg) {\n    if (arg === \"true\") {\n        state.opt[\"disambiguate-add-givenname\"] = true;\n    }\n};\n\nCSL.Attributes[\"@disambiguate-add-year-suffix\"] = function (state, arg) {\n    if (arg === \"true\" && state.opt.xclass !== \"numeric\") {\n        state.opt[\"disambiguate-add-year-suffix\"] = true;\n    }\n};\n\n\nCSL.Attributes[\"@second-field-align\"] = function (state, arg) {\n    if (arg === \"flush\" || arg === \"margin\") {\n        state[this.name].opt[\"second-field-align\"] = arg;\n    }\n};\n\n\nCSL.Attributes[\"@hanging-indent\"] = function (state, arg) {\n    if (arg === \"true\") {\n        if (state.opt.development_extensions.hanging_indent_legacy_number) {\n            state[this.name].opt.hangingindent = 2;\n\t    } else {\n            state[this.name].opt.hangingindent = true;\n\t    }\n    }\n};\n\n\nCSL.Attributes[\"@line-spacing\"] = function (state, arg) {\n    if (arg && arg.match(/^[.0-9]+$/)) {\n        state[this.name].opt[\"line-spacing\"] = parseFloat(arg, 10);\n    }\n};\n\n\nCSL.Attributes[\"@entry-spacing\"] = function (state, arg) {\n    if (arg && arg.match(/^[.0-9]+$/)) {\n        state[this.name].opt[\"entry-spacing\"] = parseFloat(arg, 10);\n    }\n};\n\n\nCSL.Attributes[\"@near-note-distance\"] = function (state, arg) {\n    state[this.name].opt[\"near-note-distance\"] = parseInt(arg, 10);\n};\n\nCSL.Attributes[\"@substring\"] = function (state, arg) {\n    this.substring = parseInt(arg, 10);\n};\n\nCSL.Attributes[\"@text-case\"] = function (state, arg) {\n    var func = function (state, Item) {\n        if (arg === \"normal\") {\n            this.text_case_normal = true;\n        } else {\n            this.strings[\"text-case\"] = arg;\n            if (arg === \"title\") {\n                if (Item.jurisdiction) {\n                    this.strings[\"text-case\"] = \"passthrough\";\n                }\n            }\n        }\n    };\n    this.execs.push(func);\n};\n\n\nCSL.Attributes[\"@page-range-format\"] = function (state, arg) {\n    state.opt[\"page-range-format\"] = arg;\n};\n\n\nCSL.Attributes[\"@year-range-format\"] = function (state, arg) {\n    state.opt[\"year-range-format\"] = arg;\n};\n\n\nCSL.Attributes[\"@default-locale\"] = function (state, arg) {\n    if (this.name === 'style') {\n        var lst, len, pos, m, ret;\n        //\n        // Workaround for Internet Exploder 6 (doesn't recognize\n        // groups in str.split(/something(braced-group)something/)\n        //\n        var m = arg.match(/-x-(sort|translit|translat)-/g);\n        if (m) {\n            for (pos = 0, len = m.length; pos < len; pos += 1) {\n                m[pos] = m[pos].replace(/^-x-/, \"\").replace(/-$/, \"\");\n            }\n        }\n        lst = arg.split(/-x-(?:sort|translit|translat)-/);\n        ret = [lst[0]];\n        for (pos = 1, len = lst.length; pos < len; pos += 1) {\n            ret.push(m[pos - 1]);\n            ret.push(lst[pos]);\n        }\n        lst = ret.slice();\n        len = lst.length;\n        for (pos = 1; pos < len; pos += 2) {\n            state.opt[(\"locale-\" + lst[pos])].push(lst[(pos + 1)].replace(/^\\s*/g, \"\").replace(/\\s*$/g, \"\"));\n        }\n        if (lst.length) {\n            state.opt[\"default-locale\"] = lst.slice(0, 1);\n        } else {\n            state.opt[\"default-locale\"] = [\"en\"];\n        }\n    } else if (arg === \"true\") {\n        this.default_locale = true;\n    }\n};\n\nCSL.Attributes[\"@default-locale-sort\"] = function (state, arg) {\n    state.opt[\"default-locale-sort\"] = arg;\n};\n\nCSL.Attributes[\"@demote-non-dropping-particle\"] = function (state, arg) {\n    state.opt[\"demote-non-dropping-particle\"] = arg;\n};\n\nCSL.Attributes[\"@initialize-with-hyphen\"] = function (state, arg) {\n    if (arg === \"false\") {\n        state.opt[\"initialize-with-hyphen\"] = false;\n    }\n};\n\nCSL.Attributes[\"@institution-parts\"] = function (state, arg) {\n    this.strings[\"institution-parts\"] = arg;\n};\n\nCSL.Attributes[\"@if-short\"] = function (state, arg) {\n    if (arg === \"true\") {\n        this.strings[\"if-short\"] = true;\n    }\n};\n\nCSL.Attributes[\"@substitute-use-first\"] = function (state, arg) {\n    this.strings[\"substitute-use-first\"] = parseInt(arg, 10);\n};\n\nCSL.Attributes[\"@use-first\"] = function (state, arg) {\n    this.strings[\"use-first\"] = parseInt(arg, 10);\n};\n\nCSL.Attributes[\"@use-last\"] = function (state, arg) {\n    this.strings[\"use-last\"] = parseInt(arg, 10);\n};\n\nCSL.Attributes[\"@stop-first\"] = function (state, arg) {\n    this.strings[\"stop-first\"] = parseInt(arg, 10);\n};\n\nCSL.Attributes[\"@stop-last\"] = function (state, arg) {\n    this.strings[\"stop-last\"] = parseInt(arg, 10) * -1;\n};\n\n\nCSL.Attributes[\"@reverse-order\"] = function (state, arg) {\n    if (\"true\" === arg) {\n        this.strings[\"reverse-order\"] = true;\n    }\n};\n\nCSL.Attributes[\"@display\"] = function (state, arg) {\n    if (state.bibliography.tokens.length === 2) {\n        state.opt.using_display = true;\n    }\n    this.strings.cls = arg;\n};\n\n\n/*global CSL: true */\n\n\n/**\n * String stack object.\n * <p>Numerous string stacks are used to track nested\n * parameters at runtime.  This class provides methods\n * that remove some of the aggravation of managing\n * them.</p>\n * @class\n */\nCSL.Stack = function (val, literal) {\n    this.mystack = [];\n    if (literal || val) {\n        this.mystack.push(val);\n    }\n    this.tip = this.mystack[0];\n};\n\n/**\n * Push a value onto the stack.\n * <p>This just does what it says.</p>\n */\nCSL.Stack.prototype.push = function (val, literal) {\n    if (literal || val) {\n        this.mystack.push(val);\n    } else {\n        this.mystack.push(\"\");\n    }\n    this.tip = this.mystack[this.mystack.length - 1];\n};\n\n/**\n * Clear the stack\n */\nCSL.Stack.prototype.clear = function () {\n    this.mystack = [];\n    this.tip = {};\n};\n\n/**\n * Replace the top value on the stack.\n * <p>This removes some ugly syntax from the\n * main code.</p>\n */\nCSL.Stack.prototype.replace = function (val, literal) {\n    //\n    // safety fix after a bug was chased down.  Rhino\n    // JS will process a negative index without error (!).\n    if (this.mystack.length === 0) {\n        CSL.error(\"Internal CSL processor error: attempt to replace nonexistent stack item with \" + val);\n    }\n    if (literal || val) {\n        this.mystack[(this.mystack.length - 1)] = val;\n    } else {\n        this.mystack[(this.mystack.length - 1)] = \"\";\n    }\n    this.tip = this.mystack[this.mystack.length - 1];\n};\n\n\n/**\n * Remove the top value from the stack.\n * <p>Just does what it says.</p>\n */\nCSL.Stack.prototype.pop = function () {\n    var ret = this.mystack.pop();\n    if (this.mystack.length) {\n        this.tip = this.mystack[this.mystack.length - 1];\n    } else {\n        this.tip = {};\n    }\n    return ret;\n};\n\n\n/**\n * Return the top value on the stack.\n * <p>Removes a little hideous complication from\n * the main code.</p>\n */\nCSL.Stack.prototype.value = function () {\n    return this.mystack.slice(-1)[0];\n};\n\n\n/**\n * Return length (depth) of stack.\n * <p>Used to identify if there is content to\n * be handled on the stack</p>\n */\nCSL.Stack.prototype.length = function () {\n    return this.mystack.length;\n};\n\n/*global CSL: true */\n\n/**\n * Initializes the parallel cite tracking arrays\n */\nCSL.Parallel = function (state) {\n    this.state = state;\n};\n\nCSL.Parallel.prototype.StartCitation = function (sortedItems, out) {\n    // This array carries the repeat markers used in rendering the cite.\n    this.state.tmp.suppress_repeats = [];\n    if (sortedItems.length < 2) return;\n    var idxEnd = 0;\n    var parallelMatchList = false;\n    var siblingRanges = [];\n\n    for (var i=0,ilen=sortedItems.length-1;i<ilen;i++) {\n        var currItem = sortedItems[i][0];\n        var nextItem = sortedItems[i+1][0];\n        var freshMatchList = false;\n        var info = {};\n        if (sortedItems[i][0].seeAlso && sortedItems[i][0].seeAlso.length > 0 && !parallelMatchList) {\n            freshMatchList = true;\n            parallelMatchList = [sortedItems[i][0].id].concat(sortedItems[i][0].seeAlso);\n            var tempMatchList = parallelMatchList.slice();\n            var remainder = sortedItems.slice(i);\n            remainder[0][1].parallel = \"first\";\n            for (var j=0,jlen=remainder.length;j<jlen;j++) {\n                var itemID = remainder[j][0].id;\n                var ididx = tempMatchList.indexOf(itemID);\n                idxEnd = false;\n                if (ididx === -1) {\n                    idxEnd = (i+j-1);\n                } else if ((i+j) === (sortedItems.length-1)) {\n                    idxEnd = (i+j);\n                }\n                if (idxEnd) {\n                    siblingRanges.push([i, idxEnd]);\n                    break;\n                } else {\n                    tempMatchList = tempMatchList.slice(0, ididx).concat(tempMatchList.slice(ididx+1));\n                }\n            }\n        }\n        // parallelMatchList/freshMatchList relate only to parallels.\n        // no-repeat non-parallels are handled in a separate block.\n        if (i > 0 && freshMatchList) {\n            this.state.tmp.suppress_repeats[i-1].START = true;\n            freshMatchList = false;\n        }\n        for (var varname in this.state.opt.track_repeat) {\n            if (!currItem[varname] || !nextItem[varname]) {\n                // Go ahead and render any value with an empty partner\n                info[varname] = false;\n            } else if (\"string\" === typeof nextItem[varname] || \"number\" === typeof nextItem[varname]) {\n                // Simple comparison of string values\n                if (varname === \"title\" && currItem[\"title-short\"] && nextItem[\"title-short\"]) {\n                    var currVal = currItem[\"title-short\"];\n                    var nextVal = nextItem[\"title-short\"];\n                } else {\n                    var currVal = currItem[varname];\n                    var nextVal = nextItem[varname];\n                }\n                if (currVal == nextVal) {\n                    info[varname] = true;\n                } else {\n                    info[varname] = false;\n                }\n            } else if (\"undefined\" === typeof currItem[varname].length) {\n                // If a date, use only the year\n                info[varname] = false;\n                var currYear = currItem[varname].year;\n                var nextYear = nextItem[varname].year;\n                if (currYear && nextYear) {\n                    if (currYear == nextYear) {\n                        info[varname] = true;\n                    }\n                }\n            } else {\n                // If a creator value, kludge it\n                var currVal = JSON.stringify(currItem[varname]);\n                var nextVal = JSON.stringify(nextItem[varname]);\n                if (currVal === nextVal) {\n                    info[varname] = true;\n                } else {\n                    info[varname] = false;\n                }\n            }\n        }\n        if (!parallelMatchList) {\n            info.ORPHAN = true;\n        }\n        if (idxEnd === i) {\n            info.END = true;\n            parallelMatchList = false;\n        }\n        this.state.tmp.suppress_repeats.push(info);\n    }\n    \n    // if (!this.state.tmp.just_looking) {\n    //     this.state.sys.print(`${JSON.stringify(this.state.tmp.suppress_repeats, null, 2)}`);\n    // }\n    \n    // Set no-repeat info here?\n    for (var j=0,jlen=siblingRanges.length;j<jlen;j++) {\n        var masterID = sortedItems[siblingRanges[j][0]][0].id;\n        this.state.registry.registry[masterID].master = true;\n        this.state.registry.registry[masterID].siblings = [];\n        var start = siblingRanges[j][0];\n        var end = siblingRanges[j][1];\n        for (var k=start; k<end; k++) {\n            this.state.tmp.suppress_repeats[k].SIBLING = true;\n            var siblingID = sortedItems[k+1][0].id;\n            sortedItems[k+1][1].parallel = \"other\";\n            this.state.registry.registry[masterID].siblings.push(siblingID);\n        }\n    }\n    // this.state.sys.print(JSON.stringify(this.state.tmp.suppress_repeats, null, 2));\n};\n\nCSL.Parallel.prototype.checkRepeats = function(params) {\n    var idx = this.state.tmp.cite_index;\n    if (this.state.tmp.suppress_repeats) {\n        if (params.parallel_first && Object.keys(params.parallel_first).length > 0) {\n            var arr = [{}].concat(this.state.tmp.suppress_repeats);\n            var ret = true;\n            for (var varname in params.parallel_first) {\n                if (!arr[idx][varname] || arr[idx].START) {\n                    // true --> suppress the entry\n                    // Test here evaluates as \"all\", not \"any\"\n                    ret = false;\n                }\n            }\n            return ret;\n        }\n        if (params.parallel_last && Object.keys(params.parallel_last).length > 0) {\n            var arr = this.state.tmp.suppress_repeats.concat([{}]);\n            var ret = Object.keys(params.parallel_last).length > 0 ? true : false;\n            for (var varname in params.parallel_last) {\n                if (!arr[idx][varname] || arr[idx].END) {\n                    // \"all\" match, as above.\n                    ret = false;\n                }\n            }\n            return ret;\n        }\n        if (params.non_parallel && Object.keys(params.non_parallel).length > 0) {\n            var arr = [{}].concat(this.state.tmp.suppress_repeats);\n            var ret = true;\n            for (var varname in params.non_parallel) {\n                if (!arr[idx][varname]) {\n                    ret = false;\n                }\n            }\n            return ret;\n        }\n    }\n    return false;\n};\n\n/*global CSL: true */\n\n\nCSL.Util = {};\n\nCSL.Util.Match = function () {\n\n    this.any = function (token, state, tests) {\n        return function (Item, item) {\n            for (var i=0, ilen=tests.length; i < ilen; i += 1) {\n                var result = tests[i](Item, item);\n                if (result) {\n                    return true;\n                }\n            }\n            return false;\n        };\n    };\n\n    this.none = function (token, state, tests) {\n        return function (Item, item) {\n            for (var i=0,ilen=tests.length;i<ilen;i+=1) {\n                var result = tests[i](Item,item);\n                if (result) {\n                    return false;\n                }\n            }\n            return true;\n        };\n    };\n\n    this.all = function (token, state, tests) {\n        return function (Item, item) {\n            for (var i=0,ilen=tests.length;i<ilen;i+=1) {\n                var result = tests[i](Item,item);\n                if (!result) {\n                    return false;\n                }\n            }\n            return true;\n        };\n    };\n\n    this[undefined] = this.all;\n\n    this.nand = function (token, state, tests) {\n        return function (Item, item) {\n            for (var i=0,ilen=tests.length;i<ilen;i+=1) {\n                var result = tests[i](Item,item);\n                if (!result) {\n                    return true;\n                }\n            }\n            return false;\n        };\n    };\n\n};\n\n/*global CSL: true */\n\n/*\n * Fields can be transformed by translation/transliteration, or by\n * abbreviation.  Transformations are performed in that order.\n *\n * Renderings of original, translated or transliterated content\n * (followed by abbreviation if requested) are placed in the primary\n * output slot or the (implicitly punctuated) secondary and tertiary\n * output slots according to the settings registered in the\n * state.opt['cite-lang-prefs'] arrays. The array has six segments:\n * 'persons', 'institutions', 'titles', 'journals', 'publishers', and\n * 'places'. Each segment always contains at least one item, and may\n * hold values 'orig', 'translit' or 'translat'. The array defaults to\n * a single item 'orig'.\n *\n * All multilingual variables are associated with segments,\n * with the exception of 'edition' and 'genre'. These two\n * exceptions are always rendered with the first matching\n * language form found in state.opt['locale-translit'] or, if\n * composing a sort key, state.opt['locale-sort']. No secondary\n * slot rendering is performed for this two variables.\n *\n * The balance of multilingual variables are rendered with\n * the first matching value in the transform locales spec\n * (no transform, state.opt['locale-translit'], or \n * state.opt['locale-translat']) mapped to the target\n * slot.\n *\n * Full primary+secondary+tertiary rendering is performed only in\n * note-style citations and the bibliography.  In-text citations are\n * rendered in the primary output slot only, following the same spec\n * parameters.\n *\n *   Optional setters:\n *     .setAbbreviationFallback(); fallback flag\n *       (if true, a failed abbreviation will fallback to long)\n *\n *     .setAlternativeVariableName(): alternative variable name in Item,\n *       for use as a fallback abbreviation source\n *\n * Translation/transliteration\n *\n *   Optional setter:\n *     .setTransformFallback():\n *       default flag (if true, the original field value will be used as a fallback)\n *\n * The getTextSubField() method may be used to obtain a string transform\n * of a field, without abbreviation, as needed for setting sort keys\n * (for example).\n *\n */\n\nCSL.Transform = function (state) {\n    // Abbreviation families\n    this.abbrevs = {};\n    this.abbrevs[\"default\"] = new state.sys.AbbreviationSegments();\n\n    function getCountryOrJurisdiction(variable, normalizedKey, quashCountry) {\n        var value = \"\";\n        if (state.sys.getHumanForm) {\n            if (variable === \"country\") {\n                value = state.sys.getHumanForm(normalizedKey.toLowerCase(), false, true);\n                value = value.split(\"|\")[0];\n            } else if (variable === \"jurisdiction\") {\n                value = state.sys.getHumanForm(normalizedKey.toLowerCase(), false, true);\n                if (!quashCountry) {\n                    value = value.split(\"|\").slice(1).join(\", \");\n                } else {\n                    // Bare country name is rendered by \"country\", not \"jurisdiction\"\n                    value = \"\";\n                }\n            }\n\t    }\n\t    return value;\n    }\n    \n    // Internal function\n    function abbreviate(state, tok, Item, altvar, basevalue, family_var, use_field) {\n\n        var value = \"\";\n        var myabbrev_family = CSL.FIELD_CATEGORY_REMAP[family_var];\n        var preferredJurisdiction;\n        if (!myabbrev_family) {\n            return basevalue;\n        }\n\n        var variable = family_var;\n        var normalizedKey = basevalue;\n\n        if (state.sys.normalizeAbbrevsKey) {\n            normalizedKey = state.sys.normalizeAbbrevsKey(family_var, basevalue);\n        }\n        var quashCountry = false;\n        if (variable === \"jurisdiction\" && normalizedKey) {\n            quashCountry = normalizedKey.indexOf(\":\") === -1;\n        }\n        // Fix up jurisdiction codes\n        if ([\"jurisdiction\", \"country\"].indexOf(family_var) > -1 && basevalue === basevalue.toLowerCase()) {\n            normalizedKey = basevalue.toUpperCase();\n        }\n        \n        \n        // Lazy retrieval of abbreviations.\n        if (state.sys.getAbbreviation) {\n\n            if ([\"jurisdiction\", \"country\", \"language-name\", \"language-name-original\"].indexOf(variable) > -1) {\n                preferredJurisdiction = \"default\";\n            } else if (Item.jurisdiction) {\n                preferredJurisdiction = Item.jurisdiction;\n            } else {\n                preferredJurisdiction = \"default\";\n            }\n            var jurisdiction = state.transform.loadAbbreviation(preferredJurisdiction, myabbrev_family, normalizedKey, Item.language);\n\n            // Some rules:\n            // # variable === \"country\"\n            // (1) If an abbreviation is associated with the code, then:\n            //     (a) return the abbreviated form if form=\"short\"\n            // (2) Otherwise:\n            //     (a) return the human-readable country name, or whatever is there if it's not a code\n            // # variable === \"jurisdiction\"\n            // (1) If !!getHumanForm(jurisdictionID, false, false):\n            //     (a) If the code is top-level (i.e. a country):\n            //         (i) return nothing -- this is what the \"country\" variable is for.\n            //     (b) otherwise:\n            //         (i) If an abbreviation is associated with the code, then:\n            //             (A) return the abbreviated form\n            //         (ii) Otherwise\n            //             (A) return the human-readable form, with the country name & code removed from the front\n            // (2) Otherwise:\n            //     (a) abbreviate as per normal.\n            // # other variables\n            // (1) Abbreviate as per normal.\n\n            if (state.transform.abbrevs[jurisdiction][myabbrev_family] && normalizedKey) {\n                // Safe to test presence of abbrev against raw object in this block\n                var abbrev = state.transform.abbrevs[jurisdiction][myabbrev_family][normalizedKey];\n                if (tok.strings.form === \"short\" && abbrev) {\n                    if (quashCountry) {\n                        value = \"\";\n                    } else {\n                        value = abbrev;\n                    }\n                } else {\n\t                value = getCountryOrJurisdiction(variable, normalizedKey, quashCountry);\n                }\n            }\n        }\n        \n        // Was for: \n        if (!value \n            && (!state.opt.development_extensions.require_explicit_legal_case_title_short || Item.type !== 'legal_case') \n            && altvar && Item[altvar] && use_field) {\n            value = Item[altvar];\n        }\n        if (!value && !state.sys.getAbbreviation && state.sys.getHumanForm) {\n\t        value = getCountryOrJurisdiction(variable, normalizedKey, quashCountry);\n\t    }\n        if (!value && !quashCountry && (!state.sys.getHumanForm || variable !== \"jurisdiction\")) {\n            value = basevalue;\n        }\n        if (state.opt.development_extensions.force_title_abbrev_fallback) {\n            if (variable === \"title\" && value === basevalue && Item[\"title-short\"]) {\n                value = Item[\"title-short\"];\n            }\n        }\n        return value;\n    }\n\n    function getFieldLocale(Item,field) {\n        var ret = state.opt[\"default-locale\"][0].slice(0, 2);\n        var localeRex;\n        if (state.opt.development_extensions.strict_text_case_locales) {\n            localeRex = new RegExp(\"^([a-zA-Z]{2})(?:$|-.*| .*)\");\n        } else {\n            localeRex = new RegExp(\"^([a-zA-Z]{2})(?:$|-.*|.*)\");\n        }\n        if (Item.language) {\n            var m = (\"\" + Item.language).match(localeRex);\n            if (m) {\n                ret = m[1];\n            } else {\n                // Set garbage to \"Klingon\".\n                ret = \"tlh\";\n            }\n        }\n        if (Item.multi && Item.multi && Item.multi.main && Item.multi.main[field]) {\n            ret = Item.multi.main[field];\n        }\n        if (!state.opt.development_extensions.strict_text_case_locales\n            || state.opt.development_extensions.normalize_lang_keys_to_lowercase) {\n\n            ret = ret.toLowerCase();\n        }\n        return ret;\n    }\n\n    // Internal functions\n    function getTextSubField (Item, field, locale_type, use_default, stopOrig, family_var) {\n        var opt, o, ret, opts;\n        var usedOrig = stopOrig;\n        var usingOrig = false;\n\n        if (!Item[field]) {\n            return {\n                name:\"\",\n                usedOrig:stopOrig,\n                token: CSL.Util.cloneToken(this)\n            };\n        }\n        // If form=\"short\" is selected (\"family_var\" is a misnomer\n        // here, it means short-form requested), and the variable\n        // has a short-form partner (i.e. it is in array\n        // VARIABLES_WITH_SHORT_FORM), then it is run here as *-short\".\n        var stickyLongForm = false;\n        if (CSL.VARIABLES_WITH_SHORT_FORM.indexOf(field) > -1\n            && family_var) {\n\n            field = field + \"-short\";\n            stickyLongForm = true;\n        }\n        var breakMe = false;\n        var firstValue = null;\n        var fieldsToTry = [];\n        if (field.slice(-6) === \"-short\") {\n            fieldsToTry.push(field);\n            fieldsToTry.push(field.slice(0, -6))\n        } else {\n            fieldsToTry.push(field);\n        }\n\n        for (var h=0,hlen=fieldsToTry.length; h<hlen; h++) {\n            var variantMatch = false;\n            var field = fieldsToTry[h];\n\n            ret = {name:\"\", usedOrig:stopOrig,locale:getFieldLocale(Item,field)};\n\n            opts = state.opt[locale_type] ? state.opt[locale_type].slice() : [];\n            var hasVal = false;\n\n            if (locale_type === 'locale-orig') {\n                if (!stopOrig) {\n                    ret.name = Item[field];\n                    ret.usedOrig = false;\n                }\n                hasVal = true;\n                usingOrig = true;\n            } else if (use_default && (\"undefined\" === typeof opts || opts.length === 0)) {\n                // If we want the original, or if we don't have any specific guidance and we \n                // definitely want output, just return the original value.\n                ret.name = Item[field];\n                ret.usedOrig = true;\n                hasVal = true;\n                usingOrig = true;\n            }\n\n            if (!hasVal) {\n                for (var i = 0, ilen = opts.length; i < ilen; i += 1) {\n                    opt = opts[i];\n                    o = opt.split(/[\\-_]/)[0];\n                    if (opt && Item.multi && Item.multi._keys[field] && Item.multi._keys[field][opt]) {\n                        ret.name = Item.multi._keys[field][opt];\n                        ret.locale = opt;\n                        hasVal = true;\n                        variantMatch = true;\n                        usingOrig = false;\n                        break;\n                    } else if (o && Item.multi && Item.multi._keys[field] && Item.multi._keys[field][o]) {\n                        ret.name = Item.multi._keys[field][o];\n                        ret.locale = o;\n                        hasVal = true;\n                        variantMatch = true;\n                        usingOrig = false;\n                        break;\n                    }\n                }\n                if (!ret.name && use_default) {\n                    ret = {name:Item[field], usedOrig:true, locale:getFieldLocale(Item,field)};\n                    usingOrig = true;\n                }\n            }\n            ret.token = CSL.Util.cloneToken(this);\n            if (h === 0) {\n                if (variantMatch) {\n                    ret.found_variant_ok = true;\n                }\n                firstValue = ret;\n                if (!stickyLongForm && (\"undefined\" === typeof opts || opts.length === 0)) {\n                    breakMe = true;\n                }\n                if (variantMatch) {\n                    breakMe = true;\n                }\n            } else {\n                if (!stickyLongForm && !variantMatch && firstValue) {\n                    ret = firstValue;\n                    field = fieldsToTry[0];\n                } else if (variantMatch) {\n                    ret.found_variant_ok = true;\n                }\n            }\n            if ([\"title\", \"container-title\"].indexOf(field) > -1) {\n                if (!usedOrig\n                    && (!ret.token.strings[\"text-case\"]\n                        || ret.token.strings[\"text-case\"] === \"sentence\"\n                        || ret.token.strings[\"text-case\"] === \"normal\")) {\n                    var locale = state.opt.lang;\n                    var lang;\n                    if (usingOrig) {\n                        lang = false;\n                    } else {\n                        lang = ret.locale;\n                    }\n                    var seg = field.slice(0,-5);\n                    var sentenceCase = ret.token.strings[\"text-case\"] === \"sentence\" ? true : false;\n                    ret.name = CSL.titlecaseSentenceOrNormal(state, Item, seg, lang, sentenceCase);\n                    delete ret.token.strings[\"text-case\"];\n                }\n            }\n            if (breakMe) {\n                break;\n            }\n        }\n        return ret;\n    }\n    this.getTextSubField = getTextSubField;\n    \n    // Setter for abbreviation lists\n    // This initializes a single abbreviation based on known\n    // data.\n    function loadAbbreviation(jurisdiction, category, orig, lang) {\n        if (!jurisdiction) {\n            jurisdiction = \"default\";\n        }\n        var country = jurisdiction.split(\":\")[0];\n        var domain = CSL.getAbbrevsDomain(state, country, lang);\n        if (domain) {\n            jurisdiction += (\"@\" + domain);\n        }\n        if (!orig) {\n            if (!state.transform.abbrevs[jurisdiction]) {\n                state.transform.abbrevs[jurisdiction] = new state.sys.AbbreviationSegments();\n            }\n            if (!state.transform.abbrevs[jurisdiction][category]) {\n                state.transform.abbrevs[jurisdiction][category] = {};\n            }\n            return jurisdiction;\n        }\n        // The getAbbreviation() function should check the\n        // external DB for the content key. If a value exists\n        // in this[category] and no value exists in DB, the entry\n        // in memory is left untouched. If a value does exist in\n        // DB, the memory value is created.\n        //\n        // See testrunner_stdrhino.js for an example.\n        if (state.sys.getAbbreviation) {\n            jurisdiction = state.sys.getAbbreviation(state.opt.styleID, state.transform.abbrevs, jurisdiction, category, orig);\n            if (!jurisdiction) {\n                jurisdiction = \"default\";\n                if (domain) {\n                    jurisdiction += (\"@\" + domain);\n                }\n            }\n        }\n        return jurisdiction;\n    }\n    this.loadAbbreviation = loadAbbreviation;\n\n    function publisherCheck (tok, Item, primary, family_var) {\n        var varname = tok.variables[0];\n        if (state.publisherOutput && primary) {\n            if ([\"publisher\",\"publisher-place\"].indexOf(varname) === -1) {\n                return false;\n            } else {\n                // In this case, the publisher bundle will be rendered\n                // at the close of the group, by the closing group node.\n                state.publisherOutput[varname + \"-token\"] = tok;\n                state.publisherOutput.varlist.push(varname);\n                var lst = primary.split(/;\\s*/);\n                if (lst.length === state.publisherOutput[varname + \"-list\"].length) {\n                    state.publisherOutput[varname + \"-list\"] = lst;\n                }\n                // Abbreviate each of the items in the list here!\n                for (var i = 0, ilen = lst.length; i < ilen; i += 1) {\n                    lst[i] = abbreviate(state, tok, Item, false, lst[i], family_var, true);\n                }\n                state.tmp[varname + \"-token\"] = tok;\n                return true;\n            }\n        }\n        return false;\n    }\n\n    function citeFormCheck(Item, value) {\n        var m = value.match(/^#([0-9]+).*>>>/);\n        if (m && m[1]) {\n            Item[\"cite-form\"] = m[1];\n        }\n    }\n    \n    // The name transform code is placed here to keep similar things\n    // in one place.  Obviously this module could do with a little\n    // tidying up.\n    function quashCheck(jurisdiction, value) {\n        var m = value.match(/^(?:#[0-9]+)*(?:!((?:[-_a-z]+(?:(?:.*)))(?:,(?:[-_a-z]+(?:(?:.*))))*))*>>>/);\n        if (m) {\n            value = value.slice(m[0].length);\n            if (m[1]) {\n                var fields = m[1].split(\",\");\n                for (var i = 0, ilen = fields.length; i < ilen; i += 1) {\n                    var rawField = fields[i];\n                    var mm = rawField.match(/^([-_a-z]+)(?:\\:(.*))*$/);\n                    var field = mm[1];\n                    // trimmer is not available in getAmbiguousCite\n                    var trimmer = state.tmp.abbrev_trimmer;\n                    if (mm[2]) {\n                        if (trimmer && jurisdiction) {\n                            if (!trimmer[jurisdiction]) {\n                                trimmer[jurisdiction] = {};\n                            }\n                            trimmer[jurisdiction][field] = mm[2];\n                        }\n                    } else if (state.tmp.done_vars.indexOf(field) === -1) {\n                        if (trimmer && jurisdiction) {\n                            if (!trimmer.QUASHES[jurisdiction]) {\n                                trimmer.QUASHES[jurisdiction] = {};\n                            }\n                            trimmer.QUASHES[jurisdiction][field] = true;\n                        }\n                        state.tmp.done_vars.push(field);\n                    }\n                }\n            }\n        }\n        return value;\n    }\n    this.quashCheck = quashCheck;\n\n    // Return function appropriate to selected options\n    function getOutputFunction(variables, family_var, abbreviation_fallback, alternative_varname) {\n        // var mytoken;\n\n        // Set the primary_locale and secondary_locale lists appropriately.\n        // No instance helper function for this; everything can be derived\n        // from processor settings and rendering context.\n\n        var localesets;\n        var langPrefs = CSL.LangPrefsMap[variables[0]];\n        if (!langPrefs) {\n            localesets = false;\n        } else {\n            localesets = state.opt['cite-lang-prefs'][langPrefs];\n        }\n\n        return function (state, Item, item) {\n            var primary, primary_locale, secondary, secondary_locale, tertiary, tertiary_locale, primary_tok;\n            if (!variables[0] || (!Item[variables[0]] && !Item[alternative_varname])) {\n                return null;\n            }\n            //\n            // Exploring the edges here.\n            // \"suppress-author\" for string variables (mostly titles).\n            //\n            if (!state.tmp.just_looking && item && item[\"suppress-author\"]) {\n                if (!state.tmp.probably_rendered_something && state.tmp.can_substitute.length() > 1) {\n                    return null;\n                }\n            }\n            var slot = {primary:false, secondary:false, tertiary:false};\n            if (state.tmp.area.slice(-5) === \"_sort\") {\n                slot.primary = 'locale-sort';\n            } else {\n                if (localesets && localesets.length === 1 && localesets[0] === \"locale-orig\") {\n                    slot.primary = \"locale-orig\";\n                    localesets = false;\n                } else if (localesets && !state.tmp.multi_layout) {\n                    var slotnames = [\"primary\", \"secondary\", \"tertiary\"];\n                    for (var i = 0, ilen = slotnames.length; i < ilen; i += 1) {\n                        if (localesets.length - 1 <  i) {\n                            break;\n                        }\n                        if (localesets[i]) {\n                            slot[slotnames[i]] = 'locale-' + localesets[i];\n                        }\n                    }\n                } else {\n                    slot.primary = 'locale-orig';\n                }\n            }\n            \n            if (variables[0] === \"title-short\" \n                || (state.tmp.area !== \"bibliography\"\n                    && !(state.tmp.area === \"citation\"\n                         && state.opt.xclass === \"note\"\n                         && item && !item.position))) {\n                \n                slot.secondary = false;\n                slot.tertiary = false;\n            }\n\n            if (state.tmp.multi_layout) {\n                slot.secondary = false;\n                slot.tertiary = false;\n            }\n            \n            // Problem for multilingual: we really should be\n            // checking for sanity on the basis of the output\n            // strings to be actually used. (also below)\n            if (state.tmp[\"publisher-list\"]) {\n                if (variables[0] === \"publisher\") {\n                    state.tmp[\"publisher-token\"] = this;\n                } else if (variables[0] === \"publisher-place\") {\n                    state.tmp[\"publisher-place-token\"] = this;\n                }\n                return null;\n            }\n            \n            // tmp.lang_array carries the current locale IDs of the style\n            // and the item. Field-level locale IDs are added here, so\n            // we clone it to allow reset.\n            var oldLangArray = state.tmp.lang_array.slice();\n\n            // True is for transform fallback\n            var res = getTextSubField.call(this, Item, variables[0], slot.primary, true, null, family_var);\n            primary = res.name;\n            primary_locale = res.locale;\n            var primary_tok = res.token;\n            var primaryUsedOrig = res.usedOrig;\n            if (family_var && !res.found_variant_ok) {\n                primary = abbreviate(state, primary_tok, Item, alternative_varname, primary, family_var, true);\n                // Suppress subsequent use of another variable if requested by\n                // hack syntax in this abbreviation short form.\n                if (primary) {\n                    // We run quash-check in getAmbiguousCite, to possibly pick up a cite-form value.\n                    citeFormCheck(Item, primary);\n                    if (!state.tmp.just_looking) {\n                        primary = quashCheck(Item.jurisdiction, primary);\n                    }\n                }\n            }\n            if (publisherCheck(this, Item, primary, family_var)) {\n                state.tmp.lang_array = oldLangArray;\n                return null;\n            }\n\n            // No fallback for secondary and tertiary\n            secondary = false;\n            tertiary = false;\n            var secondary_tok;\n            var tertiary_tok;\n            if (slot.secondary) {\n                res = getTextSubField.call(this, Item, variables[0], slot.secondary, false, res.usedOrig, null, family_var);\n                secondary = res.name;\n                secondary_locale = res.locale;\n                secondary_tok = res.token;\n                if (family_var && !res.found_variant_ok) {\n                    if (secondary) {\n                        // The abbreviate() function could use a cleanup, after Zotero correct to use title-short\n                        secondary = abbreviate(state, secondary_tok, Item, false, secondary, family_var, true);\n                    }\n                }\n                //print(\"XXX secondary_locale: \"+secondary_locale);\n            }\n            if (slot.tertiary) {\n                res = getTextSubField.call(this, Item, variables[0], slot.tertiary, false, res.usedOrig, null, family_var);\n                tertiary = res.name;\n                tertiary_locale = res.locale;\n                tertiary_tok = res.token;\n                if (family_var && !res.found_variant_ok) {\n                    if (tertiary) {\n                        // The abbreviate() function could use a cleanup, after Zotero correct to use title-short\n                        tertiary = abbreviate(state, tertiary_tok, Item, false, tertiary, family_var, true);\n                    }\n                }\n                //print(\"XXX tertiary_locale: \"+tertiary_locale);\n            }\n            \n            // Decoration of primary (currently translit only) goes here\n            var primaryPrefix;\n            if (slot.primary === \"locale-translit\") {\n                primaryPrefix = state.opt.citeAffixes[langPrefs][slot.primary].prefix;\n            }                \n            // XXX This should probably protect against italics at higher\n            // levels.\n\n            if (primaryPrefix === \"<i>\" && variables[0] === 'title' && !primaryUsedOrig) {\n                var hasItalic = false;\n                for (var i = 0, ilen = primary_tok.decorations.length; i < ilen; i += 1) {\n                    if (primary_tok.decorations[i][0] === \"@font-style\"\n                        && primary_tok.decorations[i][1] === \"italic\") {\n                        \n                        hasItalic = true;\n                    }\n                }\n                if (!hasItalic) {\n                    primary_tok.decorations.push([\"@font-style\", \"italic\"]);\n                }\n            }\n\n            //print(\"XXX \"+primary_tok.strings[\"text-case\"]);\n            if (primary_locale !== \"en\" && primary_tok.strings[\"text-case\"] === \"title\") {\n                primary_tok.strings[\"text-case\"] = \"passthrough\";\n            }\n            \n            if (\"title\" === variables[0]) {\n                primary = CSL.demoteNoiseWords(state, primary, this[\"leading-noise-words\"]);\n            }\n            if (secondary || tertiary) {\n\n                state.output.openLevel(\"empty\");\n\n                // A little too aggressive maybe.\n                primary_tok.strings.suffix = primary_tok.strings.suffix.replace(/[ .,]+$/,\"\");\n                if (primary_locale) {\n                    state.tmp.lang_array = [primary_locale].concat(oldLangArray);\n                }\n                CSL.UPDATE_GROUP_CONTEXT_CONDITION(state, null, null, primary_tok, primary_tok.strings.prefix + primary);\n                state.output.append(primary, primary_tok);\n                state.tmp.probably_rendered_something = true;\n\n                if (primary === secondary) {\n                    secondary = false;\n                }\n                if (secondary) {\n                    secondary_tok.strings.prefix = state.opt.citeAffixes[langPrefs][slot.secondary].prefix;\n                    secondary_tok.strings.suffix = state.opt.citeAffixes[langPrefs][slot.secondary].suffix;\n                    // Add a space if empty\n                    if (!secondary_tok.strings.prefix) {\n                        secondary_tok.strings.prefix = \" \";\n                    }\n                    // Remove quotes\n                    for (var i = secondary_tok.decorations.length - 1; i > -1; i += -1) {\n                        if (['@quotes/true', '@font-style/italic', '@font-style/oblique', '@font-weight/bold'].indexOf(secondary_tok.decorations[i].join('/')) > -1) {\n                            secondary_tok.decorations = secondary_tok.decorations.slice(0, i).concat(secondary_tok.decorations.slice(i + 1));\n                        }\n                    }\n                    if (secondary_locale !== \"en\" && secondary_tok.strings[\"text-case\"] === \"title\") {\n                        secondary_tok.strings[\"text-case\"] = \"passthrough\";\n                    }\n                    if (secondary_locale) {\n                        state.tmp.lang_array = [secondary_locale].concat(oldLangArray);\n                    }\n                    var secondary_outer = new CSL.Token();\n                    secondary_outer.decorations.push([\"@font-style\", \"normal\"]);\n                    secondary_outer.decorations.push([\"@font-weight\", \"normal\"]);\n                    state.output.openLevel(secondary_outer);\n                    state.output.append(secondary, secondary_tok);\n                    state.output.closeLevel();\n\n                    var blob_obj = state.output.current.value();\n                    var blobs_pos = state.output.current.value().blobs.length - 1;\n                    // Suppress supplementary multilingual info on subsequent\n                    // partners of a parallel cite?\n                }\n                if (primary === tertiary) {\n                    tertiary = false;\n                }\n                \n                if (tertiary) {\n                    tertiary_tok.strings.prefix = state.opt.citeAffixes[langPrefs][slot.tertiary].prefix;\n                    tertiary_tok.strings.suffix = state.opt.citeAffixes[langPrefs][slot.tertiary].suffix;\n                    // Add a space if empty\n                    if (!tertiary_tok.strings.prefix) {\n                        tertiary_tok.strings.prefix = \" \";\n                    }\n                    // Remove quotes\n                    for (var i = tertiary_tok.decorations.length - 1; i > -1; i += -1) {\n                        if (['@quotes/true', '@font-style/italic', '@font-style/oblique', '@font-weight/bold'].indexOf(tertiary_tok.decorations[i].join('/')) > -1) {\n                            tertiary_tok.decorations = tertiary_tok.decorations.slice(0, i).concat(tertiary_tok.decorations.slice(i + 1));\n                        }\n                    }\n                    if (tertiary_locale !== \"en\" && tertiary_tok.strings[\"text-case\"] === \"title\") {\n                        tertiary_tok.strings[\"text-case\"] = \"passthrough\";\n                    }\n                    if (tertiary_locale) {\n                        state.tmp.lang_array = [tertiary_locale].concat(oldLangArray);\n                    }\n                    var tertiary_outer = new CSL.Token();\n                    tertiary_outer.decorations.push([\"@font-style\", \"normal\"]);\n                    tertiary_outer.decorations.push([\"@font-weight\", \"normal\"]);\n                    state.output.openLevel(tertiary_outer);\n                    state.output.append(tertiary, tertiary_tok);\n                    state.output.closeLevel();\n\n                    var blob_obj = state.output.current.value();\n                    var blobs_pos = state.output.current.value().blobs.length - 1;\n                    // Suppress supplementary multilingual info on subsequent\n                    // partners of a parallel cite?\n                    // See note above.\n                }\n\n                state.output.closeLevel();\n            } else {\n                if (primary_locale) {\n                    state.tmp.lang_array = [primary_locale].concat(oldLangArray);\n                }\n                CSL.UPDATE_GROUP_CONTEXT_CONDITION(state, null, null, primary_tok, primary_tok.strings.prefix + primary);\n                state.output.append(primary, primary_tok);\n                state.tmp.probably_rendered_something = true;\n            }\n\n            state.tmp.lang_array = oldLangArray;\n                \n            if (state.tmp.can_block_substitute) {\n                state.tmp.name_node.children.push(state.output.current.value());\n            }\n            return null;\n        };\n    }\n    this.getOutputFunction = getOutputFunction;\n};\n\n/*global CSL: true */\n\n/**\n * Style token.\n * <p>This class provides the tokens that define\n * the runtime version of the style.  The tokens are\n * instantiated by {@link CSL.Core.Build}, but the token list\n * must be post-processed with\n * {@link CSL.Core.Configure} before it can be used to generate\n * citations.</p>\n * @param {String} name The node name represented by this token.\n * @param {Int} tokentype A flag indicating whether this token\n * marks the start of a node, the end of a node, or is a singleton.\n * @class\n */\nCSL.Token = function (name, tokentype, conditional) {\n    /**\n     * Name of the element.\n     * <p>This corresponds to the element name of the\n     * relevant tag in the CSL file.\n     */\n    this.name = name;\n    /**\n     * Strings and other static content specific to the element.\n     */\n    this.strings = {};\n    this.strings.delimiter = undefined;\n    this.strings.prefix = \"\";\n    this.strings.suffix = \"\";\n    /**\n     * Formatting parameters.\n     * <p>This is a placeholder at instantiation.  It is\n     * replaced by the result of {@link CSL.setDecorations}\n     * when the tag is created and configured during {@link CSL.Core.Build}\n     * by {@link CSL.XmlToToken}.  The parameters for particular\n     * formatting attributes are stored as string arrays, which\n     * map to formatting functions at runtime,\n     * when the output format is known.  Note that the order in which\n     * parameters are registered is fixed by the constant\n     * {@link CSL.FORMAT_KEY_SEQUENCE}.\n     */\n    this.decorations = [];\n    this.variables = [];\n    /**\n     * Element functions.\n     * <p>Functions implementing the styling behaviour of the element\n     * are pushed into this array in the {@link CSL.Core.Build} phase.\n     */\n    this.execs = [];\n    /**\n     * Token type.\n     * <p>This is a flag constant indicating whether the token represents\n     * a start tag, an end tag, or is a singleton.</p>\n     */\n    this.tokentype = tokentype;\n\n    // Conditional attributes added to bare tokens at runtime\n    \n    /**\n     * Condition evaluator.\n     * <p>This is a placeholder that receives a single function, and is\n     * only relevant for a conditional branching tag (<code>if</code> or\n     * <code>else-if</code>).  The function implements the argument to\n     * the <code>match=</code> attribute (<code>any</code>, <code>all</code>\n     * or <code>none</code>), by executing the functions registered in the\n     * <code>tests</code> array (see below), and reacting accordingly.  This\n     * function is invoked by the execution wrappers found in\n     * {@link CSL.Engine}.</p>\n     */\n    // this.evaluator = false;\n    /**\n     * Conditions.\n     * <p>Functions that evaluate to true or false, implementing\n     * various posisble attributes to the conditional branching tags,\n     * are registered here during {@link CSL.Core.Build}.\n     * </p>\n     */\n    // this.tests = [];\n    /**\n     * Jump point on success.\n     * <p>This holds the list jump point to be used when the\n     * <code>evaluator</code> function of a conditional tag\n     * returns true (success).  The jump index value is set during the\n     * back-to-front token pass performed during {@link CSL.Core.Configure}.\n     * </p>\n     */\n    // this.succeed = false;\n    /**\n     * Jump point on failure.\n     * <p>This holds the list jump point to be used when the\n     * <code>evaluator</code> function of a conditional tag\n     * returns false (failure).  Jump index values are set during the\n     * back-to-front token pass performed during {@link CSL.Core.Configure}.\n     * </p>\n     */\n    // this.fail = false;\n    /**\n     * Index of next token.\n     * <p>This holds the index of the next token in the\n     * token list, which is the default \"jump-point\" for ordinary\n     * processing.  Jump index values are set during the\n     * back-to-front token pass performed during {@link CSL.Core.Configure}.\n     * </p>\n     */\n    // this.next = false;\n};\n\n// Have needed this for yonks\nCSL.Util.cloneToken = function (token) {\n    var newtok, key, pos, len;\n    if (\"string\" === typeof token) {\n        return token;\n    }\n    newtok = new CSL.Token(token.name, token.tokentype);\n    for (var key in token.strings) {\n        if (token.strings.hasOwnProperty(key)) {\n            newtok.strings[key] = token.strings[key];\n        }\n    }\n    if (token.decorations) {\n        newtok.decorations = [];\n        for (pos = 0, len = token.decorations.length; pos < len; pos += 1) {\n            newtok.decorations.push(token.decorations[pos].slice());\n        }\n    }\n    if (token.variables) {\n        newtok.variables = token.variables.slice();\n    }\n    // Probably overkill; this is only used for cloning formatting\n    // tokens.\n    if (token.execs) {\n        newtok.execs = token.execs.slice();\n        if (token.tests) {\n            newtok.tests = token.tests.slice();\n        }\n    }\n    return newtok;\n};\n\n/*global CSL: true */\n\n/**\n * Ambiguous Cite Configuration Object\n * @class\n */\nCSL.AmbigConfig = function () {\n    this.maxvals = [];\n    this.minval = 1;\n    this.names = [];\n    this.givens = [];\n    this.year_suffix = false;\n    this.disambiguate = 0;\n};\n\n/*global CSL: true */\n\nCSL.Blob = function (str, token, levelname) {\n    var len, pos, key;\n    this.levelname = levelname;\n    //print(levelname);\n    if (token) {\n        this.strings = {\"prefix\":\"\",\"suffix\":\"\"};\n        for (var key in token.strings) {\n            if (token.strings.hasOwnProperty(key)) {\n                this.strings[key] = token.strings[key];\n            }\n        }\n        this.decorations = [];\n        if (token.decorations === undefined) {\n            len = 0;\n        } else {\n            len = token.decorations.length;\n        }\n        for (pos = 0; pos < len; pos += 1) {\n            this.decorations.push(token.decorations[pos].slice());\n        }\n    } else {\n        this.strings = {};\n        this.strings.prefix = \"\";\n        this.strings.suffix = \"\";\n        this.strings.delimiter = \"\";\n        this.decorations = [];\n    }\n    if (\"string\" === typeof str) {\n        this.blobs = str;\n    } else if (str) {\n        this.blobs = [str];\n    } else {\n        this.blobs = [];\n    }\n    this.alldecor = [this.decorations];\n};\n\n\nCSL.Blob.prototype.push = function (blob) {\n    if (\"string\" === typeof this.blobs) {\n        CSL.error(\"Attempt to push blob onto string object\");\n    } else if (false !== blob) {\n        blob.alldecor = blob.alldecor.concat(this.alldecor);\n        this.blobs.push(blob);\n    }\n};\n\n/*global CSL: true */\n\n/**\n * An output instance object representing a number or a range\n *\n * with attributes next and start, and\n * methods isRange(), renderStart(), renderEnd() and renderRange().\n * At render time, the output queue will perform optional\n * collapsing of these objects in the queue, according to\n * configurable options, and apply any decorations registered\n * in the object to the output elements.\n * @namespace Range object and friends.\n */\n\nCSL.NumericBlob = function (state, particle, num, mother_token, id) {\n    // item id is used to assure that prefix delimiter is invoked only\n    // when joining blobs across items\n    this.id = id;\n    this.alldecor = [];\n    this.num = num;\n    this.particle = particle;\n    this.blobs = num.toString();\n    this.status = CSL.START;\n    this.strings = {};\n    if (mother_token) {\n        if (mother_token.strings[\"text-case\"]) {\n            var textCase = mother_token.strings[\"text-case\"];\n            this.particle = CSL.Output.Formatters[textCase](state, this.particle);\n            this.blobs = CSL.Output.Formatters[textCase](state, this.blobs);\n        }\n        this.gender = mother_token.gender;\n        this.decorations = mother_token.decorations;\n        this.strings.prefix = mother_token.strings.prefix;\n        this.strings.suffix = mother_token.strings.suffix;\n        this.strings[\"text-case\"] = mother_token.strings[\"text-case\"];\n        this.successor_prefix = mother_token.successor_prefix;\n        this.range_prefix = mother_token.range_prefix;\n        this.splice_prefix = mother_token.splice_prefix;\n        this.formatter = mother_token.formatter;\n        if (!this.formatter) {\n            this.formatter =  new CSL.Output.DefaultFormatter();\n        }\n        if (this.formatter) {\n            this.type = this.formatter.format(1);\n        }\n    } else {\n        this.decorations = [];\n        this.strings.prefix = \"\";\n        this.strings.suffix = \"\";\n        this.successor_prefix = \"\";\n        this.range_prefix = \"\";\n        this.splice_prefix = \"\";\n        this.formatter = new CSL.Output.DefaultFormatter();\n    }\n};\n\n\nCSL.NumericBlob.prototype.setFormatter = function (formatter) {\n    this.formatter = formatter;\n    this.type = this.formatter.format(1);\n};\n\n\nCSL.Output.DefaultFormatter = function () {};\n\nCSL.Output.DefaultFormatter.prototype.format = function (num) {\n    return num.toString();\n};\n\nCSL.NumericBlob.prototype.checkNext = function (next,start) {\n    if (start) {\n        this.status = CSL.START;\n        if (\"object\" === typeof next) {\n            if (next.num === (this.num + 1)) {\n                next.status = CSL.SUCCESSOR;\n            } else {\n                next.status = CSL.SEEN;\n            }\n        }\n    } else if (! next || !next.num || this.type !== next.type || next.num !== (this.num + 1)) {\n        if (this.status === CSL.SUCCESSOR_OF_SUCCESSOR) {\n            this.status = CSL.END;\n        }\n        if (\"object\" === typeof next) { \n           next.status = CSL.SEEN;\n        }\n    } else { // next number is in the sequence\n        if (this.status === CSL.START || this.status === CSL.SEEN) {\n            next.status = CSL.SUCCESSOR;\n        } else if (this.status === CSL.SUCCESSOR || this.status === CSL.SUCCESSOR_OF_SUCCESSOR) {\n            if (this.range_prefix) {\n                next.status = CSL.SUCCESSOR_OF_SUCCESSOR;\n                this.status = CSL.SUPPRESS;\n            } else {\n                next.status = CSL.SUCCESSOR;\n            }\n        }\n        // wakes up the correct delimiter.\n        //if (this.status === CSL.SEEN) {\n        //    this.status = CSL.SUCCESSOR;\n        //}\n    }\n};\n\n\nCSL.NumericBlob.prototype.checkLast = function (last) {\n    // Used to adjust final non-range join\n    if (this.status === CSL.SEEN \n    || (last.num !== (this.num - 1) && this.status === CSL.SUCCESSOR)) {\n        this.status = CSL.SUCCESSOR;\n        return true;\n    }\n    return false;\n};\n\n/*global CSL: true */\n\nCSL.Util.fixDateNode = function (parent, pos, node) {\n    var form, variable, datexml, subnode, partname, attr, val, prefix, suffix, children, subchildren, display, cslid;\n    \n    var lingo = this.cslXml.getAttributeValue(node, \"lingo\");\n\n    var default_locale = this.cslXml.getAttributeValue(node, \"default-locale\");\n\n    // Raise date flag, used to control inclusion of year-suffix key in sorts\n    // This may be a little reckless: not sure what happens on no-date conditions\n    this.build.date_key = true;\n\n    form = this.cslXml.getAttributeValue(node, \"form\");\n    var lingo;\n    if (default_locale) {\n        lingo = this.opt[\"default-locale\"][0];\n    } else {\n        lingo = this.cslXml.getAttributeValue(node, \"lingo\");\n    }\n\n    if (!this.getDate(form, default_locale)) {\n        return parent;\n    }\n\n    var dateparts = this.cslXml.getAttributeValue(node, \"date-parts\");\n\n    variable = this.cslXml.getAttributeValue(node, \"variable\");\n    prefix = this.cslXml.getAttributeValue(node, \"prefix\");\n    suffix = this.cslXml.getAttributeValue(node, \"suffix\");\n    display = this.cslXml.getAttributeValue(node, \"display\");\n    cslid = this.cslXml.getAttributeValue(node, \"cslid\");\n\n    //\n    // Xml: Copy a node\n    //\n    datexml = this.cslXml.nodeCopy(this.getDate(form, default_locale));\n    this.cslXml.setAttribute(datexml, 'lingo', this.opt.lang);\n    this.cslXml.setAttribute(datexml, 'form', form);\n    this.cslXml.setAttribute(datexml, 'date-parts', dateparts);\n    this.cslXml.setAttribute(datexml, \"cslid\", cslid);\n    //\n    // Xml: Set attribute\n    //\n    this.cslXml.setAttribute(datexml, 'variable', variable);\n    this.cslXml.setAttribute(datexml, 'default-locale', default_locale);\n    //\n    // Xml: Set flag\n    //\n    if (prefix) {\n        //\n        // Xml: Set attribute\n        //\n        this.cslXml.setAttribute(datexml, \"prefix\", prefix);\n    }\n    if (suffix) {\n        //\n        // Xml: Set attribute\n        //\n        this.cslXml.setAttribute(datexml, \"suffix\", suffix);\n    }\n    if (display) {\n        //\n        // Xml: Set attribute\n        //\n        this.cslXml.setAttribute(datexml, \"display\", display);\n    }\n    //\n    // Step through any date-part children of the layout date node,\n    // and lay their attributes onto the corresponding node in the\n    // locale template node copy.\n    //\n    // tests: language_BaseLocale\n    // tests: date_LocalizedTextInStyleLocaleWithTextCase\n    //\n    children = this.cslXml.children(datexml);\n    for (var key in children) {\n        subnode = children[key];\n        if (\"date-part\" === this.cslXml.nodename(subnode)) {\n            partname = this.cslXml.getAttributeValue(subnode, \"name\");\n            if (default_locale) {\n                this.cslXml.setAttributeOnNodeIdentifiedByNameAttribute(datexml, \"date-part\", partname, \"@default-locale\", \"true\");\n            }\n        }\n    }\n\n    children = this.cslXml.children(node);\n    for (var key in children) {\n        subnode = children[key];\n        if (\"date-part\" === this.cslXml.nodename(subnode)) {\n            partname = this.cslXml.getAttributeValue(subnode, \"name\");\n            subchildren = this.cslXml.attributes(subnode);\n            for (attr in subchildren) {\n                if (\"@name\" === attr) {\n                    continue;\n                }\n                if (lingo && lingo !== this.opt.lang) {\n                    if ([\"@suffix\", \"@prefix\", \"@form\"].indexOf(attr) > -1) {\n                        continue;\n                    }\n                }\n                val = subchildren[attr];\n                this.cslXml.setAttributeOnNodeIdentifiedByNameAttribute(datexml, \"date-part\", partname, attr, val);\n            }\n        }\n    }\n    \n    if (\"year\" === this.cslXml.getAttributeValue(node, \"date-parts\")) {\n\n        //\n        // Xml: Find one node by attribute and delete\n        //\n        this.cslXml.deleteNodeByNameAttribute(datexml, 'month');\n        //\n        // Xml: Find one node by attribute and delete\n        //\n        this.cslXml.deleteNodeByNameAttribute(datexml, 'day');\n        \n    } else if (\"year-month\" === this.cslXml.getAttributeValue(node, \"date-parts\")) {\n        //\n        // Xml: Find one node by attribute and delete\n        //\n        this.cslXml.deleteNodeByNameAttribute(datexml, 'day');\n    } else if (\"month-day\" === this.cslXml.getAttributeValue(node, \"date-parts\")) {\n        //\n        // Xml: Get child nodes\n        //\n        var childNodes = this.cslXml.children(datexml);\n        for (var i=1,ilen=this.cslXml.numberofnodes(childNodes);i<ilen;i++) {\n            //\n            // Xml: Get attribute value (for string comparison)\n            //\n            if (this.cslXml.getAttributeValue(childNodes[i], 'name') === \"year\") {\n                //\n                // Xml: Set attribute value\n                //\n                this.cslXml.setAttribute(childNodes[i-1], \"suffix\", \"\");\n                break;\n            }\n        }\n        //\n        // Xml: Find one node by attribute and delete\n        //\n        this.cslXml.deleteNodeByNameAttribute(datexml, 'year');\n    }\n    return this.cslXml.insertChildNodeAfter(parent, node, pos, datexml);\n};\n\n/*global CSL: true */\n\nCSL.dateMacroAsSortKey = function (state, Item) {\n    CSL.dateAsSortKey.call(this, state, Item, true);\n};\n\n\nCSL.dateAsSortKey = function (state, Item, isMacro) {\n    var dp, elem, value, e, yr, prefix, i, ilen;\n    var variable = this.variables[0];\n    var macroFlag = \"empty\";\n    if (isMacro && state.tmp.extension) {\n        macroFlag = \"macro-with-date\";\n    }\n    dp = Item[variable];\n    if (\"undefined\" === typeof dp) {\n        dp = {\"date-parts\": [[0]] };\n    }\n    if (\"undefined\" === typeof this.dateparts) {\n        this.dateparts = [\"year\", \"month\", \"day\"];\n    }\n    if (dp.raw) {\n        dp = state.fun.dateparser.parseDateToArray(dp.raw);\n    } else if (dp[\"date-parts\"]) {\n        dp = state.dateParseArray(dp);\n    }\n    if (\"undefined\" === typeof dp) {\n        dp = {};\n    }\n    if (dp.year) {\n        for (i = 0, ilen = CSL.DATE_PARTS_INTERNAL.length; i < ilen; i += 1) {\n            elem = CSL.DATE_PARTS_INTERNAL[i];\n            value = 0;\n            e = elem;\n            if (e.slice(-4) === \"_end\") {\n                e = e.slice(0, -4);\n            }\n            if (dp[elem] && this.dateparts.indexOf(e) > -1) {\n                value = dp[elem];\n            }\n            if (elem.slice(0, 4) === \"year\") {\n                yr = CSL.Util.Dates[e].numeric(state, value);\n                var prefix = \"1\";\n                if (yr[0] === \"-\") {\n                    prefix = \"0\";\n                    yr = yr.slice(1);\n                    yr = 9999 - parseInt(yr, 10);\n                }\n                state.output.append(CSL.Util.Dates[elem.slice(0, 4)].numeric(state, (prefix + yr)), macroFlag);\n            } else {\n                value = CSL.Util.Dates[e][\"numeric-leading-zeros\"](state, value);\n                // Ugh.\n                if (!value) {\n                    value = \"00\";\n                }\n                state.output.append(value, macroFlag);\n            }\n        }\n    }\n};\n\nCSL.Engine.prototype.dateParseArray = function (date_obj) {\n    var ret, field, dp, exts;\n    ret = {};\n    for (field in date_obj) {\n        if (field === \"date-parts\") {\n            dp = date_obj[\"date-parts\"];\n            if (dp.length > 1) {\n                if (dp[0].length !== dp[1].length) {\n                    CSL.error(\"CSL data error: element mismatch in date range input.\");\n                }\n            }\n            exts = [\"\", \"_end\"];\n            for (var i = 0, ilen = dp.length; i < ilen; i += 1) {\n                for (var j = 0, jlen = CSL.DATE_PARTS.length; j < jlen; j += 1) {\n                    if (isNaN(parseInt(dp[i][j], 10))) {\n                        ret[(CSL.DATE_PARTS[j] + exts[i])] = undefined;\n                    } else {\n                        ret[(CSL.DATE_PARTS[j] + exts[i])] = parseInt(dp[i][j], 10);\n                    }\n                }\n            }\n        } else if (date_obj.hasOwnProperty(field)) {\n\n            // XXXX: temporary workaround\n\n            if (field === \"literal\" && \"object\" === typeof date_obj.literal && \"string\" === typeof date_obj.literal.part) {\n                CSL.debug(\"Warning: fixing up weird literal date value\");\n                ret.literal = date_obj.literal.part;\n            } else {\n                ret[field] = date_obj[field];\n            }\n        }\n    }\n    return ret;\n};\n\n/*global CSL: true */\n\nCSL.Util.Names = {};\n\nCSL.Util.Names.compareNamesets = CSL.NameOutput.prototype._compareNamesets;\n\n/**\n * Un-initialize a name (quash caps after first character)\n */\nCSL.Util.Names.unInitialize = function (state, name) {\n    var i, ilen, namelist, punctlist, ret;\n    if (!name) {\n        return \"\";\n    }\n    namelist = name.split(/(?:\\-|\\s+)/);\n    punctlist = name.match(/(\\-|\\s+)/g);\n    ret = \"\";\n    for (i = 0, ilen = namelist.length; i < ilen; i += 1) {\n        // if (CSL.ALL_ROMANESQUE_REGEXP.exec(namelist[i].slice(0,-1)) \n        //    && namelist[i] \n        //    && namelist[i] !== namelist[i].toUpperCase()) {\n\n            // More or less like this, to address the following fault report:\n            // http://forums.zotero.org/discussion/17610/apsa-problems-with-capitalization-of-mc-mac-etc/\n\n            // Leaving the name string untouched because name capitalization is varied and wonderful.\n            // https://github.com/Juris-M/citeproc-js/issues/43\n            \n            //namelist[i] = namelist[i].slice(0, 1) + namelist[i].slice(1, 2).toLowerCase() + namelist[i].slice(2);\n        // }\n        ret += namelist[i];\n        if (i < ilen - 1) {\n            ret += punctlist[i];\n        }\n    }\n    return ret;\n};\n\n/**\n * Initialize a name.\n */\nCSL.Util.Names.initializeWith = function (state, name, terminator, normalizeOnly) {\n    var i, ilen, mm, lst, ret;\n    if (!name) {\n        return \"\";\n    }\n    if (!terminator) {\n        terminator = \"\";\n    }\n    if ([\"Lord\", \"Lady\"].indexOf(name) > -1\n        || (!name.replace(/^(?:<[^>]+>)*/, \"\").match(CSL.STARTSWITH_ROMANESQUE_REGEXP)\n            && !terminator.match(\"%s\"))) {\n        return name;\n    }\n\n    if (state.opt[\"initialize-with-hyphen\"] === false) {\n        name = name.replace(/\\-/g, \" \");\n    }\n\n    // We need to suss out what is a set of initials or abbreviation,\n    // so that they can be selectively normalized. Steps might be:\n    //   (1) Split the string\n    //   (2) Step through the string, deleting periods and, if initalize=\"false\", then\n    //       (a) note abbreviations and initials (separately).\n    //   (3) If initialize=\"false\" then:\n    //       (a) Do the thing below, but only pushing terminator; or else\n    //       (b) Do the thing below\n\n    name = name.replace(/\\s*\\-\\s*/g, \"-\").replace(/\\s+/g, \" \");\n    name = name.replace(/-([a-z])/g, \"\\u2013$1\");\n\n    for (var i=name.length-2; i>-1; i += -1) {\n        if (name.slice(i, i+1) === \".\" && name.slice(i+1, i+2) !== \" \") {\n            name = name.slice(0, i) + \". \" + name.slice(i+1);\n        }\n    }\n\n    // (1) Split the string\n    var nameSplits = CSL.Output.Formatters.nameDoppel.split(name);\n    var namelist = [];\n    namelist = [nameSplits.strings[0]];\n\n    if (nameSplits.tags.length === 0) {\n        var mmm = namelist[0].match(/[^\\.]+$/);\n        if (mmm && mmm[0].length === 1 && mmm[0] !== mmm[0].toLowerCase()) {\n            namelist[0] += \".\";\n        }\n    }\n\n    for (i = 1, ilen = nameSplits.strings.length; i < ilen; i += 1) {\n        namelist.push(nameSplits.tags[i - 1]);\n        namelist.push(nameSplits.strings[i]);\n    }\n\n    // Use doInitializeName or doNormalizeName, depending on requirements.\n    if (normalizeOnly) {\n        ret = this.doNormalize(state, namelist, terminator);\n    } else {\n        ret = this.doInitialize(state, namelist, terminator);\n    }\n    ret = ret.replace(/\\u2013([a-z])/g, \"-$1\");\n    return ret;\n};\n\nCSL.Util.Names.notag = function(str) {\n    return str.replace(/^(?:<[^>]+>)*/, \"\");\n};\n\nCSL.Util.Names.mergetag = function(state, tagstr, newstr) {\n    var m = tagstr.match(/(?:-*<[^>]+>-*)/g);\n    if (!m) {\n        return newstr;\n    } else {\n        tagstr = m.join(\"\");\n    }\n    m = newstr.match(/^(.*[^\\s])*(\\s+)$/);\n    if (m) {\n        m[1] = m[1] ? m[1] : \"\";\n        newstr = m[1] + tagstr + m[2];\n    } else {\n        newstr = newstr + tagstr;\n    }\n    return newstr;\n};\n\nCSL.Util.Names.tagonly = function(state, str) {\n    var m = str.match(/(?:<[^>]+>)+/);\n    if (!m) {\n        return str;\n    } else {\n        return m.join(\"\");\n    }\n};\n\nCSL.Util.Names.doNormalize = function (state, namelist, terminator) {\n    var i, ilen;\n    // namelist is a flat list of given-name elements and space-like separators between them\n    terminator = terminator ? terminator : \"\";\n    // Flag elements that look like abbreviations\n    var isAbbrev = [];\n    for (i = 0, ilen = namelist.length; i < ilen; i += 1) {\n        if (this.notag(namelist[i]).length > 1 && this.notag(namelist[i]).slice(-1) === \".\") {\n            // namelist[i] = namelist[i].slice(0, -1);\n            namelist[i] = namelist[i].replace(/^(.*)\\.(.*)$/, \"$1$2\");\n            isAbbrev.push(true);\n        } else if (namelist[i].length === 1 && namelist[i].toUpperCase() === namelist[i]) {\n            isAbbrev.push(true);\n        } else {\n            isAbbrev.push(false);\n        }\n    }\n    // Step through the elements of the givenname array\n    for (i = 0, ilen = namelist.length; i < ilen; i += 2) {\n        // If the element is not an abbreviation, leave it and its trailing spaces alone\n        if (isAbbrev[i]) {\n            // For all elements but the last\n            if (i < namelist.length - 2) {\n                // Start from scratch on space-like things following an abbreviation\n                namelist[i + 1] = this.tagonly(state, namelist[i+1]);\n                if (!isAbbrev[i+2]) {\n                    namelist[i + 1] = this.tagonly(state, namelist[i+1]) + \" \";\n                }\n                \n                // Add the terminator to the element\n                // If the following element is not a single-character abbreviation, remove a trailing zero-width non-break space, if present\n                // These ops may leave some duplicate cruft in the elements and separators. This will be cleaned at the end of the function.\n                if (namelist[i + 2].length > 1) {\n                    namelist[i+1] = terminator.replace(/\\ufeff$/, \"\") + namelist[i+1];\n                } else {\n                    namelist[i+1] = this.mergetag(state, namelist[i+1], terminator);\n                }\n            }\n            // For the last element (if it is an abbreviation), just append the terminator\n            if (i === namelist.length - 1) {\n                namelist[i] = namelist[i] + terminator;\n            }\n        }\n    }\n    // Remove trailing cruft and duplicate spaces, and return\n    return namelist.join(\"\").replace(/[\\u0009\\u000a\\u000b\\u000c\\u000d\\u0020\\ufeff\\u00a0]+$/,\"\").replace(/\\s*\\-\\s*/g, \"-\").replace(/[\\u0009\\u000a\\u000b\\u000c\\u000d\\u0020]+/g, \" \");\n};\n\nCSL.Util.Names.doInitialize = function (state, namelist, terminator) {\n    var i, ilen, m, j, jlen, lst, n;\n    for (i = 0, ilen = namelist.length; i < ilen; i += 2) {\n        n = namelist[i];\n        if (!n) {\n            continue;\n        }\n        m = n.match(CSL.NAME_INITIAL_REGEXP);\n        if (!m && (!n.match(CSL.STARTSWITH_ROMANESQUE_REGEXP) && n.length > 1 && terminator.match(\"%s\"))) {\n            m = n.match(/(.)(.*)/);\n        }\n        if (m && m[2] && m[3]) {\n            m[1] = m[1] + m[2];\n            m[2] = \"\";\n        }\n        if (m && m[1].slice(0, 1) === m[1].slice(0, 1).toUpperCase()) {\n            var extra = \"\";\n            if (m[2]) {\n                var s = \"\";\n                lst = m[2].split(\"\");\n                for (j = 0, jlen = lst.length; j < jlen; j += 1) {\n                    var c = lst[j];\n                    if (c === c.toUpperCase()) {\n                        s += c;\n                    } else {\n                        break;\n                    }\n                }\n                if (s.length < m[2].length) {\n                    extra = CSL.toLocaleLowerCase.call(state, s);\n                }\n            }\n            namelist[i] = m[1] + extra;\n            if (i < (ilen - 1)) {\n                if (terminator.match(\"%s\")) {\n                    namelist[i] = terminator.replace(\"%s\", namelist[i]);\n                } else {\n                    if (namelist[i + 1].indexOf(\"-\") > -1) {\n                        namelist[i + 1] = this.mergetag(state, namelist[i+1].replace(\"-\", \"\"), terminator) + \"-\";\n                    } else {\n                        namelist[i + 1] = this.mergetag(state, namelist[i+1], terminator);\n                    }\n                }\n            } else {\n                if (terminator.match(\"%s\")) {\n                    namelist[i] = terminator.replace(\"%s\", namelist[i]);\n                } else {\n                    namelist.push(terminator);\n                }\n            }\n        } else if (n.match(CSL.ROMANESQUE_REGEXP) && (!m || !m[3])) {\n            namelist[i] = \" \" + n;\n        }\n    }\n    var ret = namelist.join(\"\");\n    ret = ret.replace(/[\\u0009\\u000a\\u000b\\u000c\\u000d\\u0020\\ufeff\\u00a0]+$/,\"\").replace(/\\s*\\-\\s*/g, \"-\").replace(/[\\u0009\\u000a\\u000b\\u000c\\u000d\\u0020]+/g, \" \");\n    return ret;\n};\n\nCSL.Util.Names.getRawName = function (name) {\n    var ret = [];\n    if (name.literal) {\n        ret.push(name.literal);\n    } else {\n        if (name.given) {\n            ret.push(name.given);\n        }\n        if (name.family) {\n            ret.push(name.family);\n        }\n    }\n    return ret.join(\" \");\n};\n\n/*global CSL: true */\n\n/**\n * Date mangling functions.\n * @namespace Date construction utilities\n */\nCSL.Util.Dates = {};\n\n/**\n * Year manglers\n * <p>short, long</p>\n */\nCSL.Util.Dates.year = {};\n\n/**\n * Convert year to long form\n * <p>This just passes the number back as a string.</p>\n */\nCSL.Util.Dates.year[\"long\"] = function (state, num) {\n    if (!num) {\n        if (\"boolean\" === typeof num) {\n            num = \"\";\n        } else {\n            num = 0;\n        }\n    }\n    return num.toString();\n};\n\n/**\n * Crudely convert to Japanese Imperial form.\n * <p>Returns the result as a string.</p>\n */\nCSL.Util.Dates.year.imperial = function (state, num, end) {\n    var year = \"\";\n    if (!num) {\n        if (\"boolean\" === typeof num) {\n            num = \"\";\n        } else {\n            num = 0;\n        }\n    }\n    end = end ? \"_end\" : \"\";\n    var month = state.tmp.date_object[\"month\" + end];\n    month = month ? \"\"+month : \"1\";\n    while (month.length < 2) {\n        month = \"0\" + month;\n    }\n    var day = state.tmp.date_object[\"day\" + end];\n    day = day ? \"\"+day : \"1\";\n    while (day.length < 2) {\n        day = \"0\" + day;\n    }\n    var date = parseInt(num + month + day, 10);\n    var label;\n    var offset;\n    if (date >= 18680908 && date < 19120730) {\n        label = '\\u660e\\u6cbb';\n        offset = 1867;\n    } else if (date >= 19120730 && date < 19261225) {\n        label = '\\u5927\\u6b63';\n        offset = 1911;\n    } else if (date >= 19261225 && date < 19890108) {\n        label = '\\u662d\\u548c';\n        offset = 1925;\n    } else if (date >= 19890108) {\n        label = '\\u5e73\\u6210';\n        offset = 1988;\n    }\n    // This entire \"imperial\" code block should be cut. Scraped input\n    // for this will be too ratty to be useful anyway.\n    if (label && offset) {\n        var normalizedKey = label;\n        if (state.sys.normalizeAbbrevsKey) {\n            // The first argument does not need to specify the exact variable\n            // name.\n            normalizedKey = state.sys.normalizeAbbrevsKey(\"number\", label);\n        }\n        if (!state.transform.abbrevs['default']['number'][normalizedKey]) {\n            // loadAbbreviation normally takes an item as fourth argument.\n            // It is not available here, \n            state.transform.loadAbbreviation('default', \"number\", normalizedKey, null);\n        }\n        if (state.transform.abbrevs['default']['number'][normalizedKey]) {\n            label = state.transform.abbrevs['default']['number'][normalizedKey];\n        }\n        year = label + (num - offset);\n    }\n    return year;\n};\n\n/**\n * Convert year to short form\n * <p>Just crops any 4-digit year to the last two digits.</p>\n */\nCSL.Util.Dates.year[\"short\"] = function (state, num) {\n    num = num.toString();\n    if (num && num.length === 4) {\n        return num.substr(2);\n    }\n};\n\n\n/**\n * Convert year to short form\n * <p>Just crops any 4-digit year to the last two digits.</p>\n */\nCSL.Util.Dates.year.numeric = function (state, num) {\n    var m, pre;\n    num = \"\" + num;\n    var m = num.match(/([0-9]*)$/);\n    if (m) {\n        pre = num.slice(0, m[1].length * -1);\n        num = m[1];\n    } else {\n        pre = num;\n        num = \"\";\n    }\n    while (num.length < 4) {\n        num = \"0\" + num;\n    }\n    return (pre + num);\n};\n\n\n/*\n * MONTH manglers\n * normalize\n * long, short, numeric, numeric-leading-zeros\n */\nCSL.Util.Dates.normalizeMonth = function (num, useSeason) {\n    var ret;\n    if (!num) {\n        num = 0;\n    }\n    num = \"\" + num;\n    if (!num.match(/^[0-9]+$/)) {\n        num = 0;\n    }\n    num = parseInt(num, 10);\n    if (useSeason) {\n        var res = {stub: \"month-\", num: num};\n        if (res.num < 1 || res.num > 24) {\n            res.num = 0;\n        } else {\n            while (res.num > 16) {\n                res.num = res.num - 4;\n            }\n            if (res.num > 12) {\n                res.stub = \"season-\";\n                res.num = res.num - 12;\n            }\n        }\n        ret = res;\n    } else {\n        if (num < 1 || num > 12) {\n            num = 0;\n        }\n        ret = num;\n    }\n    return ret;\n};\n\nCSL.Util.Dates.month = {};\n\n/**\n * Convert month to numeric form\n * <p>This just passes the number back as a string.</p>\n */\nCSL.Util.Dates.month.numeric = function (state, num) {\n    var num = CSL.Util.Dates.normalizeMonth(num);\n    if (!num) {\n        num = \"\";\n    }\n    return num;\n};\n\n/**\n * Convert month to numeric-leading-zeros form\n * <p>This just passes the number back as string padded with zeros.</p>\n */\nCSL.Util.Dates.month[\"numeric-leading-zeros\"] = function (state, num) {\n    var num = CSL.Util.Dates.normalizeMonth(num);\n    if (!num) {\n        num = \"\";\n    } else {\n        num = \"\" + num;\n        while (num.length < 2) {\n            num = \"0\" + num;\n        }\n    }\n    return num;\n};\n\n/**\n * Convert month to long form\n * <p>This passes back the month of the locale in long form.</p>\n */\n\n// Gender is not currently used. Is it needed?\n\nCSL.Util.Dates.month[\"long\"] = function (state, num, gender, forceDefaultLocale) {\n    var res = CSL.Util.Dates.normalizeMonth(num, true);\n    var num = res.num;\n    if (!num) {\n        num = \"\";\n    } else {\n        num = \"\" + num;\n        while (num.length < 2) {\n            num = \"0\" + num;\n        }\n        num = state.getTerm(res.stub + num, \"long\", 0, 0, false, forceDefaultLocale);\n    }\n    return num;\n};\n\n/**\n * Convert month to long form\n * <p>This passes back the month of the locale in short form.</p>\n */\n\n// See above.\n\nCSL.Util.Dates.month[\"short\"] = function (state, num, gender, forceDefaultLocale) {\n    var res = CSL.Util.Dates.normalizeMonth(num, true);\n    var num = res.num;\n    if (!num) {\n        num = \"\";\n    } else {\n        num = \"\" + num;\n        while (num.length < 2) {\n            num = \"0\" + num;\n        }\n        num = state.getTerm(res.stub + num, \"short\", 0, 0, false, forceDefaultLocale);\n    }\n    return num;\n};\n\n/*\n * DAY manglers\n * numeric, numeric-leading-zeros, ordinal\n */\nCSL.Util.Dates.day = {};\n\n/**\n * Convert day to numeric form\n * <p>This just passes the number back as a string.</p>\n */\nCSL.Util.Dates.day.numeric = function (state, num) {\n    return num.toString();\n};\n\nCSL.Util.Dates.day[\"long\"] = CSL.Util.Dates.day.numeric;\n\n/**\n * Convert day to numeric-leading-zeros form\n * <p>This just passes the number back as a string padded with zeros.</p>\n */\nCSL.Util.Dates.day[\"numeric-leading-zeros\"] = function (state, num) {\n    if (!num) {\n        num = 0;\n    }\n    num = num.toString();\n    while (num.length < 2) {\n        num = \"0\" + num;\n    }\n    return num.toString();\n};\n\n/**\n * Convert day to ordinal form\n * <p>This will one day pass back the number as a string with the\n * ordinal suffix appropriate to the locale.  For the present,\n * it just does what is most of the time right for English.</p>\n */\nCSL.Util.Dates.day.ordinal = function (state, num, gender) {\n    return state.fun.ordinalizer.format(num, gender);\n};\n\n/*global CSL: true */\n\n/**\n * Helper functions for constructing sort keys.\n * @namespace Sort key utilities\n */\nCSL.Util.Sort = {};\n\n/**\n * Strip prepositions from a string\n * <p>Used when generating sort keys.</p>\n */\nCSL.Util.Sort.strip_prepositions = function (str) {\n    var m;\n    if (\"string\" === typeof str) {\n        m = str.match(/^(([aA]|[aA][nN]|[tT][hH][eE])\\s+)/);\n    }\n    if (m) {\n        str = str.substr(m[1].length);\n    }\n    return str;\n};\n\n/*global CSL: true */\n\nCSL.Util.substituteStart = function (state, target) {\n    var element_trace, display, bib_first, func, choose_start, if_start, nodetypes;\n    func = function (state, Item, item) {\n        for (var i = 0, ilen = this.decorations.length; i < ilen; i += 1) {\n            if (\"@strip-periods\" === this.decorations[i][0] && \"true\" === this.decorations[i][1]) {\n                state.tmp.strip_periods += 1;\n                break;\n            }\n        }\n    };\n    this.execs.push(func);\n    if (this.decorations && state.opt.development_extensions.csl_reverse_lookup_support) {\n        this.decorations.reverse();\n        this.decorations.push([\"@showid\",\"true\", this.cslid]);\n        this.decorations.reverse();\n    }\n    //\n    // Contains body code for both substitute and first-field/remaining-fields\n    // formatting.\n    //\n\n    nodetypes = [\"number\", \"date\", \"names\"];\n    if ((\"text\" === this.name && !this.postponed_macro) || nodetypes.indexOf(this.name) > -1) {\n        element_trace = function (state, Item, item) {\n            if (state.tmp.element_trace.value() === \"author\" || \"names\" === this.name) {\n                if (!state.tmp.just_looking && item && item[\"author-only\"] && state.tmp.area !== \"intext\") {\n                    if (!state.tmp.probably_rendered_something) {\n                    } else {\n                        state.tmp.element_trace.push(\"suppress-me\");\n                    }\n                }\n                if (!state.tmp.just_looking && item && item[\"suppress-author\"]) {\n                    if (!state.tmp.probably_rendered_something) {\n                        state.tmp.element_trace.push(\"suppress-me\");\n                    }\n                }\n            }\n            else if (\"date\" === this.name) {\n                if (!state.tmp.just_looking && item && item[\"author-only\"] && state.tmp.area !== \"intext\") {\n                    if (state.tmp.probably_rendered_something) {\n                        state.tmp.element_trace.push(\"suppress-me\");\n                    }\n                }\n                /*\n                if (!state.tmp.just_looking && item && item[\"suppress-author\"]) {\n                    if (state.tmp.probably_rendered_something) {\n                        //state.tmp.element_trace.push(\"suppress-me\");\n                    }\n                }\n                */\n            } else {\n                if (!state.tmp.just_looking && item && item[\"author-only\"] && state.tmp.area !== \"intext\") {\n                    // XXX can_block_substitute probably is doing nothing here. The value is always true.\n                    if (!state.tmp.probably_rendered_something && state.tmp.can_block_substitute) {\n                    } else {\n                        state.tmp.element_trace.push(\"suppress-me\");\n                    }\n                } else if (item && item[\"suppress-author\"]) {\n                    state.tmp.element_trace.push(\"do-not-suppress-me\");\n                }\n            }\n        };\n        this.execs.push(element_trace);\n    }\n    display = this.strings.cls;\n    this.strings.cls = false;\n    if (state.build.render_nesting_level === 0) {\n        //\n        // The markup formerly known as @bibliography/first\n        //\n        // Separate second-field-align from the generic display logic.\n        // There will be some code replication, but not in the\n        // assembled style.\n        //\n        if (state.build.area === \"bibliography\" && state.bibliography.opt[\"second-field-align\"]) {\n            bib_first = new CSL.Token(\"group\", CSL.START);\n            bib_first.decorations = [[\"@display\", \"left-margin\"]];\n            func = function (state, Item) {\n                if (!state.tmp.render_seen) {\n                    bib_first.strings.first_blob = Item.id;\n                    state.output.startTag(\"bib_first\", bib_first);\n                }\n            };\n            bib_first.execs.push(func);\n            target.push(bib_first);\n        } else if (CSL.DISPLAY_CLASSES.indexOf(display) > -1) {\n            bib_first = new CSL.Token(\"group\", CSL.START);\n            bib_first.decorations = [[\"@display\", display]];\n            func = function (state, Item) {\n                bib_first.strings.first_blob = Item.id;\n                state.output.startTag(\"bib_first\", bib_first);\n            };\n            bib_first.execs.push(func);\n            target.push(bib_first);\n        }\n        state.build.cls = display;\n    }\n    state.build.render_nesting_level += 1;\n    // Should this be render_nesting_level, with the increment\n    // below? ... ?\n    if (state.build.substitute_level.value() === 1) {\n        //\n        // All top-level elements in a substitute environment get\n        // wrapped in conditionals.  The substitute_level variable\n        // is a stack, because spanned names elements (with their\n        // own substitute environments) can be nested inside\n        // a substitute environment.\n        //\n        // (okay, we use conditionals a lot more than that.\n        // we slot them in for author-only as well...)\n        choose_start = new CSL.Token(\"choose\", CSL.START);\n        CSL.Node.choose.build.call(choose_start, state, target);\n        if_start = new CSL.Token(\"if\", CSL.START);\n        //\n        // Set a test of the shadow if token to skip this\n        // macro if we have acquired a name value.\n\n        // check for variable\n        func = function () {\n            if (state.tmp.can_substitute.value()) {\n                return true;\n            }\n            return false;\n        };\n        if_start.tests ? {} : if_start.tests = [];\n        if_start.tests.push(func);\n        if_start.test = state.fun.match.any(this, state, if_start.tests);\n        target.push(if_start);\n    }\n\n    if (state.sys.variableWrapper\n        && this.variables_real\n        && this.variables_real.length) {\n\n        func = function (state, Item, item) {\n            if (!state.tmp.just_looking && !state.tmp.suppress_decorations) {\n                // Attach item data and variable names.\n                // Do with them what you will.\n                var variable_entry = new CSL.Token(\"text\", CSL.START);\n                variable_entry.decorations = [[\"@showid\", \"true\"]];\n                state.output.startTag(\"variable_entry\", variable_entry);\n                var position = null;\n                if (item) {\n                    position = item.position;\n                }\n                if (!position) {\n                    position = 0;\n                }\n                var positionMap = [\n                    \"first\",\n                    \"container-subsequent\",\n                    \"subsequent\",\n                    \"ibid\",\n                    \"ibid-with-locator\"\n                ];\n                var noteNumber = 0;\n                if (item && item.noteIndex) {\n                    noteNumber = item.noteIndex;\n                }\n                var firstReferenceNoteNumber = 0;\n                if (item && item['first-reference-note-number']) {\n                    firstReferenceNoteNumber = item['first-reference-note-number'];\n                }\n                var firstContainerReferenceNoteNumber = 0;\n                if (item && item['first-container-reference-note-number']) {\n                    firstContainerReferenceNoteNumber = item['first-container-reference-note-number'];\n                }\n                var citationNumber = 0;\n                // XXX Will this EVER happen?\n                if (item && item['citation-number']) {\n                    citationNumber = item['citation-number'];\n                }\n                var index = 0;\n                if (item && item.index) {\n                    index = item.index;\n                }\n                var params = {\n                    itemData: Item,\n                    variableNames: this.variables,\n                    context: state.tmp.area,\n                    xclass: state.opt.xclass,\n                    position: positionMap[position],\n                    \"note-number\": noteNumber,\n                    \"first-reference-note-number\": firstReferenceNoteNumber,\n                    \"first-container-reference-note-number\": firstContainerReferenceNoteNumber,\n                    \"citation-number\": citationNumber,\n                    \"index\": index,\n                    \"mode\": state.opt.mode\n                };\n                state.output.current.value().params = params;\n            }\n        };\n        this.execs.push(func);\n    }\n};\n\n\nCSL.Util.substituteEnd = function (state, target) {\n    var func, bib_first_end, bib_other, if_end, choose_end, author_substitute, str;\n\n    if (state.sys.variableWrapper\n        && (this.hasVariable || (this.variables_real && this.variables_real.length))) {\n        \n        func = function (state) {\n            if (!state.tmp.just_looking && !state.tmp.suppress_decorations) {\n                state.output.endTag(\"variable_entry\");\n            }\n        };\n        this.execs.push(func);\n    }\n\n    func = function (state) {\n        for (var i = 0, ilen = this.decorations.length; i < ilen; i += 1) {\n            if (\"@strip-periods\" === this.decorations[i][0] && \"true\" === this.decorations[i][1]) {\n                state.tmp.strip_periods += -1;\n                break;\n            }\n        }\n    };\n    this.execs.push(func);\n\n    state.build.render_nesting_level += -1;\n    if (state.build.render_nesting_level === 0) {\n        if (state.build.cls) {\n            func = function (state) {\n                state.output.endTag(\"bib_first\");\n            };\n            this.execs.push(func);\n            state.build.cls = false;\n        } else if (state.build.area === \"bibliography\" && state.bibliography.opt[\"second-field-align\"]) {\n            bib_first_end = new CSL.Token(\"group\", CSL.END);\n            // first func end\n            func = function (state) {\n                if (!state.tmp.render_seen) {\n                    state.output.endTag(\"bib_first\"); // closes bib_first\n                }\n            };\n            bib_first_end.execs.push(func);\n            target.push(bib_first_end);\n            bib_other = new CSL.Token(\"group\", CSL.START);\n            bib_other.decorations = [[\"@display\", \"right-inline\"]];\n            func = function (state) {\n                if (!state.tmp.render_seen) {\n                    state.tmp.render_seen = true;\n                    state.output.startTag(\"bib_other\", bib_other);\n                }\n            };\n            bib_other.execs.push(func);\n            target.push(bib_other);\n        }\n    }\n    if (state.build.substitute_level.value() === 1) {\n        if_end = new CSL.Token(\"if\", CSL.END);\n        target.push(if_end);\n        choose_end = new CSL.Token(\"choose\", CSL.END);\n        CSL.Node.choose.build.call(choose_end, state, target);\n    }\n\n    if (\"names\" === this.name || (\"text\" === this.name && this.variables_real !== \"title\")) {\n        author_substitute = new CSL.Token(\"text\", CSL.SINGLETON);\n        var substitution_name = this.name;\n        func = function (state, Item) {\n            if (state.tmp.area !== \"bibliography\") {\n                return;\n            }\n            if (\"string\" !== typeof state.bibliography.opt[\"subsequent-author-substitute\"]) {\n                return;\n            }\n            if (this.variables_real && !Item[this.variables_real]) {\n                return;\n            }\n            // The logic of these two is not obvious. The effect is to enable placeholder substitution\n            // on a text macro name substitution, without printing both the text macro AND the placeholder.\n            // See https://forums.zotero.org/discussion/comment/350407\n            if (this.variables_real && substitution_name === \"names\") {\n                return;\n            }\n\n            var subrule = state.bibliography.opt[\"subsequent-author-substitute-rule\"];\n            var i, ilen;\n            //var text_esc = CSL.getSafeEscape(state);\n            var printing = !state.tmp.suppress_decorations;\n            if (printing && state.tmp.subsequent_author_substitute_ok) {\n                if (state.tmp.rendered_name) {\n                    if (\"partial-each\" === subrule || \"partial-first\" === subrule) {\n                        var dosub = true;\n                        var rendered_name = [];\n                        // This is a wee bit risky, as we're assuming that the name\n                        // children and the list of stringified names are congruent.\n                        // That *should* always be true, but you never know.\n                        for (i = 0, ilen = state.tmp.name_node.children.length; i < ilen; i += 1) {\n                            var name = state.tmp.rendered_name[i];\n                            if (dosub\n                                && state.tmp.last_rendered_name && state.tmp.last_rendered_name.length > (i - 1)\n                                && name && !name.localeCompare(state.tmp.last_rendered_name[i])) {\n                                str = new CSL.Blob(state[state.tmp.area].opt[\"subsequent-author-substitute\"]);\n                                state.tmp.name_node.children[i].blobs = [str];\n                                if (\"partial-first\" === subrule) {\n                                    dosub = false;\n                                }\n                            } else {\n                                dosub = false;\n                            }\n                            rendered_name.push(name);\n                        }\n                        // might want to slice this?\n                        state.tmp.last_rendered_name = rendered_name;\n                    } else if (\"complete-each\" === subrule) {\n                        var rendered_name = state.tmp.rendered_name.join(\",\");\n                        if (rendered_name) {\n                            if (state.tmp.last_rendered_name && !rendered_name.localeCompare(state.tmp.last_rendered_name)) {\n                                for (i = 0, ilen = state.tmp.name_node.children.length; i < ilen; i += 1) {\n                                    str = new CSL.Blob(state[state.tmp.area].opt[\"subsequent-author-substitute\"]);\n                                    state.tmp.name_node.children[i].blobs = [str];\n                                }\n                            }\n                            state.tmp.last_rendered_name = rendered_name;\n                        }\n                    } else {\n                        var rendered_name = state.tmp.rendered_name.join(\",\");\n                        if (rendered_name) {\n                            if (state.tmp.last_rendered_name && !rendered_name.localeCompare(state.tmp.last_rendered_name)) {\n                                str = new CSL.Blob(state[state.tmp.area].opt[\"subsequent-author-substitute\"]);\n                                if (state.tmp.label_blob) {\n                                    state.tmp.name_node.top.blobs = [str,state.tmp.label_blob];\n                                } else if (state.tmp.name_node.top.blobs.length) {\n                                    state.tmp.name_node.top.blobs[0].blobs = [str];\n                                } else {\n                                    state.tmp.name_node.top.blobs = [str];\n                                }\n                                state.tmp.substituted_variable = substitution_name;\n                            }\n                            state.tmp.last_rendered_name = rendered_name;\n                        }\n                    }\n                    state.tmp.subsequent_author_substitute_ok = false;\n                }\n            }\n        };\n        this.execs.push(func);\n    }\n\n    if ((\"text\" === this.name && !this.postponed_macro) || [\"number\", \"date\", \"names\"].indexOf(this.name) > -1) {\n        // element trace\n        func = function (state, Item) {\n            // element_trace is a mess, but it's trying to do something simple.\n            // A queue append is done, and element_trace.value() returns \"suppress-me\"\n            // the append is aborted. That's it.\n            // It seems only to be used on numeric elements of numeric styles ATM.\n            // If used only for that purpose, it could be greatly simplified.\n            // If cleaned up, it could do more interesting things, like control\n            // the suppression of names set later than first position.\n            if (state.tmp.element_trace.mystack.length>1) {\n                state.tmp.element_trace.pop();\n            }\n        };\n        this.execs.push(func);\n    }\n};\n\n/*global CSL: true */\n\nCSL.Util.padding = function (num) {\n    var m = num.match(/\\s*(-{0,1}[0-9]+)/);\n    if (m) {\n        num = parseInt(m[1], 10);\n        if (num < 0) {\n            num = 99999999999999999999 + num;\n        }\n        num = \"\" + num;\n        while (num.length < 20) {\n            num = \"0\" + num;\n        }\n    }\n    return num;\n};\n\nCSL.Util.LongOrdinalizer = function () {};\n\nCSL.Util.LongOrdinalizer.prototype.init = function (state) {\n    this.state = state;\n};\n\nCSL.Util.LongOrdinalizer.prototype.format = function (num, gender) {\n    if (num < 10) {\n        num = \"0\" + num;\n    }\n    // Argument true means \"loose\".\n    var ret = CSL.Engine.getField(\n        CSL.LOOSE, \n        this.state.locale[this.state.opt.lang].terms,\n        \"long-ordinal-\" + num,\n        \"long\", \n        0, \n        gender\n    );\n    if (!ret) {\n        ret = this.state.fun.ordinalizer.format(num, gender);\n    }\n    // Probably too optimistic -- what if only renders in _sort?\n    this.state.tmp.cite_renders_content = true;\n    return ret;\n};\n\n\nCSL.Util.Ordinalizer = function (state) {\n    this.state = state;\n    this.suffixes = {};\n};\n\nCSL.Util.Ordinalizer.prototype.init = function () {\n    if (!this.suffixes[this.state.opt.lang]) {\n        this.suffixes[this.state.opt.lang] = {};\n        for (var i = 0, ilen = 3; i < ilen; i += 1) {\n            var gender = [undefined, \"masculine\", \"feminine\"][i];\n            this.suffixes[this.state.opt.lang][gender] = [];\n            for (var j = 1; j < 5; j += 1) {\n                var ordinal = this.state.getTerm(\"ordinal-0\" + j, \"long\", false, gender);\n                if (\"undefined\" === typeof ordinal) {\n                    delete this.suffixes[this.state.opt.lang][gender];\n                    break;\n                }\n                this.suffixes[this.state.opt.lang][gender].push(ordinal);\n            }\n        }\n    }\n};\n\nCSL.Util.Ordinalizer.prototype.format = function (num, gender) {\n    var str;\n    num = parseInt(num, 10);\n    str = \"\" + num;\n    var suffix = \"\";\n    var trygenders = [];\n    if (gender) {\n        trygenders.push(gender);\n    }\n    trygenders.push(\"neuter\");\n    if (this.state.locale[this.state.opt.lang].ord[\"1.0.1\"]) {\n        suffix = this.state.getTerm(\"ordinal\",false,0,gender);\n        var trygender;\n        for (var i = 0, ilen = trygenders.length; i < ilen; i += 1) {\n            trygender = trygenders[i];\n            var ordinfo = this.state.locale[this.state.opt.lang].ord[\"1.0.1\"];\n            if (ordinfo[\"whole-number\"][str] && ordinfo[\"whole-number\"][str][trygender]) {\n                suffix = this.state.getTerm(this.state.locale[this.state.opt.lang].ord[\"1.0.1\"][\"whole-number\"][str][trygender],false,0,gender);\n            } else if (ordinfo[\"last-two-digits\"][str.slice(str.length - 2)] && ordinfo[\"last-two-digits\"][str.slice(str.length - 2)][trygender]) {\n                suffix = this.state.getTerm(this.state.locale[this.state.opt.lang].ord[\"1.0.1\"][\"last-two-digits\"][str.slice(str.length - 2)][trygender],false,0,gender);\n            } else if (ordinfo[\"last-digit\"][str.slice(str.length - 1)] && ordinfo[\"last-digit\"][str.slice(str.length - 1)][trygender]) {\n                suffix = this.state.getTerm(this.state.locale[this.state.opt.lang].ord[\"1.0.1\"][\"last-digit\"][str.slice(str.length - 1)][trygender],false,0,gender);\n            }\n            if (suffix) {\n                break;\n            }\n        }\n    } else {\n        if (!gender) {\n            // XXX hack to prevent crash on CSL 1.0 styles.\n            // Reported by Carles.\n            gender = undefined;\n        }\n        this.state.fun.ordinalizer.init();\n        if ((num / 10) % 10 === 1 || (num > 10 && num < 20)) {\n            suffix = this.suffixes[this.state.opt.lang][gender][3];\n        } else if (num % 10 === 1 && num % 100 !== 11) {\n            suffix = this.suffixes[this.state.opt.lang][gender][0];\n        } else if (num % 10 === 2 && num % 100 !== 12) {\n            suffix = this.suffixes[this.state.opt.lang][gender][1];\n        } else if (num % 10 === 3 && num % 100 !== 13) {\n            suffix = this.suffixes[this.state.opt.lang][gender][2];\n        } else {\n            suffix = this.suffixes[this.state.opt.lang][gender][3];\n        }\n    }\n    str = str += suffix;\n    return str;\n};\n\nCSL.Util.Romanizer = function () {};\n\nCSL.Util.Romanizer.prototype.format = function (num) {\n    var ret, pos, n, numstr, len;\n    ret = \"\";\n    if (num < 6000) {\n        numstr = num.toString().split(\"\");\n        numstr.reverse();\n        pos = 0;\n        n = 0;\n        len = numstr.length;\n        for (pos = 0; pos < len; pos += 1) {\n            n = parseInt(numstr[pos], 10);\n            ret = CSL.ROMAN_NUMERALS[pos][n] + ret;\n        }\n    }\n    return ret;\n};\n\n\n/**\n * Create a suffix formed from a list of arbitrary characters of arbitrary length.\n * <p>This is a <i>lot</i> harder than it seems.</p>\n */\nCSL.Util.Suffixator = function (slist) {\n    if (!slist) {\n        slist = CSL.SUFFIX_CHARS;\n    }\n    this.slist = slist.split(\",\");\n};\n\n/**\n * The format method.\n * <p>This method is used in generating ranges.  Every numeric\n * formatter (of which Suffixator is one) must be an instantiated\n * object with such a \"format\" method.</p>\n */\n\nCSL.Util.Suffixator.prototype.format = function (N) {\n    // Many thanks to Avram Lyon for this code, and good\n    // riddance to the several functions that it replaces.\n    var X;\n    N += 1;\n    var key = \"\";\n    do {\n        X = ((N % 26) === 0) ? 26 : (N % 26);\n        var key = this.slist[X-1] + key;\n        N = (N - X) / 26;\n    } while ( N !== 0 );\n    return key;\n};\n\n\nCSL.Engine.prototype.processNumber = function (node, ItemObject, variable) {\n    //print(\"** processNumber() ItemObject[variable]=\"+ItemObject[variable]);\n    var val;\n\n    var me = this;\n\n    var realVariable = variable;\n    variable = (variable === \"page-first\") ? \"page\" : variable;\n\n    var fullformAnd = \",\\\\s+and\\\\s+|\\\\s+and\\\\s+\";\n    if (this.opt.lang.slice(0, 2) !== \"en\") {\n        fullformAnd += \"|,\\\\s+\" + this.getTerm(\"and\") + \"\\\\s+|\\\\s+\" + this.getTerm(\"and\") + \"\\\\s+\";\n    }\n    var symbolAnd = \"\\\\s*&\\\\s*\";\n    var andRex = new RegExp(\"^\" + symbolAnd+ \"$\");\n    var joinerMatchRex = new RegExp(\"(\" + symbolAnd + \"|\" + fullformAnd + \"|;\\\\s+|,\\\\s+|\\\\s*\\\\\\\\*[\\\\-\\\\u2013]+\\\\s*)\", \"g\");\n    var joinerSplitRex = new RegExp(\"(?:\" + symbolAnd + \"|\" + fullformAnd + \"|;\\\\s+|,\\\\s+|\\\\s*\\\\\\\\*[\\\\-\\\\u2013]+\\\\s*)\");\n\n    // This guesses whether the symbol form is defined or not.\n    // It's the best we can do, because when locales are built, all of the\n    // holes are filled explictly with fallback values: the symbol form is never undefined.\n    var localeAnd = this.getTerm(\"and\");\n    var localeAmpersand = this.getTerm(\"and\", \"symbol\");\n    if (localeAnd === localeAmpersand) {\n        localeAmpersand = \"&\";\n    }\n\n    // XXXX shadow_numbers should carry an array of objects with\n    // XXXX full data for each. The test of a number should be\n    // XXXX a separate function, possibly supported by a splitter\n    // XXXX method also used here. Keep code for each action in one place,\n    // XXXX to prevent debugging from becoming a nightmare.\n\n    // The capture pattern below would apply affixes to all sub-elements,\n    // which is not what we want. Sub-elements should nest within, or\n    // affixes should be edited. The latter is probably easier to handle.\n    \n    // values = [\n    //   {\n    //     label: \"sec.\",\n    //     label-form: \"plural\",\n    //     value: 100,\n    //     styling: [object],\n    //     numeric: true\n    //     joiningSuffix: \" & \",\n    //   },\n    //   {\n    //     label: \"sec.\",\n    //     label-form: \"none\",\n    //     value: 103,\n    //     styling: [object],\n    //     numeric: true,\n    //     joiningSuffix: \"\"\n    //   }\n    // ]\n    \n    function normalizeFieldValue(str) {\n        str = str.trim();\n        var m = str.match(/^([^ ]+)/);\n        if (m && !CSL.STATUTE_SUBDIV_STRINGS[m[1]]) {\n            var embeddedLabel = null;\n            if ([\"locator\", \"locator-extra\", \"page\"].indexOf(variable) > -1) {\n                if (ItemObject.label) {\n                    embeddedLabel = CSL.STATUTE_SUBDIV_STRINGS_REVERSE[ItemObject.label];\n                } else {\n                    embeddedLabel = \"p.\";\n                }\n            } else {\n                embeddedLabel = CSL.STATUTE_SUBDIV_STRINGS_REVERSE[variable];\n            }\n            if (embeddedLabel) {\n                str = embeddedLabel + \" \" + str;\n            }\n        }\n        return str;\n    }\n    \n\n    function composeNumberInfo(origLabel, label, val, joiningSuffix, parsePosition) {\n        joiningSuffix = joiningSuffix ? joiningSuffix : \"\";\n        var info = {};\n\n        if (!label && !CSL.STATUTE_SUBDIV_STRINGS_REVERSE[variable]) {\n            label = \"var:\"+ variable;\n        }\n\n        if (label) {\n            var m = label.match(/(\\s*)([^\\s]+)(\\s*)/);\n            if (realVariable === \"page\" && parsePosition === 0 && [\"p.\", \"pp.\"].indexOf(m[2]) === -1) {\n                info.gotosleepability = true;\n                info.labelVisibility = true;\n            } else {\n                info.labelVisibility = false;\n            }\n            info.label = m[2];\n            info.origLabel = origLabel;\n            info.labelSuffix = m[3] ? m[3] : \"\";\n            info.plural = 0;\n        }\n        \n        var m = val.match(/^([0-9]*[a-zA-Z]+0*)?([0-9]+(?:[a-zA-Z]*|[-,a-zA-Z]+))$/);\n        //var m = val.match(/^([0-9]*[a-zA-Z]0*)([0-9]+(?:[a-zA-Z]*|[-,a-zA-Z]+))$/);\n        if (m) {\n            info.particle = m[1] ? m[1] : \"\";\n            info.value = m[2];\n        } else {\n            info.particle = \"\";\n            info.value = val;\n        }\n        info.joiningSuffix = joiningSuffix.replace(/\\s*-\\s*/, \"-\");\n        return info;\n    }\n\n    function fixupSubsections(elems) {\n        // This catches things like p. 12a-c, recombining content to yield\n        // numeric true despite the hyphen.\n        for (var i=elems.length-2;i>-1;i-=2) {\n            if (elems[i] === \"-\"\n               && elems[i-1].match(/^(?:(?:[a-z]|[a-z][a-z]|[a-z][a-z][a-z]|[a-z][a-z][a-z][a-z])\\.  *)*[0-9]+[,a-zA-Z]+$/)\n               && elems[i+1].match(/^[,a-zA-Z]+$/)) {\n                elems[i-1] = elems.slice(i-1,i+2).join(\"\");\n                elems = elems.slice(0,i).concat(elems.slice(i+2));\n            }\n        }\n        return elems;\n    }\n\n    function parseString(str, defaultLabel) {\n        defaultLabel = defaultLabel ? defaultLabel : \"\";\n        \n        str = normalizeFieldValue(str, defaultLabel);\n\n        var jmrex, jsrex, mystr;\n        if (\"page\" === variable) {\n            if (str.indexOf(\"\\u2013\") > -1) {\n                str = str.replace(/\\u2013/g, \"-\");\n            }\n        }\n        if (str.indexOf(\"\\\\-\") > -1) {\n            jmrex = new RegExp(joinerMatchRex.source.replace(\"\\\\-\", \"\"));\n            jsrex = new RegExp(joinerSplitRex.source.replace(\"\\\\-\", \"\"));\n            var lst = str.split(\"\\\\-\");\n            for (var i=0,ilen=lst.length;i<ilen;i++) {\n                lst[i] = lst[i].replace(/\\-/g, \"\\u2013\");\n            }\n            mystr = lst.join(\"\\\\-\");\n            mystr = mystr.replace(/\\\\/g, \"\");\n        } else {\n            jmrex = joinerMatchRex;\n            jsrex = joinerSplitRex;\n            mystr = str;\n        }\n        // jmrex = joinerMatchRex;\n        // jsrex = joinerSplitRex;\n        \n        // Split chunks and collate delimiters.\n        var elems = [];\n        var m = mystr.match(jmrex);\n        if (m) {\n            var lst = mystr.split(jsrex);\n            for (var i=0, ilen=m.length; i<ilen; i++) {\n                if (m[i].match(andRex)) {\n                    if (lst[i].match(/[a-zA-Z]$/) && lst[i].match(/^[a-zA-Z]/)) {\n                        m[i] = localeAmpersand;\n                    } else {\n                        m[i] = \" \" + localeAmpersand + \" \";\n                    }\n                }\n            }\n            var recombine = false;\n            for (var i in lst) {\n                if ((\"\" + lst[i]).replace(/^[a-z]\\.\\s+/, \"\").match(/[^\\s0-9ivxlcmIVXLCM]/)) {\n                    //recombine = true;\n                    break;\n                }\n            }\n            if (recombine) {\n                elems = [mystr];\n            } else {\n                for (var i=0,ilen=lst.length-1; i<ilen; i++) {\n                    elems.push(lst[i]);\n                    elems.push(m[i]);\n                }\n                elems.push(lst[lst.length-1]);\n                //print(\"ELEMS: \"+elems);\n                elems = fixupSubsections(elems);\n                //print(\"  fixup: \"+elems);\n            }\n        } else {\n            var elems = [mystr];\n        }\n        // Split elements within each chunk build list of value objects.\n        var values = [];\n        var label = defaultLabel;\n        var origLabel = \"\";\n        for (var i=0,ilen=elems.length;i<ilen;i += 2) {\n            \n            // AHA! HERE'S THE CULPRIT!!!\n            // Words up to four characters are treated as honorary short-form labels.\n            // Some valid labels are longer than four chars, so we stir those in explicitly\n            \n            var m = elems[i].match(/((?:^| )(?:[a-z]|[a-z][a-z]|[a-z][a-z][a-z]|[a-z][a-z][a-z][a-z]|subpara|subch|amend|bibliog|annot|illus|princ|intro|sched|subdiv|subsec)(?:\\.| ) *)/g);\n            if (m) {\n                var lst = elems[i].split(/(?:(?:^| )(?:[a-z]|[a-z][a-z]|[a-z][a-z][a-z]|[a-z][a-z][a-z][a-z]|subpara|subch|amend|bibliog|annot|illus|princ|intro|sched|subdiv|subsec)(?:\\.| ) *)/);\n                // Head off disaster by merging parsed labels on non-numeric values into content\n                for (var j=lst.length-1;j>0;j--) {\n                    if (lst[j-1] && (!lst[j].match(/^[0-9]+([-;,:a-zA-Z]*)$/) || !lst[j-1].match(/^[0-9]+([-;,:a-zA-Z]*)$/))) {\n                        lst[j-1] = lst[j-1] + m[j-1] + lst[j];\n                        lst = lst.slice(0,j).concat(lst.slice(j+1));\n                        m = m.slice(0,j-1).concat(m.slice(j));\n                    }\n                }\n                // merge bad leading label into content\n                if (m.length > 0) {\n                    var slug = m[0].trim();\n                    var notAlabel = !CSL.STATUTE_SUBDIV_STRINGS[slug]\n                        || \"undefined\" === typeof me.getTerm(CSL.STATUTE_SUBDIV_STRINGS[slug])\n                        || ([\"locator\", \"number\", \"locator-extra\", \"page\"].indexOf(variable) === -1 && CSL.STATUTE_SUBDIV_STRINGS[slug] !== variable);\n                    if (notAlabel) {\n                        if (i === 0) {\n                            m = m.slice(1);\n                            lst[0] = lst[0] + \" \" + slug + \" \" + lst[1];\n                            lst = lst.slice(0,1).concat(lst.slice(2));\n                        }\n                    } else {\n                        origLabel = slug;\n                    }\n                }\n\n                for (var j=0,jlen=lst.length; j<jlen; j++) {\n                    if (lst[j] || j === (lst.length-1)) {\n                        var filteredOrigLabel;\n                        label = m[j-1] ? m[j-1] : label;\n                        if (origLabel === label.trim()) {\n                            filteredOrigLabel = \"\";\n                        } else {\n                            filteredOrigLabel = origLabel;\n                        }\n                        //var origLabel = j > 1 ? m[j-1] : \"\";\n                        mystr = lst[j] ? lst[j].trim() : \"\";\n                        if (j === (lst.length-1)) {\n                            values.push(composeNumberInfo(filteredOrigLabel, label, mystr, elems[i+1], i));\n                        } else {\n                            values.push(composeNumberInfo(filteredOrigLabel, label, mystr, null, i));\n                        }\n                    }\n                }\n            } else {\n                var filteredOrigLabel;\n                if (origLabel === label.trim()) {\n                    filteredOrigLabel = \"\";\n                } else {\n                    filteredOrigLabel = origLabel;\n                }\n                values.push(composeNumberInfo(filteredOrigLabel, label, elems[i], elems[i+1]));\n            }\n        }\n        return values;\n    }\n\n    function setSpaces(values) {\n        // Add space joins (is this really right?)\n        for (var i=0,ilen=values.length-1;i<ilen;i++) {\n            if (!values[i].joiningSuffix && values[i+1].label) {\n                values[i].joiningSuffix = \" \";\n            }\n        }\n    }\n\n    function fixNumericAndCount(values, i, currentLabelInfo) {\n        var master = values[currentLabelInfo.pos];\n        var val = values[i].value;\n        var isEscapedHyphen = master.joiningSuffix === \"\\\\-\";\n        if (val.particle && val.particle !== master.particle) {\n            currentLabelInfo.collapsible = false;\n        }\n        var mVal = val.match(/^[0-9]+([-,:a-zA-Z]*)$/);\n        var mCurrentLabel = master.value.match(/^(?:[0-9]+|[ixv]+)([-,:a-zA-Z]*|\\-[\\-0-9]+)$/);\n        if (!val || !mVal || !mCurrentLabel || isEscapedHyphen) {\n            currentLabelInfo.collapsible = false;\n            if (!val || !mCurrentLabel) {\n                currentLabelInfo.numeric = false;\n            }\n            if (isEscapedHyphen) {\n                currentLabelInfo.count--;\n            }\n        }\n        if ((mVal && mVal[1]) || (mCurrentLabel && mCurrentLabel[1])) {\n            currentLabelInfo.collapsible = false;\n        }\n        if (undefined === values[i].collapsible) {\n            for (var j=i,jlen=i+currentLabelInfo.count;j<jlen;j++) {\n                if (isNaN(parseInt(values[j].value)) && !values[j].value.match(/^[ivxlcmIVXLCM]+$/)) {\n                    values[j].collapsible = false;\n                } else {\n                    values[j].collapsible = true;\n                }\n            }\n            currentLabelInfo.collapsible = values[i].collapsible;\n        }\n        var isCollapsible = currentLabelInfo.collapsible;\n        for (var j=currentLabelInfo.pos,jlen=(currentLabelInfo.pos + currentLabelInfo.count); j<jlen; j++) {\n            if (currentLabelInfo.count > 1 && isCollapsible) {\n                values[j].plural = 1;\n            }\n            values[j].numeric = currentLabelInfo.numeric;\n            values[j].collapsible = currentLabelInfo.collapsible;\n        }\n    }\n\n    function fixLabelVisibility(values, groupStartPos, currentLabelInfo) {\n        if (currentLabelInfo.label.slice(0, 4) !== \"var:\") {\n            if (currentLabelInfo.pos === 0) {\n                if ([\"locator\", \"number\", \"locator-extra\", \"page\"].indexOf(variable) > -1) {\n                    // Actually, shouldn't we do this always?\n                    if (\"undefined\" === typeof me.getTerm(CSL.STATUTE_SUBDIV_STRINGS[currentLabelInfo.label])) {\n                        values[currentLabelInfo.pos].labelVisibility = true;\n                    }\n                }\n                // If there is an explicit\n                // label embedded at the start of a field that\n                // does not match the context, it should be\n                // marked for rendering.\n                if ([\"locator\", \"number\", \"locator-extra\", \"page\"].indexOf(variable) === -1) {\n                    if (CSL.STATUTE_SUBDIV_STRINGS[currentLabelInfo.label] !== variable) {\n                        values[0].labelVisibility = true;\n                    }\n                }\n            } else {\n                // Also, mark initial mid-field labels for\n                // rendering.\n                //if (values[i-1].label !== values[i].label && currentLabelInfo.label.slice(0, 4) !== \"var:\") {\n                values[currentLabelInfo.pos].labelVisibility = true;\n                //}\n            }\n        }\n    }\n    \n    function setPluralsAndNumerics(values) {\n        if (values.length === 0) {\n            return;\n        }\n        var groupStartPos = 0;\n        var groupCount = 1;\n        \n        for (var i=1,ilen=values.length;i<ilen;i++) {\n            var lastVal = values[i-1];\n            var thisVal = values[i];\n            if (lastVal.label === thisVal.label && lastVal.particle === lastVal.particle) {\n                groupCount++;\n            } else {\n                var currentLabelInfo = JSON.parse(JSON.stringify(values[groupStartPos]));\n                currentLabelInfo.pos = groupStartPos;\n                currentLabelInfo.count = groupCount;\n                currentLabelInfo.numeric = true;\n                fixNumericAndCount(values, groupStartPos, currentLabelInfo);\n                if (lastVal.label !== thisVal.label) {\n                    fixLabelVisibility(values, groupStartPos, currentLabelInfo);\n                }\n                groupStartPos = i;\n                groupCount = 1;\n            }\n        }\n        // Not sure why this repetition is necessary?\n        var currentLabelInfo = JSON.parse(JSON.stringify(values[groupStartPos]));\n        currentLabelInfo.pos = groupStartPos;\n        currentLabelInfo.count = groupCount;\n        currentLabelInfo.numeric = true;\n        fixNumericAndCount(values, groupStartPos, currentLabelInfo);\n        fixLabelVisibility(values, groupStartPos, currentLabelInfo);\n        if (values.length && values[0].numeric && variable.slice(0, 10) === \"number-of-\") {\n            if (parseInt(ItemObject[realVariable], 10) > 1) {\n                values[0].plural = 1;\n            }\n        }\n    }        \n\n    function stripHyphenBackslash(joiningSuffix) {\n        return joiningSuffix.replace(\"\\\\-\", \"-\");\n    }\n\n    function setStyling(values) {\n        var masterNode = CSL.Util.cloneToken(node);\n        var masterStyling = new CSL.Token();\n        if (!me.tmp.just_looking) {\n            // Per discussion @ https://discourse.citationstyles.org/t/formatting-attributes-and-hyphen/1518\n            masterStyling.decorations = masterNode.decorations;\n            masterNode.decorations = [];\n            //for (var j=masterNode.decorations.length-1;j>-1;j--) {\n            //    if (masterNode.decorations[j][0] === \"@quotes\") {\n            //        // Add to styling\n            //        masterStyling.decorations = masterStyling.decorations.concat(masterNode.decorations.slice(j, j+1));\n            //        // Remove from node\n            //        masterNode.decorations = masterNode.decorations.slice(0, j).concat(masterNode.decorations.slice(j+1));\n            //    }\n            //}\n            masterStyling.strings.prefix = masterNode.strings.prefix;\n            masterNode.strings.prefix = \"\";\n            masterStyling.strings.suffix = masterNode.strings.suffix;\n            masterNode.strings.suffix = \"\";\n        }\n        var masterLabel = values.length ? values[0].label : null;\n        if (values.length) {\n            for (var i=0,ilen=values.length; i<ilen; i++) {\n                var val = values[i];\n                // Clone node, make styling parameters on each instance sane.\n                var newnode = CSL.Util.cloneToken(masterNode);\n                newnode.gender = node.gender;\n                if (masterLabel === val.label) {\n                    newnode.formatter = node.formatter;\n                }\n                if (val.numeric) {\n                    newnode.successor_prefix = val.successor_prefix;\n                }\n                newnode.strings.suffix = newnode.strings.suffix + stripHyphenBackslash(val.joiningSuffix);\n                val.styling = newnode;\n            }\n            if (!me.tmp.just_looking) {\n                if (values[0].value.slice(0,1) === \"\\\"\" && values[values.length-1].value.slice(-1) === \"\\\"\") {\n                    values[0].value = values[0].value.slice(1);\n                    values[values.length-1].value = values[values.length-1].value.slice(0,-1);\n                    masterStyling.decorations.push([\"@quotes\", true]);\n                }\n            }\n        }\n        return masterStyling;\n    }\n\n    function checkTerm(variable, val) {\n        var ret = true;\n        if ([\"locator\", \"locator-extra\", \"page\"].indexOf(variable) > -1) {\n            var label;\n            if (val.origLabel) {\n                label = val.origLabel;\n            } else {\n                label = val.label;\n            }\n            ret = !!me.getTerm(CSL.STATUTE_SUBDIV_STRINGS[label]);\n        }\n        return ret;\n    }\n\n    function checkPage(variable, val) {\n        return \"page\" === variable\n            || ([\"locator\", \"locator-extra\"].indexOf(variable) > -1 && ([\"p.\"].indexOf(val.label) > -1 || [\"p.\"].indexOf(val.origLabel) > -1));\n    }\n    \n    function fixupRangeDelimiter(variable, val, rangeDelimiter, isNumeric) {\n        var isPage = checkPage(variable, val);\n        var hasTerm = checkTerm(variable, val);\n        if (hasTerm && rangeDelimiter === \"-\") {\n            if (isNumeric) {\n                if (isPage || [\"locator\", \"locator-extra\", \"issue\", \"volume\", \"edition\", \"number\"].indexOf(variable) > -1) {\n                    rangeDelimiter = me.getTerm(\"page-range-delimiter\");\n                    if (!rangeDelimiter) {\n                        rangeDelimiter = \"\\u2013\";\n                    }\n                }\n                if (variable === \"collection-number\") {\n                    rangeDelimiter = me.getTerm(\"year-range-delimiter\");\n                    if (!rangeDelimiter) {\n                        rangeDelimiter = \"\\u2013\";\n                    }\n                }\n            }\n        }\n        //if (rangeDelimiter === \"\\\\-\") {\n        //    rangeDelimiter = \"-\";\n        //}\n        return rangeDelimiter;\n    }\n\n    function manglePageNumbers(values, i, currentInfo) {\n        if (i<1) {\n            return;\n        }\n        if (currentInfo.count !== 2) {\n            return;\n        }\n        if (values[i-1].particle !== values[i].particle) {\n            return;\n        }\n        if (values[i-1].joiningSuffix !== \"-\") {\n            currentInfo.count = 1;\n            return;\n        }\n        if (!me.opt[\"page-range-format\"] && (parseInt(values[i-1].value, 10) > parseInt(values[i].value, 10))) {\n            values[i-1].joiningSuffix = fixupRangeDelimiter(variable, values[i], values[i-1].joiningSuffix, true);\n            return;\n        }\n        var val = values[i];\n\n        var isPage = checkPage(variable, val);\n        var str;\n        if (isPage && !isNaN(parseInt(values[i-1].value)) && !isNaN(parseInt(values[i].value))) {\n            str = values[i-1].particle + values[i-1].value + \" - \" + values[i].particle + values[i].value;\n            str = me.fun.page_mangler(str);\n        } else {\n            // if ((\"\" + values[i-1].value).match(/[0-9]$/) && (\"\" + values[i].value).match(/^[0-9]/)) {\n            if ((\"\" + values[i-1].value).match(/^([0-9]+|[ivxlcmIVXLCM]+)$/) && (\"\" + values[i].value).match(/^([0-9]+|[ivxlcmIVXLCM]+)$/)) {\n                values[i-1].joiningSuffix = me.getTerm(\"page-range-delimiter\");\n            }\n            str = values[i-1].value + stripHyphenBackslash(values[i-1].joiningSuffix) + values[i].value;\n        }\n        var m = str.match(/^((?:[0-9]*[a-zA-Z]+0*))?([0-9]+[a-z]*)(\\s*[^0-9]+\\s*)([-,a-zA-Z]?0*)([0-9]+[a-z]*)$/);\n        // var m = str.match(/^((?:[0-9]*[a-zA-Z]+0*))?([0-9]+[a-z]*)(\\s*[^0-9]+\\s*)([-,a-zA-Z]?0*)([0-9]+[a-z]*)$/);\n        if (m) {\n            var rangeDelimiter = m[3];\n            rangeDelimiter = fixupRangeDelimiter(variable, val, rangeDelimiter, values[i].numeric);\n            values[i-1].particle = m[1];\n            values[i-1].value = m[2];\n            values[i-1].joiningSuffix = rangeDelimiter;\n            values[i].particle = m[4];\n            values[i].value = m[5];\n        }\n        currentInfo.count = 0;\n    }\n    \n    function fixRanges(values) {\n\n        if (!node) {\n            return;\n        }\n        if ([\"page\", \"chapter-number\", \"collection-number\", \"edition\", \"issue\", \"number\", \"number-of-pages\", \"number-of-volumes\", \"volume\", \"locator\", \"locator-extra\"].indexOf(variable) === -1) {\n            return;\n        }\n\n        var currentInfo = {\n            count: 0,\n            label: null,\n            lastHadRangeDelimiter: false\n        };\n\n        for (var i=0,ilen=values.length; i<ilen; i++) {\n            var val = values[i];\n            if (!val.collapsible) {\n                currentInfo.count = 0;\n                currentInfo.label = null;\n                var isNumeric = val.numeric;\n                val.joiningSuffix = fixupRangeDelimiter(variable, val, val.joiningSuffix, isNumeric);\n            } else if (currentInfo.label === val.label && val.joiningSuffix === \"-\") {\n                // So if there is a hyphen here, and none previous, reset to 1\n                currentInfo.count = 1;\n            } else if (currentInfo.label === val.label && val.joiningSuffix !== \"-\") {\n                // If there is NO hyphen here, count up\n                currentInfo.count++;\n                if (currentInfo.count === 2) {\n                    manglePageNumbers(values, i, currentInfo);\n                }\n            } else if (currentInfo.label !== val.label) {\n                // If the label doesn't match and count is 2, process\n                currentInfo.label = val.label;\n                currentInfo.count = 1;\n            } else {\n                // Safety belt: label doesn't match and count is some other value, so reset to 1\n                // This never happens, though.\n                currentInfo.count = 1;\n                currentInfo.label = val.label;\n            }\n        }\n        // Finally clear, if needed\n        if (currentInfo.count === 2) {\n            manglePageNumbers(values, values.length-1, currentInfo);\n        }\n    }\n\n    function setVariableParams(shadow_numbers, realVariable, values) {\n        var obj = shadow_numbers[realVariable];\n        if (values.length) {\n            obj.numeric = values[0].numeric;\n            obj.collapsible = values[0].collapsible;\n            obj.plural = values[0].plural;\n            obj.label = CSL.STATUTE_SUBDIV_STRINGS[values[0].label];\n            if (variable === \"number\" && obj.label === \"issue\" && me.getTerm(\"number\")) {\n                obj.label = \"number\";\n            }\n        }\n    }\n\n    // Split out the labels and values.\n\n    // short-circuit if object exists: if numeric, set styling, no other action\n    if (node && this.tmp.shadow_numbers[realVariable] && this.tmp.shadow_numbers[realVariable].values.length) {\n        var values = this.tmp.shadow_numbers[realVariable].values;\n        fixRanges(values);\n        //if (!this.tmp.shadow_numbers[variable].masterStyling && !this.tmp.just_looking) {\n            this.tmp.shadow_numbers[realVariable].masterStyling = setStyling(values);\n        //}\n        return;\n    }\n\n    // info.styling = node;\n\n    // This carries value, pluralization and numeric info for use in other contexts.\n    // XXX We used to use one set of params for the entire variable value.\n    // XXX Now params are set on individual objects, of which there may be several after parsing.\n    if (!this.tmp.shadow_numbers[realVariable]) {\n        this.tmp.shadow_numbers[realVariable] = {\n            values:[]\n        };\n    }\n    //this.tmp.shadow_numbers[variable].values = [];\n    //this.tmp.shadow_numbers[variable].plural = 0;\n    //this.tmp.shadow_numbers[variable].numeric = false;\n    //this.tmp.shadow_numbers[variable].label = false;\n\n    if (!ItemObject) {\n        return;\n    }\n\n    // Possibly apply multilingual transform\n    var languageRole = CSL.LangPrefsMap[variable];\n    if (languageRole) {\n        var localeType = this.opt[\"cite-lang-prefs\"][languageRole][0];\n        val = this.transform.getTextSubField(ItemObject, realVariable, \"locale-\"+localeType, true);\n        val = val.name;\n    } else {\n        val = ItemObject[realVariable];\n    }\n\n    if (val && realVariable === \"number\" && ItemObject.type === \"legal_case\") {\n        val = val.replace(/[\\\\]*-/g, \"\\\\-\");\n    }\n\n    // XXX HOLDING THIS\n    // Apply short form ONLY if first element tests is-numeric=false\n    if (val && this.sys.getAbbreviation) {\n        // RefMe bug report: print(\"XX D'oh! (3): \"+num);\n        // true as the fourth argument suppresses update of the UI\n\n        // No need for this.\n        //val = (\"\" + val).replace(/^\\\"/, \"\").replace(/\\\"$/, \"\");\n        if (this.sys.normalizeAbbrevsKey) {\n            var normval = this.sys.normalizeAbbrevsKey(realVariable, val);\n        } else {\n            var normval = val;\n        }\n        var jurisdiction = this.transform.loadAbbreviation(ItemObject.jurisdiction, \"number\", normval, ItemObject.language);\n        if (this.transform.abbrevs[jurisdiction].number) {\n            if (this.transform.abbrevs[jurisdiction].number[normval]) {\n                val = this.transform.abbrevs[jurisdiction].number[normval];\n            } else {\n                \n                // *** This is terrible ***\n                \n                // Strings rendered via cs:number should not be added to the abbreviations\n                // UI unless they test non-numeric. The test happens below.\n                if (\"undefined\" !== typeof this.transform.abbrevs[jurisdiction].number[normval]) {\n                    delete this.transform.abbrevs[jurisdiction].number[normval];\n                }\n            }\n        }\n    }\n\n    //   {\n    //     label: \"sec.\",\n    //     labelForm: \"plural\",\n    //     labelVisibility: true,\n    //     value: 100,\n    //     styling: [object],\n    //     numeric: true\n    //     joiningSuffix: \" & \",\n    //   },\n\n    // Process only if there is a value.\n    if (\"undefined\" !== typeof val && (\"string\" === typeof val || \"number\" === typeof val)) {\n        if (\"number\" === typeof val) {\n            val = \"\" + val;\n        }\n        var defaultLabel = CSL.STATUTE_SUBDIV_STRINGS_REVERSE[variable];\n\n        if (this.tmp.shadow_numbers[realVariable].values.length === 0) {\n            // XXX\n            var values = parseString(val, defaultLabel);\n\n            setSpaces(values);\n            //print(\"setSpaces(): \"+JSON.stringify(values, null, 2));\n\n            setPluralsAndNumerics(values);\n            //print(\"setPluralsAndNumerics(): \"+JSON.stringify(values, null, 2));\n\n            for (var obj of values) {\n                if (!obj.numeric) obj.plural = 0;\n            }\n            this.tmp.shadow_numbers[realVariable].values = values;\n            // me.sys.print(JSON.stringify(values))\n\n            if (node) {\n                fixRanges(values);\n                \n                this.tmp.shadow_numbers[realVariable].masterStyling = setStyling(values);\n                // me.sys.print(\"setStyling(): \"+JSON.stringify(values, null, 2));\n            }\n            setVariableParams(this.tmp.shadow_numbers, realVariable, values);\n        }\n        \n        // hack in support for non-numeric numerics like \"91 Civ. 5442 (RPP)|91 Civ. 5471\"\n        var info = this.tmp.shadow_numbers[realVariable];\n        if (variable === \"number\") {\n            if (info.values.length === 1 && info.values[0].value.indexOf(\"|\") > -1) {\n                info.values[0].value = info.values[0].value.replace(/\\|/g, \", \");\n                info.values[0].numeric = true;\n                info.values[0].plural = 1;\n                info.values[0].collapsible = false;\n                info.numeric = true;\n                info.plural = 1;\n                info.collapsible = false;\n            }\n        }\n        if (info.values.length === 1) {\n            if (info.values[0].value.match(/^[0-9]+(?:\\/[0-9]+)+$/)) {\n                info.values[0].numeric = true;\n                info.values[0].plural = 0;\n                info.values[0].collapsible = false;\n                info.numeric = true;\n                info.plural = 0;\n                info.collapsible = false;\n            }\n        }\n        if (variable === \"page\") {\n            if (info.values.length > 0) {\n                if (info.values[0].gotosleepability) {\n                    info.labelForm = \"short\";\n                }\n            }\n        }\n        //this.sys.print(\"OK \"+JSON.stringify(values, [\"label\", \"origLabel\", \"labelSuffix\", \"particle\", \"collapsible\", \"value\", \"numeric\", \"joiningSuffix\", \"labelVisibility\", \"plural\"], 2));\n    }\n};\n\nCSL.Util.outputNumericField = function(state, varname, itemID) {\n\n    state.output.openLevel(state.tmp.shadow_numbers[varname].masterStyling);\n    var masterStyling = state.tmp.shadow_numbers[varname].masterStyling;\n    var nums = state.tmp.shadow_numbers[varname].values;\n    var masterLabel = nums.length ? nums[0].label : null;\n    var labelForm = state.tmp.shadow_numbers[varname].labelForm;\n    var tryStatic = state.tmp.group_context.tip.label_static;\n    var embeddedLabelForm;\n    if (labelForm) {\n        embeddedLabelForm = labelForm;\n    } else {\n        embeddedLabelForm = \"short\";\n        //labelForm = \"short\";\n    }\n    var labelCapitalizeIfFirst = state.tmp.shadow_numbers[varname].labelCapitalizeIfFirst;\n    var labelDecorations = state.tmp.shadow_numbers[varname].labelDecorations;\n    var lastLabelName = null;\n\n    for (var i=0,ilen=nums.length;i<ilen;i++) {\n        var num = nums[i];\n        var label = \"\";\n        var labelName;\n        if (num.label) {\n            if ('var:' === num.label.slice(0,4)) {\n                labelName = num.label.slice(4);\n            } else {\n                labelName = CSL.STATUTE_SUBDIV_STRINGS[num.label];\n            }\n            if (labelName) {\n                // Simplify this some day.\n                if (num.label === masterLabel) {\n                    if (tryStatic) {\n                        label = state.getTerm(labelName, \"static\", num.plural);\n                        if (label.indexOf(\"%s\") === -1) {\n                            label = \"\";\n                        }\n                    }\n                    if (!label) {\n                        label = state.getTerm(labelName, labelForm, num.plural);\n                    }\n                } else {\n                    if (tryStatic) {\n                        label = state.getTerm(labelName, \"static\", num.plural);\n                        if (label.indexOf(\"%s\") === -1) {\n                            label = \"\";\n                        }\n                    }\n                    if (!label) {\n                        label = state.getTerm(labelName, embeddedLabelForm, num.plural);\n                    }\n                }\n                if (labelCapitalizeIfFirst) {\n                    label = CSL.Output.Formatters[\"capitalize-first\"](state, label);\n                }\n            }\n        }\n        var labelPlaceholderPos = -1;\n        if (label) {\n            labelPlaceholderPos = label.indexOf(\"%s\");\n        }\n        var numStyling = CSL.Util.cloneToken(num.styling);\n        numStyling.formatter = num.styling.formatter;\n        numStyling.type = num.styling.type;\n        numStyling.num = num.styling.num;\n        numStyling.gender = num.styling.gender;\n        \n        if (labelPlaceholderPos > 0 && labelPlaceholderPos < (label.length-2)) {\n            numStyling.strings.prefix += label.slice(0,labelPlaceholderPos);\n            numStyling.strings.suffix = label.slice(labelPlaceholderPos+2) + numStyling.strings.suffix;\n        } else if (num.labelVisibility) {\n            if (!label) {\n                label = num.label;\n                labelName = num.label;\n            }\n            if (labelPlaceholderPos > 0) {\n                var prefixLabelStyling = new CSL.Token();\n                prefixLabelStyling.decorations = labelDecorations;\n                state.output.append(label.slice(0,labelPlaceholderPos), prefixLabelStyling);\n            } else if (labelPlaceholderPos === (label.length-2) || labelPlaceholderPos === -1) {\n                // And add a trailing delimiter.\n                state.output.append(label+num.labelSuffix, \"empty\");\n            }\n        }\n        CSL.UPDATE_GROUP_CONTEXT_CONDITION(state, masterStyling.strings.prefix, null, masterStyling, `${num.particle}${num.value}`);\n        if (num.collapsible) {\n            var blob;\n            if (num.value.match(/^[1-9][0-9]*$/) && Number.isSafeInteger(parseInt(num.value, 10))) {\n                blob = new CSL.NumericBlob(state, num.particle, parseInt(num.value, 10), numStyling, itemID);\n            } else {\n                blob = new CSL.NumericBlob(state, num.particle, num.value, numStyling, itemID);\n            }\n            if (\"undefined\" === typeof blob.gender) {\n                blob.gender = state.locale[state.opt.lang][\"noun-genders\"][varname];\n            }\n            state.output.append(blob, \"literal\");\n        } else {\n            state.output.append(num.particle + num.value, numStyling);\n        }\n        if (labelPlaceholderPos === 0 && labelPlaceholderPos < (label.length-2)) {\n            // Only and always if this is the last entry of this label\n            if (lastLabelName === null) {\n                lastLabelName = labelName;\n            }\n            if (labelName !== lastLabelName || i === (nums.length-1)) {\n                var suffixLabelStyling = new CSL.Token();\n                suffixLabelStyling.decorations = labelDecorations;\n                state.output.append(label.slice(labelPlaceholderPos+2), suffixLabelStyling);\n            }\n        }\n        lastLabelName = labelName;\n        state.tmp.term_predecessor = true;\n    }\n    state.output.closeLevel();\n};\n\n/*global CSL: true */\n\nCSL.Util.PageRangeMangler = {};\n\nCSL.Util.PageRangeMangler.getFunction = function (state, rangeType) {\n    var rangerex, pos, len, stringify, listify, expand, minimize, minimize_internal, chicago15, chicago16, lst, m, b, e, ret, begin, end, ret_func;\n    \n    var range_delimiter = state.getTerm(rangeType + \"-range-delimiter\");\n\n    rangerex = /([0-9]*[a-zA-Z]+0*)?([0-9]+[a-z]*)\\s*(?:\\u2013|-)\\s*([0-9]*[a-zA-Z]+0*)?([0-9]+[a-z]*)/;\n\n    stringify = function (lst) {\n        len = lst.length;\n        for (pos = 1; pos < len; pos += 2) {\n            if (\"object\" === typeof lst[pos]) {\n                lst[pos] = lst[pos].join(\"\");\n            }\n        }\n        var ret = lst.join(\"\");\n        ret = ret.replace(/([^\\\\])\\-/g, \"$1\"+state.getTerm(rangeType + \"-range-delimiter\"));\n        return ret;\n    };\n\n    listify = function (str) {\n        var m, lst, ret;\n        // Normalized delimiter form, for use in regexps\n        var hyphens = \"\\\\s+\\\\-\\\\s+\";\n        // Normalize delimiters to hyphen wrapped in single spaces\n        var this_range_delimiter = range_delimiter === \"-\" ? \"\" : range_delimiter;\n        var delimRex = new RegExp(\"([^\\\\\\\\])[-\" + this_range_delimiter + \"\\\\u2013]\", \"g\");\n        str = str.replace(delimRex, \"$1 - \").replace(/\\s+-\\s+/g, \" - \");\n        // Workaround for Internet Explorer\n        //var rexm = new RegExp(\"((?:[0-9]*[a-zA-Z]+)?[0-9]+\" + hyphens + \"(?:[0-9]*[a-zA-Z]+)?[0-9]+)\", \"g\");\n        //var rexlst = new RegExp(\"(?:[0-9]*[a-zA-Z]+)?[0-9]+\" + hyphens + \"(?:[0-9]*[a-zA-Z]+)?[0-9]+\");\n        var rexm = new RegExp(\"((?:[0-9]*[a-zA-Z]+0*)?[0-9]+[a-z]*\" + hyphens + \"(?:[0-9]*[a-zA-Z]+0*)?[0-9]+[a-z]*)\", \"g\");\n        var rexlst = new RegExp(\"(?:[0-9]*[a-zA-Z]+0*)?[0-9]+[a-z]*\" + hyphens + \"(?:[0-9]*[a-zA-Z]+0*)?[0-9]+[a-z]*\");\n        m = str.match(rexm);\n        lst = str.split(rexlst);\n        if (lst.length === 0) {\n            ret = m;\n        } else {\n            ret = [lst[0]];\n            for (pos = 1, len = lst.length; pos < len; pos += 1) {\n                ret.push(m[pos - 1].replace(/\\s*\\-\\s*/g, \"-\"));\n                ret.push(lst[pos]);\n            }\n        }\n        return ret;\n    };\n\n    expand = function (str) {\n        str = \"\" + str;\n        lst = listify(str);\n        len = lst.length;\n        for (pos = 1; pos < len; pos += 2) {\n            m = lst[pos].match(rangerex);\n            if (m) {\n                if (!m[3] || m[1] === m[3]) {\n                    if (m[4].length < m[2].length) {\n                        m[4] = m[2].slice(0, (m[2].length - m[4].length)) + m[4];\n                    }\n                    if (parseInt(m[2], 10) < parseInt(m[4], 10)) {\n                        m[3] = range_delimiter + (m[1] ? m[1] : \"\");\n                        lst[pos] = m.slice(1);\n                    }\n                }\n            }\n            if (\"string\" === typeof lst[pos]) {\n                lst[pos] = lst[pos].replace(/\\-/g, range_delimiter);\n            }\n        }\n        return lst;\n    };\n\n    minimize = function (lst, minchars, isyear) {\n        len = lst.length;\n        for (var i = 1, ilen = lst.length; i < ilen; i += 2) {\n            if (\"object\" === typeof lst[i]) {\n                lst[i][3] = minimize_internal(lst[i][1], lst[i][3], minchars, isyear);\n                if (lst[i][2].slice(1) === lst[i][0]) {\n                    lst[i][2] = range_delimiter;\n                }\n            }\n        }\n        return stringify(lst);\n    };\n\n    minimize_internal = function (begin, end, minchars, isyear) {\n        if (!minchars) {\n            minchars = 0;\n        }\n        b = (\"\" + begin).split(\"\");\n        e = (\"\" + end).split(\"\");\n        ret = e.slice();\n        ret.reverse();\n        if (b.length === e.length) {\n            for (var i = 0, ilen = b.length; i < ilen; i += 1) {\n                if (b[i] === e[i] && ret.length > minchars) {\n                    ret.pop();\n                } else {\n                    if (minchars && isyear && ret.length === 3) {\n                        var front = b.slice(0, i);\n                        front.reverse();\n                        ret = ret.concat(front);\n                    }\n                    break;\n                }\n            }\n        }\n        ret.reverse();\n        return ret.join(\"\");\n    };\n\n    chicago15 = function (lst) {\n        len = lst.length;\n        for (pos = 1; pos < len; pos += 2) {\n            if (\"object\" === typeof lst[pos]) {\n                m = lst[pos];\n                begin = parseInt(m[1], 10);\n                end = parseInt(m[3], 10);\n                if (begin > 100 && begin % 100 && parseInt((begin / 100), 10) === parseInt((end / 100), 10)) {\n                    m[3] = \"\" + (end % 100);\n                } else if (begin >= 10000) {\n                    m[3] = \"\" + (end % 1000);\n                }\n            }\n            if (m[2].slice(1) === m[0]) {\n                m[2] = range_delimiter;\n            }\n        }\n        return stringify(lst);\n    };\n\n    chicago16 = function (lst) {\n        len = lst.length;\n        for (pos = 1; pos < len; pos += 2) {\n            if (\"object\" === typeof lst[pos]) {\n                m = lst[pos];\n                begin = parseInt(m[1], 10);\n                end = parseInt(m[3], 10);\n                e = \"\" + end;\n                if (begin > 100 && begin % 100) {\n                    for (var i = 2; i < e.length; i++) {\n                        var divisor = Math.pow(10, i);\n                        if (Math.floor(begin / divisor) === Math.floor(end / divisor)) {\n                            m[3] = \"\" + (end % divisor);\n                            break;\n                        }\n                    }\n                }\n            }\n            if (m[2].slice(1) === m[0]) {\n                m[2] = range_delimiter;\n            }\n        }\n        return stringify(lst);\n    };\n\n    //\n    // The top-level option handlers.\n    //\n    var sniff = function (str, func, minchars, isyear) {\n        var ret;\n\t\tstr = \"\" + str;\n\t\tvar lst = expand(str);\n        var ret = func(lst, minchars, isyear);\n        return ret;\n    };\n    if (!state.opt[rangeType + \"-range-format\"]) {\n        ret_func = function (str) {\n            //return str.replace(\"-\", \"\\u2013\", \"g\");\n            return sniff(str, stringify);\n        };\n    } else if (state.opt[rangeType + \"-range-format\"] === \"expanded\") {\n        ret_func = function (str) {\n            return sniff(str, stringify);\n        };\n    } else if (state.opt[rangeType + \"-range-format\"] === \"minimal\") {\n        ret_func = function (str) {\n            return sniff(str, minimize);\n        };\n    } else if (state.opt[rangeType + \"-range-format\"] === \"minimal-two\") {\n        ret_func = function (str, isyear) {\n            return sniff(str, minimize, 2, isyear);\n        };\n    } else if (state.opt[rangeType + \"-range-format\"] === \"chicago\") {\n        ret_func = function (str) {\n            return sniff(str, chicago15);\n        };\n    } else if (state.opt[rangeType + \"-range-format\"] === \"chicago-15\") {\n        ret_func = function (str) {\n            return sniff(str, chicago15);\n        };\n    } else if (state.opt[rangeType + \"-range-format\"] === \"chicago-16\") {\n        ret_func = function (str) {\n            return sniff(str, chicago16);\n        };\n    }\n\n    return ret_func;\n};\n\n\n/*global CSL: true */\n\n// Use a state machine\n\n// Okay, good!\n// Needs some tweaks:\n// 1. First pass: quotes only\n//    Special: Convert all sandwiched single-quote markup to apostrophe\n// 2. Second pass: tags\n\nCSL.Util.FlipFlopper = function(state) {\n    \n    /**\n     * INTERNAL\n     */\n\n    var _nestingState = [];\n\n    var _nestingData = {\n        \"<span class=\\\"nocase\\\">\": {\n            type: \"nocase\",\n            opener: \"<span class=\\\"nocase\\\">\",\n            closer: \"</span>\",\n            attr: null,\n            outer: null,\n            flipflop: null\n        },\n        \"<span class=\\\"nodecor\\\">\": {\n            type: \"nodecor\",\n            opener: \"<span class=\\\"nodecor\\\">\",\n            closer: \"</span>\",\n            attr: \"@class\",\n            outer: \"nodecor\",\n            flipflop: {\n                \"nodecor\": \"nodecor\"\n            }\n        },\n        \"<span style=\\\"font-variant:small-caps;\\\">\": {\n            type: \"tag\",\n            opener: \"<span style=\\\"font-variant:small-caps;\\\">\",\n            closer: \"</span>\",\n            attr: \"@font-variant\",\n            outer: \"small-caps\",\n            flipflop: {\n                \"small-caps\": \"normal\",\n                \"normal\": \"small-caps\"\n            }\n        },\n        \"<sc>\": {\n            type: \"tag\",\n            opener: \"<sc>\",\n            closer: \"</sc>\",\n            attr: \"@font-variant\",\n            outer: \"small-caps\",\n            flipflop: {\n                \"small-caps\": \"normal\",\n                \"normal\": \"small-caps\"\n            }\n        },\n        \"<i>\": {\n            type: \"tag\",\n            opener: \"<i>\",\n            closer: \"</i>\",\n            attr: \"@font-style\",\n            outer: \"italic\",\n            flipflop: {\n                \"italic\": \"normal\",\n                \"normal\": \"italic\"\n            }\n        },\n        \"<b>\": {\n            type: \"tag\",\n            opener: \"<b>\",\n            closer: \"</b>\",\n            attr: \"@font-weight\",\n            outer: \"bold\",\n            flipflop: {\n                \"bold\": \"normal\",\n                \"normal\": \"bold\"\n            }\n        },\n        \"<sup>\": {\n            type: \"tag\",\n            opener: \"<sup>\",\n            closer: \"</sup>\",\n            attr: \"@vertical-align\",\n            outer: \"sup\",\n            flipflop: {\n                \"sub\": \"sup\",\n                \"sup\": \"sup\"\n            }\n        },\n        \"<sub>\": {\n            type: \"tag\",\n            opener: \"<sub>\",\n            closer: \"</sub>\",\n            attr: \"@vertical-align\",\n            outer: \"sub\",\n            flipflop: {\n                \"sup\": \"sub\",\n                \"sub\": \"sub\"\n            }\n        },\n        \" \\\"\": {\n            type: \"quote\",\n            opener: \" \\\"\",\n            closer: \"\\\"\",\n            attr: \"@quotes\",\n            outer: \"true\",\n            flipflop: {\n                \"true\": \"inner\",\n                \"inner\": \"true\",\n                \"false\": \"true\"\n            }\n        },\n        \" \\'\": {\n            type: \"quote\",\n            opener: \" \\'\",\n            closer: \"\\'\",\n            attr: \"@quotes\",\n            outer: \"inner\",\n            flipflop: {\n                \"true\": \"inner\",\n                \"inner\": \"true\",\n                \"false\": \"true\"\n            }\n        }\n    };\n\n    _nestingData[\"(\\\"\"] = _nestingData[\" \\\"\"];\n    _nestingData[\"(\\'\"] = _nestingData[\" \\'\"];\n\n    var localeOpenQuote = state.getTerm(\"open-quote\");\n    var localeCloseQuote = state.getTerm(\"close-quote\");\n    var localeOpenInnerQuote = state.getTerm(\"open-inner-quote\");\n    var localeCloseInnerQuote = state.getTerm(\"close-inner-quote\");\n\n    // If locale uses straight quotes, do not register them. All will be well.\n    // Otherwise, clone straight-quote data, and adjust.\n    if (localeOpenQuote && localeCloseQuote && [\" \\\"\",\" \\'\",\"\\\"\",\"\\'\"].indexOf(localeOpenQuote) === -1) {\n        _nestingData[localeOpenQuote] = JSON.parse(JSON.stringify(_nestingData[\" \\\"\"]));\n        _nestingData[localeOpenQuote].opener = localeOpenQuote;\n        _nestingData[localeOpenQuote].closer = localeCloseQuote;\n    }\n    \n    if (localeOpenInnerQuote && localeCloseInnerQuote && [\" \\\"\",\" \\'\",\"\\\"\",\"\\'\"].indexOf(localeOpenInnerQuote) === -1) {\n        _nestingData[localeOpenInnerQuote] = JSON.parse(JSON.stringify(_nestingData[\" \\'\"]));\n        _nestingData[localeOpenInnerQuote].opener = localeOpenInnerQuote;\n        _nestingData[localeOpenInnerQuote].closer = localeCloseInnerQuote;\n    }\n    \n    function _setOuterQuoteForm(quot) {\n        var flip = {\n            \" \\'\": \" \\\"\",\n            \" \\\"\": \" \\'\",\n            \"(\\\"\": \"(\\'\",\n            \"(\\'\": \"(\\\"\"\n        };\n        _nestingData[quot].outer = \"true\";\n        _nestingData[flip[quot]].outer = \"inner\";\n    }\n    \n    function _getNestingOpenerParams(opener) {\n        var openers = [];\n        var keys = Object.keys(_nestingData);\n        for (var i = 0, l = keys.length; i < l; i++) {\n            var key = keys[i];\n            if (_nestingData[opener].type !== \"quote\" || !_nestingData[opener]) {\n                openers.push(key);\n            }\n        }\n        var ret = _nestingData[opener];\n        ret.opener = new RegExp(\"^(?:\" + openers.map(function(str){\n            return str.replace(\"(\", \"\\\\(\");\n        }).join(\"|\") + \")\");\n        return ret;\n    }\n\n    var _nestingParams = (function() {\n        var ret = {};\n        var keys = Object.keys(_nestingData);\n        for (var i = 0, l = keys.length; i < l; i++) {\n            var key = keys[i];\n            ret[key] = _getNestingOpenerParams(key);\n        }\n        return ret;\n    }());\n\n    var _tagRex = (function() {\n        var openers = [];\n        var closers = [];\n        var vals = {};\n        for (var opener in _nestingParams) {\n            openers.push(opener);\n            vals[_nestingParams[opener].closer] = true;\n        }\n        var keys = Object.keys(vals);\n        for (var i = 0, l = keys.length; i < l; i++) {\n            var closer = keys[i];\n            closers.push(closer);\n        }\n\n        var all = openers.concat(closers).map(function(str){\n            return str.replace(\"(\", \"\\\\(\");\n        }).join(\"|\");\n\n        return {\n            matchAll: new RegExp(\"((?:\" + all + \"))\", \"g\"),\n            splitAll: new RegExp(\"(?:\" + all + \")\", \"g\"),\n            open: new RegExp(\"(^(?:\" + openers.map(function(str){\n                return str.replace(\"(\", \"\\\\(\");\n            }).join(\"|\") + \")$)\"),\n            close: new RegExp(\"(^(?:\" + closers.join(\"|\") + \")$)\"),\n        };\n    }());\n\n    function _tryOpen(tag, pos) {\n        var params = _nestingState[_nestingState.length - 1];\n        if (!params || tag.match(params.opener)) {\n            _nestingState.push({\n                type: _nestingParams[tag].type,\n                opener: _nestingParams[tag].opener,\n                closer: _nestingParams[tag].closer,\n                pos: pos\n            });\n            return false;\n        } else {\n            _nestingState.pop();\n            _nestingState.push({\n                type: _nestingParams[tag].type,\n                opener: _nestingParams[tag].opener,\n                closer: _nestingParams[tag].closer,\n                pos: pos\n            });\n            return {\n                fixtag: params.pos\n            };\n        }\n    }\n    \n    function _tryClose(tag, pos) {\n        var params = _nestingState[_nestingState.length - 1];\n        if (params && tag === params.closer) {\n            _nestingState.pop();\n            if (params.type === \"nocase\") {\n                return {\n                    nocase: {\n                        open: params.pos,\n                        close: pos\n                    }\n                };\n            } else {\n                return false;\n            }\n        } else {\n            if (params) {\n                return {\n                    fixtag: params.pos\n                };\n            } else {\n                return {\n                    fixtag: pos\n                };\n            }\n        }\n    }\n    \n    function _pushNestingState(tag, pos) {\n        if (tag.match(_tagRex.open)) {\n            return _tryOpen(tag, pos);\n        } else {\n            return _tryClose(tag, pos);\n        }\n    }\n    \n    function _doppelString(str) {\n        var forcedSpaces = [];\n        // Normalize markup\n        str = str.replace(/(<span)\\s+(style=\\\"font-variant:)\\s*(small-caps);?\\\"[^>]*(>)/g, \"$1 $2$3;\\\"$4\");\n        str = str.replace(/(<span)\\s+(class=\\\"no(?:case|decor)\\\")[^>]*(>)/g, \"$1 $2$3\");\n\n        var match = str.match(_tagRex.matchAll);\n        if (!match) {\n            return {\n                tags: [],\n                strings: [str],\n                forcedSpaces: []\n            };\n        }\n        var split = str.split(_tagRex.splitAll);\n\n        for (var i=0,ilen=match.length-1;i<ilen;i++) {\n            if (_nestingData[match[i]]) {\n                if (split[i+1] === \"\" && [\"\\\"\", \"'\"].indexOf(match[i+1]) > -1) {\n                    match[i+1] = \" \" + match[i+1];\n                    forcedSpaces.push(true);\n                } else {\n                    forcedSpaces.push(false);\n                }\n            }\n        }\n        return {\n            tags: match,\n            strings: split,\n            forcedSpaces: forcedSpaces\n        };\n    }\n\n    var TagReg = function(blob) {\n        var _stack = [];\n        this.set = function (tag) {\n            var attr = _nestingData[tag].attr;\n            var decor = null;\n            for (var i=_stack.length-1;i>-1;i--) {\n                var _decor = _stack[i];\n                if (_decor[0] === attr) {\n                    decor = _decor;\n                    break;\n                }\n            }\n            if (!decor) {\n                var allTheDecor = [state[state.tmp.area].opt.layout_decorations].concat(blob.alldecor);\n                outer:\n                for (var i=allTheDecor.length-1;i>-1;i--) {\n                    var decorset = allTheDecor[i];\n                    if (!decorset) {\n                        continue;\n                    }\n                    for (var j=decorset.length-1;j>-1;j--) {\n                        var _decor = decorset[j];\n                        if (_decor[0] === attr) {\n                            decor = _decor;\n                            break outer;\n                        }\n                    }\n                }\n            }\n            if (!decor) {\n                decor = [attr, _nestingData[tag].outer];\n            } else {\n                decor = [attr, _nestingData[tag].flipflop[decor[1]]];\n            }\n            _stack.push(decor);\n        };\n        this.pair = function () {\n            return _stack[_stack.length-1];\n        };\n        this.pop = function () {\n            _stack.pop();\n        };\n    };\n    \n    function _apostropheForce(tag, str) {\n        if (tag === \"\\'\") {\n            if (str && str.match(/^[^\\,\\.\\?\\:\\;\\ ]/)) {\n                return \"\\u2019\";\n            }\n        } else if (tag === \" \\'\" && str && str.match(/^[\\ ]/)) {\n            return \" \\u2019\";\n        }\n        return false;\n    }\n\n    function _undoppelToQueue(blob, doppel, leadingSpace) {\n        var firstString = true;\n        var tagReg = new TagReg(blob);\n        blob.blobs = [];\n        function Stack (blob) {\n            this.stack = [blob];\n            this.latest = blob;\n            this.addStyling = function(str, decor) {\n                if (firstString) {\n                    if (str.slice(0, 1) === \" \") {\n                        str = str.slice(1);\n                    }\n                    if (str.slice(0, 1) === \" \") {\n                        str = str.slice(1);\n                    }\n                    firstString = false;\n                }\n                this.latest = this.stack[this.stack.length-1];\n                if (decor) {\n                    if (\"string\" === typeof this.latest.blobs) {\n                        var child = new CSL.Blob();\n                        child.blobs = this.latest.blobs;\n                        child.alldecor = this.latest.alldecor.slice();\n                        this.latest.blobs = [child];\n                    }\n                    var tok = new CSL.Token();\n                    var newblob = new CSL.Blob(null, tok);\n                    newblob.alldecor = this.latest.alldecor.slice();\n                    \n                    // AHA! Bad naming. There is _decorset from the list, and\n                    // there WAS decorset that we are building. Dumb. Fix the\n                    // names and fix it up.\n                    \n                    if (decor[0] === \"@class\" && decor[1] === \"nodecor\") {\n                        var newdecorset = [];\n                        var seen = {};\n                        var allTheDecor = [state[state.tmp.area].opt.layout_decorations].concat(newblob.alldecor);\n                        for (var i=allTheDecor.length-1;i>-1;i--) {\n                            var _decorset = allTheDecor[i];\n                            if (!_decorset) {\n                                continue;\n                            }\n                            for (var j=_decorset.length-1;j>-1;j--) {\n                                var _olddecor = _decorset[j];\n                                if ([\"@font-weight\", \"@font-style\", \"@font-variant\"].indexOf(_olddecor[0]) > -1\n                                    && !seen[_olddecor[0]]) {\n                                    \n                                    if (decor[1] !== \"normal\") {\n                                        newblob.decorations.push([_olddecor[0], \"normal\"]);\n                                        newdecorset.push([_olddecor[0], \"normal\"]);\n                                    }\n                                    seen[_olddecor[0]] = true;\n                                }\n                            }\n                        }\n                        newblob.alldecor.push(newdecorset);\n                        \n                    } else {\n                        newblob.decorations.push(decor);\n                        newblob.alldecor.push([decor]);\n                    }\n                    this.latest.blobs.push(newblob);\n                    this.stack.push(newblob);\n                    this.latest = newblob;\n                    if (str) {\n                        var tok = new CSL.Token();\n                        var newblob = new CSL.Blob(null, tok);\n                        newblob.blobs = str;\n                        newblob.alldecor = this.latest.alldecor.slice();\n                        this.latest.blobs.push(newblob);\n                    }\n                } else {\n                    if (str) {\n                        var child = new CSL.Blob();\n                        child.blobs = str;\n                        child.alldecor = this.latest.alldecor.slice();\n                        this.latest.blobs.push(child);\n                    }\n                }\n            };\n            this.popStyling = function() {\n                this.stack.pop();\n            };\n        }\n        var stack = new Stack(blob);\n        if (doppel.strings.length) {\n            var str = doppel.strings[0];\n            if (leadingSpace) {\n                str = \" \" + str;\n            }\n            stack.addStyling(str);\n        }\n        for (var i=0,ilen=doppel.tags.length;i<ilen;i++) {\n            var tag = doppel.tags[i];\n            var str = doppel.strings[i+1];\n            if (tag.match(_tagRex.open)) {\n                tagReg.set(tag);\n                stack.addStyling(str, tagReg.pair());\n            } else {\n                tagReg.pop();\n                stack.popStyling();\n                stack.addStyling(str);\n            }\n        }\n    }\n\n    /**\n     * PUBLIC\n     */\n\n    this.processTags = function (blob) {\n        var str = blob.blobs;\n        var leadingSpace = false;\n        if (str.slice(0, 1) === \" \" && !str.match(/^\\s+[\\'\\\"]/)) {\n            leadingSpace = true;\n        }\n        var rex = new RegExp(\"(\" + CSL.ROMANESQUE_REGEXP.source + \")\\u2019(\" + CSL.ROMANESQUE_REGEXP.source + \")\", \"g\");\n        var str = \" \" + str.replace(rex, \"$1\\'$2\");\n        var doppel = _doppelString(str);\n        if (doppel.tags.length === 0) {\n            return;\n        }\n        var quoteFormSeen = false;\n        \n    \tfor (var i=0,ilen=doppel.tags.length;i<ilen;i++) {\n            var tag = doppel.tags[i];\n            var str = doppel.strings[i+1];\n            var apostrophe = _apostropheForce(tag, str);\n            if (apostrophe) {\n                doppel.strings[i+1] = apostrophe + doppel.strings[i+1];\n                doppel.tags[i] = \"\";\n            } else {\n                var tagInfo;\n                while (true) {\n                    tagInfo = _pushNestingState(tag, i);\n                    if (tagInfo) {\n                        if (Object.keys(tagInfo).indexOf(\"fixtag\") > -1) {\n                            if (tag.match(_tagRex.close)\n                                && tag === \"\\'\") {\n                                \n                                doppel.strings[i+1] = \"\\u2019\" + doppel.strings[i+1];\n                                doppel.tags[i] = \"\";\n                            } else {\n                                var failedTag = doppel.tags[tagInfo.fixtag];\n                                if (doppel.forcedSpaces[tagInfo.fixtag-1]) {\n                                    failedTag = failedTag.slice(1);\n                                }\n                                doppel.strings[tagInfo.fixtag+1] = failedTag + doppel.strings[tagInfo.fixtag+1];\n                                doppel.tags[tagInfo.fixtag] = \"\";\n                            }\n                            if (_nestingState.length > 0) {\n                                if (tag !== \"\\'\") {\n                                    _nestingState.pop();\n                                } else {\n                                    break;\n                                }\n                            } else {\n                                break;\n                            }\n                        } else if (tagInfo.nocase) {\n                            doppel.tags[tagInfo.nocase.open] = \"\";\n                            doppel.tags[tagInfo.nocase.close] = \"\";\n                            break;\n                        } else {\n                            break;\n                        }\n                    } else {\n                        break;\n                    }\n                }\n                if (tagInfo && (tagInfo.fixtag|| tagInfo.fixtag === 0)) {\n                    doppel.strings[i+1] = doppel.tags[i] + doppel.strings[i+1];\n                    doppel.tags[i] = \"\";\n                }\n            }\n        }\n        // Stray tags are neutralized here\n        for (var i=_nestingState.length-1;i>-1;i--) {\n            var tagPos = _nestingState[i].pos;\n            var tag = doppel.tags[tagPos];\n            if (tag === \" \\'\" || tag === \"\\'\") {\n\n                doppel.strings[tagPos+1] = \" \\u2019\" + doppel.strings[tagPos+1];\n            } else {\n                doppel.strings[tagPos+1] = doppel.tags[tagPos] + doppel.strings[tagPos+1];\n            }\n            doppel.tags[tagPos] = \"\";\n            _nestingState.pop();\n        }\n        for (var i=doppel.tags.length-1;i>-1;i--) {\n            if (!doppel.tags[i]) {\n                doppel.tags = doppel.tags.slice(0,i).concat(doppel.tags.slice(i+1));\n                doppel.strings[i] = doppel.strings[i] + doppel.strings[i+1];\n                doppel.strings = doppel.strings.slice(0,i+1).concat(doppel.strings.slice(i+2));\n            }\n        }\n        // Sniff initial (outer) quote form (single or double) and configure parser\n        // Also add leading spaces.\n        for (var i=0,ilen=doppel.tags.length;i<ilen;i++) {\n            var tag = doppel.tags[i];\n            var forcedSpace = doppel.forcedSpaces[i-1];\n            if ([\" \\\"\", \" \\'\", \"(\\\"\", \"(\\'\"].indexOf(tag) > -1) {\n                if (!quoteFormSeen) {\n                    _setOuterQuoteForm(tag);\n                    quoteFormSeen = true;\n                }\n                if (!forcedSpace) {\n                    doppel.strings[i] += tag.slice(0, 1);\n                }\n            }\n        }\n        //print(JSON.stringify(doppel, null, 2))\n        //print(_undoppelString(doppel));\n        _undoppelToQueue(blob, doppel, leadingSpace);\n    };\n};\n\n/*global CSL: true */\n\nCSL.Output.Formatters = (function () {\n    var rexStr = \"(?:\\u2018|\\u2019|\\u201C|\\u201D| \\\"| \\'|\\\"|\\'|[-\\u2013\\u2014\\/.,;?!:]|\\\\[|\\\\]|\\\\(|\\\\)|<span style=\\\"font-variant: small-caps;\\\">|<span class=\\\"no(?:case|decor)\\\">|<\\/span>|<\\/?(?:i|sc|b|sub|sup)>)\";\n    var tagDoppel = new CSL.Doppeler(rexStr, function(str) {\n        return str.replace(/(<span)\\s+(class=\\\"no(?:case|decor)\\\")[^>]*(>)/g, \"$1 $2$3\").replace(/(<span)\\s+(style=\\\"font-variant:)\\s*(small-caps);?(\\\")[^>]*(>)/g, \"$1 $2 $3;$4$5\");\n    });\n    var rexNameStr = \"(?:[-\\\\s]*<\\\\/*(?:span\\s+class=\\\"no(?:case|decor)\\\"|i|sc|b|sub|sup)>[-\\\\s]*|[-\\\\s]+)\";\n    var nameDoppel = new CSL.Doppeler(rexNameStr);\n    \n    var wordDoppel = new CSL.Doppeler(\"(?:[\\u00A0\\u0020\\u00A0\\u2000-\\u200B\\u205F\\u3000]+)\");\n    \n    /**\n     * INTERNAL\n     */\n\n    var _tagParams = {\n        \"<span style=\\\"font-variant: small-caps;\\\">\": \"</span>\",\n        \"<span class=\\\"nocase\\\">\": \"</span>\",\n        \"<span class=\\\"nodecor\\\">\": \"</span>\",\n        \"<sc>\": \"</sc>\",\n        \"<sub>\": \"</sub>\",\n        \"<sup>\": \"</sup>\"\n    };\n\n    function _capitalise (word) {\n        // Weird stuff is (.) transpiled with regexpu\n        //   https://github.com/mathiasbynens/regexpu\n        var m = word.match(/(^\\s*)((?:[\\0-\\t\\x0B\\f\\x0E-\\u2027\\u202A-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]))(.*)/);\n        // Do not uppercase lone Greek letters\n        // (No case transforms in Greek citations, but chars used in titles to science papers)\n        if (m && !(m[2].match(/^[\\u0370-\\u03FF]$/) && !m[3])) {\n            return m[1] + CSL.toLocaleUpperCase.call(this, m[2]) + m[3];\n        }\n        return word;\n    }\n\n    function _textcaseEngine(config, string) {\n        if (!string) {\n            return \"\";\n        }\n        config.doppel = tagDoppel.split(string);\n        var quoteParams = {\n            \" \\\"\": {\n                opener: \" \\'\",\n                closer: \"\\\"\"\n            },\n            \" \\'\": {\n                opener: \" \\\"\",\n                closer: \"\\'\"\n            },\n            \"\\u2018\": {\n                opener: \"\\u2018\",\n                closer: \"\\u2019\"\n            },\n            \"\\u201C\": {\n                opener: \"\\u201C\",\n                closer: \"\\u201D\"\n            },\n        };\n        function tryOpen(tag, pos) {\n            if (config.quoteState.length === 0 || tag === config.quoteState[config.quoteState.length - 1].opener) {\n                config.quoteState.push({\n                    opener: quoteParams[tag].opener,\n                    closer: quoteParams[tag].closer,\n                    pos: pos\n                });\n                return false;\n            } else {\n                var prevPos = config.quoteState[config.quoteState.length-1].pos;\n                config.quoteState.pop();\n                config.quoteState.push({\n                    opener: quoteParams[tag].opener,\n                    closer: quoteParams[tag].closer,\n                    positions: pos\n                });\n                return prevPos;\n            }\n        }\n        function tryClose(tag, pos) {\n            if (config.quoteState.length > 0 && tag === config.quoteState[config.quoteState.length - 1].closer) {\n                config.quoteState.pop();\n            } else {\n                return pos;\n            }\n        }\n        function pushQuoteState(tag, pos) {\n            var isOpener = [\"\\u201C\", \"\\u2018\", \" \\\"\", \" \\'\"].indexOf(tag) > -1 ? true : false;\n            if (isOpener) {\n                return tryOpen(tag, pos);\n            } else {\n                return tryClose(tag, pos);\n            }\n        }\n        function quoteFix (tag, positions) {\n            var m = tag.match(/(^(?:\\u2018|\\u2019|\\u201C|\\u201D|\\\"|\\')|(?: \\\"| \\')$)/);\n            if (m) {\n                return pushQuoteState(m[1], positions);\n            }\n        }\n        // Run state machine\n        if (config.doppel.strings.length && config.doppel.strings[0].trim()) {\n            config.doppel.strings[0] = config.capitaliseWords(config.doppel.strings[0], 0, config.doppel.tags[0]);\n        }\n\n    \tfor (var i=0,ilen=config.doppel.tags.length;i<ilen;i++) {\n            var tag = config.doppel.tags[i];\n            var str = config.doppel.strings[i+1];\n\n            if (config.tagState !== null) {\n                // Evaluate tag state for current string\n                if (_tagParams[tag]) {\n                    config.tagState.push(_tagParams[tag]);\n                } else if (config.tagState.length && tag === config.tagState[config.tagState.length - 1]) {\n                    config.tagState.pop();\n                }\n            }\n\n            if (config.afterPunct !== null) {\n                // Evaluate punctuation state of current string\n                if (tag.match(/[\\!\\?\\:]$/)) {\n                    config.afterPunct = true;\n                }\n            }\n\n            // Process if outside tag scope, else noop for upper-casing\n            if (config.tagState.length === 0) {\n                config.doppel.strings[i+1] = config.capitaliseWords(str, i+1, config.doppel,config.doppel.tags[i+1]);\n                \n            } else if (config.doppel.strings[i+1].trim()) {\n                config.lastWordPos = null;\n            }\n            \n            if (config.quoteState !== null) {\n                // Evaluate quote state of current string and fix chars that have flown\n                var quotePos = quoteFix(tag, i);\n                if (quotePos || quotePos === 0) {\n                    var origChar = config.doppel.origStrings[quotePos+1].slice(0, 1);\n                    config.doppel.strings[quotePos+1] = origChar + config.doppel.strings[quotePos+1].slice(1);\n                    config.lastWordPos = null;\n                }\n            }\n\n            // If there was a printable string, unset first-word and after-punctuation\n            if (config.isFirst) {\n                if (str.trim()) {\n                    config.isFirst = false;\n                }\n            }\n            if (config.afterPunct) {\n                if (str.trim()) {\n                    config.afterPunct = false;\n                }\n            }\n        }\n        if (config.quoteState) {\n            for (var i=0,ilen=config.quoteState.length;i<ilen;i++) {\n                var quotePos = config.quoteState[i].pos;\n                // Test for quotePos avoids a crashing error:\n                //   https://github.com/citation-style-language/test-suite/blob/master/processor-tests/humans/flipflop_OrphanQuote.txt\n                if (typeof quotePos !== 'undefined') {\n                    var origChar = config.doppel.origStrings[quotePos+1].slice(0, 1);\n                    config.doppel.strings[quotePos+1] = origChar + config.doppel.strings[quotePos+1].slice(1);\n                }\n            }\n        }\n        // Specially capitalize the last word if necessary (invert stop-word list)\n        if (config.lastWordPos) {\n            var lastWords = wordDoppel.split(config.doppel.strings[config.lastWordPos.strings]);\n            var lastWord = lastWords.strings[config.lastWordPos.words];\n            if (lastWord.length > 1 && CSL.toLocaleLowerCase.call(this, lastWord).match(config.skipWordsRex)) {\n                lastWord = _capitalise.call(this, lastWord);\n                lastWords.strings[config.lastWordPos.words] = lastWord;\n            }\n            config.doppel.strings[config.lastWordPos.strings] = wordDoppel.join(lastWords);\n        }\n\n        // Recombine the string\n        return tagDoppel.join(config.doppel);\n    }\n\n    /**\n     * PUBLIC\n     */\n\n    /**\n     * A noop that just delivers the string.\n     */\n    function passthrough (state, str) {\n        return str;\n    }\n\n    /**\n     * Force all letters in the string to lowercase, skipping nocase spans\n     */\n    function lowercase(state, string) {\n        var config = {\n            quoteState: null,\n            capitaliseWords: function(str) {\n                var words = str.split(\" \");\n                for (var i=0,ilen=words.length;i<ilen;i++) {\n                    var word = words[i];\n                    if (word) {\n                        words[i] = CSL.toLocaleLowerCase.call(state, word);\n                    }\n                }\n                return words.join(\" \");\n            },\n            skipWordsRex: null,\n            tagState: [],\n            afterPunct: null,\n            isFirst: null\n        };\n        return _textcaseEngine.call(state, config, string);\n    }\n\n    /**\n     * Force all letters in the string to uppercase.\n     */\n    function uppercase(state, string) {\n        var config = {\n            quoteState: null,\n            capitaliseWords: function(str) {\n                var words = str.split(\" \");\n                for (var i=0,ilen=words.length;i<ilen;i++) {\n                    var word = words[i];\n                    if (word) {\n                        // Okay.\n                        // So we need to pick up an array of locales from state.tmp.\n                        // This function is invoked in the context of queue.js, so\n                        // the item is not available here. Three levels to be included\n                        // in the array:\n                        // 1. Field language tag, if any\n                        // 2. Item language tag, if any\n                        // 3. Value of state.opt.lang\n                        words[i] = CSL.toLocaleUpperCase.call(state, word);\n                    }\n                }\n                return words.join(\" \");\n            },\n            skipWordsRex: null,\n            tagState: [],\n            afterPunct: null,\n            isFirst: null\n        };\n        return _textcaseEngine.call(state, config, string);\n    }\n\n    /**\n     * Similar to <b>capitalize_first</b>, but force the\n     * subsequent characters to lowercase.\n     */\n    function sentence(state, string) {\n        var config = {\n            quoteState: [],\n            capitaliseWords: function(str) {\n                var words = str.split(\" \");\n                for (var i=0,ilen=words.length;i<ilen;i++) {\n                    var word = words[i];\n                    if (word) {\n                        if (config.isFirst) {\n                            words[i] = _capitalise.call(state, word);\n                            config.isFirst = false;\n                        } else {\n                            words[i] = CSL.toLocaleLowerCase.call(state, word);\n                        }\n                    }\n                }\n                return words.join(\" \");\n            },\n            skipWordsRex: null,\n            tagState: [],\n            afterPunct: null,\n            isFirst: true\n        };\n        return _textcaseEngine.call(state, config, string);\n    }\n\n    function title(state, string) {\n        var config = {\n            quoteState: [],\n            capitaliseWords: function(str, i, followingTag) {\n                if (str.trim()) {\n                    var wordle = wordDoppel.split(str);\n                    var words = wordle.strings;\n                    for (var j=0,jlen=words.length;j<jlen;j++) {\n                        var word = words[j];\n                        if (!word) {\n                            continue;\n                        }\n                        let lcase = CSL.toLocaleLowerCase.call(state, word);\n                        let capitalize = false;\n                        if (word.length > 1 && !lcase.match(config.skipWordsRex)) {\n                            // Capitalize every word that is not a stop-word\n                            capitalize = true;\n                        } else if (j === (words.length - 1) && followingTag === \"-\") {\n                            capitalize = true;\n                        } else if (config.isFirst) {\n                            // Capitalize first word, even if a stop-word\n                            capitalize = true;\n                        } else if (config.afterPunct) {\n                            // Capitalize after punctuation\n                            capitalize = true;\n                        }\n                        // Don't capitalize if word already contains capitalization\n                        if (capitalize && word === lcase) {\n                            words[j] = _capitalise.call(state, word);\n                        }\n                        config.afterPunct = false;\n                        config.isFirst = false;\n                        config.lastWordPos = {\n                            strings: i,\n                            words: j\n                        };\n                    }\n                    str = wordDoppel.join(wordle);\n                }\n                return str;\n            },\n            skipWordsRex: state.locale[state.opt.lang].opts[\"skip-words-regexp\"],\n            tagState: [],\n            afterPunct: false,\n            isFirst: true\n        };\n        return _textcaseEngine.call(state, config, string);\n    }\n    \n    \n    /**\n     * Force capitalization of the first letter in the string, leave\n     * the rest of the characters untouched.\n     */\n    function capitalizeFirst(state, string) {\n        var config = {\n            quoteState: [],\n            capitaliseWords: function(str) {\n                var wordle = wordDoppel.split(str);\n                var words = wordle.strings;\n                for (var i=0,ilen=words.length;i<ilen;i++) {\n                    var word = words[i];\n                    if (word) {\n                        if (config.isFirst) {\n                            // Don't capitalize if word already contains capitalization\n                            if (word === CSL.toLocaleLowerCase.call(state, word)) {\n                                words[i] = _capitalise.call(state, word);\n                            }\n                            config.isFirst = false;\n                            break;\n                        }\n                    }\n                }\n                return wordDoppel.join(wordle);\n            },\n            skipWordsRex: null,\n            tagState: [],\n            afterPunct: null,\n            isFirst: true\n        };\n        return _textcaseEngine.call(state, config, string);\n    }\n\n    /**\n     * Force the first letter of each space-delimited\n     * word in the string to uppercase, and leave the remainder\n     * of the string untouched.  Single characters are forced\n     * to uppercase.\n     */\n    function capitalizeAll (state, string) {\n        var config = {\n            quoteState: [],\n            capitaliseWords: function(str) {\n                var wordle = wordDoppel.split(str);\n                var words = wordle.strings;\n                for (var i=0,ilen=words.length;i<ilen;i++) {\n                    var word = words[i];\n                    if (word) {\n                        // Don't capitalize if word already contains capitalization\n                        if (word === CSL.toLocaleLowerCase.call(state, word)) {\n                            words[i] = _capitalise.call(state, word);\n                        }\n                    }\n                }\n                return wordDoppel.join(wordle);\n            },\n            skipWordsRex: null,\n            tagState: [],\n            afterPunct: null,\n            isFirst: null\n        };\n        return _textcaseEngine.call(state, config, string);\n    }\n    return {\n        nameDoppel: nameDoppel,\n        passthrough: passthrough,\n        lowercase: lowercase,\n        uppercase: uppercase,\n        sentence: sentence,\n        title: title,\n        \"capitalize-first\": capitalizeFirst,\n        \"capitalize-all\": capitalizeAll\n    };\n}());\n\n/*global CSL: true */\n\n\n/**\n * Output specifications.\n * @class\n */\nCSL.Output.Formats = function () {};\n\n/**\n * HTML output format specification.\n * <p>The headline says it all.  The source code for this\n * object can be used as a template for producing other\n * output modes.</p>\n */\nCSL.Output.Formats.prototype.html = {\n    //\n    // text_escape: Format-specific function for escaping text destined\n    // for output.  Takes the text to be escaped as sole argument.  Function\n    // will be run only once across each portion of text to be escaped, it\n    // need not be idempotent.\n    //\n    \"text_escape\": function (text) {\n        // Numeric entities, in case the output is processed as\n        // xml in an environment in which HTML named entities are\n        // not declared.\n        if (!text) {\n            text = \"\";\n        }\n        return text.replace(/&/g, \"&#38;\")\n            .replace(/</g, \"&#60;\")\n            .replace(/>/g, \"&#62;\")\n            .replace(/\\s\\s/g, \"\\u00A0 \")\n            .replace(CSL.SUPERSCRIPTS_REGEXP,\n                     function(aChar) {\n                         // return \"&#60;sup&#62;\" + CSL.SUPERSCRIPTS[aChar] + \"&#60;/sup&#62;\";\n                         return \"<sup>\" + CSL.SUPERSCRIPTS[aChar] + \"</sup>\";\n                     });\n    },\n    \"bibstart\": \"<div class=\\\"csl-bib-body\\\">\\n\",\n    \"bibend\": \"</div>\",\n    \"@font-style/italic\": \"<i>%%STRING%%</i>\",\n    \"@font-style/oblique\": \"<em>%%STRING%%</em>\",\n    \"@font-style/normal\": \"<span style=\\\"font-style:normal;\\\">%%STRING%%</span>\",\n    \"@font-variant/small-caps\": \"<span style=\\\"font-variant:small-caps;\\\">%%STRING%%</span>\",\n    \"@passthrough/true\": CSL.Output.Formatters.passthrough,\n    \"@font-variant/normal\": \"<span style=\\\"font-variant:normal;\\\">%%STRING%%</span>\",\n    \"@font-weight/bold\": \"<b>%%STRING%%</b>\",\n    \"@font-weight/normal\": \"<span style=\\\"font-weight:normal;\\\">%%STRING%%</span>\",\n    \"@font-weight/light\": false,\n    \"@text-decoration/none\": \"<span style=\\\"text-decoration:none;\\\">%%STRING%%</span>\",\n    \"@text-decoration/underline\": \"<span style=\\\"text-decoration:underline;\\\">%%STRING%%</span>\",\n    \"@vertical-align/sup\": \"<sup>%%STRING%%</sup>\",\n    \"@vertical-align/sub\": \"<sub>%%STRING%%</sub>\",\n    \"@vertical-align/baseline\": \"<span style=\\\"baseline\\\">%%STRING%%</span>\",\n    \"@strip-periods/true\": CSL.Output.Formatters.passthrough,\n    \"@strip-periods/false\": CSL.Output.Formatters.passthrough,\n    \"@quotes/true\": function (state, str) {\n        if (\"undefined\" === typeof str) {\n            return state.getTerm(\"open-quote\");\n        }\n        return state.getTerm(\"open-quote\") + str + state.getTerm(\"close-quote\");\n    },\n    \"@quotes/inner\": function (state, str) {\n        if (\"undefined\" === typeof str) {\n            //\n            // Mostly right by being wrong (for apostrophes)\n            //\n            return \"\\u2019\";\n        }\n        return state.getTerm(\"open-inner-quote\") + str + state.getTerm(\"close-inner-quote\");\n    },\n    \"@quotes/false\": false,\n    //\"@bibliography/body\": function (state,str){\n    //    return \"<div class=\\\"csl-bib-body\\\">\\n\"+str+\"</div>\";\n    //},\n    \"@cite/entry\": function (state, str) {\n        return state.sys.wrapCitationEntry(str, this.item_id, this.locator_txt, this.suffix_txt);\n\t},\n    \"@bibliography/entry\": function (state, str) {\n        // Test for this.item_id to add decorations to\n        // bibliography output of individual entries.\n        //\n        // Full item content can be obtained from\n        // state.registry.registry[id].ref, using\n        // CSL variable keys.\n        //\n        // Example:\n        //\n        //   print(state.registry.registry[this.item_id].ref[\"title\"]);\n        //\n        // At present, for parallel citations, only the\n        // id of the master item is supplied on this.item_id.\n        var insert = \"\";\n        if (state.sys.embedBibliographyEntry) {\n            insert = state.sys.embedBibliographyEntry(this.item_id) + \"\\n\";\n        }\n        return \"  <div class=\\\"csl-entry\\\">\" + str + \"</div>\\n\" + insert;\n    },\n    \"@display/block\": function (state, str) {\n        return \"\\n\\n    <div class=\\\"csl-block\\\">\" + str + \"</div>\\n\";\n    },\n    \"@display/left-margin\": function (state, str) {\n        return \"\\n    <div class=\\\"csl-left-margin\\\">\" + str + \"</div>\";\n    },\n    \"@display/right-inline\": function (state, str) {\n        return \"<div class=\\\"csl-right-inline\\\">\" + str + \"</div>\\n  \";\n    },\n    \"@display/indent\": function (state, str) {\n        return \"<div class=\\\"csl-indent\\\">\" + str + \"</div>\\n  \";\n    },\n    \"@showid/true\": function (state, str, cslid) {\n        if (!state.tmp.just_looking && ! state.tmp.suppress_decorations) {\n            if (cslid) {\n                return \"<span class=\\\"\" + state.opt.nodenames[cslid] + \"\\\" cslid=\\\"\" + cslid + \"\\\">\" + str + \"</span>\";\n            } else if (this.params && \"string\" === typeof str) {\n                var prePunct = \"\";\n                if (str) {\n                    var m = str.match(CSL.VARIABLE_WRAPPER_PREPUNCT_REX);\n                    prePunct = m[1];\n                    str = m[2];\n                }\n                var postPunct = \"\";\n                if (str && CSL.SWAPPING_PUNCTUATION.indexOf(str.slice(-1)) > -1) {\n                    postPunct = str.slice(-1);\n                    str = str.slice(0,-1);\n                }\n                return state.sys.variableWrapper(this.params, prePunct, str, postPunct);\n            } else {\n                return str;\n            }\n        } else {\n            return str;\n        }\n    },\n    \"@URL/true\": function (state, str) {\n        return \"<a href=\\\"\" + str + \"\\\">\" + str + \"</a>\";\n    },\n    \"@DOI/true\": function (state, str) {\n        var doiurl = str;\n        if (!str.match(/^https?:\\/\\//)) {\n            doiurl = \"https://doi.org/\" + str;\n        }\n        return \"<a href=\\\"\" + doiurl + \"\\\">\" + str + \"</a>\";\n    }\n};\n\n/**\n * Plain text output specification.\n *\n * (Code contributed by Simon Kornblith, Center for History and New Media,\n * George Mason University.)\n */\nCSL.Output.Formats.prototype.text = {\n    //\n    // text_escape: Format-specific function for escaping text destined\n    // for output.  Takes the text to be escaped as sole argument.  Function\n    // will be run only once across each portion of text to be escaped, it\n    // need not be idempotent.\n    //\n    \"text_escape\": function (text) {\n        if (!text) {\n            text = \"\";\n        }\n        return text;\n    },\n    \"bibstart\": \"\",\n    \"bibend\": \"\",\n    \"@font-style/italic\": false,\n    \"@font-style/oblique\": false,\n    \"@font-style/normal\": false,\n    \"@font-variant/small-caps\": false,\n    \"@passthrough/true\": CSL.Output.Formatters.passthrough,\n    \"@font-variant/normal\": false,\n    \"@font-weight/bold\": false,\n    \"@font-weight/normal\": false,\n    \"@font-weight/light\": false,\n    \"@text-decoration/none\": false,\n    \"@text-decoration/underline\": false,\n    \"@vertical-align/baseline\": false,\n    \"@vertical-align/sup\": false,\n    \"@vertical-align/sub\": false,\n    \"@strip-periods/true\": CSL.Output.Formatters.passthrough,\n    \"@strip-periods/false\": CSL.Output.Formatters.passthrough,\n    \"@quotes/true\": function (state, str) {\n        if (\"undefined\" === typeof str) {\n            return state.getTerm(\"open-quote\");\n        }\n        return state.getTerm(\"open-quote\") + str + state.getTerm(\"close-quote\");\n    },\n    \"@quotes/inner\": function (state, str) {\n        if (\"undefined\" === typeof str) {\n            //\n            // Mostly right by being wrong (for apostrophes)\n            //\n            return \"\\u2019\";\n        }\n        return state.getTerm(\"open-inner-quote\") + str + state.getTerm(\"close-inner-quote\");\n    },\n    \"@quotes/false\": false,\n    //\"@bibliography/body\": function (state,str){\n    //    return \"<div class=\\\"csl-bib-body\\\">\\n\"+str+\"</div>\";\n    //},\n    \"@cite/entry\": function (state, str) {\n\t\treturn state.sys.wrapCitationEntry(str, this.item_id, this.locator_txt, this.suffix_txt);\n\t},\n    \"@bibliography/entry\": function (state, str) {\n        return str+\"\\n\";\n    },\n    \"@display/block\": function (state, str) {\n        return \"\\n\"+str;\n    },\n    \"@display/left-margin\": function (state, str) {\n        return str + \" \";\n    },\n    \"@display/right-inline\": function (state, str) {\n        return str;\n    },\n    \"@display/indent\": function (state, str) {\n        return \"\\n    \"+str;\n    },\n    \"@showid/true\": function (state, str) {\n        return str;\n    },\n    \"@URL/true\": function (state, str) {\n        return str;\n    },\n    \"@DOI/true\": function (state, str) {\n        return str;\n    }\n};\n\n/**\n * Plain text output specification.\n *\n * (Code contributed by Simon Kornblith, Center for History and New Media,\n * George Mason University.)\n */\nCSL.Output.Formats.prototype.rtf = {\n    //\n    // text_escape: Format-specific function for escaping text destined\n    // for output.  Takes the text to be escaped as sole argument.  Function\n    // will be run only once across each portion of text to be escaped, it\n    // need not be idempotent.\n    //\n    \"text_escape\": function (text) {\n        if (!text) {\n            text = \"\";\n        }\n        return text\n        .replace(/([\\\\{}])/g, \"\\\\$1\")\n        .replace(CSL.SUPERSCRIPTS_REGEXP,\n                 function(aChar) {\n                     return \"\\\\super \" + CSL.SUPERSCRIPTS[aChar] + \"\\\\nosupersub{}\";\n                 })\n        .replace(/[\\u007F-\\uFFFF]/g,\n                 function(aChar) { return \"\\\\uc0\\\\u\"+aChar.charCodeAt(0).toString()+\"{}\"; })\n        .split(\"\\t\").join(\"\\\\tab{}\");\n    },\n    \"@passthrough/true\": CSL.Output.Formatters.passthrough,\n    \"@font-style/italic\":\"{\\\\i{}%%STRING%%}\",\n    \"@font-style/normal\":\"{\\\\i0{}%%STRING%%}\",\n    \"@font-style/oblique\":\"{\\\\i{}%%STRING%%}\",\n    \"@font-variant/small-caps\":\"{\\\\scaps %%STRING%%}\",\n    \"@font-variant/normal\":\"{\\\\scaps0{}%%STRING%%}\",\n    \"@font-weight/bold\":\"{\\\\b{}%%STRING%%}\",\n    \"@font-weight/normal\":\"{\\\\b0{}%%STRING%%}\",\n    \"@font-weight/light\":false,\n    \"@text-decoration/none\":false,\n    \"@text-decoration/underline\":\"{\\\\ul{}%%STRING%%}\",\n    \"@vertical-align/baseline\":false,\n    \"@vertical-align/sup\":\"\\\\super %%STRING%%\\\\nosupersub{}\",\n    \"@vertical-align/sub\":\"\\\\sub %%STRING%%\\\\nosupersub{}\",\n    \"@strip-periods/true\": CSL.Output.Formatters.passthrough,\n    \"@strip-periods/false\": CSL.Output.Formatters.passthrough,\n    \"@quotes/true\": function (state, str) {\n        if (\"undefined\" === typeof str) {\n            return CSL.Output.Formats.rtf.text_escape(state.getTerm(\"open-quote\"));\n        }\n        return CSL.Output.Formats.rtf.text_escape(state.getTerm(\"open-quote\")) + str + CSL.Output.Formats.rtf.text_escape(state.getTerm(\"close-quote\"));\n    },\n    \"@quotes/inner\": function (state, str) {\n        if (\"undefined\" === typeof str) {\n            return CSL.Output.Formats.rtf.text_escape(\"\\u2019\");\n        }\n        return CSL.Output.Formats.rtf.text_escape(state.getTerm(\"open-inner-quote\")) + str + CSL.Output.Formats.rtf.text_escape(state.getTerm(\"close-inner-quote\"));\n    },\n    \"@quotes/false\": false,\n    \"bibstart\":\"{\\\\rtf \",\n    \"bibend\":\"}\",\n    \"@display/block\": \"\\\\line{}%%STRING%%\\\\line\\r\\n\",\n    \"@cite/entry\": function (state, str) {\n        // If wrapCitationEntry does not exist, cite/entry \n        // is not applied.\n\t\treturn state.sys.wrapCitationEntry(str, this.item_id, this.locator_txt, this.suffix_txt);\n\t},\n    \"@bibliography/entry\": function(state,str){\n        return str;\n    },\n    \"@display/left-margin\": function(state,str){\n        return str+\"\\\\tab \";\n    },\n    \"@display/right-inline\": function (state, str) {\n        return str+\"\\r\\n\";\n    },\n    \"@display/indent\": function (state, str) {\n        return \"\\n\\\\tab \"+str+\"\\\\line\\r\\n\";\n    },\n    \"@showid/true\": function (state, str) {\n        if (!state.tmp.just_looking && ! state.tmp.suppress_decorations) {\n            var prePunct = \"\";\n            if (str) {\n                var m = str.match(CSL.VARIABLE_WRAPPER_PREPUNCT_REX);\n                prePunct = m[1];\n                str = m[2];\n            }\n            var postPunct = \"\";\n            if (str && CSL.SWAPPING_PUNCTUATION.indexOf(str.slice(-1)) > -1) {\n                postPunct = str.slice(-1);\n                str = str.slice(0,-1);\n            }\n            return state.sys.variableWrapper(this.params, prePunct, str, postPunct);\n        } else {\n            return str;\n        }\n    },\n    \"@URL/true\": function (state, str) {\n        return str;\n    },\n    \"@DOI/true\": function (state, str) {\n        return str;\n    }\n};\n\n/*\n\n    This does not seem to work in Zotero plugins. For some reason the scope of the link does not\n    close when interpreted by the LibreOffice. Perhaps this creates a field within a field,\n    and that is not allowed?\n\n    \"@URL/true\": function (state, str) {\n        return \"\\\\field{\\\\*\\\\fldinst{HYPERLINK \\\"\" + str + \"\\\"}}{\\\\fldrslt{\"+ str +\"}}\";\n    },\n    \"@DOI/true\": function (state, str) {\n        return \"\\\\field{\\\\*\\\\fldinst{HYPERLINK \\\"https://doi.org/\" + str + \"\\\"}}{\\\\fldrslt{\"+ str +\"}}\";\n    }\n*/\n\n/**\n * AsciiDoc output specification.\n *\n * See http://asciidoc.org/ or https://asciidoctor.org/\n */\nCSL.Output.Formats.prototype.asciidoc = {\n    \"text_escape\": function (text) {\n        if (!text) {\n            text = \"\";\n        }\n        return text.replace(\"*\", \"pass:[*]\", \"g\")\n            .replace(\"_\", \"pass:[_]\", \"g\")\n            .replace(\"#\", \"pass:[#]\", \"g\")\n            .replace(\"^\", \"pass:[^]\", \"g\")\n            .replace(\"~\", \"pass:[~]\", \"g\")\n            .replace(\"[[\", \"pass:[[[]\", \"g\")\n            .replace(\"  \", \"&#160; \", \"g\")\n            .replace(CSL.SUPERSCRIPTS_REGEXP, function(aChar) {\n                return \"^\" + CSL.SUPERSCRIPTS[aChar] + \"^\";\n            });\n    },\n    \"bibstart\": \"\",\n    \"bibend\": \"\",\n    \"@passthrough/true\": CSL.Output.Formatters.passthrough,\n    \"@font-style/italic\": \"__%%STRING%%__\",\n    \"@font-style/oblique\": \"__%%STRING%%__\",\n    \"@font-style/normal\": false,\n    \"@font-variant/small-caps\": \"[small-caps]#%%STRING%%#\",\n    \"@font-variant/normal\": false,\n    \"@font-weight/bold\": \"**%%STRING%%**\",\n    \"@font-weight/normal\": false,\n    \"@font-weight/light\": false,\n    \"@text-decoration/none\": false,\n    \"@text-decoration/underline\": \"[underline]##%%STRING%%##\",\n    \"@vertical-align/sup\": \"^^%%STRING%%^^\",\n    \"@vertical-align/sub\": \"~~%%STRING%%~~\",\n    \"@vertical-align/baseline\": false,\n    \"@strip-periods/true\": CSL.Output.Formatters.passthrough,\n    \"@strip-periods/false\": CSL.Output.Formatters.passthrough,\n    \"@quotes/true\": function (state, str) {\n        if (\"undefined\" === typeof str) {\n            return \"``\";\n        }\n        return \"``\" + str + \"''\";\n    },\n    \"@quotes/inner\": function (state, str) {\n        if (\"undefined\" === typeof str) {\n            return \"`\";\n        }\n        return \"`\" + str + \"'\";\n    },\n    \"@quotes/false\": false,\n    \"@cite/entry\": function (state, str) {\n        // if wrapCitationEntry does not exist, cite/entry is not applied\n        return state.sys.wrapCitationEntry(str, this.item_id, this.locator_txt, this.suffix_txt);\n    },\n    \"@bibliography/entry\": function (state, str) {\n        return str + \"\\n\";\n    },\n    \"@display/block\": function (state, str) {\n        return str;\n    },\n    \"@display/left-margin\": function (state, str) {\n        return str;\n    },\n    \"@display/right-inline\": function (state, str) {\n        return \" \" + str;\n    },\n    \"@display/indent\": function (state, str) {\n        return \" \" + str;\n    },\n    \"@showid/true\": function (state, str) {\n        if (!state.tmp.just_looking && !state.tmp.suppress_decorations && this.params && \"string\" === typeof str) {\n            var prePunct = \"\";\n            if (str) {\n                var m = str.match(CSL.VARIABLE_WRAPPER_PREPUNCT_REX);\n                prePunct = m[1];\n                str = m[2];\n            }\n            var postPunct = \"\";\n            if (str && CSL.SWAPPING_PUNCTUATION.indexOf(str.slice(-1)) > -1) {\n                postPunct = str.slice(-1);\n                str = str.slice(0,-1);\n            }\n            return state.sys.variableWrapper(this.params, prePunct, str, postPunct);\n        } else {\n            return str;\n        }\n    },\n    \"@URL/true\": function (state, str) {\n        // AsciiDoc renders URLs automatically as links\n        return str;\n    },\n    \"@DOI/true\": function (state, str) {\n        var doiurl = str;\n        if (!str.match(/^https?:\\/\\//)) {\n            doiurl = \"https://doi.org/\" + str;\n        }\n        return doiurl + \"[\" + str + \"]\";\n    }\n};\n\n/**\n * Output specification for XSL-FO (Extensible Stylesheet\n * Language - Formatting Objects)\n *\n * See https://www.w3.org/TR/xsl11/#fo-section\n */\nCSL.Output.Formats.prototype.fo = {\n    \"text_escape\": function (text) {\n        if (!text) {\n            text = \"\";\n        }\n        return text.replace(/&/g, \"&#38;\")\n            .replace(/</g, \"&#60;\")\n            .replace(/>/g, \"&#62;\")\n            .replace(\"  \", \"&#160; \", \"g\")\n            .replace(CSL.SUPERSCRIPTS_REGEXP, function(aChar) {\n                return \"<fo:inline vertical-align=\\\"super\\\">\" + CSL.SUPERSCRIPTS[aChar] + \"</fo:inline>\";\n            });\n    },\n    \"bibstart\": \"\",\n    \"bibend\": \"\",\n    \"@passthrough/true\": CSL.Output.Formatters.passthrough,\n    \"@font-style/italic\": \"<fo:inline font-style=\\\"italic\\\">%%STRING%%</fo:inline>\",\n    \"@font-style/oblique\": \"<fo:inline font-style=\\\"oblique\\\">%%STRING%%</fo:inline>\",\n    \"@font-style/normal\": \"<fo:inline font-style=\\\"normal\\\">%%STRING%%</fo:inline>\",\n    \"@font-variant/small-caps\": \"<fo:inline font-variant=\\\"small-caps\\\">%%STRING%%</fo:inline>\",\n    \"@font-variant/normal\": \"<fo:inline font-variant=\\\"normal\\\">%%STRING%%</fo:inline>\",\n    \"@font-weight/bold\": \"<fo:inline font-weight=\\\"bold\\\">%%STRING%%</fo:inline>\",\n    \"@font-weight/normal\": \"<fo:inline font-weight=\\\"normal\\\">%%STRING%%</fo:inline>\",\n    \"@font-weight/light\": \"<fo:inline font-weight=\\\"lighter\\\">%%STRING%%</fo:inline>\",\n    \"@text-decoration/none\": \"<fo:inline text-decoration=\\\"none\\\">%%STRING%%</fo:inline>\",\n    \"@text-decoration/underline\": \"<fo:inline text-decoration=\\\"underline\\\">%%STRING%%</fo:inline>\",\n    \"@vertical-align/sup\": \"<fo:inline vertical-align=\\\"super\\\">%%STRING%%</fo:inline>\",\n    \"@vertical-align/sub\": \"<fo:inline vertical-align=\\\"sub\\\">%%STRING%%</fo:inline>\",\n    \"@vertical-align/baseline\": \"<fo:inline vertical-align=\\\"baseline\\\">%%STRING%%</fo:inline>\",\n    \"@strip-periods/true\": CSL.Output.Formatters.passthrough,\n    \"@strip-periods/false\": CSL.Output.Formatters.passthrough,\n    \"@quotes/true\": function (state, str) {\n        if (\"undefined\" === typeof str) {\n            return state.getTerm(\"open-quote\");\n        }\n        return state.getTerm(\"open-quote\") + str + state.getTerm(\"close-quote\");\n    },\n    \"@quotes/inner\": function (state, str) {\n        if (\"undefined\" === typeof str) {\n            return \"\\u2019\";\n        }\n        return state.getTerm(\"open-inner-quote\") + str + state.getTerm(\"close-inner-quote\");\n    },\n    \"@quotes/false\": false,\n    \"@cite/entry\": function (state, str) {\n        return state.sys.wrapCitationEntry(str, this.item_id, this.locator_txt, this.suffix_txt);\n    },\n    \"@bibliography/entry\": function (state, str) {\n        var indent = \"\";\n        if (state.bibliography && state.bibliography.opt && state.bibliography.opt.hangingindent) {\n            var hi = state.bibliography.opt.hangingindent;\n            indent = \" start-indent=\\\"\" + hi +\"em\\\" text-indent=\\\"-\" + hi + \"em\\\"\";\n        }\n        var insert = \"\";\n        if (state.sys.embedBibliographyEntry) {\n            insert = state.sys.embedBibliographyEntry(this.item_id) + \"\\n\";\n        }\n        return \"<fo:block id=\\\"\" + this.system_id + \"\\\"\" + indent + \">\" + str + \"</fo:block>\\n\" + insert;\n    },\n    \"@display/block\": function (state, str) {\n        return \"\\n  <fo:block>\" + str + \"</fo:block>\\n\";\n    },\n    \"@display/left-margin\": function (state, str) {\n        return \"\\n  <fo:table table-layout=\\\"fixed\\\" width=\\\"100%\\\">\\n    \" +\n                \"<fo:table-column column-number=\\\"1\\\" column-width=\\\"$$$__COLUMN_WIDTH_1__$$$\\\"/>\\n    \" +\n                \"<fo:table-column column-number=\\\"2\\\" column-width=\\\"proportional-column-width(1)\\\"/>\\n    \" +\n                \"<fo:table-body>\\n      \" +\n                    \"<fo:table-row>\\n        \" +\n                        \"<fo:table-cell>\\n          \" +\n                            \"<fo:block>\" + str + \"</fo:block>\\n        \" +\n                        \"</fo:table-cell>\\n        \";\n    },\n    \"@display/right-inline\": function (state, str) {\n        return \"<fo:table-cell>\\n          \" +\n                \"<fo:block>\" + str + \"</fo:block>\\n        \" +\n            \"</fo:table-cell>\\n      \" +\n            \"</fo:table-row>\\n    \" +\n            \"</fo:table-body>\\n  \" +\n            \"</fo:table>\\n\";\n    },\n    \"@display/indent\": function (state, str) {\n        return \"<fo:block margin-left=\\\"2em\\\">\" + str + \"</fo:block>\\n\";\n    },\n    \"@showid/true\": function (state, str) {\n        if (!state.tmp.just_looking && !state.tmp.suppress_decorations && this.params && \"string\" === typeof str) {\n            var prePunct = \"\";\n            if (str) {\n                var m = str.match(CSL.VARIABLE_WRAPPER_PREPUNCT_REX);\n                prePunct = m[1];\n                str = m[2];\n            }\n            var postPunct = \"\";\n            if (str && CSL.SWAPPING_PUNCTUATION.indexOf(str.slice(-1)) > -1) {\n                postPunct = str.slice(-1);\n                str = str.slice(0,-1);\n            }\n            return state.sys.variableWrapper(this.params, prePunct, str, postPunct);\n        } else {\n            return str;\n        }\n    },\n    \"@URL/true\": function (state, str) {\n        return \"<fo:basic-link external-destination=\\\"url('\" + str + \"')\\\">\" + str + \"</fo:basic-link>\";\n    },\n    \"@DOI/true\": function (state, str) {\n        var doiurl = str;\n        if (!str.match(/^https?:\\/\\//)) {\n            doiurl = \"https://doi.org/\" + str;\n        }\n        return \"<fo:basic-link external-destination=\\\"url('\" + doiurl + \"')\\\">\" + str + \"</fo:basic-link>\";\n    }\n};\n\n/**\n * LaTeX .bbl output.\n *\n * (Code contributed by Egon Willighagen, based on the prototype.text code.)\n */\nCSL.Output.Formats.prototype.latex = {\n    \"text_escape\": function (text) {\n        if (!text) {\n            text = \"\";\n        }\n        return text;\n    },\n    \"bibstart\": \"\\\\begin{thebibliography}{4}\",\n    \"bibend\": \"\\\\end{thebibliography}\",\n    \"@font-style/italic\": \"{\\\\em %%STRING%%}\",\n    \"@font-style/oblique\": false,\n    \"@font-style/normal\": false,\n    \"@font-variant/small-caps\": false,\n    \"@passthrough/true\": CSL.Output.Formatters.passthrough,\n    \"@font-variant/normal\": false,\n    \"@font-weight/bold\": \"{\\\\bf %%STRING%%}\",\n    \"@font-weight/normal\": false,\n    \"@font-weight/light\": false,\n    \"@text-decoration/none\": false,\n    \"@text-decoration/underline\": false,\n    \"@vertical-align/baseline\": false,\n    \"@vertical-align/sup\": false,\n    \"@vertical-align/sub\": false,\n    \"@strip-periods/true\": CSL.Output.Formatters.passthrough,\n    \"@strip-periods/false\": CSL.Output.Formatters.passthrough,\n    \"@quotes/true\": function (state, str) {\n        if (\"undefined\" === typeof str) {\n            return state.getTerm(\"open-quote\");\n        }\n        return state.getTerm(\"open-quote\") + str + state.getTerm(\"close-quote\");\n    },\n    \"@quotes/inner\": function (state, str) {\n        if (\"undefined\" === typeof str) {\n            //\n            // Mostly right by being wrong (for apostrophes)\n            //\n            return \"\\u2019\";\n        }\n        return state.getTerm(\"open-inner-quote\") + str + state.getTerm(\"close-inner-quote\");\n    },\n    \"@quotes/false\": false,\n    //\"@bibliography/body\": function (state,str){\n    //    return \"<div class=\\\"csl-bib-body\\\">\\n\"+str+\"</div>\";\n    //},\n    \"@cite/entry\": function (state, str) {\n\t\treturn state.sys.wrapCitationEntry(str, this.item_id, this.locator_txt, this.suffix_txt);\n\t},\n    \"@bibliography/entry\": function (state, str) {\n        return \"\\\\bibitem{\" + state.sys.embedBibliographyEntry(this.item_id) + \"}\\n\";\n    },\n    \"@display/block\": function (state, str) {\n        return \"\\n\"+str;\n    },\n    \"@display/left-margin\": function (state, str) {\n        return str;\n    },\n    \"@display/right-inline\": function (state, str) {\n        return str;\n    },\n    \"@display/indent\": function (state, str) {\n        return \"\\n    \"+str;\n    },\n    \"@showid/true\": function (state, str, cslid) {\n        return str;\n    },\n    \"@URL/true\": function (state, str) {\n        return str;\n    },\n    \"@DOI/true\": function (state, str) {\n        return str;\n    }\n};\n\nCSL.Output.Formats = new CSL.Output.Formats();\n\n/*global CSL: true */\n\n\n//\n// Time for a rewrite of this module.\n//\n// Simon has pointed out that list and hash behavior can\n// be obtained by ... just using a list and a hash.  This\n// is faster for batched operations, because sorting is\n// greatly optimized.  Since most of the interaction\n// with plugins at runtime will involve batches of\n// references, there will be solid gains if the current,\n// one-reference-at-a-time approach implemented here\n// can be replaced with something that leverages the native\n// sort method of the Array() type.\n//\n// That's going to take some redesign, but it will simplify\n// things in the long run, so it might as well happen now.\n//\n// We'll keep makeCitationCluster and makeBibliography as\n// simple methods that return a string.  Neither should\n// have any effect on internal state.  This will be a change\n// in behavior for makeCitationCluster.\n//\n// A new updateItems command will be introduced, to replace\n// insertItems.  It will be a simple list of IDs, in the\n// sequence of first reference in the document.\n//\n// The calling application should always invoke updateItems\n// before makeCitationCluster.\n//\n\n//\n// should allow batched registration of items by\n// key.  should behave as an update, with deletion\n// of items and the tainting of disambiguation\n// partner sets affected by a deletes and additions.\n//\n//\n// we'll need a reset method, to clear the decks\n// in the citation area and start over.\n\n/**\n * Registry of cited items.\n * <p>This is a persistent store of disambiguation and\n * sort order information relating to individual items\n * for which rendering is requested.  Item data is stored\n * in a hash, with the item key as hash key, for quick\n * retrieval.  A virtual sequence within the hashed store\n * is maintained on the fly as items are added to the\n * store, using <code>*_next</code> and <code>*_prev</code>\n * attributes on each item.  A separate hash of items\n * based on their undisambiguated cite form is\n * maintained, and the item id list and disambiguation\n * level for each set of disambiguation partners is shared\n * through the registry item.</p>\n * @class\n */\nCSL.Registry = function (state) {\n    this.debug = false;\n    this.state = state;\n    this.registry = {};\n    this.reflist = [];\n    this.refhash = {};\n    this.namereg = new CSL.Registry.NameReg(state);\n    this.citationreg = new CSL.Registry.CitationReg(state);\n    // See CSL.NameOutput.prototype.outputNames\n    // and CSL.Registry.prototype.doinserts\n    this.authorstrings = {};\n    \n    // for parallel delimiter support\n    this.masterMap = {};\n    \n    //\n    // shared scratch vars\n    this.mylist = [];\n    this.myhash = {};\n    this.deletes = [];\n    this.inserts = [];\n    this.uncited = {};\n    this.refreshes = {};\n    this.akeys = {};\n    this.oldseq = {};\n    this.return_data = {};\n    //\n    // each ambig is a list of the ids of other objects\n    // that have the same base-level rendering\n    this.ambigcites = {};\n    this.ambigresets = {};\n    this.sorter = new CSL.Registry.Comparifier(state, \"bibliography_sort\");\n    //this.modes = CSL.getModes.call(this.state);\n    //this.checkerator = new CSL.Checkerator();\n\n    this.getSortedIds = function () {\n        var ret = [];\n        for (var i = 0, ilen = this.reflist.length; i < ilen; i += 1) {\n            ret.push(\"\" + this.reflist[i].id);\n        }\n        return ret;\n    };\n\n    this.getSortedRegistryItems = function () {\n        var ret = [];\n        for (var i = 0, ilen = this.reflist.length; i < ilen; i += 1) {\n            ret.push(this.reflist[i]);\n        }\n        return ret;\n    };\n};\n\n//\n// Here's the sequence of operations to be performed on\n// update:\n//\n//  1.  (o) [init] Receive list as function argument, store as hash and as list.\n//  2.  (o) [init] Initialize refresh list.  Never needs sorting, only hash required.\n\n//  3.  (o) [dodeletes] Delete loop.\n//  3a. (o) [dodeletes] Delete names in items to be deleted from names reg.\n//  3b. (o) [dodeletes] Complement refreshes list with items affected by\n//      possible name changes.  We'll actually perform the refresh once\n//      all of the necessary data and parameters have been established\n//      in the registry.\n//  3c. (o) [dodeletes] Delete all items to be deleted from their disambig pools.\n//  3d. (o) [dodeletes] Delete all items in deletion list from hash.\n\n//  4.  (o) [doinserts] Insert loop.\n//  4a. (o) [doinserts] Retrieve entries for items to insert.\n//  4b. (o) [doinserts] Generate ambig key.\n//  4c. (o) [doinserts] Add names in items to be inserted to names reg\n//      (implicit in getAmbiguousCite).\n//  4d. (o) [doinserts] Record ambig pool key on akey list (used for updating further\n//      down the chain).\n//  4e. (o) [doinserts] Create registry token.\n//  4f. (o) [doinserts] Add item ID to hash.\n//  4g. (o) [doinserts] Set and record the base token to hold disambiguation\n//      results (\"disambig\" in the object above).\n//  5.  (o) [rebuildlist] Create \"new\" list of hash pointers, in the order given\n//          in the argument to the update function.\n//  6.  (o) [rebuildlist] Apply citation numbers to new list.\n//  7.  (o) [dorefreshes] Refresh items requiring update.\n\n\n\n//  5. (o) [delnames] Delete names in items to be deleted from names reg, and obtain IDs\n//         of other items that would be affected by changes around that surname.\n//  6. (o) [delnames] Complement delete and insert lists with items affected by\n//         possible name changes.\n//  7. (o) [delambigs] Delete all items to be deleted from their disambig pools.\n//  8. (o) [delhash] Delete all items in deletion list from hash.\n\n//  9. (o) [addtohash] Retrieve entries for items to insert.\n// 10. (o) [addtohash] Add items to be inserted to their disambig pools.\n// 11. (o) [addtohash] Add names in items to be inserted to names reg\n//         (implicit in getAmbiguousCite).\n// 12. (o) [addtohash] Create registry token for each item to be inserted.\n// 13. (o) [addtohash] Add items for insert to hash.\n\n// 14. (o) [buildlist] Create \"new\" list of hash pointers, in the order given in the argument\n//         to the update function.\n// 15. (o) [renumber] Apply citation numbers to new list.\n// 16. (o) [setdisambigs] Set disambiguation parameters on each inserted item token.\n// 17. (o) [setsortkeys] Set sort keys on each item token.\n// 18. (o) [sorttokens] Resort token list\n// 19. (o) [renumber] Reset citation numbers on list items\n//\n\nCSL.Registry.prototype.init = function (itemIDs, uncited_flag) {\n    var i, ilen;\n    this.oldseq = {};\n    //  1. Receive list as function argument, store as hash and as list.\n    //\n    // Result:\n    //   this.mylist: a list of all itemIDs of referenced items, cited and uncited.\n    //   this.myhash: a hash of index positions in this.mylist.\n    //   this.uncited: hash of uncited itemIDs.\n    //\n    // Proceed as follows.\n    //\n    if (uncited_flag) {\n        // If uncited_flag is non-nil, add any missing itemIDs to this.mylist\n        // from itemIDs input list, and set the itemIDs in itemIDs on this.uncited.\n        this.uncited = {};\n        for (var i=0,ilen=itemIDs.length;i<ilen; i += 1) {\n            if (!this.myhash[itemIDs[i]]) {\n                this.mylist.push(\"\" + itemIDs[i]);\n            }\n            this.uncited[itemIDs[i]] = true;\n            this.myhash[itemIDs[i]] = true;\n        }\n    } else {\n        // If uncited_flag is nil, remove duplicate itemIDs from itemIDs input\n        // list, set the result on this.mylist, and add missing itemIDs to\n        // this.mylist from itemIDs input list.\n        for (var key in this.uncited) {\n            itemIDs.push(key);\n        }\n        var myhash = {};\n        for (i=itemIDs.length-1;i>-1; i += -1) {\n            if (myhash[itemIDs[i]]) {\n                itemIDs = itemIDs.slice(0, i).concat(itemIDs.slice(i + 1));\n            } else {\n                myhash[itemIDs[i]] = true;\n            }\n        }\n        this.mylist = itemIDs;\n        this.myhash = myhash;\n    }\n    //\n    //  2. Initialize refresh list.  Never needs sorting, only hash required.\n    //\n    this.refreshes = {};\n    this.touched = {};\n    this.ambigsTouched = {};\n    this.ambigresets = {};\n};\n\nCSL.Registry.prototype.dopurge = function (myhash) {\n    // Remove any uncited items not in myhash\n    for (var i=this.mylist.length-1;i>-1;i+=-1) {\n        // Might not want to be quite this restrictive.\n        if (this.citationreg.citationsByItemId) {\n            if ((!this.citationreg.citationsByItemId || !this.citationreg.citationsByItemId[this.mylist[i]]) && !myhash[this.mylist[i]]) {\n                delete this.myhash[this.mylist[i]];\n                delete this.uncited[this.mylist[i]];\n                this.mylist = this.mylist.slice(0,i).concat(this.mylist.slice(i+1));\n            }\n        }\n    }\n    this.dodeletes(this.myhash);\n};\n\nCSL.Registry.prototype.dodeletes = function (myhash) {\n    var otheritems, key, ambig, pos, len, items, kkey, mypos, id;\n    if (\"string\" === typeof myhash) {\n        var key = myhash;\n        myhash = {};\n        myhash[key] = true;\n    }\n    //\n    //  3. Delete loop.\n    //\n    for (var key in this.registry) {\n        if (!myhash[key]) {\n            // skip items explicitly marked as uncited\n            if (this.uncited[key]) {\n                continue;\n            }\n            //\n            //  3a. Delete names in items to be deleted from names reg.\n            //\n            otheritems = this.namereg.delitems(key);\n            //\n            //  3b. Complement refreshes list with items affected by\n            //      possible name changes.  We'll actually perform the refresh once\n            //      all of the necessary data and parameters have been established\n            //      in the registry.\n            //\n            for (kkey in otheritems) {\n                this.refreshes[kkey] = true;\n            }\n            //\n            //  3c. Delete all items to be deleted from their disambig pools.\n            //\n            ambig = this.registry[key].ambig;\n            mypos = this.ambigcites[ambig].indexOf(key);\n            if (mypos > -1) {\n                items = this.ambigcites[ambig].slice();\n                this.ambigcites[ambig] = items.slice(0, mypos).concat(items.slice(mypos+1, items.length));\n                this.ambigresets[ambig] = this.ambigcites[ambig].length;\n            }\n            //\n            // XX. What we've missed is to provide an update of all\n            // items sharing the same ambig  += -1 the remaining items in\n            // ambigcites.  So let's do that here, just in case the\n            // names update above doesn't catch them all.\n            //\n            len = this.ambigcites[ambig].length;\n            for (pos = 0; pos < len; pos += 1) {\n                id = \"\" + this.ambigcites[ambig][pos];\n                this.refreshes[id] = true;\n            }\n            //\n            // 3d-0. Remove parallel id references and realign\n            // parallel ID refs.\n            //\n            if (this.registry[key].siblings) {\n                if (this.registry[key].siblings.length == 1) {\n                    var loneSiblingID = this.registry[key].siblings[0];\n                    if (this.registry[loneSiblingID].siblings) {\n                        this.registry[loneSiblingID].siblings.pop();\n                        this.registry[loneSiblingID].master = true;\n                        // this.registry[loneSiblingID].parallel = false;\n                    }\n                } else if (this.registry[key].siblings.length > 1) {\n                    var removeIDs = [key];\n                    if (this.registry[key].master) {\n                        var newmasterID = this.registry[key].siblings[0];\n                        var newmaster = this.registry[newmasterID];\n                        newmaster.master = true;\n                        // newmaster.parallel_delimiter is set externally, if at all\n                        // newmaster.parallel = false;\n                        removeIDs.push(newmasterID);\n                        // for (var k = 0, klen = this.registry[key].siblings.length; k < klen; k += 1) {\n                        //     this.registry[this.registry[key].siblings[k]].parallel = newmasterID;\n                        // }\n                    }\n                    var buffer = [];\n                    for (var k = this.registry[key].siblings.length - 1; k > -1; k += -1) {\n                        var siblingID = this.registry[key].siblings.pop();\n                        if (removeIDs.indexOf(siblingID) === -1) {\n                            buffer.push(siblingID);\n                        }\n                    }\n                    for (var k = buffer.length - 1; k > -1; k += -1) {\n                        this.registry[key].siblings.push(buffer[k]);\n                    }\n                }\n            }\n            //\n            // 3d-1. Remove item from reflist\n            for (var i=this.reflist.length-1;i>-1;i--) {\n                if (this.reflist[i].id === key) {\n                    this.reflist = this.reflist.slice(0, i).concat(this.reflist.slice(i+1));\n                }\n            }\n            //\n            //  3d. Delete all items in deletion list from hash.\n            //\n            delete this.registry[key];\n            delete this.refhash[key];\n\n            // For processCitationCluster()\n            this.return_data.bibchange = true;\n        }\n    }\n    // Disabled.  See formats.js for code.\n    // this.state.fun.decorate.items_delete( this.state.output[this.state.opt.mode].tmp, myhash );\n};\n\nCSL.Registry.prototype.doinserts = function (mylist) {\n    var item, Item, akey, newitem, abase, i, ilen;\n    if (\"string\" === typeof mylist) {\n        mylist = [mylist];\n    }\n    //\n    //  4. Insert loop.\n    //\n    for (var i = 0, ilen = mylist.length; i < ilen; i += 1) {\n        item = mylist[i];\n        if (!this.registry[item]) {\n            //\n            //  4a. Retrieve entries for items to insert.\n            //\n            Item = this.state.retrieveItem(item);\n\n            //\n            //  4b. Generate ambig key.\n            //\n            // AND\n            //\n            //  4c. Add names in items to be inserted to names reg\n            //      (implicit in getAmbiguousCite).\n            //\n            akey = CSL.getAmbiguousCite.call(this.state, Item);\n            this.ambigsTouched[akey] = true;\n            //\n            //  4d. Record ambig pool key on akey list (used for updating further\n            //      down the chain).\n            //\n            if (!Item.legislation_id) {\n                this.akeys[akey] = true;\n            }\n            //\n            //  4e. Create registry token.\n            //\n            newitem = {\n                \"id\": \"\" + item,\n                \"seq\": 0,\n                \"offset\": 0,\n                \"sortkeys\": false,\n                \"ambig\": false,\n                \"rendered\": false,\n                \"disambig\": false,\n                \"ref\": Item,\n                \"newItem\": true\n            };\n            //\n            //\n            //  4f. Add item ID to hash.\n            //\n            this.registry[item] = newitem;\n            //\n            //  4f(a). Add first reference note number\n            //         (this may be redundant)\n            if (this.citationreg.citationsByItemId && this.citationreg.citationsByItemId[item]) {\n                this.registry[item][\"first-reference-note-number\"] = this.citationreg.citationsByItemId[item][0].properties.noteIndex;\n            }\n\n            //\n            //  4g. Set and record the base token to hold disambiguation\n            //      results (\"disambig\" in the object above).\n            //\n            abase = CSL.getAmbigConfig.call(this.state);\n            this.registerAmbigToken(akey, item, abase);\n\n            //if (!this.ambigcites[akey]){\n            //    this.ambigcites[akey] = [];\n            //}\n            //CSL.debug(\"Run: \"+item+\"(\"+this.ambigcites[akey]+\")\");\n            //if (this.ambigcites[akey].indexOf(item) === -1){\n            //    CSL.debug(\"  Add: \"+item);\n            //    this.ambigcites[akey].push(item);\n            //}\n            //\n            //  4h. Make a note that this item needs its sort keys refreshed.\n            //\n            this.touched[item] = true;\n            // For processCitationCluster()\n            this.return_data.bibchange = true;\n        }\n    }\n    // Disabled.  See formats.js for code.\n    // this.state.fun.decorate.items_add( this.state.output[this.state.opt.mode].tmp, mylist );\n};\n\n/*\n// No longer required.\nCSL.Registry.prototype.douncited = function () {\n    var pos, len;\n    var cited_len = this.mylist.length - this.uncited.length;\n    for (pos = 0, len = cited_len; pos < len; pos += 1) {\n        this.registry[this.mylist[pos]].uncited = false;\n    }\n    for (pos = cited_len, len = this.mylist.length; pos < len; pos += 1) {\n        this.registry[this.mylist[pos]].uncited = true;\n    }\n};\n*/\n\nCSL.Registry.prototype.rebuildlist = function (nosort) {\n    var len, pos, item, Item;\n    //\n    //  5. Create \"new\" list of hash pointers, in the order given in the argument\n    //     to the update function.\n    //\n    //\n    // XXX Keep reflist in place.\n    //\n    if (!nosort) {\n        this.reflist_inserts = [];\n        //\n        //  6. Apply citation numbers to new list,\n        //     saving off old sequence numbers as we go.\n        //\n        // XXX Just memo inserts -- actual insert happens below, at last \"sort\"\n        //\n        len = this.mylist.length;\n        for (pos = 0; pos < len; pos += 1) {\n            item = this.mylist[pos];\n            Item = this.registry[item];\n            if (Item.newItem) {\n                this.reflist_inserts.push(Item);\n            }\n            this.oldseq[item] = this.registry[item].seq;\n            this.registry[item].seq = (pos + 1);\n        }\n    } else {\n        this.reflist = [];\n        len = this.mylist.length;\n        for (pos = 0; pos < len; pos += 1) {\n            item = this.mylist[pos];\n            Item = this.registry[item];\n            this.reflist.push(Item);\n            this.oldseq[item] = this.registry[item].seq;\n            this.registry[item].seq = (pos + 1);\n        }\n    }\n};\n\n/*\n * Okay, at this point we should have a numbered list\n * of registry tokens in the notional order requested,\n * with sequence numbers to reconstruct the ordering\n * if the list is remangled.  So far so good.\n */\n\nCSL.Registry.prototype.dorefreshes = function () {\n    var key, regtoken, Item, akey, abase;\n    //\n    //  7. Refresh items requiring update.\n    //\n    // It looks like we need to do four things on each cite for refresh:\n    // (1) Generate the akey for the cite.\n    // (2) Register it on the ambig token.\n    // (3) Register the akey in this.akeys\n    // (4) Register the item ID in this.touched\n    //\n    for (var key in this.refreshes) {\n        regtoken = this.registry[key];\n        if (!regtoken) {\n            continue;\n        }\n        regtoken.sortkeys = undefined;\n        Item = this.state.refetchItem(key);\n        var akey = regtoken.ambig;\n\n        if (\"undefined\" === typeof akey) {\n            this.state.tmp.disambig_settings = false;\n            akey = CSL.getAmbiguousCite.call(this.state, Item);\n            abase = CSL.getAmbigConfig.call(this.state);\n            this.registerAmbigToken(akey, key, abase);\n        }\n        for (var akkey in this.ambigresets) {\n            if (this.ambigresets[akkey] === 1) {\n                var loneKey = this.ambigcites[akey][0];\n                var Item = this.state.refetchItem(loneKey);\n                this.registry[loneKey].disambig = new CSL.AmbigConfig();\n                this.state.tmp.disambig_settings = false;\n                var akey = CSL.getAmbiguousCite.call(this.state, Item);\n                var abase = CSL.getAmbigConfig.call(this.state);\n                this.registerAmbigToken(akey, loneKey, abase);\n            }\n        }\n        this.state.tmp.taintedItemIDs[key] = true;\n        this.ambigsTouched[akey] = true;\n        if (!Item.legislation_id) {\n            this.akeys[akey] = true;\n        }\n        this.touched[key] = true;\n    }\n};\n\n/*\n * Main disambiguation  += -1 can everything for disambiguation be\n * crunched into this function?\n */\nCSL.Registry.prototype.setdisambigs = function () {\n    //\n    // Okay, more changes.  Here is where we resolve all disambiguation\n    // issues for cites touched by the update.  The this.ambigcites set is\n    // based on the complete short form of citations, and is the basis on\n    // which names are added and minimal adding of initials or given names\n    // is performed.\n    //\n\n    //\n    //  8.  Set disambiguation parameters on each inserted item token.\n    //\n    for (var akey in this.ambigsTouched) {\n        //\n        // Disambiguation is fully encapsulated.\n        // Disambiguator will run only if there are multiple\n        // items, and at least one disambiguation mode is\n        // in effect.\n        this.state.disambiguate.run(akey);\n    }\n    this.ambigsTouched = {};\n    this.akeys = {};\n};\n\n\n\nCSL.Registry.prototype.renumber = function () {\n    var len, pos, item;\n    //\n    // 19. Reset citation numbers on list items\n    //\n    if (this.state.bibliography_sort.opt.citation_number_sort_direction === CSL.DESCENDING) {\n        this.state.bibliography_sort.tmp.citation_number_map = {};\n    }\n    len = this.reflist.length;\n    for (pos = 0; pos < len; pos += 1) {\n        item = this.reflist[pos];\n        // save the overhead of rerenderings if citation-number is not\n        // used in the style.\n        item.seq = (pos + 1);\n        if (this.state.bibliography_sort.opt.citation_number_sort_direction === CSL.DESCENDING) {\n            this.state.bibliography_sort.tmp.citation_number_map[item.seq] = (this.reflist.length - item.seq + 1);\n        }\n        // update_mode is set to CSL.NUMERIC if citation-number is rendered\n        // in citations.\n        if (this.state.opt.update_mode === CSL.NUMERIC && item.seq != this.oldseq[item.id]) {\n            this.state.tmp.taintedItemIDs[item.id] = true;\n        }\n        if (item.seq != this.oldseq[item.id]) {\n            this.return_data.bibchange = true;\n        }\n    }\n};\n\nCSL.Registry.prototype.setsortkeys = function () {\n    var key;\n    //\n    // 17. Set sort keys on each item token.\n    //\n    for (var i = 0, ilen = this.mylist.length; i < ilen; i += 1) {\n        var key = this.mylist[i];\n        // The last of these conditions may create some thrashing on styles that do not require sorting.\n        if (this.touched[key] || this.state.tmp.taintedItemIDs[key] || !this.registry[key].sortkeys) {\n            this.registry[key].sortkeys = CSL.getSortKeys.call(this.state, this.state.retrieveItem(key), \"bibliography_sort\");\n        }\n    }\n};\n\nCSL.Registry.prototype._insertItem = function(element, array) {\n    array.splice(this._locationOf(element, array) + 1, 0, element);\n    return array;\n};\n\nCSL.Registry.prototype._locationOf = function(element, array, start, end) {\n    if (array.length === 0) {\n        return -1;\n    }\n    start = start || 0;\n    end = end || array.length;\n    var pivot = (start + end) >> 1;  // should be faster than dividing by 2\n    \n    var c = this.sorter.compareKeys(element, array[pivot]);\n    if (end - start <= 1) {\n        return c == -1 ? pivot - 1 : pivot;\n    }\n    switch (c) {\n        case -1: return this._locationOf(element, array, start, pivot);\n        case 0: return pivot;\n        case 1: return this._locationOf(element, array, pivot, end);\n    }\n};\n\nCSL.Registry.prototype.sorttokens = function (nosort) {\n    var len, item, Item, pos;\n    //\n    // 18. Resort token list.\n    //\n    if (!nosort) {\n        this.reflist_inserts = [];\n        len = this.mylist.length;\n        for (pos = 0; pos < len; pos += 1) {\n            item = this.mylist[pos];\n            Item = this.registry[item];\n            if (Item.newItem) {\n                this.reflist_inserts.push(Item);\n            }\n        }\n        // There is a thin possibility that tainted items in a sorted list\n        // will change position due to disambiguation. We cover for that here.\n        for (var key in this.state.tmp.taintedItemIDs) {\n            if (this.registry[key] && !this.registry[key].newItem) {\n                // Move tainted items from reflist to reflist_inserts\n                for (var i=this.reflist.length-1;i>-1;i--) {\n                    if (this.reflist[i].id === key) {\n                        this.reflist_inserts.push(this.reflist[i]);\n                        this.reflist = this.reflist.slice(0, i).concat(this.reflist.slice(i+1));\n                    }\n                }\n            }\n        }\n        for (var i=0,ilen=this.reflist_inserts.length;i<ilen;i++) {\n            var Item = this.reflist_inserts[i];\n            delete Item.newItem;\n            this.reflist = this._insertItem(Item, this.reflist);\n        }\n        for (pos = 0; pos < len; pos += 1) {\n            item = this.mylist[pos];\n            Item = this.registry[item];\n            this.registry[item].seq = (pos + 1);\n        }\n    }\n};\n\n/**\n * Compare two sort keys\n * <p>Nested, because keys are an array.</p>\n */\nCSL.Registry.Comparifier = function (state, keyset) {\n    var sort_directions, len, pos, compareKeys;\n    var sortCompare = CSL.getSortCompare.call(state, state.opt[\"default-locale-sort\"]);\n    sort_directions = state[keyset].opt.sort_directions;\n    this.compareKeys = function (a, b) {\n        len = a.sortkeys ? a.sortkeys.length : 0;\n        for (pos = 0; pos < len; pos += 1) {\n            //\n            // for ascending sort 1 uses 1, -1 uses -1.\n            // For descending sort, the values are reversed.\n            //\n            // Need to handle undefined values.  No way around it.\n            // So have to screen .localeCompare (which is also\n            // needed) from undefined values.  Everywhere, in all\n            // compares.\n            //\n            var cmp = 0;\n            if (a.sortkeys[pos] === b.sortkeys[pos]) {\n                cmp = 0;\n            } else if (\"undefined\" === typeof a.sortkeys[pos]) {\n                cmp = sort_directions[pos][1];\n            } else if (\"undefined\" === typeof b.sortkeys[pos]) {\n                cmp = sort_directions[pos][0];\n            } else {\n                // cmp = a.sortkeys[pos].localeCompare(b.sortkeys[pos]);\n                cmp = sortCompare(a.sortkeys[pos], b.sortkeys[pos]);\n            }\n            if (0 < cmp) {\n                return sort_directions[pos][1];\n            } else if (0 > cmp) {\n                return sort_directions[pos][0];\n            }\n        }\n        if (a.seq > b.seq) {\n            return 1;\n        } else if (a.seq < b.seq) {\n            return -1;\n        }\n        return 0;\n    };\n    compareKeys = this.compareKeys;\n    this.compareCompositeKeys = function (a, b) {\n        return compareKeys(a[1], b[1]);\n    };\n};\n\n\n/**\n * Compare two disambiguation tokens by their registry sort order\n * <p>Disambiguation lists need to be sorted this way, to\n * obtain the correct year-suffix when that's used.</p>\n */\nCSL.Registry.prototype.compareRegistryTokens = function (a, b) {\n    if (a.seq > b.seq) {\n        return 1;\n    } else if (a.seq < b.seq) {\n        return -1;\n    }\n    return 0;\n};\n\nCSL.Registry.prototype.registerAmbigToken = function (akey, id, ambig_config) {\n    //SNIP-START\n    if (!this.registry[id]) {\n        CSL.debug(\"Warning: unregistered item: itemID=(\"+id+\"), akey=(\"+akey+\")\");\n    }\n    //SNIP-END\n    // Taint if number of names to be included has changed\n    if (this.registry[id] && this.registry[id].disambig && this.registry[id].disambig.names) {\n        for (var i = 0, ilen = ambig_config.names.length; i < ilen; i += 1) {\n            var new_names_params = ambig_config.names[i];\n            var old_names_params = this.registry[id].disambig.names[i];\n            if (new_names_params !== old_names_params) {\n                this.state.tmp.taintedItemIDs[id] = true;\n            } else if (ambig_config.givens[i]) {\n                // Compare givenses only if the number of names is aligned.\n                for (var j=0,jlen=ambig_config.givens[i].length;j<jlen;j+=1) {\n                    var new_gnames_params = ambig_config.givens[i][j];\n                    var old_gnames_params = this.registry[id].disambig.givens[i][j];\n                    if (new_gnames_params !== old_gnames_params) {\n                        this.state.tmp.taintedItemIDs[id] = true;\n                    }\n                }\n            }\n        }\n    }\n\n    if (!this.ambigcites[akey]) {\n        this.ambigcites[akey] = [];\n    }\n    if (this.ambigcites[akey].indexOf(\"\" + id) === -1) {\n        this.ambigcites[akey].push(\"\" + id);\n    }\n    this.registry[id].ambig = akey;\n    this.registry[id].disambig = CSL.cloneAmbigConfig(ambig_config);\n};\n\n\n/**\n * Get the sort key of an item, without decorations\n * <p>This is used internally by the Registry.</p>\n */\nCSL.getSortKeys = function (Item, key_type) {\n    var area, root, extension, strip_prepositions, len, pos;\n    //SNIP-START\n    if (false) {\n        CSL.debug(\"KEY TYPE: \" + key_type);\n    }\n    //SNIP-END\n    area = this.tmp.area;\n    root = this.tmp.root;\n    extension = this.tmp.extension;\n    strip_prepositions = CSL.Util.Sort.strip_prepositions;\n    this.tmp.area = key_type;\n    // Gawdawful, this.\n    this.tmp.root = key_type.indexOf(\"_\") > -1 ? key_type.slice(0,-5) : key_type;\n    this.tmp.extension = \"_sort\";\n    this.tmp.disambig_override = true;\n    this.tmp.disambig_request = false;\n    this.tmp.suppress_decorations = true;\n    CSL.getCite.call(this, Item);\n    this.tmp.suppress_decorations = false;\n    this.tmp.disambig_override = false;\n    len = this[key_type].keys.length;\n    for (pos = 0; pos < len; pos += 1) {\n        this[key_type].keys[pos] = strip_prepositions(this[key_type].keys[pos]);\n    }\n    //SNIP-START\n    if (false) {\n        CSL.debug(\"sort keys (\" + key_type + \"): \" + this[key_type].keys);\n    }\n    //SNIP-END\n    \n    this.tmp.area = area;\n    this.tmp.root = root;\n    this.tmp.extension = extension;\n    return this[key_type].keys;\n};\n\n\n/*global CSL: true */\n\nCSL.Registry.NameReg = function (state) {\n    var pkey, ikey, skey, dagopt, gdropt, items, strip_periods, set_keys, evalname, delitems, addname, myitems;\n    this.state = state;\n    this.namereg = {};\n    this.nameind = {};\n    // used for restoring state following preview\n    this.nameindpkeys = {};\n    //\n    // family, initials form, fullname (with given stripped of periods)\n    //\n    // keys registered, indexed by ID\n    this.itemkeyreg = {};\n\n    strip_periods = function (str) {\n        if (!str) {\n            str = \"\";\n        }\n        return str.replace(/\\./g, \" \").replace(/\\s+/g, \" \").replace(/\\s+$/,\"\");\n    };\n\n    set_keys = function (state, itemid, nameobj) {\n        pkey = strip_periods(nameobj.family);\n\n        if (state.opt[\"demote-non-dropping-particle\"] === \"never\" && nameobj[\"non-dropping-particle\"] && nameobj[\"family\"]) {\n            pkey = `${pkey} ${nameobj[\"non-dropping-particle\"]}`;\n        }\n        \n        skey = strip_periods(nameobj.given);\n        // Drop lowercase suffixes (such as et al.) from given name field\n        // for disambiguation purposes.\n        var m = skey.match(/[,\\!]* ([^,]+)$/);\n        if (m && m[1] === m[1].toLowerCase()) {\n            skey = skey.replace(/[,\\!]* [^,]+$/, \"\");\n        }\n        // The %s terminator enables normal initialization behavior\n        // with non-Byzantine names.\n        ikey = CSL.Util.Names.initializeWith(state, skey, \"%s\");\n        if (state.citation.opt[\"givenname-disambiguation-rule\"] === \"by-cite\") {\n            pkey = \"\" + itemid + pkey;\n        }\n    };\n\n    evalname = function (item_id, nameobj, namenum, request_base, form, initials) {\n        var param;\n        // XXX THIS CAN NO LONGER HAPPEN\n        if (state.tmp.area.slice(0, 12) === \"bibliography\" && !form) {\n            if (\"string\" === typeof initials) {\n                return 1;\n            } else {\n                return 2;\n            }\n        }\n        var res = state.nameOutput.getName(nameobj, \"locale-translit\", true);\n        nameobj = res.name;\n        set_keys(this.state, \"\" + item_id, nameobj);\n        //\n        // possible options are:\n        //\n        // <option disambiguate-add-givenname value=\"true\"/> (a)\n        // <option disambiguate-add-givenname value=\"all-names\"/> (a)\n        // <option disambiguate-add-givenname value=\"all-names-with-initials\"/> (b)\n        // <option disambiguate-add-givenname value=\"primary-name\"/> (d)\n        // <option disambiguate-add-givenname value=\"primary-name-with-initials\"/> (e)\n        // <option disambiguate-add-givenname value=\"by-cite\"/> (g)\n        //\n        param = 2;\n        dagopt = state.opt[\"disambiguate-add-givenname\"];\n        gdropt = state.citation.opt[\"givenname-disambiguation-rule\"];\n        var gdropt_orig = gdropt;\n        if (gdropt === \"by-cite\") {\n            gdropt = \"all-names\";\n        }\n        //\n        // set initial value\n        //\n        if (\"short\" === form) {\n            param = 0;\n        } else if (\"string\" === typeof initials) {\n            param = 1;\n        }\n        //\n        // give literals a pass\n        if (\"undefined\" === typeof this.namereg[pkey] || \"undefined\" === typeof this.namereg[pkey].ikey[ikey]) {\n            return param;\n        }\n        //\n        // adjust value upward if appropriate -- only if running\n        // a non-names-global disambiguation strategy\n        //\n        if (gdropt_orig === \"by-cite\" && param <= request_base) {\n            //param = request_base;\n            return request_base;\n        }\n        if (!dagopt) {\n            return param;\n        }\n        if (\"string\" === typeof gdropt && gdropt.slice(0, 12) === \"primary-name\" && namenum > 0) {\n            return param;\n        }\n        //\n        // the last composite condition is for backward compatibility\n        //\n        if (!gdropt || gdropt === \"all-names\" || gdropt === \"primary-name\") {\n            if (this.namereg[pkey].count > 1) {\n                param = 1;\n            }\n            if ((this.namereg[pkey].ikey \n                 && this.namereg[pkey].ikey[ikey].count > 1)\n                || (this.namereg[pkey].count > 1 \n                    && \"string\" !== typeof initials)) {\n\n                param = 2;\n            }\n        } else if (gdropt === \"all-names-with-initials\" || gdropt === \"primary-name-with-initials\") {\n            if (this.namereg[pkey].count > 1) {\n                param = 1;\n            } else {\n                param = 0;\n            }\n        }\n        if (!state.registry.registry[item_id]) {\n            if (form == \"short\") {\n                return 0;\n            } else if (\"string\" == typeof initials) {\n                return 1;\n            }\n        } else {\n            return param;\n        }\n    };\n\n    //\n    // The operation of this function does not show up in the\n    // standard test suite, but it has been hand-tested with\n    // a print trace, and seems to work okay.\n    //\n    delitems = function (ids) {\n        var pos, len, posB, id, fullkey;\n        if (\"string\" === typeof ids || \"number\" === typeof ids) {\n            ids = [\"\" + ids];\n        }\n        // ret carries the IDs of other items using this name.\n        var ret = {};\n        len = ids.length;\n        for (pos = 0; pos < len; pos += 1) {\n            id = \"\" + ids[pos];\n            if (!this.nameind[id]) {\n                continue;\n            }\n            for (fullkey in this.nameind[id]) {\n                if (this.nameind[id].hasOwnProperty(fullkey)) {\n                    var key = fullkey.split(\"::\");\n                    pkey = key[0];\n                    ikey = key[1];\n                    skey = key[2];\n                    // Skip names that have been deleted already.\n                    // Needed to clear integration DisambiguateAddGivenname1.txt\n                    // and integration DisambiguateAddGivenname2.txt\n                    if (\"undefined\" === typeof this.namereg[pkey]) {\n                        continue;\n                    }\n\n                    // ????\n                    //posA = this.namereg[pkey].items.indexOf(posA);\n\n                    items = this.namereg[pkey].items;\n                    // This was really, really unperceptive. They key elements\n                    // have absolutely nothing to do with whether there was ever\n                    // a registration at each key level.\n                    if (skey && this.namereg[pkey].ikey[ikey] && this.namereg[pkey].ikey[ikey].skey[skey]) {\n                        myitems = this.namereg[pkey].ikey[ikey].skey[skey].items;\n                        posB = myitems.indexOf(\"\" + id);\n                        if (posB > -1) {\n                            this.namereg[pkey].ikey[ikey].skey[skey].items = myitems.slice(0, posB).concat(myitems.slice([(posB + 1)]));\n                        }\n                        if (this.namereg[pkey].ikey[ikey].skey[skey].items.length === 0) {\n                            delete this.namereg[pkey].ikey[ikey].skey[skey];\n                            this.namereg[pkey].ikey[ikey].count += -1;\n                            if (this.namereg[pkey].ikey[ikey].count < 2) {\n                                for (var i = 0, ilen = this.namereg[pkey].ikey[ikey].items.length; i < ilen; i += 1) {\n                                    state.tmp.taintedItemIDs[this.namereg[pkey].ikey[ikey].items[i]] = true;\n                                }\n                            }\n                        }\n                    }\n                    if (ikey && this.namereg[pkey].ikey[ikey]) {\n                        posB = this.namereg[pkey].ikey[ikey].items.indexOf(\"\" + id);\n                        if (posB > -1) {\n                            items = this.namereg[pkey].ikey[ikey].items.slice();\n                            this.namereg[pkey].ikey[ikey].items = items.slice(0, posB).concat(items.slice([posB + 1]));\n                        }\n                        if (this.namereg[pkey].ikey[ikey].items.length === 0) {\n                            delete this.namereg[pkey].ikey[ikey];\n                            this.namereg[pkey].count += -1;\n                            if (this.namereg[pkey].count < 2) {\n                                for (var i = 0, ilen = this.namereg[pkey].items.length; i < ilen; i += 1) {\n                                    state.tmp.taintedItemIDs[this.namereg[pkey].items[i]] = true;\n                                }\n                            }\n                        }\n                    }\n                    if (pkey) {\n                        posB = this.namereg[pkey].items.indexOf(\"\" + id);\n                        if (posB > -1) {\n                            items = this.namereg[pkey].items.slice();\n                            this.namereg[pkey].items = items.slice(0, posB).concat(items.slice([posB + 1], items.length));\n                        }\n                        if (this.namereg[pkey].items.length < 2) {\n                            delete this.namereg[pkey];\n                        }\n                    }\n                    delete this.nameind[id][fullkey];\n                }\n            }\n            delete this.nameind[id];\n            delete this.nameindpkeys[id];\n        }\n        return ret;\n    };\n    //\n    // Run ALL\n    // renderings with disambiguate-add-givenname set to a value\n    // with the by-cite behaviour, and then set the names-based\n    // expanded form when the final makeCitationCluster rendering\n    // is output.  This could be done with a single var set on\n    // the state object in the execution wrappers that run the\n    // style.\n    //\n    addname = function (item_id, nameobj, pos) {\n        var i, ilen;\n        var res = state.nameOutput.getName(nameobj, \"locale-translit\", true);\n        nameobj = res.name;\n\n        if (state.citation.opt[\"givenname-disambiguation-rule\"]\n            && state.citation.opt[\"givenname-disambiguation-rule\"].slice(0, 8) === \"primary-\"\n            && pos !== 0) {\n                return;\n        }\n\n        // A hack. Safe if the name object is used only here, for disambiguation purposes.\n        /*\n        */\n        \n        //CSL.debug(\"INS\");\n        set_keys(this.state, \"\" + item_id, nameobj);\n        // pkey, ikey and skey should be stored in separate cascading objects.\n        // there should also be a kkey, on each, which holds the item ids using\n        // that form of the name.\n        //\n        // (later note: well, we seem to have slipped a notch here.\n        // Adding lists of IDs all over the place here makes no sense;\n        // the lists need to include _only_ the items currently rendered\n        // at the given level, and the place to do that is in evalname,\n        // and in delnames, not here.)\n        if (pkey) {\n            if (\"undefined\" === typeof this.namereg[pkey]) {\n                this.namereg[pkey] = {};\n                this.namereg[pkey].count = 0;\n                this.namereg[pkey].ikey = {};\n                this.namereg[pkey].items = [item_id];\n            } else if (this.namereg[pkey].items.indexOf(item_id) === -1) {\n                this.namereg[pkey].items.push(item_id);\n            }\n//            if (this.namereg[pkey].items.indexOf(item_id) === -1) {\n//                this.namereg[pkey].items.push(item_id);\n//            }\n        }\n        if (pkey && ikey) {\n            if (\"undefined\" === typeof this.namereg[pkey].ikey[ikey]) {\n                this.namereg[pkey].ikey[ikey] = {};\n                this.namereg[pkey].ikey[ikey].count = 0;\n                this.namereg[pkey].ikey[ikey].skey = {};\n                this.namereg[pkey].ikey[ikey].items = [item_id];\n                this.namereg[pkey].count += 1;\n                if (this.namereg[pkey].count === 2) {\n                    for (var i = 0, ilen = this.namereg[pkey].items.length; i < ilen; i += 1) {\n                        state.tmp.taintedItemIDs[this.namereg[pkey].items[i]] = true;\n                    }\n                }\n            } else if (this.namereg[pkey].ikey[ikey].items.indexOf(item_id) === -1) {\n                this.namereg[pkey].ikey[ikey].items.push(item_id);\n            }\n//            if (this.namereg[pkey].ikey[ikey].items.indexOf(item_id) === -1) {\n//                this.namereg[pkey].ikey[ikey].items.push(item_id);\n//            }\n        }\n        if (pkey && ikey && skey) {\n            if (\"undefined\" === typeof this.namereg[pkey].ikey[ikey].skey[skey]) {\n                this.namereg[pkey].ikey[ikey].skey[skey] = {};\n                this.namereg[pkey].ikey[ikey].skey[skey].items = [item_id];\n                this.namereg[pkey].ikey[ikey].count += 1;\n                if (this.namereg[pkey].ikey[ikey].count === 2) {\n                    for (var i = 0, ilen = this.namereg[pkey].ikey[ikey].items.length; i < ilen; i += 1) {\n                        state.tmp.taintedItemIDs[this.namereg[pkey].ikey[ikey].items[i]] = true;\n                    }\n                }\n            } else if (this.namereg[pkey].ikey[ikey].skey[skey].items.indexOf(item_id) === -1) {\n                this.namereg[pkey].ikey[ikey].skey[skey].items.push(item_id);\n            }\n//            if (this.namereg[pkey].ikey[ikey].skey[skey].items.indexOf(item_id) === -1) {\n//                this.namereg[pkey].ikey[ikey].skey[skey].items.push(item_id);\n//            }\n        }\n        if (\"undefined\" === typeof this.nameind[item_id]) {\n            this.nameind[item_id] = {};\n            this.nameindpkeys[item_id] = {};\n        }\n        //CSL.debug(\"INS-A: [\" + pkey + \"] [\" + ikey + \"] [\" + skey + \"]\");\n        if (pkey) {\n            this.nameind[item_id][pkey + \"::\" + ikey + \"::\" + skey] = true;\n            this.nameindpkeys[item_id][pkey] = this.namereg[pkey];\n        }\n        //CSL.debug(\"INS-B\");\n    };\n    this.addname = addname;\n    this.delitems = delitems;\n    this.evalname = evalname;\n};\n\n/*global CSL: true */\n\nCSL.Registry.CitationReg = function () {\n    this.citationById = {};\n    this.citationByIndex = [];\n};\n\n/*global CSL: true */\n\nCSL.Disambiguation = function (state) {\n    this.state = state;\n    this.sys = this.state.sys;\n    this.registry = state.registry.registry;\n    this.ambigcites = state.registry.ambigcites;\n    this.configModes();\n    this.debug = false;\n};\n\nCSL.Disambiguation.prototype.run = function(akey) {\n    if (!this.modes.length) {\n        return;\n    }\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"[A] === RUN ===\");\n    }\n    //SNIP-END\n    this.akey = akey;\n    if (this.initVars(akey)) {\n        this.runDisambig();\n    }\n\n};\n\nCSL.Disambiguation.prototype.runDisambig = function () {\n    var ismax;\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"[C] === runDisambig() ===\");\n    }\n    //SNIP-END\n    this.initGivens = true;\n    //\n    // Length of list may change during processing\n    while (this.lists.length) {\n        this.gnameset = 0;\n        this.gname = 0;\n        this.clashes = [1, 0];\n        // each list is scanned repeatedly until all\n        // items either succeed or ultimately fail.\n        while(this.lists[0][1].length) {\n            this.listpos = 0;\n            if (!this.base) {\n                this.base = this.lists[0][0];\n            }\n            ismax = this.incrementDisambig();\n            this.scanItems(this.lists[0]);\n            this.evalScan(ismax);\n        }\n        this.lists = this.lists.slice(1);\n    }\n};\n\nCSL.Disambiguation.prototype.scanItems = function (list) {\n    var pos, len, otherItem;\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"[2] === scanItems() ===\");\n    }\n    //SNIP-END\n\n    this.Item = list[1][0];\n    this.ItemCite = CSL.getAmbiguousCite.call(this.state, this.Item, this.base, true);\n\n    this.scanlist = list[1];\n    this.partners = [];\n    this.partners.push(this.Item);\n    this.nonpartners = [];\n    var clashes = 0;\n\n    for (var pos = 1, len = list[1].length; pos < len; pos += 1) {\n        otherItem = list[1][pos];\n        var otherItemCite = CSL.getAmbiguousCite.call(this.state, otherItem, this.base, true);\n        //SNIP-START\n        if (this.debug) {\n            if (pos > 1) {\n                this.state.sys.print(\"  -----------\");\n            }\n        }\n        //SNIP-END\n        if (this.ItemCite === otherItemCite) {\n            //SNIP-START\n            if (this.debug) {\n                this.state.sys.print(\"  [CLASH]--> \"+this.Item.id+\": \"+this.ItemCite);\n                this.state.sys.print(\"             \"+otherItem.id+\": \"+otherItemCite);\n            }\n            //SNIP-END\n            clashes += 1;\n            this.partners.push(otherItem);\n        } else {\n            //SNIP-START\n            if (this.debug) {\n                this.state.sys.print(\"  [clear]--> \"+this.Item.id+\": \"+this.ItemCite);\n                this.state.sys.print(\"             \"+otherItem.id+\": \"+otherItemCite);\n            }\n            //SNIP-END\n            this.nonpartners.push(otherItem);\n        }\n    }\n    this.clashes[0] = this.clashes[1];\n    this.clashes[1] = clashes;\n};\n\nCSL.Disambiguation.prototype.evalScan = function (maxed) {\n    this[this.modes[this.modeindex]](maxed);\n    if (maxed) {\n        if (this.modeindex < this.modes.length - 1) {\n            this.modeindex += 1;\n        } else {\n            this.lists[this.listpos + 1] = [this.base, []];\n        }\n    }\n};\n\nCSL.Disambiguation.prototype.disNames = function (ismax) {\n    var i, ilen;\n    \n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"[3] == disNames() ==\");\n        //this.state.sys.print(\"       partners: \"+[this.partners[i].id for (i in this.partners)].join(\", \"));\n        //this.state.sys.print(\"    nonpartners: \"+[this.nonpartners[i].id for (i in this.nonpartners)].join(\", \"));\n    }\n    //SNIP-END\n\n    // New design\n    // this.base is a forward-only counter. Values are never\n    // reduced, and the counter object is never overwritten.\n    // It is methodically pushed forward in single-unit increments\n    // in incrementDisambig() until disNames() wipes out the list.\n\n    // this.betterbase is cloned from this.base exactly once,\n    // at the start of a disambiguation run. Whenever an operation\n    // results in improvement, the just-incremented elements\n    // identified as this.base.names[this.gnameset] (number of\n    // names)and as this.base.givens[this.gnameset][this.gname]\n    // (level of given name) are copied from this.base.\n\n    // The this.base object is used to control disambiguation\n    // renderings. These will be more fully expanded than the final\n    // text, but the flip side of the fact that the extra data does\n    // not contribute anything to disambiguation is that leaving\n    // it in does no harm -- think of it as the Cold Dark Matter of\n    // disambiguation.\n\n    if (this.clashes[1] === 0 && this.nonpartners.length === 1) {\n        this.captureStepToBase();\n        //SNIP-START\n        if (this.debug) {\n            this.state.sys.print(\"  ** RESOLUTION [a]: lone partner, one nonpartner\");\n            this.state.sys.print(\"  registering \"+this.partners[0].id+\" and \"+this.nonpartners[0].id);\n        }\n        //SNIP-END\n        this.state.registry.registerAmbigToken(this.akey, \"\" + this.nonpartners[0].id, this.betterbase);\n        this.state.registry.registerAmbigToken(this.akey, \"\" + this.partners[0].id, this.betterbase);\n        this.lists[this.listpos] = [this.betterbase, []];\n    } else if (this.clashes[1] === 0) {\n        this.captureStepToBase();\n        //SNIP-START\n        if (this.debug) {\n            this.state.sys.print(\"  ** RESOLUTION [b]: lone partner, unknown number of remaining nonpartners\");\n            this.state.sys.print(\"  registering \"+this.partners[0].id);\n        }\n        //SNIP-END\n        this.state.registry.registerAmbigToken(this.akey, \"\" + this.partners[0].id, this.betterbase);\n        this.lists[this.listpos] = [this.betterbase, this.nonpartners];\n        if (this.nonpartners.length) {\n            this.initGivens = true;\n        }\n    } else if (this.nonpartners.length === 1) {\n        this.captureStepToBase();\n        //SNIP-START\n        if (this.debug) {\n            this.state.sys.print(\"  ** RESOLUTION [c]: lone nonpartner, unknown number of partners remaining\");\n            this.state.sys.print(\"  registering \"+this.nonpartners[0].id);\n        }\n        //SNIP-END\n        this.state.registry.registerAmbigToken(this.akey, \"\" + this.nonpartners[0].id, this.betterbase);\n        //this.lists[this.listpos] = [this.betterbase, this.partners];\n        this.lists[this.listpos] = [this.betterbase, this.partners];\n    } else if (this.clashes[1] < this.clashes[0]) {\n        this.captureStepToBase();\n        //SNIP-START\n        if (this.debug) {\n            this.state.sys.print(\"  ** RESOLUTION [d]: better result, but no entries safe to register\");\n        }\n        //SNIP-END\n        this.lists[this.listpos] = [this.betterbase, this.partners];\n        this.lists.push([this.betterbase, this.nonpartners]);\n    } else {\n        //SNIP-START\n        if (this.debug) {\n            this.state.sys.print(\"  ** RESOLUTION [e]: no improvement, and clashes remain\");\n        }\n        //SNIP-END\n        if (ismax) {\n            this.lists[this.listpos] = [this.betterbase, this.nonpartners];\n            this.lists.push([this.betterbase, this.partners]);\n            if (this.modeindex === this.modes.length - 1) {\n                //SNIP-START\n                if (this.debug) {\n                    this.state.sys.print(\"     (registering clashing entries because we've run out of options)\");\n                }\n                //SNIP-END\n                for (var i = 0, ilen = this.partners.length; i < ilen; i += 1) {\n                    this.state.registry.registerAmbigToken(this.akey, \"\" + this.partners[i].id, this.betterbase);\n                }\n                this.lists[this.listpos] = [this.betterbase, []];\n            }\n        }\n    }\n};\n\nCSL.Disambiguation.prototype.disExtraText = function () {\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"[3] === disExtraText ==\");\n    }\n    //SNIP-END\n    \n    var done = false;\n\n    if (this.clashes[1] === 0 && this.nonpartners.length < 2) {\n        done = true;\n    }\n\n    // If first encounter in this cycle and multiple modes are\n    // available, decrement mode and reset base\n    if (!done && (!this.base.disambiguate || this.state.tmp.disambiguate_count !== this.state.tmp.disambiguate_maxMax)) {\n        // Rerun everything on each subcycle? This doesn't work currently.\n        //this.initVars(this.akey)\n        this.modeindex = 0;\n        this.base.disambiguate = this.state.tmp.disambiguate_count;\n        this.betterbase.disambiguate = this.state.tmp.disambiguate_count;\n        if (!this.base.disambiguate) {\n            // Evaluate here?\n            this.initGivens = true;\n            // If disambiguate is false set to true\n            this.base.disambiguate = 1;\n            // There may be changes\n            for (var i = 0, ilen = this.lists[this.listpos][1].length; i < ilen; i += 1) {\n                this.state.tmp.taintedItemIDs[this.lists[this.listpos][1][i].id] = true;\n            }\n        } else {\n            this.disNames();\n        }\n    } else if (done || this.state.tmp.disambiguate_count === this.state.tmp.disambiguate_maxMax) {\n        if (done || this.modeindex === this.modes.length - 1) {\n            // If this is the end, disambiguation failed.\n            // Discard disambiguate=true (?) and set parameters\n            var base = this.lists[this.listpos][0];\n            for (var i = 0, ilen = this.lists[this.listpos][1].length; i < ilen; i += 1) {\n                this.state.tmp.taintedItemIDs[this.lists[this.listpos][1][i].id] = true;\n                this.state.registry.registerAmbigToken(this.akey, \"\" + this.lists[this.listpos][1][i].id, base);\n            }\n            this.lists[this.listpos] = [this.betterbase, []];\n        } else {\n            // If this is followed by year-suffix, keep\n            // parameters and set disambiguate=true since it MIGHT\n            // include the date, needed for year-suffix.\n            // This may be a bit over-aggressive for cases in which the\n            // disambiguate condition does not add the date\n            this.modeindex = this.modes.length - 1;\n            var base = this.lists[this.listpos][0];\n            base.disambiguate = true;\n            for (var i = 0, ilen = this.lists[this.listpos][1].length; i < ilen; i += 1) {\n                // Always tainting here might be a little over-aggressive, but a taint may be required.\n                this.state.tmp.taintedItemIDs[this.lists[this.listpos][1][i].id] = true;\n                this.state.registry.registerAmbigToken(this.akey, \"\" + this.lists[this.listpos][1][i].id, base);\n            }\n        }\n    }\n};\n\nCSL.Disambiguation.prototype.disYears = function () {\n    var pos, len, tokens, token;\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"[3] === disYears ==\");\n    }\n    //SNIP-END\n    tokens = [];\n    var base = this.lists[this.listpos][0];\n    if (this.clashes[1]) {\n        // That is, if the initial increment on the ambigs group returns no\n        // clashes, don't apply suffix. The condition is a necessary failsafe.\n\t\t// In original submission order\n\t\tfor (var i = 0, ilen = this.state.registry.mylist.length; i < ilen; i += 1) {\n\t\t\tvar origid = this.state.registry.mylist[i];\n\t\t\tfor (var j = 0, jlen = this.lists[this.listpos][1].length; j < jlen; j += 1) {\n\t\t\t\tvar token = this.lists[this.listpos][1][j];\n\t\t\t\t// Warning: token.id can be number. This should be fixed at a higher level in citeproc-js if poss.\n\t\t\t\tif (token.id == origid) {\n\t\t\t\t\ttokens.push(this.registry[token.id]);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n    }\n    tokens.sort(this.state.registry.sorter.compareKeys);\n    for (var pos = 0, len = tokens.length; pos < len; pos += 1) {\n        base.year_suffix = \"\"+pos;\n        var oldBase = this.state.registry.registry[tokens[pos].id].disambig;\n        this.state.registry.registerAmbigToken(this.akey, \"\" + tokens[pos].id, base);\n        if (CSL.ambigConfigDiff(oldBase,base)) {\n            this.state.tmp.taintedItemIDs[tokens[pos].id] = true;\n        }\n    }\n    this.lists[this.listpos] = [this.betterbase, []];\n};\n\nCSL.Disambiguation.prototype.incrementDisambig = function () {\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"\\n[1] === incrementDisambig() ===\");\n    }\n    //SNIP-END\n    if (this.initGivens) {\n        this.initGivens = false;\n        return false;\n    }\n    var maxed = false;\n    var increment_names = true;\n    if (\"disNames\" === this.modes[this.modeindex]) {\n        // this.gnameset: the index pos of the current nameset\n        // this.gname: the index pos of the current name w/in the current nameset\n        \n        // Stages:\n        // - Increment givenname (optional)\n        // - Add a name (optional)\n        // - Move to next nameset\n\n        // Incrementing is done forward-only on this.base. Values\n        // that improve disambiguation results are copied to\n        // this.betterbase, which is used to set the disambig parameters\n        // in the processor registry.\n        \n\n        // Increment\n        // Max val is always true if a level is inactive.\n        increment_names = false;\n        if (\"number\" !== typeof this.givensMax) {\n            increment_names = true;\n        }\n        var increment_namesets = false;\n        if (\"number\" !== typeof this.namesMax) {\n            increment_namesets = true;\n        }\n        if (\"number\" === typeof this.givensMax) {\n            if (this.base.givens.length && this.base.givens[this.gnameset][this.gname] < this.givensMax) {\n                this.base.givens[this.gnameset][this.gname] += 1;\n            } else {\n                increment_names = true;\n            }\n        }\n        if (\"number\" === typeof this.namesMax \n            && increment_names) {\n            if (this.state.opt[\"disambiguate-add-names\"]) {\n                increment_namesets = false;\n                if (this.gname < this.namesMax) {\n                    this.base.names[this.gnameset] += 1;\n                    this.gname += 1;\n                } else {\n                    increment_namesets = true;\n                }\n            } else {\n                increment_namesets = true;\n            }\n        }\n        if (\"number\" === typeof this.namesetsMax && increment_namesets) {\n            if (this.gnameset < this.namesetsMax) {\n                this.gnameset += 1;\n                this.base.names[this.gnameset] = 1;\n                this.gname = 0;\n            }\n        }\n        //SNIP-START\n        if (this.debug) {\n            this.state.sys.print(\"    ------------------\");\n            this.state.sys.print(\"    incremented values\");\n            this.state.sys.print(\"    ------------------\");\n            this.state.sys.print(\"    | gnameset: \"+this.gnameset);\n            this.state.sys.print(\"    | gname: \"+this.gname);\n            this.state.sys.print(\"    | names value: \"+this.base.names[this.gnameset]);\n            if (this.base.givens.length) {\n                this.state.sys.print(\"    | givens value: \"+this.base.givens[this.gnameset][this.gname]);\n            } else {\n                this.state.sys.print(\"    | givens value: nil\");\n            }\n            this.state.sys.print(\"    | namesetsMax: \"+this.namesetsMax);\n            this.state.sys.print(\"    | namesMax: \"+this.namesMax);\n            this.state.sys.print(\"    | givensMax: \"+this.givensMax);\n        }\n        //SNIP-END\n        if ((\"number\" !== typeof this.namesetsMax || this.namesetsMax === -1 || this.gnameset === this.namesetsMax)\n            && (!this.state.opt[\"disambiguate-add-names\"] || \"number\" !== typeof this.namesMax || this.gname === this.namesMax)\n            && (\"number\" != typeof this.givensMax || \"undefined\" === typeof this.base.givens[this.gnameset] || \"undefined\" === typeof this.base.givens[this.gnameset][this.gname] || this.base.givens[this.gnameset][this.gname] === this.givensMax)) {\n  \n\n            maxed = true;\n            //SNIP-START\n            if (this.debug) {\n                this.state.sys.print(\"    MAXED\");\n            }\n            //SNIP-END\n        }\n    } else if (\"disExtraText\" === this.modes[this.modeindex]) {\n        this.base.disambiguate += 1;\n        this.betterbase.disambiguate += 1;\n    }\n    return maxed;\n};\n\nCSL.Disambiguation.prototype.initVars = function (akey) {\n    var i, ilen, myIds, myItemBundles, myItems;\n    //SNIP-START\n    if (this.debug) {\n        this.state.sys.print(\"[B] === initVars() ===\");\n    }\n    //SNIP-END\n    this.lists = [];\n    this.base = false;\n    this.betterbase = false;\n    this.akey = akey;\n\n    this.maxNamesByItemId = {};\n\n\n    myItemBundles = [];\n    myIds = this.ambigcites[akey];\n    if (!myIds || !myIds.length) {\n        return false;\n    }\n    var myItem = this.state.refetchItem(\"\" + myIds[0]);\n    this.getCiteData(myItem);\n    this.base = CSL.getAmbigConfig.call(this.state);\n    if (myIds && myIds.length > 1) {\n        myItemBundles.push([this.maxNamesByItemId[myItem.id], myItem]);\n        // Build a composite list of Items and associated\n        // max names. This is messy, but it's the only\n        // way to get the items sorted by the number of names\n        // to be disambiguated. If they are in descending order\n        // with name expansions, the processor will hang.\n        for (var i = 1, ilen = myIds.length; i < ilen; i += 1) {\n            myItem = this.state.refetchItem(\"\" + myIds[i]);\n            this.getCiteData(myItem, this.base);\n            myItemBundles.push([this.maxNamesByItemId[myItem.id], myItem]);\n        }\n        myItemBundles.sort(\n            function (a, b) {\n                if (a[0] > b[0]) {\n                    return 1;\n                } else if (a[0] < b[0]) {\n                    return -1;\n                } else {\n                    if (a[1].id > b[1].id) {\n                        return 1;\n                    } else if (a[1].id < b[1].id) {\n                        return -1;\n                    } else {\n                        return 0;\n                    }\n                }\n            }\n        );\n        myItems = [];\n        for (var i = 0, ilen = myItemBundles.length; i < ilen; i += 1) {\n            myItems.push(myItemBundles[i][1]);\n        }\n        this.lists.push([this.base, myItems]);\n        this.Item = this.lists[0][1][0];\n    } else {\n        this.Item = this.state.refetchItem(\"\" + myIds[0]);\n    }\n\n    this.modeindex = 0;\n    if (this.state.citation.opt[\"disambiguate-add-names\"] || true) {\n        this.namesMax = this.maxNamesByItemId[this.Item.id][0];\n    } else {\n        var namesMax = this.base.names[0];\n        for (var i=1,ilen=this.base.names.length;i<ilen;i+=1){\n            namesMax = Math.max(namesMax,this.base.names.names[i]);\n        }\n    }\n\n\n    this.padBase(this.base);\n    this.padBase(this.betterbase);\n    this.base.year_suffix = false;\n    this.base.disambiguate = false;\n    this.betterbase.year_suffix = false;\n    this.betterbase.disambiguate = false;\n    if (this.state.citation.opt[\"givenname-disambiguation-rule\"] === \"by-cite\"\n       && this.state.opt[\"disambiguate-add-givenname\"]) {\n        this.givensMax = 2;\n    }\n    return true;\n};\n\n\nCSL.Disambiguation.prototype.padBase = function (base) {\n    for (var i = 0, ilen = base.names.length; i < ilen; i += 1) {\n        if (!base.givens[i]) {\n            base.givens[i] = [];\n        }\n        for (var j=0,jlen=base.names[i];j<jlen;j+=1) {\n            if (!base.givens[i][j]) {\n                base.givens[i][j] = 0;\n            }\n        }\n    }\n};\n\n/**\n * Set available modes for disambiguation\n */\nCSL.Disambiguation.prototype.configModes = function () {\n    var dagopt, gdropt;\n    // Modes are function names prototyped to this instance.\n    this.modes = [];\n    dagopt = this.state.opt[\"disambiguate-add-givenname\"];\n    gdropt = this.state.citation.opt[\"givenname-disambiguation-rule\"];\n    if (this.state.opt['disambiguate-add-names'] || (dagopt && gdropt === \"by-cite\")) {\n        this.modes.push(\"disNames\");\n    }\n\n    if (this.state.opt.development_extensions.prioritize_disambiguate_condition) {\n        if (this.state.opt.has_disambiguate) {\n            this.modes.push(\"disExtraText\");\n        }\n        if (this.state.opt[\"disambiguate-add-year-suffix\"]) {\n            this.modes.push(\"disYears\");\n        }\n    } else {\n        if (this.state.opt[\"disambiguate-add-year-suffix\"]) {\n            this.modes.push(\"disYears\");\n        }\n        if (this.state.opt.has_disambiguate) {\n            this.modes.push(\"disExtraText\");\n        }\n    }\n};\n\nCSL.Disambiguation.prototype.getCiteData = function(Item, base) {\n    // Initialize base if first set item seen\n    if (!this.maxNamesByItemId[Item.id]) {\n        CSL.getAmbiguousCite.call(this.state, Item, base);\n        base = CSL.getAmbigConfig.call(this.state);\n        this.maxNamesByItemId[Item.id] = CSL.getMaxVals.call(this.state);\n        this.state.registry.registry[Item.id].disambig.givens = this.state.tmp.disambig_settings.givens.slice();\n        // Slice the nested lists as well. Without this, disambiguate_YearSuffixFiftyTwoEntriesByCite fails.\n        for (var i=0,ilen=this.state.registry.registry[Item.id].disambig.givens.length;i<ilen;i+=1) {\n            this.state.registry.registry[Item.id].disambig.givens[i] = this.state.tmp.disambig_settings.givens[i].slice();\n        }\n        this.namesetsMax = this.state.registry.registry[Item.id].disambig.names.length - 1;\n        if (!this.base) {\n            this.base = base;\n            this.betterbase = CSL.cloneAmbigConfig(base);\n        }\n        if (base.names.length < this.base.names.length) {\n            // I don't know what would happen with discrepancies in the number\n            // of namesets rendered on items, so we use the fewer of the two\n            // and limit the other to that size.\n            this.base = base;\n        }\n        // Padding. Within namesets, we use the longer of the two throughout.\n        for (var i = 0, ilen = base.names.length; i < ilen; i += 1) {\n            if (base.names[i] > this.base.names[i]) {\n                // XXX The old must have been wrong surely. The new, I'm not sure.\n                //this.base.givens[i] = this.base.givens[i].concat(this.base.givens[i].slice(this.base.names[i]));\n                this.base.givens[i] = base.givens[i].slice();\n                this.base.names[i] = base.names[i];\n                this.betterbase.names = this.base.names.slice();\n                this.betterbase.givens = this.base.givens.slice();\n                this.padBase(this.base);\n                this.padBase(this.betterbase);\n            }\n        }\n        // This shouldn't be necessary\n        // getAmbiguousCite() should return a valid and complete\n        // givens segment under all conditions, but it does not\n        // do so for institution authors, so we clean up after it\n        // here.\n        // Relevant test: sort_ChicagoYearSuffix2\n        this.betterbase.givens = this.base.givens.slice();\n        for (var j = 0, jlen = this.base.givens.length; j < jlen; j += 1) {\n            this.betterbase.givens[j] = this.base.givens[j].slice();\n        }\n    }\n};\n\nCSL.Disambiguation.prototype.captureStepToBase = function() {\n    // Be paranoid about the presence of givens\n    if (this.state.citation.opt[\"givenname-disambiguation-rule\"] === \"by-cite\"\n        && this.base.givens && this.base.givens.length) {\n        if (\"undefined\" !== typeof this.base.givens[this.gnameset][this.gname]) {\n            if (this.betterbase.givens.length < this.base.givens.length) {\n                this.betterbase.givens = JSON.parse(JSON.stringify(this.base.givens));\n            }\n            this.betterbase.givens[this.gnameset][this.gname] = this.base.givens[this.gnameset][this.gname];\n        }\n    }\n    this.betterbase.names[this.gnameset] = this.base.names[this.gnameset];\n};\n\nCSL.Engine.prototype.getJurisdictionList = function (jurisdiction) {\n    var jurisdictionList = [];\n    var jurisdictionElems = jurisdiction.split(\":\");\n    for (var j=jurisdictionElems.length;j>0;j--) {\n        var composedID = jurisdictionElems.slice(0,j).join(\":\");\n        jurisdictionList.push(composedID);\n        if (this.opt.jurisdiction_fallbacks[composedID]) {\n            var fallback = this.opt.jurisdiction_fallbacks[composedID];\n            jurisdictionList.push(fallback);\n        }\n    }\n    if (jurisdictionList.indexOf(\"us\") === -1) {\n        jurisdictionList.push(\"us\");\n    }\n    return jurisdictionList;\n};\n\nCSL.Engine.prototype.loadStyleModule = function (jurisdiction, xmlSource, skipFallback) {\n    var myFallback = null;\n    var macroCount = 0;\n    this.juris[jurisdiction] = {};\n    var myXml = CSL.setupXml(xmlSource);\n    myXml.addMissingNameNodes(myXml.dataObj);\n    myXml.addInstitutionNodes(myXml.dataObj);\n    myXml.insertPublisherAndPlace(myXml.dataObj);\n    myXml.flagDateMacros(myXml.dataObj);\n    var myNodes = myXml.getNodesByName(myXml.dataObj, \"law-module\");\n    for (var i=0,ilen=myNodes.length;i<ilen;i++) {\n        var myTypes = myXml.getAttributeValue(myNodes[i],\"types\");\n        if (myTypes) {\n            this.juris[jurisdiction].types = {};\n            myTypes =  myTypes.split(/\\s+/);\n            for (var j=0,jlen=myTypes.length;j<jlen;j++) {\n                this.juris[jurisdiction].types[myTypes[j]] = true;\n            }\n        }\n        if (!skipFallback) {\n            myFallback = myXml.getAttributeValue(myNodes[i],\"fallback\");\n            if (myFallback) {\n                if (jurisdiction !== \"us\") {\n                    this.opt.jurisdiction_fallbacks[jurisdiction] = myFallback;\n                }\n            }\n        }\n    }\n    var lang = this.opt.lang ? this.opt.lang : this.opt[\"default-locale\"][0];\n    CSL.SET_COURT_CLASSES(this, lang, myXml, myXml.dataObj);\n    \n    if (!this.juris[jurisdiction].types) {\n        this.juris[jurisdiction].types = CSL.MODULE_TYPES;\n    }\n    var myNodes = myXml.getNodesByName(myXml.dataObj, \"macro\");\n    for (var i=0,ilen=myNodes.length;i<ilen;i++) {\n        var myName = myXml.getAttributeValue(myNodes[i], \"name\");\n        if (!CSL.MODULE_MACROS[myName]) {\n            CSL.debug(\"CSL: skipping non-modular macro name \\\"\" + myName + \"\\\" in module context\");\n            continue;\n        }\n        macroCount++;\n        this.juris[jurisdiction][myName] = [];\n        // Must use the same XML parser for style and modules.\n        this.buildTokenLists(myNodes[i], this.juris[jurisdiction][myName]);\n        this.configureTokenList(this.juris[jurisdiction][myName]);\n    }\n    //if (macroCount < Object.keys(CSL.MODULE_MACROS).length) {\n    //    var missing = [];\n    //    throw \"CSL ERROR: Incomplete jurisdiction style module for: \" + jurisdiction;\n    //}\n    return myFallback;\n};\n\nCSL.Engine.prototype.retrieveAllStyleModules = function (jurisdictionList) {\n    var ret = {};\n    var preferences = this.locale[this.opt.lang].opts[\"jurisdiction-preference\"];\n    preferences = preferences ? preferences : [];\n    preferences = [\"\"].concat(preferences);\n    for (var i=preferences.length-1;i>-1;i--) {\n        var preference = preferences[i];\n        for (var j=0,jlen=jurisdictionList.length;j<jlen;j++) {\n            var jurisdiction = jurisdictionList[j];\n            // If we've \"seen\" it, we have it already, or we're not going to get it.\n            if (this.opt.jurisdictions_seen[jurisdiction]) {\n                continue;\n            }\n            // Try to get the module\n            var res = this.sys.retrieveStyleModule(jurisdiction, preference);\n            // If we fail and we've run out of preferences, mark as \"seen\"\n            // Otherwise mark as \"seen\" if we get something.\n            if ((!res && !preference) || res) {\n                this.opt.jurisdictions_seen[jurisdiction] = true;\n            }\n            // Don't memo unless get got style code.\n            if (!res) {\n                continue;\n            }\n            ret[jurisdiction] = res;\n        }\n    }\n    // Give 'em what we got.\n    return ret;\n};\n\nCSL.ParticleList = (function() {\n\tvar always_dropping_1 = [[[0,1], null]];\n\tvar always_dropping_3 = [[[0,3], null]];\n\tvar always_non_dropping_1 = [[null, [0,1]]];\n\tvar always_non_dropping_2 = [[null, [0,2]]];\n\tvar always_non_dropping_3 = [[null, [0,3]]];\n\tvar either_1 = [[null, [0,1]],[[0,1],null]];\n\tvar either_2 = [[null, [0,2]],[[0,2],null]];\n\tvar either_1_dropping_best = [[[0,1],null],[null, [0,1]]];\n\tvar either_2_dropping_best = [[[0,2],null],[null, [0,2]]];\n\tvar either_3_dropping_best = [[[0,3],null],[null, [0,3]]];\n\tvar non_dropping_2_alt_dropping_1_non_dropping_1 = [[null, [0,2]], [[0,1], [1,2]]];\n\tvar PARTICLES = [\n\t\t[\"'s\", always_non_dropping_1],\n\t\t[\"'s-\", always_non_dropping_1],\n\t\t[\"'t\", always_non_dropping_1],\n\t\t[\"a\", \talways_non_dropping_1],\n\t\t[\"aan 't\", always_non_dropping_2],\n\t\t[\"aan de\", always_non_dropping_2],\n\t\t[\"aan den\", always_non_dropping_2],\n\t\t[\"aan der\", always_non_dropping_2],\n\t\t[\"aan het\", always_non_dropping_2],\n\t\t[\"aan t\", always_non_dropping_2],\n\t\t[\"aan\", always_non_dropping_1],\n\t\t[\"ad-\", either_1],\n\t\t[\"adh-\", either_1],\n\t\t[\"af\", either_1],\n\t\t[\"al\", either_1],\n\t\t[\"al-\", either_1],\n\t\t[\"am de\", always_non_dropping_2],\n\t\t[\"am\", always_non_dropping_1],\n\t\t[\"an-\", either_1],\n\t\t[\"ar-\", either_1],\n\t\t[\"as-\", either_1],\n\t\t[\"ash-\", either_1],\n\t\t[\"at-\", either_1],\n\t\t[\"ath-\", either_1],\n\t\t[\"auf dem\", either_2_dropping_best],\n\t\t[\"auf den\", either_2_dropping_best],\n\t\t[\"auf der\", either_2_dropping_best],\n\t\t[\"auf ter\", always_non_dropping_2],\n\t\t[\"auf\", either_1_dropping_best],\n\t\t[\"aus 'm\", either_2_dropping_best],\n\t\t[\"aus dem\", either_2_dropping_best],\n\t\t[\"aus den\", either_2_dropping_best],\n\t\t[\"aus der\", either_2_dropping_best],\n\t\t[\"aus m\", either_2_dropping_best],\n\t\t[\"aus\", either_1_dropping_best],\n\t\t[\"aus'm\", either_2_dropping_best],\n\t\t[\"az-\", either_1],\n\t\t[\"aš-\", either_1],\n\t\t[\"aḍ-\", either_1],\n\t\t[\"aḏ-\", either_1],\n\t\t[\"aṣ-\", either_1],\n\t\t[\"aṭ-\", either_1],\n\t\t[\"aṯ-\", either_1],\n\t\t[\"aẓ-\", either_1],\n\t\t[\"ben\", always_non_dropping_1],\n\t\t[\"bij 't\", always_non_dropping_2],\n\t\t[\"bij de\", always_non_dropping_2],\n\t\t[\"bij den\", always_non_dropping_2],\n\t\t[\"bij het\", always_non_dropping_2],\n\t\t[\"bij t\", always_non_dropping_2],\n\t\t[\"bij\", always_non_dropping_1],\n\t\t[\"bin\", always_non_dropping_1],\n\t\t[\"boven d\", always_non_dropping_2],\n\t\t[\"boven d'\", always_non_dropping_2],\n\t\t[\"d\", always_non_dropping_1],\n\t\t[\"d'\", either_1],\n\t\t[\"da\", either_1],\n\t\t[\"dal\", always_non_dropping_1],\n\t\t[\"dal'\", always_non_dropping_1],\n\t\t[\"dall'\", always_non_dropping_1],\n\t\t[\"dalla\", always_non_dropping_1],\n\t\t[\"das\", either_1],\n\t\t[\"de die le\", always_non_dropping_3],\n\t\t[\"de die\", always_non_dropping_2],\n\t\t[\"de l\", always_non_dropping_2],\n\t\t[\"de l'\", always_non_dropping_2],\n\t\t[\"de la\", non_dropping_2_alt_dropping_1_non_dropping_1],\n\t\t[\"de las\", non_dropping_2_alt_dropping_1_non_dropping_1],\n\t\t[\"de le\", always_non_dropping_2],\n\t\t[\"de li\", either_2],\n\t\t[\"de van der\", always_non_dropping_3],\n\t\t[\"de\", either_1],\n\t\t[\"de'\", either_1],\n\t\t[\"deca\", always_non_dropping_1],\n\t\t[\"degli\", either_1],\n\t\t[\"dei\", either_1],\n\t\t[\"del\", either_1],\n\t\t[\"dela\", always_dropping_1],\n\t\t[\"dell'\", either_1],\n\t\t[\"della\", either_1],\n\t\t[\"delle\", either_1],\n\t\t[\"dello\", either_1],\n\t\t[\"den\", either_1],\n\t\t[\"der\", either_1],\n\t\t[\"des\", either_1],\n\t\t[\"di\", either_1],\n\t\t[\"die le\", always_non_dropping_2],\n\t\t[\"do\", always_non_dropping_1],\n\t\t[\"don\", always_non_dropping_1],\n\t\t[\"dos\", either_1],\n\t\t[\"du\", either_1],\n\t\t[\"ed-\", either_1],\n\t\t[\"edh-\", either_1],\n\t\t[\"el\", either_1],\n\t\t[\"el-\", either_1],\n\t\t[\"en-\", either_1],\n\t\t[\"er-\", either_1],\n\t\t[\"es-\", either_1],\n\t\t[\"esh-\", either_1],\n\t\t[\"et-\", either_1],\n\t\t[\"eth-\", either_1],\n\t\t[\"ez-\", either_1],\n\t\t[\"eš-\", either_1],\n\t\t[\"eḍ-\", either_1],\n\t\t[\"eḏ-\", either_1],\n\t\t[\"eṣ-\", either_1],\n\t\t[\"eṭ-\", either_1],\n\t\t[\"eṯ-\", either_1],\n\t\t[\"eẓ-\", either_1],\n\t\t[\"het\", always_non_dropping_1],\n\t\t[\"i\", always_non_dropping_1],\n\t\t[\"il\", always_dropping_1],\n\t\t[\"im\", always_non_dropping_1],\n\t\t[\"in 't\", always_non_dropping_2],\n\t\t[\"in de\", always_non_dropping_2],\n\t\t[\"in den\", always_non_dropping_2],\n\t\t[\"in der\", either_2],\n\t\t[\"in het\", always_non_dropping_2],\n\t\t[\"in t\", always_non_dropping_2],\n\t\t[\"in\", always_non_dropping_1],\n\t\t[\"l\", always_non_dropping_1],\n\t\t[\"l'\", always_non_dropping_1],\n\t\t[\"la\", always_non_dropping_1],\n\t\t[\"las\", always_non_dropping_1],\n\t\t[\"le\", always_non_dropping_1],\n\t\t[\"les\", either_1],\n\t\t[\"lo\", either_1],\n\t\t[\"los\", always_non_dropping_1],\n\t\t[\"lou\", always_non_dropping_1],\n\t\t[\"of\", always_non_dropping_1],\n\t\t[\"onder 't\", always_non_dropping_2],\n\t\t[\"onder de\", always_non_dropping_2],\n\t\t[\"onder den\", always_non_dropping_2],\n\t\t[\"onder het\", always_non_dropping_2],\n\t\t[\"onder t\", always_non_dropping_2],\n\t\t[\"onder\", always_non_dropping_1],\n\t\t[\"op 't\", always_non_dropping_2],\n\t\t[\"op de\", either_2],\n\t\t[\"op den\", always_non_dropping_2],\n\t\t[\"op der\", always_non_dropping_2],\n\t\t[\"op gen\", always_non_dropping_2],\n\t\t[\"op het\", always_non_dropping_2],\n\t\t[\"op t\", always_non_dropping_2],\n\t\t[\"op ten\", always_non_dropping_2],\n\t\t[\"op\", always_non_dropping_1],\n\t\t[\"over 't\", always_non_dropping_2],\n\t\t[\"over de\", always_non_dropping_2],\n\t\t[\"over den\", always_non_dropping_2],\n\t\t[\"over het\", always_non_dropping_2],\n\t\t[\"over t\", always_non_dropping_2],\n\t\t[\"over\", always_non_dropping_1],\n\t\t[\"s\", always_non_dropping_1],\n\t\t[\"s'\", always_non_dropping_1],\n\t\t[\"sen\", always_dropping_1],\n\t\t[\"t\", always_non_dropping_1],\n\t\t[\"te\", always_non_dropping_1],\n\t\t[\"ten\", always_non_dropping_1],\n\t\t[\"ter\", always_non_dropping_1],\n\t\t[\"tho\", always_non_dropping_1],\n\t\t[\"thoe\", always_non_dropping_1],\n\t\t[\"thor\", always_non_dropping_1],\n\t\t[\"to\", always_non_dropping_1],\n\t\t[\"toe\", always_non_dropping_1],\n\t\t[\"tot\", always_non_dropping_1],\n\t\t[\"uijt 't\", always_non_dropping_2],\n\t\t[\"uijt de\", always_non_dropping_2],\n\t\t[\"uijt den\", always_non_dropping_2],\n\t\t[\"uijt te de\", always_non_dropping_3],\n\t\t[\"uijt ten\", always_non_dropping_2],\n\t\t[\"uijt\", always_non_dropping_1],\n\t\t[\"uit 't\", always_non_dropping_2],\n\t\t[\"uit de\", always_non_dropping_2],\n\t\t[\"uit den\", always_non_dropping_2],\n\t\t[\"uit het\", always_non_dropping_2],\n\t\t[\"uit t\", always_non_dropping_2],\n\t\t[\"uit te de\", always_non_dropping_3],\n\t\t[\"uit ten\", always_non_dropping_2],\n\t\t[\"uit\", always_non_dropping_1],\n\t\t[\"unter\", always_non_dropping_1],\n\t\t[\"v\", always_non_dropping_1],\n\t\t[\"v.\", always_non_dropping_1],\n\t\t[\"v.d.\", always_non_dropping_1],\n\t\t[\"van 't\", always_non_dropping_2],\n\t\t[\"van de l\", always_non_dropping_3],\n\t\t[\"van de l'\", always_non_dropping_3],\n\t\t[\"van de\", always_non_dropping_2],\n\t\t[\"van de\", always_non_dropping_2],\n\t\t[\"van den\", always_non_dropping_2],\n\t\t[\"van der\", always_non_dropping_2],\n\t\t[\"van gen\", always_non_dropping_2],\n\t\t[\"van het\", always_non_dropping_2],\n\t\t[\"van la\", always_non_dropping_2],\n\t\t[\"van t\", always_non_dropping_2],\n\t\t[\"van ter\", always_non_dropping_2],\n\t\t[\"van van de\", always_non_dropping_3],\n\t\t[\"van\", either_1],\n\t\t[\"vander\", always_non_dropping_1],\n\t\t[\"vd\", always_non_dropping_1],\n\t\t[\"ver\", always_non_dropping_1],\n\t\t[\"vom und zum\", always_dropping_3],\n\t\t[\"vom\", either_1],\n\t\t[\"von 't\", always_non_dropping_2],\n\t\t[\"von dem\", either_2_dropping_best],\n\t\t[\"von den\", either_2_dropping_best],\n\t\t[\"von der\", either_2_dropping_best],\n\t\t[\"von t\", always_non_dropping_2],\n\t\t[\"von und zu\", either_3_dropping_best],\n\t\t[\"von zu\", either_2_dropping_best],\n\t\t[\"von\", either_1_dropping_best],\n\t\t[\"voor 't\", always_non_dropping_2],\n\t\t[\"voor de\", always_non_dropping_2],\n\t\t[\"voor den\", always_non_dropping_2],\n\t\t[\"voor in 't\", always_non_dropping_3],\n\t\t[\"voor in t\", always_non_dropping_3],\n\t\t[\"voor\", always_non_dropping_1],\n\t\t[\"vor der\", either_2_dropping_best],\n\t\t[\"vor\", either_1_dropping_best],\n\t\t[\"z\", always_dropping_1],\n\t\t[\"ze\", always_dropping_1],\n\t\t[\"zu\", either_1_dropping_best],\n\t\t[\"zum\", either_1],\n\t\t[\"zur\", either_1]\n\t];\n    return PARTICLES;\n}());\n\nCSL.parseParticles = (function(){\n    function splitParticles(nameValue, firstNameFlag, caseOverride) {\n\t\t// Parse particles out from name fields.\n\t\t// * nameValue (string) is the field content to be parsed.\n\t\t// * firstNameFlag (boolean) parse trailing particles\n\t\t//\t (default is to parse leading particles)\n\t\t// * caseOverride (boolean) include all but one word in particle set\n\t\t//\t (default is to include only words with lowercase first char)\n        //   [caseOverride is not used in this application]\n\t\t// Returns an array with:\n\t\t// * (boolean) flag indicating whether a particle was found\n\t\t// * (string) the name after removal of particles\n\t\t// * (array) the list of particles found\n\t\tvar origNameValue = nameValue;\n\t\tnameValue = caseOverride ? nameValue.toLowerCase() : nameValue;\n\t\tvar particleList = [];\n\t\tvar rex;\n        var hasParticle;\n\t\tif (firstNameFlag) {\n\t\t\tnameValue = nameValue.split(\"\").reverse().join(\"\");\n\t\t\trex = CSL.PARTICLE_GIVEN_REGEXP;\n\t\t} else {\n\t\t\trex = CSL.PARTICLE_FAMILY_REGEXP;\n\t\t}\n\t\tvar m = nameValue.match(rex);\n\t\twhile (m) {\n\t\t\tvar m1 = firstNameFlag ? m[1].split(\"\").reverse().join(\"\") : m[1];\n\t\t\tvar firstChar = m ? m1 : false;\n\t\t\tvar firstChar = firstChar ? m1.replace(/^[-\\'\\u02bb\\u2019\\s]*(.).*$/, \"$1\") : false;\n\t\t\thasParticle = firstChar ? firstChar.toUpperCase() !== firstChar : false;\n\t\t\tif (!hasParticle) {\n                break;\n            }\n\t\t\tif (firstNameFlag) {\n\t\t\t\tparticleList.push(origNameValue.slice(m1.length * -1));\n\t\t\t\torigNameValue = origNameValue.slice(0,m1.length * -1);\n\t\t\t} else {\n\t\t\t\tparticleList.push(origNameValue.slice(0,m1.length));\n\t\t\t\torigNameValue = origNameValue.slice(m1.length);\n\t\t\t}\n\t\t\t//particleList.push(m1);\n\t\t\tnameValue = m[2];\n\t\t\tm = nameValue.match(rex);\n\t\t}\n\t\tif (firstNameFlag) {\n\t\t\tnameValue = nameValue.split(\"\").reverse().join(\"\");\n\t\t\tparticleList.reverse();\n\t\t\tfor (var i=1,ilen=particleList.length;i<ilen;i++) {\n\t\t\t\tif (particleList[i].slice(0, 1) == \" \") {\n\t\t\t\t\tparticleList[i-1] += \" \";\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (var i=0,ilen=particleList.length;i<ilen;i++) {\n\t\t\t\tif (particleList[i].slice(0, 1) == \" \") {\n\t\t\t\t\tparticleList[i] = particleList[i].slice(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tnameValue = origNameValue.slice(0, nameValue.length);\n\t\t} else {\n\t\t\tnameValue = origNameValue.slice(nameValue.length * -1);\n\t\t}\n\t\treturn [hasParticle, nameValue, particleList];\n\t}\n    function trimLast(str) {\n        var lastChar = str.slice(-1);\n        str = str.trim();\n        if (lastChar === \" \" && [\"\\'\", \"\\u2019\"].indexOf(str.slice(-1)) > -1) {\n            str += \" \";\n        }\n        return str;\n    }\n    function parseSuffix(nameObj) {\n        if (!nameObj.suffix && nameObj.given) {\n            var m = nameObj.given.match(/(\\s*,!*\\s*)/);\n            if (m) {\n                var idx = nameObj.given.indexOf(m[1]);\n                var possible_suffix = nameObj.given.slice(idx + m[1].length);\n                var possible_comma = nameObj.given.slice(idx, idx + m[1].length).replace(/\\s*/g, \"\");\n                if (possible_suffix.replace(/\\./g, \"\") === 'et al' && !nameObj[\"dropping-particle\"]) {\n                    // This hack covers the case where \"et al.\" is explicitly used in the\n                    // authorship information of the work.\n                    nameObj[\"dropping-particle\"] = possible_suffix;\n                    nameObj[\"comma-dropping-particle\"] = \",\";\n                } else {\n                    if (possible_comma.length === 2) {\n                        nameObj[\"comma-suffix\"] = true;\n                    }\n                    nameObj.suffix = possible_suffix;\n                }\n                nameObj.given = nameObj.given.slice(0, idx);\n            }\n        }\n    }\n    return function(nameObj) {\n        // Extract and set non-dropping particle(s) from family name field\n        var res = splitParticles(nameObj.family);\n        var lastNameValue = res[1];\n        var lastParticleList = res[2];\n        nameObj.family = lastNameValue;\n        var nonDroppingParticle = trimLast(lastParticleList.join(\"\"));\n        if (nonDroppingParticle) {\n            nameObj['non-dropping-particle'] = nonDroppingParticle;\n        }\n        // Split off suffix first of all\n        parseSuffix(nameObj);\n        // Extract and set dropping particle(s) from given name field\n        var res = splitParticles(nameObj.given, true);\n        var firstNameValue = res[1];\n        var firstParticleList = res[2];\n        nameObj.given = firstNameValue;\n        var droppingParticle = firstParticleList.join(\"\").trim();\n        if (droppingParticle) {\n            nameObj['dropping-particle'] = droppingParticle;\n        }\n    };\n}());\n\n\nmodule.exports = CSL"],"names":["splits","always_dropping_1","always_non_dropping_1","always_non_dropping_2","always_non_dropping_3","either_1","either_2","either_1_dropping_best","either_2_dropping_best","non_dropping_2_alt_dropping_1_non_dropping_1","CSL","PROCESSOR_VERSION","error","str","Error","debug","console","dump","log","toLocaleUpperCase","arr","this","tmp","lang_array","e","toUpperCase","toLocaleLowerCase","toLowerCase","LOCATOR_LABELS_REGEXP","RegExp","STATUTE_SUBDIV_PLAIN_REGEX","STATUTE_SUBDIV_PLAIN_REGEX_FRONT","STATUTE_SUBDIV_STRINGS","STATUTE_SUBDIV_STRINGS_REVERSE","verse","subparagraph","opus","subchapter","addendum","amendment","annotation","appendix","article","bibliography","book","chapter","clause","column","comment","decision","department","example","figure","field","folio","note","hypothetical","illustration","introduction","line","issue","page","paragraph","part","preamble","principle","publication","rule","randnummer","schedule","section","subdivision","subsection","supplement","table","title","volume","LOCATOR_LABELS_MAP","vrs","sv","subpara","op","subch","add","amend","annot","app","art","bibliog","bk","ch","cl","col","cmt","dec","dept","ex","fig","fld","fol","n","hypo","illus","intro","l","no","p","pp","para","pt","pmbl","princ","pub","r","rn","sched","sec","ser","subdiv","subsec","supp","tbl","tit","vol","MODULE_MACROS","MODULE_TYPES","legal_case","legislation","bill","hearing","gazette","report","regulation","standard","patent","locator","checkNestedBrace","state","opt","xclass","depth","update","lst","split","i","ilen","length","join","MULTI_FIELDS","LangPrefsMap","event","genre","medium","archive","publisher","authority","jurisdiction","number","edition","AbbreviationSegments","nickname","place","hereinafter","classic","getAbbrevsDomain","country","lang","domain","availableAbbrevDomains","globalDomainPreference","locale","opts","itemDomainPreference","j","indexOf","FIELD_CATEGORY_REMAP","parseLocator","item","development_extensions","locator_date_and_revision","idx","raw_locator","slice","m","match","fun","dateparser","parseDateToObject","replace","normalizeLocaleStr","parseNoteFieldHacks","Item","validFieldsForType","allowDateOverride","elems","lines","NOTE_FIELDS_REGEXP","splt","jlen","push","trim","NOTE_FIELD_REGEXP","offset","names","mm","key","val","type","DATE_VARIABLES","DateParser","parseDateToArray","isDateString","NAME_VARIABLES","literal","name","family","given","parseParticles","concat","checkPrefixSpaceAppend","prefix","sp","test_prefix","test_char","ENDSWITH_ROMANESQUE_REGEXP","TERMINAL_PUNCTUATION","checkIgnorePredecessor","term_predecessor","checkSuffixSpacePrepend","suffix","STARTSWITH_ROMANESQUE_REGEXP","GENDERS","ERROR_NO_RENDERED_FORM","PREVIEW","ASSUME_ALL_ITEMS_REGISTERED","START","END","SINGLETON","SEEN","SUCCESSOR","SUCCESSOR_OF_SUCCESSOR","SUPPRESS","SINGULAR","PLURAL","LITERAL","BEFORE","AFTER","DESCENDING","ASCENDING","PRIMARY","SECONDARY","POSITION_FIRST","POSITION_SUBSEQUENT","POSITION_IBID","POSITION_IBID_WITH_LOCATOR","POSITION_CONTAINER_SUBSEQUENT","POSITION_MAP","POSITION_TEST_VARS","AREAS","CITE_FIELDS","SWAPPING_PUNCTUATION","NONE","NUMERIC","POSITION","TRIGRAPH","DATE_PARTS","DATE_PARTS_ALL","DATE_PARTS_INTERNAL","NAME_PARTS","DISAMBIGUATE_OPTIONS","GIVENNAME_DISAMBIGUATION_RULES","NAME_ATTRIBUTES","LOOSE","STRICT","TOLERANT","PREFIX_PUNCTUATION","SUFFIX_PUNCTUATION","NUMBER_REGEXP","NAME_INITIAL_REGEXP","ROMANESQUE_REGEXP","ROMANESQUE_NOT_REGEXP","ALL_ROMANESQUE_REGEXP","VIETNAMESE_SPECIALS","VIETNAMESE_NAMES","PARTICLE_GIVEN_REGEXP","PARTICLE_FAMILY_REGEXP","DISPLAY_CLASSES","CREATORS","NUMERIC_VARIABLES","VARIABLES_WITH_SHORT_FORM","TITLE_FIELD_SPLITS","seg","keys","ret","demoteNoiseWords","drop_or_demote","SKIP_WORDS","reverse","toEnd","pop","start","end","extractTitleAndSubtitle","narrowSpaceLocale","narrowSpace","segments","split_container_title","langs","multi","_keys","short","vals","main","sub","shortTitle","subjoin","tail","top","TITLE_SPLIT_REGEXP","matchfirst","exec","force_short_title_casing_alignment","splitTitle","TITLE_SPLIT","implicit_short_title","punct","titlecaseSentenceOrNormal","sentenceCase","mainTitle","subJoin","subTitle","Output","Formatters","sentence","uppercase_subtitles","getSafeEscape","area","callbacks","thin_non_breaking_space_html_hack","mode","txt","Formats","text_escape","FORMAT_KEY_SEQUENCE","INSTITUTION_KEYS","SUFFIX_CHARS","ROMAN_NUMERALS","LANGS","ar","eu","LANG_BASES","af","bg","ca","cs","da","de","el","en","es","et","fa","fi","fr","he","hr","hu","is","it","ja","km","ko","lt","lv","mn","nb","nl","nn","pl","ro","ru","sk","sl","sr","th","tr","uk","vi","zh","SUPERSCRIPTS","SUPERSCRIPTS_REGEXP","UPDATE_GROUP_CONTEXT_CONDITION","valueTerm","token","value","use_context_condition","flags","group_context","tip","condition","termtxt","value_seen","test","just_did_number","decorations","filter","o","strings","EVALUATE_GROUP_CONDITION","testres","numbersOnly","locale_term","termStartAlpha","require_comma_on_symbol","force_suppress","not","SYS_OPTIONS","GET_COURT_CLASS","sortKey","cls","classType","SET_COURT_CLASSES","myxml","dataObj","nodes","getNodesByName","pos","len","numberofnodes","courtclass","attributes","courts","registry","INIT_JURISDICTION_MACROS","macroName","sys","retrieveStyleModule","jurisdictionList","getJurisdictionList","jurisdictions_seen","res","retrieveAllStyleModules","fallback","loadStyleModule","Object","assign","parallel","enable","Parallel","juris","types","XmlJSON","institution","attrs","delimiter","children","prototype","clean","json","getStyleId","myjson","styleName","tagName","grandkids","nodename","attrname","content","namespace","getAttributeValue","getNodeValue","setAttributeOnNodeIdentifiedByNameAttribute","partname","deleteNodeByNameAttribute","deleteAttribute","setAttribute","attr","nodeCopy","clone","nameattrval","nodeNameIs","makeXml","jsonStringWalker","walkToObject","JSON","parse","insertChildNodeAfter","parent","node","datejson","insertPublisherAndPlace","useme","mustHaves","haveVarname","variable","isChildOfSubstitute","parents","myparents","addMissingNameNodes","addName","addInstitutionNodes","insertPos","and","k","klen","flagDateMacros","inspectDateMacros","stripXmlProcessingInstruction","xml","getSortCompare","default_locale","stringCompare","strcmp","me","strcmp_opts","sensitivity","ignorePunctuation","numeric","stripPunct","bracketPreSort","a","b","call","localeCompare","ambigConfigDiff","ppos","llen","givens","disambiguate","year_suffix","cloneAmbigConfig","config","oldconfig","param","getAmbigConfig","disambig_request","disambig_settings","getMaxVals","names_max","mystack","getMinVal","tokenExec","next","maybenext","result","jump","succeed","fail","execs","expandMacro","macro_key_token","target","mkey","macro_nodes","end_of_macro","postponed_macro","sort_direction","Token","hasDate","macroid","cslXml","build","current_default_locale","func","extension","macro_stack","cslid","update_mode","Node","group","macro_name","mytarget","getMacroTarget","buildMacro","configureMacro","macros","text_node","root","tokens","makeBuilder","builder","configureTokenList","XmlToToken","tokentype","explicitTarget","var_stack","skip","setDecorations","hasOwnProperty","Attributes","variables","hasVariable","text","epochPairs","epochMatchStrings","epochMap","pair","epochMatchString","epochSplitter","epochMatcher","kanjiMonthDay","kanjiYear","kanjiRange","rexString","rexDash","rexDashSlash","rexSlashDash","monthStrings","setOrderDayMonth","monthGuess","dayGuess","setOrderMonthDay","resetDateParserMonths","monthSets","monthAbbrevs","monthRexes","addDateParserMonths","abbrevLength","insert","extendedSets","jKey","kKey","parseInt","monthRexStrs","convertDateObjectToArray","thedate","slicelen","convertDateObjectToString","_parseNumericDate","delim","suff","month","day","orig","slashPos","dashPos","yearIsNegative","slst","mmx","mmpos","rangeDelim","dateDelim","delimPos","delims","isRange","date","outer","element","circa","year","parts","parseDateToString","Engine","style","forceLang","langspec","processor_version","csl_version","defineProperty","TypeError","to","index","arguments","nextSource","nextKey","writable","configurable","variableWrapper","VARIABLE_WRAPPER_PREPUNCT_REX","getAbbreviation","transform","Transform","setParseNames","Opt","Tmp","Build","Fun","configure","Configure","citation_sort","CitationSort","bibliography_sort","BibliographySort","citation","Citation","Bibliography","intext","InText","output","Queue","dateput","option","main_title_from_short_title","csl_reverse_lookup_support","cslNodeId","setCslNodeIds","nodenames","setStyleAttributes","styleID","version","consolidate_legal_items","consolidate_container_items","expect_and_symbol_form","require_explicit_legal_case_title_short","force_jurisdiction","force_title_abbrev_fallback","localeResolve","best","sort_sep","localeConfigure","adjust","getOpt","Registry","area_nodes","buildTokenLists","configureTokenLists","Disambiguation","splice_delimiter","flipflopper","Util","FlipFlopper","setCloseQuotesArray","ordinalizer","init","long_ordinalizer","page_mangler","PageRangeMangler","getFunction","year_mangler","setOutputFormat","getTerm","close_quotes_array","node_stack","runStart","runEnd","runSingle","buildStyle","fixDateNode","dummy","term","form","plural","gender","forceDefaultLocale","getField","terms","cite_renders_content","getDate","dates","arg","getVariable","varname","getDateNum","ItemField","hash","forms","f","hashterm","dateparts_master","dateparts","pppos","lllen","refetchItems","ids","refetchItem","ITERATION","retrieveItem","id","loadedItemIDs","refhash","normalize_lang_keys_to_lowercase","stringify","ctype","creator","_key","language","multi_layout","field_hack","allow_field_hack_date_override","dateobj","raw_date_parsing","raw","dateParseArray","legislation_id","elements","track_container_items","container_id","normalizedKey","isLegalType","normalizeAbbrevsKey","loadAbbreviation","abbrevs","journalAbbreviation","taintedItemIDs","setOpt","inheritedAttributes","inheritOpt","parentname","defaultValue","parentValue","remapSectionVariable","inputList","label","sectionMasterLabel","space","setNumberLabels","shadow_numbers","values","firstword","firstlabel","substituteOne","template","list","substituteTwo","template2","Mode","params","args","passthrough","Doppeler","rexStr","stringMangler","matchRex","splitRex","tags","origStrings","obj","normalDecorIsOrphan","blob","all_the_decor","use_param","layout_decorations","alldecor","getCitationLabel","getTrigraphParams","myname","authors","nameOutput","getName","skipWords","issued","ilst","trigraph","decorate","getSortFunc","setLangTagsForCslSort","sort","setLangTagsForCslTransliteration","setLangTagsForCslTranslation","setLangPrefsForCites","conv","clientSegment","citeprocSegment","supplements","sortval","translit","translat","setLangPrefsForCiteAffixes","affixList","affixes","citeAffixes","count","settings","setAutoVietnameseNamesOption","setAbbreviations","setSuppressTrailingPunctuation","suppressTrailingPunctuation","levelname","queue","empty","tokenstore","formats","Stack","current","drip","blobs","getToken","mergeTokenStrings","base","modifier","base_token","modifier_token","addToken","newtok","pushFormats","popFormats","startTag","openLevel","endTag","closeLevel","curr","Blob","undefined","just_looking","append","tokname","notSerious","ignorePredecessor","noStripPeriods","useblob","element_trace","last_char_rendered","term_predecessor_name","in_cite_predecessor","blobPrefix","blobBlobs","strip_periods","punctuation_in_quote","processTags","string","myblobs","txt_esc","blobjr","use_suffix","use_prefix","blob_delimiter","count_offset_characters","offset_characters","new_locale","old_locale","first_blob","num","particle","blen","suppress_decorations","addtoret","numberSeen","UGLY_DELIMITER_SUPPRESS_HACK","successor_prefix","span_split","blobs_start","renderBlobs","blobs_end","clearlevel","in_cite","use_delim","checkNext","splice_prefix","doit","checkLast","status","strlen","formatter","format","str_blob","addme","range_prefix","suppress_splice_prefix","purgeEmptyBlobs","child","buf","punctInQuote","NO_SWAP_IN","NO_SWAP_OUT","LtoR_MAP","SWAP_IN","SWAP_OUT","PUNCT","PUNCT_OR_SPACE","RtoL_MAP","subkey","blobIsNumber","blobEndsInNumber","blobHasDecorations","includeQuotes","decorlist","blobHasDescendantQuotes","blobHasDescendantMergingPunctuation","parentChar","childChar","mergedChars","matchLastChar","chr","mergeChars","First","first","Second","second","merge_right","FirstStrings","SecondStrings","firstChar","secondChar","cullRight","cullLeft","addRight","addLeft","merge","swapToTheLeft","swapToTheRight","upward","parentDecorations","parentStrings","childStrings","leftward","sibling","siblingChar","hasNumber","suffixAndPrefixMatch","suffixAndFieldMatch","downward","delimChar","childDecorations","childIsNumber","allowMigration","siblingStrings","fix","lastChar","quoteSwap","decoration","has_disambiguate","suppressedJurisdictions","persons","institutions","titles","journals","publishers","places","bib_mode","sort_citations","citation_number_slug","has_layout_locale","disable_duplicate_year_suppression","jurisdiction_fallbacks","locator_label_parse","clean_up_csl_flaws","wrap_url_and_doi","apply_citation_wrapper","strict_text_case_locales","spoof_institutional_affiliations","parse_names","hanging_indent_legacy_number","throw_on_empty","strict_inputs","prioritize_disambiguate_condition","legacy_institution_name_ordering","etal_min_etal_usefirst_hack","names_base","givens_base","namepart_decorations","namepart_type","can_substitute","element_rendered_ok","nameset_counter","term_intended","variable_attempt","variable_success","output_tip","label_form","parallel_first","parallel_last","parallel_delimiter_override","done_vars","tokenstore_stack","last_suffix_used","last_names_used","last_years_used","years_used","names_used","taintedCitationIDs","initialize_with","AmbigConfig","bib_sort_keys","cite_locales","cite_affixes","authority_stop_last","condition_counter","condition_lang_val_arr","condition_lang_counter_arr","Match","suffixator","Suffixator","romanizer","Romanizer","Ordinalizer","LongOrdinalizer","in_bibliography","in_style","layout_flag","names_variables","name_label","macro","substitute_level","names_level","render_nesting_level","render_seen","bibliography_key_pos","tests","srt","Comparifier","collapse","topdecor","layout_prefix","layout_suffix","layout_delimiter","sort_locales","max_number_of_names","sort_directions","citation_number_sort_direction","citation_number_secondary","previewCitationCluster","citationsPre","citationsPost","newMode","oldMode","citationID","processCitationCluster","appendCitationCluster","citationreg","citationByIndex","c","properties","noteIndex","flag","preCitation","postCitation","nlen","noteCitations","textCitations","citationsInNote","oldCitationList","oldItemList","oldAmbigs","citation_errors","return_data","bibchange","setCitationId","reflist","newCitationList","newItemIds","newItemIdsList","citationById","citationItems","oldAkey","ambig","ambigcites","disambig","sortedItems","rerunAkeys","tryLabel","newitem","lastNotePos","citationsByItemId","citations","update_items","updateItems","citation_number_sort","sortkeys","getSortKeys","grouped_sort","unsorted","authorstring_request","mydisambig","getAmbiguousCite","authorstring","authorstrings","compareCompositeKeys","lastauthor","thiskey","thisauthor","StartCitation","first_ref","last_ref","first_container_ref","onecitation","incitationid","incitationxloc","item_id","first_id","last_id","myxloc","mylocator","mylabel","oldlastid","oldlastxloc","oldvalue","position","oldCount","newCount","ibidme","suprame","prevCitation","prev","prev_locator","prev_label","curr_locator","thisCitation","old_last_id_offset","adjusted_offset","oldid","prevxloc","thisxloc","note_distance","process_CitationCluster","oldItemIds","rerunAkey","run","mycitation","citation_pos","citation_note_index","citation_id","firstChunk","getCitationCluster","secondChunk","infix","thirdChunk","makeCitationCluster","rawList","visualForm","oldTermSiblingLayer","non_parallel","parallel_last_override","parallel_delimiter_override_on_suppress","itemSupp","origSuppressDecorations","getCite","getSpliceDelimiter","last_locator","last_collapsed","have_collapsed","use_cite_group_delimiter","cite_group_delimiter","alt_affixes","objects","myparams","composite","compie","preceding_item","error_object","authorOnly","suppressAuthor","citation_prefix","last_primary_names_string","backref_index","abbrev_trimmer","QUASHES","use_layout_prefix","parasets","lastTitle","lastID","locatorInLastPosition","cite_index","hasPlaceholderTerm","itemID","citationItems_pos","error_code","precedingEndsInPeriodOrComma","currentStartsWithPeriodOrComma","spaceidx","citation_suffix","last_locale","wrapCitationEntry","last_chr","buffer","parallel_delimiter","preStr","sufStr","tmpobj","tmpstr","prevItemID","blockShadowNumberReset","areaOrig","probably_rendered_something","citeStart","name_node","NameOutput","citeEnd","bibliography_pos","bibliography_errors","disambiguate_count","disambiguate_maxMax","same_author_as_previous_cite","subsequent_author_substitute_ok","lastchr","disambig_override","disambig_restore","clear","has_done_year_suffix","last_cite_locale","first_name_string","cut_var","issued_date","renders_collection_number","makeBibliography","bibsection","entry_ids","entry_strings","exclude_types","exclude_with_fields","exclude","getBibliographyEntries","done","maxoffset","entryspacing","linespacing","hangingindent","bibstart","bibend","input","include","anymatch","allmatch","bib_entry","spec","topblobs","entry_item_ids","siblings","skips","entry_item_data","page_item_count","eval_string","eval_spec","eval_list","last_rendered_name","page_start","page_length","getSortedIds","processed_item_ids","consolidatedIDs","container_item_count","consolidate_containers","container_item_pos","select","quash","system_id","embedBibliographyEntry","master","parallel_and_not_last","err","last_expected_id","last_seen_id","force","direction","Math","floor","random","toString","rebuildProcessorState","uncitedItemIDs","doneIDs","itemIDs","pre","post","updateUncitedItems","restoreProcessorState","citationList","itemList","indexNumbers","citationIds","oldCitations","idList","nosort","rerun_ambigs","implicitUpdate","oldArea","oldRoot","oldExtension","ambigsTouched","dodeletes","myhash","doinserts","mylist","dorefreshes","rebuildlist","setsortkeys","setdisambigs","sorttokens","renumber","idHash","dopurge","langstr","defaultLocale","langlst","bare","generic","beShy","localexml","retrieveLocale","localeSet","localeLists","lang_in","lang_out","termname","styleopts","ord","foundLocale","style_options","jurispref","typenode","ordinals101","ordinals101_toggle","genderized_terms","genderform","termstub","ikey","gender_segments","form_segments","jkey","feminine","masculine","jurisdiction_preference","skip_words","getLocaleNames","preferredLocale","stylexml","extendLocaleList","localeList","normalizedLocale","localeIDs","sniffLocaleOnOneNodeName","nodeName","nodeLocales","styleNode","nodeNames","choose","firstkey","date_obj","dpx","mypos","date_token","cloneToken","date_parts","date_variables","substituteStart","dateMacroAsSortKey","dp","donesies","date_object","season_end","date_collapse_at","substituteEnd","first_date","value_end","real","invoked","precondition","bc","ad","ready","dcurr","date_variable","formatAndStrip","myform","Dates","last_string_output","monthnameid","myform_end","season","range_delimiter","has_year_suffix","NumericBlob","setFormatter","Conditions","TopNode","etal_node","etal_term","realGroup","label_form_override","label_capitalize_if_first_override","label_capitalize_if_first","reject","require","context","old_term_predecessor","variable_success_parent","label_static","set_parallel_delimiter_override","set_parallel_delimiter_override_on_suppress","LAST_TO_FIRST","parallel_last_to_first","publisher_lst","publisher_place_lst","publisherOutput","PublisherOutput","choose_start","if_start","any","itemItem","if_end","else_start","render","citationNumberIdx","isJurisLocatorLabel","hasRepeat","checkRepeats","info","suppress_repeats","SIBLING","ORPHAN","doneVar","else_end","choose_end","conditions","addMatch","matchCombine","addTest","locale_default","institution_delimiter","name_delimiter","and_term","and_prefix_single","and_prefix_multiple","and_suffix","single","multiple","has_institution","institutionpart","start_key","date_key","sort_key_flag","names_start_token","name_token","institution_token","names_end_token","single_text","citation_number_map","seq","padding","dateAsSortKey","getOutputFunction","varval","end_key","keystring","normalizeUnicode","evaluateLabel","section_form_override","capitalize_if_first","namevars","namelabels","name_flag","after","before","layout","prefix_token","suffix_token","tok","my_tok","setSuffix","topblob","using_display","locale_raw","cite_entry","locator_txt","suffix_txt","rendered_name","layout_locale_flag","choose_tok","build_layout_locale_flag","alternative","if_tok","oldItem","oldLang","abort_alternative","newItem","locale_list","gotlang","tryspec","deleteme","print","nameset_base","etal_spec","_first_creator_variable","_please_chop","requireMatch","nameset_offset","label_blob","labelVariable","checkCommonAuthor","common_term_match_fail","reinit","oldval","outputNames","variable_offset","family_decor","given_decor","getEtAlConfig","divideAndTransliterateNames","truncatePersonalNameLists","disambigNames","constrainNames","setEtAlParameters","setCommonTerm","renderAllNames","blob_list","v","institution_sets","varblob","joinPersonsAndInstitutions","freeters","joinInstitutionSets","joinFreetersAndInstitutionSets","_join","_applyLabels","common_term","namesToken","name_node_string","nameobjs","substring","Names","getRawName","author_title","_collapseAuthor","names_count","freeters_count","institutions_count","persons_count","_buildLabel","castLabel","myqueue","mystr","oldchars","isPerson","isInstitution","chopvar","_truncateNameList","etal_min","etal_use_first","container","limit","varnames","_normalizeVariableValue","_getFreeters","_getPersonsAndInstitutions","_checkNickname","has_affiliates","_clearValues","author","myLocalName","_purgeEmptyBlobs","joinPersons","tokenname","_joinEtAl","_joinEllipsis","_joinAnd","_getAfterInvertedName","finalJoin","prevBlob","isInverted","_getAndJoin","singleOrMultiple","_getToken","ellipsis","has_term","firstSet","secondSet","perfectMatch","_compareNamesets","vv","base_nameset","nameset","_imposeNameConstraints","display_names","discretionary_names_length","etal_use_last","sane","overlength","padBase","_runDisambigNames","myinitials","paramx","namereg","addname","evalname","use_initials","etal_style","etal_suffix","etal_prefix_single","etal_prefix_multiple","_setEtAlParameter","_renderNames","renderInstitutionNames","localesets","slot","primary","secondary","tertiary","slotnames","setRenderedName","_renderInstitutionName","long_style","short_style","institution_short","usedOrig","fixupInstitution","pri","ter","s","_getShortStyle","_composeOneInstitutionPart","_getLongStyle","_renderOneInstitutionPart","primary_tok","secondary_tok","tertiary_tok","institutionblob","hasItalic","secondary_outer","tertiary_outer","nameBlob","_renderPersonalName","nameToken","_renderOnePersonalName","personblob","_isRomanesque","top_locale","dropping_particle","_droppingParticle","_familyName","non_dropping_particle","_nonDroppingParticle","givenInfo","_givenName","_nameSuffix","suffix_sep","romanesque","nbspace","merged","has_hyphenated_non_dropping_particle","hasJoiningPunctuation","initializationLevel","_normalizeNameInput","block_initialize","_parseName","_stripPeriods","decor_tok","ndp","defaultLevel","useLevel","formIsShort","initializeIsTurnedOn","hasInitializeWith","requestedLevel","gdropt","initializeWith","unInitialize","toSuffix","noparse","slotLocaleset","stopOrig","name_params","getStaticOrder","langTag","foundTag","langTags","getNameParams","transliterated","try_locale","name_as_sort_order","name_as_reverse_order","name_never_short","field_lang_bare","strname","listpos","longNameStr","shortNameStr","long","_quashChecks","abbrevKey","retShort","splitShort","_trimInstitution","trimmer","frag","refresh","static_ordering_val","quashCheck","isNaN","subunits","use_first","stop_last","use_last","stop_first","ss","group_tok","varlist","clearVars","composeAndBlob","composeElements","composePublishers","joinPublishers","and_blob","no_delim","with_delim","myterm","theItem","processNumber","labelForm","labelDecorations","labelCapitalizeIfFirst","oldTmpRoot","ellipsis_term","ellipsis_prefix_single","ellipsis_prefix_multiple","ellipsis_suffix","name_labels","variables_real","names_flag","mywith","with_default_prefix","with_suffix","thewith","can_block_substitute","outputNumericField","langForItem","lang_sort_hold","substitute","if_singleton","firstoutput","specialdelimiter","group_start","group_end","abbrevfam","abbrfall","altvar","transfall","clonetoken","groupblob","prefixblob","valueblob","intext_sort","maketest","myitem","myvariable","trylabels","trylabel","trypositions","testSubsequentNear","testSubsequentNotNear","tryposition","mytype","isValid","rawNames","rawMultiNames","creatorParent","creatorChild","gotosleepability","labelVisibility","tryjurisdictions","maketests","trycountries","trydates","trydate","nameList","last_is_person","locale_data","locales","sort_locale","localeMaster","localeServant","locale_bares","tryclasses","tryclass","retval","namevar","subunit_count","citeForm","vars","track_repeat","capitalize_if_first_override","parseFloat","text_case_normal","out","idxEnd","parallelMatchList","siblingRanges","currItem","nextItem","freshMatchList","seeAlso","tempMatchList","remainder","ididx","currVal","nextVal","currYear","nextYear","masterID","siblingID","none","all","nand","getCountryOrJurisdiction","quashCountry","getHumanForm","abbreviate","basevalue","family_var","use_field","preferredJurisdiction","myabbrev_family","abbrev","getFieldLocale","localeRex","getTextSubField","locale_type","use_default","usingOrig","stickyLongForm","breakMe","firstValue","fieldsToTry","h","hlen","variantMatch","hasVal","found_variant_ok","publisherCheck","fields","category","abbreviation_fallback","alternative_varname","langPrefs","primary_locale","secondary_locale","tertiary_locale","oldLangArray","primaryPrefix","primaryUsedOrig","citeFormCheck","conditional","maxvals","minval","mother_token","textCase","DefaultFormatter","last","datexml","subnode","subchildren","display","lingo","childNodes","isMacro","elem","yr","macroFlag","exts","compareNamesets","namelist","punctlist","terminator","normalizeOnly","nameSplits","nameDoppel","mmm","doNormalize","doInitialize","notag","mergetag","tagstr","newstr","tagonly","isAbbrev","extra","imperial","substr","normalizeMonth","useSeason","stub","ordinal","Sort","strip_prepositions","bib_first","nodetypes","variable_entry","noteNumber","firstReferenceNoteNumber","firstContainerReferenceNoteNumber","citationNumber","itemData","variableNames","bib_first_end","bib_other","substitution_name","subrule","dosub","substituted_variable","suffixes","trygenders","trygender","ordinfo","numstr","slist","N","X","ItemObject","realVariable","fullformAnd","symbolAnd","andRex","joinerMatchRex","joinerSplitRex","localeAnd","localeAmpersand","composeNumberInfo","origLabel","joiningSuffix","parsePosition","labelSuffix","fixNumericAndCount","currentLabelInfo","isEscapedHyphen","collapsible","mVal","mCurrentLabel","isCollapsible","fixLabelVisibility","groupStartPos","stripHyphenBackslash","setStyling","masterNode","masterStyling","masterLabel","newnode","styling","checkPage","fixupRangeDelimiter","rangeDelimiter","isNumeric","isPage","hasTerm","checkTerm","manglePageNumbers","currentInfo","fixRanges","lastHadRangeDelimiter","languageRole","localeType","normval","defaultLabel","jmrex","jsrex","embeddedLabel","normalizeFieldValue","source","fixupSubsections","slug","filteredOrigLabel","parseString","setSpaces","groupCount","lastVal","thisVal","setPluralsAndNumerics","setVariableParams","embeddedLabelForm","nums","tryStatic","lastLabelName","labelName","labelPlaceholderPos","numStyling","prefixLabelStyling","Number","isSafeInteger","suffixLabelStyling","rangeType","rangerex","listify","expand","minimize","minimize_internal","chicago15","chicago16","begin","ret_func","hyphens","delimRex","rexm","rexlst","minchars","isyear","front","divisor","pow","sniff","_nestingState","_nestingData","opener","closer","flipflop","nodecor","normal","italic","bold","sup","true","inner","false","localeOpenQuote","localeCloseQuote","localeOpenInnerQuote","localeCloseInnerQuote","_getNestingOpenerParams","openers","map","_nestingParams","_tagRex","closers","matchAll","splitAll","open","close","_pushNestingState","tag","fixtag","_tryOpen","nocase","_tryClose","TagReg","_stack","set","decor","_decor","allTheDecor","decorset","_apostropheForce","leadingSpace","rex","doppel","forcedSpaces","_doppelString","quot","quoteFormSeen","apostrophe","tagInfo","failedTag","tagPos","forcedSpace","firstString","tagReg","stack","latest","addStyling","newblob","newdecorset","seen","_decorset","_olddecor","popStyling","_undoppelToQueue","tagDoppel","wordDoppel","_tagParams","_capitalise","word","_textcaseEngine","quoteParams","pushQuoteState","quoteState","prevPos","positions","tryOpen","tryClose","quoteFix","capitaliseWords","tagState","afterPunct","lastWordPos","quotePos","origChar","isFirst","lastWords","lastWord","words","skipWordsRex","lowercase","uppercase","followingTag","wordle","lcase","capitalize","html","aChar","prePunct","postPunct","doiurl","rtf","charCodeAt","asciidoc","fo","indent","hi","latex","NameReg","CitationReg","masterMap","deletes","inserts","uncited","refreshes","akeys","oldseq","ambigresets","sorter","getSortedRegistryItems","uncited_flag","touched","items","kkey","delitems","loneSiblingID","removeIDs","newmasterID","akey","abase","rendered","ref","registerAmbigToken","reflist_inserts","regtoken","akkey","loneKey","_insertItem","array","splice","_locationOf","pivot","compareKeys","keyset","sortCompare","cmp","compareRegistryTokens","ambig_config","key_type","pkey","skey","dagopt","set_keys","myitems","nameind","nameindpkeys","itemkeyreg","itemid","nameobj","namenum","request_base","initials","gdropt_orig","posB","fullkey","configModes","modes","initVars","runDisambig","ismax","initGivens","lists","gnameset","gname","clashes","incrementDisambig","scanItems","evalScan","otherItem","ItemCite","scanlist","partners","nonpartners","otherItemCite","maxed","modeindex","disNames","captureStepToBase","betterbase","disExtraText","disYears","origid","oldBase","increment_names","givensMax","increment_namesets","namesMax","namesetsMax","myIds","myItemBundles","myItems","maxNamesByItemId","myItem","getCiteData","jurisdictionElems","composedID","xmlSource","skipFallback","myFallback","myXml","myNodes","myTypes","myName","preferences","preference","ParticleList","splitParticles","nameValue","firstNameFlag","caseOverride","origNameValue","hasParticle","particleList","m1","nameObj","lastNameValue","lastParticleList","nonDroppingParticle","possible_suffix","possible_comma","parseSuffix","firstNameValue","firstParticleList","droppingParticle"],"mappings":"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AAY,CAAC,wBAAyB,SAAU,QAAS,oBAAqB,SAAU,WAExFC,qBAAsB,CAClB,yBACA,6BACA,gCAGJC,+BAAgC,CAC5B,YACA,0BACA,eACA,6BACA,WAGJC,gBAAiB,CACb,MACA,0BACA,2BACA,kBACA,aACA,qBACA,iBACA,YACA,kBACA,uBACA,6BACA,OACA,SACA,SACA,aAGJC,MAAO,EACPC,OAAQ,EACRC,SAAU,EAEVC,mBAAoB,YACpBC,mBAAoB,iBAEpBC,cAAe,gBAcfC,oBAAqB,gSACrBC,kBAAmB,8KACnBC,sBAAuB,4KACvBlD,6BAA8B,4KAC9BN,2BAA4B,+KAC5ByD,sBAAuB,6KAEvBC,oBAAqB,oOAErBC,iBAAkB,ySAElBvF,mBAAoB,oCACpBK,kBAAmB,mCAEtBmF,sBAAuB,2CACvBC,uBAAwB,2CAErBC,gBAAiB,CAAC,QAAS,cAAe,eAAgB,UAE1D1E,eAAgB,CACZ,SACA,QACA,oBACA,WACA,WACA,mBACA,cACA,UACA,WACA,SACA,oBACA,qBACA,qBACA,QACA,OACA,cACA,cACA,WACA,YACA,kBACA,YACA,WACA,YACA,kBACA,gBACA,iBACA,aACA,aAEJ2E,SAAU,CACN,SACA,QACA,oBACA,WACA,WACA,mBACA,cACA,UACA,WACA,SACA,oBACA,qBACA,qBACA,QACA,OACA,cACA,cACA,WACA,YACA,kBACA,YACA,WACA,YACA,kBACA,gBACA,iBACA,aACA,aAEJC,kBAAmB,CACf,cACA,iBACA,oBACA,WACA,UACA,OACA,QACA,UACA,gBACA,SACA,kBACA,oBACA,cACA,kBACA,UACA,oBACA,UACA,SACA,aACA,mBAQJhF,eAAgB,CACZ,eACA,SACA,aACA,WACA,gBACA,mBACA,iBACA,YACA,aACA,aAEJiF,0BAA2B,CACvB,QACA,mBAEJC,mBAAoB,SAASC,GAGzB,IAFA,IAAIC,EAAO,CAAC,QAAS,QAAS,OAAQ,MAAO,WACzCC,EAAM,CAAA,EACDrJ,EAAE,EAAEC,EAAKmJ,EAAKlJ,OAAOF,EAAEC,EAAKD,IACjCqJ,EAAID,EAAKpJ,IAAMmJ,EA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","x_google_ignoreList":[0]}