{ "version": 3, "sources": ["../../../../../../../src/node_modules/markdown-it/lib/common/entities.js", "../../../../../../../src/node_modules/uc.micro/categories/P/regex.js", "../../../../../../../src/node_modules/mdurl/encode.js", "../../../../../../../src/node_modules/mdurl/decode.js", "../../../../../../../src/node_modules/mdurl/format.js", "../../../../../../../src/node_modules/mdurl/parse.js", "../../../../../../../src/node_modules/mdurl/index.js", "../../../../../../../src/node_modules/uc.micro/properties/Any/regex.js", "../../../../../../../src/node_modules/uc.micro/categories/Cc/regex.js", "../../../../../../../src/node_modules/uc.micro/categories/Cf/regex.js", "../../../../../../../src/node_modules/uc.micro/categories/Z/regex.js", "../../../../../../../src/node_modules/uc.micro/index.js", "../../../../../../../src/node_modules/markdown-it/lib/common/utils.js", "../../../../../../../src/node_modules/markdown-it/lib/helpers/parse_link_label.js", "../../../../../../../src/node_modules/markdown-it/lib/helpers/parse_link_destination.js", "../../../../../../../src/node_modules/markdown-it/lib/helpers/parse_link_title.js", "../../../../../../../src/node_modules/markdown-it/lib/helpers/index.js", "../../../../../../../src/node_modules/markdown-it/lib/renderer.js", "../../../../../../../src/node_modules/markdown-it/lib/ruler.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_core/normalize.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_core/block.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_core/inline.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_core/linkify.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_core/replacements.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_core/smartquotes.js", "../../../../../../../src/node_modules/markdown-it/lib/token.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_core/state_core.js", "../../../../../../../src/node_modules/markdown-it/lib/parser_core.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_block/table.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_block/code.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_block/fence.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_block/blockquote.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_block/hr.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_block/list.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_block/reference.js", "../../../../../../../src/node_modules/markdown-it/lib/common/html_blocks.js", "../../../../../../../src/node_modules/markdown-it/lib/common/html_re.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_block/html_block.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_block/heading.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_block/lheading.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_block/paragraph.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_block/state_block.js", "../../../../../../../src/node_modules/markdown-it/lib/parser_block.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_inline/text.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_inline/newline.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_inline/escape.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_inline/backticks.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_inline/strikethrough.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_inline/emphasis.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_inline/link.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_inline/image.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_inline/autolink.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_inline/html_inline.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_inline/entity.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_inline/balance_pairs.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_inline/text_collapse.js", "../../../../../../../src/node_modules/markdown-it/lib/rules_inline/state_inline.js", "../../../../../../../src/node_modules/markdown-it/lib/parser_inline.js", "../../../../../../../src/node_modules/linkify-it/lib/re.js", "../../../../../../../src/node_modules/linkify-it/index.js", "../../../../../../../src/node_modules/punycode/punycode.js", "../../../../../../../src/node_modules/markdown-it/lib/presets/default.js", "../../../../../../../src/node_modules/markdown-it/lib/presets/zero.js", "../../../../../../../src/node_modules/markdown-it/lib/presets/commonmark.js", "../../../../../../../src/node_modules/markdown-it/lib/index.js", "../../../../../../../src/node_modules/markdown-it/index.js", "../../../../../../../src/js/i18n/datepicker/jquery.ui.datepicker-nl.js", "../../../../../../../src/js/lib/gettext.js", "../../../../../../../src/js/i18n/nl.js", "../../../../../../../src/js/lib/polyfills/url-search-params.js", "../../../../../../../src/js/lib/collect-values.js", "../../../../../../../src/js/lib/vars.js", "../../../../../../../src/js/lib/case-exit.js", "../../../../../../../src/js/lib/a11y.js", "../../../../../../../src/js/lib/escape.js", "../../../../../../../src/js/lib/notify.js", "../../../../../../../src/js/lib/conf.js", "../../../../../../../src/js/lib/location.js", "../../../../../../../src/js/lib/ajax.js", "../../../../../../../src/js/lib/settled.js", "../../../../../../../src/js/lib/bbi.js", "../../../../../../../src/js/lib/control-helpers.js", "../../../../../../../src/js/lib/text-utils.js", "../../../../../../../src/js/lib/quotable.js", "../../../../../../../src/js/lib/dates.js", "../../../../../../../src/js/lib/feature-queries.js", "../../../../../../../src/js/lib/form-widgets.js", "../../../../../../../src/js/lib/dynprops.js", "../../../../../../../src/js/lib/hooks.js", "../../../../../../../src/js/lib/control.js", "../../../../../../../src/js/lib/types.js", "../../../../../../../src/js/lib/control-validation.js", "../../../../../../../src/js/lib/groupings.js", "../../../../../../../src/js/lib/font-classes.js", "../../../../../../../src/js/lib/names.js", "../../../../../../../src/js/lib/form-groups.js", "../../../../../../../src/js/lib/form-widgets-definitions.js", "../../../../../../../src/js/lib/numerals.js", "../../../../../../../src/js/lib/url-utils.js", "../../../../../../../src/js/lib/utils.js", "../../../../../../../src/js/lib/jumplist.js", "../../../../../../../src/js/lib/user-info.js", "../../../../../../../src/js/lib/permissions.js", "../../../../../../../src/js/lib/$.scrollTo.js", "../../../../../../../src/js/json.js", "../../../../../../../src/plugins/Dialogue/Dialogue.js", "../../../../../../../src/plugins/a11y-describedby/a11y-describedby.js", "../../../../../../../src/plugins/all-or-nothing/all-or-nothing.js", "../../../../../../../src/plugins/array._groupby/array._groupby.js", "../../../../../../../src/plugins/asterisk/asterisk.js", "../../../../../../../src/plugins/auto-next-when-only-radio/auto-next-when-only-radio.js", "../../../../../../../src/plugins/bb-input-wrap-and-unit/bb-input-wrap-and-unit.js", "../../../../../../../src/plugins/busy/busy.js", "../../../../../../../src/plugins/grid-tabs/grid-tabs.js", "../../../../../../../src/plugins/has-required/has-required.js", "../../../../../../../src/plugins/headings/headings.js", "../../../../../../../src/plugins/high-on-info-tb/high-on-info-tb.js", "../../../../../../../src/plugins/history/history.js", "../../../../../../../src/plugins/markdown-it-converter/markdown-it-converter.js", "../../../../../../../src/plugins/md-labels/md-labels.js", "../../../../../../../src/js/lib/getmetadata.js", "../../../../../../../src/plugins/metadata-change-navtext/metadata-change-navtext.js", "../../../../../../../src/plugins/mustache/mustache.js", "../../../../../../../src/plugins/previews/previews.js", "../../../../../../../src/plugins/shout-out-resize/shout-out-resize.js", "../../../../../../../src/plugins/show-server-side-validation/show-server-side-validation.js", "../../../../../../../src/plugins/skip/skip.js", "../../../../../../../src/js/lib/keyboard.js", "../../../../../../../src/plugins/user-error-focus-first/user-error-focus-first.js", "../../../../../../../src/plugins/wrap-table/wrap-table.js"], "sourcesContent": ["// HTML5 entities map: { name -> utf16string }\n//\n'use strict';\n\n/*eslint quotes:0*/\nmodule.exports = require('entities/lib/maps/entities.json');\n", "module.exports=/[!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u09FD\\u0A76\\u0AF0\\u0C84\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E4E\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD803[\\uDF55-\\uDF59]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC8\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD806[\\uDC3B\\uDE3F-\\uDE46\\uDE9A-\\uDE9C\\uDE9E-\\uDEA2]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71\\uDEF7\\uDEF8]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD81B[\\uDE97-\\uDE9A]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]/", "\n'use strict';\n\n\nvar encodeCache = {};\n\n\n// Create a lookup array where anything but characters in `chars` string\n// and alphanumeric chars is percent-encoded.\n//\nfunction getEncodeCache(exclude) {\n var i, ch, cache = encodeCache[exclude];\n if (cache) { return cache; }\n\n cache = encodeCache[exclude] = [];\n\n for (i = 0; i < 128; i++) {\n ch = String.fromCharCode(i);\n\n if (/^[0-9a-z]$/i.test(ch)) {\n // always allow unencoded alphanumeric characters\n cache.push(ch);\n } else {\n cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2));\n }\n }\n\n for (i = 0; i < exclude.length; i++) {\n cache[exclude.charCodeAt(i)] = exclude[i];\n }\n\n return cache;\n}\n\n\n// Encode unsafe characters with percent-encoding, skipping already\n// encoded sequences.\n//\n// - string - string to encode\n// - exclude - list of characters to ignore (in addition to a-zA-Z0-9)\n// - keepEscaped - don't encode '%' in a correct escape sequence (default: true)\n//\nfunction encode(string, exclude, keepEscaped) {\n var i, l, code, nextCode, cache,\n result = '';\n\n if (typeof exclude !== 'string') {\n // encode(string, keepEscaped)\n keepEscaped = exclude;\n exclude = encode.defaultChars;\n }\n\n if (typeof keepEscaped === 'undefined') {\n keepEscaped = true;\n }\n\n cache = getEncodeCache(exclude);\n\n for (i = 0, l = string.length; i < l; i++) {\n code = string.charCodeAt(i);\n\n if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) {\n if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {\n result += string.slice(i, i + 3);\n i += 2;\n continue;\n }\n }\n\n if (code < 128) {\n result += cache[code];\n continue;\n }\n\n if (code >= 0xD800 && code <= 0xDFFF) {\n if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) {\n nextCode = string.charCodeAt(i + 1);\n if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {\n result += encodeURIComponent(string[i] + string[i + 1]);\n i++;\n continue;\n }\n }\n result += '%EF%BF%BD';\n continue;\n }\n\n result += encodeURIComponent(string[i]);\n }\n\n return result;\n}\n\nencode.defaultChars = \";/?:@&=+$,-_.!~*'()#\";\nencode.componentChars = \"-_.!~*'()\";\n\n\nmodule.exports = encode;\n", "\n'use strict';\n\n\n/* eslint-disable no-bitwise */\n\nvar decodeCache = {};\n\nfunction getDecodeCache(exclude) {\n var i, ch, cache = decodeCache[exclude];\n if (cache) { return cache; }\n\n cache = decodeCache[exclude] = [];\n\n for (i = 0; i < 128; i++) {\n ch = String.fromCharCode(i);\n cache.push(ch);\n }\n\n for (i = 0; i < exclude.length; i++) {\n ch = exclude.charCodeAt(i);\n cache[ch] = '%' + ('0' + ch.toString(16).toUpperCase()).slice(-2);\n }\n\n return cache;\n}\n\n\n// Decode percent-encoded string.\n//\nfunction decode(string, exclude) {\n var cache;\n\n if (typeof exclude !== 'string') {\n exclude = decode.defaultChars;\n }\n\n cache = getDecodeCache(exclude);\n\n return string.replace(/(%[a-f0-9]{2})+/gi, function(seq) {\n var i, l, b1, b2, b3, b4, chr,\n result = '';\n\n for (i = 0, l = seq.length; i < l; i += 3) {\n b1 = parseInt(seq.slice(i + 1, i + 3), 16);\n\n if (b1 < 0x80) {\n result += cache[b1];\n continue;\n }\n\n if ((b1 & 0xE0) === 0xC0 && (i + 3 < l)) {\n // 110xxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n\n if ((b2 & 0xC0) === 0x80) {\n chr = ((b1 << 6) & 0x7C0) | (b2 & 0x3F);\n\n if (chr < 0x80) {\n result += '\\ufffd\\ufffd';\n } else {\n result += String.fromCharCode(chr);\n }\n\n i += 3;\n continue;\n }\n }\n\n if ((b1 & 0xF0) === 0xE0 && (i + 6 < l)) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n b3 = parseInt(seq.slice(i + 7, i + 9), 16);\n\n if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {\n chr = ((b1 << 12) & 0xF000) | ((b2 << 6) & 0xFC0) | (b3 & 0x3F);\n\n if (chr < 0x800 || (chr >= 0xD800 && chr <= 0xDFFF)) {\n result += '\\ufffd\\ufffd\\ufffd';\n } else {\n result += String.fromCharCode(chr);\n }\n\n i += 6;\n continue;\n }\n }\n\n if ((b1 & 0xF8) === 0xF0 && (i + 9 < l)) {\n // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n b3 = parseInt(seq.slice(i + 7, i + 9), 16);\n b4 = parseInt(seq.slice(i + 10, i + 12), 16);\n\n if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80 && (b4 & 0xC0) === 0x80) {\n chr = ((b1 << 18) & 0x1C0000) | ((b2 << 12) & 0x3F000) | ((b3 << 6) & 0xFC0) | (b4 & 0x3F);\n\n if (chr < 0x10000 || chr > 0x10FFFF) {\n result += '\\ufffd\\ufffd\\ufffd\\ufffd';\n } else {\n chr -= 0x10000;\n result += String.fromCharCode(0xD800 + (chr >> 10), 0xDC00 + (chr & 0x3FF));\n }\n\n i += 9;\n continue;\n }\n }\n\n result += '\\ufffd';\n }\n\n return result;\n });\n}\n\n\ndecode.defaultChars = ';/?:@&=+$,#';\ndecode.componentChars = '';\n\n\nmodule.exports = decode;\n", "\n'use strict';\n\n\nmodule.exports = function format(url) {\n var result = '';\n\n result += url.protocol || '';\n result += url.slashes ? '//' : '';\n result += url.auth ? url.auth + '@' : '';\n\n if (url.hostname && url.hostname.indexOf(':') !== -1) {\n // ipv6 address\n result += '[' + url.hostname + ']';\n } else {\n result += url.hostname || '';\n }\n\n result += url.port ? ':' + url.port : '';\n result += url.pathname || '';\n result += url.search || '';\n result += url.hash || '';\n\n return result;\n};\n", "// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n//\n// Changes from joyent/node:\n//\n// 1. No leading slash in paths,\n// e.g. in `url.parse('http://foo?bar')` pathname is ``, not `/`\n//\n// 2. Backslashes are not replaced with slashes,\n// so `http:\\\\example.org\\` is treated like a relative path\n//\n// 3. Trailing colon is treated like a part of the path,\n// i.e. in `http://example.org:foo` pathname is `:foo`\n//\n// 4. Nothing is URL-encoded in the resulting object,\n// (in joyent/node some chars in auth and paths are encoded)\n//\n// 5. `url.parse()` does not have `parseQueryString` argument\n//\n// 6. Removed extraneous result properties: `host`, `path`, `query`, etc.,\n// which can be constructed using other parts of the url.\n//\n\n\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.pathname = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n\n // Special case for a simple path URL\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n // RFC 2396: characters reserved for delimiting URLs.\n // We actually just auto-escape these.\n delims = [ '<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t' ],\n\n // RFC 2396: characters not allowed for various reasons.\n unwise = [ '{', '}', '|', '\\\\', '^', '`' ].concat(delims),\n\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\n autoEscape = [ '\\'' ].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n // Note that any invalid chars are also handled, but these\n // are the ones that are *expected* to be seen, so we fast-path\n // them.\n nonHostChars = [ '%', '/', '?', ';', '#' ].concat(autoEscape),\n hostEndingChars = [ '/', '?', '#' ],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\n /* eslint-disable no-script-url */\n // protocols that never have a hostname.\n hostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that always contain a // bit.\n slashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n };\n /* eslint-enable no-script-url */\n\nfunction urlParse(url, slashesDenoteHost) {\n if (url && url instanceof Url) { return url; }\n\n var u = new Url();\n u.parse(url, slashesDenoteHost);\n return u;\n}\n\nUrl.prototype.parse = function(url, slashesDenoteHost) {\n var i, l, lowerProto, hec, slashes,\n rest = url;\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim();\n\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n if (simplePath) {\n this.pathname = simplePath[1];\n if (simplePath[2]) {\n this.search = simplePath[2];\n }\n return this;\n }\n }\n\n var proto = protocolPattern.exec(rest);\n if (proto) {\n proto = proto[0];\n lowerProto = proto.toLowerCase();\n this.protocol = proto;\n rest = rest.substr(proto.length);\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n slashes = rest.substr(0, 2) === '//';\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n\n if (!hostlessProtocol[proto] &&\n (slashes || (proto && !slashedProtocol[proto]))) {\n\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n for (i = 0; i < hostEndingChars.length; i++) {\n hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n hostEnd = hec;\n }\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n var auth, atSign;\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = auth;\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1;\n for (i = 0; i < nonHostChars.length; i++) {\n hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n hostEnd = hec;\n }\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1) {\n hostEnd = rest.length;\n }\n\n if (rest[hostEnd - 1] === ':') { hostEnd--; }\n var host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n\n // pull out port.\n this.parseHost(host);\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || '';\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n var ipv6Hostname = this.hostname[0] === '[' &&\n this.hostname[this.hostname.length - 1] === ']';\n\n // validate a little.\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n for (i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) { continue; }\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n if (notHost.length) {\n rest = notHost.join('.') + rest;\n }\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n }\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n }\n }\n\n // chop off from the tail first.\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var qm = rest.indexOf('?');\n if (qm !== -1) {\n this.search = rest.substr(qm);\n rest = rest.slice(0, qm);\n }\n if (rest) { this.pathname = rest; }\n if (slashedProtocol[lowerProto] &&\n this.hostname && !this.pathname) {\n this.pathname = '';\n }\n\n return this;\n};\n\nUrl.prototype.parseHost = function(host) {\n var port = portPattern.exec(host);\n if (port) {\n port = port[0];\n if (port !== ':') {\n this.port = port.substr(1);\n }\n host = host.substr(0, host.length - port.length);\n }\n if (host) { this.hostname = host; }\n};\n\nmodule.exports = urlParse;\n", "'use strict';\n\n\nmodule.exports.encode = require('./encode');\nmodule.exports.decode = require('./decode');\nmodule.exports.format = require('./format');\nmodule.exports.parse = require('./parse');\n", "module.exports=/[\\0-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/", "module.exports=/[\\0-\\x1F\\x7F-\\x9F]/", "module.exports=/[\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB]|\\uD804[\\uDCBD\\uDCCD]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]/", "module.exports=/[ \\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]/", "'use strict';\n\nexports.Any = require('./properties/Any/regex');\nexports.Cc = require('./categories/Cc/regex');\nexports.Cf = require('./categories/Cf/regex');\nexports.P = require('./categories/P/regex');\nexports.Z = require('./categories/Z/regex');\n", "// Utilities\n//\n'use strict';\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction isString(obj) { return _class(obj) === '[object String]'; }\n\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction has(object, key) {\n return _hasOwnProperty.call(object, key);\n}\n\n// Merge objects\n//\nfunction assign(obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n\n sources.forEach(function (source) {\n if (!source) { return; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be object');\n }\n\n Object.keys(source).forEach(function (key) {\n obj[key] = source[key];\n });\n });\n\n return obj;\n}\n\n// Remove element from array and put another array at those position.\n// Useful for some operations with tokens\nfunction arrayReplaceAt(src, pos, newElements) {\n return [].concat(src.slice(0, pos), newElements, src.slice(pos + 1));\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction isValidEntityCode(c) {\n /*eslint no-bitwise:0*/\n // broken sequence\n if (c >= 0xD800 && c <= 0xDFFF) { return false; }\n // never used\n if (c >= 0xFDD0 && c <= 0xFDEF) { return false; }\n if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false; }\n // control codes\n if (c >= 0x00 && c <= 0x08) { return false; }\n if (c === 0x0B) { return false; }\n if (c >= 0x0E && c <= 0x1F) { return false; }\n if (c >= 0x7F && c <= 0x9F) { return false; }\n // out of range\n if (c > 0x10FFFF) { return false; }\n return true;\n}\n\nfunction fromCodePoint(c) {\n /*eslint no-bitwise:0*/\n if (c > 0xffff) {\n c -= 0x10000;\n var surrogate1 = 0xd800 + (c >> 10),\n surrogate2 = 0xdc00 + (c & 0x3ff);\n\n return String.fromCharCode(surrogate1, surrogate2);\n }\n return String.fromCharCode(c);\n}\n\n\nvar UNESCAPE_MD_RE = /\\\\([!\"#$%&'()*+,\\-.\\/:;<=>?@[\\\\\\]^_`{|}~])/g;\nvar ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi;\nvar UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi');\n\nvar DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;\n\nvar entities = require('./entities');\n\nfunction replaceEntityPattern(match, name) {\n var code = 0;\n\n if (has(entities, name)) {\n return entities[name];\n }\n\n if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {\n code = name[1].toLowerCase() === 'x' ?\n parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10);\n\n if (isValidEntityCode(code)) {\n return fromCodePoint(code);\n }\n }\n\n return match;\n}\n\n/*function replaceEntities(str) {\n if (str.indexOf('&') < 0) { return str; }\n\n return str.replace(ENTITY_RE, replaceEntityPattern);\n}*/\n\nfunction unescapeMd(str) {\n if (str.indexOf('\\\\') < 0) { return str; }\n return str.replace(UNESCAPE_MD_RE, '$1');\n}\n\nfunction unescapeAll(str) {\n if (str.indexOf('\\\\') < 0 && str.indexOf('&') < 0) { return str; }\n\n return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {\n if (escaped) { return escaped; }\n return replaceEntityPattern(match, entity);\n });\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar HTML_ESCAPE_TEST_RE = /[&<>\"]/;\nvar HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g;\nvar HTML_REPLACEMENTS = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"'\n};\n\nfunction replaceUnsafeChar(ch) {\n return HTML_REPLACEMENTS[ch];\n}\n\nfunction escapeHtml(str) {\n if (HTML_ESCAPE_TEST_RE.test(str)) {\n return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar);\n }\n return str;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar REGEXP_ESCAPE_RE = /[.?*+^$[\\]\\\\(){}|-]/g;\n\nfunction escapeRE(str) {\n return str.replace(REGEXP_ESCAPE_RE, '\\\\$&');\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction isSpace(code) {\n switch (code) {\n case 0x09:\n case 0x20:\n return true;\n }\n return false;\n}\n\n// Zs (unicode class) || [\\t\\f\\v\\r\\n]\nfunction isWhiteSpace(code) {\n if (code >= 0x2000 && code <= 0x200A) { return true; }\n switch (code) {\n case 0x09: // \\t\n case 0x0A: // \\n\n case 0x0B: // \\v\n case 0x0C: // \\f\n case 0x0D: // \\r\n case 0x20:\n case 0xA0:\n case 0x1680:\n case 0x202F:\n case 0x205F:\n case 0x3000:\n return true;\n }\n return false;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/*eslint-disable max-len*/\nvar UNICODE_PUNCT_RE = require('uc.micro/categories/P/regex');\n\n// Currently without astral characters support.\nfunction isPunctChar(ch) {\n return UNICODE_PUNCT_RE.test(ch);\n}\n\n\n// Markdown ASCII punctuation characters.\n//\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\n//\n// Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.\n//\nfunction isMdAsciiPunct(ch) {\n switch (ch) {\n case 0x21/* ! */:\n case 0x22/* \" */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x27/* ' */:\n case 0x28/* ( */:\n case 0x29/* ) */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2C/* , */:\n case 0x2D/* - */:\n case 0x2E/* . */:\n case 0x2F/* / */:\n case 0x3A/* : */:\n case 0x3B/* ; */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x3F/* ? */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7C/* | */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true;\n default:\n return false;\n }\n}\n\n// Hepler to unify [reference labels].\n//\nfunction normalizeReference(str) {\n // Trim and collapse whitespace\n //\n str = str.trim().replace(/\\s+/g, ' ');\n\n // In node v10 '\u1E9E'.toLowerCase() === '\u1E7E', which is presumed to be a bug\n // fixed in v12 (couldn't find any details).\n //\n // So treat this one as a special case\n // (remove this when node v10 is no longer supported).\n //\n if ('\u1E9E'.toLowerCase() === '\u1E7E') {\n str = str.replace(/\u1E9E/g, '\u00DF');\n }\n\n // .toLowerCase().toUpperCase() should get rid of all differences\n // between letter variants.\n //\n // Simple .toLowerCase() doesn't normalize 125 code points correctly,\n // and .toUpperCase doesn't normalize 6 of them (list of exceptions:\n // \u0130, \u03F4, \u1E9E, \u2126, \u212A, \u212B - those are already uppercased, but have differently\n // uppercased versions).\n //\n // Here's an example showing how it happens. Lets take greek letter omega:\n // uppercase U+0398 (\u0398), U+03f4 (\u03F4) and lowercase U+03b8 (\u03B8), U+03d1 (\u03D1)\n //\n // Unicode entries:\n // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;\n // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398\n // 03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398\n // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8;\n //\n // Case-insensitive comparison should treat all of them as equivalent.\n //\n // But .toLowerCase() doesn't change \u03D1 (it's already lowercase),\n // and .toUpperCase() doesn't change \u03F4 (already uppercase).\n //\n // Applying first lower then upper case normalizes any character:\n // '\\u0398\\u03f4\\u03b8\\u03d1'.toLowerCase().toUpperCase() === '\\u0398\\u0398\\u0398\\u0398'\n //\n // Note: this is equivalent to unicode case folding; unicode normalization\n // is a different step that is not required here.\n //\n // Final result should be uppercased, because it's later stored in an object\n // (this avoid a conflict with Object.prototype members,\n // most notably, `__proto__`)\n //\n return str.toLowerCase().toUpperCase();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Re-export libraries commonly used in both markdown-it and its plugins,\n// so plugins won't have to depend on them explicitly, which reduces their\n// bundled size (e.g. a browser build).\n//\nexports.lib = {};\nexports.lib.mdurl = require('mdurl');\nexports.lib.ucmicro = require('uc.micro');\n\nexports.assign = assign;\nexports.isString = isString;\nexports.has = has;\nexports.unescapeMd = unescapeMd;\nexports.unescapeAll = unescapeAll;\nexports.isValidEntityCode = isValidEntityCode;\nexports.fromCodePoint = fromCodePoint;\n// exports.replaceEntities = replaceEntities;\nexports.escapeHtml = escapeHtml;\nexports.arrayReplaceAt = arrayReplaceAt;\nexports.isSpace = isSpace;\nexports.isWhiteSpace = isWhiteSpace;\nexports.isMdAsciiPunct = isMdAsciiPunct;\nexports.isPunctChar = isPunctChar;\nexports.escapeRE = escapeRE;\nexports.normalizeReference = normalizeReference;\n", "// Parse link label\n//\n// this function assumes that first character (\"[\") already matches;\n// returns the end of the label\n//\n'use strict';\n\nmodule.exports = function parseLinkLabel(state, start, disableNested) {\n var level, found, marker, prevPos,\n labelEnd = -1,\n max = state.posMax,\n oldPos = state.pos;\n\n state.pos = start + 1;\n level = 1;\n\n while (state.pos < max) {\n marker = state.src.charCodeAt(state.pos);\n if (marker === 0x5D /* ] */) {\n level--;\n if (level === 0) {\n found = true;\n break;\n }\n }\n\n prevPos = state.pos;\n state.md.inline.skipToken(state);\n if (marker === 0x5B /* [ */) {\n if (prevPos === state.pos - 1) {\n // increase level if we find text `[`, which is not a part of any token\n level++;\n } else if (disableNested) {\n state.pos = oldPos;\n return -1;\n }\n }\n }\n\n if (found) {\n labelEnd = state.pos;\n }\n\n // restore old state\n state.pos = oldPos;\n\n return labelEnd;\n};\n", "// Parse link destination\n//\n'use strict';\n\n\nvar unescapeAll = require('../common/utils').unescapeAll;\n\n\nmodule.exports = function parseLinkDestination(str, pos, max) {\n var code, level,\n lines = 0,\n start = pos,\n result = {\n ok: false,\n pos: 0,\n lines: 0,\n str: ''\n };\n\n if (str.charCodeAt(pos) === 0x3C /* < */) {\n pos++;\n while (pos < max) {\n code = str.charCodeAt(pos);\n if (code === 0x0A /* \\n */) { return result; }\n if (code === 0x3C /* < */) { return result; }\n if (code === 0x3E /* > */) {\n result.pos = pos + 1;\n result.str = unescapeAll(str.slice(start + 1, pos));\n result.ok = true;\n return result;\n }\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos += 2;\n continue;\n }\n\n pos++;\n }\n\n // no closing '>'\n return result;\n }\n\n // this should be ... } else { ... branch\n\n level = 0;\n while (pos < max) {\n code = str.charCodeAt(pos);\n\n if (code === 0x20) { break; }\n\n // ascii control characters\n if (code < 0x20 || code === 0x7F) { break; }\n\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\n if (str.charCodeAt(pos + 1) === 0x20) { break; }\n pos += 2;\n continue;\n }\n\n if (code === 0x28 /* ( */) {\n level++;\n if (level > 32) { return result; }\n }\n\n if (code === 0x29 /* ) */) {\n if (level === 0) { break; }\n level--;\n }\n\n pos++;\n }\n\n if (start === pos) { return result; }\n if (level !== 0) { return result; }\n\n result.str = unescapeAll(str.slice(start, pos));\n result.lines = lines;\n result.pos = pos;\n result.ok = true;\n return result;\n};\n", "// Parse link title\n//\n'use strict';\n\n\nvar unescapeAll = require('../common/utils').unescapeAll;\n\n\nmodule.exports = function parseLinkTitle(str, pos, max) {\n var code,\n marker,\n lines = 0,\n start = pos,\n result = {\n ok: false,\n pos: 0,\n lines: 0,\n str: ''\n };\n\n if (pos >= max) { return result; }\n\n marker = str.charCodeAt(pos);\n\n if (marker !== 0x22 /* \" */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { return result; }\n\n pos++;\n\n // if opening marker is \"(\", switch it to closing marker \")\"\n if (marker === 0x28) { marker = 0x29; }\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n if (code === marker) {\n result.pos = pos + 1;\n result.lines = lines;\n result.str = unescapeAll(str.slice(start + 1, pos));\n result.ok = true;\n return result;\n } else if (code === 0x28 /* ( */ && marker === 0x29 /* ) */) {\n return result;\n } else if (code === 0x0A) {\n lines++;\n } else if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos++;\n if (str.charCodeAt(pos) === 0x0A) {\n lines++;\n }\n }\n\n pos++;\n }\n\n return result;\n};\n", "// Just a shortcut for bulk export\n'use strict';\n\n\nexports.parseLinkLabel = require('./parse_link_label');\nexports.parseLinkDestination = require('./parse_link_destination');\nexports.parseLinkTitle = require('./parse_link_title');\n", "/**\n * class Renderer\n *\n * Generates HTML from parsed token stream. Each instance has independent\n * copy of rules. Those can be rewritten with ease. Also, you can add new\n * rules if you create plugin and adds new token types.\n **/\n'use strict';\n\n\nvar assign = require('./common/utils').assign;\nvar unescapeAll = require('./common/utils').unescapeAll;\nvar escapeHtml = require('./common/utils').escapeHtml;\n\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar default_rules = {};\n\n\ndefault_rules.code_inline = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n return '' +\n escapeHtml(tokens[idx].content) +\n '';\n};\n\n\ndefault_rules.code_block = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n return '' +\n escapeHtml(tokens[idx].content) +\n '\\n';\n};\n\n\ndefault_rules.fence = function (tokens, idx, options, env, slf) {\n var token = tokens[idx],\n info = token.info ? unescapeAll(token.info).trim() : '',\n langName = '',\n langAttrs = '',\n highlighted, i, arr, tmpAttrs, tmpToken;\n\n if (info) {\n arr = info.split(/(\\s+)/g);\n langName = arr[0];\n langAttrs = arr.slice(2).join('');\n }\n\n if (options.highlight) {\n highlighted = options.highlight(token.content, langName, langAttrs) || escapeHtml(token.content);\n } else {\n highlighted = escapeHtml(token.content);\n }\n\n if (highlighted.indexOf(''\n + highlighted\n + '\\n';\n }\n\n\n return '
'\n        + highlighted\n        + '
\\n';\n};\n\n\ndefault_rules.image = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n // \"alt\" attr MUST be set, even if empty. Because it's mandatory and\n // should be placed on proper position for tests.\n //\n // Replace content with actual value\n\n token.attrs[token.attrIndex('alt')][1] =\n slf.renderInlineAsText(token.children, options, env);\n\n return slf.renderToken(tokens, idx, options);\n};\n\n\ndefault_rules.hardbreak = function (tokens, idx, options /*, env */) {\n return options.xhtmlOut ? '
\\n' : '
\\n';\n};\ndefault_rules.softbreak = function (tokens, idx, options /*, env */) {\n return options.breaks ? (options.xhtmlOut ? '
\\n' : '
\\n') : '\\n';\n};\n\n\ndefault_rules.text = function (tokens, idx /*, options, env */) {\n return escapeHtml(tokens[idx].content);\n};\n\n\ndefault_rules.html_block = function (tokens, idx /*, options, env */) {\n return tokens[idx].content;\n};\ndefault_rules.html_inline = function (tokens, idx /*, options, env */) {\n return tokens[idx].content;\n};\n\n\n/**\n * new Renderer()\n *\n * Creates new [[Renderer]] instance and fill [[Renderer#rules]] with defaults.\n **/\nfunction Renderer() {\n\n /**\n * Renderer#rules -> Object\n *\n * Contains render rules for tokens. Can be updated and extended.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.renderer.rules.strong_open = function () { return ''; };\n * md.renderer.rules.strong_close = function () { return ''; };\n *\n * var result = md.renderInline(...);\n * ```\n *\n * Each rule is called as independent static function with fixed signature:\n *\n * ```javascript\n * function my_token_render(tokens, idx, options, env, renderer) {\n * // ...\n * return renderedHTML;\n * }\n * ```\n *\n * See [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js)\n * for more details and examples.\n **/\n this.rules = assign({}, default_rules);\n}\n\n\n/**\n * Renderer.renderAttrs(token) -> String\n *\n * Render token attributes to string.\n **/\nRenderer.prototype.renderAttrs = function renderAttrs(token) {\n var i, l, result;\n\n if (!token.attrs) { return ''; }\n\n result = '';\n\n for (i = 0, l = token.attrs.length; i < l; i++) {\n result += ' ' + escapeHtml(token.attrs[i][0]) + '=\"' + escapeHtml(token.attrs[i][1]) + '\"';\n }\n\n return result;\n};\n\n\n/**\n * Renderer.renderToken(tokens, idx, options) -> String\n * - tokens (Array): list of tokens\n * - idx (Numbed): token index to render\n * - options (Object): params of parser instance\n *\n * Default token renderer. Can be overriden by custom function\n * in [[Renderer#rules]].\n **/\nRenderer.prototype.renderToken = function renderToken(tokens, idx, options) {\n var nextToken,\n result = '',\n needLf = false,\n token = tokens[idx];\n\n // Tight list paragraphs\n if (token.hidden) {\n return '';\n }\n\n // Insert a newline between hidden paragraph and subsequent opening\n // block-level tag.\n //\n // For example, here we should insert a newline before blockquote:\n // - a\n // >\n //\n if (token.block && token.nesting !== -1 && idx && tokens[idx - 1].hidden) {\n result += '\\n';\n }\n\n // Add token name, e.g. ``.\n //\n needLf = false;\n }\n }\n }\n }\n\n result += needLf ? '>\\n' : '>';\n\n return result;\n};\n\n\n/**\n * Renderer.renderInline(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to render\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * The same as [[Renderer.render]], but for single token of `inline` type.\n **/\nRenderer.prototype.renderInline = function (tokens, options, env) {\n var type,\n result = '',\n rules = this.rules;\n\n for (var i = 0, len = tokens.length; i < len; i++) {\n type = tokens[i].type;\n\n if (typeof rules[type] !== 'undefined') {\n result += rules[type](tokens, i, options, env, this);\n } else {\n result += this.renderToken(tokens, i, options);\n }\n }\n\n return result;\n};\n\n\n/** internal\n * Renderer.renderInlineAsText(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to render\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Special kludge for image `alt` attributes to conform CommonMark spec.\n * Don't try to use it! Spec requires to show `alt` content with stripped markup,\n * instead of simple escaping.\n **/\nRenderer.prototype.renderInlineAsText = function (tokens, options, env) {\n var result = '';\n\n for (var i = 0, len = tokens.length; i < len; i++) {\n if (tokens[i].type === 'text') {\n result += tokens[i].content;\n } else if (tokens[i].type === 'image') {\n result += this.renderInlineAsText(tokens[i].children, options, env);\n } else if (tokens[i].type === 'softbreak') {\n result += '\\n';\n }\n }\n\n return result;\n};\n\n\n/**\n * Renderer.render(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to render\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Takes token stream and generates HTML. Probably, you will never need to call\n * this method directly.\n **/\nRenderer.prototype.render = function (tokens, options, env) {\n var i, len, type,\n result = '',\n rules = this.rules;\n\n for (i = 0, len = tokens.length; i < len; i++) {\n type = tokens[i].type;\n\n if (type === 'inline') {\n result += this.renderInline(tokens[i].children, options, env);\n } else if (typeof rules[type] !== 'undefined') {\n result += rules[tokens[i].type](tokens, i, options, env, this);\n } else {\n result += this.renderToken(tokens, i, options, env);\n }\n }\n\n return result;\n};\n\nmodule.exports = Renderer;\n", "/**\n * class Ruler\n *\n * Helper class, used by [[MarkdownIt#core]], [[MarkdownIt#block]] and\n * [[MarkdownIt#inline]] to manage sequences of functions (rules):\n *\n * - keep rules in defined order\n * - assign the name to each rule\n * - enable/disable rules\n * - add/replace rules\n * - allow assign rules to additional named chains (in the same)\n * - cacheing lists of active rules\n *\n * You will not need use this class directly until write plugins. For simple\n * rules control use [[MarkdownIt.disable]], [[MarkdownIt.enable]] and\n * [[MarkdownIt.use]].\n **/\n'use strict';\n\n\n/**\n * new Ruler()\n **/\nfunction Ruler() {\n // List of added rules. Each element is:\n //\n // {\n // name: XXX,\n // enabled: Boolean,\n // fn: Function(),\n // alt: [ name2, name3 ]\n // }\n //\n this.__rules__ = [];\n\n // Cached rule chains.\n //\n // First level - chain name, '' for default.\n // Second level - diginal anchor for fast filtering by charcodes.\n //\n this.__cache__ = null;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Helper methods, should not be used directly\n\n\n// Find rule index by name\n//\nRuler.prototype.__find__ = function (name) {\n for (var i = 0; i < this.__rules__.length; i++) {\n if (this.__rules__[i].name === name) {\n return i;\n }\n }\n return -1;\n};\n\n\n// Build rules lookup cache\n//\nRuler.prototype.__compile__ = function () {\n var self = this;\n var chains = [ '' ];\n\n // collect unique names\n self.__rules__.forEach(function (rule) {\n if (!rule.enabled) { return; }\n\n rule.alt.forEach(function (altName) {\n if (chains.indexOf(altName) < 0) {\n chains.push(altName);\n }\n });\n });\n\n self.__cache__ = {};\n\n chains.forEach(function (chain) {\n self.__cache__[chain] = [];\n self.__rules__.forEach(function (rule) {\n if (!rule.enabled) { return; }\n\n if (chain && rule.alt.indexOf(chain) < 0) { return; }\n\n self.__cache__[chain].push(rule.fn);\n });\n });\n};\n\n\n/**\n * Ruler.at(name, fn [, options])\n * - name (String): rule name to replace.\n * - fn (Function): new rule function.\n * - options (Object): new rule options (not mandatory).\n *\n * Replace rule by name with new function & options. Throws error if name not\n * found.\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * Replace existing typographer replacement rule with new one:\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.at('replacements', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.at = function (name, fn, options) {\n var index = this.__find__(name);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + name); }\n\n this.__rules__[index].fn = fn;\n this.__rules__[index].alt = opt.alt || [];\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.before(beforeName, ruleName, fn [, options])\n * - beforeName (String): new rule will be added before this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain before one with given name. See also\n * [[Ruler.after]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.block.ruler.before('paragraph', 'my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.before = function (beforeName, ruleName, fn, options) {\n var index = this.__find__(beforeName);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + beforeName); }\n\n this.__rules__.splice(index, 0, {\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.after(afterName, ruleName, fn [, options])\n * - afterName (String): new rule will be added after this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain after one with given name. See also\n * [[Ruler.before]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.inline.ruler.after('text', 'my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.after = function (afterName, ruleName, fn, options) {\n var index = this.__find__(afterName);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + afterName); }\n\n this.__rules__.splice(index + 1, 0, {\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n/**\n * Ruler.push(ruleName, fn [, options])\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Push new rule to the end of chain. See also\n * [[Ruler.before]], [[Ruler.after]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.push('my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.push = function (ruleName, fn, options) {\n var opt = options || {};\n\n this.__rules__.push({\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.enable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to enable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.disable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.enable = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n var result = [];\n\n // Search by name and enable\n list.forEach(function (name) {\n var idx = this.__find__(name);\n\n if (idx < 0) {\n if (ignoreInvalid) { return; }\n throw new Error('Rules manager: invalid rule name ' + name);\n }\n this.__rules__[idx].enabled = true;\n result.push(name);\n }, this);\n\n this.__cache__ = null;\n return result;\n};\n\n\n/**\n * Ruler.enableOnly(list [, ignoreInvalid])\n * - list (String|Array): list of rule names to enable (whitelist).\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names, and disable everything else. If any rule name\n * not found - throw Error. Errors can be disabled by second param.\n *\n * See also [[Ruler.disable]], [[Ruler.enable]].\n **/\nRuler.prototype.enableOnly = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n this.__rules__.forEach(function (rule) { rule.enabled = false; });\n\n this.enable(list, ignoreInvalid);\n};\n\n\n/**\n * Ruler.disable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Disable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.enable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.disable = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n var result = [];\n\n // Search by name and disable\n list.forEach(function (name) {\n var idx = this.__find__(name);\n\n if (idx < 0) {\n if (ignoreInvalid) { return; }\n throw new Error('Rules manager: invalid rule name ' + name);\n }\n this.__rules__[idx].enabled = false;\n result.push(name);\n }, this);\n\n this.__cache__ = null;\n return result;\n};\n\n\n/**\n * Ruler.getRules(chainName) -> Array\n *\n * Return array of active functions (rules) for given chain name. It analyzes\n * rules configuration, compiles caches if not exists and returns result.\n *\n * Default chain name is `''` (empty string). It can't be skipped. That's\n * done intentionally, to keep signature monomorphic for high speed.\n **/\nRuler.prototype.getRules = function (chainName) {\n if (this.__cache__ === null) {\n this.__compile__();\n }\n\n // Chain can be empty, if rules disabled. But we still have to return Array.\n return this.__cache__[chainName] || [];\n};\n\nmodule.exports = Ruler;\n", "// Normalize input string\n\n'use strict';\n\n\n// https://spec.commonmark.org/0.29/#line-ending\nvar NEWLINES_RE = /\\r\\n?|\\n/g;\nvar NULL_RE = /\\0/g;\n\n\nmodule.exports = function normalize(state) {\n var str;\n\n // Normalize newlines\n str = state.src.replace(NEWLINES_RE, '\\n');\n\n // Replace NULL characters\n str = str.replace(NULL_RE, '\\uFFFD');\n\n state.src = str;\n};\n", "'use strict';\n\n\nmodule.exports = function block(state) {\n var token;\n\n if (state.inlineMode) {\n token = new state.Token('inline', '', 0);\n token.content = state.src;\n token.map = [ 0, 1 ];\n token.children = [];\n state.tokens.push(token);\n } else {\n state.md.block.parse(state.src, state.md, state.env, state.tokens);\n }\n};\n", "'use strict';\n\nmodule.exports = function inline(state) {\n var tokens = state.tokens, tok, i, l;\n\n // Parse inlines\n for (i = 0, l = tokens.length; i < l; i++) {\n tok = tokens[i];\n if (tok.type === 'inline') {\n state.md.inline.parse(tok.content, state.md, state.env, tok.children);\n }\n }\n};\n", "// Replace link-like texts with link nodes.\n//\n// Currently restricted by `md.validateLink()` to http/https/ftp\n//\n'use strict';\n\n\nvar arrayReplaceAt = require('../common/utils').arrayReplaceAt;\n\n\nfunction isLinkOpen(str) {\n return /^\\s]/i.test(str);\n}\nfunction isLinkClose(str) {\n return /^<\\/a\\s*>/i.test(str);\n}\n\n\nmodule.exports = function linkify(state) {\n var i, j, l, tokens, token, currentToken, nodes, ln, text, pos, lastPos,\n level, htmlLinkLevel, url, fullUrl, urlText,\n blockTokens = state.tokens,\n links;\n\n if (!state.md.options.linkify) { return; }\n\n for (j = 0, l = blockTokens.length; j < l; j++) {\n if (blockTokens[j].type !== 'inline' ||\n !state.md.linkify.pretest(blockTokens[j].content)) {\n continue;\n }\n\n tokens = blockTokens[j].children;\n\n htmlLinkLevel = 0;\n\n // We scan from the end, to keep position when new tags added.\n // Use reversed logic in links start/end match\n for (i = tokens.length - 1; i >= 0; i--) {\n currentToken = tokens[i];\n\n // Skip content of markdown links\n if (currentToken.type === 'link_close') {\n i--;\n while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') {\n i--;\n }\n continue;\n }\n\n // Skip content of html tag links\n if (currentToken.type === 'html_inline') {\n if (isLinkOpen(currentToken.content) && htmlLinkLevel > 0) {\n htmlLinkLevel--;\n }\n if (isLinkClose(currentToken.content)) {\n htmlLinkLevel++;\n }\n }\n if (htmlLinkLevel > 0) { continue; }\n\n if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) {\n\n text = currentToken.content;\n links = state.md.linkify.match(text);\n\n // Now split string to nodes\n nodes = [];\n level = currentToken.level;\n lastPos = 0;\n\n for (ln = 0; ln < links.length; ln++) {\n\n url = links[ln].url;\n fullUrl = state.md.normalizeLink(url);\n if (!state.md.validateLink(fullUrl)) { continue; }\n\n urlText = links[ln].text;\n\n // Linkifier might send raw hostnames like \"example.com\", where url\n // starts with domain name. So we prepend http:// in those cases,\n // and remove it afterwards.\n //\n if (!links[ln].schema) {\n urlText = state.md.normalizeLinkText('http://' + urlText).replace(/^http:\\/\\//, '');\n } else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) {\n urlText = state.md.normalizeLinkText('mailto:' + urlText).replace(/^mailto:/, '');\n } else {\n urlText = state.md.normalizeLinkText(urlText);\n }\n\n pos = links[ln].index;\n\n if (pos > lastPos) {\n token = new state.Token('text', '', 0);\n token.content = text.slice(lastPos, pos);\n token.level = level;\n nodes.push(token);\n }\n\n token = new state.Token('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.level = level++;\n token.markup = 'linkify';\n token.info = 'auto';\n nodes.push(token);\n\n token = new state.Token('text', '', 0);\n token.content = urlText;\n token.level = level;\n nodes.push(token);\n\n token = new state.Token('link_close', 'a', -1);\n token.level = --level;\n token.markup = 'linkify';\n token.info = 'auto';\n nodes.push(token);\n\n lastPos = links[ln].lastIndex;\n }\n if (lastPos < text.length) {\n token = new state.Token('text', '', 0);\n token.content = text.slice(lastPos);\n token.level = level;\n nodes.push(token);\n }\n\n // replace current node\n blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, nodes);\n }\n }\n }\n};\n", "// Simple typographic replacements\n//\n// (c) (C) \u2192 \u00A9\n// (tm) (TM) \u2192 \u2122\n// (r) (R) \u2192 \u00AE\n// +- \u2192 \u00B1\n// (p) (P) -> \u00A7\n// ... \u2192 \u2026 (also ?.... \u2192 ?.., !.... \u2192 !..)\n// ???????? \u2192 ???, !!!!! \u2192 !!!, `,,` \u2192 `,`\n// -- \u2192 –, --- \u2192 —\n//\n'use strict';\n\n// TODO:\n// - fractionals 1/2, 1/4, 3/4 -> \u00BD, \u00BC, \u00BE\n// - miltiplication 2 x 4 -> 2 \u00D7 4\n\nvar RARE_RE = /\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/;\n\n// Workaround for phantomjs - need regex without /g flag,\n// or root check will fail every second time\nvar SCOPED_ABBR_TEST_RE = /\\((c|tm|r|p)\\)/i;\n\nvar SCOPED_ABBR_RE = /\\((c|tm|r|p)\\)/ig;\nvar SCOPED_ABBR = {\n c: '\u00A9',\n r: '\u00AE',\n p: '\u00A7',\n tm: '\u2122'\n};\n\nfunction replaceFn(match, name) {\n return SCOPED_ABBR[name.toLowerCase()];\n}\n\nfunction replace_scoped(inlineTokens) {\n var i, token, inside_autolink = 0;\n\n for (i = inlineTokens.length - 1; i >= 0; i--) {\n token = inlineTokens[i];\n\n if (token.type === 'text' && !inside_autolink) {\n token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn);\n }\n\n if (token.type === 'link_open' && token.info === 'auto') {\n inside_autolink--;\n }\n\n if (token.type === 'link_close' && token.info === 'auto') {\n inside_autolink++;\n }\n }\n}\n\nfunction replace_rare(inlineTokens) {\n var i, token, inside_autolink = 0;\n\n for (i = inlineTokens.length - 1; i >= 0; i--) {\n token = inlineTokens[i];\n\n if (token.type === 'text' && !inside_autolink) {\n if (RARE_RE.test(token.content)) {\n token.content = token.content\n .replace(/\\+-/g, '\u00B1')\n // .., ..., ....... -> \u2026\n // but ?..... & !..... -> ?.. & !..\n .replace(/\\.{2,}/g, '\u2026').replace(/([?!])\u2026/g, '$1..')\n .replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',')\n // em-dash\n .replace(/(^|[^-])---(?=[^-]|$)/mg, '$1\\u2014')\n // en-dash\n .replace(/(^|\\s)--(?=\\s|$)/mg, '$1\\u2013')\n .replace(/(^|[^-\\s])--(?=[^-\\s]|$)/mg, '$1\\u2013');\n }\n }\n\n if (token.type === 'link_open' && token.info === 'auto') {\n inside_autolink--;\n }\n\n if (token.type === 'link_close' && token.info === 'auto') {\n inside_autolink++;\n }\n }\n}\n\n\nmodule.exports = function replace(state) {\n var blkIdx;\n\n if (!state.md.options.typographer) { return; }\n\n for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n\n if (state.tokens[blkIdx].type !== 'inline') { continue; }\n\n if (SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)) {\n replace_scoped(state.tokens[blkIdx].children);\n }\n\n if (RARE_RE.test(state.tokens[blkIdx].content)) {\n replace_rare(state.tokens[blkIdx].children);\n }\n\n }\n};\n", "// Convert straight quotation marks to typographic ones\n//\n'use strict';\n\n\nvar isWhiteSpace = require('../common/utils').isWhiteSpace;\nvar isPunctChar = require('../common/utils').isPunctChar;\nvar isMdAsciiPunct = require('../common/utils').isMdAsciiPunct;\n\nvar QUOTE_TEST_RE = /['\"]/;\nvar QUOTE_RE = /['\"]/g;\nvar APOSTROPHE = '\\u2019'; /* \u2019 */\n\n\nfunction replaceAt(str, index, ch) {\n return str.substr(0, index) + ch + str.substr(index + 1);\n}\n\nfunction process_inlines(tokens, state) {\n var i, token, text, t, pos, max, thisLevel, item, lastChar, nextChar,\n isLastPunctChar, isNextPunctChar, isLastWhiteSpace, isNextWhiteSpace,\n canOpen, canClose, j, isSingle, stack, openQuote, closeQuote;\n\n stack = [];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n\n thisLevel = tokens[i].level;\n\n for (j = stack.length - 1; j >= 0; j--) {\n if (stack[j].level <= thisLevel) { break; }\n }\n stack.length = j + 1;\n\n if (token.type !== 'text') { continue; }\n\n text = token.content;\n pos = 0;\n max = text.length;\n\n /*eslint no-labels:0,block-scoped-var:0*/\n OUTER:\n while (pos < max) {\n QUOTE_RE.lastIndex = pos;\n t = QUOTE_RE.exec(text);\n if (!t) { break; }\n\n canOpen = canClose = true;\n pos = t.index + 1;\n isSingle = (t[0] === \"'\");\n\n // Find previous character,\n // default to space if it's the beginning of the line\n //\n lastChar = 0x20;\n\n if (t.index - 1 >= 0) {\n lastChar = text.charCodeAt(t.index - 1);\n } else {\n for (j = i - 1; j >= 0; j--) {\n if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // lastChar defaults to 0x20\n if (!tokens[j].content) continue; // should skip all tokens except 'text', 'html_inline' or 'code_inline'\n\n lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1);\n break;\n }\n }\n\n // Find next character,\n // default to space if it's the end of the line\n //\n nextChar = 0x20;\n\n if (pos < max) {\n nextChar = text.charCodeAt(pos);\n } else {\n for (j = i + 1; j < tokens.length; j++) {\n if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // nextChar defaults to 0x20\n if (!tokens[j].content) continue; // should skip all tokens except 'text', 'html_inline' or 'code_inline'\n\n nextChar = tokens[j].content.charCodeAt(0);\n break;\n }\n }\n\n isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));\n isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));\n\n isLastWhiteSpace = isWhiteSpace(lastChar);\n isNextWhiteSpace = isWhiteSpace(nextChar);\n\n if (isNextWhiteSpace) {\n canOpen = false;\n } else if (isNextPunctChar) {\n if (!(isLastWhiteSpace || isLastPunctChar)) {\n canOpen = false;\n }\n }\n\n if (isLastWhiteSpace) {\n canClose = false;\n } else if (isLastPunctChar) {\n if (!(isNextWhiteSpace || isNextPunctChar)) {\n canClose = false;\n }\n }\n\n if (nextChar === 0x22 /* \" */ && t[0] === '\"') {\n if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) {\n // special case: 1\"\" - count first quote as an inch\n canClose = canOpen = false;\n }\n }\n\n if (canOpen && canClose) {\n // Replace quotes in the middle of punctuation sequence, but not\n // in the middle of the words, i.e.:\n //\n // 1. foo \" bar \" baz - not replaced\n // 2. foo-\"-bar-\"-baz - replaced\n // 3. foo\"bar\"baz - not replaced\n //\n canOpen = isLastPunctChar;\n canClose = isNextPunctChar;\n }\n\n if (!canOpen && !canClose) {\n // middle of word\n if (isSingle) {\n token.content = replaceAt(token.content, t.index, APOSTROPHE);\n }\n continue;\n }\n\n if (canClose) {\n // this could be a closing quote, rewind the stack to get a match\n for (j = stack.length - 1; j >= 0; j--) {\n item = stack[j];\n if (stack[j].level < thisLevel) { break; }\n if (item.single === isSingle && stack[j].level === thisLevel) {\n item = stack[j];\n\n if (isSingle) {\n openQuote = state.md.options.quotes[2];\n closeQuote = state.md.options.quotes[3];\n } else {\n openQuote = state.md.options.quotes[0];\n closeQuote = state.md.options.quotes[1];\n }\n\n // replace token.content *before* tokens[item.token].content,\n // because, if they are pointing at the same token, replaceAt\n // could mess up indices when quote length != 1\n token.content = replaceAt(token.content, t.index, closeQuote);\n tokens[item.token].content = replaceAt(\n tokens[item.token].content, item.pos, openQuote);\n\n pos += closeQuote.length - 1;\n if (item.token === i) { pos += openQuote.length - 1; }\n\n text = token.content;\n max = text.length;\n\n stack.length = j;\n continue OUTER;\n }\n }\n }\n\n if (canOpen) {\n stack.push({\n token: i,\n pos: t.index,\n single: isSingle,\n level: thisLevel\n });\n } else if (canClose && isSingle) {\n token.content = replaceAt(token.content, t.index, APOSTROPHE);\n }\n }\n }\n}\n\n\nmodule.exports = function smartquotes(state) {\n /*eslint max-depth:0*/\n var blkIdx;\n\n if (!state.md.options.typographer) { return; }\n\n for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n\n if (state.tokens[blkIdx].type !== 'inline' ||\n !QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) {\n continue;\n }\n\n process_inlines(state.tokens[blkIdx].children, state);\n }\n};\n", "// Token class\n\n'use strict';\n\n\n/**\n * class Token\n **/\n\n/**\n * new Token(type, tag, nesting)\n *\n * Create new token and fill passed properties.\n **/\nfunction Token(type, tag, nesting) {\n /**\n * Token#type -> String\n *\n * Type of the token (string, e.g. \"paragraph_open\")\n **/\n this.type = type;\n\n /**\n * Token#tag -> String\n *\n * html tag name, e.g. \"p\"\n **/\n this.tag = tag;\n\n /**\n * Token#attrs -> Array\n *\n * Html attributes. Format: `[ [ name1, value1 ], [ name2, value2 ] ]`\n **/\n this.attrs = null;\n\n /**\n * Token#map -> Array\n *\n * Source map info. Format: `[ line_begin, line_end ]`\n **/\n this.map = null;\n\n /**\n * Token#nesting -> Number\n *\n * Level change (number in {-1, 0, 1} set), where:\n *\n * - `1` means the tag is opening\n * - `0` means the tag is self-closing\n * - `-1` means the tag is closing\n **/\n this.nesting = nesting;\n\n /**\n * Token#level -> Number\n *\n * nesting level, the same as `state.level`\n **/\n this.level = 0;\n\n /**\n * Token#children -> Array\n *\n * An array of child nodes (inline and img tokens)\n **/\n this.children = null;\n\n /**\n * Token#content -> String\n *\n * In a case of self-closing tag (code, html, fence, etc.),\n * it has contents of this tag.\n **/\n this.content = '';\n\n /**\n * Token#markup -> String\n *\n * '*' or '_' for emphasis, fence string for fence, etc.\n **/\n this.markup = '';\n\n /**\n * Token#info -> String\n *\n * Additional information:\n *\n * - Info string for \"fence\" tokens\n * - The value \"auto\" for autolink \"link_open\" and \"link_close\" tokens\n * - The string value of the item marker for ordered-list \"list_item_open\" tokens\n **/\n this.info = '';\n\n /**\n * Token#meta -> Object\n *\n * A place for plugins to store an arbitrary data\n **/\n this.meta = null;\n\n /**\n * Token#block -> Boolean\n *\n * True for block-level tokens, false for inline tokens.\n * Used in renderer to calculate line breaks\n **/\n this.block = false;\n\n /**\n * Token#hidden -> Boolean\n *\n * If it's true, ignore this element when rendering. Used for tight lists\n * to hide paragraphs.\n **/\n this.hidden = false;\n}\n\n\n/**\n * Token.attrIndex(name) -> Number\n *\n * Search attribute index by name.\n **/\nToken.prototype.attrIndex = function attrIndex(name) {\n var attrs, i, len;\n\n if (!this.attrs) { return -1; }\n\n attrs = this.attrs;\n\n for (i = 0, len = attrs.length; i < len; i++) {\n if (attrs[i][0] === name) { return i; }\n }\n return -1;\n};\n\n\n/**\n * Token.attrPush(attrData)\n *\n * Add `[ name, value ]` attribute to list. Init attrs if necessary\n **/\nToken.prototype.attrPush = function attrPush(attrData) {\n if (this.attrs) {\n this.attrs.push(attrData);\n } else {\n this.attrs = [ attrData ];\n }\n};\n\n\n/**\n * Token.attrSet(name, value)\n *\n * Set `name` attribute to `value`. Override old value if exists.\n **/\nToken.prototype.attrSet = function attrSet(name, value) {\n var idx = this.attrIndex(name),\n attrData = [ name, value ];\n\n if (idx < 0) {\n this.attrPush(attrData);\n } else {\n this.attrs[idx] = attrData;\n }\n};\n\n\n/**\n * Token.attrGet(name)\n *\n * Get the value of attribute `name`, or null if it does not exist.\n **/\nToken.prototype.attrGet = function attrGet(name) {\n var idx = this.attrIndex(name), value = null;\n if (idx >= 0) {\n value = this.attrs[idx][1];\n }\n return value;\n};\n\n\n/**\n * Token.attrJoin(name, value)\n *\n * Join value to existing attribute via space. Or create new attribute if not\n * exists. Useful to operate with token classes.\n **/\nToken.prototype.attrJoin = function attrJoin(name, value) {\n var idx = this.attrIndex(name);\n\n if (idx < 0) {\n this.attrPush([ name, value ]);\n } else {\n this.attrs[idx][1] = this.attrs[idx][1] + ' ' + value;\n }\n};\n\n\nmodule.exports = Token;\n", "// Core state object\n//\n'use strict';\n\nvar Token = require('../token');\n\n\nfunction StateCore(src, md, env) {\n this.src = src;\n this.env = env;\n this.tokens = [];\n this.inlineMode = false;\n this.md = md; // link to parser instance\n}\n\n// re-export Token class to use in core rules\nStateCore.prototype.Token = Token;\n\n\nmodule.exports = StateCore;\n", "/** internal\n * class Core\n *\n * Top-level rules executor. Glues block/inline parsers and does intermediate\n * transformations.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\nvar _rules = [\n [ 'normalize', require('./rules_core/normalize') ],\n [ 'block', require('./rules_core/block') ],\n [ 'inline', require('./rules_core/inline') ],\n [ 'linkify', require('./rules_core/linkify') ],\n [ 'replacements', require('./rules_core/replacements') ],\n [ 'smartquotes', require('./rules_core/smartquotes') ]\n];\n\n\n/**\n * new Core()\n **/\nfunction Core() {\n /**\n * Core#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of core rules.\n **/\n this.ruler = new Ruler();\n\n for (var i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1]);\n }\n}\n\n\n/**\n * Core.process(state)\n *\n * Executes core chain rules.\n **/\nCore.prototype.process = function (state) {\n var i, l, rules;\n\n rules = this.ruler.getRules('');\n\n for (i = 0, l = rules.length; i < l; i++) {\n rules[i](state);\n }\n};\n\nCore.prototype.State = require('./rules_core/state_core');\n\n\nmodule.exports = Core;\n", "// GFM table, https://github.github.com/gfm/#tables-extension-\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nfunction getLine(state, line) {\n var pos = state.bMarks[line] + state.tShift[line],\n max = state.eMarks[line];\n\n return state.src.substr(pos, max - pos);\n}\n\nfunction escapedSplit(str) {\n var result = [],\n pos = 0,\n max = str.length,\n ch,\n isEscaped = false,\n lastPos = 0,\n current = '';\n\n ch = str.charCodeAt(pos);\n\n while (pos < max) {\n if (ch === 0x7c/* | */) {\n if (!isEscaped) {\n // pipe separating cells, '|'\n result.push(current + str.substring(lastPos, pos));\n current = '';\n lastPos = pos + 1;\n } else {\n // escaped pipe, '\\|'\n current += str.substring(lastPos, pos - 1);\n lastPos = pos;\n }\n }\n\n isEscaped = (ch === 0x5c/* \\ */);\n pos++;\n\n ch = str.charCodeAt(pos);\n }\n\n result.push(current + str.substring(lastPos));\n\n return result;\n}\n\n\nmodule.exports = function table(state, startLine, endLine, silent) {\n var ch, lineText, pos, i, l, nextLine, columns, columnCount, token,\n aligns, t, tableLines, tbodyLines, oldParentType, terminate,\n terminatorRules, firstCh, secondCh;\n\n // should have at least two lines\n if (startLine + 2 > endLine) { return false; }\n\n nextLine = startLine + 1;\n\n if (state.sCount[nextLine] < state.blkIndent) { return false; }\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[nextLine] - state.blkIndent >= 4) { return false; }\n\n // first character of the second line should be '|', '-', ':',\n // and no other characters are allowed but spaces;\n // basically, this is the equivalent of /^[-:|][-:|\\s]*$/ regexp\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n if (pos >= state.eMarks[nextLine]) { return false; }\n\n firstCh = state.src.charCodeAt(pos++);\n if (firstCh !== 0x7C/* | */ && firstCh !== 0x2D/* - */ && firstCh !== 0x3A/* : */) { return false; }\n\n if (pos >= state.eMarks[nextLine]) { return false; }\n\n secondCh = state.src.charCodeAt(pos++);\n if (secondCh !== 0x7C/* | */ && secondCh !== 0x2D/* - */ && secondCh !== 0x3A/* : */ && !isSpace(secondCh)) {\n return false;\n }\n\n // if first character is '-', then second character must not be a space\n // (due to parsing ambiguity with list)\n if (firstCh === 0x2D/* - */ && isSpace(secondCh)) { return false; }\n\n while (pos < state.eMarks[nextLine]) {\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */ && !isSpace(ch)) { return false; }\n\n pos++;\n }\n\n lineText = getLine(state, startLine + 1);\n\n columns = lineText.split('|');\n aligns = [];\n for (i = 0; i < columns.length; i++) {\n t = columns[i].trim();\n if (!t) {\n // allow empty columns before and after table, but not in between columns;\n // e.g. allow ` |---| `, disallow ` ---||--- `\n if (i === 0 || i === columns.length - 1) {\n continue;\n } else {\n return false;\n }\n }\n\n if (!/^:?-+:?$/.test(t)) { return false; }\n if (t.charCodeAt(t.length - 1) === 0x3A/* : */) {\n aligns.push(t.charCodeAt(0) === 0x3A/* : */ ? 'center' : 'right');\n } else if (t.charCodeAt(0) === 0x3A/* : */) {\n aligns.push('left');\n } else {\n aligns.push('');\n }\n }\n\n lineText = getLine(state, startLine).trim();\n if (lineText.indexOf('|') === -1) { return false; }\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n columns = escapedSplit(lineText);\n if (columns.length && columns[0] === '') columns.shift();\n if (columns.length && columns[columns.length - 1] === '') columns.pop();\n\n // header row will define an amount of columns in the entire table,\n // and align row should be exactly the same (the rest of the rows can differ)\n columnCount = columns.length;\n if (columnCount === 0 || columnCount !== aligns.length) { return false; }\n\n if (silent) { return true; }\n\n oldParentType = state.parentType;\n state.parentType = 'table';\n\n // use 'blockquote' lists for termination because it's\n // the most similar to tables\n terminatorRules = state.md.block.ruler.getRules('blockquote');\n\n token = state.push('table_open', 'table', 1);\n token.map = tableLines = [ startLine, 0 ];\n\n token = state.push('thead_open', 'thead', 1);\n token.map = [ startLine, startLine + 1 ];\n\n token = state.push('tr_open', 'tr', 1);\n token.map = [ startLine, startLine + 1 ];\n\n for (i = 0; i < columns.length; i++) {\n token = state.push('th_open', 'th', 1);\n if (aligns[i]) {\n token.attrs = [ [ 'style', 'text-align:' + aligns[i] ] ];\n }\n\n token = state.push('inline', '', 0);\n token.content = columns[i].trim();\n token.children = [];\n\n token = state.push('th_close', 'th', -1);\n }\n\n token = state.push('tr_close', 'tr', -1);\n token = state.push('thead_close', 'thead', -1);\n\n for (nextLine = startLine + 2; nextLine < endLine; nextLine++) {\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n\n if (terminate) { break; }\n lineText = getLine(state, nextLine).trim();\n if (!lineText) { break; }\n if (state.sCount[nextLine] - state.blkIndent >= 4) { break; }\n columns = escapedSplit(lineText);\n if (columns.length && columns[0] === '') columns.shift();\n if (columns.length && columns[columns.length - 1] === '') columns.pop();\n\n if (nextLine === startLine + 2) {\n token = state.push('tbody_open', 'tbody', 1);\n token.map = tbodyLines = [ startLine + 2, 0 ];\n }\n\n token = state.push('tr_open', 'tr', 1);\n token.map = [ nextLine, nextLine + 1 ];\n\n for (i = 0; i < columnCount; i++) {\n token = state.push('td_open', 'td', 1);\n if (aligns[i]) {\n token.attrs = [ [ 'style', 'text-align:' + aligns[i] ] ];\n }\n\n token = state.push('inline', '', 0);\n token.content = columns[i] ? columns[i].trim() : '';\n token.children = [];\n\n token = state.push('td_close', 'td', -1);\n }\n token = state.push('tr_close', 'tr', -1);\n }\n\n if (tbodyLines) {\n token = state.push('tbody_close', 'tbody', -1);\n tbodyLines[1] = nextLine;\n }\n\n token = state.push('table_close', 'table', -1);\n tableLines[1] = nextLine;\n\n state.parentType = oldParentType;\n state.line = nextLine;\n return true;\n};\n", "// Code block (4 spaces padded)\n\n'use strict';\n\n\nmodule.exports = function code(state, startLine, endLine/*, silent*/) {\n var nextLine, last, token;\n\n if (state.sCount[startLine] - state.blkIndent < 4) { return false; }\n\n last = nextLine = startLine + 1;\n\n while (nextLine < endLine) {\n if (state.isEmpty(nextLine)) {\n nextLine++;\n continue;\n }\n\n if (state.sCount[nextLine] - state.blkIndent >= 4) {\n nextLine++;\n last = nextLine;\n continue;\n }\n break;\n }\n\n state.line = last;\n\n token = state.push('code_block', 'code', 0);\n token.content = state.getLines(startLine, last, 4 + state.blkIndent, false) + '\\n';\n token.map = [ startLine, state.line ];\n\n return true;\n};\n", "// fences (``` lang, ~~~ lang)\n\n'use strict';\n\n\nmodule.exports = function fence(state, startLine, endLine, silent) {\n var marker, len, params, nextLine, mem, token, markup,\n haveEndMarker = false,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (pos + 3 > max) { return false; }\n\n marker = state.src.charCodeAt(pos);\n\n if (marker !== 0x7E/* ~ */ && marker !== 0x60 /* ` */) {\n return false;\n }\n\n // scan marker length\n mem = pos;\n pos = state.skipChars(pos, marker);\n\n len = pos - mem;\n\n if (len < 3) { return false; }\n\n markup = state.src.slice(mem, pos);\n params = state.src.slice(pos, max);\n\n if (marker === 0x60 /* ` */) {\n if (params.indexOf(String.fromCharCode(marker)) >= 0) {\n return false;\n }\n }\n\n // Since start is found, we can report success here in validation mode\n if (silent) { return true; }\n\n // search end of block\n nextLine = startLine;\n\n for (;;) {\n nextLine++;\n if (nextLine >= endLine) {\n // unclosed block should be autoclosed by end of document.\n // also block seems to be autoclosed by end of parent\n break;\n }\n\n pos = mem = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos < max && state.sCount[nextLine] < state.blkIndent) {\n // non-empty line with negative indent should stop the list:\n // - ```\n // test\n break;\n }\n\n if (state.src.charCodeAt(pos) !== marker) { continue; }\n\n if (state.sCount[nextLine] - state.blkIndent >= 4) {\n // closing fence should be indented less than 4 spaces\n continue;\n }\n\n pos = state.skipChars(pos, marker);\n\n // closing code fence must be at least as long as the opening one\n if (pos - mem < len) { continue; }\n\n // make sure tail has spaces only\n pos = state.skipSpaces(pos);\n\n if (pos < max) { continue; }\n\n haveEndMarker = true;\n // found!\n break;\n }\n\n // If a fence has heading spaces, they should be removed from its inner block\n len = state.sCount[startLine];\n\n state.line = nextLine + (haveEndMarker ? 1 : 0);\n\n token = state.push('fence', 'code', 0);\n token.info = params;\n token.content = state.getLines(startLine + 1, nextLine, len, true);\n token.markup = markup;\n token.map = [ startLine, state.line ];\n\n return true;\n};\n", "// Block quotes\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function blockquote(state, startLine, endLine, silent) {\n var adjustTab,\n ch,\n i,\n initial,\n l,\n lastLineEmpty,\n lines,\n nextLine,\n offset,\n oldBMarks,\n oldBSCount,\n oldIndent,\n oldParentType,\n oldSCount,\n oldTShift,\n spaceAfterMarker,\n terminate,\n terminatorRules,\n token,\n isOutdented,\n oldLineMax = state.lineMax,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n // check the block quote marker\n if (state.src.charCodeAt(pos++) !== 0x3E/* > */) { return false; }\n\n // we know that it's going to be a valid blockquote,\n // so no point trying to find the end of it in silent mode\n if (silent) { return true; }\n\n // set offset past spaces and \">\"\n initial = offset = state.sCount[startLine] + 1;\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[startLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n oldBMarks = [ state.bMarks[startLine] ];\n state.bMarks[startLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[startLine] + (adjustTab ? 1 : 0)) % 4;\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n oldBSCount = [ state.bsCount[startLine] ];\n state.bsCount[startLine] = state.sCount[startLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n lastLineEmpty = pos >= max;\n\n oldSCount = [ state.sCount[startLine] ];\n state.sCount[startLine] = offset - initial;\n\n oldTShift = [ state.tShift[startLine] ];\n state.tShift[startLine] = pos - state.bMarks[startLine];\n\n terminatorRules = state.md.block.ruler.getRules('blockquote');\n\n oldParentType = state.parentType;\n state.parentType = 'blockquote';\n\n // Search the end of the block\n //\n // Block ends with either:\n // 1. an empty line outside:\n // ```\n // > test\n //\n // ```\n // 2. an empty line inside:\n // ```\n // >\n // test\n // ```\n // 3. another tag:\n // ```\n // > test\n // - - -\n // ```\n for (nextLine = startLine + 1; nextLine < endLine; nextLine++) {\n // check if it's outdented, i.e. it's inside list item and indented\n // less than said list item:\n //\n // ```\n // 1. anything\n // > current blockquote\n // 2. checking this line\n // ```\n isOutdented = state.sCount[nextLine] < state.blkIndent;\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos >= max) {\n // Case 1: line is not inside the blockquote, and this line is empty.\n break;\n }\n\n if (state.src.charCodeAt(pos++) === 0x3E/* > */ && !isOutdented) {\n // This line is inside the blockquote.\n\n // set offset past spaces and \">\"\n initial = offset = state.sCount[nextLine] + 1;\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[nextLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n state.bMarks[nextLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4;\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n lastLineEmpty = pos >= max;\n\n oldBSCount.push(state.bsCount[nextLine]);\n state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] = offset - initial;\n\n oldTShift.push(state.tShift[nextLine]);\n state.tShift[nextLine] = pos - state.bMarks[nextLine];\n continue;\n }\n\n // Case 2: line is not inside the blockquote, and the last line was empty.\n if (lastLineEmpty) { break; }\n\n // Case 3: another tag found.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n\n if (terminate) {\n // Quirk to enforce \"hard termination mode\" for paragraphs;\n // normally if you call `tokenize(state, startLine, nextLine)`,\n // paragraphs will look below nextLine for paragraph continuation,\n // but if blockquote is terminated by another tag, they shouldn't\n state.lineMax = nextLine;\n\n if (state.blkIndent !== 0) {\n // state.blkIndent was non-zero, we now set it to zero,\n // so we need to re-calculate all offsets to appear as\n // if indent wasn't changed\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] -= state.blkIndent;\n }\n\n break;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n\n // A negative indentation means that this is a paragraph continuation\n //\n state.sCount[nextLine] = -1;\n }\n\n oldIndent = state.blkIndent;\n state.blkIndent = 0;\n\n token = state.push('blockquote_open', 'blockquote', 1);\n token.markup = '>';\n token.map = lines = [ startLine, 0 ];\n\n state.md.block.tokenize(state, startLine, nextLine);\n\n token = state.push('blockquote_close', 'blockquote', -1);\n token.markup = '>';\n\n state.lineMax = oldLineMax;\n state.parentType = oldParentType;\n lines[1] = state.line;\n\n // Restore original tShift; this might not be necessary since the parser\n // has already been here, but just to make sure we can do that.\n for (i = 0; i < oldTShift.length; i++) {\n state.bMarks[i + startLine] = oldBMarks[i];\n state.tShift[i + startLine] = oldTShift[i];\n state.sCount[i + startLine] = oldSCount[i];\n state.bsCount[i + startLine] = oldBSCount[i];\n }\n state.blkIndent = oldIndent;\n\n return true;\n};\n", "// Horizontal rule\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function hr(state, startLine, endLine, silent) {\n var marker, cnt, ch, token,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n marker = state.src.charCodeAt(pos++);\n\n // Check hr marker\n if (marker !== 0x2A/* * */ &&\n marker !== 0x2D/* - */ &&\n marker !== 0x5F/* _ */) {\n return false;\n }\n\n // markers can be mixed with spaces, but there should be at least 3 of them\n\n cnt = 1;\n while (pos < max) {\n ch = state.src.charCodeAt(pos++);\n if (ch !== marker && !isSpace(ch)) { return false; }\n if (ch === marker) { cnt++; }\n }\n\n if (cnt < 3) { return false; }\n\n if (silent) { return true; }\n\n state.line = startLine + 1;\n\n token = state.push('hr', 'hr', 0);\n token.map = [ startLine, state.line ];\n token.markup = Array(cnt + 1).join(String.fromCharCode(marker));\n\n return true;\n};\n", "// Lists\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\n// Search `[-+*][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipBulletListMarker(state, startLine) {\n var marker, pos, max, ch;\n\n pos = state.bMarks[startLine] + state.tShift[startLine];\n max = state.eMarks[startLine];\n\n marker = state.src.charCodeAt(pos++);\n // Check bullet\n if (marker !== 0x2A/* * */ &&\n marker !== 0x2D/* - */ &&\n marker !== 0x2B/* + */) {\n return -1;\n }\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (!isSpace(ch)) {\n // \" -test \" - is not a list item\n return -1;\n }\n }\n\n return pos;\n}\n\n// Search `\\d+[.)][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipOrderedListMarker(state, startLine) {\n var ch,\n start = state.bMarks[startLine] + state.tShift[startLine],\n pos = start,\n max = state.eMarks[startLine];\n\n // List marker should have at least 2 chars (digit + dot)\n if (pos + 1 >= max) { return -1; }\n\n ch = state.src.charCodeAt(pos++);\n\n if (ch < 0x30/* 0 */ || ch > 0x39/* 9 */) { return -1; }\n\n for (;;) {\n // EOL -> fail\n if (pos >= max) { return -1; }\n\n ch = state.src.charCodeAt(pos++);\n\n if (ch >= 0x30/* 0 */ && ch <= 0x39/* 9 */) {\n\n // List marker should have no more than 9 digits\n // (prevents integer overflow in browsers)\n if (pos - start >= 10) { return -1; }\n\n continue;\n }\n\n // found valid marker\n if (ch === 0x29/* ) */ || ch === 0x2e/* . */) {\n break;\n }\n\n return -1;\n }\n\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (!isSpace(ch)) {\n // \" 1.test \" - is not a list item\n return -1;\n }\n }\n return pos;\n}\n\nfunction markTightParagraphs(state, idx) {\n var i, l,\n level = state.level + 2;\n\n for (i = idx + 2, l = state.tokens.length - 2; i < l; i++) {\n if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') {\n state.tokens[i + 2].hidden = true;\n state.tokens[i].hidden = true;\n i += 2;\n }\n }\n}\n\n\nmodule.exports = function list(state, startLine, endLine, silent) {\n var ch,\n contentStart,\n i,\n indent,\n indentAfterMarker,\n initial,\n isOrdered,\n itemLines,\n l,\n listLines,\n listTokIdx,\n markerCharCode,\n markerValue,\n max,\n nextLine,\n offset,\n oldListIndent,\n oldParentType,\n oldSCount,\n oldTShift,\n oldTight,\n pos,\n posAfterMarker,\n prevEmptyEnd,\n start,\n terminate,\n terminatorRules,\n token,\n isTerminatingParagraph = false,\n tight = true;\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n // Special case:\n // - item 1\n // - item 2\n // - item 3\n // - item 4\n // - this one is a paragraph continuation\n if (state.listIndent >= 0 &&\n state.sCount[startLine] - state.listIndent >= 4 &&\n state.sCount[startLine] < state.blkIndent) {\n return false;\n }\n\n // limit conditions when list can interrupt\n // a paragraph (validation mode only)\n if (silent && state.parentType === 'paragraph') {\n // Next list item should still terminate previous list item;\n //\n // This code can fail if plugins use blkIndent as well as lists,\n // but I hope the spec gets fixed long before that happens.\n //\n if (state.sCount[startLine] >= state.blkIndent) {\n isTerminatingParagraph = true;\n }\n }\n\n // Detect list type and position after marker\n if ((posAfterMarker = skipOrderedListMarker(state, startLine)) >= 0) {\n isOrdered = true;\n start = state.bMarks[startLine] + state.tShift[startLine];\n markerValue = Number(state.src.slice(start, posAfterMarker - 1));\n\n // If we're starting a new ordered list right after\n // a paragraph, it should start with 1.\n if (isTerminatingParagraph && markerValue !== 1) return false;\n\n } else if ((posAfterMarker = skipBulletListMarker(state, startLine)) >= 0) {\n isOrdered = false;\n\n } else {\n return false;\n }\n\n // If we're starting a new unordered list right after\n // a paragraph, first line should not be empty.\n if (isTerminatingParagraph) {\n if (state.skipSpaces(posAfterMarker) >= state.eMarks[startLine]) return false;\n }\n\n // We should terminate list on style change. Remember first one to compare.\n markerCharCode = state.src.charCodeAt(posAfterMarker - 1);\n\n // For validation mode we can terminate immediately\n if (silent) { return true; }\n\n // Start list\n listTokIdx = state.tokens.length;\n\n if (isOrdered) {\n token = state.push('ordered_list_open', 'ol', 1);\n if (markerValue !== 1) {\n token.attrs = [ [ 'start', markerValue ] ];\n }\n\n } else {\n token = state.push('bullet_list_open', 'ul', 1);\n }\n\n token.map = listLines = [ startLine, 0 ];\n token.markup = String.fromCharCode(markerCharCode);\n\n //\n // Iterate list items\n //\n\n nextLine = startLine;\n prevEmptyEnd = false;\n terminatorRules = state.md.block.ruler.getRules('list');\n\n oldParentType = state.parentType;\n state.parentType = 'list';\n\n while (nextLine < endLine) {\n pos = posAfterMarker;\n max = state.eMarks[nextLine];\n\n initial = offset = state.sCount[nextLine] + posAfterMarker - (state.bMarks[startLine] + state.tShift[startLine]);\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[nextLine]) % 4;\n } else if (ch === 0x20) {\n offset++;\n } else {\n break;\n }\n\n pos++;\n }\n\n contentStart = pos;\n\n if (contentStart >= max) {\n // trimming space in \"- \\n 3\" case, indent is 1 here\n indentAfterMarker = 1;\n } else {\n indentAfterMarker = offset - initial;\n }\n\n // If we have more than 4 spaces, the indent is 1\n // (the rest is just indented code block)\n if (indentAfterMarker > 4) { indentAfterMarker = 1; }\n\n // \" - test\"\n // ^^^^^ - calculating total length of this thing\n indent = initial + indentAfterMarker;\n\n // Run subparser & write tokens\n token = state.push('list_item_open', 'li', 1);\n token.markup = String.fromCharCode(markerCharCode);\n token.map = itemLines = [ startLine, 0 ];\n if (isOrdered) {\n token.info = state.src.slice(start, posAfterMarker - 1);\n }\n\n // change current state, then restore it after parser subcall\n oldTight = state.tight;\n oldTShift = state.tShift[startLine];\n oldSCount = state.sCount[startLine];\n\n // - example list\n // ^ listIndent position will be here\n // ^ blkIndent position will be here\n //\n oldListIndent = state.listIndent;\n state.listIndent = state.blkIndent;\n state.blkIndent = indent;\n\n state.tight = true;\n state.tShift[startLine] = contentStart - state.bMarks[startLine];\n state.sCount[startLine] = offset;\n\n if (contentStart >= max && state.isEmpty(startLine + 1)) {\n // workaround for this case\n // (list item is empty, list terminates before \"foo\"):\n // ~~~~~~~~\n // -\n //\n // foo\n // ~~~~~~~~\n state.line = Math.min(state.line + 2, endLine);\n } else {\n state.md.block.tokenize(state, startLine, endLine, true);\n }\n\n // If any of list item is tight, mark list as tight\n if (!state.tight || prevEmptyEnd) {\n tight = false;\n }\n // Item become loose if finish with empty line,\n // but we should filter last element, because it means list finish\n prevEmptyEnd = (state.line - startLine) > 1 && state.isEmpty(state.line - 1);\n\n state.blkIndent = state.listIndent;\n state.listIndent = oldListIndent;\n state.tShift[startLine] = oldTShift;\n state.sCount[startLine] = oldSCount;\n state.tight = oldTight;\n\n token = state.push('list_item_close', 'li', -1);\n token.markup = String.fromCharCode(markerCharCode);\n\n nextLine = startLine = state.line;\n itemLines[1] = nextLine;\n contentStart = state.bMarks[startLine];\n\n if (nextLine >= endLine) { break; }\n\n //\n // Try to check if list is terminated or continued.\n //\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { break; }\n\n // fail if terminating block found\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n\n // fail if list has another type\n if (isOrdered) {\n posAfterMarker = skipOrderedListMarker(state, nextLine);\n if (posAfterMarker < 0) { break; }\n start = state.bMarks[nextLine] + state.tShift[nextLine];\n } else {\n posAfterMarker = skipBulletListMarker(state, nextLine);\n if (posAfterMarker < 0) { break; }\n }\n\n if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { break; }\n }\n\n // Finalize list\n if (isOrdered) {\n token = state.push('ordered_list_close', 'ol', -1);\n } else {\n token = state.push('bullet_list_close', 'ul', -1);\n }\n token.markup = String.fromCharCode(markerCharCode);\n\n listLines[1] = nextLine;\n state.line = nextLine;\n\n state.parentType = oldParentType;\n\n // mark paragraphs tight if needed\n if (tight) {\n markTightParagraphs(state, listTokIdx);\n }\n\n return true;\n};\n", "'use strict';\n\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function reference(state, startLine, _endLine, silent) {\n var ch,\n destEndPos,\n destEndLineNo,\n endLine,\n href,\n i,\n l,\n label,\n labelEnd,\n oldParentType,\n res,\n start,\n str,\n terminate,\n terminatorRules,\n title,\n lines = 0,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine],\n nextLine = startLine + 1;\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (state.src.charCodeAt(pos) !== 0x5B/* [ */) { return false; }\n\n // Simple check to quickly interrupt scan on [link](url) at the start of line.\n // Can be useful on practice: https://github.com/markdown-it/markdown-it/issues/54\n while (++pos < max) {\n if (state.src.charCodeAt(pos) === 0x5D /* ] */ &&\n state.src.charCodeAt(pos - 1) !== 0x5C/* \\ */) {\n if (pos + 1 === max) { return false; }\n if (state.src.charCodeAt(pos + 1) !== 0x3A/* : */) { return false; }\n break;\n }\n }\n\n endLine = state.lineMax;\n\n // jump line-by-line until empty one or EOF\n terminatorRules = state.md.block.ruler.getRules('reference');\n\n oldParentType = state.parentType;\n state.parentType = 'reference';\n\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n str = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n max = str.length;\n\n for (pos = 1; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x5B /* [ */) {\n return false;\n } else if (ch === 0x5D /* ] */) {\n labelEnd = pos;\n break;\n } else if (ch === 0x0A /* \\n */) {\n lines++;\n } else if (ch === 0x5C /* \\ */) {\n pos++;\n if (pos < max && str.charCodeAt(pos) === 0x0A) {\n lines++;\n }\n }\n }\n\n if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return false; }\n\n // [label]: destination 'title'\n // ^^^ skip optional whitespace here\n for (pos = labelEnd + 2; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x0A) {\n lines++;\n } else if (isSpace(ch)) {\n /*eslint no-empty:0*/\n } else {\n break;\n }\n }\n\n // [label]: destination 'title'\n // ^^^^^^^^^^^ parse this\n res = state.md.helpers.parseLinkDestination(str, pos, max);\n if (!res.ok) { return false; }\n\n href = state.md.normalizeLink(res.str);\n if (!state.md.validateLink(href)) { return false; }\n\n pos = res.pos;\n lines += res.lines;\n\n // save cursor state, we could require to rollback later\n destEndPos = pos;\n destEndLineNo = lines;\n\n // [label]: destination 'title'\n // ^^^ skipping those spaces\n start = pos;\n for (; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x0A) {\n lines++;\n } else if (isSpace(ch)) {\n /*eslint no-empty:0*/\n } else {\n break;\n }\n }\n\n // [label]: destination 'title'\n // ^^^^^^^ parse this\n res = state.md.helpers.parseLinkTitle(str, pos, max);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n lines += res.lines;\n } else {\n title = '';\n pos = destEndPos;\n lines = destEndLineNo;\n }\n\n // skip trailing spaces until the rest of the line\n while (pos < max) {\n ch = str.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n\n if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n if (title) {\n // garbage at the end of the line after title,\n // but it could still be a valid reference if we roll back\n title = '';\n pos = destEndPos;\n lines = destEndLineNo;\n while (pos < max) {\n ch = str.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n }\n }\n\n if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n // garbage at the end of the line\n return false;\n }\n\n label = normalizeReference(str.slice(1, labelEnd));\n if (!label) {\n // CommonMark 0.20 disallows empty labels\n return false;\n }\n\n // Reference can not terminate anything. This check is for safety only.\n /*istanbul ignore if*/\n if (silent) { return true; }\n\n if (typeof state.env.references === 'undefined') {\n state.env.references = {};\n }\n if (typeof state.env.references[label] === 'undefined') {\n state.env.references[label] = { title: title, href: href };\n }\n\n state.parentType = oldParentType;\n\n state.line = startLine + lines + 1;\n return true;\n};\n", "// List of valid html blocks names, accorting to commonmark spec\n// http://jgm.github.io/CommonMark/spec.html#html-blocks\n\n'use strict';\n\n\nmodule.exports = [\n 'address',\n 'article',\n 'aside',\n 'base',\n 'basefont',\n 'blockquote',\n 'body',\n 'caption',\n 'center',\n 'col',\n 'colgroup',\n 'dd',\n 'details',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'frame',\n 'frameset',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hr',\n 'html',\n 'iframe',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'menu',\n 'menuitem',\n 'nav',\n 'noframes',\n 'ol',\n 'optgroup',\n 'option',\n 'p',\n 'param',\n 'section',\n 'source',\n 'summary',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'title',\n 'tr',\n 'track',\n 'ul'\n];\n", "// Regexps to match html elements\n\n'use strict';\n\nvar attr_name = '[a-zA-Z_:][a-zA-Z0-9:._-]*';\n\nvar unquoted = '[^\"\\'=<>`\\\\x00-\\\\x20]+';\nvar single_quoted = \"'[^']*'\";\nvar double_quoted = '\"[^\"]*\"';\n\nvar attr_value = '(?:' + unquoted + '|' + single_quoted + '|' + double_quoted + ')';\n\nvar attribute = '(?:\\\\s+' + attr_name + '(?:\\\\s*=\\\\s*' + attr_value + ')?)';\n\nvar open_tag = '<[A-Za-z][A-Za-z0-9\\\\-]*' + attribute + '*\\\\s*\\\\/?>';\n\nvar close_tag = '<\\\\/[A-Za-z][A-Za-z0-9\\\\-]*\\\\s*>';\nvar comment = '|';\nvar processing = '<[?][\\\\s\\\\S]*?[?]>';\nvar declaration = ']*>';\nvar cdata = '';\n\nvar HTML_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + '|' + comment +\n '|' + processing + '|' + declaration + '|' + cdata + ')');\nvar HTML_OPEN_CLOSE_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + ')');\n\nmodule.exports.HTML_TAG_RE = HTML_TAG_RE;\nmodule.exports.HTML_OPEN_CLOSE_TAG_RE = HTML_OPEN_CLOSE_TAG_RE;\n", "// HTML block\n\n'use strict';\n\n\nvar block_names = require('../common/html_blocks');\nvar HTML_OPEN_CLOSE_TAG_RE = require('../common/html_re').HTML_OPEN_CLOSE_TAG_RE;\n\n// An array of opening and corresponding closing sequences for html tags,\n// last argument defines whether it can terminate a paragraph or not\n//\nvar HTML_SEQUENCES = [\n [ /^<(script|pre|style|textarea)(?=(\\s|>|$))/i, /<\\/(script|pre|style|textarea)>/i, true ],\n [ /^/, true ],\n [ /^<\\?/, /\\?>/, true ],\n [ /^/, true ],\n [ /^/, true ],\n [ new RegExp('^|$))', 'i'), /^$/, true ],\n [ new RegExp(HTML_OPEN_CLOSE_TAG_RE.source + '\\\\s*$'), /^$/, false ]\n];\n\n\nmodule.exports = function html_block(state, startLine, endLine, silent) {\n var i, nextLine, token, lineText,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (!state.md.options.html) { return false; }\n\n if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }\n\n lineText = state.src.slice(pos, max);\n\n for (i = 0; i < HTML_SEQUENCES.length; i++) {\n if (HTML_SEQUENCES[i][0].test(lineText)) { break; }\n }\n\n if (i === HTML_SEQUENCES.length) { return false; }\n\n if (silent) {\n // true if this sequence can be a terminator, false otherwise\n return HTML_SEQUENCES[i][2];\n }\n\n nextLine = startLine + 1;\n\n // If we are here - we detected HTML block.\n // Let's roll down till block end.\n if (!HTML_SEQUENCES[i][1].test(lineText)) {\n for (; nextLine < endLine; nextLine++) {\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n lineText = state.src.slice(pos, max);\n\n if (HTML_SEQUENCES[i][1].test(lineText)) {\n if (lineText.length !== 0) { nextLine++; }\n break;\n }\n }\n }\n\n state.line = nextLine;\n\n token = state.push('html_block', '', 0);\n token.map = [ startLine, nextLine ];\n token.content = state.getLines(startLine, nextLine, state.blkIndent, true);\n\n return true;\n};\n", "// heading (#, ##, ...)\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function heading(state, startLine, endLine, silent) {\n var ch, level, tmp, token,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x23/* # */ || pos >= max) { return false; }\n\n // count heading level\n level = 1;\n ch = state.src.charCodeAt(++pos);\n while (ch === 0x23/* # */ && pos < max && level <= 6) {\n level++;\n ch = state.src.charCodeAt(++pos);\n }\n\n if (level > 6 || (pos < max && !isSpace(ch))) { return false; }\n\n if (silent) { return true; }\n\n // Let's cut tails like ' ### ' from the end of string\n\n max = state.skipSpacesBack(max, pos);\n tmp = state.skipCharsBack(max, 0x23, pos); // #\n if (tmp > pos && isSpace(state.src.charCodeAt(tmp - 1))) {\n max = tmp;\n }\n\n state.line = startLine + 1;\n\n token = state.push('heading_open', 'h' + String(level), 1);\n token.markup = '########'.slice(0, level);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = state.src.slice(pos, max).trim();\n token.map = [ startLine, state.line ];\n token.children = [];\n\n token = state.push('heading_close', 'h' + String(level), -1);\n token.markup = '########'.slice(0, level);\n\n return true;\n};\n", "// lheading (---, ===)\n\n'use strict';\n\n\nmodule.exports = function lheading(state, startLine, endLine/*, silent*/) {\n var content, terminate, i, l, token, pos, max, level, marker,\n nextLine = startLine + 1, oldParentType,\n terminatorRules = state.md.block.ruler.getRules('paragraph');\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n oldParentType = state.parentType;\n state.parentType = 'paragraph'; // use paragraph to match terminatorRules\n\n // jump line-by-line until empty one or EOF\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n //\n // Check for underline in setext header\n //\n if (state.sCount[nextLine] >= state.blkIndent) {\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos < max) {\n marker = state.src.charCodeAt(pos);\n\n if (marker === 0x2D/* - */ || marker === 0x3D/* = */) {\n pos = state.skipChars(pos, marker);\n pos = state.skipSpaces(pos);\n\n if (pos >= max) {\n level = (marker === 0x3D/* = */ ? 1 : 2);\n break;\n }\n }\n }\n }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n if (!level) {\n // Didn't find valid underline\n return false;\n }\n\n content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n\n state.line = nextLine + 1;\n\n token = state.push('heading_open', 'h' + String(level), 1);\n token.markup = String.fromCharCode(marker);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = content;\n token.map = [ startLine, state.line - 1 ];\n token.children = [];\n\n token = state.push('heading_close', 'h' + String(level), -1);\n token.markup = String.fromCharCode(marker);\n\n state.parentType = oldParentType;\n\n return true;\n};\n", "// Paragraph\n\n'use strict';\n\n\nmodule.exports = function paragraph(state, startLine/*, endLine*/) {\n var content, terminate, i, l, token, oldParentType,\n nextLine = startLine + 1,\n terminatorRules = state.md.block.ruler.getRules('paragraph'),\n endLine = state.lineMax;\n\n oldParentType = state.parentType;\n state.parentType = 'paragraph';\n\n // jump line-by-line until empty one or EOF\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n\n state.line = nextLine;\n\n token = state.push('paragraph_open', 'p', 1);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = content;\n token.map = [ startLine, state.line ];\n token.children = [];\n\n token = state.push('paragraph_close', 'p', -1);\n\n state.parentType = oldParentType;\n\n return true;\n};\n", "// Parser state class\n\n'use strict';\n\nvar Token = require('../token');\nvar isSpace = require('../common/utils').isSpace;\n\n\nfunction StateBlock(src, md, env, tokens) {\n var ch, s, start, pos, len, indent, offset, indent_found;\n\n this.src = src;\n\n // link to parser instance\n this.md = md;\n\n this.env = env;\n\n //\n // Internal state vartiables\n //\n\n this.tokens = tokens;\n\n this.bMarks = []; // line begin offsets for fast jumps\n this.eMarks = []; // line end offsets for fast jumps\n this.tShift = []; // offsets of the first non-space characters (tabs not expanded)\n this.sCount = []; // indents for each line (tabs expanded)\n\n // An amount of virtual spaces (tabs expanded) between beginning\n // of each line (bMarks) and real beginning of that line.\n //\n // It exists only as a hack because blockquotes override bMarks\n // losing information in the process.\n //\n // It's used only when expanding tabs, you can think about it as\n // an initial tab length, e.g. bsCount=21 applied to string `\\t123`\n // means first tab should be expanded to 4-21%4 === 3 spaces.\n //\n this.bsCount = [];\n\n // block parser variables\n this.blkIndent = 0; // required block content indent (for example, if we are\n // inside a list, it would be positioned after list marker)\n this.line = 0; // line index in src\n this.lineMax = 0; // lines count\n this.tight = false; // loose/tight mode for lists\n this.ddIndent = -1; // indent of the current dd block (-1 if there isn't any)\n this.listIndent = -1; // indent of the current list block (-1 if there isn't any)\n\n // can be 'blockquote', 'list', 'root', 'paragraph' or 'reference'\n // used in lists to determine if they interrupt a paragraph\n this.parentType = 'root';\n\n this.level = 0;\n\n // renderer\n this.result = '';\n\n // Create caches\n // Generate markers.\n s = this.src;\n indent_found = false;\n\n for (start = pos = indent = offset = 0, len = s.length; pos < len; pos++) {\n ch = s.charCodeAt(pos);\n\n if (!indent_found) {\n if (isSpace(ch)) {\n indent++;\n\n if (ch === 0x09) {\n offset += 4 - offset % 4;\n } else {\n offset++;\n }\n continue;\n } else {\n indent_found = true;\n }\n }\n\n if (ch === 0x0A || pos === len - 1) {\n if (ch !== 0x0A) { pos++; }\n this.bMarks.push(start);\n this.eMarks.push(pos);\n this.tShift.push(indent);\n this.sCount.push(offset);\n this.bsCount.push(0);\n\n indent_found = false;\n indent = 0;\n offset = 0;\n start = pos + 1;\n }\n }\n\n // Push fake entry to simplify cache bounds checks\n this.bMarks.push(s.length);\n this.eMarks.push(s.length);\n this.tShift.push(0);\n this.sCount.push(0);\n this.bsCount.push(0);\n\n this.lineMax = this.bMarks.length - 1; // don't count last fake line\n}\n\n// Push new token to \"stream\".\n//\nStateBlock.prototype.push = function (type, tag, nesting) {\n var token = new Token(type, tag, nesting);\n token.block = true;\n\n if (nesting < 0) this.level--; // closing tag\n token.level = this.level;\n if (nesting > 0) this.level++; // opening tag\n\n this.tokens.push(token);\n return token;\n};\n\nStateBlock.prototype.isEmpty = function isEmpty(line) {\n return this.bMarks[line] + this.tShift[line] >= this.eMarks[line];\n};\n\nStateBlock.prototype.skipEmptyLines = function skipEmptyLines(from) {\n for (var max = this.lineMax; from < max; from++) {\n if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) {\n break;\n }\n }\n return from;\n};\n\n// Skip spaces from given position.\nStateBlock.prototype.skipSpaces = function skipSpaces(pos) {\n var ch;\n\n for (var max = this.src.length; pos < max; pos++) {\n ch = this.src.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n }\n return pos;\n};\n\n// Skip spaces from given position in reverse.\nStateBlock.prototype.skipSpacesBack = function skipSpacesBack(pos, min) {\n if (pos <= min) { return pos; }\n\n while (pos > min) {\n if (!isSpace(this.src.charCodeAt(--pos))) { return pos + 1; }\n }\n return pos;\n};\n\n// Skip char codes from given position\nStateBlock.prototype.skipChars = function skipChars(pos, code) {\n for (var max = this.src.length; pos < max; pos++) {\n if (this.src.charCodeAt(pos) !== code) { break; }\n }\n return pos;\n};\n\n// Skip char codes reverse from given position - 1\nStateBlock.prototype.skipCharsBack = function skipCharsBack(pos, code, min) {\n if (pos <= min) { return pos; }\n\n while (pos > min) {\n if (code !== this.src.charCodeAt(--pos)) { return pos + 1; }\n }\n return pos;\n};\n\n// cut lines range from source.\nStateBlock.prototype.getLines = function getLines(begin, end, indent, keepLastLF) {\n var i, lineIndent, ch, first, last, queue, lineStart,\n line = begin;\n\n if (begin >= end) {\n return '';\n }\n\n queue = new Array(end - begin);\n\n for (i = 0; line < end; line++, i++) {\n lineIndent = 0;\n lineStart = first = this.bMarks[line];\n\n if (line + 1 < end || keepLastLF) {\n // No need for bounds check because we have fake entry on tail.\n last = this.eMarks[line] + 1;\n } else {\n last = this.eMarks[line];\n }\n\n while (first < last && lineIndent < indent) {\n ch = this.src.charCodeAt(first);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n lineIndent += 4 - (lineIndent + this.bsCount[line]) % 4;\n } else {\n lineIndent++;\n }\n } else if (first - lineStart < this.tShift[line]) {\n // patched tShift masked characters to look like spaces (blockquotes, list markers)\n lineIndent++;\n } else {\n break;\n }\n\n first++;\n }\n\n if (lineIndent > indent) {\n // partially expanding tabs in code blocks, e.g '\\t\\tfoobar'\n // with indent=2 becomes ' \\tfoobar'\n queue[i] = new Array(lineIndent - indent + 1).join(' ') + this.src.slice(first, last);\n } else {\n queue[i] = this.src.slice(first, last);\n }\n }\n\n return queue.join('');\n};\n\n// re-export Token class to use in block rules\nStateBlock.prototype.Token = Token;\n\n\nmodule.exports = StateBlock;\n", "/** internal\n * class ParserBlock\n *\n * Block-level tokenizer.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\nvar _rules = [\n // First 2 params - rule name & source. Secondary array - list of rules,\n // which can be terminated by this one.\n [ 'table', require('./rules_block/table'), [ 'paragraph', 'reference' ] ],\n [ 'code', require('./rules_block/code') ],\n [ 'fence', require('./rules_block/fence'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'blockquote', require('./rules_block/blockquote'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'hr', require('./rules_block/hr'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'list', require('./rules_block/list'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'reference', require('./rules_block/reference') ],\n [ 'html_block', require('./rules_block/html_block'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'heading', require('./rules_block/heading'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'lheading', require('./rules_block/lheading') ],\n [ 'paragraph', require('./rules_block/paragraph') ]\n];\n\n\n/**\n * new ParserBlock()\n **/\nfunction ParserBlock() {\n /**\n * ParserBlock#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of block rules.\n **/\n this.ruler = new Ruler();\n\n for (var i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1], { alt: (_rules[i][2] || []).slice() });\n }\n}\n\n\n// Generate tokens for input range\n//\nParserBlock.prototype.tokenize = function (state, startLine, endLine) {\n var ok, i,\n rules = this.ruler.getRules(''),\n len = rules.length,\n line = startLine,\n hasEmptyLines = false,\n maxNesting = state.md.options.maxNesting;\n\n while (line < endLine) {\n state.line = line = state.skipEmptyLines(line);\n if (line >= endLine) { break; }\n\n // Termination condition for nested calls.\n // Nested calls currently used for blockquotes & lists\n if (state.sCount[line] < state.blkIndent) { break; }\n\n // If nesting level exceeded - skip tail to the end. That's not ordinary\n // situation and we should not care about content.\n if (state.level >= maxNesting) {\n state.line = endLine;\n break;\n }\n\n // Try all possible rules.\n // On success, rule should:\n //\n // - update `state.line`\n // - update `state.tokens`\n // - return true\n\n for (i = 0; i < len; i++) {\n ok = rules[i](state, line, endLine, false);\n if (ok) { break; }\n }\n\n // set state.tight if we had an empty line before current tag\n // i.e. latest empty line should not count\n state.tight = !hasEmptyLines;\n\n // paragraph might \"eat\" one newline after it in nested lists\n if (state.isEmpty(state.line - 1)) {\n hasEmptyLines = true;\n }\n\n line = state.line;\n\n if (line < endLine && state.isEmpty(line)) {\n hasEmptyLines = true;\n line++;\n state.line = line;\n }\n }\n};\n\n\n/**\n * ParserBlock.parse(str, md, env, outTokens)\n *\n * Process input string and push block tokens into `outTokens`\n **/\nParserBlock.prototype.parse = function (src, md, env, outTokens) {\n var state;\n\n if (!src) { return; }\n\n state = new this.State(src, md, env, outTokens);\n\n this.tokenize(state, state.line, state.lineMax);\n};\n\n\nParserBlock.prototype.State = require('./rules_block/state_block');\n\n\nmodule.exports = ParserBlock;\n", "// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n\n'use strict';\n\n\n// Rule to skip pure text\n// '{}$%@~+=:' reserved for extentions\n\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n\n// !!!! Don't confuse with \"Markdown ASCII Punctuation\" chars\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\nfunction isTerminatorChar(ch) {\n switch (ch) {\n case 0x0A/* \\n */:\n case 0x21/* ! */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2D/* - */:\n case 0x3A/* : */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true;\n default:\n return false;\n }\n}\n\nmodule.exports = function text(state, silent) {\n var pos = state.pos;\n\n while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n pos++;\n }\n\n if (pos === state.pos) { return false; }\n\n if (!silent) { state.pending += state.src.slice(state.pos, pos); }\n\n state.pos = pos;\n\n return true;\n};\n\n// Alternative implementation, for memory.\n//\n// It costs 10% of performance, but allows extend terminators list, if place it\n// to `ParcerInline` property. Probably, will switch to it sometime, such\n// flexibility required.\n\n/*\nvar TERMINATOR_RE = /[\\n!#$%&*+\\-:<=>@[\\\\\\]^_`{}~]/;\n\nmodule.exports = function text(state, silent) {\n var pos = state.pos,\n idx = state.src.slice(pos).search(TERMINATOR_RE);\n\n // first char is terminator -> empty text\n if (idx === 0) { return false; }\n\n // no terminator -> text till end of string\n if (idx < 0) {\n if (!silent) { state.pending += state.src.slice(pos); }\n state.pos = state.src.length;\n return true;\n }\n\n if (!silent) { state.pending += state.src.slice(pos, pos + idx); }\n\n state.pos += idx;\n\n return true;\n};*/\n", "// Proceess '\\n'\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function newline(state, silent) {\n var pmax, max, ws, pos = state.pos;\n\n if (state.src.charCodeAt(pos) !== 0x0A/* \\n */) { return false; }\n\n pmax = state.pending.length - 1;\n max = state.posMax;\n\n // ' \\n' -> hardbreak\n // Lookup in pending chars is bad practice! Don't copy to other rules!\n // Pending string is stored in concat mode, indexed lookups will cause\n // convertion to flat mode.\n if (!silent) {\n if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) {\n if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) {\n // Find whitespaces tail of pending chars.\n ws = pmax - 1;\n while (ws >= 1 && state.pending.charCodeAt(ws - 1) === 0x20) ws--;\n\n state.pending = state.pending.slice(0, ws);\n state.push('hardbreak', 'br', 0);\n } else {\n state.pending = state.pending.slice(0, -1);\n state.push('softbreak', 'br', 0);\n }\n\n } else {\n state.push('softbreak', 'br', 0);\n }\n }\n\n pos++;\n\n // skip heading spaces for next line\n while (pos < max && isSpace(state.src.charCodeAt(pos))) { pos++; }\n\n state.pos = pos;\n return true;\n};\n", "// Process escaped chars and hardbreaks\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\nvar ESCAPED = [];\n\nfor (var i = 0; i < 256; i++) { ESCAPED.push(0); }\n\n'\\\\!\"#$%&\\'()*+,./:;<=>?@[]^_`{|}~-'\n .split('').forEach(function (ch) { ESCAPED[ch.charCodeAt(0)] = 1; });\n\n\nmodule.exports = function escape(state, silent) {\n var ch, pos = state.pos, max = state.posMax;\n\n if (state.src.charCodeAt(pos) !== 0x5C/* \\ */) { return false; }\n\n pos++;\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (ch < 256 && ESCAPED[ch] !== 0) {\n if (!silent) { state.pending += state.src[pos]; }\n state.pos += 2;\n return true;\n }\n\n if (ch === 0x0A) {\n if (!silent) {\n state.push('hardbreak', 'br', 0);\n }\n\n pos++;\n // skip leading whitespaces from next line\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n\n state.pos = pos;\n return true;\n }\n }\n\n if (!silent) { state.pending += '\\\\'; }\n state.pos++;\n return true;\n};\n", "// Parse backticks\n\n'use strict';\n\n\nmodule.exports = function backtick(state, silent) {\n var start, max, marker, token, matchStart, matchEnd, openerLength, closerLength,\n pos = state.pos,\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x60/* ` */) { return false; }\n\n start = pos;\n pos++;\n max = state.posMax;\n\n // scan marker length\n while (pos < max && state.src.charCodeAt(pos) === 0x60/* ` */) { pos++; }\n\n marker = state.src.slice(start, pos);\n openerLength = marker.length;\n\n if (state.backticksScanned && (state.backticks[openerLength] || 0) <= start) {\n if (!silent) state.pending += marker;\n state.pos += openerLength;\n return true;\n }\n\n matchStart = matchEnd = pos;\n\n // Nothing found in the cache, scan until the end of the line (or until marker is found)\n while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) {\n matchEnd = matchStart + 1;\n\n // scan marker length\n while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60/* ` */) { matchEnd++; }\n\n closerLength = matchEnd - matchStart;\n\n if (closerLength === openerLength) {\n // Found matching closer length.\n if (!silent) {\n token = state.push('code_inline', 'code', 0);\n token.markup = marker;\n token.content = state.src.slice(pos, matchStart)\n .replace(/\\n/g, ' ')\n .replace(/^ (.+) $/, '$1');\n }\n state.pos = matchEnd;\n return true;\n }\n\n // Some different length found, put it in cache as upper limit of where closer can be found\n state.backticks[closerLength] = matchStart;\n }\n\n // Scanned through the end, didn't find anything\n state.backticksScanned = true;\n\n if (!silent) state.pending += marker;\n state.pos += openerLength;\n return true;\n};\n", "// ~~strike through~~\n//\n'use strict';\n\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nmodule.exports.tokenize = function strikethrough(state, silent) {\n var i, scanned, token, len, ch,\n start = state.pos,\n marker = state.src.charCodeAt(start);\n\n if (silent) { return false; }\n\n if (marker !== 0x7E/* ~ */) { return false; }\n\n scanned = state.scanDelims(state.pos, true);\n len = scanned.length;\n ch = String.fromCharCode(marker);\n\n if (len < 2) { return false; }\n\n if (len % 2) {\n token = state.push('text', '', 0);\n token.content = ch;\n len--;\n }\n\n for (i = 0; i < len; i += 2) {\n token = state.push('text', '', 0);\n token.content = ch + ch;\n\n state.delimiters.push({\n marker: marker,\n length: 0, // disable \"rule of 3\" length checks meant for emphasis\n token: state.tokens.length - 1,\n end: -1,\n open: scanned.can_open,\n close: scanned.can_close\n });\n }\n\n state.pos += scanned.length;\n\n return true;\n};\n\n\nfunction postProcess(state, delimiters) {\n var i, j,\n startDelim,\n endDelim,\n token,\n loneMarkers = [],\n max = delimiters.length;\n\n for (i = 0; i < max; i++) {\n startDelim = delimiters[i];\n\n if (startDelim.marker !== 0x7E/* ~ */) {\n continue;\n }\n\n if (startDelim.end === -1) {\n continue;\n }\n\n endDelim = delimiters[startDelim.end];\n\n token = state.tokens[startDelim.token];\n token.type = 's_open';\n token.tag = 's';\n token.nesting = 1;\n token.markup = '~~';\n token.content = '';\n\n token = state.tokens[endDelim.token];\n token.type = 's_close';\n token.tag = 's';\n token.nesting = -1;\n token.markup = '~~';\n token.content = '';\n\n if (state.tokens[endDelim.token - 1].type === 'text' &&\n state.tokens[endDelim.token - 1].content === '~') {\n\n loneMarkers.push(endDelim.token - 1);\n }\n }\n\n // If a marker sequence has an odd number of characters, it's splitted\n // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the\n // start of the sequence.\n //\n // So, we have to move all those markers after subsequent s_close tags.\n //\n while (loneMarkers.length) {\n i = loneMarkers.pop();\n j = i + 1;\n\n while (j < state.tokens.length && state.tokens[j].type === 's_close') {\n j++;\n }\n\n j--;\n\n if (i !== j) {\n token = state.tokens[j];\n state.tokens[j] = state.tokens[i];\n state.tokens[i] = token;\n }\n }\n}\n\n\n// Walk through delimiter list and replace text tokens with tags\n//\nmodule.exports.postProcess = function strikethrough(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n postProcess(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n postProcess(state, tokens_meta[curr].delimiters);\n }\n }\n};\n", "// Process *this* and _that_\n//\n'use strict';\n\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nmodule.exports.tokenize = function emphasis(state, silent) {\n var i, scanned, token,\n start = state.pos,\n marker = state.src.charCodeAt(start);\n\n if (silent) { return false; }\n\n if (marker !== 0x5F /* _ */ && marker !== 0x2A /* * */) { return false; }\n\n scanned = state.scanDelims(state.pos, marker === 0x2A);\n\n for (i = 0; i < scanned.length; i++) {\n token = state.push('text', '', 0);\n token.content = String.fromCharCode(marker);\n\n state.delimiters.push({\n // Char code of the starting marker (number).\n //\n marker: marker,\n\n // Total length of these series of delimiters.\n //\n length: scanned.length,\n\n // A position of the token this delimiter corresponds to.\n //\n token: state.tokens.length - 1,\n\n // If this delimiter is matched as a valid opener, `end` will be\n // equal to its position, otherwise it's `-1`.\n //\n end: -1,\n\n // Boolean flags that determine if this delimiter could open or close\n // an emphasis.\n //\n open: scanned.can_open,\n close: scanned.can_close\n });\n }\n\n state.pos += scanned.length;\n\n return true;\n};\n\n\nfunction postProcess(state, delimiters) {\n var i,\n startDelim,\n endDelim,\n token,\n ch,\n isStrong,\n max = delimiters.length;\n\n for (i = max - 1; i >= 0; i--) {\n startDelim = delimiters[i];\n\n if (startDelim.marker !== 0x5F/* _ */ && startDelim.marker !== 0x2A/* * */) {\n continue;\n }\n\n // Process only opening markers\n if (startDelim.end === -1) {\n continue;\n }\n\n endDelim = delimiters[startDelim.end];\n\n // If the previous delimiter has the same marker and is adjacent to this one,\n // merge those into one strong delimiter.\n //\n // `whatever` -> `whatever`\n //\n isStrong = i > 0 &&\n delimiters[i - 1].end === startDelim.end + 1 &&\n // check that first two markers match and adjacent\n delimiters[i - 1].marker === startDelim.marker &&\n delimiters[i - 1].token === startDelim.token - 1 &&\n // check that last two markers are adjacent (we can safely assume they match)\n delimiters[startDelim.end + 1].token === endDelim.token + 1;\n\n ch = String.fromCharCode(startDelim.marker);\n\n token = state.tokens[startDelim.token];\n token.type = isStrong ? 'strong_open' : 'em_open';\n token.tag = isStrong ? 'strong' : 'em';\n token.nesting = 1;\n token.markup = isStrong ? ch + ch : ch;\n token.content = '';\n\n token = state.tokens[endDelim.token];\n token.type = isStrong ? 'strong_close' : 'em_close';\n token.tag = isStrong ? 'strong' : 'em';\n token.nesting = -1;\n token.markup = isStrong ? ch + ch : ch;\n token.content = '';\n\n if (isStrong) {\n state.tokens[delimiters[i - 1].token].content = '';\n state.tokens[delimiters[startDelim.end + 1].token].content = '';\n i--;\n }\n }\n}\n\n\n// Walk through delimiter list and replace text tokens with tags\n//\nmodule.exports.postProcess = function emphasis(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n postProcess(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n postProcess(state, tokens_meta[curr].delimiters);\n }\n }\n};\n", "// Process [link]( \"stuff\")\n\n'use strict';\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function link(state, silent) {\n var attrs,\n code,\n label,\n labelEnd,\n labelStart,\n pos,\n res,\n ref,\n token,\n href = '',\n title = '',\n oldPos = state.pos,\n max = state.posMax,\n start = state.pos,\n parseReference = true;\n\n if (state.src.charCodeAt(state.pos) !== 0x5B/* [ */) { return false; }\n\n labelStart = state.pos + 1;\n labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true);\n\n // parser failed to find ']', so it's not a valid link\n if (labelEnd < 0) { return false; }\n\n pos = labelEnd + 1;\n if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n //\n // Inline link\n //\n\n // might have found a valid shortcut link, disable reference parsing\n parseReference = false;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n pos++;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n if (pos >= max) { return false; }\n\n // [link]( \"title\" )\n // ^^^^^^ parsing link destination\n start = pos;\n res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);\n if (res.ok) {\n href = state.md.normalizeLink(res.str);\n if (state.md.validateLink(href)) {\n pos = res.pos;\n } else {\n href = '';\n }\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n start = pos;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n\n // [link]( \"title\" )\n // ^^^^^^^ parsing link title\n res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n }\n }\n\n if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n // parsing a valid shortcut link failed, fallback to reference\n parseReference = true;\n }\n pos++;\n }\n\n if (parseReference) {\n //\n // Link reference\n //\n if (typeof state.env.references === 'undefined') { return false; }\n\n if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n start = pos + 1;\n pos = state.md.helpers.parseLinkLabel(state, pos);\n if (pos >= 0) {\n label = state.src.slice(start, pos++);\n } else {\n pos = labelEnd + 1;\n }\n } else {\n pos = labelEnd + 1;\n }\n\n // covers label === '' and label === undefined\n // (collapsed reference link and shortcut reference link respectively)\n if (!label) { label = state.src.slice(labelStart, labelEnd); }\n\n ref = state.env.references[normalizeReference(label)];\n if (!ref) {\n state.pos = oldPos;\n return false;\n }\n href = ref.href;\n title = ref.title;\n }\n\n //\n // We found the end of the link, and know for a fact it's a valid link;\n // so all that's left to do is to call tokenizer.\n //\n if (!silent) {\n state.pos = labelStart;\n state.posMax = labelEnd;\n\n token = state.push('link_open', 'a', 1);\n token.attrs = attrs = [ [ 'href', href ] ];\n if (title) {\n attrs.push([ 'title', title ]);\n }\n\n state.md.inline.tokenize(state);\n\n token = state.push('link_close', 'a', -1);\n }\n\n state.pos = pos;\n state.posMax = max;\n return true;\n};\n", "// Process ![image]( \"title\")\n\n'use strict';\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function image(state, silent) {\n var attrs,\n code,\n content,\n label,\n labelEnd,\n labelStart,\n pos,\n ref,\n res,\n title,\n token,\n tokens,\n start,\n href = '',\n oldPos = state.pos,\n max = state.posMax;\n\n if (state.src.charCodeAt(state.pos) !== 0x21/* ! */) { return false; }\n if (state.src.charCodeAt(state.pos + 1) !== 0x5B/* [ */) { return false; }\n\n labelStart = state.pos + 2;\n labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false);\n\n // parser failed to find ']', so it's not a valid link\n if (labelEnd < 0) { return false; }\n\n pos = labelEnd + 1;\n if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n //\n // Inline link\n //\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n pos++;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n if (pos >= max) { return false; }\n\n // [link]( \"title\" )\n // ^^^^^^ parsing link destination\n start = pos;\n res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);\n if (res.ok) {\n href = state.md.normalizeLink(res.str);\n if (state.md.validateLink(href)) {\n pos = res.pos;\n } else {\n href = '';\n }\n }\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n start = pos;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n\n // [link]( \"title\" )\n // ^^^^^^^ parsing link title\n res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n } else {\n title = '';\n }\n\n if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n state.pos = oldPos;\n return false;\n }\n pos++;\n } else {\n //\n // Link reference\n //\n if (typeof state.env.references === 'undefined') { return false; }\n\n if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n start = pos + 1;\n pos = state.md.helpers.parseLinkLabel(state, pos);\n if (pos >= 0) {\n label = state.src.slice(start, pos++);\n } else {\n pos = labelEnd + 1;\n }\n } else {\n pos = labelEnd + 1;\n }\n\n // covers label === '' and label === undefined\n // (collapsed reference link and shortcut reference link respectively)\n if (!label) { label = state.src.slice(labelStart, labelEnd); }\n\n ref = state.env.references[normalizeReference(label)];\n if (!ref) {\n state.pos = oldPos;\n return false;\n }\n href = ref.href;\n title = ref.title;\n }\n\n //\n // We found the end of the link, and know for a fact it's a valid link;\n // so all that's left to do is to call tokenizer.\n //\n if (!silent) {\n content = state.src.slice(labelStart, labelEnd);\n\n state.md.inline.parse(\n content,\n state.md,\n state.env,\n tokens = []\n );\n\n token = state.push('image', 'img', 0);\n token.attrs = attrs = [ [ 'src', href ], [ 'alt', '' ] ];\n token.children = tokens;\n token.content = content;\n\n if (title) {\n attrs.push([ 'title', title ]);\n }\n }\n\n state.pos = pos;\n state.posMax = max;\n return true;\n};\n", "// Process autolinks ''\n\n'use strict';\n\n\n/*eslint max-len:0*/\nvar EMAIL_RE = /^([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/;\nvar AUTOLINK_RE = /^([a-zA-Z][a-zA-Z0-9+.\\-]{1,31}):([^<>\\x00-\\x20]*)$/;\n\n\nmodule.exports = function autolink(state, silent) {\n var url, fullUrl, token, ch, start, max,\n pos = state.pos;\n\n if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }\n\n start = state.pos;\n max = state.posMax;\n\n for (;;) {\n if (++pos >= max) return false;\n\n ch = state.src.charCodeAt(pos);\n\n if (ch === 0x3C /* < */) return false;\n if (ch === 0x3E /* > */) break;\n }\n\n url = state.src.slice(start + 1, pos);\n\n if (AUTOLINK_RE.test(url)) {\n fullUrl = state.md.normalizeLink(url);\n if (!state.md.validateLink(fullUrl)) { return false; }\n\n if (!silent) {\n token = state.push('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.markup = 'autolink';\n token.info = 'auto';\n\n token = state.push('text', '', 0);\n token.content = state.md.normalizeLinkText(url);\n\n token = state.push('link_close', 'a', -1);\n token.markup = 'autolink';\n token.info = 'auto';\n }\n\n state.pos += url.length + 2;\n return true;\n }\n\n if (EMAIL_RE.test(url)) {\n fullUrl = state.md.normalizeLink('mailto:' + url);\n if (!state.md.validateLink(fullUrl)) { return false; }\n\n if (!silent) {\n token = state.push('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.markup = 'autolink';\n token.info = 'auto';\n\n token = state.push('text', '', 0);\n token.content = state.md.normalizeLinkText(url);\n\n token = state.push('link_close', 'a', -1);\n token.markup = 'autolink';\n token.info = 'auto';\n }\n\n state.pos += url.length + 2;\n return true;\n }\n\n return false;\n};\n", "// Process html tags\n\n'use strict';\n\n\nvar HTML_TAG_RE = require('../common/html_re').HTML_TAG_RE;\n\n\nfunction isLetter(ch) {\n /*eslint no-bitwise:0*/\n var lc = ch | 0x20; // to lower case\n return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */);\n}\n\n\nmodule.exports = function html_inline(state, silent) {\n var ch, match, max, token,\n pos = state.pos;\n\n if (!state.md.options.html) { return false; }\n\n // Check start\n max = state.posMax;\n if (state.src.charCodeAt(pos) !== 0x3C/* < */ ||\n pos + 2 >= max) {\n return false;\n }\n\n // Quick fail on second char\n ch = state.src.charCodeAt(pos + 1);\n if (ch !== 0x21/* ! */ &&\n ch !== 0x3F/* ? */ &&\n ch !== 0x2F/* / */ &&\n !isLetter(ch)) {\n return false;\n }\n\n match = state.src.slice(pos).match(HTML_TAG_RE);\n if (!match) { return false; }\n\n if (!silent) {\n token = state.push('html_inline', '', 0);\n token.content = state.src.slice(pos, pos + match[0].length);\n }\n state.pos += match[0].length;\n return true;\n};\n", "// Process html entity - {, ¯, ", ...\n\n'use strict';\n\nvar entities = require('../common/entities');\nvar has = require('../common/utils').has;\nvar isValidEntityCode = require('../common/utils').isValidEntityCode;\nvar fromCodePoint = require('../common/utils').fromCodePoint;\n\n\nvar DIGITAL_RE = /^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i;\nvar NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i;\n\n\nmodule.exports = function entity(state, silent) {\n var ch, code, match, pos = state.pos, max = state.posMax;\n\n if (state.src.charCodeAt(pos) !== 0x26/* & */) { return false; }\n\n if (pos + 1 < max) {\n ch = state.src.charCodeAt(pos + 1);\n\n if (ch === 0x23 /* # */) {\n match = state.src.slice(pos).match(DIGITAL_RE);\n if (match) {\n if (!silent) {\n code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10);\n state.pending += isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD);\n }\n state.pos += match[0].length;\n return true;\n }\n } else {\n match = state.src.slice(pos).match(NAMED_RE);\n if (match) {\n if (has(entities, match[1])) {\n if (!silent) { state.pending += entities[match[1]]; }\n state.pos += match[0].length;\n return true;\n }\n }\n }\n }\n\n if (!silent) { state.pending += '&'; }\n state.pos++;\n return true;\n};\n", "// For each opening emphasis-like marker find a matching closing one\n//\n'use strict';\n\n\nfunction processDelimiters(state, delimiters) {\n var closerIdx, openerIdx, closer, opener, minOpenerIdx, newMinOpenerIdx,\n isOddMatch, lastJump,\n openersBottom = {},\n max = delimiters.length;\n\n if (!max) return;\n\n // headerIdx is the first delimiter of the current (where closer is) delimiter run\n var headerIdx = 0;\n var lastTokenIdx = -2; // needs any value lower than -1\n var jumps = [];\n\n for (closerIdx = 0; closerIdx < max; closerIdx++) {\n closer = delimiters[closerIdx];\n\n jumps.push(0);\n\n // markers belong to same delimiter run if:\n // - they have adjacent tokens\n // - AND markers are the same\n //\n if (delimiters[headerIdx].marker !== closer.marker || lastTokenIdx !== closer.token - 1) {\n headerIdx = closerIdx;\n }\n\n lastTokenIdx = closer.token;\n\n // Length is only used for emphasis-specific \"rule of 3\",\n // if it's not defined (in strikethrough or 3rd party plugins),\n // we can default it to 0 to disable those checks.\n //\n closer.length = closer.length || 0;\n\n if (!closer.close) continue;\n\n // Previously calculated lower bounds (previous fails)\n // for each marker, each delimiter length modulo 3,\n // and for whether this closer can be an opener;\n // https://github.com/commonmark/cmark/commit/34250e12ccebdc6372b8b49c44fab57c72443460\n if (!openersBottom.hasOwnProperty(closer.marker)) {\n openersBottom[closer.marker] = [ -1, -1, -1, -1, -1, -1 ];\n }\n\n minOpenerIdx = openersBottom[closer.marker][(closer.open ? 3 : 0) + (closer.length % 3)];\n\n openerIdx = headerIdx - jumps[headerIdx] - 1;\n\n newMinOpenerIdx = openerIdx;\n\n for (; openerIdx > minOpenerIdx; openerIdx -= jumps[openerIdx] + 1) {\n opener = delimiters[openerIdx];\n\n if (opener.marker !== closer.marker) continue;\n\n if (opener.open && opener.end < 0) {\n\n isOddMatch = false;\n\n // from spec:\n //\n // If one of the delimiters can both open and close emphasis, then the\n // sum of the lengths of the delimiter runs containing the opening and\n // closing delimiters must not be a multiple of 3 unless both lengths\n // are multiples of 3.\n //\n if (opener.close || closer.open) {\n if ((opener.length + closer.length) % 3 === 0) {\n if (opener.length % 3 !== 0 || closer.length % 3 !== 0) {\n isOddMatch = true;\n }\n }\n }\n\n if (!isOddMatch) {\n // If previous delimiter cannot be an opener, we can safely skip\n // the entire sequence in future checks. This is required to make\n // sure algorithm has linear complexity (see *_*_*_*_*_... case).\n //\n lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open ?\n jumps[openerIdx - 1] + 1 :\n 0;\n\n jumps[closerIdx] = closerIdx - openerIdx + lastJump;\n jumps[openerIdx] = lastJump;\n\n closer.open = false;\n opener.end = closerIdx;\n opener.close = false;\n newMinOpenerIdx = -1;\n // treat next token as start of run,\n // it optimizes skips in **<...>**a**<...>** pathological case\n lastTokenIdx = -2;\n break;\n }\n }\n }\n\n if (newMinOpenerIdx !== -1) {\n // If match for this delimiter run failed, we want to set lower bound for\n // future lookups. This is required to make sure algorithm has linear\n // complexity.\n //\n // See details here:\n // https://github.com/commonmark/cmark/issues/178#issuecomment-270417442\n //\n openersBottom[closer.marker][(closer.open ? 3 : 0) + ((closer.length || 0) % 3)] = newMinOpenerIdx;\n }\n }\n}\n\n\nmodule.exports = function link_pairs(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n processDelimiters(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n processDelimiters(state, tokens_meta[curr].delimiters);\n }\n }\n};\n", "// Clean up tokens after emphasis and strikethrough postprocessing:\n// merge adjacent text nodes into one and re-calculate all token levels\n//\n// This is necessary because initially emphasis delimiter markers (*, _, ~)\n// are treated as their own separate text tokens. Then emphasis rule either\n// leaves them as text (needed to merge with adjacent text) or turns them\n// into opening/closing tags (which messes up levels inside).\n//\n'use strict';\n\n\nmodule.exports = function text_collapse(state) {\n var curr, last,\n level = 0,\n tokens = state.tokens,\n max = state.tokens.length;\n\n for (curr = last = 0; curr < max; curr++) {\n // re-calculate levels after emphasis/strikethrough turns some text nodes\n // into opening/closing tags\n if (tokens[curr].nesting < 0) level--; // closing tag\n tokens[curr].level = level;\n if (tokens[curr].nesting > 0) level++; // opening tag\n\n if (tokens[curr].type === 'text' &&\n curr + 1 < max &&\n tokens[curr + 1].type === 'text') {\n\n // collapse two adjacent text nodes\n tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content;\n } else {\n if (curr !== last) { tokens[last] = tokens[curr]; }\n\n last++;\n }\n }\n\n if (curr !== last) {\n tokens.length = last;\n }\n};\n", "// Inline parser state\n\n'use strict';\n\n\nvar Token = require('../token');\nvar isWhiteSpace = require('../common/utils').isWhiteSpace;\nvar isPunctChar = require('../common/utils').isPunctChar;\nvar isMdAsciiPunct = require('../common/utils').isMdAsciiPunct;\n\n\nfunction StateInline(src, md, env, outTokens) {\n this.src = src;\n this.env = env;\n this.md = md;\n this.tokens = outTokens;\n this.tokens_meta = Array(outTokens.length);\n\n this.pos = 0;\n this.posMax = this.src.length;\n this.level = 0;\n this.pending = '';\n this.pendingLevel = 0;\n\n // Stores { start: end } pairs. Useful for backtrack\n // optimization of pairs parse (emphasis, strikes).\n this.cache = {};\n\n // List of emphasis-like delimiters for current tag\n this.delimiters = [];\n\n // Stack of delimiter lists for upper level tags\n this._prev_delimiters = [];\n\n // backtick length => last seen position\n this.backticks = {};\n this.backticksScanned = false;\n}\n\n\n// Flush pending text\n//\nStateInline.prototype.pushPending = function () {\n var token = new Token('text', '', 0);\n token.content = this.pending;\n token.level = this.pendingLevel;\n this.tokens.push(token);\n this.pending = '';\n return token;\n};\n\n\n// Push new token to \"stream\".\n// If pending text exists - flush it as text token\n//\nStateInline.prototype.push = function (type, tag, nesting) {\n if (this.pending) {\n this.pushPending();\n }\n\n var token = new Token(type, tag, nesting);\n var token_meta = null;\n\n if (nesting < 0) {\n // closing tag\n this.level--;\n this.delimiters = this._prev_delimiters.pop();\n }\n\n token.level = this.level;\n\n if (nesting > 0) {\n // opening tag\n this.level++;\n this._prev_delimiters.push(this.delimiters);\n this.delimiters = [];\n token_meta = { delimiters: this.delimiters };\n }\n\n this.pendingLevel = this.level;\n this.tokens.push(token);\n this.tokens_meta.push(token_meta);\n return token;\n};\n\n\n// Scan a sequence of emphasis-like markers, and determine whether\n// it can start an emphasis sequence or end an emphasis sequence.\n//\n// - start - position to scan from (it should point at a valid marker);\n// - canSplitWord - determine if these markers can be found inside a word\n//\nStateInline.prototype.scanDelims = function (start, canSplitWord) {\n var pos = start, lastChar, nextChar, count, can_open, can_close,\n isLastWhiteSpace, isLastPunctChar,\n isNextWhiteSpace, isNextPunctChar,\n left_flanking = true,\n right_flanking = true,\n max = this.posMax,\n marker = this.src.charCodeAt(start);\n\n // treat beginning of the line as a whitespace\n lastChar = start > 0 ? this.src.charCodeAt(start - 1) : 0x20;\n\n while (pos < max && this.src.charCodeAt(pos) === marker) { pos++; }\n\n count = pos - start;\n\n // treat end of the line as a whitespace\n nextChar = pos < max ? this.src.charCodeAt(pos) : 0x20;\n\n isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));\n isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));\n\n isLastWhiteSpace = isWhiteSpace(lastChar);\n isNextWhiteSpace = isWhiteSpace(nextChar);\n\n if (isNextWhiteSpace) {\n left_flanking = false;\n } else if (isNextPunctChar) {\n if (!(isLastWhiteSpace || isLastPunctChar)) {\n left_flanking = false;\n }\n }\n\n if (isLastWhiteSpace) {\n right_flanking = false;\n } else if (isLastPunctChar) {\n if (!(isNextWhiteSpace || isNextPunctChar)) {\n right_flanking = false;\n }\n }\n\n if (!canSplitWord) {\n can_open = left_flanking && (!right_flanking || isLastPunctChar);\n can_close = right_flanking && (!left_flanking || isNextPunctChar);\n } else {\n can_open = left_flanking;\n can_close = right_flanking;\n }\n\n return {\n can_open: can_open,\n can_close: can_close,\n length: count\n };\n};\n\n\n// re-export Token class to use in block rules\nStateInline.prototype.Token = Token;\n\n\nmodule.exports = StateInline;\n", "/** internal\n * class ParserInline\n *\n * Tokenizes paragraph content.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Parser rules\n\nvar _rules = [\n [ 'text', require('./rules_inline/text') ],\n [ 'newline', require('./rules_inline/newline') ],\n [ 'escape', require('./rules_inline/escape') ],\n [ 'backticks', require('./rules_inline/backticks') ],\n [ 'strikethrough', require('./rules_inline/strikethrough').tokenize ],\n [ 'emphasis', require('./rules_inline/emphasis').tokenize ],\n [ 'link', require('./rules_inline/link') ],\n [ 'image', require('./rules_inline/image') ],\n [ 'autolink', require('./rules_inline/autolink') ],\n [ 'html_inline', require('./rules_inline/html_inline') ],\n [ 'entity', require('./rules_inline/entity') ]\n];\n\nvar _rules2 = [\n [ 'balance_pairs', require('./rules_inline/balance_pairs') ],\n [ 'strikethrough', require('./rules_inline/strikethrough').postProcess ],\n [ 'emphasis', require('./rules_inline/emphasis').postProcess ],\n [ 'text_collapse', require('./rules_inline/text_collapse') ]\n];\n\n\n/**\n * new ParserInline()\n **/\nfunction ParserInline() {\n var i;\n\n /**\n * ParserInline#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of inline rules.\n **/\n this.ruler = new Ruler();\n\n for (i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1]);\n }\n\n /**\n * ParserInline#ruler2 -> Ruler\n *\n * [[Ruler]] instance. Second ruler used for post-processing\n * (e.g. in emphasis-like rules).\n **/\n this.ruler2 = new Ruler();\n\n for (i = 0; i < _rules2.length; i++) {\n this.ruler2.push(_rules2[i][0], _rules2[i][1]);\n }\n}\n\n\n// Skip single token by running all rules in validation mode;\n// returns `true` if any rule reported success\n//\nParserInline.prototype.skipToken = function (state) {\n var ok, i, pos = state.pos,\n rules = this.ruler.getRules(''),\n len = rules.length,\n maxNesting = state.md.options.maxNesting,\n cache = state.cache;\n\n\n if (typeof cache[pos] !== 'undefined') {\n state.pos = cache[pos];\n return;\n }\n\n if (state.level < maxNesting) {\n for (i = 0; i < len; i++) {\n // Increment state.level and decrement it later to limit recursion.\n // It's harmless to do here, because no tokens are created. But ideally,\n // we'd need a separate private state variable for this purpose.\n //\n state.level++;\n ok = rules[i](state, true);\n state.level--;\n\n if (ok) { break; }\n }\n } else {\n // Too much nesting, just skip until the end of the paragraph.\n //\n // NOTE: this will cause links to behave incorrectly in the following case,\n // when an amount of `[` is exactly equal to `maxNesting + 1`:\n //\n // [[[[[[[[[[[[[[[[[[[[[foo]()\n //\n // TODO: remove this workaround when CM standard will allow nested links\n // (we can replace it by preventing links from being parsed in\n // validation mode)\n //\n state.pos = state.posMax;\n }\n\n if (!ok) { state.pos++; }\n cache[pos] = state.pos;\n};\n\n\n// Generate tokens for input range\n//\nParserInline.prototype.tokenize = function (state) {\n var ok, i,\n rules = this.ruler.getRules(''),\n len = rules.length,\n end = state.posMax,\n maxNesting = state.md.options.maxNesting;\n\n while (state.pos < end) {\n // Try all possible rules.\n // On success, rule should:\n //\n // - update `state.pos`\n // - update `state.tokens`\n // - return true\n\n if (state.level < maxNesting) {\n for (i = 0; i < len; i++) {\n ok = rules[i](state, false);\n if (ok) { break; }\n }\n }\n\n if (ok) {\n if (state.pos >= end) { break; }\n continue;\n }\n\n state.pending += state.src[state.pos++];\n }\n\n if (state.pending) {\n state.pushPending();\n }\n};\n\n\n/**\n * ParserInline.parse(str, md, env, outTokens)\n *\n * Process input string and push inline tokens into `outTokens`\n **/\nParserInline.prototype.parse = function (str, md, env, outTokens) {\n var i, rules, len;\n var state = new this.State(str, md, env, outTokens);\n\n this.tokenize(state);\n\n rules = this.ruler2.getRules('');\n len = rules.length;\n\n for (i = 0; i < len; i++) {\n rules[i](state);\n }\n};\n\n\nParserInline.prototype.State = require('./rules_inline/state_inline');\n\n\nmodule.exports = ParserInline;\n", "'use strict';\n\n\nmodule.exports = function (opts) {\n var re = {};\n\n // Use direct extract instead of `regenerate` to reduse browserified size\n re.src_Any = require('uc.micro/properties/Any/regex').source;\n re.src_Cc = require('uc.micro/categories/Cc/regex').source;\n re.src_Z = require('uc.micro/categories/Z/regex').source;\n re.src_P = require('uc.micro/categories/P/regex').source;\n\n // \\p{\\Z\\P\\Cc\\CF} (white spaces + control + format + punctuation)\n re.src_ZPCc = [ re.src_Z, re.src_P, re.src_Cc ].join('|');\n\n // \\p{\\Z\\Cc} (white spaces + control)\n re.src_ZCc = [ re.src_Z, re.src_Cc ].join('|');\n\n // Experimental. List of chars, completely prohibited in links\n // because can separate it from other part of text\n var text_separators = '[><\\uff5c]';\n\n // All possible word characters (everything without punctuation, spaces & controls)\n // Defined via punctuation & spaces to save space\n // Should be something like \\p{\\L\\N\\S\\M} (\\w but without `_`)\n re.src_pseudo_letter = '(?:(?!' + text_separators + '|' + re.src_ZPCc + ')' + re.src_Any + ')';\n // The same as abothe but without [0-9]\n // var src_pseudo_letter_non_d = '(?:(?![0-9]|' + src_ZPCc + ')' + src_Any + ')';\n\n ////////////////////////////////////////////////////////////////////////////////\n\n re.src_ip4 =\n\n '(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)';\n\n // Prohibit any of \"@/[]()\" in user/pass to avoid wrong domain fetch.\n re.src_auth = '(?:(?:(?!' + re.src_ZCc + '|[@/\\\\[\\\\]()]).)+@)?';\n\n re.src_port =\n\n '(?::(?:6(?:[0-4]\\\\d{3}|5(?:[0-4]\\\\d{2}|5(?:[0-2]\\\\d|3[0-5])))|[1-5]?\\\\d{1,4}))?';\n\n re.src_host_terminator =\n\n '(?=$|' + text_separators + '|' + re.src_ZPCc + ')(?!-|_|:\\\\d|\\\\.-|\\\\.(?!$|' + re.src_ZPCc + '))';\n\n re.src_path =\n\n '(?:' +\n '[/?#]' +\n '(?:' +\n '(?!' + re.src_ZCc + '|' + text_separators + '|[()[\\\\]{}.,\"\\'?!\\\\-]).|' +\n '\\\\[(?:(?!' + re.src_ZCc + '|\\\\]).)*\\\\]|' +\n '\\\\((?:(?!' + re.src_ZCc + '|[)]).)*\\\\)|' +\n '\\\\{(?:(?!' + re.src_ZCc + '|[}]).)*\\\\}|' +\n '\\\\\"(?:(?!' + re.src_ZCc + '|[\"]).)+\\\\\"|' +\n \"\\\\'(?:(?!\" + re.src_ZCc + \"|[']).)+\\\\'|\" +\n \"\\\\'(?=\" + re.src_pseudo_letter + '|[-]).|' + // allow `I'm_king` if no pair found\n '\\\\.{2,}[a-zA-Z0-9%/&]|' + // google has many dots in \"google search\" links (#66, #81).\n // github has ... in commit range links,\n // Restrict to\n // - english\n // - percent-encoded\n // - parts of file path\n // - params separator\n // until more examples found.\n '\\\\.(?!' + re.src_ZCc + '|[.]).|' +\n (opts && opts['---'] ?\n '\\\\-(?!--(?:[^-]|$))(?:-*)|' // `---` => long dash, terminate\n :\n '\\\\-+|'\n ) +\n '\\\\,(?!' + re.src_ZCc + ').|' + // allow `,,,` in paths\n '\\\\!+(?!' + re.src_ZCc + '|[!]).|' + // allow `!!!` in paths, but not at the end\n '\\\\?(?!' + re.src_ZCc + '|[?]).' +\n ')+' +\n '|\\\\/' +\n ')?';\n\n // Allow anything in markdown spec, forbid quote (\") at the first position\n // because emails enclosed in quotes are far more common\n re.src_email_name =\n\n '[\\\\-;:&=\\\\+\\\\$,\\\\.a-zA-Z0-9_][\\\\-;:&=\\\\+\\\\$,\\\\\"\\\\.a-zA-Z0-9_]*';\n\n re.src_xn =\n\n 'xn--[a-z0-9\\\\-]{1,59}';\n\n // More to read about domain names\n // http://serverfault.com/questions/638260/\n\n re.src_domain_root =\n\n // Allow letters & digits (http://test1)\n '(?:' +\n re.src_xn +\n '|' +\n re.src_pseudo_letter + '{1,63}' +\n ')';\n\n re.src_domain =\n\n '(?:' +\n re.src_xn +\n '|' +\n '(?:' + re.src_pseudo_letter + ')' +\n '|' +\n '(?:' + re.src_pseudo_letter + '(?:-|' + re.src_pseudo_letter + '){0,61}' + re.src_pseudo_letter + ')' +\n ')';\n\n re.src_host =\n\n '(?:' +\n // Don't need IP check, because digits are already allowed in normal domain names\n // src_ip4 +\n // '|' +\n '(?:(?:(?:' + re.src_domain + ')\\\\.)*' + re.src_domain/*_root*/ + ')' +\n ')';\n\n re.tpl_host_fuzzy =\n\n '(?:' +\n re.src_ip4 +\n '|' +\n '(?:(?:(?:' + re.src_domain + ')\\\\.)+(?:%TLDS%))' +\n ')';\n\n re.tpl_host_no_ip_fuzzy =\n\n '(?:(?:(?:' + re.src_domain + ')\\\\.)+(?:%TLDS%))';\n\n re.src_host_strict =\n\n re.src_host + re.src_host_terminator;\n\n re.tpl_host_fuzzy_strict =\n\n re.tpl_host_fuzzy + re.src_host_terminator;\n\n re.src_host_port_strict =\n\n re.src_host + re.src_port + re.src_host_terminator;\n\n re.tpl_host_port_fuzzy_strict =\n\n re.tpl_host_fuzzy + re.src_port + re.src_host_terminator;\n\n re.tpl_host_port_no_ip_fuzzy_strict =\n\n re.tpl_host_no_ip_fuzzy + re.src_port + re.src_host_terminator;\n\n\n ////////////////////////////////////////////////////////////////////////////////\n // Main rules\n\n // Rude test fuzzy links by host, for quick deny\n re.tpl_host_fuzzy_test =\n\n 'localhost|www\\\\.|\\\\.\\\\d{1,3}\\\\.|(?:\\\\.(?:%TLDS%)(?:' + re.src_ZPCc + '|>|$))';\n\n re.tpl_email_fuzzy =\n\n '(^|' + text_separators + '|\"|\\\\(|' + re.src_ZCc + ')' +\n '(' + re.src_email_name + '@' + re.tpl_host_fuzzy_strict + ')';\n\n re.tpl_link_fuzzy =\n // Fuzzy link can't be prepended with .:/\\- and non punctuation.\n // but can start with > (markdown blockquote)\n '(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uff5c]|' + re.src_ZPCc + '))' +\n '((?![$+<=>^`|\\uff5c])' + re.tpl_host_port_fuzzy_strict + re.src_path + ')';\n\n re.tpl_link_no_ip_fuzzy =\n // Fuzzy link can't be prepended with .:/\\- and non punctuation.\n // but can start with > (markdown blockquote)\n '(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uff5c]|' + re.src_ZPCc + '))' +\n '((?![$+<=>^`|\\uff5c])' + re.tpl_host_port_no_ip_fuzzy_strict + re.src_path + ')';\n\n return re;\n};\n", "'use strict';\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Helpers\n\n// Merge objects\n//\nfunction assign(obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n\n sources.forEach(function (source) {\n if (!source) { return; }\n\n Object.keys(source).forEach(function (key) {\n obj[key] = source[key];\n });\n });\n\n return obj;\n}\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\nfunction isString(obj) { return _class(obj) === '[object String]'; }\nfunction isObject(obj) { return _class(obj) === '[object Object]'; }\nfunction isRegExp(obj) { return _class(obj) === '[object RegExp]'; }\nfunction isFunction(obj) { return _class(obj) === '[object Function]'; }\n\n\nfunction escapeRE(str) { return str.replace(/[.?*+^$[\\]\\\\(){}|-]/g, '\\\\$&'); }\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nvar defaultOptions = {\n fuzzyLink: true,\n fuzzyEmail: true,\n fuzzyIP: false\n};\n\n\nfunction isOptionsObj(obj) {\n return Object.keys(obj || {}).reduce(function (acc, k) {\n return acc || defaultOptions.hasOwnProperty(k);\n }, false);\n}\n\n\nvar defaultSchemas = {\n 'http:': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.http) {\n // compile lazily, because \"host\"-containing variables can change on tlds update.\n self.re.http = new RegExp(\n '^\\\\/\\\\/' + self.re.src_auth + self.re.src_host_port_strict + self.re.src_path, 'i'\n );\n }\n if (self.re.http.test(tail)) {\n return tail.match(self.re.http)[0].length;\n }\n return 0;\n }\n },\n 'https:': 'http:',\n 'ftp:': 'http:',\n '//': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.no_http) {\n // compile lazily, because \"host\"-containing variables can change on tlds update.\n self.re.no_http = new RegExp(\n '^' +\n self.re.src_auth +\n // Don't allow single-level domains, because of false positives like '//test'\n // with code comments\n '(?:localhost|(?:(?:' + self.re.src_domain + ')\\\\.)+' + self.re.src_domain_root + ')' +\n self.re.src_port +\n self.re.src_host_terminator +\n self.re.src_path,\n\n 'i'\n );\n }\n\n if (self.re.no_http.test(tail)) {\n // should not be `://` & `///`, that protects from errors in protocol name\n if (pos >= 3 && text[pos - 3] === ':') { return 0; }\n if (pos >= 3 && text[pos - 3] === '/') { return 0; }\n return tail.match(self.re.no_http)[0].length;\n }\n return 0;\n }\n },\n 'mailto:': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.mailto) {\n self.re.mailto = new RegExp(\n '^' + self.re.src_email_name + '@' + self.re.src_host_strict, 'i'\n );\n }\n if (self.re.mailto.test(tail)) {\n return tail.match(self.re.mailto)[0].length;\n }\n return 0;\n }\n }\n};\n\n/*eslint-disable max-len*/\n\n// RE pattern for 2-character tlds (autogenerated by ./support/tlds_2char_gen.js)\nvar tlds_2ch_src_re = 'a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]';\n\n// DON'T try to make PRs with changes. Extend TLDs with LinkifyIt.tlds() instead\nvar tlds_default = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\u0440\u0444'.split('|');\n\n/*eslint-enable max-len*/\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction resetScanCache(self) {\n self.__index__ = -1;\n self.__text_cache__ = '';\n}\n\nfunction createValidator(re) {\n return function (text, pos) {\n var tail = text.slice(pos);\n\n if (re.test(tail)) {\n return tail.match(re)[0].length;\n }\n return 0;\n };\n}\n\nfunction createNormalizer() {\n return function (match, self) {\n self.normalize(match);\n };\n}\n\n// Schemas compiler. Build regexps.\n//\nfunction compile(self) {\n\n // Load & clone RE patterns.\n var re = self.re = require('./lib/re')(self.__opts__);\n\n // Define dynamic patterns\n var tlds = self.__tlds__.slice();\n\n self.onCompile();\n\n if (!self.__tlds_replaced__) {\n tlds.push(tlds_2ch_src_re);\n }\n tlds.push(re.src_xn);\n\n re.src_tlds = tlds.join('|');\n\n function untpl(tpl) { return tpl.replace('%TLDS%', re.src_tlds); }\n\n re.email_fuzzy = RegExp(untpl(re.tpl_email_fuzzy), 'i');\n re.link_fuzzy = RegExp(untpl(re.tpl_link_fuzzy), 'i');\n re.link_no_ip_fuzzy = RegExp(untpl(re.tpl_link_no_ip_fuzzy), 'i');\n re.host_fuzzy_test = RegExp(untpl(re.tpl_host_fuzzy_test), 'i');\n\n //\n // Compile each schema\n //\n\n var aliases = [];\n\n self.__compiled__ = {}; // Reset compiled data\n\n function schemaError(name, val) {\n throw new Error('(LinkifyIt) Invalid schema \"' + name + '\": ' + val);\n }\n\n Object.keys(self.__schemas__).forEach(function (name) {\n var val = self.__schemas__[name];\n\n // skip disabled methods\n if (val === null) { return; }\n\n var compiled = { validate: null, link: null };\n\n self.__compiled__[name] = compiled;\n\n if (isObject(val)) {\n if (isRegExp(val.validate)) {\n compiled.validate = createValidator(val.validate);\n } else if (isFunction(val.validate)) {\n compiled.validate = val.validate;\n } else {\n schemaError(name, val);\n }\n\n if (isFunction(val.normalize)) {\n compiled.normalize = val.normalize;\n } else if (!val.normalize) {\n compiled.normalize = createNormalizer();\n } else {\n schemaError(name, val);\n }\n\n return;\n }\n\n if (isString(val)) {\n aliases.push(name);\n return;\n }\n\n schemaError(name, val);\n });\n\n //\n // Compile postponed aliases\n //\n\n aliases.forEach(function (alias) {\n if (!self.__compiled__[self.__schemas__[alias]]) {\n // Silently fail on missed schemas to avoid errons on disable.\n // schemaError(alias, self.__schemas__[alias]);\n return;\n }\n\n self.__compiled__[alias].validate =\n self.__compiled__[self.__schemas__[alias]].validate;\n self.__compiled__[alias].normalize =\n self.__compiled__[self.__schemas__[alias]].normalize;\n });\n\n //\n // Fake record for guessed links\n //\n self.__compiled__[''] = { validate: null, normalize: createNormalizer() };\n\n //\n // Build schema condition\n //\n var slist = Object.keys(self.__compiled__)\n .filter(function (name) {\n // Filter disabled & fake schemas\n return name.length > 0 && self.__compiled__[name];\n })\n .map(escapeRE)\n .join('|');\n // (?!_) cause 1.5x slowdown\n self.re.schema_test = RegExp('(^|(?!_)(?:[><\\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'i');\n self.re.schema_search = RegExp('(^|(?!_)(?:[><\\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'ig');\n\n self.re.pretest = RegExp(\n '(' + self.re.schema_test.source + ')|(' + self.re.host_fuzzy_test.source + ')|@',\n 'i'\n );\n\n //\n // Cleanup\n //\n\n resetScanCache(self);\n}\n\n/**\n * class Match\n *\n * Match result. Single element of array, returned by [[LinkifyIt#match]]\n **/\nfunction Match(self, shift) {\n var start = self.__index__,\n end = self.__last_index__,\n text = self.__text_cache__.slice(start, end);\n\n /**\n * Match#schema -> String\n *\n * Prefix (protocol) for matched string.\n **/\n this.schema = self.__schema__.toLowerCase();\n /**\n * Match#index -> Number\n *\n * First position of matched string.\n **/\n this.index = start + shift;\n /**\n * Match#lastIndex -> Number\n *\n * Next position after matched string.\n **/\n this.lastIndex = end + shift;\n /**\n * Match#raw -> String\n *\n * Matched string.\n **/\n this.raw = text;\n /**\n * Match#text -> String\n *\n * Notmalized text of matched string.\n **/\n this.text = text;\n /**\n * Match#url -> String\n *\n * Normalized url of matched string.\n **/\n this.url = text;\n}\n\nfunction createMatch(self, shift) {\n var match = new Match(self, shift);\n\n self.__compiled__[match.schema].normalize(match, self);\n\n return match;\n}\n\n\n/**\n * class LinkifyIt\n **/\n\n/**\n * new LinkifyIt(schemas, options)\n * - schemas (Object): Optional. Additional schemas to validate (prefix/validator)\n * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }\n *\n * Creates new linkifier instance with optional additional schemas.\n * Can be called without `new` keyword for convenience.\n *\n * By default understands:\n *\n * - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links\n * - \"fuzzy\" links and emails (example.com, foo@bar.com).\n *\n * `schemas` is an object, where each key/value describes protocol/rule:\n *\n * - __key__ - link prefix (usually, protocol name with `:` at the end, `skype:`\n * for example). `linkify-it` makes shure that prefix is not preceeded with\n * alphanumeric char and symbols. Only whitespaces and punctuation allowed.\n * - __value__ - rule to check tail after link prefix\n * - _String_ - just alias to existing rule\n * - _Object_\n * - _validate_ - validator function (should return matched length on success),\n * or `RegExp`.\n * - _normalize_ - optional function to normalize text & url of matched result\n * (for example, for @twitter mentions).\n *\n * `options`:\n *\n * - __fuzzyLink__ - recognige URL-s without `http(s):` prefix. Default `true`.\n * - __fuzzyIP__ - allow IPs in fuzzy links above. Can conflict with some texts\n * like version numbers. Default `false`.\n * - __fuzzyEmail__ - recognize emails without `mailto:` prefix.\n *\n **/\nfunction LinkifyIt(schemas, options) {\n if (!(this instanceof LinkifyIt)) {\n return new LinkifyIt(schemas, options);\n }\n\n if (!options) {\n if (isOptionsObj(schemas)) {\n options = schemas;\n schemas = {};\n }\n }\n\n this.__opts__ = assign({}, defaultOptions, options);\n\n // Cache last tested result. Used to skip repeating steps on next `match` call.\n this.__index__ = -1;\n this.__last_index__ = -1; // Next scan position\n this.__schema__ = '';\n this.__text_cache__ = '';\n\n this.__schemas__ = assign({}, defaultSchemas, schemas);\n this.__compiled__ = {};\n\n this.__tlds__ = tlds_default;\n this.__tlds_replaced__ = false;\n\n this.re = {};\n\n compile(this);\n}\n\n\n/** chainable\n * LinkifyIt#add(schema, definition)\n * - schema (String): rule name (fixed pattern prefix)\n * - definition (String|RegExp|Object): schema definition\n *\n * Add new rule definition. See constructor description for details.\n **/\nLinkifyIt.prototype.add = function add(schema, definition) {\n this.__schemas__[schema] = definition;\n compile(this);\n return this;\n};\n\n\n/** chainable\n * LinkifyIt#set(options)\n * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }\n *\n * Set recognition options for links without schema.\n **/\nLinkifyIt.prototype.set = function set(options) {\n this.__opts__ = assign(this.__opts__, options);\n return this;\n};\n\n\n/**\n * LinkifyIt#test(text) -> Boolean\n *\n * Searches linkifiable pattern and returns `true` on success or `false` on fail.\n **/\nLinkifyIt.prototype.test = function test(text) {\n // Reset scan cache\n this.__text_cache__ = text;\n this.__index__ = -1;\n\n if (!text.length) { return false; }\n\n var m, ml, me, len, shift, next, re, tld_pos, at_pos;\n\n // try to scan for link with schema - that's the most simple rule\n if (this.re.schema_test.test(text)) {\n re = this.re.schema_search;\n re.lastIndex = 0;\n while ((m = re.exec(text)) !== null) {\n len = this.testSchemaAt(text, m[2], re.lastIndex);\n if (len) {\n this.__schema__ = m[2];\n this.__index__ = m.index + m[1].length;\n this.__last_index__ = m.index + m[0].length + len;\n break;\n }\n }\n }\n\n if (this.__opts__.fuzzyLink && this.__compiled__['http:']) {\n // guess schemaless links\n tld_pos = text.search(this.re.host_fuzzy_test);\n if (tld_pos >= 0) {\n // if tld is located after found link - no need to check fuzzy pattern\n if (this.__index__ < 0 || tld_pos < this.__index__) {\n if ((ml = text.match(this.__opts__.fuzzyIP ? this.re.link_fuzzy : this.re.link_no_ip_fuzzy)) !== null) {\n\n shift = ml.index + ml[1].length;\n\n if (this.__index__ < 0 || shift < this.__index__) {\n this.__schema__ = '';\n this.__index__ = shift;\n this.__last_index__ = ml.index + ml[0].length;\n }\n }\n }\n }\n }\n\n if (this.__opts__.fuzzyEmail && this.__compiled__['mailto:']) {\n // guess schemaless emails\n at_pos = text.indexOf('@');\n if (at_pos >= 0) {\n // We can't skip this check, because this cases are possible:\n // 192.168.1.1@gmail.com, my.in@example.com\n if ((me = text.match(this.re.email_fuzzy)) !== null) {\n\n shift = me.index + me[1].length;\n next = me.index + me[0].length;\n\n if (this.__index__ < 0 || shift < this.__index__ ||\n (shift === this.__index__ && next > this.__last_index__)) {\n this.__schema__ = 'mailto:';\n this.__index__ = shift;\n this.__last_index__ = next;\n }\n }\n }\n }\n\n return this.__index__ >= 0;\n};\n\n\n/**\n * LinkifyIt#pretest(text) -> Boolean\n *\n * Very quick check, that can give false positives. Returns true if link MAY BE\n * can exists. Can be used for speed optimization, when you need to check that\n * link NOT exists.\n **/\nLinkifyIt.prototype.pretest = function pretest(text) {\n return this.re.pretest.test(text);\n};\n\n\n/**\n * LinkifyIt#testSchemaAt(text, name, position) -> Number\n * - text (String): text to scan\n * - name (String): rule (schema) name\n * - position (Number): text offset to check from\n *\n * Similar to [[LinkifyIt#test]] but checks only specific protocol tail exactly\n * at given position. Returns length of found pattern (0 on fail).\n **/\nLinkifyIt.prototype.testSchemaAt = function testSchemaAt(text, schema, pos) {\n // If not supported schema check requested - terminate\n if (!this.__compiled__[schema.toLowerCase()]) {\n return 0;\n }\n return this.__compiled__[schema.toLowerCase()].validate(text, pos, this);\n};\n\n\n/**\n * LinkifyIt#match(text) -> Array|null\n *\n * Returns array of found link descriptions or `null` on fail. We strongly\n * recommend to use [[LinkifyIt#test]] first, for best speed.\n *\n * ##### Result match description\n *\n * - __schema__ - link schema, can be empty for fuzzy links, or `//` for\n * protocol-neutral links.\n * - __index__ - offset of matched text\n * - __lastIndex__ - index of next char after mathch end\n * - __raw__ - matched text\n * - __text__ - normalized text\n * - __url__ - link, generated from matched text\n **/\nLinkifyIt.prototype.match = function match(text) {\n var shift = 0, result = [];\n\n // Try to take previous element from cache, if .test() called before\n if (this.__index__ >= 0 && this.__text_cache__ === text) {\n result.push(createMatch(this, shift));\n shift = this.__last_index__;\n }\n\n // Cut head if cache was used\n var tail = shift ? text.slice(shift) : text;\n\n // Scan string until end reached\n while (this.test(tail)) {\n result.push(createMatch(this, shift));\n\n tail = tail.slice(this.__last_index__);\n shift += this.__last_index__;\n }\n\n if (result.length) {\n return result;\n }\n\n return null;\n};\n\n\n/** chainable\n * LinkifyIt#tlds(list [, keepOld]) -> this\n * - list (Array): list of tlds\n * - keepOld (Boolean): merge with current list if `true` (`false` by default)\n *\n * Load (or merge) new tlds list. Those are user for fuzzy links (without prefix)\n * to avoid false positives. By default this algorythm used:\n *\n * - hostname with any 2-letter root zones are ok.\n * - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\u0440\u0444\n * are ok.\n * - encoded (`xn--...`) root zones are ok.\n *\n * If list is replaced, then exact match for 2-chars root zones will be checked.\n **/\nLinkifyIt.prototype.tlds = function tlds(list, keepOld) {\n list = Array.isArray(list) ? list : [ list ];\n\n if (!keepOld) {\n this.__tlds__ = list.slice();\n this.__tlds_replaced__ = true;\n compile(this);\n return this;\n }\n\n this.__tlds__ = this.__tlds__.concat(list)\n .sort()\n .filter(function (el, idx, arr) {\n return el !== arr[idx - 1];\n })\n .reverse();\n\n compile(this);\n return this;\n};\n\n/**\n * LinkifyIt#normalize(match)\n *\n * Default normalizer (if schema does not define it's own).\n **/\nLinkifyIt.prototype.normalize = function normalize(match) {\n\n // Do minimal possible changes by default. Need to collect feedback prior\n // to move forward https://github.com/markdown-it/linkify-it/issues/1\n\n if (!match.schema) { match.url = 'http://' + match.url; }\n\n if (match.schema === 'mailto:' && !/^mailto:/i.test(match.url)) {\n match.url = 'mailto:' + match.url;\n }\n};\n\n\n/**\n * LinkifyIt#onCompile()\n *\n * Override to modify basic RegExp-s.\n **/\nLinkifyIt.prototype.onCompile = function onCompile() {\n};\n\n\nmodule.exports = LinkifyIt;\n", "'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7E]/; // non-ASCII chars\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, fn) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = fn(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(string, fn) {\n\tconst parts = string.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tstring = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tstring = string.replace(regexSeparators, '\\x2E');\n\tconst labels = string.split('.');\n\tconst encoded = map(labels, fn).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see \n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = array => String.fromCodePoint(...array);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint - 0x30 < 0x0A) {\n\t\treturn codePoint - 0x16;\n\t}\n\tif (codePoint - 0x41 < 0x1A) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint - 0x61 < 0x1A) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t// 0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tlet oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tlet inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tlet basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue == n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.1.0',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see \n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nmodule.exports = punycode;\n", "// markdown-it default options\n\n'use strict';\n\n\nmodule.exports = {\n options: {\n html: false, // Enable HTML tags in source\n xhtmlOut: false, // Use '/' to close single tags (
)\n breaks: false, // Convert '\\n' in paragraphs into
\n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '\u00AB\u00BB\u201E\u201C' for Russian, '\u201E\u201C\u201A\u2018' for German,\n // and ['\u00AB\\xA0', '\\xA0\u00BB', '\u2039\\xA0', '\\xA0\u203A'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* \u201C\u201D\u2018\u2019 */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with )\n breaks: false, // Convert '\\n' in paragraphs into
\n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '\u00AB\u00BB\u201E\u201C' for Russian, '\u201E\u201C\u201A\u2018' for German,\n // and ['\u00AB\\xA0', '\\xA0\u00BB', '\u2039\\xA0', '\\xA0\u203A'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* \u201C\u201D\u2018\u2019 */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with )\n breaks: false, // Convert '\\n' in paragraphs into
\n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '\u00AB\u00BB\u201E\u201C' for Russian, '\u201E\u201C\u201A\u2018' for German,\n // and ['\u00AB\\xA0', '\\xA0\u00BB', '\u2039\\xA0', '\\xA0\u203A'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* \u201C\u201D\u2018\u2019 */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with = 0) {\n try {\n parsed.hostname = punycode.toASCII(parsed.hostname);\n } catch (er) { /**/ }\n }\n }\n\n return mdurl.encode(mdurl.format(parsed));\n}\n\nfunction normalizeLinkText(url) {\n var parsed = mdurl.parse(url, true);\n\n if (parsed.hostname) {\n // Encode hostnames in urls like:\n // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n //\n // We don't encode unknown schemas, because it's likely that we encode\n // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n //\n if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n try {\n parsed.hostname = punycode.toUnicode(parsed.hostname);\n } catch (er) { /**/ }\n }\n }\n\n // add '%' to exclude list because of https://github.com/markdown-it/markdown-it/issues/720\n return mdurl.decode(mdurl.format(parsed), mdurl.decode.defaultChars + '%');\n}\n\n\n/**\n * class MarkdownIt\n *\n * Main parser/renderer class.\n *\n * ##### Usage\n *\n * ```javascript\n * // node.js, \"classic\" way:\n * var MarkdownIt = require('markdown-it'),\n * md = new MarkdownIt();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // node.js, the same, but with sugar:\n * var md = require('markdown-it')();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // browser without AMD, added to \"window\" on script load\n * // Note, there are no dash.\n * var md = window.markdownit();\n * var result = md.render('# markdown-it rulezz!');\n * ```\n *\n * Single line rendering, without paragraph wrap:\n *\n * ```javascript\n * var md = require('markdown-it')();\n * var result = md.renderInline('__markdown-it__ rulezz!');\n * ```\n **/\n\n/**\n * new MarkdownIt([presetName, options])\n * - presetName (String): optional, `commonmark` / `zero`\n * - options (Object)\n *\n * Creates parser instanse with given config. Can be called without `new`.\n *\n * ##### presetName\n *\n * MarkdownIt provides named presets as a convenience to quickly\n * enable/disable active syntax rules and options for common use cases.\n *\n * - [\"commonmark\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/commonmark.js) -\n * configures parser to strict [CommonMark](http://commonmark.org/) mode.\n * - [default](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/default.js) -\n * similar to GFM, used when no preset name given. Enables all available rules,\n * but still without html, typographer & autolinker.\n * - [\"zero\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/zero.js) -\n * all rules disabled. Useful to quickly setup your config via `.enable()`.\n * For example, when you need only `bold` and `italic` markup and nothing else.\n *\n * ##### options:\n *\n * - __html__ - `false`. Set `true` to enable HTML tags in source. Be careful!\n * That's not safe! You may need external sanitizer to protect output from XSS.\n * It's better to extend features via plugins, instead of enabling HTML.\n * - __xhtmlOut__ - `false`. Set `true` to add '/' when closing single tags\n * (`
`). This is needed only for full CommonMark compatibility. In real\n * world you will need HTML output.\n * - __breaks__ - `false`. Set `true` to convert `\\n` in paragraphs into `
`.\n * - __langPrefix__ - `language-`. CSS language class prefix for fenced blocks.\n * Can be useful for external highlighters.\n * - __linkify__ - `false`. Set `true` to autoconvert URL-like text to links.\n * - __typographer__ - `false`. Set `true` to enable [some language-neutral\n * replacement](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.js) +\n * quotes beautification (smartquotes).\n * - __quotes__ - `\u201C\u201D\u2018\u2019`, String or Array. Double + single quotes replacement\n * pairs, when typographer enabled and smartquotes on. For example, you can\n * use `'\u00AB\u00BB\u201E\u201C'` for Russian, `'\u201E\u201C\u201A\u2018'` for German, and\n * `['\u00AB\\xA0', '\\xA0\u00BB', '\u2039\\xA0', '\\xA0\u203A']` for French (including nbsp).\n * - __highlight__ - `null`. Highlighter function for fenced code blocks.\n * Highlighter `function (str, lang)` should return escaped HTML. It can also\n * return empty string if the source was not changed and should be escaped\n * externaly. If result starts with `):\n *\n * ```javascript\n * var hljs = require('highlight.js') // https://highlightjs.org/\n *\n * // Actual default values\n * var md = require('markdown-it')({\n * highlight: function (str, lang) {\n * if (lang && hljs.getLanguage(lang)) {\n * try {\n * return '
' +\n *                hljs.highlight(str, { language: lang, ignoreIllegals: true }).value +\n *                '
';\n * } catch (__) {}\n * }\n *\n * return '
' + md.utils.escapeHtml(str) + '
';\n * }\n * });\n * ```\n *\n **/\nfunction MarkdownIt(presetName, options) {\n if (!(this instanceof MarkdownIt)) {\n return new MarkdownIt(presetName, options);\n }\n\n if (!options) {\n if (!utils.isString(presetName)) {\n options = presetName || {};\n presetName = 'default';\n }\n }\n\n /**\n * MarkdownIt#inline -> ParserInline\n *\n * Instance of [[ParserInline]]. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.inline = new ParserInline();\n\n /**\n * MarkdownIt#block -> ParserBlock\n *\n * Instance of [[ParserBlock]]. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.block = new ParserBlock();\n\n /**\n * MarkdownIt#core -> Core\n *\n * Instance of [[Core]] chain executor. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.core = new ParserCore();\n\n /**\n * MarkdownIt#renderer -> Renderer\n *\n * Instance of [[Renderer]]. Use it to modify output look. Or to add rendering\n * rules for new token types, generated by plugins.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * function myToken(tokens, idx, options, env, self) {\n * //...\n * return result;\n * };\n *\n * md.renderer.rules['my_token'] = myToken\n * ```\n *\n * See [[Renderer]] docs and [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js).\n **/\n this.renderer = new Renderer();\n\n /**\n * MarkdownIt#linkify -> LinkifyIt\n *\n * [linkify-it](https://github.com/markdown-it/linkify-it) instance.\n * Used by [linkify](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/linkify.js)\n * rule.\n **/\n this.linkify = new LinkifyIt();\n\n /**\n * MarkdownIt#validateLink(url) -> Boolean\n *\n * Link validation function. CommonMark allows too much in links. By default\n * we disable `javascript:`, `vbscript:`, `file:` schemas, and almost all `data:...` schemas\n * except some embedded image types.\n *\n * You can change this behaviour:\n *\n * ```javascript\n * var md = require('markdown-it')();\n * // enable everything\n * md.validateLink = function () { return true; }\n * ```\n **/\n this.validateLink = validateLink;\n\n /**\n * MarkdownIt#normalizeLink(url) -> String\n *\n * Function used to encode link url to a machine-readable format,\n * which includes url-encoding, punycode, etc.\n **/\n this.normalizeLink = normalizeLink;\n\n /**\n * MarkdownIt#normalizeLinkText(url) -> String\n *\n * Function used to decode link url to a human-readable format`\n **/\n this.normalizeLinkText = normalizeLinkText;\n\n\n // Expose utils & helpers for easy acces from plugins\n\n /**\n * MarkdownIt#utils -> utils\n *\n * Assorted utility functions, useful to write plugins. See details\n * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/common/utils.js).\n **/\n this.utils = utils;\n\n /**\n * MarkdownIt#helpers -> helpers\n *\n * Link components parser functions, useful to write plugins. See details\n * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/helpers).\n **/\n this.helpers = utils.assign({}, helpers);\n\n\n this.options = {};\n this.configure(presetName);\n\n if (options) { this.set(options); }\n}\n\n\n/** chainable\n * MarkdownIt.set(options)\n *\n * Set parser options (in the same format as in constructor). Probably, you\n * will never need it, but you can change options after constructor call.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n * .set({ html: true, breaks: true })\n * .set({ typographer, true });\n * ```\n *\n * __Note:__ To achieve the best possible performance, don't modify a\n * `markdown-it` instance options on the fly. If you need multiple configurations\n * it's best to create multiple instances and initialize each with separate\n * config.\n **/\nMarkdownIt.prototype.set = function (options) {\n utils.assign(this.options, options);\n return this;\n};\n\n\n/** chainable, internal\n * MarkdownIt.configure(presets)\n *\n * Batch load of all options and compenent settings. This is internal method,\n * and you probably will not need it. But if you will - see available presets\n * and data structure [here](https://github.com/markdown-it/markdown-it/tree/master/lib/presets)\n *\n * We strongly recommend to use presets instead of direct config loads. That\n * will give better compatibility with next versions.\n **/\nMarkdownIt.prototype.configure = function (presets) {\n var self = this, presetName;\n\n if (utils.isString(presets)) {\n presetName = presets;\n presets = config[presetName];\n if (!presets) { throw new Error('Wrong `markdown-it` preset \"' + presetName + '\", check name'); }\n }\n\n if (!presets) { throw new Error('Wrong `markdown-it` preset, can\\'t be empty'); }\n\n if (presets.options) { self.set(presets.options); }\n\n if (presets.components) {\n Object.keys(presets.components).forEach(function (name) {\n if (presets.components[name].rules) {\n self[name].ruler.enableOnly(presets.components[name].rules);\n }\n if (presets.components[name].rules2) {\n self[name].ruler2.enableOnly(presets.components[name].rules2);\n }\n });\n }\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.enable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to enable\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable list or rules. It will automatically find appropriate components,\n * containing rules with given names. If rule not found, and `ignoreInvalid`\n * not set - throws exception.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n * .enable(['sub', 'sup'])\n * .disable('smartquotes');\n * ```\n **/\nMarkdownIt.prototype.enable = function (list, ignoreInvalid) {\n var result = [];\n\n if (!Array.isArray(list)) { list = [ list ]; }\n\n [ 'core', 'block', 'inline' ].forEach(function (chain) {\n result = result.concat(this[chain].ruler.enable(list, true));\n }, this);\n\n result = result.concat(this.inline.ruler2.enable(list, true));\n\n var missed = list.filter(function (name) { return result.indexOf(name) < 0; });\n\n if (missed.length && !ignoreInvalid) {\n throw new Error('MarkdownIt. Failed to enable unknown rule(s): ' + missed);\n }\n\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.disable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * The same as [[MarkdownIt.enable]], but turn specified rules off.\n **/\nMarkdownIt.prototype.disable = function (list, ignoreInvalid) {\n var result = [];\n\n if (!Array.isArray(list)) { list = [ list ]; }\n\n [ 'core', 'block', 'inline' ].forEach(function (chain) {\n result = result.concat(this[chain].ruler.disable(list, true));\n }, this);\n\n result = result.concat(this.inline.ruler2.disable(list, true));\n\n var missed = list.filter(function (name) { return result.indexOf(name) < 0; });\n\n if (missed.length && !ignoreInvalid) {\n throw new Error('MarkdownIt. Failed to disable unknown rule(s): ' + missed);\n }\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.use(plugin, params)\n *\n * Load specified plugin with given params into current parser instance.\n * It's just a sugar to call `plugin(md, params)` with curring.\n *\n * ##### Example\n *\n * ```javascript\n * var iterator = require('markdown-it-for-inline');\n * var md = require('markdown-it')()\n * .use(iterator, 'foo_replace', 'text', function (tokens, idx) {\n * tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar');\n * });\n * ```\n **/\nMarkdownIt.prototype.use = function (plugin /*, params, ... */) {\n var args = [ this ].concat(Array.prototype.slice.call(arguments, 1));\n plugin.apply(plugin, args);\n return this;\n};\n\n\n/** internal\n * MarkdownIt.parse(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Parse input string and return list of block tokens (special token type\n * \"inline\" will contain list of inline tokens). You should not call this\n * method directly, until you write custom renderer (for example, to produce\n * AST).\n *\n * `env` is used to pass data between \"distributed\" rules and return additional\n * metadata like reference info, needed for the renderer. It also can be used to\n * inject data in specific cases. Usually, you will be ok to pass `{}`,\n * and then pass updated object to renderer.\n **/\nMarkdownIt.prototype.parse = function (src, env) {\n if (typeof src !== 'string') {\n throw new Error('Input data should be a String');\n }\n\n var state = new this.core.State(src, this, env);\n\n this.core.process(state);\n\n return state.tokens;\n};\n\n\n/**\n * MarkdownIt.render(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Render markdown string into html. It does all magic for you :).\n *\n * `env` can be used to inject additional metadata (`{}` by default).\n * But you will not need it with high probability. See also comment\n * in [[MarkdownIt.parse]].\n **/\nMarkdownIt.prototype.render = function (src, env) {\n env = env || {};\n\n return this.renderer.render(this.parse(src, env), this.options, env);\n};\n\n\n/** internal\n * MarkdownIt.parseInline(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * The same as [[MarkdownIt.parse]] but skip all block rules. It returns the\n * block tokens list with the single `inline` element, containing parsed inline\n * tokens in `children` property. Also updates `env` object.\n **/\nMarkdownIt.prototype.parseInline = function (src, env) {\n var state = new this.core.State(src, this, env);\n\n state.inlineMode = true;\n this.core.process(state);\n\n return state.tokens;\n};\n\n\n/**\n * MarkdownIt.renderInline(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Similar to [[MarkdownIt.render]] but for single paragraph content. Result\n * will NOT be wrapped into `

` tags.\n **/\nMarkdownIt.prototype.renderInline = function (src, env) {\n env = env || {};\n\n return this.renderer.render(this.parseInline(src, env), this.options, env);\n};\n\n\nmodule.exports = MarkdownIt;\n", "'use strict';\n\n\nmodule.exports = require('./lib/');\n", "/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */\n/* Written by Mathias Bynens */\njQuery(function($){\n\t$.datepicker.regional.nl = {\n\t\tcloseText: 'Sluiten',\n\t\tprevText: '\u2190',\n\t\tnextText: '\u2192',\n\t\tcurrentText: 'Vandaag',\n\t\tmonthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',\n\t\t'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n\t\tmonthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',\n\t\t'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],\n\t\tdayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n\t\tdayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],\n\t\tdayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n\t\tweekHeader: 'Wk',\n\t\tdateFormat: 'dd-mm-yy',\n\t\tfirstDay: 1,\n\t\tisRTL: false,\n\t\tshowMonthAfterYear: false,\n\t\tyearSuffix: ''};\n\t$.datepicker.setDefaults($.datepicker.regional.nl);\n});\n", "/******* Translations ******/\n\nconst dicts = {};\n\nlet dict = {};\n\n// gettext stub\nfunction _(s, fb) {\n return dict[s] || fb || s;\n}\n\n_.tagged = (strings, ...values) =>\n strings.reduce((acc, cur, idx) => acc + cur + _(values[idx] || \"\"), \"\");\n\n_.taggedWithin =\n prefix =>\n (strings, ...values) =>\n strings.reduce(\n (acc, cur, idx) =>\n acc +\n cur +\n (_(prefix, { [values[idx]]: values[idx] })[values[idx]] ||\n values[idx] ||\n \"\"),\n \"\"\n );\n\n_.set = function (ob) {\n const lang = ob[\"lang\"] || _(\"lang\"); // Either provided or current lang?\n if (!dicts[lang]) {\n dicts[lang] = {};\n }\n for (let [key, val] of Object.entries(ob)) {\n // Set only if not set before (by _.set, or by _.addTranslations)\n dicts[lang][key] || (dicts[lang][key] = val);\n }\n dict = dicts[lang];\n};\n\n_.addTranslations = function (translations) {\n for (var term in translations) {\n if (translations.hasOwnProperty(term))\n for (var lang in translations[term]) {\n if (!dicts[lang]) dicts[lang] = {};\n // Always override what has been set before\n dicts[lang][term] = translations[term][lang];\n }\n }\n};\n\nObject.freeze(_);\n\nexport { _ };\n", "import { _ } from \"$json/lib/gettext\";\n\nconst strings = {\n \"lang\": \"nl\",\n \"Doubleclick to go back to this question\":\n \"Dubbelklikken om naar deze vraag terug te springen\",\n \"create a new case\": \"maak een nieuwe casus aan\",\n \"new\": \"nieuw\",\n \"Delete\": \"Verwijder\",\n \"case\": \"casus\",\n \"cases\": \"casus\",\n \"Last opened\": \"Laatst geopend\",\n \"created\": \"gemaakt\",\n \"report\": \"rapport\",\n \"Sun\": \"Zo\",\n \"Mon\": \"Ma\",\n \"Tue\": \"Di\",\n \"Wed\": \"Wo\",\n \"Thu\": \"Do\",\n \"Fri\": \"Vr\",\n \"Sat\": \"Za\",\n \"Jan\": \"Jan\",\n \"Feb\": \"Feb\",\n \"Mar\": \"Maart\",\n \"Apr\": \"April\",\n \"May\": \"Mei\",\n \"June\": \"Juni\",\n \"July\": \"Juli\",\n \"Aug\": \"Aug\",\n \"Sep\": \"Sep\",\n \"Oct\": \"Okt\",\n \"Nov\": \"Nov\",\n \"Dec\": \"Dec\",\n \"press enter to accept\": \"accepteer met ENTER\",\n \"filter cases by name\": \"zoek casus op naam\",\n \"field--value\": \"deze waarde\",\n \"field--date\": \"deze datum\",\n \"field--field\": \"dit veld\",\n \"field--list\": \"deze opties\",\n \"quoted--value\": \"de waarde \u201C{quotable}\u201D\",\n \"quoted--date\": \"de datum \u201C{quotable}\u201D\",\n \"quoted--field\": \"het veld \u201C{quotable}\u201D\",\n \"quoted--list\": \"de opties in \u201C{quotable}\u201D\",\n \"Date required\":\n \"{quotable--init} is verplicht; gebruik het formaat dd\u200A-\u200Amm\u200A-\u200Aj\u200Aj\u200Aj\u200Aj.\",\n \"Input required\": \"{quotable--init} is verplicht\",\n \"Choice required\": \"Keuze uit {quotable} is verplicht\",\n \"Field required\": \"{quotable--init} is verplicht\",\n \"Value has to lie between {minimum} and {maximum}\":\n \"{quotable--init} moet tussen {minimum} en {maximum} liggen\",\n \"Date has to lie between {minimum} and {maximum}\":\n \"{quotable--init} moet tussen {minimum} en {maximum} liggen; gebruik het formaat dd-mm-jjjj.\",\n \"Negative number or zero expected\":\n \"{quotable--init} moet negatief zijn of nul\",\n \"Negative number expected\": \"{quotable--init} moet negatief zijn\",\n \"Value has to lie below {maximum}\":\n \"{quotable--init} moet lager zijn dan {maximum+1}\",\n \"Positive number or zero expected\": \"{quotable} moet positief zijn of nul\",\n \"Positive number expected\": \"{quotable} moet hoger zijn dan nul\",\n \"Value has to lie above {minimum}\":\n \"{quotable--init} moet hoger zijn dan {minimum-1}\",\n \"A date after {maximum} is not allowed\":\n \"{quotable--init} n\u00E1 {maximum} is niet toegestaan; gebruik het formaat dd-mm-jjjj.\",\n \"A date before {minimum} is not allowed\":\n \"{quotable--init} v\u00F3\u00F3r {minimum} is niet toegestaan; gebruik het formaat dd-mm-jjjj.\",\n \"Invalid date\":\n \"{quotable--init} is ongeldig; gebruik het formaat dd-mm-jjjj.\",\n \"Invalid number\": \"{quotable--init} is geen getal\",\n \"Text length exceeds the maximum of {0} characters\":\n \"{quotable--init} mag maximaal {maxlength} karakters bevatten\",\n \"click for more...\": \"klik voor meer...\",\n \" (click to open link)\": \" (klik om link te openen)\",\n \"Are you sure? This will reset all values.\":\n \"Weet u het zeker? Dit zal alle ingevulde velden leegmaken.\",\n \"Yesterday\": \"Gisteren\",\n \"No valid session\": \"Ongeldige gebruikersnaam of wachtwoord\",\n \"Maximum allowed characters: {0}\": \"Maximaal {0} karakters toegestaan\",\n \"No interfaces to show\":\n \"Geen zichtbare elementen (vragen, tekstvelden) gedefinieerd\",\n // feedback\n \"Feedback\": \"Feedback\",\n \"describe the problem\": \"omschrijf het probleem\",\n \"Please do not collate issues.\": \"Een melding per keer!\",\n \"Please send only feedback about the currently visible question or questions; information about these will be sent back to the developers.\":\n \"Geef alleen feedback over de vraag of vragen die je op dit moment op je scherm ziet; informatie over die vragen wordt namelijk meegezonden naar de ontwikkelaars.\",\n \"send\": \"verstuur\",\n \"Thanks for your feedback!\": \"Bedankt voor uw melding!\",\n \"Interface has failed (probably a failing SOAP or database connection)\":\n \"Interface gefaald (waarschijnlijk een falende SOAP- of databasekoppeling)\",\n \"Choose...\": \"Kies...\",\n \"Choose or type...\": \"Kies of typ...\",\n \"cUMWrongUserNamePassword\": \"Ongeldige gebruikersnaam of wachtwoord\",\n \"cWebCaseIsRunning\":\n \"Casus laden is niet gelukt; deze casus wordt al gedraaid in een andere sessie\",\n \"The model you are trying to open does not exist\":\n \"Het beslismodel dat u probeert te openen bestaat niet\",\n \"You may now safely close this window\": \"U kunt het venster nu sluiten\",\n \"user name\": \"gebruikersnaam\",\n \"password\": \"wachtwoord\",\n \"Your models\": \"Uw modellen\",\n \"Your sessions\": \"Uw sessies\",\n \"log in\": \"inloggen\",\n \"load session\": \"Lees uw gegevens in\",\n \"load\": \"inlezen\",\n \"Choose the session file you saved earlier\":\n \"Kies het gegevensbestand dat u de vorige keer hebt opgeslagen\",\n \"Error loading session (wrong data)\":\n \"Inlezen gegevens mislukt (verkeerde gegevens).\",\n \"Please login\": \"Gelieve in te loggen\",\n \"open\": \"open\",\n \"copy\": \"kopie\",\n 'You have no tickets left for model \"{0}\"':\n 'Uw strippenkaart voor model \"{0}\" is op',\n \"__digitgroupingchar__\": \".\",\n \"__radixpoint__\": \",\",\n \"__digitgroupingrules__\": [3],\n \"attachments\": \"bijlagen\",\n \"your documents\": \"uw documenten\",\n \"saved sessions\": \"bewaarde sessies\",\n \"We are currently updating. Please try again later.\":\n \"Er is momenteel een update aan de gang, probeert u het binnenkort nogmaals.\",\n \"case name\": \"casusnaam\",\n \"dateplaceholder\": \"dd\u200A-\u200Amm\u200A-\u200Aj\u200Aj\u200Aj\u200Aj\",\n \"Error: No response from server, server probably down\":\n \"Fout: Server is tijdelijk buiten gebruik. U moet zich opnieuw aanmelden.\",\n \"Session has timed out. Please log in again.\":\n \"De sessie is afgelopen. U moet zich opnieuw aanmelden.\",\n \"first {0} results\": \"eerste {0} resultaten\",\n \"previous {0} results\": \"vorige {0} resultaten\",\n \"next {0} results\": \"volgende {0} resultaten\",\n \"last {0} results\": \"laatste {0} resultaten\",\n \"results {0} to {1} from {2}\": \"resultaten {0} tot {1} van {2}\",\n \"add row\": \"Voeg rij toe\",\n \"insert row\": \"voeg rij in\",\n \"delete row\": \"verwijder rij\",\n \"There are errors, please double check your answers.\":\n \"Er zijn nog fouten, gelieve uw antwoorden nogmaals na te gaan.\",\n \"cancel\": \"annuleer\",\n \"Something went wrong; see the server log for more information.\":\n \"Er is iets misgegaan; bekijk de server log voor meer informatie\"\n};\n\n_.set(strings);\n\nexport { strings };\n", "/*! (c) Andrea Giammarchi - ISC */\nvar self = window || /* istanbul ignore next */ {};\ntry {\n (function (URLSearchParams, plus) {\n if (\n new URLSearchParams(\"q=%2B\").get(\"q\") !== plus ||\n new URLSearchParams({ q: plus }).get(\"q\") !== plus ||\n new URLSearchParams([[\"q\", plus]]).get(\"q\") !== plus ||\n new URLSearchParams(\"q=\\n\").toString() !== \"q=%0A\" ||\n new URLSearchParams({ q: \" &\" }).toString() !== \"q=+%26\" ||\n new URLSearchParams({ q: \"%zx\" }).toString() !== \"q=%25zx\"\n )\n throw URLSearchParams;\n self.URLSearchParams = URLSearchParams;\n })(URLSearchParams, \"+\");\n} catch (URLSearchParams) {\n (function (Object, String, isArray) {\n \"use strict\";\n var create = Object.create;\n var defineProperty = Object.defineProperty;\n var find = /[!'\\(\\)~]|%20|%00/g;\n var findPercentSign = /%(?![0-9a-fA-F]{2})/g;\n var plus = /\\+/g;\n var replace = {\n \"!\": \"%21\",\n \"'\": \"%27\",\n \"(\": \"%28\",\n \")\": \"%29\",\n \"~\": \"%7E\",\n \"%20\": \"+\",\n \"%00\": \"\\x00\"\n };\n var proto = {\n append: function (key, value) {\n appendTo(this._ungap, key, value);\n },\n delete: function (key) {\n delete this._ungap[key];\n },\n get: function (key) {\n return this.has(key) ? this._ungap[key][0] : null;\n },\n getAll: function (key) {\n return this.has(key) ? this._ungap[key].slice(0) : [];\n },\n has: function (key) {\n return key in this._ungap;\n },\n set: function (key, value) {\n this._ungap[key] = [String(value)];\n },\n forEach: function (callback, thisArg) {\n var self = this;\n for (var key in self._ungap) self._ungap[key].forEach(invoke, key);\n function invoke(value) {\n callback.call(thisArg, value, String(key), self);\n }\n },\n toJSON: function () {\n return {};\n },\n toString: function () {\n var query = [];\n for (var key in this._ungap) {\n var encoded = encode(key);\n for (var i = 0, value = this._ungap[key]; i < value.length; i++) {\n query.push(encoded + \"=\" + encode(value[i]));\n }\n }\n return query.join(\"&\");\n }\n };\n for (var key in proto)\n defineProperty(URLSearchParams.prototype, key, {\n configurable: true,\n writable: true,\n value: proto[key]\n });\n self.URLSearchParams = URLSearchParams;\n function URLSearchParams(query) {\n var dict = create(null);\n defineProperty(this, \"_ungap\", { value: dict });\n switch (true) {\n case !query:\n break;\n case typeof query === \"string\":\n if (query.charAt(0) === \"?\") {\n query = query.slice(1);\n }\n for (\n var pairs = query.split(\"&\"), i = 0, length = pairs.length;\n i < length;\n i++\n ) {\n var value = pairs[i];\n var index = value.indexOf(\"=\");\n if (-1 < index) {\n appendTo(\n dict,\n decode(value.slice(0, index)),\n decode(value.slice(index + 1))\n );\n } else if (value.length) {\n appendTo(dict, decode(value), \"\");\n }\n }\n break;\n case isArray(query):\n for (var i = 0, length = query.length; i < length; i++) {\n var value = query[i];\n appendTo(dict, value[0], value[1]);\n }\n break;\n case \"forEach\" in query:\n query.forEach(addEach, dict);\n break;\n default:\n for (var key in query) appendTo(dict, key, query[key]);\n }\n }\n\n function addEach(value, key) {\n appendTo(this, key, value);\n }\n\n function appendTo(dict, key, value) {\n var res = isArray(value) ? value.join(\",\") : value;\n if (key in dict) dict[key].push(res);\n else dict[key] = [res];\n }\n\n function decode(str) {\n return decodeURIComponent(\n str.replace(findPercentSign, \"%25\").replace(plus, \" \")\n );\n }\n\n function encode(str) {\n return encodeURIComponent(str).replace(find, replacer);\n }\n\n function replacer(match) {\n return replace[match];\n }\n })(Object, String, Array.isArray);\n}\n\n(function (URLSearchParamsProto) {\n var iterable = false;\n try {\n iterable = !!Symbol.iterator;\n } catch (o_O) {}\n\n /* istanbul ignore else */\n if (!(\"forEach\" in URLSearchParamsProto)) {\n URLSearchParamsProto.forEach = function forEach(callback, thisArg) {\n var self = this;\n var names = Object.create(null);\n this.toString()\n .replace(/=[\\s\\S]*?(?:&|$)/g, \"=\")\n .split(\"=\")\n .forEach(function (name) {\n if (!name.length || name in names) return;\n (names[name] = self.getAll(name)).forEach(function (value) {\n callback.call(thisArg, value, name, self);\n });\n });\n };\n }\n\n /* istanbul ignore else */\n if (!(\"keys\" in URLSearchParamsProto)) {\n URLSearchParamsProto.keys = function keys() {\n return iterator(this, function (value, key) {\n this.push(key);\n });\n };\n }\n\n /* istanbul ignore else */\n if (!(\"values\" in URLSearchParamsProto)) {\n URLSearchParamsProto.values = function values() {\n return iterator(this, function (value, key) {\n this.push(value);\n });\n };\n }\n\n /* istanbul ignore else */\n if (!(\"entries\" in URLSearchParamsProto)) {\n URLSearchParamsProto.entries = function entries() {\n return iterator(this, function (value, key) {\n this.push([key, value]);\n });\n };\n }\n\n /* istanbul ignore else */\n if (iterable && !(Symbol.iterator in URLSearchParamsProto)) {\n URLSearchParamsProto[Symbol.iterator] = URLSearchParamsProto.entries;\n }\n\n /* istanbul ignore else */\n if (!(\"sort\" in URLSearchParamsProto)) {\n URLSearchParamsProto.sort = function sort() {\n var entries = this.entries(),\n entry = entries.next(),\n done = entry.done,\n keys = [],\n values = Object.create(null),\n i,\n key,\n value;\n while (!done) {\n value = entry.value;\n key = value[0];\n keys.push(key);\n if (!(key in values)) {\n values[key] = [];\n }\n values[key].push(value[1]);\n entry = entries.next();\n done = entry.done;\n }\n // not the champion in efficiency\n // but these two bits just do the job\n keys.sort();\n for (i = 0; i < keys.length; i++) {\n this.delete(keys[i]);\n }\n for (i = 0; i < keys.length; i++) {\n key = keys[i];\n this.append(key, values[key].shift());\n }\n };\n }\n\n function iterator(self, callback) {\n var items = [];\n self.forEach(callback, items);\n return iterable\n ? items[Symbol.iterator]()\n : {\n next: function () {\n var value = items.shift();\n return { done: value === undefined, value: value };\n }\n };\n }\n\n /* istanbul ignore next */\n (function (Object) {\n var dP = Object.defineProperty,\n gOPD = Object.getOwnPropertyDescriptor,\n createSearchParamsPollute = function (search) {\n function append(name, value) {\n URLSearchParamsProto.append.call(this, name, value);\n name = this.toString();\n search.set.call(this._usp, name ? \"?\" + name : \"\");\n }\n function del(name) {\n URLSearchParamsProto.delete.call(this, name);\n name = this.toString();\n search.set.call(this._usp, name ? \"?\" + name : \"\");\n }\n function set(name, value) {\n URLSearchParamsProto.set.call(this, name, value);\n name = this.toString();\n search.set.call(this._usp, name ? \"?\" + name : \"\");\n }\n return function (sp, value) {\n sp.append = append;\n sp.delete = del;\n sp.set = set;\n return dP(sp, \"_usp\", {\n configurable: true,\n writable: true,\n value: value\n });\n };\n },\n createSearchParamsCreate = function (polluteSearchParams) {\n return function (obj, sp) {\n dP(obj, \"_searchParams\", {\n configurable: true,\n writable: true,\n value: polluteSearchParams(sp, obj)\n });\n return sp;\n };\n },\n updateSearchParams = function (sp) {\n var append = sp.append;\n sp.append = URLSearchParamsProto.append;\n URLSearchParams.call(sp, sp._usp.search.slice(1));\n sp.append = append;\n },\n verifySearchParams = function (obj, Class) {\n if (!(obj instanceof Class))\n throw new TypeError(\n \"'searchParams' accessed on an object that \" +\n \"does not implement interface \" +\n Class.name\n );\n },\n upgradeClass = function (Class) {\n var ClassProto = Class.prototype,\n searchParams = gOPD(ClassProto, \"searchParams\"),\n href = gOPD(ClassProto, \"href\"),\n search = gOPD(ClassProto, \"search\"),\n createSearchParams;\n if (!searchParams && search && search.set) {\n createSearchParams = createSearchParamsCreate(\n createSearchParamsPollute(search)\n );\n Object.defineProperties(ClassProto, {\n href: {\n get: function () {\n return href.get.call(this);\n },\n set: function (value) {\n var sp = this._searchParams;\n href.set.call(this, value);\n if (sp) updateSearchParams(sp);\n }\n },\n search: {\n get: function () {\n return search.get.call(this);\n },\n set: function (value) {\n var sp = this._searchParams;\n search.set.call(this, value);\n if (sp) updateSearchParams(sp);\n }\n },\n searchParams: {\n get: function () {\n verifySearchParams(this, Class);\n return (\n this._searchParams ||\n createSearchParams(\n this,\n new URLSearchParams(this.search.slice(1))\n )\n );\n },\n set: function (sp) {\n verifySearchParams(this, Class);\n createSearchParams(this, sp);\n }\n }\n });\n }\n };\n try {\n upgradeClass(HTMLAnchorElement);\n if (/^function|object$/.test(typeof URL) && URL.prototype)\n upgradeClass(URL);\n } catch (meh) {}\n })(Object);\n})(self.URLSearchParams.prototype, Object);\nexport default self.URLSearchParams;\n", "/* global URLSearchParams FormData */\n\nimport { mapConcat, either, when } from \"./functional.js\";\n\nconst ATTR_SNAME = \"data-server-name\";\nconst ATTR_SVALUE = \"data-server-value\";\nconst CONTAINER_SELECTOR = \"#bb-q .group.selected\";\n\nconst INPUT_SELECTOR = mapConcat(\n [\"input\", \"textarea\", \"select\"],\n function (c) {\n return c + \"[name]:not([disabled])\";\n },\n \", \"\n);\n\nconst inputsOf = container => container.querySelectorAll(INPUT_SELECTOR);\n\nconst isEmptyRadioValue = val => val === null;\nconst isEmptyCheckboxValue = val => val === false;\nconst isCheckedCheckboxValue = val => val === true;\n\nfunction collectWithin({\n params = null, // Object with an .append method, taking two params\n flavor = URLSearchParams, // Constructor for an object with an .append method, taking two params, used when params is not provided\n container = document.querySelector(CONTAINER_SELECTOR),\n omitFn = isEmptyCheckboxValue,\n changeFn = when(isCheckedCheckboxValue, () => \"on\"),\n collector = inputsOf\n} = {}) {\n return _collectAll(\n collector(container),\n params || new flavor(),\n omitFn,\n changeFn\n );\n}\n\nfunction _collectAll(nodeList, params, omitFn, changeFn) {\n for (const node of nodeList) {\n const val = valueOf(node),\n name = node.getAttribute(ATTR_SNAME) || node.getAttribute(\"name\");\n if (!either(isEmptyRadioValue, omitFn, val)) {\n params.append(name, changeFn(val));\n }\n }\n return params;\n}\n\nfunction valueOf(node) {\n if (node.hasAttribute(ATTR_SVALUE)) return node.getAttribute(ATTR_SVALUE);\n switch (node.type) {\n case \"radio\":\n return node.checked ? node.value : null; // Do not collect unchecked radios -- stripped in collectAll.\n case \"checkbox\":\n /* Collect unchecked checkboxes as false -- goes against usual form submission,\n but we need this for Studio API (using JSON). Stripped out by collectAll() unless provided with a omitFn. */\n if (!node.checked) return false;\n return node.hasAttribute(\"value\") // NOT the property -- this would still be \"on\".\n ? node.value // A checkbox should send either its value or\n : true; // Return Boolean true instead of \"on\", to be changed by collectAll() with changeFn,\n // or leave it at true (for JSON communication for instance) */\n default:\n return String(node.value).replace(/\\r?\\n/g, \"\\r\\n\");\n }\n}\n\nconst serializeQuestions = () =>\n collectWithin({}).toString().replace(/\\r?\\n/g, \"%0D%0A\");\n\nexport { valueOf, serializeQuestions, collectWithin };\n", "/* global $ FormData URLSearchParams */\nlet _vars = {};\n\nconst SESSION_KEYS = [\"dbname\", \"sessionid\", \"uniqueid\"];\nconst NAV_KEYS = [\"screenid\", ...SESSION_KEYS];\n\nObject.freeze(SESSION_KEYS);\nObject.freeze(NAV_KEYS);\n\nfunction setValueInVars(data, key) {\n if (typeof data[key] != \"undefined\") _vars[key] = data[key];\n}\n\nexport function setVars(data) {\n setValueInVars(data, \"version\");\n setValueInVars(data, \"uniqueid\");\n setValueInVars(data, \"replyserveraddress\");\n setValueInVars(data, \"replyserverport\");\n setValueInVars(data, \"proxyredirect\");\n setValueInVars(data, \"sessionid\");\n setValueInVars(data, \"modelname\");\n setValueInVars(data, \"dbname\");\n setValueInVars(data, \"modelid\");\n setValueInVars(data, \"showdeleteinmenu\");\n setValueInVars(data, \"showdatecreated\");\n setValueInVars(data, \"showreport\");\n setValueInVars(data, \"userinfo\");\n setValueInVars(data, \"showcopycase\");\n setValueInVars(data, \"screenid\");\n var version = getVar(\"version\");\n if (typeof version === \"string\") _vars[\"version\"] = version.split(\".\");\n}\n\nexport function getVar(string, obj) {\n return $.extend({}, _vars, obj)[string];\n}\n\n/**\n * Unset either all vars, or only those present in param vars\n *\n * @param {Array} vars An array of variable keys to delete\n *\n **/\nfunction unsetVars(arr) {\n if (!arr) return (_vars = {});\n arr.forEach(function (key) {\n delete _vars[key];\n });\n return _vars;\n}\n\nfunction collect(keys, collector = new FormData(), obj) {\n function append(key) {\n const val = getVar(key, obj);\n if (val !== undefined) collector.append(key, getVar(key, obj));\n }\n if (Array.isArray(keys)) {\n keys.forEach(append);\n } else {\n append(keys);\n }\n return collector;\n}\n\nfunction querify(keys, obj) {\n const usp = collect(keys, new URLSearchParams(), obj);\n return usp.toString();\n}\n\nexport default {\n querify,\n setVars,\n getVar,\n unsetVars,\n collect,\n NAV_KEYS,\n SESSION_KEYS\n};\n", "/* global URLSearchParams */\nimport \"./polyfills/url-search-params.js\";\nimport { Mode } from \"./mode.js\";\nimport { serializeQuestions } from \"./collect-values.js\";\nimport Vars from \"./vars.js\";\n\nexport const shouldExit = () =>\n Mode.get(\"hasModel\") && Boolean(Vars.getVar(\"sessionid\"));\n\nexport const onEnd = () => {\n if (!shouldExit()) return;\n if (!navigator.sendBeacon) return;\n const data = [\n \"step=exitdelayed\",\n Vars.querify(Vars.NAV_KEYS),\n \"fmt=json\",\n serializeQuestions()\n ]\n .filter(Boolean)\n .join(\"&\");\n\n const usp = new URLSearchParams(data);\n\n navigator.sendBeacon(\"/action\", usp);\n};\n\nfunction addEndListener() {\n // Update state before navigating away, but do not logout\n if (\"onpagehide\" in window) {\n window.addEventListener(\"pagehide\", onEnd);\n } else {\n window.addEventListener(\"unload\", onEnd, false);\n }\n}\n\nexport function removeEndListener() {\n // Update state before navigating away, but do not logout\n if (\"onpagehide\" in window) {\n window.removeEventListener(\"pagehide\", onEnd);\n } else {\n window.removeEventListener(\"unload\", onEnd, false);\n }\n}\n\naddEndListener();\n", "/* global $ */\nimport \"./a11y-user-detect.js\";\nimport { _ } from \"./gettext.js\";\n\n/*** A11y BEGIN ***/\nexport const A11y = {\n log: function (message) {\n var logdiv = document.getElementById(\"a-logdiv\");\n if (logdiv) logdiv.innerHTML = \"

\" + message + \"
\";\n }\n};\n\n/**\n * Datepicker a11y enhancements\n */\nexport const observeDatepickers = (function () {\n var init = false;\n return function initDateObservance() {\n var picker, observer;\n\n if (init || !(\"MutationObserver\" in window)) {\n init = true;\n return;\n }\n\n $(document).on(\"blur\", '[data-type=\"datetimepicker\"]', function () {\n A11y.log(\"\");\n });\n\n function observation(records, instance) {\n try {\n var infocus =\n document.activeElement.className.split(\" \").indexOf(\"hasDatepicker\") >\n -1;\n } catch (e) {\n // there mayn't be an activeElement, in which case className is undefined.\n }\n if (infocus) {\n var message = [\n $(\".ui-state-hover\").text(),\n $(\".ui-datepicker-month [selected]\").text(),\n $(\".ui-datepicker-year [selected]\").text()\n ].join(\" \");\n A11y.log(message + \", \" + _(\"press enter to accept\"));\n }\n }\n\n picker = document.getElementById(\"ui-datepicker-div\");\n\n if (picker) {\n observer = new window.MutationObserver(observation);\n observer.observe(picker, { attributes: true });\n init = true;\n }\n };\n})();\n", "let escapeHTML = (function () {\n var entityMap = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\"\n };\n var re = new RegExp(\"[&<>\\\"'/]\", \"g\");\n return function escapeHTML(string) {\n return String(string).replace(re, function (s) {\n return entityMap[s];\n });\n };\n})();\n\nconst escaped = (strings, ...values) =>\n strings.reduce(\n (acc, cur, idx) =>\n acc + cur + (values.length > idx ? escapeHTML(values[idx]) : \"\"),\n \"\"\n );\n\nexport { escapeHTML, escaped };\n", "import { Mode } from \"./mode.js\";\n\n/*** NOTIFICATIONS BEGIN ***/\nlet message;\n// Notification can either be a String or an object with a message\n// property. When supplying an object, the message property will be\n// shown to the user, but the entire object will be given to\n// console.error.\nfunction notify(options = { keepalive: false, html: false }, notification) {\n if (!notification) return;\n var text = notification.message || notification,\n timeout = 5000;\n if (\n typeof console !== \"undefined\" &&\n console &&\n typeof console.error === \"function\"\n )\n console.error(notification);\n message = { notification, options };\n Mode.set(\"hasMessage\");\n if (options.html) {\n document\n .querySelectorAll(\".bb-notification\")\n .forEach(area => (area.innerHTML = text));\n } else {\n document\n .querySelectorAll(\".bb-notification\")\n .forEach(area => (area.textContent = text));\n }\n if (!options.keepalive)\n window.setTimeout(Mode.unset.bind(Mode, \"hasMessage\"), timeout);\n}\n\nexport { notify, message };\n/*** NOTIFICATIONS END ***/\n", "/*** CONFIG BEGIN ***/\n\nimport conf from \"$conf.json\";\nimport { has } from \"./functional.js\";\n\nconf.a11y = Object.assign(\n {\n captions: false,\n optionfieldsets: false,\n strictlegends: false\n },\n conf.a11y\n);\n\nfunction propFinder(ob, prefix) {\n if (prefix) ob = find(prefix);\n\n function find(prop, fallback) {\n if (ob === undefined) return fallback;\n if (prop === undefined) return fallback;\n var leafs = prop.split(\".\").filter(Boolean),\n leaf = ob;\n while (has(leafs[0], leaf)) {\n leaf = leaf[leafs.shift()];\n }\n if (leafs.length === 0) return leaf;\n return fallback;\n }\n\n return find;\n}\n\nexport { conf, propFinder };\n\n/*** CONFIG END ***/\n", "import { conf } from \"./conf\";\nexport const fromApiServer = s =>\n s.startsWith(\"http://\") || s.startsWith(\"https://\")\n ? s\n : [conf.apiserver, s].filter(Boolean).join(\"/\");\n", "/* global jQuery */\nlet $ = jQuery;\n\nimport { escapeHTML } from \"./escape.js\";\nimport { notify } from \"./notify.js\";\nimport { _ } from \"./gettext.js\";\nimport { fromApiServer } from \"./location.js\";\n\n/**\n * Keep track of ajax requests + some convenience\n *\n * Exports busy and replace to bb.ajax object for plugins to use.\n */\nvar Ajax = {\n busy: false,\n last: null,\n direction: null,\n\n defaultOptions: {\n dataType: \"json\",\n type: \"POST\",\n url: \"action\",\n cache: false,\n async: true,\n success: checkJSON,\n error: onJSONError\n },\n\n post: function (options) {\n const _options = Object.assign({}, Ajax.defaultOptions, options, {\n url: fromApiServer(options.url || Ajax.defaultOptions.url)\n });\n $(document).trigger(\"bb:prePost\", _options);\n return $.ajax(_options);\n },\n\n replace: function (obj) {\n Ajax.last && Ajax.last.abort();\n Ajax.last = Ajax.post(obj);\n return Ajax.last;\n },\n\n release: function () {\n Ajax.busy = false;\n $(\".group.selected\").prop(\"disabled\", false);\n }\n};\n\n/**\n * Convenience method, like getJSON, but with POST\n *\n * @param {String} url URL where we POST to\n * @param {Object|String} data POST data\n *\n * Use Ajax.post instead if you want to overrule any default\n * settings from Ajax.defaultOptions.\n */\n$.postJSON = function (url, data) {\n return Ajax.post({ url: url, data: data });\n};\n\n/**\n * The default JSON error handler.\n *\n * Set appropriate flags, let user now what went wrong (as good as\n * possible).\n *\n * Trigger custom 'bb:jsonError' event on document.\n *\n * @param {Object} data XMLHTTPRequest object\n * @param {String} err Error message\n */\nfunction onJSONError(data, err) {\n Ajax.release();\n $(document).trigger(\"bb:jsonError\", data, err);\n if (data.responseText === undefined) {\n if (data.statusText === \"abort\");\n else {\n notify(\n { html: false, keepalive: true },\n _(\"Error: No response from server, server probably down\")\n );\n }\n } else if ($.trim(data.responseText) === \"\") {\n notify(\n { html: false, keepalive: true },\n _(\"Error: No response from server, server probably down\")\n );\n } else {\n notify(\n { html: true, keepalive: true },\n \"Error: \" +\n escapeHTML(err) +\n \"
Response was:
\" +\n \"
\" +\n        escapeHTML(data.responseText) +\n        \"
\"\n );\n }\n}\n\n/**\n * Indicate further processing ought to be skipped when this symbol is\n * set on JSON data.\n * @example\n import { stopDispatches } from \"$json/lib/ajax\";\n $(document).on(\"bb:preHandleData\", (event, data) => {\n event.stopImmediatePropagation(); // prevent further bb:preHandleData handlers.\n data[stopDispatches] = true;\n })\n * @constant\n * @type {Symbol}\n */\nexport const stopDispatches = Symbol(\"Skip all further dispatches\");\n\n/**\n Set this symbol to a promise on ajax data, and it shall be awaited\n before the next *handleData is run.\n*/\nconst awaiting = Symbol(\"awaiting promise\");\n\n/**\n * The default AJAX success handler. Perform actions on data.\n\n *\n * If data is not a JSON object, do nothing.\n *\n * @todo Either check data against JSON API, in some way or the\n * other, or make sure this function doesn't get called in the\n * first place when we're dealing with a non-core request; as\n * checkJSON is currently bound to ALL $.ajax requests,\n * this function may also fire for non-core requests.\n *\n * @param {Object} data 'JSON object according to BB JSON API'\n * @param {String} status Status of XHR\n * @param {Object} req The XHR object retrieving the resource\n *\n * @return undefined\n */\nasync function checkJSON(data, status, req) {\n if (typeof req.responseJSON !== \"undefined\") {\n // Since subsequent events may mess with the responseJSON\n // object, give (debuggers) the option to see the raw stuff.\n // Could be solved with a service worker instead.\n $(document).trigger(\"bb:responseText\", req.responseText);\n // use bb:preHandleData to change the JSON object for later invocations\n $(document).trigger(\"bb:preHandleData\", data);\n if (data[stopDispatches]) return;\n await data[awaiting];\n // handleData has the main stuff - the core rendering\n $(document).trigger(\"bb:handleData\", data);\n if (data[stopDispatches]) return;\n await data[awaiting];\n\n // use bb:postHandleData to change the DOM after initial rendering\n $(document).trigger(\"bb:postHandleData\", data);\n if (data[stopDispatches]) return;\n await data[awaiting];\n\n // finalHandleData may not change the DOM, but set focus for instance.\n $(document).trigger(\"bb:finalHandleData\", data);\n if (data[stopDispatches]) return;\n }\n}\n\nexport { Ajax, checkJSON, awaiting };\n", "import { Mode } from \"./mode.js\";\n\nexport const setSettled = () => Mode.set(\"isSettled\");\n", "/* global $, URLSearchParams */\nimport { setSettled } from \"./settled.js\";\nimport { removeEndListener } from \"./case-exit.js\";\n\nfunction BBI(options) {\n options = options || {};\n if (options.redirect_uri) {\n /** Example response:\n *\n * {\n * \"bbis\" : \"test\",\n * \"authid\" : \"Stubby\",\n * \"redirect_uri\" : \"https:\\/\\/HOST:8078\\/login?returnurl=http%3A%2F%2Fhost%3A80%2Fbbisreturns%3Fbbis%3Dtest&state=1507301556%3AGUID&authid=Stubby\",\n * \"url\": \"http:\\/\\/HOST:80\\/bbisreturns?bbis=test\",\n * \"state\": \"1507301556:6F2146D3-E0E6-4EB2-9DE4-2F31670B80D6\"\n * }\n *\n */\n var path = window.location.pathname.split(\"/\"),\n template = path.pop() || \"inlog.html\",\n returnurl =\n window.location.origin +\n path.concat(template).join(\"/\") +\n \"?\" +\n $.param({ bbis: options.bbis }),\n server = options.redirect_uri.split(\"?\")[0]; // The identity server sans params\n this.params = Object.assign({}, options.extraparams, {\n returnurl,\n authid: options.authid,\n // Add specific HTML page to state:\n state: options.state\n });\n this.url = server + \"?\" + $.param(this.params);\n this.stage = 1;\n } else {\n this.params = $.extend($.parseQuery(), { fmt: \"json\" });\n this.stage = 2;\n }\n return this;\n}\n\nBBI.prototype.authenticate = function () {\n if (!this.stage) throw \"BBI was not properly initialized\";\n if (this.stage === 1) {\n removeEndListener();\n window.location.href = this.url;\n } else if (this.stage === 2) {\n $.postJSON(\"bbisreturns\", this.params).then(setSettled);\n }\n};\n\nexport { BBI };\n", "import { escapeHTML } from \"./escape.js\";\nimport {\n allPass,\n anyPass,\n both,\n complement,\n compose,\n either,\n F,\n has,\n ifElse,\n pipe,\n prop,\n propEq,\n type\n} from \"./functional.js\";\nexport const isOptional = allPass([\n complement(prop(\"notnull\")),\n either(\n complement(prop(\"stringmask\")),\n pipe(prop(\"stringmask\"), RegExp, re => re.test(\"\"))\n )\n]);\n\nexport const isVisible = prop(\"visible\");\n\nexport const isLabel = either(\n propEq(\"name\", \"label\"),\n propEq(\"controltype\", \"label\")\n);\n\nexport const isOption = either(\n propEq(\"controltype\", \"radio\"),\n propEq(\"controltype\", \"checkbox\")\n);\n\nexport const isLink = propEq(\"name\", \"linklabel\");\n\nexport const isTextual = either(isLabel, isLink);\n\nexport const isPicture = propEq(\"controltype\", \"picture\");\n\nexport const isQuestion = complement(either(isTextual, isPicture));\n\nexport const isReadOnly = both(\n isQuestion,\n either(\n ifElse(has(\"originalreadonly\"), prop(\"originalreadonly\"), prop(\"readonly\")),\n propEq(\"visible\", false)\n )\n);\n\nexport const isValidatable = ifElse(\n either(isReadOnly, propEq(\"visible\", false)),\n F,\n anyPass([\n has(\"minimum\"),\n has(\"maximum\"),\n both(has(\"maxlength\"), complement(propEq(\"maxlength\", 0))),\n prop(\"notnull\"),\n compose(s => s === \"string\", type, prop(\"stringmask\"))\n ])\n);\n\nexport const renderAttribs = attr =>\n Object.entries(attr).reduce(\n (acc, [key, value]) => acc + ` ${key}=\"${escapeHTML(value)}\"`,\n \"\"\n );\n\nexport const setAttribs = (elt, attr) =>\n Object.entries(attr).forEach(([key, value]) => elt.setAttribute(key, value));\n\nexport const bbmClass = stylename =>\n `bbm-${stylename.toLowerCase().replace(/[^a-z0-9]/g, \"-\")}`;\n", "/******* positionalFormat() BEGIN ******/\n\n/* https://github.com/pft/javascript/blob/master/positionalformat.js\n *\n * Copyright (C) 2006-2013 Niels Giesen.\n *\n * Contact: \n *\n * Author: Niels Giesen\n * Keywords: JavaScript, formatting, String\n *\n * This file is dual-licensed under either the BSD license or the\n * GNU Affero General Public License.\n *\n * positionalFormat enables you to replace numbers enclosed in curly braces (C# format\n * apparently) with positional arguments (that can be reused), like\n * this:\n *\n * positionalFormat('argument { 1 } (or is it { 2 }, or { 0 }?) comes { 1 }',3,'first',1)\n *\n * evals to:\n *\n * \"argument first (or is it 1, or 3?) comes first\"\n */\n\nexport function positionalFormat(str) {\n var args = arguments;\n return str.replace(/{\\s*(\\d+)\\s*}/g, function (match, num) {\n return args[parseInt(num) + 1] !== undefined\n ? args[parseInt(num) + 1]\n : match;\n });\n}\n\n/******* positionalFormat() END ******/\n\nexport function format(str, ob = {}) {\n return str.replace(/{\\s*([^{]+?)\\s*}/g, function (match, sub) {\n return ob[sub] !== undefined ? ob[sub] : sub;\n });\n}\n\n// export function formatPlus(str, ob = {}) {\n// return str.replace(/{\\s*([^{]+?)\\s*}/g, function (match, subwithstuff) {\n// const subs = subwithstuff.split(/\\|/);\n// console.log(subs);\n// return subs.reduce((acc, cur) => {\n// if (ob[cur] === undefined) return acc;\n// return ob[cur];\n// }, subs[0]);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // const [sub, directives] = subwithstuff.split(/\\|/);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// return ob[sub];\n// });\n// }\n\nexport const formatPlus = format;\n\n// (str, ob = {}) {\n// return str.replace(/{\\s*([^{]+?)\\s*}/g, function (match, subwithstuff) {\n// const subs = subwithstuff.split(/\\|/);\n// console.log(subs);\n// return subs.reduceRight((acc, cur) => {\n// if (ob[cur] === undefined) return acc;\n// return ob[cur];\n// }, subs[0]);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // const [sub, directives] = subwithstuff.split(/\\|/);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// return ob[sub];\n// });\n// }\n", "import {\n assoc,\n hasPath,\n chain,\n compose,\n either,\n path,\n prop,\n toLower,\n toUpper,\n ifElse,\n juxt,\n when\n} from \"./functional.js\";\nimport { format } from \"./text-utils.js\";\nimport { _ } from \"./gettext.js\";\n\nconst fieldDesignators = {\n datetimepicker: \"field--date\",\n numedit: \"field--value\",\n radio: \"field--list\",\n checkmultilist: \"field--list\",\n customlist: \"field--list\",\n combobox: \"field--list\",\n listbox: \"field--list\",\n multilist: \"field--list\",\n any: \"field--field\"\n};\n\nconst fieldKey = compose(\n controltype => fieldDesignators[controltype] || fieldDesignators[\"any\"],\n prop(\"controltype\")\n);\n\nconst generic = compose(key => _(key), fieldKey);\n\nconst genericQuoted = compose(\n key => _(key), // Runtime!\n key => key.replace(\"field--\", \"quoted--\"),\n fieldKey\n);\nexport const quotable = compose(\n when(\n prop(\"quotable\"),\n chain(\n assoc(\"quotable--init\"),\n compose(s => s.slice(0, 1).toUpperCase() + s.slice(1), prop(\"quotable\"))\n )\n ),\n when(\n prop(\"quotable\"),\n chain(assoc(\"quotable--upper\"), compose(toUpper, prop(\"quotable\")))\n ),\n when(\n prop(\"quotable\"),\n chain(assoc(\"quotable--lower\"), compose(toLower, prop(\"quotable\")))\n ),\n chain(assoc(\"quotable\"), either(path([\"metadata\", \"quotable\"]), generic)),\n ifElse(\n hasPath([\"metadata\", \"quotable\"]),\n compose(assoc(\"<<\", _(\"<<\", \"\u00AB\")), assoc(\">>\", _(\">>\", \"\u00BB\"))),\n compose(assoc(\"<<\", \"\"), assoc(\">>\", \"\"))\n ),\n chain(\n assoc(\"quoted--init\"),\n compose(s => s.slice(0, 1).toUpperCase() + s.slice(1), prop(\"quoted\"))\n ),\n ifElse(\n hasPath([\"metadata\", \"quotable\"]),\n chain(\n assoc(\"quoted\"),\n compose(\n arr => format(...arr),\n juxt([\n genericQuoted,\n compose(quotable => ({ quotable }), path([\"metadata\", \"quotable\"]))\n ])\n )\n ),\n chain(assoc(\"quoted\"), generic)\n )\n);\n", "/* global $ */\nimport { quotable } from \"./quotable.js\";\nimport {\n apply,\n assoc,\n cond,\n compose,\n dec,\n equals,\n identity,\n lensPath,\n mergeLeft,\n match,\n over,\n path,\n pipe,\n tail,\n test,\n T\n} from \"./functional.js\";\nimport { _ } from \"./gettext.js\";\nimport { format, formatPlus } from \"./text-utils.js\";\n\n/*** DATE UTILITIES BEGIN ***/\nDate.prototype.toHoursAndMinutes = function () {\n var hours = this.getHours();\n var minutes = this.getMinutes();\n if (hours < 10) hours = \"0\" + hours;\n if (minutes < 10) minutes = \"0\" + minutes;\n return hours + \":\" + minutes;\n};\nconst dateTimeRe = /^\\/Date\\((-?\\d+)\\)\\/$/,\n pureDateRe = /^(\\d{4})-(\\d{2})-(\\d{2})$/,\n ISO8601DateTimeInZuluRe =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{3})?)?Z$/;\n\n/*\n * Convert JSON date string to a Date object and return it.\n *\n * @{datestring}:\n *\n * An ISO-8601 datetime string in Zulu Time\n *\n * OR\n *\n * a JSON date string of the form\n *\n * \"/Date(102938293293)/\"\n *\n * where the numerical part is\n * seconds from epoch\n *\n * OR:\n *\n * a date formatted as \"yyyy-mm-dd\"\n *\n * OR:\n *\n * undefined -> undefined\n *\n */\nconst date = (...args) => new Date(...args);\n\nexport const parseDate = cond([\n [equals(0), () => undefined],\n [equals(undefined), identity],\n [equals(\"\"), identity],\n [\n test(pureDateRe),\n // Note if we were to pass pureDates to new Date as a valid\n // DateStamp, the engine will interpret it as 0:00 Zulu\n // time. Which, in this very case, is probably not what we\n // want. We want the date as in the minds of the case (min/max in\n // a calendar etc). It should be represented 'as is' to the user,\n // so 2022-02-09 may never become 2022-02-08 in users TZ, so\n // interpret it according in users TZ.\n pipe(match(pureDateRe), tail, over(lensPath([1]), dec), apply(date))\n ],\n [test(ISO8601DateTimeInZuluRe), date],\n [test(dateTimeRe), pipe(match(dateTimeRe), path([1]), parseInt, date)],\n [\n T,\n thing => {\n throw `Not a date in our book: ${thing}`;\n }\n ]\n]);\n\nexport const leadWithZeroes = string =>\n string.replace(/([^0-9]|^)([0-9]{3})([^0-9]|$)/, \"$10$2$3\");\n\n/**\n *\n * @param {Object} spec Object describing a control conforming to the BB json api.\n * @param {String} value The value to be checked\n * @returns {Boolean|Error} true when value is according to spec\n * @throws Localized error message\n */\nexport function checkDate(spec = { notnull: false }, value) {\n const UIFormat = $.datepicker._defaults.dateFormat;\n const formatDate = $.datepicker.formatDate.bind($.datepicker);\n var date, mindate, maxdate;\n if (!spec.notnull && value.trim() === \"\") {\n return true;\n }\n const metadata = spec.metadata || {};\n try {\n date = valueToDate(UIFormat, value); // $.datepicker.parseDate(UIFormat, value); // This line may throw an error.\n } catch (e) {\n //couldn't parse - throw a translatable error message\n throw formatPlus(\n metadata.errdateinvalid || _(\"Invalid date\"),\n compose(assoc(\"value\", value), quotable)(spec)\n );\n }\n if (date === null) {\n if (spec.notnull) {\n throw format(\n metadata.errrequired || _(\"Date required\"),\n compose(assoc(\"value\", value), quotable)(spec)\n );\n }\n return true;\n }\n (mindate = parseDate(spec.minimum)), (maxdate = parseDate(spec.maximum));\n if (!(mindate || maxdate)) return true; // Neither is set\n const fmindate = formatDate(UIFormat, mindate),\n fmaxdate = formatDate(UIFormat, maxdate);\n const quotableDate = compose(\n mergeLeft({\n value,\n minimum: fmindate,\n maximum: fmaxdate\n }),\n quotable\n )(spec);\n try {\n if (mindate && !maxdate && date < mindate)\n throw (\n metadata.errdatebeforemimimum ||\n _(\"A date before {minimum} is not allowed\")\n );\n else if (mindate && maxdate && (date < mindate || maxdate < date))\n throw (\n metadata.errdatenotinrange ||\n _(\"Date has to lie between {minimum} and {maximum}\")\n );\n else if (maxdate && !mindate && maxdate < date)\n throw (\n metadata.errdateaftermaximum ||\n _(\"A date after {maximum} is not allowed\")\n );\n } catch (e) {\n throw format(e, quotableDate);\n }\n return true;\n}\n\nexport const valueToDate = (format, value) => {\n let date;\n try {\n date = $.datepicker.parseDate(format, value);\n } catch (e) {\n const yyyycleanformat = format.replace(/[^mdy]/g, \"\").replace(\"yy\", \"yyyy\"),\n clean = value.replace(/[^0-9]/g, \"\");\n date = new Date();\n const yearindex = yyyycleanformat.indexOf(\"yyyy\");\n // If year was less than 4 digits, and not at end, adjust indices of other fields.\n const adjustment = yearindex === 0 ? clean.length - 8 : 0;\n let year = Number(clean.substr(yearindex, 4 + adjustment));\n if (year <= 99) {\n const cutoffyear = Number.isInteger(\n $.datepicker._defaults.shortYearCutoff\n )\n ? $.datepicker._defaults.shortYearCutoff\n : (date.getYear() % 100) +\n Number($.datepicker._defaults.shortYearCutoff);\n // Note: this will become odd if current year approaches end of\n // century. Let's say we live in 2099. User enters 98 -> fine.\n // Is below 109. User enters 02 => not fine. Still below 109.\n // But jQuery UI should also fix this. And it's still a long time.\n const century = (date.getFullYear() / 100) >> 0;\n if (year <= cutoffyear) {\n year += century * 100;\n } else {\n year += (century - 1) * 100;\n }\n }\n const month = Math.max(\n 0,\n Number(clean.substr(yyyycleanformat.indexOf(\"mm\") + adjustment, 2)) - 1\n );\n const dom = Number(\n clean.substr(yyyycleanformat.indexOf(\"dd\") + adjustment, 2)\n );\n date.setFullYear(year);\n date.setMonth(month);\n date.setDate(dom);\n if (\n date.getFullYear() !== year ||\n date.getMonth() !== month ||\n date.getDate() !== dom\n ) {\n throw \"invalid date\";\n }\n }\n return date;\n};\n\nexport const onChangeDate = ev => {\n let date;\n try {\n date = valueToDate($.datepicker._defaults.dateFormat, ev.target.value);\n } catch (e) {\n // ignore\n } finally {\n if (date) {\n ev.target.value = leadWithZeroes(\n $.datepicker.formatDate($.datepicker._defaults.dateFormat, date)\n );\n }\n }\n};\n\nexport const humanDate = (function () {\n var now = new Date();\n var hour0 = now.setHours(0, 0, 0, 0);\n var dayinms = 1000 * 60 * 60 * 24;\n var hour24 = hour0 + dayinms;\n var thisyear = now.getYear();\n var daysofweek = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"].map(\n function (day) {\n return _(day);\n }\n );\n var monthsofyear = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"June\",\n \"July\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\"\n ].map(function (month) {\n return _(month);\n });\n function isToday(ms) {\n return ms > hour0 && ms < hour24;\n }\n function isYesterday(ms) {\n return hour0 > ms && ms > hour0 - dayinms;\n }\n function isLastWeek(ms) {\n return ms > hour0 - dayinms * 6;\n }\n function isThisYear(date) {\n return thisyear == date.getYear();\n }\n function humanDate(date) {\n if (!(date instanceof Date)) throw \"Expects a Date object\";\n var ms = date.valueOf();\n var hm = \"\";\n hm = date.toHoursAndMinutes();\n if (isToday(ms)) {\n return hm;\n }\n if (isYesterday(ms)) {\n return _(\"Yesterday\") + \", \" + hm;\n }\n if (isLastWeek(ms)) {\n return daysofweek[date.getDay()] + \" \" + hm;\n }\n return (\n date.getDate() +\n \" \" +\n monthsofyear[date.getMonth()] +\n (isThisYear(date) ? \"\" : \" \" + date.getFullYear()) +\n \", \" +\n hm\n );\n }\n return humanDate;\n})();\n", "import { compose, either, isNil, not, path } from \"./functional.js\";\n\n/* editPolicy may be \"return\", \"stay\", or undefined, meaning off */\nexport const editPolicy = path([\"arbitrary\", \"core\", \"editPolicy\"]);\n\nexport const canEditEarlier = compose(not, isNil, editPolicy);\n\nconst isLabelValueDynamic = compose(\n value => value === true,\n path([\"arbitrary\", \"core\", \"isLabelValueDynamic\"])\n);\n\nconst preferUpdate = compose(\n value => value === true,\n path([\"arbitrary\", \"core\", \"preferUpdate\"])\n);\n\nexport const mustUpdate = either(preferUpdate, canEditEarlier);\n\nexport const updateLabels = either(mustUpdate, isLabelValueDynamic);\n", "const _Widgets = {};\n\nexport function registerWidget(options) {\n _Widgets[options.name] = options;\n}\nexport function getWidget(name) {\n return _Widgets[name];\n}\n", "/* global $ */\n\nimport { parseDate } from \"./dates\";\nimport { isReadOnly, isValidatable } from \"./control-helpers\";\nimport { updateLabels } from \"./feature-queries.js\";\nimport { conf } from \"./conf.js\";\nimport { getWidget } from \"./form-widgets.js\";\nimport { anyPass, has, prop } from \"./functional.js\";\nconst Dynprops = {};\n\n// Update the control element\nDynprops.update = function ($widget, control, Updates, requestor) {\n if (!$widget.get(0)) return;\n const oldval = $widget.val();\n\n const updates = Object.keys(Updates);\n const definition = getWidget(control.controltype);\n $widget.removeData([\"validated\"]);\n\n /** isForNotNull **/\n if (has(\"isForNotNull\", Updates)) {\n $widget.toggleClass(\"bb-for-required\", Boolean(control.isForNotNull));\n $widget.toggleClass(\"bb-for-optional\", !control.isForNotNull);\n }\n\n /** Placeholder **/\n if (has(\"placeholder\", Updates) > -1) {\n $widget.attr(\"placeholder\", control.placeholder);\n }\n\n /** Visible **/\n if (has(\"visible\", Updates)) {\n if (control.identifier === \"gformulier.gegevens.geschil_partner\")\n $widget.attr(\"aria-hidden\", !control.visible);\n $widget.attr(\"data-visible\", control.visible);\n\n if (control.visible) {\n window.setTimeout(function () {\n $widget.removeAttr(\"hidden\");\n }, 80);\n } else {\n window.setTimeout(function () {\n $widget.attr(\"hidden\", !control.visible);\n }, 80);\n }\n }\n\n /** Value **/\n if (has(\"value\", Updates)) {\n if (updateLabels(conf)) {\n /**\n @done: linklabel, listlabel, checkmultilist, memo, combobox, radio,\n checkbox, numedit, datetimepicker, edit, grid, multilist(?), listbox(?)\n @todo: freebox.\n\n NOTE: A widget currently can change itself *only* if\n they are registered with allowUpdatingSelf : true\n\n Widgets within a grid can update other widgets in a grid.\n */\n if (definition.setValue) {\n definition.setValue($widget.get(0), control.value, requestor, Updates);\n }\n }\n }\n\n /** Readonly **/\n if (\n anyPass([has(\"readonly\"), has(\"originalreadonly\"), has(\"visible\")], Updates)\n ) {\n const readonly = isReadOnly(control);\n if (typeof definition.onreadonly === \"function\") {\n definition.onreadonly($widget.get(0), readonly);\n } else {\n $widget.prop(\"disabled\", readonly);\n }\n }\n\n /** Minimum **/\n if (has(\"minimum\", Updates)) {\n $widget.attr(\"min\", control.minimum);\n if (control.controltype === \"datetimepicker\") {\n if (control.minimum) {\n $widget.datepicker(\"option\", \"minDate\", parseDate(control.minimum));\n }\n }\n }\n\n /** Maximum **/\n if (has(\"maximum\", Updates)) {\n $widget.attr(\"max\", control.maximum);\n if (control.controltype === \"datetimepicker\") {\n if (control.maximum) {\n $widget.datepicker(\"option\", \"maxDate\", parseDate(control.maximum));\n }\n }\n }\n\n /** Maxlength **/\n if (has(\"maxlength\", Updates)) {\n if (control.maxlength === 0) $widget.removeAttr(\"maxlength\");\n else $widget.attr(\"maxlength\", control.maxlength);\n }\n\n /** Let user know something changed perhaps against their intent. **/\n if (oldval !== $widget.val()) {\n $widget.addClass(\"bb-programmatically-changed\");\n $widget.trigger(\"change\", { programmatically: true });\n self.setTimeout(function () {\n $widget.removeClass(\"bb-programmatically-changed\");\n }, 1000);\n }\n\n /** Notnull **/\n if (has(\"notnull\", Updates)) {\n if (typeof definition.onrequired === \"function\") {\n definition.onrequired($widget.get(0), control.notnull);\n } else {\n $widget.attr(\"aria-required\", control.notnull);\n }\n if (control.notnull) {\n $widget.addClass(\"notnull\");\n } else {\n $widget.removeClass(\"notnull\");\n }\n }\n\n if (isValidatable(control)) {\n $widget.attr(\"aria-errormessage\", `${control.id}--error`);\n $widget.addClass(\"validatable\");\n } else {\n $widget.removeAttr(\"aria-errormessage\");\n $widget.removeClass(\"validatable\");\n }\n\n if (updates.length > 0) {\n const event = new CustomEvent(\"bb:updatedControl\", {\n detail: { control, Updates },\n bubbles: true\n });\n $widget.get(0).dispatchEvent(event);\n $(document).trigger(\"bb:updated\", [$widget, control, updates]);\n }\n};\n\n$.fn.extend({\n updateControl: function (controls, requestor) {\n return this.each(function () {\n const $this = $(this),\n control = $this.data(\"control\");\n if (\n this === requestor &&\n !prop(\"allowUpdatingSelf\", getWidget(control.controltype))\n ) {\n // This was the one requesting an update\n return this;\n }\n if (!control) throw (\"No updateControl defined for\", $this);\n const id = control.id,\n update = controls.find(function (c) {\n return c.id === id;\n }),\n // updates = [],\n Updates = {},\n props = [\n \"maxlength\",\n \"isForNotNull\",\n \"minimum\",\n \"maximum\",\n \"notnull\",\n \"readonly\",\n \"originalreadonly\",\n \"placeholder\",\n \"precision\",\n \"stringmask\",\n \"errortext\",\n \"visible\",\n \"value\",\n \"columns\",\n \"text\"\n ];\n // Caron-syntax used in label, therefore no (text) interface\n // returned -- should not mix and match dynprops with empty\n // labels! Do not allow this to error on the user though!\n\n // Does also handle (cause to ignore) labels within a grid!\n if (typeof update === \"undefined\") {\n return this;\n // update = $.extend({}, control, {visible: false});\n }\n for (var i in props) {\n if (control[props[i]] !== update[props[i]]) {\n Updates[props[i]] = { from: control[props[i]], to: update[props[i]] };\n control[props[i]] = update[props[i]];\n // updates.push(props[i]);\n }\n }\n Dynprops.update($this, control, Updates, requestor);\n return this;\n });\n }\n});\n\nexport { Dynprops };\n", "const Hooks = new Map();\n\nexport const registerHook = key => hook => {\n if (typeof hook !== \"function\") throw \"Can only add a function as a hook\";\n Hooks.set(key, hook);\n};\n\nexport const runHook =\n key =>\n (...args) => {\n if (Hooks.has(key)) Hooks.get(key)(...args);\n };\n", "/* global $ */\nimport { bbmClass, isReadOnly, renderAttribs } from \"./control-helpers\";\nimport { Dynprops } from \"./dynprops\";\nimport { escaped, escapeHTML } from \"./escape.js\";\nimport { conf, propFinder } from \"./conf\";\nimport { getWidget } from \"./form-widgets.js\";\nimport {\n assoc,\n both,\n compose,\n complement,\n has,\n hasPath,\n isNil,\n not,\n prop\n} from \"./functional.js\";\nimport { runHook } from \"./hooks.js\";\nimport { Mode } from \"./mode.js\";\n\nconst arbitraryCoreProp = propFinder(conf, \"arbitrary.core\");\n\n/**\n * Create a control widget, then insert it into the DOM\n *\n * @param {Object} control A control object as defined in the JSON API. The one to render + add.\n * @param {Object} group The group object to which this control belongs.\n * @param {Element} wGroup Element whereto this control should be added. *NOTE* that this need not be a .bb-group\n *\n * @return undefined\n *\n * @todo Simplify parameter list.\n */\nfunction wControl(control, group, wGroup) {\n control._group = group;\n let attribs = {};\n let widget;\n const enabled = group.current || complement(isReadOnly)(control);\n // Has been rendered\n if (control.$elt) {\n $(wGroup).append(control.$elt);\n return control.$elt;\n }\n if (compose(has(\"fixup\"), getWidget)(control.controltype))\n compose(fn => fn(control), prop(\"fixup\"), getWidget)(control.controltype);\n\n if (control.datatype) attribs[\"data-datatype\"] = control.datatype;\n\n if (control.meta)\n for (let d in control.meta) {\n if (both(has(d), compose(not, isNil, prop(d)))(control.meta))\n attribs[\"data-\" + d] = escape(control.meta[d]);\n }\n if (control.metadata) {\n attribs[\"data-metadata-keys\"] = Object.keys(control.metadata)\n .map(s => s.replace(/\\s/g, \"-\"))\n .join(\" \");\n }\n if (control.aria)\n for (let a in control.aria) {\n if (has(a, control.aria)) attribs[\"aria-\" + a] = control.aria[a];\n }\n\n if (control.name) {\n attribs[\"name\"] = control.name;\n }\n\n const wdef = getWidget(control.controltype);\n if (!wdef) {\n console.warn(`No widget definition for ${control.controltype}`);\n return null;\n }\n const tagName = wdef.tagName;\n attribs = wdef.attribs(attribs, control, enabled);\n\n attribs[\"data-type\"] = control.controltype;\n if (tagName) {\n widget = $(\"<\" + tagName + \" \" + renderAttribs(attribs) + \"/>\");\n } else {\n widget = $(wdef.render(control, group, attribs));\n if (!widget) return null;\n }\n\n if (control.className) {\n widget.addClass(control.className);\n }\n control.$elt = widget;\n control._elt = widget.get(0);\n\n if (wdef && wdef.tagName) {\n /**\n Okay, some (older) definitions have a tagName definition ->\n from which a quite empty skeleton widget is created.\n\n Afterwards, they fill that very widget with a render function\n of a different signature than usual:\n\n Instead of (control (plain object), group (plain object), attribs (array)), they get\n (control (plain object), widget (jQuery collection), group (plain object))).\n\n */\n wdef.render(control, widget, group);\n }\n\n // attach an id whenever meaningful:\n // if (control.id && /\\d+$/.test(control.id))\n if (control.id) {\n // id used not to be safe, but now we prepend the groupid, making it safe.\n widget.attr(\"id\", control.id);\n }\n if (control._originalid) {\n // Use data-id for stuff refering to the interface, no matter in which group it is, such as informationsources.\n widget.attr(\"data-id\", control._originalid);\n }\n\n if (hasPath([\"metadata\", \"autocomplete\"], control)) {\n widget\n .attr(\"data-server-name\", control.name)\n .attr(\"name\", control.metadata.autocomplete)\n .attr(\"autocomplete\", control.metadata.autocomplete);\n }\n\n $(wGroup).append(widget);\n\n /* Insert a space between elements so that elements are reasonably\n * well-placed when CSS is disabled.\n */\n $(wGroup).append(\" \");\n\n // Tooltips:\n if (control.hint) {\n if (enabled) Mode.set(\"hasHints\");\n runHook(\"hinter\")(widget, assoc(\"enabled\", enabled, control));\n }\n widget.data(\"control\", control);\n\n /**\n * Dynamic properties\n */\n var dynprops = [\n \"maxlength\",\n \"minimum\",\n \"maximum\",\n \"notnull\",\n \"isForNotNull\",\n \"readonly\",\n \"precision\",\n \"stringmask\",\n \"errortext\",\n \"placeholder\"\n ],\n dynpropsforus = {};\n\n for (var ii in dynprops) {\n if (has(dynprops[ii], control))\n dynpropsforus[dynprops[ii]] = { to: control[dynprops[ii]] }; // .push(dynprops[ii]);\n }\n\n if (has(\"visible\", control) && control.visible === false) {\n dynpropsforus[\"visible\"] = { to: false }; // .push(dynprops[ii]);\n }\n // dynpropsforus.push(\"visible\");\n\n widget.data(\"anchor\", widget);\n\n if (wdef && wdef.afterRender) {\n wdef.afterRender(widget, control);\n }\n\n if (shouldWrap(control)) {\n wrapInlineInput(widget);\n }\n\n /* Allow class-based styling */\n if (control[\"font-class\"]) {\n widget.addClass(bbmClass(control[\"font-class\"]));\n }\n\n /**\n * Two things:\n * - Put control tags in data-tags of Element.\n * - Make TAG known to CSS as bb-tagged-TAG.\n */\n if (control[\"tags\"] instanceof Array) {\n $(widget).data(\"tags\", control[\"tags\"]);\n $.each(control[\"tags\"], function (i, tag) {\n widget.addClass(\"bb-tagged-\" + tag);\n });\n }\n\n Dynprops.update(widget, control, dynpropsforus);\n\n return widget;\n}\n\nfunction shouldWrap(control) {\n return (\n control.prelabel ||\n control.postlabel ||\n (arbitraryCoreProp(\"wrapAllSingleLiners\") === true &&\n compose(prop(\"couldWrap\"), getWidget)(control.controltype)) ||\n (control.placeholder &&\n arbitraryCoreProp(\"accessiblePlaceholders\") === true &&\n compose(prop(\"couldWrap\"), getWidget)(control.controltype))\n );\n}\n\nfunction wrapInlineInput(widget) {\n var control = widget.data(\"control\"),\n prelabel = control.prelabel,\n postlabel = control.postlabel;\n var anchor = widget.data(\"anchor\");\n var wraptag = \"span\";\n if (anchor.get(0).nodeName === \"DIV\") wraptag = \"div\";\n anchor.wrapAll(\n \"<\" +\n wraptag +\n ' data-wraps-type=\"' +\n control.controltype +\n '\" class=\"bb-input-wrap\">\"\n );\n anchor = anchor.parent();\n widget.data(\"anchor\", anchor);\n anchor.data({\n control: control,\n type: control.controltype\n });\n if (prelabel)\n anchor.prepend(\n '' +\n escapeHTML(prelabel) +\n \"\"\n );\n if (control.placeholder && arbitraryCoreProp(\"accessiblePlaceholders\")) {\n widget\n .get(0)\n .setAttribute(\n \"aria-describedby\",\n (\n (widget.get(0).getAttribute(\"aria-describedby\") || \"\") +\n ` ${control.id}--placeholder`\n ).trim()\n );\n anchor.append(\n `${escapeHTML(control.placeholder)}`\n );\n }\n if (postlabel)\n anchor.append(\n '' +\n escapeHTML(postlabel) +\n \"\"\n );\n}\n\nconst getControl = elt => $.data(elt, \"control\");\n\nexport { getControl, wControl };\n", "export const listtypes = {\n radio: \"LIST\",\n checkmultilist: \"LIST\",\n customlist: \"LIST\",\n combobox: \"BOX\",\n listbox: \"BOX\",\n multilist: \"BOX\"\n};\n", "/* global $ */\nimport { getWidget } from \"./form-widgets.js\";\nimport {\n always,\n assoc,\n either,\n tap,\n cond,\n path,\n propEq,\n T\n} from \"./functional.js\";\nimport { _ } from \"./gettext.js\";\nimport { format, formatPlus } from \"./text-utils.js\";\nimport { listtypes } from \"./types.js\";\nimport { compose } from \"./functional.js\";\nimport { quotable } from \"./quotable.js\";\n\n// Validate actual input, return true if it's ok, throw an error otherwise.\nexport function validateInput(node) {\n const $node = $(node),\n control = $node.data(\"control\");\n let ok = true,\n re,\n errortext,\n val,\n category;\n\n if (control === undefined) {\n throw \"Not a BB widget\";\n }\n\n if (control.visible === false) {\n return true;\n }\n category = listtypes[control.controltype];\n\n val = $node.val();\n\n if (control.stringmask) {\n re = new RegExp(control.stringmask);\n if (!re.test(val))\n throw format(\n control.errortext,\n compose(assoc(\"value\", val), quotable)(control)\n );\n }\n if (control.notnull) {\n if (category === \"LIST\") {\n ok = $node.is(\":has(:checked)\");\n } else if (category === \"BOX\") {\n // There could be a faux, checked, option telling us to\n // fill in the field. That is the second check here.\n ok = val !== null && val !== \"\";\n } else if (control.controltype == \"checkbox\") {\n ok = $node.is(\":checked\");\n } else if (control.controltype === \"grid\") {\n if (control.addallowed === false) {\n const checkable = control.columns.find(\n either(\n propEq(\"controltype\", \"radiobutton\"),\n propEq(\"controltype\", \"checkbox\")\n )\n );\n if (checkable) {\n ok = $node.is(\":has(:checked)\");\n }\n } else {\n // A required grid should have at least one row.\n // But if no rows **can** be added it would be rude and confusing to complain to the end-user.\n ok = control.value.length > 0 || control.addallowed === false;\n }\n } else {\n re = /\\S/;\n ok = re.test(val);\n }\n if (!ok) {\n throw cond([\n [path([\"metadata\", \"errrequired\"]), path([\"metadata\", \"errrequired\"])],\n [\n propEq(\"controltype\", \"datetimepicker\"),\n compose(c => formatPlus(_(\"Date required\"), c), quotable)\n ],\n [\n always([\"BOX\", \"LIST\"].indexOf(category) > -1),\n compose(c => format(_(\"Choice required\"), c), quotable)\n ],\n [T, compose(c => format(_(\"Field required\"), c), quotable)]\n ])(control);\n }\n }\n if (control.maxlength && control.maxlength > 0) {\n ok = val.length <= control.maxlength;\n if (!ok) {\n throw format(\n path([\"metadata\", \"errtexttoolong\"])(control) ||\n _(\"Text length exceeds the maximum of {maxlength} characters\"),\n quotable(control)\n );\n }\n }\n if (getWidget(control.controltype).validate) {\n return getWidget(control.controltype).validate(control, val);\n }\n return true;\n}\n", "import {\n groupWith,\n map,\n filter,\n pipe,\n path,\n strictUniq,\n lensPath\n} from \"./functional.js\";\n\nconst pathToGroup = [\"metadata\", \"group\"];\nexport const pathGroup = path(pathToGroup);\nexport const lensGroup = lensPath([\"metadata\", \"group\"]);\n\nconst areOfOneQuestion = (a, b) => a.isfor === b.id || b.isfor === a.id;\n\nexport const groupInner = groupWith(areOfOneQuestion);\n\nconst InfinityIfMinus1 = num => (num + 1 || Infinity) - 1;\nconst indexOfOrInfinity = (sub, s) => InfinityIfMinus1(s.indexOf(sub));\nexport const baseGroup = s => s.substr(0, indexOfOrInfinity(\".\", s));\nexport const tailGroup = s => s.substr(indexOfOrInfinity(\".\", s) + 1);\n\nconst belongTogether = (a, b) =>\n areOfOneQuestion(a, b) ||\n (pathGroup(a) &&\n pathGroup(b) &&\n baseGroup(pathGroup(a)) === baseGroup(pathGroup(b)));\n\nexport const groupOuter = groupWith(belongTogether);\n\nexport const groupClasses = pipe(\n map(path[(\"metadata\", \"groupClasses\")]),\n filter(Boolean),\n strictUniq\n);\n\nexport const doGrouping = path([\"arbitrary\", \"core\", \"form-group\", \"on\"]);\n", "export const normalize = s => s.toLowerCase().replace(/[^a-z0-9]/g, \"-\");\n", "import { path, either, compose, prop } from \"./functional.js\";\nimport { conf } from \"./conf.js\";\n\n/**\n\nName keys follow this pattern:\n\n__\n\n is any of:\n\n- GROUPING: subgroup of questions and/or texts and/or links\n- ITEM: a question and/or text and/or link\n- QUESTION: a question (is also an item)\n- TEXT: a top level text (not a label for a question)\n- LINK: a top level link (so: not inside markdown)\n- PICTURE: a top level image (so : nto inside markdown)\n\nGROUPING ::= ITEM+\nITEM ::= QUESTION | TEXT | LINK | PICTURE\n\n is any of:\n\n- _CLASS_ : the css class to put on this type \n- _PREFIX_: a css class prefix\n- _DATA_: a data- attribute\n\nwhere can be anything.\n\nThe default values for those keys, thus the strings that willl be used\nin the generated DOM, are provided in nameDefaults. They can be\noverwritten in the `conf.json` file in the property\n`core.form-group.names` in order to retrofit older or other naming\nschemes.\n\n*/\n\nexport const /* A grouping groups items */\n GROUPING_CLASS = \"grouping-class\", // Class of grouping\n GROUPING_PREFIX_TYPE = \"grouping-prefix-type\", // prefix for -question, -text or -author\n GROUPING_DATA_NAME = \"grouping-data-name\", // data attribute conveying author provided group name\n GROUPING_DATA_LEVEL = \"grouping-data-level\", // grouping level, 1-based\n ITEM_PREFIX_AUTHORCLASS = \"item-prefix-authorclass\", // prefix for author class set with cssclasses on the metadata\n QUESTION_CLASS = \"question-class\", //: \"bb-questionlabelgroup\",\n QUESTION_PREFIX_TYPE = \"question-prefix-type\", //: \"bb-itype\",\n QUESTION_PREFIX_PROPERTY = \"question-prefix-property\", //: \"bb-itype\",\n QUESTION_DATA_LAYOUT = \"question-data-layout\", //: \"data-form-group-layout\",\n QUESTION_PREFIX_AUTHORSTYLE = \"question-prefix-authorstyle\", //: \"bb-g-\",\n QUESTION_CLASS_NOLABEL = \"question-class-nolabel\"; //: \"form-group__question--no-label\",\n\nconst nameDefaults = {\n [GROUPING_CLASS]: \"form-group\",\n [GROUPING_PREFIX_TYPE]: \"form-group-\",\n [GROUPING_DATA_NAME]: \"data-form-group-name\",\n [GROUPING_DATA_LEVEL]: \"data-form-group-level\",\n [ITEM_PREFIX_AUTHORCLASS]: \"form-group__item--author-class-\",\n [QUESTION_CLASS]: \"bb-questionlabelgroup\",\n [QUESTION_PREFIX_TYPE]: \"bb-itype\",\n [QUESTION_PREFIX_PROPERTY]: \"question-\", //: \"bb-itype\",\n [QUESTION_DATA_LAYOUT]: \"data-form-group-layout\",\n [QUESTION_PREFIX_AUTHORSTYLE]: \"bb-g-\",\n [QUESTION_CLASS_NOLABEL]: \"form-group__question--no-label\"\n};\n\n// const fg = {\n// [GROUPING_CLASS]: \"no-form-group-outer\",\n// [GROUPING_PREFIX_TYPE]: \"form-group-\",\n// [QUESTION_CLASS]: \"bb-questionlabelgroup p-form-group\",\n// [QUESTION_PREFIX_TYPE]: \"bb-itype-\",\n// [QUESTION_DATA_LAYOUT]: \"data-p-form-group-layout-type\",\n// [QUESTION_CLASS_NOLABEL]: \"p-form-group-orphaned\"\n// };\n\n// const bem_example = {\n// [GROUPING_CLASS]: \"form-group\",\n// [GROUPING_PREFIX_TYPE]: \"form-group-\",\n// [ITEM_PREFIX_AUTHORCLASS]: \"form-group__item--author-class-\",\n// [QUESTION_CLASS]: \"bb-questionlabelgroup\",\n// [QUESTION_PREFIX_TYPE]: \"form-group__question-\",\n// [QUESTION_DATA_LAYOUT]: \"data-form-group-layout\",\n// [QUESTION_PREFIX_AUTHORSTYLE]: \"form-group__question--author-style-\"\n// };\n\nconst pathToNames = path([\"arbitrary\", \"core\", \"form-group\", \"names\"]);\n\nexport const names = propArg =>\n either(compose(prop(propArg), pathToNames), _ => prop(propArg, nameDefaults))(\n conf\n );\n", "/* global $ */\nimport {\n all,\n both,\n curry,\n filter,\n has,\n compose,\n ifElse,\n head,\n path,\n prop,\n propEq,\n any,\n find,\n pathOr,\n split,\n join,\n map,\n when,\n tap,\n cond,\n not\n} from \"./functional.js\";\nimport {\n isTextual,\n isPicture,\n isQuestion,\n isVisible\n} from \"./control-helpers.js\";\nimport { groupOuter, baseGroup, tailGroup, pathGroup } from \"./groupings\";\nimport { normalize } from \"./font-classes\";\nimport { getWidget } from \"./form-widgets.js\";\nimport { conf } from \"./conf\";\nimport * as n from \"./names.js\";\nimport { names } from \"./names.js\";\n\nconst doTopLevel = pathOr(true, [\n \"arbitrary\",\n \"core\",\n \"form-group\",\n \"toplevel\"\n]);\n\nconst doLegends = pathOr(true, [\n \"arbitrary\",\n \"core\",\n \"form-group\",\n \"doLegends\"\n]);\n\nconst getLayout = type =>\n pathOr(compose(prop(\"layout\"), getWidget)(type), [\n \"arbitrary\",\n \"form-group\",\n type\n ]);\n\nconst getGroupName = compose(when(Boolean, baseGroup), pathGroup, head);\n\n// Interface Font Style\nconst questionGroupClass = compose(\n s => names(n.QUESTION_PREFIX_AUTHORSTYLE) + s,\n normalize,\n prop(\"font-class\")\n);\n\n// interface metadata: cssclasses=\nexport const extraClasses = prefix =>\n compose(\n when(\n Boolean,\n compose(\n join(\" \"),\n map(compose(s => names(prefix) + s, normalize)),\n split(\" \")\n )\n ),\n path([\"metadata\", \"cssclasses\"])\n );\n\nconst asciify = s => s.replace(/[^a-z-]/g, \"-\");\n\nconst areAllInvisible = compose(not, any(isVisible));\nconst areAllReadonly = both(\n any(both(isQuestion, isVisible)),\n compose(all(prop(\"originalreadonly\")), filter(both(isQuestion, isVisible)))\n);\n\nconst areAllNotNull = both(\n any(both(isQuestion, isVisible)),\n compose(all(prop(\"notnull\")), filter(both(isQuestion, isVisible)))\n);\n\nconst updateClassWhen = curry((className, fn, controls, elt) => {\n elt.classList.toggle(className, fn(controls));\n});\n\nconst setReadonlyFGClass = updateClassWhen(\n names(n.GROUPING_PREFIX_TYPE) + \"-readonly\",\n areAllReadonly\n);\nconst setEmptyFGClass = updateClassWhen(\n names(n.GROUPING_PREFIX_TYPE) + \"-empty\",\n areAllInvisible\n);\nconst setRequiredFGClass = updateClassWhen(\n names(n.GROUPING_PREFIX_TYPE) + \"-required\",\n areAllNotNull\n);\n\nconst setReadonlyQClass = updateClassWhen(\n names(n.QUESTION_PREFIX_PROPERTY) + \"-readonly\",\n areAllReadonly\n);\nconst setEmptyQClass = updateClassWhen(\n names(n.QUESTION_PREFIX_PROPERTY) + \"-empty\",\n areAllInvisible\n);\nconst setRequiredQClass = updateClassWhen(\n names(n.QUESTION_PREFIX_PROPERTY) + \"-required\",\n areAllNotNull\n);\n\nexport const createFormGroup = (wControl, group, level) => c => {\n let formGroup;\n const groupName = getGroupName(c);\n\n if (\n groupName ||\n (doTopLevel(conf) &&\n (doLegends(conf) || !all(propEq(\"controltype\", \"legend\"))(c)))\n ) {\n formGroup = document.createElement(\"div\");\n formGroup.className = names(n.GROUPING_CLASS);\n formGroup.setAttribute(names(n.GROUPING_DATA_LEVEL), level);\n setEmptyFGClass(c, formGroup);\n setReadonlyFGClass(c, formGroup);\n setRequiredFGClass(c, formGroup);\n formGroup.addEventListener(\"bb:updatedControl\", ({ detail }) => {\n if (has(\"visible\", detail.Updates)) {\n setEmptyFGClass(c, formGroup);\n }\n if (has(\"readonly\", detail.Updates)) {\n setReadonlyFGClass(c, formGroup);\n }\n if (has(\"notnull\", detail.Updates)) {\n setRequiredFGClass(c, formGroup);\n }\n });\n if (groupName) {\n formGroup.setAttribute(names(n.GROUPING_DATA_NAME), asciify(groupName));\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-author\");\n } else if (find(isQuestion, c)) {\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-interface\");\n } else if (compose(isPicture, head)(c)) {\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-picture\");\n } else if (compose(isTextual, head)(c)) {\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-text\");\n }\n } else {\n formGroup = document.createDocumentFragment();\n }\n\n const cWithin = compose(\n groupOuter,\n map(\n when(\n pathGroup,\n tap(control =>\n compose(\n ifElse(\n s => s === \"\",\n () => delete control.metadata.group,\n group => (control.metadata.group = group)\n ),\n tailGroup\n )(control.metadata.group)\n )\n )\n )\n )(c);\n cWithin.forEach(\n cond([\n [\n getGroupName,\n compose(\n n => formGroup.appendChild(n),\n createFormGroup(wControl, group, level + 1)\n )\n ],\n [\n any(isQuestion),\n controls => {\n const answer = find(isQuestion, controls);\n const classes = [\n names(n.QUESTION_CLASS),\n `${names(n.QUESTION_PREFIX_TYPE)}-${answer.controltype}`,\n questionGroupClass(answer),\n extraClasses(n.ITEM_PREFIX_AUTHORCLASS)(answer),\n controls.length === 1 && names(n.QUESTION_CLASS_NOLABEL)\n ].filter(Boolean);\n const qlg = document.createElement(\"div\");\n qlg.setAttribute(\n names(n.QUESTION_DATA_LAYOUT),\n answer._layout || getLayout(answer.controltype)(conf)\n );\n qlg.className = classes.join(\" \");\n setEmptyQClass(controls, qlg);\n setReadonlyQClass(controls, qlg);\n setRequiredQClass(controls, qlg);\n qlg.addEventListener(\"bb:updatedControl\", ({ detail }) => {\n if (has(\"visible\", detail.Updates)) {\n setEmptyQClass(controls, qlg);\n }\n if (has(\"readonly\", detail.Updates)) {\n setReadonlyQClass(controls, qlg);\n }\n if (has(\"notnull\", detail.Updates)) {\n setRequiredQClass(controls, qlg);\n }\n });\n controls.forEach(c => wControl(c, group, $(qlg)));\n formGroup.appendChild(qlg);\n }\n ],\n [\n () => true,\n map(c => {\n const $widget = wControl(c, group, $(formGroup));\n if ($widget)\n $widget.addClass(extraClasses(n.ITEM_PREFIX_AUTHORCLASS)(c));\n })\n ]\n ])\n );\n return formGroup;\n};\n", "/* global $ */\nimport { html, render } from \"lit\";\nimport { Maybe } from \"@cahmoraes93/maybe\";\nimport { A11y, observeDatepickers } from \"./a11y.js\";\nimport { conf, propFinder } from \"./conf.js\";\nimport { wControl, getControl } from \"./control.js\";\nimport { quotable } from \"./quotable.js\";\nimport {\n isLabel,\n isOption,\n isQuestion,\n isReadOnly,\n renderAttribs,\n setAttribs\n} from \"./control-helpers.js\";\nimport { checkDate, onChangeDate, parseDate, leadWithZeroes } from \"./dates.js\";\nimport { escapeHTML } from \"./escape.js\";\nimport { registerWidget } from \"./form-widgets.js\";\nimport {\n allPass,\n always,\n applyTo,\n both,\n compose,\n chain,\n dec,\n dissoc,\n find,\n F,\n gt,\n head,\n has,\n ifElse,\n inc,\n join,\n map,\n mergeLeft,\n path,\n propEq,\n when,\n pathEq,\n reverse,\n pipe,\n lensPath,\n lensProp,\n over,\n append,\n assoc,\n infichain,\n toLower,\n omit,\n nth,\n prop,\n propOr,\n equals,\n tap\n} from \"./functional.js\";\n\nimport { _ } from \"./gettext.js\";\nimport { fromApiServer } from \"./location.js\";\nimport { forceInRange, Numerals } from \"./numerals.js\";\nimport { format, formatPlus } from \"./text-utils.js\";\nimport { urlutils } from \"./url-utils.js\";\n\nconst arbitraryCoreProp = propFinder(conf, \"arbitrary.core\");\n\nfunction disconnectValue({ input, value, filter = x => x }) {\n input.setAttribute(\"data-server-value\", value);\n $(input).on(\"change\", function () {\n try {\n var newVal = filter(input.value, input);\n } catch (e) {\n //\n } finally {\n if (typeof newVal !== \"undefined\") {\n input.setAttribute(\"data-server-value\", newVal);\n }\n }\n });\n}\n\nconst noAttribs = always({});\n\nconst omitName = dissoc(\"name\");\nconst omitRequired = dissoc(\"aria-required\");\n\nconst emptyTag = (tagName, attribs) => {\n const elt = document.createElement(tagName);\n setAttribs(elt, attribs);\n return elt;\n};\nconst valueInside = (control, attribs, tagName) => {\n const elt = emptyTag(tagName, attribs);\n if (tagName === \"textarea\") {\n elt.value = control.value;\n } else {\n elt.innerHTML =\n control.text || escapeHTML(control.value).replace(/\\r?\\n/g, \"
\");\n }\n return elt;\n};\n\nconst checkbox = {\n name: \"checkbox\",\n render: (control, group, attribs) => {\n return emptyTag(\"input\", attribs);\n },\n attribs: (attr, control, enabled) =>\n Object.assign(\n {},\n attr,\n {\n type: \"checkbox\"\n },\n //Interface already has got a value server-side, so not\n //sending it back poses no problem.\n control.value && { checked: true }\n ),\n setValue: (input, value, requestor) => {\n input.checked = value;\n },\n layout: \"inline\"\n};\n\nregisterWidget(checkbox);\n\nconst picture = {\n name: \"picture\",\n render: (control, group, attribs) => emptyTag(\"img\", attribs),\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n alt: control.alttext,\n src: fromApiServer(control.filename)\n })\n};\n\nregisterWidget(picture);\n\nexport const edit = {\n name: \"edit\",\n couldWrap: true,\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n type: \"text\",\n autocomplete: \"off\",\n value: control.value\n }),\n render: (control, group, attribs) => emptyTag(\"input\", attribs),\n setValue: (input, value) => {\n input.value = value;\n },\n layout: \"aside\"\n};\n\nregisterWidget(edit);\n\nconst memo = {\n name: \"memo\",\n attribs: (attr, control, enabled) => {\n // const attribs = [\"name\", control.name];\n // if (control.width && control.height && control[\"font-size\"]) {\n // attribs.cols= parseInt(control.width / (control[\"font-size\"] * 0.75))\n // attribs.rows = parseInt(control.height / (control[\"font-size\"] * 1.5))\n // }\n // return [...attr, ...attribs];\n return attr;\n },\n render: (control, group, attribs) => {\n return valueInside(control, attribs, \"textarea\");\n },\n setValue: edit.setValue,\n layout: \"below\"\n};\n\nregisterWidget(memo);\n\nconst label = {\n name: \"label\",\n fixup: control => {\n control.value = (control.value || \"\").replace(/\\r\\n/g, \"\\n\"); // Normalize Windows-style (typewriter) newlines\n return control;\n },\n attribs: (attr, control, enabled) =>\n Object.assign(\n omitName(attr),\n enabled && control.isFor && { for: control.isFor },\n {\n class: `${\n control.isfor || has(\"colname\", control) ? \"bb-label\" : \"bb-text\"\n } bb-md-able`\n }\n ),\n render: (control, group, attribs) => {\n return valueInside(\n control,\n attribs,\n control._subtype === \"heading\"\n ? \"h\" + Math.min(6, control._level || 2)\n : control.isFor\n ? \"label\"\n : \"div\"\n );\n },\n setValue: (input, value) => {\n input.innerHTML = escapeHTML(value).replace(/\\r?\\n/g, \"
\");\n }\n};\n\nregisterWidget(label);\n\nexport const linklabel = {\n name: \"linklabel\",\n fixup: control => {\n control.value = control.value.trim();\n // Fix 'empty' or JS-links\n if (urlutils.isEmptyish(control.url) || urlutils.isJS(control.url)) {\n if (urlutils.isJS(control.url)) control.value = urlutils.JSAlertMessage;\n delete control.url;\n }\n return control;\n },\n attribs: (attr, control, enabled) => {\n let linkClassName = \"\";\n\n if (control.url) {\n attr[\"href\"] = fromApiServer(control.url);\n if (control.url.match(/mailto:/)) {\n attr[\"type\"] = \"email\";\n linkClassName = \"mail\";\n } else {\n linkClassName = \"bb-external\";\n if (control.isreport) linkClassName += \" report\";\n var mimetype = control.mimetype || urlutils.mimetype(control.url);\n if (mimetype) {\n attr[\"type\"] = mimetype.mimetype;\n linkClassName += \" \" + mimetype.ext;\n }\n }\n if (control.url[0] !== \"#\") attr[\"target\"] = \"_blank\";\n }\n linkClassName += \" bb-text\";\n attr[\"class\"] = linkClassName;\n return omitName(attr);\n },\n render: (control, group, attribs) => {\n return valueInside(control, attribs, \"a\");\n },\n setValue: (input, value) => {\n input.innerHTML = escapeHTML(value).replace(/\\r?\\n/g, \"
\");\n },\n layout: \"below\"\n};\n\nregisterWidget(linklabel);\n\nconst listlabel = {\n name: \"listlabel\",\n attribs: compose(\n omitName,\n omitRequired,\n mergeLeft({\n type: \"listlabel\",\n class: \"listlabel\"\n })\n ),\n item: item =>\n `
  • ${escapeHTML(item).replace(/\\\\n/g, \"
    \")}
  • `,\n render: (control, group, attribs) => {\n const value = control.value;\n const items = compose(join(\"\"), map(listlabel.item))(value);\n const widget = `
      \n${items}
    `;\n return $(widget);\n },\n setValue: (input, value, requestor) => {\n input.innerHTML = compose(join(\"\"), map(listlabel.item))(value);\n $.fn.showdown && $(input).find(\"li\").showdown();\n },\n layout: \"below\"\n};\n\nregisterWidget(listlabel);\n\nconst optionbox = {\n render: (control, group, attribs) => {\n const value = control.value;\n const widget = $(``);\n // Set head of drop-down list to an empty item.\n // If value[0].value is already the empty string, the server\n // has already done this for us (pre 4.7 or dataset-based\n // drop-down).\n // If one of the options has already been selected, do *not*\n // add this empty option.\n // @todo: remove this code once server release 4.7 or higher\n // runs everywhere.\n if (\n control.controltype === \"combobox\" &&\n value.length > 0 &&\n value[0].value !== \"\" &&\n !value.some(function (value) {\n return value.selected === true;\n })\n ) {\n value.unshift({ option: \"\", value: \"\" });\n }\n optionbox.setValue(widget.get(0), value);\n return widget;\n },\n setValue: (input, value) => {\n const options = [...input.querySelectorAll(\"option\")];\n const len = options.length;\n const newLen = value.length;\n const newOptions = input.append ? [] : null;\n let selectedValue = \"\";\n for (let i = 0; i < newLen; i++) {\n const option = value[i];\n const optionElt = options[i] || document.createElement(\"option\");\n optionElt.value = option.value;\n optionElt.textContent =\n value[i].value === \"\" ? _(\"Choose...\") : option.option;\n optionElt.classList.toggle(\"bb-valueless\", option.value === \"\");\n if (option.selected) {\n selectedValue = option.value;\n }\n if (i > len - 1) {\n if (newOptions) {\n newOptions.push(optionElt);\n } else {\n input.appendChild(optionElt);\n }\n }\n }\n if (newOptions.length) {\n input.append(...newOptions);\n } else if (newLen < len) {\n [...input.querySelectorAll(`option:nth-child(1n+${newLen + 1})`)].forEach(\n input => input.parentNode.removeChild(input)\n );\n }\n input.value = selectedValue;\n }\n};\n\nconst combobox = {\n name: \"combobox\",\n // fixup: control => {\n // if (control.freetext === true) {\n // control.controltype = \"edit\";\n // control.datalist = control.value.map(({ option }) => option);\n // control.placeholder = _(\"Choose or type...\");\n // let val = control.value.find(v => v.selected);\n // if (val) control.value = val.option;\n // else control.value = \"\";\n // }\n // return control;\n // },\n fixup: control => {\n if (control.freetext === true) {\n control.controltype = \"freebox\";\n\n // control.datalist = control.value.map(({ option }) => option);\n // control.placeholder = _(\"Choose or type...\");\n // let val = control.value.find(v => v.selected);\n // if (val) control.value = val.option;\n // else control.value = \"\";\n }\n return control;\n },\n couldWrap: true,\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n name: control.name,\n size: 1\n }),\n render: optionbox.render,\n setValue: optionbox.setValue,\n layout: \"below\"\n};\n\nregisterWidget(combobox);\n\nconst listbox = {\n name: \"listbox\",\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n name: control.name,\n size: control.value.length\n }),\n render: optionbox.render,\n setValue: optionbox.setValue,\n layout: \"below\"\n};\n\nregisterWidget(listbox);\n\nconst multilist = {\n name: \"multilist\",\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n name: control.name,\n size: control.value.length,\n multiple: \"multiple\"\n }),\n render: optionbox.render,\n setValue: (input, value, requestor) => {\n const selected = value.find(option => option.selected === true);\n input.value = selected.value;\n },\n layout: \"below\"\n};\n\nregisterWidget(multilist);\n\nconst optionlist = {\n render: (control, group, attribs) => {\n const value = control.value;\n if (value.length === 0) return null;\n const widget = $(`
      `);\n for (let i = 0; i < value.length; i++) {\n let id = control.id + \"-\" + i;\n var option = $(`\n
    • \n \n
    • \n `);\n widget.append(option);\n widget.find(\"input:last\").val(value[i].value);\n }\n return widget;\n },\n onrequired: (input, required) => {\n // $(input).find(\"input\").attr(\"aria-required\", required);\n },\n onreadonly: (list, readonly) => {\n list.classList.toggle(\"bb-disabled\", readonly);\n [...list.querySelectorAll(\"input\")].forEach(input => {\n input.disabled = readonly;\n });\n }\n};\n\nconst checklist = {\n name: \"checkmultilist\",\n attribs: compose(omitRequired, assoc(\"class\", \"checklist bb-option-list\")),\n render: optionlist.render,\n onrequired: optionlist.onrequired,\n onreadonly: optionlist.onreadonly,\n allowUpdatingSelf: true,\n setValue: (input, value, requestor) => {\n const control = $(input).data(\"control\");\n value.forEach(({ selected }, index) => {\n const option = input.querySelector(`[id=\"${control.id}-${index}\"]`);\n if (option.checked !== selected) option.checked = selected;\n $(option).trigger(\"programmatically-changed\");\n });\n },\n layout: \"below\"\n};\n\nregisterWidget(checklist);\n\nconst radiolist = {\n name: \"radio\",\n attribs: compose(omitRequired, assoc(\"class\", \"radiogroup bb-option-list\")),\n render: optionlist.render,\n allowUpdatingSelf: true,\n onrequired: optionlist.onrequired,\n onreadonly: optionlist.onreadonly,\n setValue: (input, value, requestor) => {\n const control = $(input).data(\"control\");\n const index = value.findIndex(option => option.selected === true);\n if (index === -1) {\n input.querySelectorAll(`[id|=\"${control.id}\"]`).forEach(i => {\n i.checked = false;\n i.closest(\".bb-option\").classList.remove(\"checked\");\n });\n return;\n }\n const option = input.querySelector(`[id=\"${control.id}-${index}\"]`);\n option.checked = true;\n $(option).trigger(\"programmatically-changed\");\n },\n layout: \"below\"\n};\n\nregisterWidget(radiolist);\n\nconst datepicker = {\n name: \"datetimepicker\",\n couldWrap: true,\n fixup: control => {\n control.placeholder = _(\"dateplaceholder\");\n return control;\n },\n serverToWidgetValue: value =>\n $.datepicker.formatDate(\n $.datepicker._defaults.dateFormat,\n parseDate(value)\n ),\n widgetToServerValue: input =>\n leadWithZeroes(\n $.datepicker.formatDate(\"yy-mm-dd\", $(input).datepicker(\"getDate\"))\n ),\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n value: datepicker.serverToWidgetValue(control.value),\n autocomplete: \"off\",\n placeholder: _(\"dateplaceholder\", _(\"select date\")),\n type: \"text\"\n }),\n render: (control, group, attribs) => {\n return emptyTag(\"input\", attribs);\n },\n afterRender: (widget, control) => {\n if (!control.originalreadonly || control.dynamic) {\n widget.datepicker();\n observeDatepickers();\n\n control._elt.addEventListener(\"change\", onChangeDate);\n control._elt.addEventListener(\n \"keydown\",\n when(propEq(\"key\", \"Enter\"), () => {\n const ev = new InputEvent(\"change\", {\n bubbles: true,\n cancelable: true,\n view: window\n });\n control._elt.dispatchEvent(ev);\n })\n );\n\n disconnectValue({\n input: widget.get(0),\n filter: function (value, input) {\n return datepicker.widgetToServerValue(input);\n },\n value: control.value\n });\n widget.datepicker(\"widget\").hide();\n }\n },\n setValue: (input, value) => {\n input.setAttribute(\"data-server-value\", value);\n input.value = datepicker.serverToWidgetValue(value);\n },\n validate: (control, value) => {\n if (!control.notnull && (value || \"\").trim() === \"\") {\n // Side effect\n $($(control.$elt).datepicker(\"option\", \"altField\")).attr(\"value\", \"\");\n }\n return checkDate(control, value);\n },\n layout: \"aside\"\n};\n\nregisterWidget(datepicker);\n\nconst numedit = {\n name: \"numedit\",\n couldWrap: true,\n getMaxChars: control => {\n var max, min;\n if (has(\"maximum\", control))\n max = Numerals.formatter(\n control.maximum.toFixed(control.precision)\n ).length;\n if (has(\"minimum\", control))\n min = Numerals.formatter(\n control.minimum.toFixed(control.precision)\n ).length;\n if (typeof min === \"undefined\") return max;\n if (typeof max === \"undefined\") return undefined;\n return Math.max(max, min);\n },\n serverToWidgetValue: value => Numerals.formatter(value),\n // widgetToServerValue: input => input.value,\n attribs: (attr, control, enabled) => {\n const maxchars = numedit.getMaxChars(control);\n return Object.assign(\n {},\n attr,\n {\n type: \"text\",\n class: \"numedit\",\n autocomplete: \"off\",\n name: control.name, // Prevent bug (in JSON grid) (see mantis#5416)\n // value = control.value = parseFloat(control.value || 0);\n value: parseFloat(control.value || 0).toFixed(control.precision)\n },\n // maxchars -- not to be confused with maxlength, which used\n // for validation. This is just to aid layout decisions.\n maxchars && { \"data-maxchars\": maxchars }\n );\n },\n render: (control, group, attribs) => emptyTag(\"input\", attribs),\n afterRender: (widget, control) => {\n widget.data(\"anchor\", widget.spinner(control));\n },\n setValue: (input, value) => {\n const control = $.data(input, \"control\");\n input.value = numedit.serverToWidgetValue(\n parseFloat(value || 0).toFixed(control.precision)\n );\n },\n validate: function (control, value) {\n if (control.controltype !== \"numedit\")\n throw \"_validateNumber called on something not a number\";\n const metadata = control.metadata || {};\n var val;\n try {\n val = Numerals.parser(value);\n } catch (e) {\n throw new Error(\n format(\n metadata.errnuminvalid || _(\"Invalid number\"),\n compose(assoc(\"value\", value), numedit.quotable)(control)\n )\n );\n }\n control.hasMax = has(\"maximum\", control);\n control.hasMin = has(\"minimum\", control);\n try {\n if (typeof val !== \"number\")\n throw metadata.errnuminvalid || _(\"Invalid number\");\n if (control.hasMax && control.hasMin) {\n if (val < control.minimum || val > control.maximum) {\n throw (\n metadata.errnumnotinrange ||\n _(\"Value has to lie between {minimum} and {maximum}\")\n );\n }\n } else if (control.hasMax) {\n if (val > control.maximum) {\n if (control.maximum === 0)\n throw (\n metadata.errnumnotnegativeorzero ||\n _(\"Negative number or zero expected\")\n );\n else if (control.maximum === -1)\n throw metadata.errnumnotnegative || _(\"Negative number expected\");\n else\n throw (\n metadata.errnumabovemaximum ||\n _(\"Value has to lie below {maximum}\")\n );\n }\n } else if (control.hasMin) {\n if (val < control.minimum) {\n if (control.minimum === 0)\n throw (\n metadata.errnumnotpositiveorzero ||\n _(\"Positive number or zero expected\")\n );\n else if (control.minimum === 1)\n throw metadata.errnumnotpositive || _(\"Positive number expected\");\n else\n throw (\n metadata.errnumbelowminimum ||\n _(\"Value has to lie above {minimum}\")\n );\n }\n }\n } catch (e) {\n throw formatPlus(\n e,\n compose(assoc(\"value\", value), numedit.quotable)(control)\n );\n }\n\n return true;\n },\n quotable: compose(\n when(has(\"minimum\"), over(lensProp(\"minimum\"), Numerals.formatter)),\n when(has(\"maximum\"), over(lensProp(\"maximum\"), Numerals.formatter)),\n when(\n has(\"minimum\"),\n chain(assoc(\"minimum-1\"), compose(dec, prop(\"minimum\")))\n ),\n when(\n has(\"maximum\"),\n chain(assoc(\"maximum+1\"), compose(inc, prop(\"maximum\")))\n ),\n quotable\n ),\n layout: \"aside\"\n};\n\nregisterWidget(numedit);\n\nconst freebox = {\n name: \"freebox\",\n couldWrap: true,\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n \"type\": \"text\",\n \"data-type\": control.controltype,\n \"list\": `${control.id}-list`,\n \"placeholder\": _(\"Choose...\"),\n \"value\": freebox._realValue(control.value)\n }),\n _realValue: compose(propOr(\"\", \"option\"), find(prop(\"selected\"))),\n setValue: function (input, value, requestor) {\n input.value = freebox._realValue(value);\n },\n render: (control, group, attribs) => emptyTag(\"input\", attribs),\n afterRender: (widget, control) => {\n control._elt.insertAdjacentHTML(\n \"afterEnd\",\n `\n${control.value\n .map(({ option }) => `\n`\n );\n },\n layout: \"aside\"\n};\n\nregisterWidget(freebox);\n\nconst _radioButtonWidget = {\n name: \"radiobutton\",\n tagName: \"input\",\n attribs: (attr, control, enabled) =>\n Object.assign(\n {},\n attr,\n { type: \"radio\", value: control.value },\n control.selected && { checked: \"checked\" }\n ),\n render: $.noop\n};\n\nregisterWidget(_radioButtonWidget);\n\nconst _rangeWidget = {\n name: \"range\",\n tagName: \"input\",\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n type: \"range\",\n value: control.value\n }),\n render: $.noop,\n layout: \"aside\"\n};\n\nregisterWidget(_rangeWidget);\n\nconst _buttonWidget = {\n name: \"button\",\n attribs: (attr, control, enabled) =>\n Object.assign(\n {},\n attr,\n { type: \"submit\", value: control.value },\n control.label && { \"aria-label\": control.label }\n ),\n render: (control, group, attribs) => valueInside(control, attribs, \"button\"),\n setValue: (elt, value, requestor, Updates) => {\n if (has(\"text\", Updates)) elt.innerHTML = Updates.text.to;\n if (has(\"value\", Updates)) elt.value = Updates.value.to;\n elt.classList.toggle(\"bb-record-del\", Updates.value.to.endsWith(\"-\"));\n elt.classList.toggle(\"bb-record-add\", Updates.value.to.endsWith(\"+\"));\n }\n};\n\nregisterWidget(_buttonWidget);\n\nconst _legendWidget = {\n name: \"legend\",\n tagName: \"legend\",\n attribs: noAttribs,\n\n render: function (control, widget, group) {\n var level;\n if (!conf.a11y.strictlegends && control._subtype === \"heading\") {\n level = Math.min(6, control._level || 2);\n // Trim value and control.value itself as well.\n widget.html(\n \"' +\n escapeHTML(control.value.trim()) +\n \"\"\n );\n } else {\n widget.text(control.value);\n widget.addClass(\"bb-md-able\");\n }\n }\n};\n\nregisterWidget(_legendWidget);\n\nconst _captionWidget = {\n name: \"caption\",\n tagName: \"caption\",\n attribs: noAttribs,\n render: function (control, widget, group) {\n widget.text(control.value.trim());\n widget.addClass(\"bb-md-able\");\n }\n};\n\nregisterWidget(_captionWidget);\n\nconst _alertWidget = {\n name: \"alert\",\n tagName: \"p\",\n attribs: noAttribs,\n render: function (control, widget, group) {\n widget.text(control.value);\n // Yup, this widget exists mainly for this\n // side-effect -- setting role=\"alert\",\n // aria-live=\"assertive\" does not do the\n // trick - and forcing focus looks ugly too.\n A11y.log(control.value);\n }\n};\n\nregisterWidget(_alertWidget);\n\nexport const grid = {\n name: \"grid\",\n attribs: compose(omitRequired, omitName),\n item: item =>\n `
    • ${escapeHTML(item).replace(/\\\\n/g, \"
      \")}
    • `,\n renderable: control => {\n const copy = assoc(\n \"addPlacement\",\n !control.addallowed\n ? \"none\"\n : control.value.length === 0 ||\n arbitraryCoreProp(\"putAddRowButtonBelowGrid\")\n ? \"below\"\n : \"insert\",\n control\n );\n return pipe(\n when(\n propEq(\"addPlacement\", \"insert\"),\n compose(\n over(\n lensProp(\"columns\"),\n append({\n controltype: \"button\",\n text: `${\n (control.metadata && control.metadata.insertbuttontext) ||\n _(\"insert row\")\n }+`,\n name: \"update\",\n className: \"bb-record-add\",\n readonly: false,\n label: _(\"insert row\")\n })\n ),\n over(\n lensProp(\"value\"),\n map((row, i) =>\n append(\n {\n value:\n control.name +\n \".\" +\n ((control.offset || 0) + i + 1) +\n \".\" +\n \"+\"\n },\n row\n )\n )\n )\n )\n ),\n when(\n propEq(\"deleteallowed\", true),\n compose(\n over(\n lensProp(\"columns\"),\n append({\n controltype: \"button\",\n name: \"update\",\n className: \"bb-record-del\",\n readonly:\n !control.notnull ||\n control.value.length > 1 ||\n (control.showcolumns && control.addallowed)\n ? false\n : true,\n text: `${\n (control.metadata && control.metadata.deletebuttontext) ||\n _(\"delete row\")\n }-`\n })\n ),\n over(\n lensProp(\"value\"),\n map((row, i) =>\n append(\n {\n value:\n control.name + \".\" + ((control.offset || 0) + i) + \".\" + \"-\"\n },\n row\n )\n )\n )\n )\n ),\n infichain([\n prop(\"columns\"),\n (columns, grid) => {\n return over(\n lensProp(\"value\"),\n map((row, row_i) =>\n map((cell, cell_i) =>\n compose(\n when(\n both(prop(\"colname\"), isQuestion),\n assoc(\"aria\", { labelledby: `${control.id}-col-${cell_i}` })\n ),\n when(prop(\"colname\"), cell =>\n assoc(\"meta\", { label: cell.colname }, cell)\n ),\n cell =>\n Object.assign(\n {},\n columns[cell_i],\n {\n id:\n control.id +\n \"-\" +\n ((control.offset || 0) + row_i) +\n \"-\" +\n cell_i\n },\n cell\n ),\n assoc(\"_row_index\", (control.offset || 0) + row_i),\n assoc(\"_cell_index\", cell_i)\n )(cell)\n )(row)\n ),\n grid\n );\n }\n ]),\n over(\n lensProp(\"columns\"),\n map((col, col_i) => assoc(\"id\", `${control.id}-col-${col_i}`, col))\n ),\n over(\n lensProp(\"value\"),\n map(\n map((cell, cell_i, cells) =>\n compose(\n assoc(\"_tag\", grid.cellTag(cell, cells)),\n when(\n allPass([\n isLabel,\n pipe(prop(\"_cell_index\"), gt, applyTo(0)),\n () => isOption(cells[cell_i - 1])\n ]),\n cell => assoc(\"isFor\", cells[cell_i - 1].id, cell)\n ),\n when(\n allPass([\n isOption,\n propEq(\"_cell_index\", 0),\n () => isLabel(cells[cell_i + 1])\n ]),\n cell =>\n over(\n lensPath([\"aria\", \"labelledby\"]),\n col_id => `${cells[cell_i + 1].id} ${col_id || \"\"}`,\n cell\n )\n )\n )(cell)\n )\n )\n )\n )(copy);\n },\n cellTag: (cell, row) => {\n return cell.value === null\n ? null\n : cell._rowspan && cell._cell_index === 0 && row.length > 1\n ? \"th\"\n : \"td\";\n },\n columnheader: column => {\n const header = document.createElement(\"th\");\n header.classList.add(\"bb-md-able\");\n header.setAttribute(\"data-rowtype\", column.controltype);\n header.setAttribute(\"data-rowreadonly\", Boolean(column.readonly));\n if (has(\"colname\", column)) {\n header.innerText = column.colname;\n header.id = column.id;\n }\n return header;\n },\n colheaderids: ifElse(\n prop(\"showcolumns\"),\n compose(\n map(ifElse(propEq(\"controltype\", \"button\"), F, prop(\"id\"))),\n prop(\"columns\")\n ),\n compose(map(F), prop(\"columns\"))\n ),\n rowheaderid: (rows, i) => {\n const rows_up_to_here = rows.slice(0, i + 1);\n return compose(\n prop(\"value\"),\n map(compose(id => `${id}--cell`, prop(\"id\"), head)),\n Maybe.of,\n find(pathEq([0, \"_tag\"], \"th\")),\n reverse\n )(rows_up_to_here);\n },\n cell: cell => {\n const tag = cell._tag;\n const e_cell =\n tag === null\n ? document.createComment(\"empty cell\")\n : document.createElement(tag);\n if (tag === \"th\") {\n e_cell.id = `${cell.id}--cell`;\n }\n return e_cell;\n },\n cellSetAttributes: (e_cell, cell) => {\n if (cell._tag === null) return e_cell;\n if (cell._tag === \"th\") e_cell.setAttribute(\"scope\", \"row\");\n if (cell._rowspan > 1) e_cell.setAttribute(\"rowspan\", cell._rowspan);\n else e_cell.removeAttribute(\"rowspan\");\n if (cell.headers) e_cell.setAttribute(\"headers\", cell.headers);\n else e_cell.removeAttribute(\"headers\");\n if (typeof cell.colname !== \"undefined\")\n e_cell.setAttribute(\"data-column\", cell.colname);\n else e_cell.removeAttribute(\"data-column\");\n e_cell.classList.add(\"nth-child-\" + (cell._cell_index + 1));\n if (cell.value === \"\")\n e_cell.classList.toggle(\n \"empty\",\n cell.controltype === \"label\" && cell.value === \"\"\n ); // IE8 does not support :empty\n\n e_cell.classList.add(\"bb-celltype-\" + cell.controltype);\n return e_cell;\n },\n render: (control, group, attribs) => {\n const widget = $(`
      `);\n control = grid.renderable(control);\n if (control.value.length === 0) {\n widget.addClass(\"bb-empty\");\n }\n if (control.caption) {\n wControl(\n control.caption,\n group,\n widget //append hereto\n );\n }\n if (control.showcolumns) {\n // widget.append($(\"\".repeat(control.columns.length)));\n const thead = document.createElement(\"thead\");\n const tr = document.createElement(\"tr\");\n thead.append(tr);\n widget.append(thead);\n if (control.value.length > 0)\n tr.append(...control.columns.map(grid.columnheader));\n }\n const e_body = document.createElement(\"tbody\");\n widget.append(e_body);\n const colheaders = grid.colheaderids(control);\n control.value.forEach(function (row, i, rows) {\n // NOTE: control.offset is set by global plugin split-grid.\n // const i = idx + (control.offset || 0);\n const last_spanning_cell_id = grid.rowheaderid(rows, i);\n const e_row = document.createElement(\"tr\");\n if (row.length === 0) return;\n e_row.classList.toggle(\"bb-newscope\", row[0]._tag === \"th\");\n e_body.appendChild(e_row);\n row.forEach(function (cell, icol) {\n const rowheader = cell._tag === \"td\" ? last_spanning_cell_id : false;\n const headers = [rowheader, colheaders[icol]].filter(Boolean).join(\" \");\n const cellWithHeaders = {\n ...cell,\n headers\n };\n if (cell.value !== null) {\n const e_cell = grid.cell(cell);\n grid.cellSetAttributes(e_cell, cellWithHeaders);\n e_row.appendChild(e_cell);\n wControl(\n cell,\n control._group,\n e_cell //append hereto\n );\n } else {\n e_row.appendChild(document.createComment(\"empty cell\"));\n }\n });\n });\n\n return $(widget);\n },\n afterRender: (widget, control) => {\n const addPlacement = !control.addallowed\n ? \"none\"\n : control.value.length === 0 ||\n arbitraryCoreProp(\"putAddRowButtonBelowGrid\")\n ? \"below\"\n : \"insert\";\n if (addPlacement === \"below\") {\n const gridAddButton = ``;\n widget.get(0).insertAdjacentHTML(\"afterEnd\", gridAddButton);\n // $(widget.in.append(widget, gridAddButton);\n }\n },\n setValue: (e_grid, value, requestor, updates) => {\n // if (grid.contains(requestor))\n const control = $.data(e_grid, \"control\");\n const old = compose(\n grid.renderable,\n assoc(\"value\", updates[\"value\"].from),\n assoc(\"columns\", updates[\"columns\"].from)\n )(control);\n\n const now = grid.renderable(control);\n // Remove spurious row\n [\n ...e_grid.querySelectorAll(\n `tbody tr:nth-child(1n + ${now.value.length + 1})`\n )\n ].forEach(row => row.remove());\n // Remove spurious 'cells' (also empty cell comments)\n [...e_grid.querySelectorAll(`tbody tr`)].forEach(row => {\n let cell;\n while (((cell = row.childNodes[now.columns.length]), cell)) {\n cell.remove();\n }\n });\n\n if (\n !equals(old.columns, now.columns) ||\n (old.value.length === 0 && now.value.length !== 0) ||\n (old.value.length !== 0 && now.value.length === 0)\n ) {\n // Remove ALL column headers (re-created)\n [...e_grid.querySelectorAll(`thead tr th`)].forEach(colheader =>\n colheader.remove()\n );\n\n if (now.showcolumns && now.value.length > 0)\n now.columns // .slice(old.columns.length)\n .forEach(function (column) {\n e_grid.querySelector(\"thead tr\").append(grid.columnheader(column));\n });\n }\n\n const colheaders = grid.colheaderids(now);\n now.value.forEach((row, irow, rows) => {\n let e_row = e_grid.querySelector(`tbody tr:nth-child(${irow + 1})`);\n if (e_row === null) {\n e_row = document.createElement(\"tr\");\n e_grid.tBodies[0].append(e_row);\n }\n e_row.classList.toggle(\"bb-newscope\", row[0]._tag === \"th\");\n const last_spanning_cell_id = grid.rowheaderid(rows, irow);\n row.forEach((cell, icol) => {\n const cellInput = e_grid.querySelector(`[id=\"${cell.id}\"]`);\n const oldcell = old.value[irow] && old.value[irow][icol];\n const rowheader = cell._tag === \"td\" ? last_spanning_cell_id : false;\n const headers = [rowheader, colheaders[icol]].filter(Boolean).join(\" \");\n const cellWithHeaders = {\n ...cell,\n headers\n };\n const spot = e_row.childNodes[icol];\n if (!spot) {\n // NEW => Add at end\n const e_cell = grid.cell(cell);\n grid.cellSetAttributes(e_cell, cellWithHeaders);\n e_row.appendChild(e_cell);\n wControl(cell, control._group, e_cell);\n return;\n }\n if (\n cell.controltype !== oldcell.controltype ||\n cell._tag !== oldcell._tag\n ) {\n // REPLACE\n let e_cell;\n if (cell._tag !== oldcell._tag) {\n e_cell = grid.cell(cell);\n spot.replaceWith(e_cell);\n } else {\n // Re-use old cell\n e_cell = spot;\n if (cell._tag !== null) {\n e_cell.classList.remove(\"bb-celltype-\" + oldcell.controltype);\n e_cell.innerHTML = \"\";\n }\n }\n if (cell._tag !== null) {\n grid.cellSetAttributes(e_cell, cellWithHeaders);\n wControl(cell, control._group, e_cell);\n }\n return;\n }\n if (cell._tag === null) return;\n // UPDATE\n grid.cellSetAttributes(spot, cellWithHeaders);\n const cellControl = $.data(cellInput, \"control\");\n if (!cellControl) return;\n if (cell.value !== cellControl.value) {\n $(cellInput).updateControl(\n [\n Object.assign({}, cellControl, {\n value: cell.value,\n text: cell.text\n })\n ],\n requestor\n );\n }\n });\n });\n },\n onrequired: (grid, required) => {},\n onreadonly: (grid, readonly) => {\n grid.classList.toggle(\"bb-disabled\", readonly);\n [...grid.querySelectorAll(\"input, textarea, button\")].forEach(input => {\n input.disabled =\n readonly || compose(ifElse(Boolean, isReadOnly, F), getControl)(input);\n });\n },\n layout: \"below\"\n};\n\nregisterWidget(grid);\n\n$.fn.extend({\n /**\n * Widgetize as numedit\n */\n spinner: function (control) {\n control = control || {};\n var _interval = 250,\n interval = _interval,\n timer = null,\n me = this,\n val = Numerals.formatter(me.val()),\n $this = $(this),\n $anchor = $this;\n\n function mustAddButtons() {\n return !(arbitraryCoreProp(\"skipNumButtons\") === true);\n }\n\n function addButtons($input, control) {\n var buttontemplate =\n '
      ' +\n '
      ' +\n '
      ' +\n \"
      \";\n $input\n .wrapAll('
      ')\n .after(buttontemplate);\n $input.parents(\".bb-num\").data(\"control\", control);\n $input\n .next()\n .find(\".bb-num-down, .bb-num-up\")\n .on(\"click\", adjustOnce)\n .on(\"mousedown\", keepAdjusting)\n .on(\"mouseup mouseout\", stopAdjusting);\n\n return $input.parent();\n }\n\n function adjust(diff) {\n var parsed, val;\n try {\n parsed = Numerals.parser(me.val());\n } catch (err) {\n $this.validate(); // Let validate() handle\n // showing of errors\n }\n if (typeof parsed === \"undefined\") return;\n // A diff of 0 is just used for the sake of formatting - so do\n // not force the number to be in range.\n val = (\n diff === 0\n ? parseFloat(parsed - diff)\n : forceInRange(\n parseFloat(parsed - diff),\n control.minimum,\n control.maximum\n )\n ).toFixed(control.precision || 0);\n\n me.val(Numerals.formatter(val));\n\n //if (val == \"NaN\") val = \"\";\n $this.validate(); // Validate just for the sake\n // of getting away the error\n // message\n if (me.data(\"orgval\") !== me.val()) me.trigger(\"change\");\n $this.data(\"orgval\", $this.val());\n }\n\n $this\n .data(\"orgval\", val) // Remember the original value\n .val(val)\n .on(\"keydown\", function (e) {\n var key = e.keyCode;\n if (key === 38 || key === 40) {\n var diff = key === 38 ? -1 : 1;\n adjust(diff);\n }\n if (key === 13) {\n adjust(0);\n }\n })\n .on(\"click\", function () {\n let parsed;\n try {\n parsed = Numerals.parser(me.val());\n } catch (err) {\n //\n } finally {\n if (parsed === 0) $this.val(\"\");\n }\n })\n .on(\"blur\", function () {\n let orgval = $this.val();\n adjust(0);\n if ($this.val() !== orgval) {\n $this.addClass(\"bb-programmatically-changed\");\n window.setTimeout(function () {\n $this.removeClass(\"bb-programmatically-changed\");\n }, 1000);\n }\n // Set orgval for future changes.\n $this.data(\"orgval\", $this.val());\n });\n\n function keepAdjusting() {\n var thing = $(this);\n var diff = thing.hasClass(\"bb-num-down\") ? 1 : -1;\n timer = window.setTimeout(function () {\n adjust(diff);\n if (interval > 20) interval = interval - 10;\n thing.trigger(\"mousedown\");\n }, interval);\n }\n\n function adjustOnce() {\n var diff = $(this).hasClass(\"bb-num-down\") ? 1 : -1;\n adjust(diff);\n }\n\n function stopAdjusting() {\n window.clearTimeout(timer);\n interval = _interval;\n return false; // prevent text selection\n }\n\n if (mustAddButtons()) $anchor = addButtons($this, control);\n\n disconnectValue({\n input: $this.get(0),\n filter: Numerals.parser,\n value: control.value\n });\n $this.on(\"change\", function (_event, data) {\n if (!prop(\"programmatically\", data)) $this.validate();\n });\n return $anchor;\n }\n});\n", "import { _ } from \"./gettext\";\n\n/*** NUMBER UTILITIES BEGIN ***/\n\nexport function forceInRange(num, min, max) {\n if (typeof min == \"undefined\" && typeof max == \"undefined\") return num;\n if (typeof min == \"undefined\") return Math.min(max, num);\n if (typeof max == \"undefined\") return Math.max(min, num);\n if (min === max) return min;\n return Math.max(Math.min(max, num), min);\n}\n\nexport const Numerals = (function () {\n /**\n * Create a getter for array, consuming items, repeating the last one\n * indefinitely.\n *\n * @param {Array} arr The array to make a repeater for\n * @return {Function()} Gets next item in arr, repeating last item indefinitely\n */\n function makeLastItemRepeater(arr) {\n var _a = arr.slice();\n var _last;\n return function getIter() {\n _last = _a.shift() || _last;\n return _last;\n };\n }\n /**\n * Create a formatting function for (arabic-hindu) numerals.\n *\n * @param {String} radixPoint String (character) used as radix point.\n * @param {String} groupingChar String (character) used for grouping\n * digits before the radix point.\n * @param {Array} groupingRules (optional) Array defining\n * grouping rules. Each element in this array stands for a group,\n * tracking leftwards from the radix point. When no more elements\n * remain, the last element will be repeated indefinitely.\n *\n * Most language use [3] (the default). For Indian, use [3,2]; for Chinese (and\n * Japanese?), use [4].\n *\n * Besides these rules, the special case of formatting\n * four digits in a row without grouping and no\n * fractional part is supported, and cannot be overruled.\n *\n * @return {Function()} Formatting function.\n */\n function makeFormatter(radixPoint, groupingChar, groupingRules) {\n return function formatter(num) {\n var idx = makeLastItemRepeater(groupingRules || [3]);\n var split = num.toString().split(\".\");\n var integralPart = split[0];\n var fractionalPart = split[1];\n var neg = (integralPart[0] === \"-\" && \"-\") || \"\";\n if (neg) integralPart = integralPart.substr(1);\n var th,\n out = \"\";\n if (integralPart) {\n // The four-digit exception rule (such as in years):\n if (!fractionalPart && integralPart.length === 4) out = integralPart;\n else {\n integralPart = integralPart.split(\"\").reverse();\n while ((th = integralPart.splice(0, idx()))[0]) {\n out = th.reverse().join(\"\") + (out ? groupingChar : \"\") + out;\n }\n }\n }\n if (fractionalPart) return neg + out + radixPoint + fractionalPart;\n return neg + out;\n };\n }\n function makeParser(radixPoint, groupingChar) {\n /**\n * Match anything not a digit or negative sign\n */\n var thre = /[^0-9-]/g;\n /**\n * Match only optional leading minus digits,\n * radixPoint, groupingChar and space characters.\n */\n var testre = new RegExp(\"^s?-?[0-9 \" + radixPoint + groupingChar + \"]*$\");\n\n return function parser(s) {\n if (!testre.test(s)) throw new Error(_(\"Invalid number\"));\n var split = s.split(radixPoint);\n var integralPart = split[0].replace(thre, \"\");\n if (!/^-?[0-9]*$/.test(integralPart))\n throw new Error(_(\"Invalid number\"));\n var fractionalPart = split[1];\n if (fractionalPart) fractionalPart = fractionalPart.replace(/\\s/g, \"\");\n if (!fractionalPart) fractionalPart = \"0\";\n if (!/^[0-9]*$/.test(fractionalPart))\n throw new Error(_(\"Invalid number\"));\n // Room for errors here.\n return new Number(integralPart + \".\" + fractionalPart) + 0;\n };\n }\n\n return {\n parser: makeParser(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\")\n ),\n formatter: makeFormatter(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\"),\n _(\"__digitgroupingrules__\", [3])\n ),\n makeFormatter: makeFormatter,\n makeParse: makeParser,\n refresh: () => {\n // console.log(this);\n Numerals.parser = makeParser(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\")\n );\n Numerals.formatter = makeFormatter(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\"),\n _(\"__digitgroupingrules__\", [3])\n );\n }\n };\n})();\n/*** NUMBER UTILITIES END ***/\n", "import { fromApiServer } from \"./location.js\";\nimport Vars from \"./vars.js\";\n\nif (!window.location.origin) {\n window.location.origin =\n window.location.protocol +\n \"//\" +\n window.location.hostname +\n (window.location.port ? \":\" + window.location.port : \"\");\n}\n\n/*** URL UTILITIES BEGIN ***/\nexport const urlutils = (function () {\n var mimetypes = {\n xsl: \"text/html\",\n html: \"text/html\",\n docx: \"application/msword\",\n pdf: \"application/pdf\",\n odt: \"application/vnd.oasis.opendocument.text\",\n rtf: \"application/rtf\",\n doc: \"application/msword\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\"\n };\n function caseReport(casus) {\n return fromApiServer(\"report?\" + Vars.querify(Vars.SESSION_KEYS, casus));\n }\n function getFiles(casus) {\n return \"getfiles?\" + Vars.querify(Vars.SESSION_KEYS, casus);\n }\n function isJS(url) {\n return url.match(/javascript:/);\n }\n function isEmptyish(url) {\n return url[0] === \"?\";\n }\n var JSAlertMessage =\n \"ALERT:\\nIt looks like someone is trying to eavesdrop on you,\" +\n \" trying to evaluate JavaScript code. \" +\n \"This person may want to steal private information \" +\n \"from you or other persons. \" +\n \"For your safety and that of others, \" +\n \"please contact this website \" +\n \"to report this message.\";\n return {\n isJS,\n isEmptyish,\n JSAlertMessage,\n getFiles,\n caseReport,\n mimetype: function (url) {\n const absoluteURL = new URL(\n fromApiServer(url),\n `${location.protocol}${location.host}${location.pathname}`\n );\n const filename = absoluteURL.pathname.endsWith(\"/getfile\")\n ? new URLSearchParams(absoluteURL.search).get(\"filename\")\n : absoluteURL.pathname.split(\"/\").pop();\n if (!filename) return null;\n const ext = filename.match(/\\.([^?.]+)$/),\n mimetype = ext && mimetypes[ext[1]];\n if (!mimetype) return null;\n return {\n mimetype: mimetype,\n ext: ext[1]\n };\n }\n };\n})();\n/*** URL UTILITIES END ***/\n", "import { compose, map, filter } from \"./functional\";\n\nexport const collectAttributes = (prefix, elt) =>\n compose(\n Object.fromEntries,\n map(({ name, value }) => [name.substr(prefix.length), value]),\n filter(({ name, value }) => name.startsWith(prefix)),\n x => [...x]\n )(elt.attributes);\n", "import { escapeHTML } from \"./escape.js\";\n\nconst times = (string, integer) => string.repeat(integer);\n\n/*** JUMPLIST BEGIN ***/\nfunction hasselectedbelowlevel(jumplist, level) {\n if (jumplist.length == 0) return false;\n if (jumplist[0].level <= level) return false;\n if (jumplist[0].status == \"selected\") return true;\n return hasselectedbelowlevel(jumplist.slice(1), jumplist[0].level);\n}\nfunction hasselectedbelow(jumplist) {\n return hasselectedbelowlevel(jumplist.slice(1), jumplist[0].level);\n}\n\nconst ariaCurrentAttrib = jumplist =>\n jumplist.status === \"selected\" ? ` aria-current=\"step\"` : \"\";\n\nfunction bakeInnerList(jumplist, level = 0, containsselection) {\n if (!(jumplist instanceof Array)) {\n return (\n (jumplist.level > level\n ? times(\n `<${Jumplist.type}>
    • `,\n jumplist.level - level\n )\n : jumplist.level < level\n ? times(`
    • `, level - jumplist.level) +\n `
    • `\n : `
    • `) +\n `${escapeHTML(\n jumplist.screentitle.trim()\n )}`\n );\n }\n if (jumplist.length == 0)\n return \"
    • \" + times(``, level);\n return (\n bakeInnerList(\n jumplist[0],\n level,\n hasselectedbelow(jumplist, jumplist[0].level)\n ) + bakeInnerList(jumplist.slice(1), jumplist[0].level)\n );\n}\nexport const bakeAsListitems = jumplist => {\n let html = bakeInnerList(jumplist);\n // Odd case of indentation sans parent:\n if ([\"u\", \"o\"].includes(html.charAt(1)))\n return '
    • ' + html + \"
    • \";\n return html;\n};\nfunction bakeAsDropDown(jumplist, level = 0, containsselection) {\n // Implemented recursively so we can make the 'chapter' selected\n if (!(jumplist instanceof Array)) {\n return (\n \"\" +\n times(\" \", level * 2) +\n jumplist.screentitle.replace(/^ +/, \"\") +\n \"\"\n );\n }\n if (jumplist.length == 0) return \"\";\n return (\n bakeAsDropDown(\n jumplist[0],\n level,\n hasselectedbelow(jumplist, jumplist[0].level)\n ) + bakeAsDropDown(jumplist.slice(1), jumplist[0].level)\n );\n}\n\nexport var Jumplist = new (function () {\n var _jumplist = []; //Save last jumplist\n this.type = \"ul\";\n this.draw = function draw(jumplist) {\n jumplist = jumplist || _jumplist;\n if (jumplist) _jumplist = jumplist;\n $(\n `.bb-jumplist ${Jumplist.type}, .bb-jumplist li, .bb-jumplist-dropdown select`\n ).remove();\n if (jumplist.length) {\n if (\n $(\".bb-jumplist:visible, .bb-jumplist-dropdown:visible\").length === 0\n ) {\n // If we can't rely on CSS to decide the appropriate type\n // of jumplist (happens sometimes onload), draw them both\n drawAsList(jumplist);\n drawAsDropDown(jumplist);\n } else {\n // Draw our standard list:\n if ($(\".bb-jumplist\").is(\":visible\")) drawAsList(jumplist);\n // Also draw the dropdown:\n if ($(\".bb-jumplist-dropdown\").is(\":visible\")) drawAsDropDown(jumplist);\n }\n }\n };\n\n function drawAsList(jumplist) {\n const html = bakeAsListitems(jumplist);\n $(\".bb-jumplist\").append(\n `<${Jumplist.type} aria-describedby=\"a-jumplist-title\">${html}`\n );\n $(\".bb-jumplist a:last\").addClass(\"last\");\n $(\".bb-jumplist li:last-child\").addClass(\"last-child\"); // aid older browsers\n }\n function drawAsDropDown(jumplist) {\n if (jumplist.length) {\n var html = bakeAsDropDown(jumplist, 0);\n $(\".bb-jumplist-dropdown\").append(\"\");\n }\n }\n\n return this;\n})();\n", "import { getVar } from \"./vars.js\";\n\nexport const userinfo = () => getVar(\"userinfo\") || {};\n", "import { userinfo } from \"./user-info.js\";\nimport {\n compose,\n either,\n includes,\n prop,\n strictDifference\n} from \"./functional.js\";\n\nexport const PERM_ACCESSALLMODELS = \"accessallmodels\",\n // Allow to access all models\n PERM_ALLOWACCESSCASES = \"allowaccesscases\",\n // Allow to access to all the cases on the server\n PERM_ALLOWACCESSCASESFROMDOMAIN = \"allowaccesscasesfromdomain\",\n // Allow to access all the cases in the same domain on the server\n PERM_ALLOWALLCASEOVERVIEWDOMAIN = \"allowallcaseoverviewdomain\",\n // Allow to see all the cases in same domain on the server\n PERM_ALLOWALLCASESOVERVIEW = \"allowallcasesoverview\",\n // Allow to see all the cases made on the server\n PERM_ALLOWCASEOVERVIEW = \"allowcaseoverview\",\n // Allow to see the cases made by the user on the server\n PERM_ALLOWDOWNLOADCASE = \"allowdownloadcase\",\n // Allow user to download a case from the server\n PERM_ALLOWIPLOGTOUSER = \"allowiplogtouser\",\n // Allow the IP log to be send to the user\n PERM_ALLOWLOGTOUSER = \"allowlogtouser\",\n // Allow the WHOLE log of the server to be send to the user\n\n PERM_ALLOWMISALL = \"allowmisall\",\n // Allow all the MIS data to be shown\n PERM_ALLOWMISDOCUMENTS = \"allowmisdocuments\",\n // Allow the documents of the case to be opened\n PERM_ALLOWMISDOMAIN = \"allowmisdomain\",\n // Allow the MIS data within the same domain to be shown\n PERM_ALLOWMISOWNCASES = \"allowmisowncases\",\n // Allow the MIS data of the own cases to be shown\n\n PERM_ALLOWSAVECASE = \"allowsavecase\",\n // Allow to save a case on the server\n PERM_ALLOWSESSIONLOGTOUSER = \"allowsessionlogtouser\",\n // Allow the log concerning a case to be send to the user\n\n PERM_ALLOWSTARTCASES = \"allowstartcases\",\n // Allow to create a new case on the server\n PERM_PUBLISHMODEL = \"publishmodel\",\n // Allow to publish models to the server\n PERM_SAASCLIENTLOGICWRITABLE = \"saasclientlogicwritable\",\n // Allow users to change texts and logic in SAAS\tNeeds either updatemodels or updateownmodel to have effect\n PERM_SAASCLIENTWRITABLE = \"saasclientwritable\",\n // Allow users to change texts of the model in SAAS\tNeeds either updatemodels or updateownmodel to have effect\n PERM_SAASMANAGEPUBLISHINGSERVERS = \"saasmanagepublishingservers\",\n // Allow management of the publishing servers in server\n PERM_UPDATEDOMAINS = \"updatedomains\",\n // Allow to update or delete all the domains on the server (needs update users and models)\n PERM_UPDATEMODELS = \"updatemodels\",\n // Allow to update or delete all the models on the server\n PERM_UPDATEOWNMODEL = \"updateownmodel\",\n // Allow update or delete the models owned by user\n PERM_UPDATEOWNUSER = \"updateownuser\",\n // Allow to update the own user on the server, need this for webadmin access\n PERM_UPDATEROLES = \"updateroles\",\n // Allow to update or delete all the roles on the server\n PERM_UPDATESETTINGS = \"updatesettings\",\n // Allow to update the settings of the server\n PERM_UPDATEUSERS = \"updateusers\",\n // Allow to update or delete all the users on the server\n PERM_GETDATASOURCELIST = \"getdatasourcelist\",\n // Allow retrieving a sparse list of datasources\n PERM_MANAGEDATASOURCES = \"managedatasources\";\n// Allow retrieving, posting, updating, and deleting datasource specs and file\n\n// 4.12 equivalents\nconst oldperms = {\n guest: [PERM_ALLOWSTARTCASES],\n user: [\n PERM_PUBLISHMODEL,\n PERM_UPDATEOWNMODEL,\n PERM_UPDATEOWNUSER,\n PERM_ALLOWCASEOVERVIEW,\n PERM_ALLOWSTARTCASES,\n PERM_ALLOWSAVECASE,\n PERM_ALLOWMISOWNCASES // ,\n // PERM_SAASCLIENTWRITABLE,\n // PERM_SAASCLIENTLOGICWRITABLE\n ],\n administrator: [\n PERM_PUBLISHMODEL,\n PERM_ACCESSALLMODELS,\n PERM_UPDATEOWNMODEL,\n PERM_UPDATEDOMAINS,\n PERM_UPDATESETTINGS,\n PERM_UPDATEMODELS,\n PERM_UPDATEUSERS,\n // PERM_UPDATEROLES,\n PERM_UPDATEOWNUSER,\n PERM_ALLOWCASEOVERVIEW,\n PERM_ALLOWACCESSCASESFROMDOMAIN,\n PERM_ALLOWACCESSCASES,\n PERM_ALLOWSTARTCASES,\n PERM_ALLOWSAVECASE,\n PERM_ALLOWMISOWNCASES,\n PERM_ALLOWMISDOCUMENTS,\n // PERM_SAASCLIENTWRITABLE,\n // PERM_SAASCLIENTLOGICWRITABLE,\n // PERM_SAASMANAGEPUBLISHINGSERVERS,\n // PERM_SAASCLIENTWRITABLE,\n PERM_ALLOWDOWNLOADCASE // ,\n // PERM_MANAGEDATASOURCES\n ],\n viewer: [PERM_ALLOWMISDOMAIN],\n manager: [\n PERM_UPDATEOWNUSER,\n PERM_ALLOWCASEOVERVIEW,\n PERM_ALLOWACCESSCASESFROMDOMAIN,\n PERM_ALLOWACCESSCASES,\n PERM_ALLOWSAVECASE,\n PERM_ALLOWMISOWNCASES // ,\n // PERM_SAASCLIENTWRITABLE\n ],\n vieweradmin: [PERM_ALLOWMISALL, PERM_ALLOWMISDOMAIN, PERM_ALLOWMISDOCUMENTS],\n any: []\n};\n\nexport const permissions = () =>\n compose(\n either(\n prop(\"permissions\"),\n compose(role => oldperms[role] || oldperms[\"any\"], prop(\"role\"))\n ),\n userinfo\n )(null);\n\nexport const hasPermission = perm =>\n perm instanceof Array\n ? strictDifference(perm, permissions()).length === 0\n : includes(perm, permissions());\n\nexport const webadminMakesSense = permissions =>\n permissions.some(perm => perm.startsWith(\"update\"));\n", "/**\n * https://github.com/flesler/jquery.scrollTo\n * Copyright (c) 2007-2013 Ariel Flesler - afleslergmailcom | http://flesler.blogspot.com\n * Dual licensed under MIT and GPL.\n * @author Ariel Flesler\n * @version 1.4.6\n */\n(function ($) {\n var h = ($.scrollTo = function (a, b, c) {\n $(window).scrollTo(a, b, c);\n });\n h.defaults = {\n axis: \"xy\",\n duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1,\n limit: true\n };\n h.window = function (a) {\n return $(window)._scrollable();\n };\n $.fn._scrollable = function () {\n return this.map(function () {\n var a = this,\n isWin =\n !a.nodeName ||\n $.inArray(a.nodeName.toLowerCase(), [\n \"iframe\",\n \"#document\",\n \"html\",\n \"body\"\n ]) != -1;\n if (!isWin) return a;\n var b = (a.contentWindow || a).document || a.ownerDocument || a;\n return /webkit/i.test(navigator.userAgent) || b.compatMode == \"BackCompat\"\n ? b.body\n : b.documentElement;\n });\n };\n $.fn.scrollTo = function (e, f, g) {\n if (typeof f == \"object\") {\n g = f;\n f = 0;\n }\n if (typeof g == \"function\") g = { onAfter: g };\n if (e == \"max\") e = 9e9;\n g = $.extend({}, h.defaults, g);\n f = f || g.duration;\n g.queue = g.queue && g.axis.length > 1;\n if (g.queue) f /= 2;\n g.offset = both(g.offset);\n g.over = both(g.over);\n return this._scrollable()\n .each(function () {\n if (e == null) return;\n var d = this,\n $elem = $(d),\n targ = e,\n toff,\n attr = {},\n win = $elem.is(\"html,body\");\n switch (typeof targ) {\n case \"number\":\n case \"string\":\n if (/^([+-]=?)?\\d+(\\.\\d+)?(px|%)?$/.test(targ)) {\n targ = both(targ);\n break;\n }\n targ = $(targ, this);\n if (!targ.length) return;\n case \"object\":\n if (targ.is || targ.style) toff = (targ = $(targ)).offset();\n }\n $.each(g.axis.split(\"\"), function (i, a) {\n var b = a == \"x\" ? \"Left\" : \"Top\",\n pos = b.toLowerCase(),\n key = \"scroll\" + b,\n old = d[key],\n max = h.max(d, a);\n if (toff) {\n attr[key] = toff[pos] + (win ? 0 : old - $elem.offset()[pos]);\n if (g.margin) {\n attr[key] -= parseInt(targ.css(\"margin\" + b)) || 0;\n attr[key] -= parseInt(targ.css(\"border\" + b + \"Width\")) || 0;\n }\n attr[key] += g.offset[pos] || 0;\n if (g.over[pos])\n attr[key] += targ[a == \"x\" ? \"width\" : \"height\"]() * g.over[pos];\n } else {\n var c = targ[pos];\n attr[key] =\n c.slice && c.slice(-1) == \"%\" ? (parseFloat(c) / 100) * max : c;\n }\n if (g.limit && /^\\d+$/.test(attr[key]))\n attr[key] = attr[key] <= 0 ? 0 : Math.min(attr[key], max);\n if (!i && g.queue) {\n if (old != attr[key]) animate(g.onAfterFirst);\n delete attr[key];\n }\n });\n animate(g.onAfter);\n function animate(a) {\n $elem.animate(\n attr,\n f,\n g.easing,\n a &&\n function () {\n a.call(this, targ, g);\n }\n );\n }\n })\n .end();\n };\n h.max = function (a, b) {\n var c = b == \"x\" ? \"Width\" : \"Height\",\n scroll = \"scroll\" + c;\n if (!$(a).is(\"html,body\")) return a[scroll] - $(a)[c.toLowerCase()]();\n var d = \"client\" + c,\n html = a.ownerDocument.documentElement,\n body = a.ownerDocument.body;\n return Math.max(html[scroll], body[scroll]) - Math.min(html[d], body[d]);\n };\n function both(a) {\n return typeof a == \"object\" ? a : { top: a, left: a };\n }\n})(jQuery);\n", "/* global $, URLSearchParams */\n\nif (\"bb\" in window) {\n throw \"bb was already loaded\";\n}\nimport \"./lib/polyfills/url-search-params.js\";\nimport { token } from \"./lib/tokens.js\";\nimport { shouldExit } from \"./lib/case-exit.js\";\nimport { A11y } from \"./lib/a11y\";\nimport { Ajax, checkJSON } from \"./lib/ajax.js\";\nimport { BBI } from \"./lib/bbi.js\";\nimport { collectWithin, serializeQuestions } from \"./lib/collect-values.js\";\nimport { conf, propFinder } from \"./lib/conf\";\nimport { wControl, getControl } from \"./lib/control.js\";\nimport { validateInput } from \"./lib/control-validation.js\";\nimport { parseDate, humanDate } from \"./lib/dates\";\nimport { escapeHTML } from \"./lib/escape.js\";\nimport {\n editPolicy,\n mustUpdate,\n canEditEarlier\n} from \"./lib/feature-queries.js\";\nimport { createFormGroup } from \"./lib/form-groups.js\";\nimport \"./lib/form-widgets-definitions.js\";\nimport { setSettled } from \"./lib/settled.js\";\nimport { collectAttributes } from \"./lib/utils\";\nimport {\n any,\n both,\n complement,\n compose,\n either,\n find,\n has,\n ifElse,\n includes,\n map,\n path,\n pathEq,\n prop,\n propEq,\n propOr,\n tap,\n when\n} from \"./lib/functional\";\nimport { doGrouping, groupOuter } from \"./lib/groupings\";\nimport { Jumplist } from \"./lib/jumplist\";\nimport { fromApiServer } from \"./lib/location.js\";\nimport { Mode } from \"./lib/mode.js\";\nimport { Numerals } from \"./lib/numerals.js\";\nimport { notify } from \"./lib/notify.js\";\nimport { permissions, webadminMakesSense } from \"./lib/permissions.js\";\nimport { _ } from \"./lib/gettext.js\";\nimport { positionalFormat } from \"./lib/text-utils\";\nimport { urlutils } from \"./lib/url-utils.js\";\nimport Vars from \"./lib/vars.js\";\nimport \"./lib/$.scrollTo.js\";\n\n$(\"html\").removeClass(\"no-js\");\n\nconst arbitraryCoreProp = propFinder(conf, \"arbitrary.core\");\n/**\n * Copyright (c) 2010 Conrad Irwin MIT license.\n * Based loosely on original: Copyright (c) 2008 mkmanning MIT license.\n *\n * Parses CGI query strings into javascript objects.\n *\n * See the README for details.\n **/\n$.parseQuery = function (options) {\n var config = { query: window.location.search || \"\" },\n params = {};\n\n if (typeof options === \"string\") {\n options = { query: options };\n }\n $.extend(config, $.parseQuery, options);\n config.query = config.query.replace(/^\\?/, \"\");\n\n $.each(config.query.split(config.separator), function (i, param) {\n var pair = param.split(\"=\"),\n key = config.decode(pair.shift(), null).toString(),\n value = config.decode(pair.length ? pair.join(\"=\") : null, key);\n\n if (\n config.array_keys.test\n ? config.array_keys.test(key)\n : config.array_keys(key)\n ) {\n params[key] = params[key] || [];\n params[key].push(value);\n } else {\n params[key] = value;\n }\n });\n delete params[\"\"];\n return params;\n};\n$.parseQuery.decode = $.parseQuery.default_decode = function (string) {\n return decodeURIComponent((string || \"\").replace(/\\+/g, \" \"));\n};\n$.parseQuery.array_keys = function () {\n return false;\n};\n$.parseQuery.separator = \"&\";\n\n// thanks http://web.enavu.com/daily-tip/maxlength-for-textarea-with-jquery/\n$(document).on(\"keyup\", \"textarea[maxlength]\", function () {\n var $this = $(this);\n //get the limit from maxlength attribute\n var limit = parseInt($this.prop(\"maxlength\"));\n //get the current text inside the textarea\n var text = $this.val();\n //count the number of characters in the text\n var chars = text.length;\n\n //check if there are more characters then allowed\n if (chars > limit) {\n //and if there are use substr to get the text before the limit\n var new_text = text.substr(0, limit);\n\n //and change the current text with the new text\n $this.val(new_text);\n $this.addClass(\"bb-programmatically-changed\");\n window.setTimeout(function () {\n $this.removeClass(\"bb-programmatically-changed\");\n }, 1000);\n }\n});\n\nlet bb = { Mode, conf };\n\n/*** TEXT UTILITIES BEGIN ***/\n\n/******* compareVersions ******/\nfunction compareVersions(a, b) {\n var i, l, d;\n\n a = a.toLowerCase().split(/(\\d+)/);\n b = b.toLowerCase().split(/(\\d+)/);\n l = Math.min(a.length, b.length);\n\n for (i = 0; i < l; i++) {\n d = a[i] - b[i];\n if (isNaN(d)) {\n if (a[i] === b[i]) d = 0;\n else if (a[i] < b[i]) {\n d = -1;\n } else d = 1;\n }\n if (d !== 0) return d;\n }\n\n return a.length - b.length;\n}\n\nfunction compareVersionsOn(prop, a, b) {\n return compareVersions(String(a[prop]), String(b[prop]));\n}\n/*** TEXT UTILITIES END ***/\n\n/*** DATEPICKER BEGIN ***/\n\n// Defaults jQuery datepicker BEGIN\n$(function () {\n $.datepicker.setDefaults(\n $.extend(\n true,\n $.datepicker._defaults,\n {\n showAnim: \"\",\n changeYear: true,\n changeMonth: true,\n yearRange: \"c-150:c+150\"\n }, // RFC\n arbitraryCoreProp(\"datepicker.defaults\") || {},\n { altFormat: \"yy-mm-dd\" }\n )\n );\n});\n// Defaults jQuery datepicker END\n\n/*** DATEPICKER END ***/\n\n/*** MISC jQUERY UTILITIES BEGIN ***/\n\n// thanks http://jqueryfordesigners.com/video.php?f=queue.flv\n$.fn.pause = function (n) {\n return this.queue(function () {\n var el = this;\n window.setTimeout(function () {\n return $(el).dequeue();\n }, n);\n });\n};\n\n$.fn.sort = function () {\n return this.pushStack($.makeArray([].sort.apply(this, arguments)));\n};\n\n$.fn.extend({\n insertAtCaret: function (myValue) {\n return this.each(function () {\n if (document.selection) {\n //For browsers like Internet Explorer\n this.focus();\n var sel = document.selection.createRange();\n sel.text = myValue;\n this.focus();\n } else if (this.selectionStart || this.selectionStart == \"0\") {\n //For browsers like Firefox and Webkit based\n var startPos = this.selectionStart;\n var endPos = this.selectionEnd;\n var scrollTop = this.scrollTop;\n this.value =\n this.value.substring(0, startPos) +\n myValue +\n this.value.substring(endPos, this.value.length);\n this.focus();\n this.selectionStart = startPos + myValue.length;\n this.selectionEnd = startPos + myValue.length;\n this.scrollTop = scrollTop;\n } else {\n this.value += myValue;\n this.focus();\n }\n return this;\n });\n },\n selectAllText: function () {\n var el = this.get(0);\n if (el) {\n if (typeof el.selectionStart === \"number\") {\n (el.selectionStart = 0), (el.selectionEnd = el.value.length);\n } else if (typeof el.createTextRange !== \"undefined\") {\n el.focus();\n var range = el.createTextRange();\n range.select();\n }\n }\n return this;\n }\n});\n\n/** Add resizeEnd event.\n *\n * Thanks Carlos Martinez on\n * http://stackoverflow.com/questions/2854407/\n * javascript-jquery-window-resize-how-to-fire-after-the-resize-is-completed\n *\n * I did put this in a closure so as not to pollute the global\n * namespace.\n */\n(function () {\n var _to = null,\n _delay = 500;\n $(window).on(\"resize\", function () {\n if (_to) window.clearTimeout(_to);\n _to = window.setTimeout(function () {\n $(this).trigger(\"resizeEnd\");\n }, _delay);\n });\n})();\n/*** MISC jQUERY UTILITIES END ***/\n\n/*** KEYMAP BEGIN ***/\nvar KEYS = {\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n SPACE: 32,\n ESC: 27,\n UP: 38,\n DOWN: 40,\n KP_RADIX: 110\n};\n\n// Navigation\nvar maps = {\n questions: function (ev) {\n if (!Mode.get(\"hasModel\")) return undefined;\n if (ev.originalEvent.target && ev.originalEvent.target.tagName === \"TR\") {\n if (!gridKeys(ev)) return false;\n }\n var $target = $(ev.target);\n switch (ev.keyCode) {\n case KEYS.ENTER:\n if ($target.hasClass(\"bb-prior\")) {\n step(\"prior\");\n return false;\n }\n if ($target.hasClass(\"bb-skip\")) {\n step(\"skip\");\n return false;\n }\n if (!Mode.get(\"hasNoNext\")) {\n if (\n ev.shiftKey ||\n $target.hasClass(\"bb-next\") ||\n $target.is('input[type=\"text\"]') ||\n $target.is('input[type=\"radio\"]') ||\n $target.is('input[type=\"checkbox\"]') ||\n $target.is('input[type=\"checkbox\"]') ||\n $target.is('select[data-type=\"listbox\"]') ||\n $target.is(\"fieldset\")\n ) {\n step(\"next\");\n return false;\n }\n if (ev.target.tagName === \"TEXTAREA\") {\n ev.stopImmediatePropagation();\n break;\n }\n }\n if (ev.target.tagName === \"A\") {\n if (ev.target.href.substr(-1) !== \"#\")\n // A true link\n break;\n }\n break;\n case KEYS.SPACE:\n if ($target.is('[role=\"button\"]')) {\n $target.trigger(\"click\");\n return false;\n }\n break;\n case KEYS.BACKSPACE:\n return dispatchBackspace(ev);\n // Escape from modal window\n case KEYS.ESC:\n $(\".closable\").hide();\n break;\n case KEYS.KP_RADIX:\n if ($target.data(\"type\") === \"numedit\") {\n $target.insertAtCaret(_(\"__radixpoint__\", \".\"));\n return false;\n }\n }\n return undefined;\n }\n};\n\nfunction gridKeys(ev) {\n var target = ev.originalEvent.target,\n $target = $(target);\n switch (ev.keyCode) {\n case KEYS.UP:\n $(ev.target).prev().trigger(\"focus\");\n return false;\n case KEYS.DOWN:\n case KEYS.TAB:\n if ($target.find(\":input, a\").length !== 1) {\n return true;\n }\n if (\n $target.find(\n \"a, :input\" + ':not([type=\"checkbox\"])' + ':not([type=\"radio\"])'\n ).length\n ) {\n return true;\n }\n if (ev.shiftKey) $target.prev().trigger(\"focus\");\n else $target.next().trigger(\"focus\");\n return false;\n case KEYS.SPACE:\n var $inputs = $target.find(\n 'input[type=\"checkbox\"], ' + 'input[type=\"radio\"]'\n ),\n $input = $inputs.filter(\":nth(0)\");\n if ($inputs.length > 2) return true;\n else $input.prop(\"checked\", !$input.is(\":checked\"));\n return false;\n }\n return true;\n}\n\nfunction aintTheEnterKey(ev) {\n return ev.type === \"keydown\" && ev.keyCode !== KEYS.ENTER;\n}\n\nfunction dispatchBackspace(ev) {\n if (!ev.shiftKey) return true;\n step(\"prior\");\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n}\n\n$(document).on(\"keydown\", maps.questions);\n\n$(document).on(\"keydown\", \".bb-btn\", function (ev) {\n if (ev.keyCode === 13) {\n // Dispatch to click handler on ENTER.\n $(this).trigger(\"click\");\n return false;\n }\n return true;\n});\n/*** KEYMAP END ***/\n\n/*** ROLES BEGIN ***/\n\nfunction setRole() {\n var userinfo = Vars.getVar(\"userinfo\") || {};\n\n Mode.toggle(\"isAdmin\", userinfo.role === \"administrator\");\n Mode.toggle(\"isUser\", userinfo.role === \"user\");\n Mode.toggle(\"isViewer\", userinfo.role === \"viewer\");\n Mode.toggle(\"isVieweradmin\", userinfo.role === \"vieweradmin\");\n Mode.toggle(\"isGuest\", userinfo.role === \"guest\");\n Mode.toggle(\"isAnonymous\", userinfo.fullname === \"anonymous\");\n const perms = permissions();\n perms.forEach(p => {\n Mode.toggle(p, true, false);\n });\n Mode.toggle(\"webadminMakesSense\", webadminMakesSense(perms), false);\n}\n\n/*** ROLES END ***/\n\n/*** INITIALIZATION BEGIN ***/\n\n$(function () {\n $(\"body\").attr(\"data-modus\", \"none\");\n\n document.addEventListener(\"submit\", function (ev) {\n var action = ev.target.getAttribute(\"action\");\n if (!action) {\n ev.preventDefault();\n return false;\n }\n return undefined;\n });\n\n $(document).on(\"submit\", \"form#bb-login\", function () {\n // Serialize form as array\n var params = $(this).serializeArray(),\n action = this.getAttribute(\"action\");\n // Trim values and set the desired format\n $.each(params, function (_, val) {\n if (val.name === \"fmt\") val.value = \"json\";\n else val.value = (val.value || \"\").trim();\n });\n $.postJSON(\n action,\n [$.param(params), window.location.search.substring(1)].join(\"&\")\n );\n return false;\n });\n\n var formfocus = window.setTimeout(function () {\n $(\"form#bb-login input[name=username]\").trigger(\"focus\");\n }, 0);\n\n bb.Router = function router(params) {\n if (\n (typeof params.username !== \"undefined\" &&\n typeof params.password !== \"undefined\") ||\n params.uniqueid ||\n params.modelid ||\n params.modelname ||\n params.dbname ||\n params.state ||\n params.request ||\n params.bsid\n ) {\n Mode.set(\"isDeepLinked\");\n hideLogin();\n if (params.bsid) new BBI().authenticate();\n else if (!bb.autologinrewritten) {\n var action;\n if (\n typeof params.username !== \"undefined\" &&\n typeof params.password !== \"undefined\"\n )\n action = \"login\";\n if (params.uniqueid) action = \"menu\";\n // Studio deeplink\n if (typeof params.uniqueid === \"undefined\" && params.modelid)\n action = \"open\";\n if (params.uniqueid && (params.modelid || params.dbname))\n action = \"action\";\n if (params.modelname) action = \"open\";\n if (params.request) {\n action = params.request;\n delete params.request;\n }\n $.postJSON(action, $.param(params) + \"&fmt=json\").then(setSettled);\n }\n window.clearTimeout(formfocus);\n }\n };\n\n if (window.location.search.length > 1) {\n bb.Router($.parseQuery());\n } else setSettled();\n\n $(document).on(\"bb:renderQuestions\", renderGroups);\n});\n\n/**\n * Set the effect to be used when re-showing login form.\n *\n * @param {String} effect One of 'show', 'fadeIn' or 'slideDown'\n */\nfunction safeResetEffect(effect = \"slideDown\") {\n if (typeof effect !== \"string\") {\n console.warn(\"Argument effect should be a string\");\n return \"slideDown\";\n }\n if (!/^(show|fadeIn|slideDown)$/.test(effect)) {\n console.warn(\"Invalid effect: \" + effect);\n return \"slideDown\";\n }\n return effect;\n}\n\nresetLogin.effect = safeResetEffect(\n arbitraryCoreProp(\"loginResetEffect\", \"slideDown\")\n);\n\nfunction resetLogin() {\n $(\"#bb-login\")[resetLogin.effect]();\n}\n\n/*** INITIALIZATION END ***/\n/*** JUMPLIST BEGIN ***/\n$(document).on(\"change\", \".bb-jumplist-dropdown select\", function () {\n bb.gotonode($(this).val());\n});\n\n$(document).on(\"click\", \"[data-groupid]\", function () {\n var $this = $(this),\n groupid = $this.attr(\"data-groupid\");\n bb.gotonode(groupid);\n});\n\n/*** JUMPLIST END ***/\n\n/*** CASES BEGIN ***/\n$.fn.deleteme = function () {\n if (\n confirm(\n _(\"Delete\") + \" \" + (this.length == 1 ? _(\"case\") : _(\"cases\")) + \"?\"\n )\n ) {\n return this.each(function () {\n var me = $(this);\n if (me.hasClass(\"bb-case\")) {\n var casus = {\n dbname: me.data(\"dbname\"),\n sessionid: me.data(\"sessionid\")\n };\n deleteCase(casus.dbname, casus.sessionid, Vars.getVar(\"uniqueid\"));\n if (isCaseCurrent(casus)) {\n $(\"#bb-q\").empty();\n Mode.unset(\"hasModel\");\n }\n }\n });\n }\n return this;\n};\n\nvar Cases = (function () {\n var _cases = [];\n var _unfilteredcases = [];\n var _MAX = 10;\n var _idx = 0;\n var _filtertext = _(\"filter cases by name\");\n\n function update(cases) {\n _unfilteredcases = cases || [];\n _cases = cases || [];\n if (cases && cases.length > 0) {\n cases.sort(function (a, b) {\n return a.dateenter > b.dateenter ? -1 : 1;\n });\n var $controls = $(\"#bb-cases-controls\");\n if ($controls.is(\":empty\")) {\n $controls.html(\n ' ' +\n ' ' +\n ' 1-10' +\n ' ' +\n ' ' +\n ''\n );\n $controls.attr(\"data-unbound\", true);\n }\n if ($controls.attr(\"data-unbound\")) {\n $controls.removeAttr(\"data-unbound\");\n $(\"#bb-cases-prev\").click(prevSlice);\n $(\"#bb-cases-next\").click(nextSlice);\n $(\"#bb-cases-first\").click(showSlice.bind(null, 0));\n $(\"#bb-cases-last\").click(\n showSlice.bind(null, Math.floor((_cases.length - 1) / _MAX))\n );\n\n $(\"#bb-cases-filter\", $controls).keyup(function (ev) {\n if (ev.keyCode === KEYS.TAB) return true;\n var $this = $(this),\n val = ($this.val() || \"\").trim();\n if (val != \"\") {\n var re = new RegExp(val, \"i\");\n _cases = _unfilteredcases.filter(function (e) {\n return re.test(e.name);\n });\n } else _cases = _unfilteredcases;\n showSlice(0);\n return false;\n });\n }\n showSlice(0);\n } else {\n empty();\n }\n }\n function showSlice(idx) {\n _idx = idx;\n var caselen = _cases.length;\n\n $(\"#bb-cases .bb-case\").remove();\n\n $(_cases.slice(_idx * _MAX, (_idx + 1) * _MAX)).each(function (i) {\n wCasus(_cases[i + _idx * _MAX]).appendTo(\"#bb-cases-table\");\n });\n if (_cases.length) {\n $(\n '' +\n '\" +\n \"\" +\n \"\" +\n (bb.Plugins.newname\n ? '' +\n '' +\n '' +\n \"\" +\n \"\"\n : \"\") +\n \"\"\n ).prependTo(\"#bb-cases-table\");\n\n // Some browsers do leave thead and tbody in place, even when\n // $().empty-ing the table, so:\n $(\"#bb-cases-table thead~thead\").remove();\n }\n\n $(\"#bb-cases-currentslice\")\n .text(\n _idx * _MAX +\n 1 +\n \"-\" +\n Math.min(caselen, (_idx + 1) * _MAX) +\n \"/\" +\n caselen\n )\n .attr(\n \"aria-label\",\n positionalFormat(\n _(\"results {0} to {1} from {2}\"),\n _idx * _MAX + 1,\n Math.min(caselen, (_idx + 1) * _MAX),\n caselen\n )\n );\n\n $(\"#bb-cases-prev, #bb-cases-first\").prop(\"disabled\", _idx == 0);\n var hasNoNext = _idx == Math.floor((caselen - 1) / _MAX);\n $(\"#bb-cases-next, #bb-cases-last\").prop(\"disabled\", hasNoNext);\n\n $(\"#bb-cases\").trigger(\"bb:rendered\");\n }\n function nextSlice() {\n var divident = Math.floor(_cases.length / _MAX);\n showSlice(Math.min(_idx + 1, divident));\n }\n function prevSlice() {\n showSlice(Math.max(_idx - 1, 0));\n }\n function empty() {\n $(\"#bb-cases-table\").empty();\n }\n return {\n empty: empty,\n update: update\n };\n})();\n\nfunction howManyColumns() {\n var base = 2;\n return (\n $.grep([\"showreport\", \"showdeleteinmenu\", \"showcopycase\"], Vars.getVar)\n .length + base\n );\n}\n\nfunction wCasus(casus) {\n var cas = $.extend(\n {},\n casus,\n // Turn into JavaScript dates, and normalize as good as we can:\n {\n dateenter: casus.dateenter && parseDate(casus.dateenter),\n datecreate:\n Vars.getVar(\"showdatecreated\") &&\n casus.datecreate &&\n parseDate(casus.datecreate)\n },\n {\n showcopycase: Vars.getVar(\"showcopycase\"),\n showdeleteinmenu: Vars.getVar(\"showdeleteinmenu\")\n }\n );\n if (Vars.getVar(\"showreport\")) cas.reporturl = urlutils.caseReport(casus);\n // Turn into JavaScript dates, and normalize as good as we can:\n if (cas.datecreate) cas.firstrun = humanDate(cas.datecreate);\n if (cas.dateenter) cas.lastaccess = humanDate(cas.dateenter);\n var html = bb.createCaseItem(cas);\n\n var $case = $(html);\n\n $case.find(\".bb-case-name\").bind(\"click keydown\", function (ev) {\n if (aintTheEnterKey(ev)) return;\n Ajax.replace({\n url: \"action\",\n data: {\n dbname: casus.dbname,\n sessionid: casus.sessionid,\n uniqueid: Vars.getVar(\"uniqueid\"),\n fmt: \"json\"\n }\n });\n });\n $case.find(\".bb-case-copy\").bind(\"click keydown\", function (ev) {\n if (aintTheEnterKey(ev)) return;\n Ajax.replace({\n url: \"action\",\n data: {\n dbname: casus.dbname,\n templateindex: casus.sessionid,\n uniqueid: Vars.getVar(\"uniqueid\"),\n fmt: \"json\"\n }\n });\n });\n $case.data(\"sessionid\", casus.sessionid);\n $case.data(\"dbname\", casus.dbname);\n return $case;\n}\n\nbb.createCaseItem =\n bb.createCaseItem ||\n function (casus) {\n var dateTitle,\n dateSpan = \"\",\n copySpan = \"\",\n reportSpan = \"\",\n deleteSpan = \"\",\n classes = [\"bb-case\"];\n dateTitle = _(\"Last opened\") + \": \" + casus.lastaccess;\n if (Vars.getVar(\"showdatecreated\")) {\n dateTitle += \", \" + _(\"created\") + \": \" + casus.firstrun;\n }\n dateSpan =\n '' +\n casus.lastaccess +\n \"\";\n if (Vars.getVar(\"showreport\")) {\n reportSpan =\n '' +\n '' +\n ' ' +\n _(\"report\") +\n \"\";\n }\n if (Vars.getVar(\"showdeleteinmenu\")) {\n deleteSpan =\n \"\" +\n '\" +\n \"\";\n }\n\n if (Vars.getVar(\"showcopycase\")) {\n copySpan =\n \"\" +\n '\" +\n \"\";\n }\n\n if (isCaseCurrent(casus)) {\n classes.push(\"current\");\n }\n\n return (\n '' +\n \"\" +\n '\" +\n dateSpan +\n reportSpan +\n deleteSpan +\n copySpan +\n \"\"\n );\n };\n\nfunction isCaseCurrent(casus) {\n return (\n casus.sessionid == Vars.getVar(\"sessionid\") &&\n casus.dbname == Vars.getVar(\"dbname\")\n );\n}\n\nfunction deleteCase(dbname, sessionid, uniqueid) {\n // Ajax.last && Ajax.last.abort();\n // todo: voeg nieuwe waarden toe aan object.\n Ajax.post({\n url: \"delete\",\n data: {\n dbname,\n sessionid,\n uniqueid,\n fmt: \"json\"\n }\n });\n}\n\n$(document).on(\"click keydown\", \".bb-case-delete\", function (ev) {\n if (ev.type === \"keydown\" && ev.keyCode !== KEYS.ENTER) return;\n $(this).parents(\".bb-case\").deleteme();\n});\n\nfunction newcase(dbname, newname, params = {}) {\n const data = Object.assign(\n {},\n Object(params) === params && params,\n {\n dbname: dbname,\n uniqueid: Vars.getVar(\"uniqueid\"),\n step: \"open\",\n fmt: \"json\"\n },\n newname && { newname }\n );\n if (Vars.getVar(\"sessionid\"))\n step(\"exit\", function (jsondata) {\n Ajax.busy = false;\n if (jsondata.status === \"Ready\") {\n Ajax.replace({ data: data });\n }\n });\n else {\n Ajax.replace({ data: data });\n }\n}\n\n$(document).on(\"click keydown\", \".bb-newname\", function (ev) {\n if (ev.type === \"click\" || aintTheEnterKey(ev)) ev.stopPropagation();\n return true;\n});\n\n$(document).on(\"click keydown\", \".bb-newcase\", function (ev) {\n if (aintTheEnterKey(ev)) return true;\n const $this = $(this),\n dbname =\n this.getAttribute(\"data-bb:dbname\") ||\n $this.parents(\".bb-model\").attr(\"data-bb:dbname\"),\n newname = $this.find(\".bb-newname\").val(),\n params = collectAttributes(\"data-bb:params-\", this);\n newcase(dbname, newname, params);\n return false;\n});\n\n/*** CASES END ***/\n\n/*** MODELS BEGIN ***/\nvar Models = {\n selector: \"#bb-models\",\n modelitem: function (model) {\n model.uniqueid = Vars.getVar(\"uniqueid\");\n return (\n (bb.createModelItem && bb.createModelItem(model)) ||\n (function (model) {\n var dbname = model.dbname;\n return (\n '' +\n \"\" +\n '\" +\n \"\" +\n '\" +\n \"\"\n );\n })(model)\n );\n },\n // Enhance Model with extra computed properties:\n enhanceModel: function (model) {\n model._selectedclass = model.selected ? \"selected\" : \"\";\n model._nicename = model.modelname.replace(/_/g, \" \");\n if (model.lastupdate) {\n model._date = parseDate(model.lastupdate);\n model._humandate = humanDate(model._date);\n }\n if (model.modelinfo) {\n model._liner_notes = model.modelinfo.split(/(?:\\r?\\n|\\\\r\\\\n|\\\\n)/);\n }\n if (model.authorinfo) {\n model._author_notes = model.authorinfo.split(/(?:\\r?\\n|\\\\r\\\\n|\\\\n)/);\n }\n return model;\n },\n update: function (data) {\n var models = data.models;\n models.sort(compareVersionsOn.bind(null, \"modelname\"));\n\n var explicit = models.filter(function (m) {\n return typeof m[\"order\"] === \"number\";\n });\n if (explicit[0]) {\n explicit.sort(function (a, b) {\n return (\n a[\"order\"] - b[\"order\"] ||\n compareVersions(String(a[\"order\"]), String(b[\"order\"]))\n );\n });\n models = models.filter(function (m) {\n // absent (undefined) or the empty string\n return typeof m[\"order\"] !== \"number\";\n });\n models = explicit.concat(models);\n }\n\n this.empty();\n var self = this;\n $(this.selector).append(\n $.map(models, function (model) {\n return self.modelitem(self.enhanceModel(model));\n })\n );\n },\n empty: function () {\n $(this.selector).empty();\n }\n};\n\n$(document).on(\"click keydown\", \".bb-model-cases\", function (ev) {\n if (aintTheEnterKey(ev)) return;\n var $this = $(this),\n dbname =\n this.getAttribute(\"data-bb:dbname\") ||\n $this.parents(\".bb-model\").attr(\"data-bb:dbname\");\n Ajax.replace({\n url: \"menu\",\n data: {\n dbname: dbname,\n uniqueid: Vars.getVar(\"uniqueid\"),\n fmt: \"json\"\n },\n dataType: \"json\"\n });\n});\n/*** MODELS END ***/\n\n/*** NAVIGATION, REQUESTS BEGIN ***/\n\n/**\n * Request 'action'\n *\n * @param {String} direction One of 'prior', 'next', 'exit', 'runtonode', 'gotonode', 'update' or 'updatemis'\n * @param {Function} cb Callback function to run on succes, defaults to checkJSON()\n * @param {Object} options Object, with possible keys: 'fullnodename' : 'graph.node',\n * 'groupid' : 'groupid-iteration',\n * 'sync' : Boolean\n */\nfunction step(direction, cb, options = {}) {\n Validation.reset();\n if (Ajax.busy) return;\n\n Ajax.last && Ajax.last.abort();\n Ajax.direction = direction;\n Ajax.row = Ajax.direction === \"update\" && options && options.update;\n\n try {\n if (\n [\"next\", \"skip\"].includes(direction) &&\n $(\"#bb-q .group:not([disabled]) .validatable:visible\")\n .validate({ silent: false, justhide: false, requestUpdate: false })\n .filter(\"[aria-invalid=true]\").length > 0\n )\n throw new Error(\"There are errors, please double check your answers.\");\n\n const container = either(prop(\"groupElt\"), () =>\n document.querySelector(\".group.selected\")\n )(options);\n const screenid = Vars.getVar(\"screenid\");\n const groupid = $.data(container).groupid;\n Ajax.groupid = groupid;\n\n // todo: voeg nieuwe waarden toe aan object.\n if (!(direction === \"prior\" && Mode.get(\"hasNoPrior\"))) {\n const ajaxOptions = {\n async: true && (!options || !options.sync), //See noted render() as a reason for this.\n data: [\n \"step=\" + direction,\n direction === \"update\" && options && options.update\n ? \"update=\" + encodeURIComponent(options.update)\n : \"\",\n direction === \"runtonode\"\n ? \"fullnodename=\" + options.fullnodename\n : \"\",\n direction === \"gotonode\" ? \"groupid=\" + options.groupid : \"\",\n Vars.querify(Vars.SESSION_KEYS),\n \"screenid=\" + groupid,\n \"fmt=json\",\n collectWithin({\n container,\n params: new URLSearchParams(options.extraparams)\n })\n .toString()\n .replace(/\\r?\\n/g, \"%0D%0A\")\n ]\n .filter(Boolean)\n .join(\"&\"),\n success: function (data, status, req) {\n data._direction = direction;\n data._passed = options && options.pass;\n data._isUpdate = propEq(\"isUpdate\", true, options);\n // if (direction === \"update\" && groupid !== screenid && editPolicy(conf) === \"stay\") {\n // container.classList.remove(\"unselected\");\n // container.classList.add(\"selected\");\n\n // // Do not render, just update\n // Ajax.release();\n // Vars.setVars(data);\n // updateDynProps(data);\n // } else\n\n if (groupid !== screenid && editPolicy(conf) === \"return\") {\n // Do not render, we're going back again. This would be\n // nice, but we do need some values to be rerendered -\n // warranting redraw of nodes after the edited one.\n\n Ajax.release();\n Vars.setVars(data);\n } else if (options && options.cbIsAdditional) {\n options.cbIsAdditional === \"before\" && cb && cb(data, status, req);\n checkJSON(data, status, req);\n options.cbIsAdditional !== \"before\" && cb && cb(data, status, req);\n } else {\n (cb || checkJSON)(data, status, req);\n }\n if (\n Ajax.row &&\n groupid === screenid &&\n compose(\n when(Boolean, any(propEq(\"dynamic\", true))),\n prop(\"groups\")\n )(data)\n ) {\n console.info(\n \"Requesting an extra update for dynprops. Should be handled by server instead\"\n );\n window.setTimeout(bb.update, 0);\n }\n }\n };\n\n if (\n screenid !== undefined &&\n direction !== \"update\" &&\n groupid !== screenid\n ) {\n console.warn(\n `groupid ${groupid} is not the current screenid ${screenid}, but no update was requested`\n );\n }\n if (direction === \"update\" && groupid !== screenid) {\n // Hold your breath, first go back, so as to put server pointer at the right node.\n bb.gotonode(\n // Will get the .selected\n groupid,\n data => {\n Ajax.release();\n Vars.setVars(data); // Sets screenid\n Ajax.direction = direction;\n // Is always \"update\", actually;\n Ajax.row = direction === \"update\" && options && options.update;\n Ajax.groupid = groupid;\n const req = Ajax.post(ajaxOptions); // Gets the original callback, if any.\n if (editPolicy(conf) === \"return\")\n req.then(data => {\n Ajax.release();\n Vars.setVars(data);\n\n bb.gotonode(\n screenid,\n () => {\n // The gotonode invocation just overwrote the direction and row.\n Ajax.direction = direction;\n Ajax.row =\n direction === \"update\" && options && options.update;\n if (!Ajax.row) cb && cb();\n },\n {\n cbIsAdditional: \"before\",\n groupElt: container,\n isUpdate: true\n }\n );\n });\n },\n { sync: false, cbIsAdditional: false }\n );\n } else {\n Ajax.post(ajaxOptions);\n }\n }\n } catch (e) {\n $(document).trigger(\"bb:userError\", e.message);\n A11y.log(_(e.message));\n }\n}\n\nlet lastUpdateRequest;\n\nfunction requestDynProps(input) {\n if (Ajax.busy) return;\n\n var thisUpdateRequest;\n\n Ajax.last && Ajax.last.abort();\n Ajax.direction = \"update\";\n // Ajax.row = Ajax.direction === 'update' && options && options.update;\n\n const ajaxOptions = {\n async: true,\n data: [\n \"step=update\",\n Vars.querify(Vars.NAV_KEYS),\n \"fmt=json\",\n serializeQuestions()\n ]\n .filter(Boolean)\n .join(\"&\"),\n success: (...args) => {\n if (thisUpdateRequest === lastUpdateRequest) {\n $(document).trigger(\"bb:preHandleData\", ...args);\n updateDynProps(args[0], input);\n }\n }\n };\n lastUpdateRequest = thisUpdateRequest = Ajax.post(ajaxOptions);\n}\n\n// bb:prePost handler always goes off on bb.ajax.post.\n$(document).on(\"bb:prePost\", function (event, options) {\n if (includes(options.url, [\"action\", \"open\", \"bbisreturns\"]))\n if (!includes(Ajax.direction, [\"update\", \"updatemis\"]))\n $(document).trigger(\"bb:preStep\", options);\n});\n\n// bb:preStep handler goes off after user-initiated, possibly\n// expensive, actions.\n$(document).on(\"bb:preStep\", function () {\n Ajax.busy = true;\n // Hide lingering calendars\n $(\".group.selected .hasDatepicker\").datepicker(\"hide\");\n A11y.log(\"\");\n});\n\n// Save\n$(document).on(\"click\", \".bb-save\", function () {\n step(\"save\", null);\n});\n\n// Update\n$(document).on(\"click\", \"[name=update]\", function (ev) {\n step(\"update\", null, {\n update: $(this).val(),\n groupElt: ev.target.closest(\".group\")\n });\n});\n\n// Prior\n$(document).on(\"click\", \".bb-prior\", function () {\n step(\"prior\");\n});\n\n// Next\n$(document).on(\"click\", \".bb-next\", function (ev) {\n bb.next();\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n});\n\n// Skip\n$(document).on(\"click\", \".bb-skip\", function (ev) {\n bb.skip();\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n});\n\n$(document).on(\"keydown\", \".group a\", function (ev) {\n if (\n ev.shiftKey &&\n ev.keyCode === KEYS.ENTER &&\n ev.target.href.substr(-1) !== \"#\"\n ) {\n // true link BUT SHIFT + ENTER\n bb.next();\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n }\n return true;\n});\n\n// Close\n$(document).on(\"click\", \".bb-close\", function () {\n logout();\n self.close();\n $(\"body\").html(_(\"You may now safely close this window\"));\n});\n\n// Restart\n$(document).on(\"click\", \".bb-restart\", function (event) {\n if (\n \"noconfirm\" in event.currentTarget.dataset ||\n confirm(_(\"Are you sure? This will reset all values.\"))\n )\n bb.restart();\n return false;\n});\n\n/**\n * Log out\n *\n * @param {Boolean} ev Either a jQuery event or not\n * @param {Function} cb Callback function to be run after logout.\n * Supercedes default action on Ajax request. @see Ajax.post.\n */\n\nconst timedOutResponse = () => ({\n error: {\n code: 9 //Faults.CODES.cWebSessionTimeOut\n }\n});\n\nfunction logout(ev, cb) {\n if (Vars.getVar(\"uniqueid\")) {\n exit(function () {\n const options = {\n url: \"logout\",\n data: \"fmt=json&\" + Vars.querify(\"uniqueid\"),\n async: false\n };\n // When called directly, which\n if (cb instanceof Function) {\n options.success = options.error = cb;\n }\n Ajax.post(options);\n });\n } else {\n console && console.info && console.info(\"Fake logging out, ID is missing\");\n const mockResponse = timedOutResponse();\n ((cb instanceof Function && cb) || checkJSON)(mockResponse, 200, {\n responseJSON: mockResponse,\n responseText: JSON.stringify(mockResponse)\n });\n }\n return false;\n}\n\n$(document).on(\"click\", \".bb-logout\", logout);\n$(document).on(\"keydown\", \".bb-logout\", function (ev) {\n if (ev.keyCode !== KEYS.ENTER && ev.keyCode !== KEYS.SPACE) return true;\n logout(ev);\n return false;\n});\n\n/** Exit\n *\n * Exit the current case;\n * @param {Function} fun Function to execute after having exited.\n * If exiting isn't necessary, still execute fun.\n */\nfunction exit(fun, sync = true) {\n if (typeof fun !== \"function\")\n // Could be an event object on .bb-stop\n fun = undefined;\n if (shouldExit()) {\n step(\"exit\", fun, { sync });\n } else fun && fun();\n}\n\n$(document).on(\"click\", \".bb-stop\", exit);\n\n// Request 'getuserinfo'\nfunction getUserInfo() {\n $.postJSON(\"getuserinfo\", Vars.querify(\"uniqueid\") + \"&fmt=json\");\n}\n\n/*** NAVIGATION, REQUESTS END ***/\n\n/*** MENU BEGIN ***/\n\nfunction setupMenu() {\n $(\".bb-settings\").attr({ target: \"blank\" });\n}\n\n// Open WebAdmin (in new page)\nfunction openSettings() {\n var href = fromApiServer(\"webadmin\" + \"?\" + Vars.querify(\"uniqueid\"));\n window.open(href);\n return false;\n}\n\n$(document).on(\"click\", \".bb-settings\", openSettings);\n$(document).on(\"keydown\", \".bb-settings\", function (ev) {\n if (ev.keyCode !== KEYS.ENTER && ev.keyCode !== KEYS.SPACE) return true;\n openSettings(ev);\n return false;\n});\n\n/** menu\n *\n * Open menu (model overview)\n * @param {String|Object|undefined} creds Optional credentials,\n * defaults to fmt:json and uniqueid\n */\nfunction menu(creds) {\n return $.postJSON(\n \"menu\",\n creds || {\n fmt: \"json\",\n uniqueid: Vars.getVar(\"uniqueid\")\n }\n );\n}\n\n/** exitthenmenu\n *\n * Exit a case, then open a menu\n * @param {Event} ev Optional event whose propagation will be stopped\n */\nfunction exitthenmenu(ev) {\n exit(function () {\n menu();\n });\n ev && ev.stopPropagation && ev.stopPropagation();\n}\n\n$(document).on(\"click\", \".bb-openmodels\", exitthenmenu);\n$(document).on(\"keydown\", \".bb-openmodels\", function (ev) {\n if (ev.keyCode !== KEYS.ENTER) return;\n exitthenmenu(ev);\n});\n\n/*** MENU END ***/\n\n/*** MISC UI BEGIN ***/\n\nfunction hideLogin() {\n $(\"form#bb-login\").hide();\n}\n\n/**\n * Simple class toggling to implement collapsing/expanding widgets.\n *\n * Needs CSS styling and / or Event handler registered on custom\n * jQuery 'bb:collapsing' Event.\n */\n$(document).on(\"click keydown\", \".bb-collapsable .bb-collapser\", function (ev) {\n if (aintTheEnterKey(ev) || ev.shiftKey) return true;\n $(this)\n .closest(\".bb-collapsable\")\n .toggleClass(\"bb-collapsed\")\n .trigger(\"bb:collapsing\");\n return false;\n});\n\n/*** MISC UI END ***/\n\n/*** API FIX BEGIN ***/\nvar Faults = new (function Faults() {\n var CODES = {\n cException: 1,\n cHTMLFormLoadCaseNotFound: 2,\n cHTMLMenuFileNotFound: 3,\n cWebModelIDDifferent: 4,\n cWebPleaseLogin: 5,\n cGetFileNotAllowed: 6,\n cGetDocumentNotFound: 7,\n cUMWrongUserNamePassword: 8,\n cWebSessionTimeOut: 9,\n cWebNoModelID: 10,\n cWebIllegalAccess: 11,\n cWebModelNotFound: 12,\n cWebCaseIsRunning: 13,\n cEngineLoadCaseFailed: 14, // Was: 3\n cEngineUpgrading: 15,\n cEngineNoInterfacesToShow: 16,\n cEngineLoadCaseFailedNotFound: 17,\n cEngineLoadCaseFailedWrongType: 18,\n cEngineLoadCaseFailedWrongData: 19,\n cWebOpenIsCalledWithUniqueID: 20,\n cTechGraphVizNotInstalled: 21,\n cGraphVizSessionNotFound: 22,\n cUMUserNotFound: 23,\n cUMModelNotFound: 24,\n cUMCaseNotFound: 25,\n cWebAdminNotAllowed: 26,\n cEngineGotoNodeFailed: 27,\n cPreviewNoCaseFound: 28,\n cTechUploadedFileToLarge: 29,\n cWebSaveCaseNotAllowed: 30,\n cWebSaveCaseFailed: 31,\n cInvalidUpload: 53\n };\n\n this.CODES = CODES;\n\n this.CODESREV = Object.fromEntries(\n Object.entries(CODES).map(([key, value]) => [value, key])\n );\n\n // Translate error - put translation in message property, return\n // error.\n this.translate = function (error) {\n // New API\n switch (error.code) {\n case CODES.cException:\n error.message = _(\n \"Something went wrong; see the server log for more information.\"\n );\n break;\n case CODES.cWebSessionTimeOut:\n error.message = _(\"Session has timed out. Please log in again.\");\n break;\n case CODES.cEngineLoadCaseFailed:\n switch (error.subcode) {\n case 1004:\n error.message = positionalFormat(\n _('You have no tickets left for model \"{0}\"'),\n error.summary\n .substring(56, error.summary.length - 1)\n .replace(/_/g, \" \")\n );\n break;\n default:\n error.message = error.summary; // Won't translate for now, may be st. like \"Loading case failed (xxx.mdl)\"\n }\n break;\n case CODES.cEngineLoadCaseFailedWrongData:\n error.message = _(\"Error loading session (wrong data)\");\n break;\n default:\n switch (error.subcode) {\n case 1002:\n error.message = _(\n \"We are currently updating. Please try again later.\"\n );\n break;\n case 1009:\n case 1025:\n error.message = positionalFormat(\n _('Infinite loop detected in {0}\"'),\n // Might be embedded though (in 1 or in 14...)\n error.summary.slice(18, error.summary.indexOf(\", infinite\"))\n );\n break;\n case 1010:\n error.message = _(\n \"Interface has failed (probably a failing SOAP or database connection)\"\n );\n break;\n default:\n error.message = _(this.CODESREV[error.code], _(error.summary));\n }\n }\n return error;\n };\n\n return this;\n})();\n\n/*** API FIX END ***/\n\n/*** DATA HANDLERS BEGIN ***/\n\n/**\n * Default handlers for JSON object.\n *\n * Order in which these handlers are executed are:\n *\n * bb:preHandleData\n * bb:handleData\n * bb:postHandleData\n * bb:finalHandleData\n */\n\n$(document).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups) {\n data.groups.forEach(function (group) {\n const groupid = group.groupid;\n group.controls.forEach(function (control) {\n control._originalid = control.id;\n control.id = groupid + \"-\" + control.id;\n if (control.isfor) {\n control._originalisfor = control.isfor;\n control.isfor = groupid + \"-\" + control.isfor;\n }\n if (control.controltype === \"label\") {\n control.value = control.value.trim();\n if (control.isfor && control.value)\n control.value = control.value + \" \";\n }\n if (\n control.controltype === \"memo\" &&\n control.maxlength > 0 &&\n !control.placeholder\n ) {\n control.placeholder = positionalFormat(\n _(\"Maximum allowed characters: {0}\"),\n control.maxlength\n );\n }\n });\n });\n }\n});\n/**\n * Default handler for JSON object.\n *\n * Sets mode, variables, calls functions to update UI.\n *\n */\nfunction onHandleData(event, data) {\n // Save previous modus - it will be the next modus if unset.\n var modus = $(\"body\").attr(\"data-modus\"); // Either 'model', 'menu', or 'none'\n\n Mode.unset(\"hasMessage\");\n if (typeof data == \"undefined\") return;\n if (typeof document.selection != \"undefined\")\n try {\n document.selection.removeAllRanges();\n } catch (e) {\n // tryCatch was there for IE's sake. probably because we were\n // using Selection.empty()\n }\n\n // Fix error objects - they are a mess\n if (data.error) {\n data.error = Faults.translate(data.error);\n // Do not throw the error just yet - we may need it to\n // get in the right mode\n }\n\n Vars.setVars(data);\n\n if (data.userinfo) {\n Mode.set(\"isLoggedIn\");\n setRole();\n setupMenu();\n return;\n }\n\n if (\n data.error &&\n ([\n Faults.CODES.cWebPleaseLogin,\n Faults.CODES.cUMWrongUserNamePassword,\n Faults.CODES.cWebSessionTimeOut\n ].indexOf(data.error.code) > -1 ||\n data.error.code === \"UNAUTHORIZED\")\n ) {\n // Do nothing\n } else if (has(\"bbis\", data)) {\n // Authenticate through BBI\n new BBI(data).authenticate();\n return;\n } else if (Vars.getVar(\"uniqueid\")) {\n // We are apparently logged in\n hideLogin();\n if (!Vars.getVar(\"userinfo\")) {\n // Get user information\n getUserInfo();\n }\n }\n\n // \"DrawScreen: end\"\n /* Only set modus if this is possibly mode-changing data (e.g.\n * DON'T even go here when data.userinfo is true).\n */\n if (data.status || data.groups || data.cases || data.models || data.error) {\n if (data.groups) modus = \"model\";\n else if (\n data.models ||\n data.cases ||\n (data.status && data.status == \"Ready\")\n ) {\n modus = \"menu\";\n } else if (data.status && data.status == \"logout successful\") {\n modus = \"none\";\n } else if (data.error && data.error.code === Faults.CODES.cWebPleaseLogin) {\n modus = \"none\";\n } else if (\n data.error &&\n data.error.code === Faults.CODES.cUMWrongUserNamePassword\n ) {\n modus = \"none\";\n } else if (\n data.error &&\n data.error.code === Faults.CODES.cWebSessionTimeOut\n ) {\n modus = \"none\";\n } else if (data.error && data.error.code === \"READY\") {\n modus = \"menu\";\n }\n $(\"body\").attr(\"data-modus\", modus);\n // Set current modus\n\n // Clean up state vars that were left over\n if (modus === \"menu\") {\n Vars.unsetVars([\"sessionid\", \"screenid\"]); // Session specific data\n }\n if (modus === \"none\") {\n const perms = permissions();\n Vars.unsetVars();\n perms.forEach(p => {\n Mode.toggle(p, false, false);\n });\n }\n\n // Will need to be seen with every control\n Mode.unset(\"hasHints\");\n\n if (!data.error)\n Mode.toggle(\"hasNoModelsShown\", modus !== \"menu\")\n\n .toggle(\"hasModel\", modus === \"model\")\n\n .toggle(\"hasMenu\", modus === \"menu\")\n\n .toggle(\n \"hasModels\",\n modus === \"menu\" && !!data.models && !!data.models.length\n )\n\n .toggle(\n \"hasCases\",\n modus === \"menu\" && !!data.cases && !!data.cases.length\n )\n\n .toggle(\n \"hasJumplist\",\n modus === \"model\" && !!data.jumplist && !!data.jumplist.length\n )\n\n .toggle(\n \"hasInformationsources\",\n modus === \"model\" &&\n data.informationsources &&\n !!data.informationsources.length\n )\n\n .toggle(\"hasNoPrior\", modus === \"model\" && !data.hasprevious)\n\n .toggle(\"hasNoNext\", modus === \"model\" && !data.hasnext);\n\n Mode.toggle(\"isLoggedIn\", modus !== \"none\");\n\n if (modus === \"none\") {\n Mode.unset(\"isDeepLinked\");\n setRole(); // Sets Mode\n }\n if (modus !== \"model\") {\n Mode.unset(\"isValidated\");\n }\n }\n\n if (\n data.error &&\n !includes(data.error.code, propOr([], \"ignoredErrorCodes\", conf))\n ) {\n notify(\n {\n keepalive: path([\"arbitrary\", \"core\", \"notify\", \"keepalive\"], conf),\n html: false\n },\n data.error\n );\n }\n\n // View updates\n if (data.modeldescription) {\n $(\".bb-modelname\")\n .text(data.modeldescription.replace(/_/g, \" \"))\n .attr(\"lang\", data.modellanguage);\n } else if (modus !== \"model\") {\n $(\".bb-modelname\").text(\"\");\n }\n\n if (modus !== \"model\") {\n $(\"#bb-q\").empty();\n }\n\n if (modus !== \"menu\") {\n Cases.empty();\n Models.empty();\n }\n\n if (modus === \"none\") {\n resetLogin();\n }\n\n if (modus === \"none\") {\n Mode.unset(\"hasModel\")\n .unset(\"hasNoModelsShown\")\n .unset(\"hasMenu\")\n .unset(\"hasModels\")\n .unset(\"hasCases\")\n .unset(\"hasJumplist\")\n .unset(\"hasInformationsources\")\n .unset(\"hasNoPrior\")\n .unset(\"hasNoNext\");\n }\n\n if (modus === \"menu\") {\n if (data.models && !!data.models.length) {\n Models.update(data);\n }\n if (data.cases && !!data.cases.length) {\n Cases.update(data.cases);\n }\n }\n\n if (modus === \"model\") {\n if (data.groups) {\n Validation.reset();\n $(document).trigger(\"bb:renderQuestions\", data);\n }\n Validation.setMode(); // Sets Mode\n\n $(\".bb-openattachments\").attr(\"href\", urlutils.getFiles());\n\n // if (data.informationsources){\n // runHook(\"informationsources\")(data.informationsources);\n // }\n if (data.jumplist) {\n Jumplist.type = arbitraryCoreProp(\"jumplist.type\") || \"ul\";\n Jumplist.draw(data.jumplist);\n }\n }\n}\n\n$(document).on(\"bb:handleData\", onHandleData);\n\n/**\n * Default final handler for JSON object.\n *\n * Runs after any DOM updates. Should only be used for focusing or non-UI stuff.\n *\n * Do not override (unless you know exactly what you are doing) --\n * just augment it if need be.\n *\n */\n$(document).on(\"bb:finalHandleData\", function () {\n bb.ajax.release();\n});\n\nlet returnfocusto, returnSelection;\n\nconst $document = $(document);\n\n$document.on(\"focus\", \":input\", ev => {\n const activeElement = ev.target;\n returnfocusto = activeElement.getAttribute(\"id\");\n if (activeElement.value)\n returnSelection = {\n selectionStart: 0,\n selectionEnd: activeElement.value.length,\n selectionDirection: \"forward\"\n };\n});\n\n$document.on(\"keydown\", \":input\", ev => {\n const activeElement = ev.target;\n const { selectionStart, selectionEnd, selectionDirection } = activeElement;\n returnSelection = { selectionStart, selectionEnd, selectionDirection };\n});\n\nfunction returnfocus() {\n try {\n let elt = document.querySelector(`[id=\"${returnfocusto}\"]`);\n if (elt) {\n elt.focus();\n if (elt.classList.contains(\"hasDatepicker\")) {\n $(elt).datepicker(\"widget\").hide();\n }\n let { selectionStart, selectionEnd, selectionDirection } =\n returnSelection;\n elt.setSelectionRange(selectionStart, selectionEnd, selectionDirection);\n }\n } catch (e) {\n // Checkbox throw an error that some object is not or no\n // longer usable. But how may we check?\n\n // Number inputs and such\n e.select && e.select();\n return true;\n }\n return false;\n}\n\nfunction focusHandler(event, data) {\n if (data.groups) {\n window.setTimeout(function () {\n const [grid, row] = (Ajax.row || \"\").split(\".\");\n var $input,\n focusstring = \":input:visible:enabled:not([readonly]):last\";\n if (row) {\n if (row === \"+\") {\n // Addbutton for entire grid\n $input = $(`.group [name=\"update\"][value=\"${grid}.+\"]`);\n } else {\n $input = $(\n '.group [name=\"' +\n grid +\n '\"] tbody tr:nth(' +\n row +\n \") \" +\n focusstring\n );\n // Might've been the last row - then focus the butlast one\n if (!$input.length)\n $input = $(\n '.group [name=\"' +\n grid +\n '\"] tbody tr:nth(' +\n (parseInt(row) - 1) +\n \") \" +\n focusstring\n );\n // Empty table? Focus addbutton\n if (!$input.length)\n $input = $(`.group [name=\"update\"][value=\"${grid}.+\"]`);\n }\n if ($input.length) {\n $input.trigger(\"focus\");\n }\n } else {\n // focus was lost\n if (\n both(\n complement(propEq(\"_isUpdate\", true)),\n complement(propEq(\"_direction\", \"update\"))\n )(data) ||\n (Mode.get(\"a-keyboard-user\") &&\n document.activeElement === document.body &&\n !returnfocus())\n ) {\n $(\".group.selected\").trigger(\"focus\");\n const e_group = document.querySelector(\".group.selected\");\n if (e_group === null) return;\n e_group.focus();\n if (doScrollToSelected(conf)) {\n if (e_group.previousElementSibling) {\n e_group.scrollIntoView({\n behavior: window.matchMedia(\"(prefers-reduced-motion: reduce)\")\n .matches\n ? \"auto\"\n : \"smooth\"\n });\n }\n }\n }\n }\n }, 0);\n return;\n }\n if (data.models && (!data.cases || !data.cases.length)) {\n $(\".bb-model-name:first\").trigger(\"focus\");\n $(\".bb-model.selected .bb-model-name:first\").trigger(\"focus\");\n return;\n }\n if (data.cases) {\n $(\"#bb-cases tbody .bb-case .bb-case-name:first\").trigger(\"focus\");\n return;\n }\n $(\"form#bb-login input[name=username]\").trigger(\"focus\");\n}\n\nfunction setupFocusHandler(event, data) {\n if (data.uniqueid) {\n $(document).on(\"bb:finalHandleData\", focusHandler);\n $(document).off(\"bb:finalHandleData\", setupFocusHandler);\n }\n}\n\n$(document).on(\"bb:finalHandleData\", setupFocusHandler);\n\nfunction updateDynProps(fulldata, input) {\n var data = {\n groups: fulldata.groups\n };\n $(document).trigger(\"bb:willUpdate\", fulldata);\n if (data && data.groups) {\n var group = data.groups.filter(function (group) {\n return group.current;\n })[0];\n let controls = sortControls(group.controls.slice(0), []);\n $(\n '.group [data-datatype^=\"datades:\"], .group [data-type=\"label\"]'\n ).updateControl(controls, input);\n Validation.setMode();\n }\n $(document).trigger(\"bb:hasUpdated\", fulldata);\n}\n\n$(document).on(\"bb:updated\", function (event, $widget, control, updates) {\n if (updates.indexOf(\"visible\") > -1 && control.identifier) {\n var $parent = $widget.parents(\".bb-questionlabelgroup\");\n if (control.visible) {\n $parent.attr(\"data-visible\", control.visible);\n window.setTimeout(function () {\n $parent.removeAttr(\"hidden\").attr(\"data-visible\", control.visible);\n }, 80);\n } else {\n $parent.attr(\"data-visible\", control.visible);\n window.setTimeout(function () {\n $parent.attr(\"hidden\", true);\n }, 80);\n }\n }\n});\n\n/*** DATA HANDLERS END ***/\n\n/*** VALIDATION BEGIN ***/\n\n/**\n * @Class Validation object.\n *\n */\nvar Validation = {\n /**\n * @member @private {Array} Stack of to-be-validated elemenents\n */\n _stack: [],\n /**\n * @member {Function}\n * @return undefined\n */\n reset: function () {\n this._stack = [];\n },\n /**\n * @member {Function}\n * @return {Element} Next Element eligible for validation\n */\n next: function () {\n return this._stack.pop();\n },\n /**\n * @member {Function}\n * @param {Element} el Element we want to be validated in due time\n */\n add: function (el) {\n this._stack.push(el);\n }\n};\n\n/**\n * Are all inputs valid?\n * @return {Boolean} Whether all inputs pass the test\n */\nValidation.allValid = function () {\n return (\n $.grep(\n $(\n '.group:not([disabled]) .validatable, .group:not([disabled]) [data-datatype^=\"datades:\"]'\n )\n .validate({ silent: true })\n .map(function () {\n return $(this).data(\"validated\");\n }),\n function (val) {\n return val === false;\n }\n ).length === 0\n );\n};\n\n/**\n * Update isValidated Mode\n * @return undefined\n */\nValidation.setMode = function () {\n Mode.toggle(\"isValidated\", Validation.allValid());\n};\n\n/**\n * Live Validation instructions\n */\n$(document).on(\"keyup change\", \"body.hasModel\", Validation.setMode);\n\n// Push the input just left onto the validation stack\n$(document).on(\"focusout\", \"#bb-q .group .validatable\", function () {\n var me = $(this);\n Validation.add(me[0]);\n});\n\n$.fn.extend({\n geterrorelt: function () {\n var $this = $(this);\n return $this.data(\"$error\") || $();\n },\n showValidation: function (options, ok, error) {\n var $this = $(this),\n node = $this.get(0);\n\n var errortext;\n if (error instanceof Error) errortext = error.message;\n else errortext = error;\n\n if (!document.body.contains(node)) {\n // console.log('Trying to validate unconnected', this)\n return;\n }\n $this.data(\"validated\", ok);\n\n if (!ok) {\n var $error = $this.geterrorelt(),\n $anchor = $this.is(\"input[type=checkbox]\")\n ? $this.next()\n : $this.data(\"anchor\");\n\n $this.attr(\"aria-invalid\", true);\n\n if ($error.length === 0) {\n if (!options.silent && !options.justhide) {\n $error = $(\n ``\n );\n $this.data(\"$error\", $error);\n }\n }\n // If there was already an error element, and the input is\n // still invalid but (reason and therefore) the errortext\n // has changed, change the error text shown to the user.\n if ($error.length > 0) {\n if ($error.data(\"lasterrortext\") !== errortext) {\n $error.data(\"lasterrortext\", errortext);\n $error.text(errortext);\n }\n }\n if (!options.silent && !options.justhide) {\n $this.addClass(\"error invalid\");\n // (re-)attach $error.\n $anchor.after($error);\n // This may be necessary:\n $(\"#bb-wrapmodel\").scrollTo($error);\n // Allow complicated widgets to fix stuff afterwards\n $this.trigger(\"bb:errorOn\", [errortext, $anchor, $error]);\n }\n } else {\n $this.attr(\"aria-invalid\", false);\n $this.geterrorelt().remove();\n $this.removeClass(\"error invalid\");\n $this.addClass(\"validated\");\n // Allow complicated widgets to fix stuff afterwards\n $this.trigger(\"bb:errorOff\");\n\n if (!options.silent && options.requestUpdate) {\n if (Mode.get(\"hasDynamicInterfaces\")) {\n requestDynProps(node);\n }\n }\n }\n },\n // Validate input\n // OPTIONS: silent, justhide\n validate: function (options) {\n if (!options) {\n options = {};\n }\n if (options.silent === undefined) {\n options.silent = false;\n }\n if (options.justhide === undefined) {\n options.justhide = false;\n }\n // requestUpdate needs to be false whenever validation is done\n // upon node navigation (next, skip), in order to avoid useless\n // server requests. Also, on validating for just showing errors\n // on tabbing away, we want not to request an update - that is\n // already taken care of by the onChange event\n if (options.requestUpdate === undefined) {\n options.requestUpdate = true;\n }\n\n // Argument noui says: do not update the ui (i.e. do not show nor hide any errors).\n return $(this).each(function () {\n var $this = $(this),\n ok = true,\n errortext;\n\n try {\n // Let actual validation be performed by other method.\n ok = validateInput($this);\n } catch (err) {\n ok = false;\n errortext = err;\n }\n\n return $this.showValidation(options, ok, errortext);\n });\n }\n});\n\n// Check when tabbing / clicking to new input - we want to show\n// validation while tabbing through, but not tabbing. onChange we want\n// to hide validation errors, but not show them immediately.\n$(document).on(\"focusin\", \":input\", function () {\n let validatable;\n while ((validatable = Validation.next())) {\n validatable = $(validatable);\n if ($(this).is(\":radio\")) {\n //Only validate when really outside of the radiogroup\n if (!$(this).parent(\".radiogroup\").has(validatable))\n validatable.validate({ requestUpdate: false });\n } else {\n if (validatable.get(0) != $(this).get(0))\n validatable.validate({ requestUpdate: false });\n }\n }\n});\n\n$(document).on(\n \"change\",\n \"#bb-q .group.selected :input:not(button)\",\n function () {\n var $this = $(this),\n options = { silent: false, justhide: true };\n if ($this.is(\":radio\")) {\n // validating radio???\n $this.parents(\".radiogroup\").validate(options);\n } else {\n $this.validate(options);\n }\n }\n);\n\n// Always check checkboxes onchange\n$(document).on(\"change\", \"#bb-q .group :checkbox\", function () {\n $(this).parents(\".checklist\").validate();\n});\n\nfunction debounce(func, wait, immediate) {\n var timeout;\n return function () {\n var context = this,\n args = arguments;\n var later = function () {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n var callNow = immediate && !timeout;\n window.clearTimeout(timeout);\n timeout = window.setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n}\n\nconst eltControltype = compose(prop(\"controltype\"), getControl);\n\nconst doChangeOnKeyDown = elt => {\n const setting = path([\"arbitrary\", \"core\", \"update-on-typing\"])(conf);\n return (\n setting === \"always\" ||\n (setting instanceof Array && includes(eltControltype(elt), setting))\n );\n};\n\nfunction keyDown() {\n if (doChangeOnKeyDown(this)) $(this).data(\"valBefore\", $(this).val());\n}\n\n$(document).on(\n \"keydown\",\n \"#bb-q .group.selected :input:not(button)\",\n debounce(keyDown, 32, true)\n);\n\n$(document).on(\n \"keyup\",\n \"#bb-q .group.selected :input:not(button)\",\n function () {\n if (doChangeOnKeyDown(this)) {\n var $this = $(this),\n before = $this.data(\"valBefore\"),\n val = $this.val();\n if (before !== undefined && before !== val) {\n $this.trigger(\"change\");\n $this.removeData(\"valBefore\");\n }\n }\n }\n);\n/*** VALIDATION END ***/\n\n/*** HINTS, TOOLTIPS BEGIN ***/\n// Move to plugin core:tooltips\n/*** HINTS, TOOLTIPS END ***/\n\n/*** RENDERING 'ENGINE' BEGIN ***/\nconst doScrollToSelected = compose(\n val => val !== false,\n path([\"arbitrary\", \"core\", \"scrollToSelectedGroup\"])\n);\nconst setDynamicMode = tap(\n group =>\n group.current && Mode.toggle(\"hasDynamicInterfaces\", Boolean(group.dynamic))\n);\n\n/**\n * Render questions / labels (i.o.w. the main interaction\n * interface) This function is only called when there are actually\n * screens in need of rendering. Therefore, it need not check the JSON\n * object\n *\n * @param ev {Event} The event that triggered this function\n * @param data {Object} 'JSON'-object conforming to BB JSON API.\n */\nfunction renderGroups(ev, data) {\n // Save previous id\n var previd = $(\"#bb-q\" + \" .group.selected\").data(\"groupid\"),\n groups = data.groups,\n $bbq = $(\"#bb-q\");\n\n // Begin -- Only update what is new or was .selected before! There\n // is a problem with $.ajax calls when fast-clicking => therefore\n // step has {async: false}\n //\n // FIXME: when user press next, while\n // there is no next, a node too many is inserted. This can be\n // fixed now the server passes along the node id of a group.\n\n groups.forEach(setGroupTitle);\n if (mustUpdate(conf)) {\n // Prepare DOM -- remove unneeded or to be re-rendered .groups\n for (let group of document.querySelectorAll(\".group\")) {\n if (complement(any(propEq(\"groupid\", group.dataset[\"gid\"])))(groups)) {\n // Remove a group if not in response\n group.parentNode.removeChild(group);\n } else if (Ajax.row && group.dataset[\"gid\"] === Ajax.groupid) {\n // When adding/deleting rows, safe the space where the group\n // was (entire group will be re-rendered)\n const gob = find(propEq(\"groupid\", group.dataset[\"gid\"]))(groups);\n const tempNode = document.createComment(\"group\");\n group.parentNode.replaceChild(tempNode, group);\n gob._tempNode = tempNode;\n }\n }\n compose(\n map(\n compose(\n ifElse(\n ({ groupid }) =>\n document.querySelector(`.group[data-gid=\"${groupid}\"]`),\n group => {\n updateDynProps({\n groups: [{ current: true, controls: group.controls }]\n });\n const elt = document.querySelector(\n `.group[data-gid=\"${group.groupid}\"]`\n );\n setSelectedStateAttributes(elt, group);\n },\n renderGroup\n ),\n setDynamicMode\n )\n ),\n sortGroups\n )(groups);\n } else {\n // Always remove .selected:\n $(\".group.selected\", $bbq).remove();\n if (Ajax.direction == \"next\" && groups.length > 1) {\n // Re-render only previous group and current group\n groups = groups.filter(function (group) {\n return group.current || group.groupid === previd;\n });\n } else if (\n Ajax.direction == \"prior\" &&\n $(\"#bb-q .group\").length > 0 &&\n groups.length > 1\n ) {\n // Re-render only current group\n groups = groups.filter(function (group) {\n return group.current;\n });\n } else $bbq.empty();\n // End -- Only update what is new!\n\n $bbq.hide();\n compose(map(compose(renderGroup, setDynamicMode)), sortGroups)(groups);\n }\n $bbq.attr(\"lang\", data.modellanguage).show();\n\n // Old questionlabelgroup plugin:\n if (!doGrouping(conf)) {\n (bb.questionlabelgroup || questionlabelgroup)();\n\n $('.bb-questionlabelgroup:has([data-datatype][data-visible=\"false\"])').attr(\n {\n \"data-visible\": false,\n \"hidden\": true\n }\n );\n }\n}\n\nfunction sortGroups(groups) {\n // Fix insertion order\n return groups.sort(function (a, b) {\n return a.order - b.order;\n });\n}\n\nfunction sortControls(a, b) {\n if (!a[0]) return b.reverse();\n var ac = a.shift(),\n bc = b[0];\n if (\n bc &&\n ac.controltype === \"label\" &&\n !ac.datatype && // Label with a datatype is a text interface\n bc._sorted === undefined &&\n bc.controltype !== \"label\" &&\n (bc.controltype !== \"linklabel\" || bc.isreport) &&\n bc.controltype !== \"checkbox\"\n ) {\n // Reverse input with label\n b.shift();\n bc._sorted = true; // Instruct next recursion not to touch the control\n if (has(\"notnull\", bc)) ac.isForNotNull = bc.notnull;\n if (has(\"readonly\", bc)) ac.readonly = bc.readonly;\n ac.dynamic = bc.dynamic = /^datades:/.test(bc.datatype);\n ac.metadata = Object.assign({}, bc.metadata, ac.metadata);\n bc.meta = bc.meta || {}; // Associate input with label\n bc.meta.label = (ac.value || \"\").trim();\n bc.aria = bc.aria || {}; // Associate input with label\n if (bc.notnull) bc.aria.required = true;\n if (ac.notnull) ac.aria.required = true;\n // Associate input (group) with label.\n if (\n [\"radio\", \"checkmultilist\", \"listbox\", \"multilist\"].includes(\n bc.controltype\n )\n ) {\n if (bb.conf.a11y.optionfieldsets) {\n ac.controltype = \"legend\";\n ac.className = \"bb-label\";\n } else {\n bc.aria.labelledby = ac.id;\n }\n } else if (bc.controltype === \"grid\") {\n if (bb.conf.a11y.captions) {\n ac.controltype = \"caption\";\n bc.caption = ac;\n } else {\n bc.aria.labelledby = ac.id;\n }\n } else {\n ac.isFor = bc.id;\n }\n return sortControls(a, [bc, ac].concat(b));\n } else {\n if (\n bc &&\n ac.controltype === \"label\" &&\n !ac.datatype && // Label with a datatype is a text interface\n bc.controltype === \"checkbox\"\n ) {\n ac.isFor = bc.id; // Associate label with checkbox (that comes before)\n if (has(\"notnull\", bc)) ac.isForNotNull = bc.notnull;\n if (has(\"readonly\", bc)) ac.readonly = bc.readonly;\n ac.dynamic = /^datades:/.test(bc.datatype);\n ac.metadata = Object.assign({}, bc.metadata, ac.metadata);\n bc.meta = bc.meta || {}; // Associate input with label\n bc.meta.label = (ac.value || \"\").trim();\n bc.aria = bc.aria || {};\n if (bc.notnull) bc.aria.required = true;\n if (ac.notnull) ac.aria.required = true;\n }\n return sortControls(a, [ac].concat(b));\n }\n}\n\nfunction setGroupTitle(group) {\n var controls = group.controls;\n // It's a title, if:\n // there are two 1st is label Not a 'text' interface 1st doesnt control any\n if (\n controls[1] &&\n controls[0].controltype === \"label\" &&\n !controls[0].datatype &&\n !controls[0].isfor\n ) {\n controls[0].controltype = \"legend\";\n group.screentitle = controls[0].value;\n }\n}\n\nconst setSelectedStateAttributes = (elt, group) => {\n elt.classList.toggle(\"selected\", group.current);\n elt.classList.toggle(\"unselected\", !group.current);\n if (group.current || canEditEarlier(conf)) {\n elt.removeAttribute(\"aria-hidden\");\n elt.removeAttribute(\"disabled\");\n } else {\n elt.setAttribute(\"aria-hidden\", true);\n elt.setAttribute(\"disabled\", \"disabled\");\n }\n};\n\nconst hasStatusRole = pathEq([\"metadata\", \"role\"], \"status\");\n\nfunction renderGroup(group) {\n var controls = group.controls,\n wGroup = $(\n '
      \"\n );\n\n // If this has a dupe, first remove the old one:\n $(\".group\").each(function () {\n if ($(this).data(\"groupid\") === group.groupid) $(this).remove();\n });\n\n const elt = wGroup.get(0);\n elt.dataset[\"gid\"] = group[\"groupid\"];\n wGroup.data(\"groupid\", group[\"groupid\"]);\n\n controls = sortControls(controls.slice(0), []);\n\n if (doGrouping(conf)) controls = groupOuter(controls);\n\n $(controls).each(function (i, c) {\n if (doGrouping(conf)) {\n elt.appendChild(createFormGroup(wControl, group, 1)(c));\n } else wControl(c, group, elt);\n });\n\n elt.classList.add(\"bb-screenmode-\" + group.screenmode);\n elt.setAttribute(\"data-node\", group.name);\n if (!bb.getVar(\"wrongOrder\")) elt.setAttribute(\"data-bb:order\", group.order);\n\n setSelectedStateAttributes(elt, group);\n\n if (group._tempNode) {\n group._tempNode.parentNode.replaceChild(elt, group._tempNode);\n delete group._tempNode;\n } else {\n if (group.screenmode == \"addtop\") $(\"#bb-q\").prepend(elt);\n else $(\"#bb-q\").append(elt);\n }\n}\n\n/**\n * Wrap questions + accompanying labels in a single group\n *\n * This function may be overriden by assigning a function to bb.questionlabelgroup\n * @see Plugin questionlabelgroup-ng\n *\n * @return undefined\n */\nfunction questionlabelgroup() {\n $(\".group:not(:has(.bb-questionlabelgroup))>.bb-label\").each(function () {\n var $this = $(this);\n var input = $this.next(\n \":not(label):not(a):not([type=checkbox]):not(img):not(.clearfix)\"\n );\n var itype = input.data(\"type\");\n var questionandlabel = $this.add(input);\n\n if (questionandlabel.length > 1)\n questionandlabel.wrapAll(\n '
      '\n );\n else {\n questionandlabel = $this.prev(\"[type=checkbox]\").add(this);\n if (questionandlabel.length > 1)\n questionandlabel.wrapAll(\n '
      '\n );\n }\n questionandlabel\n .parent(\".bb-questionlabelgroup\")\n .append('
      ');\n $.each(\n questionandlabel.parent(\".bb-questionlabelgroup\").find(\"[data-type]\"),\n function () {\n var $this = $(this);\n if ($this.attr(\"class\")) {\n var classname = $this.attr(\"class\").match(/\\bbbm-[a-z0-9-]+\\b/);\n if (classname) {\n classname = classname[0].replace(/\\bbbm-/, \"bb-g-\");\n $this.parents(\".bb-questionlabelgroup\").addClass(classname);\n }\n }\n }\n );\n });\n}\n\n/*** RENDERING 'ENGINE' END ***/\n\n/*** 'COMPLEX' WIDGET BEHAVIOUR BEGIN ***/\n\n/**\n * Radiogroup and checklist enhancements\n */\n\n$(document)\n .on(\"change programmatically-changed\", \".bb-option\", function (ev) {\n var $this = $(this);\n $this.toggleClass(\"checked\", ev.target.checked);\n if (ev.target.type === \"radio\" && ev.target.checked) {\n $this.siblings().removeClass(\"checked\");\n }\n })\n .on(\"focus\", \".bb-option\", function (ev) {\n $(this).addClass(\"focus\");\n if (ev.target.type === \"radio\") {\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n }\n return true;\n })\n .on(\"blur\", \".bb-option\", function () {\n $(this).removeClass(\"focus\");\n })\n .on(\n \"keydown\",\n \".radiogroup .bb-option\",\n // Fix the odd default behaviour of selecting upon focus\n function (ev) {\n var $other,\n chars = [37, 38, 39, 40],\n // left, up, right, down\n idx = chars.indexOf(ev.keyCode);\n if (idx === -1) return true;\n\n $other =\n idx < 2 // 'prev' chars\n ? $(this).prev().find('input[type=\"radio\"]')\n : $(this).next().find('input[type=\"radio\"]');\n\n // At beginning or end... go around (Edge selects otherwise...).\n if (!$other.length) {\n $other =\n idx < 2 // 'prev' chars\n ? $(this).siblings().last().find('input[type=\"radio\"]')\n : $(this).siblings().first().find('input[type=\"radio\"]');\n }\n if ($other.length) {\n $other.trigger(\"focus\");\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n }\n return true;\n }\n );\n\n/*** 'COMPLEX' WIDGET BEHAVIOUR END ***/\n\n/*** LINKS BEGIN ***/\n\n/**\n * Original code moved to plugin rewrite-links\n *\n */\n\n/*** LINKS END ***/\n\n/*** TOKENCHANNEL BEGIN ***/\n\n$(document).on(\"bb:preHandleData\", (_, data) => {\n if (has(\"uniqueid\", data)) {\n token.setToken(prop(\"uniqueid\", data));\n }\n});\n\n$(document).on(\"bb:preHandleData\", (_, data) => {\n // document.body.dispatchEvent(new customEvent(\"bb:storeToken\", { bubbles: true, })\n if (has(\"uniqueid\", data)) {\n token.setToken(prop(\"uniqueid\", data));\n }\n});\n\n$(document).on(\"bb:mode:isLoggedIn\", (_event, bool) => {\n if (!bool) {\n token\n .getHash()\n .then(tokenHash => token.postMessage({ tokenHash, type: \"loggedOut\" }));\n }\n});\n\ntoken.addEventListener(\"message\", message => {\n token.getHash().then(hash => {\n if (message.data.tokenHash === hash) {\n if (message.data.type === \"loggedOut\") window.close() || logout();\n }\n });\n});\n\n/*** TOKENCHANNEL END ***/\n\n/*** EXPORTS BEGIN ***/\n\nbb.escapeHTML = escapeHTML;\nbb.exit = exit;\nbb.deleteCase = deleteCase;\nbb.logout = logout;\nbb.menu = menu;\n\nbb.authenticate = token => Vars.setVars({ uniqueid: token });\nbb.newcase = newcase;\nbb.step = step;\nbb.restart = function restart() {\n newcase(Vars.getVar(\"dbname\"));\n};\nbb.rewind = function rewind(cb, options) {\n step(\"rewind\", cb, options);\n};\nbb.update = function update(cb, options) {\n step(\"update\", cb, options);\n};\nbb.updatemis = function updatemis(options) {\n step(\"updatemis\", $.noop, options);\n};\nbb.next = function next(cb, options) {\n step(\"next\", cb, options);\n};\nbb.prior = function prior(cb, options) {\n step(\"prior\", cb, options);\n};\nbb.skip = function skip(cb, options) {\n step(\"skip\", cb, options);\n};\nbb.gotonode = function gotonode(groupid, cb, options = null) {\n step(\"gotonode\", cb, Object.assign({}, { groupid }, options));\n};\nbb.runtonode = function runtonode(nodename, cb) {\n step(\"runtonode\", cb, { fullnodename: nodename });\n};\nbb.getVar = Vars.getVar;\nbb.notify = notify.bind(null, {});\nbb.ajax = {\n replace: Ajax.replace,\n busy: function () {\n return Ajax.busy;\n },\n release: Ajax.release,\n post: Ajax.post,\n direction: function () {\n return Ajax.direction;\n }\n};\nbb.URL = urlutils;\nbb.Numerals = Numerals;\nbb.Plugins = bb.Plugins || {};\nbb.Validation = Validation;\nbb.positionalFormat = positionalFormat;\nbb.humanDate = humanDate;\nbb.propFinder = propFinder;\nbb.requestDynProps = requestDynProps;\n// Window-export some stuff used in bookmarklets.\nwindow.bb = {\n restart: bb.restart,\n getVar: bb.getVar,\n requestDynProps: bb.requestDynProps,\n Mode,\n menu\n};\n\n/*** EXPORTS END ***/\n\nexport { bb, _, _ as gt };\n", "import { _ } from \"$json\";\n\nconst DICTIONARY = {\n \"close this infomation box\": {\n \"en\": \"close this infomation box\",\n \"nl\": \"sluit dit informatievak\",\n \"en-GB\": \"close this infomation box\"\n },\n \"Send link popup\": {\n \"en\": \"Send link popup\",\n \"nl\": \"Pop-up voor koppeling verzenden\",\n \"en-GB\": \"Send link popup\"\n }\n};\n\n_.addTranslations(DICTIONARY);\n\nclass Listener {\n constructor(id) {\n this[id] = event => {\n if (event.isComposing || event.keyCode !== 27) {\n return;\n } else {\n // No need to be specific, just destroy the most recent one.\n Array.from(document.querySelectorAll(\".p-dialogue-container\"))\n .pop()\n .click();\n }\n };\n }\n}\n\nexport default class Dialogue {\n constructor(props = {}, parent) {\n this.id = `dialogue-${Date.now()}-${Math.floor(Math.random() * 10000)}`;\n this.parent =\n parent !== undefined && typeof parent === \"object\" && \"nodeType\" in parent\n ? parent\n : document.getElementsByTagName(\"body\")[0];\n this.elemprops = props;\n this.rtnfocus = document.children[0];\n }\n\n destroy(human = true) {\n let me = document.getElementById(this.id);\n if (me) this.parent.removeChild(me);\n\n // Remove keyup listener\n this.handler &&\n document.removeEventListener(`keyup`, this.handler[this.id], false);\n\n // Untrap focus\n document.querySelectorAll(\"[data-hushed-by-dialogue]\").forEach(elem => {\n let prev = elem.getAttribute(\"data-previous-tabindex\");\n elem.removeAttribute(\"tabindex\");\n if (prev !== \"none\") {\n elem.setAttribute(\"tabindex\", prev);\n }\n elem.removeAttribute(\"data-previous-tabindex\");\n elem.removeAttribute(\"data-hushed-by-tabindex\");\n });\n\n // Unhide ARIA\n document\n .querySelectorAll(\"[data-aria-hidden-by-dialogue]\")\n .forEach(elem => {\n let prev = elem.getAttribute(\"data-previous-aria\");\n elem.removeAttribute(\"aria-hidden\");\n if (prev !== \"none\") {\n elem.setAttribute(\"aria-hidden\", prev);\n }\n elem.removeAttribute(\"data-previous-aria\");\n elem.removeAttribute(\"data-aria-hidden-by-dialogue\");\n });\n\n // Return focus, but not if this was called by the render method,\n // otherwise we will override the activeElement with the initial\n // rtnfocus value (document.children[0])\n human && this.rtnfocus.focus();\n }\n\n render(elem) {\n // Remove dialogue if it already exists.\n this.destroy(false);\n\n // Remove all other focusable elements from tabindex on the DOM,\n // so we can truly trap the focus for all users w/o trapping\n // keyboard user out of the browser controls.\n document\n .querySelectorAll(\n \"a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]\"\n )\n .forEach(elem => {\n elem.setAttribute(\"data-hushed-by-dialogue\", true);\n elem.setAttribute(\n \"data-previous-tabindex\",\n elem.getAttribute(\"tabindex\") || \"none\"\n );\n elem.setAttribute(\"tabindex\", \"-1\");\n });\n\n // ARIA hide everything to avoid screen readers keyboard\n // shortcuts gaining access outside of the dialogue.\n document.querySelectorAll(\"*:not(body):not(html)\").forEach(elem => {\n elem.setAttribute(\"data-aria-hidden-by-dialogue\", true);\n elem.setAttribute(\n \"data-previous-aria\",\n elem.getAttribute(\"aria-hidden\") || \"none\"\n );\n elem.setAttribute(\"aria-hidden\", \"true\");\n });\n\n // Create elements.\n let container = document.createElement(\"div\");\n container.className = \"p-dialogue-container\";\n container.style.cssText = `\n background-color: rgba(0,0,0,.5);\n height: 100%;\n left: 0;\n position: fixed;\n text-align: center;\n top: 0;\n width: 100%;\n z-index: 100;\n `;\n container.id = this.id;\n container.setAttribute(\"role\", \"dialog\");\n // container.setAttribute(\"aria-label\", \"dialog\"); // BAD A11Y - more accessible label should be given by class caller.\n Object.keys(this.elemprops).forEach(prop => {\n prop === \"class\"\n ? (container.className += \" \" + this.elemprops[prop])\n : container.setAttribute(prop, this.elemprops[prop]);\n });\n container.addEventListener(\"click\", e => {\n this.destroy();\n });\n\n let inner = document.createElement(\"div\");\n inner.className = \"inner\";\n inner.style.cssText = `\n display: inline-block;\n margin: 10vh 25px auto 25px;\n overflow: auto;\n `;\n inner.addEventListener(\"click\", e => {\n e.stopPropagation();\n });\n\n let closer = document.createElement(\"button\");\n let x = document.createTextNode(\"+\");\n closer.append(x);\n closer.className = \"dialogue-close\";\n closer.style.cssText = `\n font-size: 2.2rem;\n line-height: 1.2rem;\n padding: 5px;\n position: absolute;\n right: 5px;\n top: 5px;\n transform-origin: top;\n transform: rotate(45deg);\n `;\n closer.addEventListener(\"click\", e => this.destroy());\n closer.setAttribute(\"aria-label\", _(\"close this infomation box\"));\n\n // Add to DOM\n inner.appendChild(closer);\n inner.appendChild(elem);\n container.appendChild(inner);\n this.parent.appendChild(container);\n\n // Set the rtnfocus, then focus inside dialogue.\n this.rtnfocus = document.activeElement;\n closer.focus();\n\n this.handler = new Listener(this.id);\n\n document.addEventListener(`keyup`, this.handler[this.id], false);\n }\n}\n", "/* a11y-describedby:\n *\n * - Describe group with all its standard remarks\n * - Describe input by any non-standard remark labels directly\n * preceding it\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\nimport { tap, when, compose, prop, path, find } from \"$json/lib/functional\";\n\n$(document).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups) {\n $.each(data.groups, function (_, group) {\n var remarks = [],\n pretexts = [];\n $.each(group.controls, function (idx, control) {\n if (control[\"font-class\"].toLowerCase() === \"standard remark\") {\n remarks.push(control.id);\n } else if (control.datatype && control.controltype === \"label\") {\n pretexts.push(control.id);\n }\n const explicitId = path([\"metadata\", \"describedby\"], control);\n if (explicitId) {\n compose(\n when(\n Boolean,\n compose(id => pretexts.push(id), prop(\"id\"))\n ),\n find(c => c.identifier && c.identifier.endsWith(`.${explicitId}`)),\n prop(\"controls\")\n )(group);\n }\n if (control.datatype && control.controltype !== \"label\") {\n maybeSetDescription(control, pretexts);\n pretexts = [];\n }\n });\n maybeSetDescription(group, remarks);\n });\n }\n});\n\nfunction maybeSetDescription(thing, description_ids) {\n if (description_ids.length) {\n thing.aria = thing.aria || {};\n thing.aria.describedby = description_ids.join(\" \");\n }\n}\n", "/* all-or-nothing:\n *\n * Select all or nothin' in checklists\n *\n * Author: Niels Giesen\n * Copyright 2012,2013,2019 Berkeley Bridge\n *\n */\n/* global $ */\nimport { bb } from \"$json\";\n\nimport { Mode } from \"$json/lib/mode.js\";\n\nimport { getControl } from \"$json/lib/control\";\n\nimport { _ } from \"$json/lib/gettext\";\n\nimport {\n curry,\n complement,\n compose,\n ifElse,\n map,\n path,\n tap\n} from \"$json/lib/functional\";\n\nimport { isReadOnly } from \"$json/lib/control-helpers\";\n\nlet sub = \"p-all-or-nothing\";\n\n_.addTranslations({\n [sub]: {\n en: {\n select: \"select\",\n all: \"all\",\n or: \"or\",\n nothing: \"nothing\"\n },\n nl: {\n select: \"selecteer\",\n all: \"alles\",\n or: \"of\",\n nothing: \"niets\"\n },\n fr: {\n select: \"choisissez\",\n all: \"tout\",\n or: \"ou\",\n nothing: \"rien\"\n },\n de: {\n select: \"wahlen Sie\",\n all: \"alles\",\n or: \"oder\",\n nothing: \"nichts\"\n },\n ru: {\n select: \"\u0432\u044B\u0431\u0438\u0440\u0430\u0439\u0442\u0435\",\n all: \"\u0432\u0441\u0451\",\n or: \"\u0438\u043B\u0438\",\n nothing: \"\u043D\u0438\u0447\u0435\u0433\u043E\"\n }\n }\n});\n\nconst CONTAINERCLASS = \"bb-p-all-or-nothing-container\";\nconst TOGGLERCLASS = \"bb-p-all-or-nothing-toggler\";\n\nconst togglerTemplate = _.taggedWithin(sub)``;\n\nconst nearestBy = curry((fn, node) => {\n try {\n while (node && !fn(node)) {\n node = node.parentNode;\n }\n } catch (e) {\n node = null;\n }\n return node;\n});\n\nconst getGroup = nearestBy(node =>\n node.classList.contains(\"bb-questionlabelgroup\")\n);\n\nconst isGrid = node => node.dataset[\"type\"] === \"grid\" && node.tHead;\n\nconst isInGrid = elt => nearestBy(isGrid, elt);\n\nconst getCheckboxSelector = elt => {\n if (isInGrid(elt)) {\n const th = nearestBy(node => node.tagName === \"TH\", elt);\n const col = [...th.parentElement.children].indexOf(th);\n return `[name$=\".${col}\"]`;\n }\n return 'input[type=\"checkbox\"]';\n};\n\nconst ignorable = elt =>\n elt.closest(\"tr, .bb-option\").matches(\".p-option-filter__hidden\");\n\nconst setStateOnChildren = elt => {\n elt.parentNode.classList.add(\"bb-p-all-or-nothing-on\");\n const checked = elt.checked;\n const group = getGroup(elt);\n for (let cb of group.querySelectorAll(getCheckboxSelector(elt))) {\n if (cb !== elt) {\n if (ignorable(cb)) continue;\n cb.checked = checked;\n }\n }\n if (Mode.get(\"hasDynamicInterfaces\")) {\n bb.update();\n }\n};\n\nconst stateReducer = (acc, cur) =>\n acc === \"mixed\" || acc === cur ? acc : acc === undefined ? cur : \"mixed\";\n\nconst stateFromChildren = elt => {\n const group = nearestBy(\n node => node.classList.contains(\"bb-questionlabelgroup\"),\n elt\n );\n\n return [...group.querySelectorAll(getCheckboxSelector(elt))]\n .filter(cb => cb !== elt)\n .filter(complement(ignorable))\n .map(cb => cb.checked)\n .reduce(stateReducer, undefined);\n};\n\nconst setStateFromChildren = elt => {\n const state = stateFromChildren(elt);\n\n elt.indeterminate = state === \"mixed\";\n\n if (state === \"mixed\") {\n elt.parentNode.classList.remove(\"bb-p-all-or-nothing-on\");\n } else {\n elt.checked = state;\n elt.parentNode.classList.add(\"bb-p-all-or-nothing-on\");\n }\n};\n\nconst megaEvent = ev => {\n if (ev.target.classList.contains(TOGGLERCLASS)) {\n setStateOnChildren(ev.target);\n } else {\n const widget = nearestBy(\n node => [\"grid\", \"checkmultilist\"].includes(node.dataset[\"type\"]),\n ev.target\n );\n if (isGrid(widget)) {\n const col = ev.target.name.split(\".\").pop();\n const group = getGroup(ev.target);\n setStateFromChildren(\n group.querySelector(`th:nth-child(${Number(col) + 1}) .${TOGGLERCLASS}`)\n );\n } else {\n const group = getGroup(ev.target);\n setStateFromChildren(group.querySelector(`.${TOGGLERCLASS}`));\n }\n }\n};\n\n$(document).on(\"click\", `.${CONTAINERCLASS} input[type=\"checkbox\"]`, megaEvent);\n\nconst metadataSaysNo = compose(\n val => val === \"off\",\n path([\"metadata\", \"p-all-or-nothing\"]),\n getControl\n);\n\nconst toggledOnes = new WeakSet();\n\nconst createToggleElement = () => {\n const frag = document.createElement(\"div\");\n frag.innerHTML = togglerTemplate;\n return frag.children[0];\n};\n\nconst flipDisabled = control => toggler => {\n toggler.querySelector(`.${TOGGLERCLASS}`).disabled = isReadOnly(control);\n};\n\nconst addTogglerToCell = cell => {\n $(cell).showdown();\n cell.classList.remove(\"bb-md-able\");\n const toggler = createToggleElement();\n const origcontents = cell.childNodes;\n\n toggler.querySelector(\"input\").setAttribute(\"aria-describedby\", cell.id);\n\n const celldiv = document.createElement(\"div\");\n celldiv.classList.add(\"p-all-or-nothing-toggler-cell-contents\");\n\n const origdiv = document.createElement(\"div\");\n origdiv.classList.add(\"p-all-or-nothing-toggler-cell-orig-contents\");\n origdiv.append(...origcontents);\n origdiv.id = cell.id;\n cell.removeAttribute(\"id\");\n\n celldiv.append(toggler, origdiv);\n\n cell.insertAdjacentElement(\"afterbegin\", celldiv);\n cell.classList.add(\"p-all-or-nothing-toggler-cell\");\n\n return toggler;\n};\n\nconst addGridTogglers = widget =>\n map(addTogglerToCell)([\n ...widget.querySelectorAll(\n `[data-rowtype=\"checkbox\"][data-rowreadonly=\"false\"]:not(.p-all-or-nothing-toggler-cell)`\n )\n ]);\n\nconst listenForGridUpdates = widget => {\n widget.addEventListener(\"bb:updatedControl\", ({ detail }) => {\n if (detail.Updates.columns) {\n addGridTogglers(widget);\n }\n });\n widget.addEventListener(\"bb-p:option-filtered\", () => {\n widget.querySelectorAll(`.${TOGGLERCLASS}`).forEach(setStateFromChildren);\n });\n};\n\nconst addTogglers = ifElse(\n isGrid,\n widget => {\n listenForGridUpdates(widget);\n return addGridTogglers(widget);\n },\n widget => {\n const toggler = createToggleElement();\n widget.insertAdjacentElement(\"beforebegin\", toggler);\n return [toggler];\n }\n);\n\nconst togglify = widget => {\n if (metadataSaysNo(widget)) return;\n if (toggledOnes.has(widget)) return;\n const control = $.data(widget, \"control\");\n const group = getGroup(widget);\n group.classList.add(CONTAINERCLASS);\n\n compose(\n map(\n compose(\n flipDisabled(control),\n tap(\n compose(setStateFromChildren, elt =>\n elt.querySelector(`.${TOGGLERCLASS}`)\n )\n )\n )\n ),\n addTogglers\n )(widget);\n\n toggledOnes.add(widget);\n};\n\n$(function () {\n const DEFAULT_SELECTOR = `.checklist:has(li:nth-child(2)), [data-type=\"grid\"]:has(tr:nth-child(2)):has(input[type=\"checkbox\"])`;\n const SELECTOR = bb.propFinder(bb.conf)(\n \"arbitrary.all-or-nothing.selector\",\n DEFAULT_SELECTOR\n );\n\n $(document).on(\"bb:postHandleData\", function (event, data, _status, _req) {\n if (data && data.groups) {\n $(SELECTOR, \".group\").each((i, item) => togglify(item));\n }\n });\n\n document.addEventListener(\"bb:updatedControl\", function (event) {\n if ($(event.target).is(SELECTOR)) {\n togglify(event.target);\n }\n });\n});\n", "/* array.groupby:\n *\n * Extend Array prototype with _groupby(function) method.\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\nArray.prototype._groupby = function (hash) {\n var _hash = hash\n ? hash\n : function (o) {\n return o;\n };\n\n var _map = {};\n var put = function (map, key, value) {\n if (!map[_hash(key)]) {\n map[_hash(key)] = [];\n }\n map[_hash(key)].push(value);\n };\n\n this.map(function (obj) {\n put(_map, obj, obj);\n });\n\n var out = [];\n for (var key in _map) {\n out.push(_map[key]);\n }\n return out;\n};\n", "/* asterisk:\n *\n * Add asterisk to labels for required fields\n *\n * Author: Niels Giesen\n * Copyright 2015 Berkeley Bridge\n *\n */\n(function ($, win, doc) {\n function appendAsterisk(child) {\n if (child.nodeType === 3 /* Node.TEXT_NODE */) {\n var val = child.nodeValue,\n space = \"\",\n words = val.split(\" \"),\n lastword = words.pop();\n // json.js adds a space for visual purposes\n if (lastword === \"\") {\n space = \" \";\n lastword = words.pop();\n }\n child.nodeValue = words.join(\" \");\n child.parentNode.insertAdjacentHTML(\n \"beforeEnd\",\n ' ' +\n lastword +\n ` *` +\n \"\" +\n space\n );\n } else if (child.nodeType === 1 /* Node.ELEMENT_NODE */) {\n if (child.lastChild) appendAsterisk(child.lastChild);\n }\n }\n\n $(doc).on(\"bb:updated\", function (event, $widget, control, updates) {\n if (updates.indexOf(\"isForNotNull\") > -1) {\n if (control.isForNotNull) {\n appendAsterisk($widget.get(0).lastChild);\n } else {\n const $stick = $widget.find(\".bb-p-asterisk-stick\");\n if (!$stick.get(0)) return;\n $stick.find(\"sup\").remove();\n const textnode = $stick.get(0).childNodes[0];\n if (textnode) $(textnode).unwrap();\n }\n }\n });\n})(jQuery, window, document);\n", "/* global $ */\n/* auto-next:\n *\n * Automatically go next on selection of radiogroup option, when that\n * radiogroup is the only editable question in the node.\n *\n * This behaviour used to be provided by our core module, but there\n * were many users who did not like it and disabled it by using the\n * now removed plugin `no-auto-next'.\n *\n * The behaviour is now reversed: automatically going next is not\n * supported by default, and if you do want it, use this plugin.\n *\n * Author: Niels Giesen\n * Copyright 2013, 2015, 2020 Berkeley Bridge\n *\n * Dependcy: questionlabelgroup-ng (or similar grouper?)\n *\n */\n\nimport { bb } from \"$json\";\nimport { isQuestion, isVisible, isReadOnly } from \"$json/lib/control-helpers\";\nimport {\n allPass,\n both,\n complement,\n compose,\n filter,\n length,\n map,\n pathOr,\n propEq,\n when\n} from \"$json/lib/functional\";\n\nlet evenWhenDynamic = pathOr(false, [\n \"arbitrary\",\n \"auto-next-when-only-radio\",\n \"evenWhenDynamic\"\n]);\n\nconst changeHandler = ({ currentTarget }) => {\n const control = $.data(currentTarget, \"control\");\n\n if (!currentTarget.closest(\".group.selected\")) return;\n\n const controls = control._group.controls;\n\n if (hasMultipleQuestions(controls)) return;\n\n if (!bb.Mode.get(\"a-mouse-user\")) return;\n\n bb.next();\n};\n\nconst isInteractionable = allPass([\n isQuestion,\n isVisible,\n complement(isReadOnly)\n]);\n\n// there is more than one interactionable control?\nconst hasMultipleQuestions = compose(\n x => x > 1,\n length,\n filter(isInteractionable)\n);\n\nconst radios = filter(both(isQuestion, propEq(\"controltype\", \"radio\")));\n\nconst addChangeHandler = when(Boolean, widget =>\n widget.addEventListener(\"change\", changeHandler)\n);\n\nconst makeLastInputDoNext =\n /*\n * Bind click event on last logical switching input elements to\n * go to the next screen automatically\n */\n compose(\n map(control => {\n addChangeHandler(document.getElementById(control.id));\n }),\n radios\n );\n\n$(document).on(\"bb:postHandleData\", function (event, data) {\n if (\n typeof data !== \"undefined\" &&\n data &&\n data.groups &&\n data.groups.length\n ) {\n data.groups.forEach(function (group) {\n if (evenWhenDynamic(bb.conf) || !group.dynamic)\n makeLastInputDoNext(group.controls);\n });\n }\n});\n", "(function ($) {\n $(document).on(\"bb:errorOn\", \".bb-input-wrap\", adderrorclass);\n $(document).on(\"bb:errorOff\", \".bb-input-wrap\", rmerrorclass);\n\n function adderrorclass(ev) {\n $(ev.currentTarget).addClass(\"bb-input-wrap--error\");\n }\n\n function rmerrorclass(ev) {\n $(ev.currentTarget).removeClass(\"bb-input-wrap--error\");\n }\n\n $(document).on(\"click\", \".selected .bb-input-wrap\", focus);\n\n function notAnInput(node) {\n return node.form === undefined; // With form inputs, this will\n // be either the form or null\n }\n function focus(ev) {\n if (notAnInput(ev.target)) {\n ev.currentTarget.querySelector(\"input, select, textarea\").focus();\n }\n }\n})(jQuery);\n", "/* busy:\n *\n * Set busy mode during server interaction\n *\n * Author: Tim Bauwens\n * Copyright 2011, 2013, 2015 Berkeley Bridge\n *\n */\n\n/* global jQuery */\n\nimport { bb } from \"$json\";\nimport { conf } from \"$json/lib/conf\";\nimport { pathOr } from \"$json/lib/functional\";\n\n($ => {\n $(document).on(\n pathOr(\"bb:preStep\", [\"arbitrary\", \"busy\", \"on\"], conf),\n function () {\n document.body.setAttribute(\"aria-busy\", true);\n bb.Mode.set(\"busy\");\n }\n );\n\n $(document).on(\n pathOr(\n \"bb:postHandleData bb:jsonError\",\n [\"arbitrary\", \"busy\", \"off\"],\n conf\n ),\n function () {\n document.body.setAttribute(\"aria-busy\", false);\n bb.Mode.unset(\"busy\");\n }\n );\n})(jQuery);\n", "import { registerWidget } from \"$json/lib/form-widgets\";\nimport { wControl } from \"$json/lib/control\";\nimport { _ } from \"$json/lib/gettext\";\n/* grids:\n *\n * Register grid type 'grid-tabs' when font-class reads 'grid_tabs'.\n *\n * Author: Niels Giesen\n * Copyright 2012, 2014 Berkeley Bridge\n *\n */\n(function ($, doc, win) {\n $(function () {\n $(document).on(\"bb:preHandleData\", function (event, data, status, req) {\n if (typeof data != \"undefined\" && data && data.groups)\n data.groups = $.map(data.groups, function (group) {\n group.controls = $.map(group.controls, function (control) {\n if (\n control.controltype === \"grid\" &&\n control[\"font-class\"] === \"grid_tabs\"\n ) {\n control.controltype = \"grid-tabs\";\n }\n return control;\n });\n return group;\n });\n });\n });\n\n var render = function (control, widget, group) {\n var tabs = $('
      '),\n deletebutton = \"\",\n addbutton = \"\";\n var label,\n labelidx,\n i = 0,\n sel_idx = 0,\n sel_tab;\n while (labelidx === undefined && control.columns[i]) {\n var controltype = control.columns[i].controltype;\n if (controltype !== \"checkbox\" && controltype !== \"radiobutton\") {\n labelidx = i;\n }\n i++;\n if (labelidx >= control.columns.length) break;\n }\n if (typeof labelidx === \"undefined\") labelidx = 0;\n $.each(control.value, function (i, row) {\n deletebutton = \"\";\n if (group.current && control.deleteallowed)\n deletebutton =\n '';\n var tab = $(\n '
      ' +\n row[labelidx].value +\n \"\" +\n deletebutton +\n \"
      \"\n );\n if (!sel_idx && row[labelidx].value === \"\") {\n sel_idx = i;\n tab.find(\"span\").text(\"(\" + _(\"new\") + \")\");\n sel_tab = tab;\n } else tabs.append(tab);\n });\n tabs.append(sel_tab);\n if (group.current && control.addallowed) {\n addbutton =\n '';\n tabs.append('
      ' + addbutton + \"'\n );\n widget.append(card);\n tabs.find(\".tab-\" + i).data(\"card\", card);\n $.each(row, function (ii, cell) {\n var rowhtml = $(\"\" + \"\"),\n cellhtml = $(\"\" + \"\");\n card.append(rowhtml);\n rowhtml.append(\n '\"\n );\n rowhtml.append(cellhtml);\n var column = control.columns[ii];\n wControl(\n $.extend(\n column,\n { id: control.id + \"-\" + i + \"-\" + ii },\n $.isPlainObject(cell) ? cell : { value: cell }\n ),\n group,\n cellhtml //append hereto\n );\n });\n });\n widget.find(\".tab-\" + sel_idx + \", .card-\" + sel_idx).addClass(\"selected\");\n widget\n .find(\".card tr:nth-child(\" + labelidx + 1 + \") input\")\n .on(\"change\", function () {\n var idx = $(this).parents(\".card\").data(\"idx\");\n $(this)\n .parents(\"*[data-type=grid-tabs]\")\n .find(\".tab-\" + idx)\n .find(\"span\")\n .text($(this).val());\n });\n };\n\n $(doc).on(\"click\", \".tab\", function () {\n $(this).addClass(\"selected\").siblings().removeClass(\"selected\");\n $(this)\n .data(\"card\")\n .addClass(\"selected\")\n .siblings()\n .removeClass(\"selected\");\n });\n\n registerWidget({\n name: \"grid-tabs\",\n tagName: \"div\",\n attribs: () => ({}),\n render: render\n });\n})(jQuery, document, window);\n", "import { bb } from \"$json\";\nimport { canEditEarlier } from \"$json/lib/feature-queries\";\nimport { conf } from \"$json/lib/conf\";\n/* has-required:\n *\n * Note whether there is any required question currently\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\n(function ($, win, doc) {\n $(function () {\n $(doc).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups) {\n var req = data.groups.some(function (group) {\n return (\n (canEditEarlier(conf) || group.current) &&\n group.controls.some(function (control) {\n return control.notnull;\n })\n );\n });\n bb.Mode.toggle(\"hasRequired\", req);\n }\n });\n });\n})(jQuery, window, document);\n", "import { bb } from \"$json\";\n/* headings:\n *\n * Turn labels whose font class (as provided the JSON object) match the\n * regular expression /^Standard title$|^Heading[^1-6]*([1-6]?)/ into headings.\n *\n * If the class has no numbering (e.g. 'Standard Title' instead of\n * 'Heading 2'), level 1 will be presumed.\n *\n * Since a model can run anywhere, it is possible to set a base level\n * for headings in arbitrary.headings.baseLevel (in\n * conf.json).\n *\n * If you want to force titles in 'addtobottom' nodes to duck below\n * the top ('cleared') node, declare arbitrary.headings.duck = true in\n * conf.json\n *\n * Author: Niels Giesen\n * Copyright 2016, 2018 Berkeley Bridge\n *\n */\n(function ($, win, doc) {\n var duck = false,\n baseLevel,\n topLevel,\n re = /^Standard title$|^Heading[^1-6]*([1-6]?)/;\n\n $(function () {\n try {\n baseLevel = bb.conf.arbitrary.headings.baseLevel;\n if (baseLevel === undefined) throw \"baseLevel is not defined\";\n topLevel = baseLevel - 1;\n } catch (err) {\n topLevel = 0;\n }\n\n try {\n duck = bb.conf.arbitrary.headings.duck;\n } catch (err) {}\n\n $(doc).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups && data.groups.length) {\n $.each(data.groups, function (_, group) {\n $.each(group.controls, function (_, ctl) {\n var klass = ctl[\"font-class\"],\n _level,\n m;\n if (ctl.controltype === \"label\" && ((m = klass.match(re)), m)) {\n _level = Number(m[1]) || 1;\n ctl._subtype = \"heading\";\n ctl._level =\n duck && group.screenmode !== \"clear\"\n ? _level + 1 + topLevel\n : _level + topLevel;\n }\n });\n });\n }\n });\n });\n})(jQuery, window, document);\n", "/*\n * high-on-info-tb.js\n *\n * As a simpler replacement to other\n * renditions of high-on-info.\n *\n */\n\nimport { bb } from \"$json\";\nimport Dialogue from \"$Dialogue\";\n\n((doc, $) => {\n function createClickable(textNode, descriptor, dialogue) {\n /*\n Take this text node and make three elements;\n one for the text before,\n one for the clickable\n one for thr rest of the text.\n */\n try {\n let text = textNode.textContent;\n let clickTextLength = descriptor.length;\n let clickTextPos = text.indexOf(descriptor);\n\n let preText = text.slice(0, clickTextPos);\n let clickText = doc.createTextNode(descriptor);\n let postText = text.slice(clickTextPos + clickTextLength, text.length);\n\n let container = doc.createElement(\"span\");\n\n let pre = doc.createTextNode(preText);\n\n let link = doc.createElement(\"a\");\n link.href = \"\";\n link.appendChild(clickText);\n link.className = \"p-high-on-info-tb-link\";\n link.addEventListener(\"click\", function (e) {\n e.preventDefault();\n e.stopPropagation();\n let inner = doc.createElement(\"div\");\n\n let title = doc.createElement(\"h2\");\n let titleTxt = doc.createTextNode(descriptor);\n title.append(titleTxt);\n let content = doc.createElement(\"div\");\n let contentTxt = doc.createTextNode(dialogue.content);\n content.append(contentTxt);\n // In case markdown is active, use it.\n try {\n $(content).showdown();\n } catch (e) {\n window.console && window.console.warn(e);\n }\n inner.append(title, content);\n dialogue.render(inner);\n });\n\n let post = doc.createTextNode(postText);\n\n container.appendChild(pre);\n container.appendChild(link);\n container.appendChild(post);\n\n return container;\n } catch (err) {\n return doc.createElement(\"span\");\n }\n }\n\n $(doc).on(\"bb:finalHandleData\", (e, data) => {\n if (data && data.informationsources) {\n // Create a map of info source descriptors.\n let descriptors = new Map();\n data.informationsources.forEach(info => {\n if (!info.isurl) {\n let dialogue = new Dialogue();\n dialogue.content = info.content;\n\n descriptors.set(info.description, {\n belongsto: info.belongsto,\n dialogue: dialogue\n });\n }\n });\n // For each descriptor, walk the element who owns the info source and replace the node.\n let cb = (source, descriptor, map) => {\n if (descriptor.length) {\n let tw = doc.createTreeWalker(\n doc.querySelector(`.group [data-id=\"${source.belongsto}\"]`),\n NodeFilter.SHOW_TEXT,\n null,\n false\n );\n\n var node = tw.nextNode(); // Move to first child.\n while (node) {\n // Must call nextNode before altering the currentNode. Otherwise, the tw returns no nextNode.\n let handlenode = tw.currentNode;\n node = tw.nextNode();\n if (handlenode.textContent.includes(descriptor)) {\n let replacement = createClickable(\n handlenode,\n descriptor,\n source.dialogue\n );\n handlenode.replaceWith(replacement);\n }\n }\n }\n };\n descriptors.forEach(cb);\n }\n });\n})(document, jQuery);\n", "/* history:\n *\n * Manage history using the html5 history api and sessionStorage\n *\n * Could have support for crunchbang ( #!modelname=thisandthat )\n *\n * Author: Niels Giesen\n * Copyright 2013, 2014, 2015 Berkeley Bridge\n *\n */\nimport { bb, _ } from \"$json\";\nimport { has } from \"$json/lib/functional\";\nimport { setSettled } from \"$json/lib/settled\";\n\n(function ($, win, history, location) {\n var crunchbang = false;\n\n if (history && history.pushState) {\n if (!location.origin) {\n location.origin =\n location.protocol +\n \"//\" +\n location.hostname +\n (location.port ? \":\" + location.port : \"\");\n }\n\n $(function () {\n var apinav,\n storage,\n params = $.parseQuery(location.hash.slice(2)),\n _title_sep = \" \",\n _title = document.title;\n\n try {\n storage = window.sessionStorage;\n } catch (err) {\n storage = null;\n }\n\n function directory(loc) {\n return loc.origin + loc.pathname.replace(/[^/]+$/, \"\");\n }\n\n function restoreState(state) {\n if (state.sessionid) {\n // restore case\n bb.ajax\n .post({\n url: \"action\",\n data: state\n })\n .then(setSettled);\n } else if (bb.getVar(\"sessionid\")) {\n // exit running case and restore model view\n bb.exit(() => bb.menu(state).then(setSettled));\n } else {\n // restore model view\n bb.menu(state).then(setSettled);\n }\n }\n\n function ditchState() {\n storage && storage.removeItem(\"state\");\n history.replaceState(null, null, null);\n setSettled();\n }\n\n if (location.search !== \"\") ditchState();\n\n var initial_state =\n history.state || (storage && JSON.parse(storage.getItem(\"state\")));\n\n if (initial_state) {\n // Detect explicit edit of the crunchbang - this should\n // override the dbname parameter and instead use the modelname\n if (params.modelname && params.modelname !== initial_state.modelname) {\n initial_state.modelname = params.modelname;\n delete initial_state.dbname;\n delete initial_state.sessionid;\n }\n\n if (initial_state.directory === directory(location)) {\n bb.Mode.set(\"isLoggedIn\"); // Yes, just an assumption it will go allright.\n restoreState(initial_state);\n } else {\n ditchState();\n }\n } else if (params.modelname) {\n // Bookmarked with crunchbang, but no state\n bb.Router(params);\n } else {\n setSettled();\n }\n\n $(document).on(\"bb:jsonError\", ditchState);\n\n $(document).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.uniqueid) {\n var title,\n state = {\n fmt: \"json\",\n uniqueid: data.uniqueid,\n // Save the 'directory part'\n directory: directory(location)\n };\n if (has(\"dbname\", data) && data.sessionid) {\n state.dbname = data.dbname;\n state.sessionid = data.sessionid;\n state.modelname = data.modelname; // Needed to get interpret explicit change to location\n\n if (data.modeldescription) {\n title = [_title, data.modeldescription.replace(/_/g, \" \")].join(\n _title_sep\n );\n }\n } else if (data.models) {\n var model = $.grep(data.models, function (m) {\n return m.selected;\n })[0],\n dbname = model ? model.dbname : null;\n if (dbname !== null) {\n state.dbname = dbname;\n title = [_title, model.modelname, \"-\", _(\"overview\")].join(\n _title_sep\n );\n } else {\n title = [_title, _(\"Your models\")].join(_title_sep);\n }\n }\n if (!apinav) {\n try {\n storage && storage.setItem(\"state\", JSON.stringify(state));\n } catch (e) {\n // Guard against QuotaExceededError (which always happens on Safari Private Browsing on iOS)\n }\n if (history.state && history.state.sessionid && state.sessionid) {\n history.replaceState(\n state,\n null,\n location.origin +\n location.pathname +\n ((crunchbang && \"#!modelname=\" + data.modelname) || \"\")\n );\n } else {\n if (data.modelname && crunchbang) {\n history.pushState(\n state,\n null,\n location.origin +\n location.pathname +\n \"#!modelname=\" +\n data.modelname\n );\n } else {\n history.pushState(\n state,\n null,\n location.origin + location.pathname\n );\n }\n }\n }\n if (title && document.title !== title) {\n document.title = title;\n }\n }\n // Something went miserably wrong. Clear history to get out of this mess.\n if (\n data &&\n ((data.error && data.error.summary) ||\n (data.groups && !data.groups.length) ||\n data.status === \"logout successful\")\n ) {\n // Extra check - may be we are but updating\n if (\n data &&\n data.error &&\n data.error.code &&\n data.error.code === 14 && // Error loading case\n data.error.subcode === 1002\n )\n // Updating\n return;\n ditchState();\n }\n apinav = false;\n });\n\n win.addEventListener(\"popstate\", function (e) {\n apinav = true;\n if (e.state) {\n if (e.state.directory === directory(location)) restoreState(e.state);\n else ditchState();\n }\n });\n });\n }\n})(jQuery, window, window.history, window.location);\n", "// Implements md-converter\nimport { default as MarkDown } from \"markdown-it\";\n\nexport { converter };\n\nconst converter = MarkDown({\n html: true,\n blankTarget: true,\n link: false\n}).disable([\"table\", \"strikethrough\"]);\n\n// Remember old renderer, if overridden, or proxy to default renderer\nvar defaultLinkRender =\n converter.renderer.rules.link_open ||\n function (tokens, idx, options, env, self) {\n return self.renderToken(tokens, idx, options);\n };\n\nconverter.renderer.rules.link_open = function (\n tokens,\n idx,\n options,\n env,\n self\n) {\n // If you are sure other plugins can't add `target` - drop check below\n const token = tokens[idx];\n const aIndex = token.attrIndex(\"target\");\n const hrefIndex = token.attrIndex(\"href\");\n const href = token.attrs[hrefIndex][1];\n\n if (!href.startsWith(\"#\")) {\n if (aIndex < 0) {\n tokens[idx].attrPush([\"target\", \"_blank\"]); // add new attribute\n } else {\n tokens[idx].attrs[aIndex][1] = \"_blank\"; // replace value of existing attr\n }\n }\n\n // pass token to default renderer.\n return defaultLinkRender(tokens, idx, options, env, self);\n};\n\nconverter.makeHtml = (html_in, only_phrasing) =>\n only_phrasing ? converter.renderInline(html_in) : converter.render(html_in);\n", "import { converter } from \"$md-converter\";\nimport { conf } from \"$json/lib/conf\";\nimport { updateLabels } from \"$json/lib/feature-queries\";\nimport { isLabel } from \"$json/lib/control-helpers\";\nimport { has } from \"$json/lib/functional\";\n\n/* md-labels.js:\n * Markdown all labels after insertion into the DOM\n *\n *\n *\n * Author: Niels Giesen\n * Copyright 2013, 2015, 2019 Berkeley Bridge\n *\n */\n\n(function ($) {\n $(function () {\n var topLevel, policy;\n\n try {\n var baseLevel = conf.arbitrary.headings.baseLevel;\n if (baseLevel === undefined) throw \"baseLevel is not defined\";\n topLevel = baseLevel - 1;\n } catch (err) {\n topLevel = 0;\n }\n\n try {\n policy = conf.arbitrary.showdown.policy;\n if ([\"legacy\"].indexOf(policy) === -1)\n throw \"showdown.policy is not 'legacy'\";\n } catch (err) {}\n\n const newline = conf.plugins.includes(\"showdown\") ? \"\\n\\n\" : \"\\n\";\n const newlineGlobRe = new RegExp(newline, \"g\");\n\n /**\n * Regular expression for paragraph open/end tags.\n * We don't want them.\n *\n **/\n var br_re = /
      /gi,\n onlyPhrasingInside = [\n \"P\",\n \"H1\",\n \"H2\",\n \"H3\",\n \"H4\",\n \"H5\",\n \"H6\",\n \"SPAN\",\n \"LABEL\",\n \"LEGEND\",\n \"CAPTION\"\n ];\n\n if (policy === \"legacy\") {\n onlyPhrasingInside.splice(9);\n }\n\n $.fn.showdown = function () {\n return this.each(function (i, e) {\n if (e.classList.contains(\"bb-p-showdown-labels\")) return;\n e = $(e);\n var html_in, html_out;\n var onlyPhrasing = allowOnlyPhrasing(e);\n let newline = \"\\n\";\n\n html_in = e.html().replace(br_re, newline);\n html_out = converter.makeHtml(html_in, onlyPhrasing);\n if (onlyPhrasing)\n html_out = html_out.trim().replace(newlineGlobRe, \"
      \");\n\n if (topLevel !== 0)\n html_out = html_out.replace(/(<\\/?h)([1-6])/g, demoteHeading);\n\n e.html(html_out).addClass(\"bb-p-showdown-labels\");\n });\n };\n\n function allowOnlyPhrasing(e) {\n return (\n onlyPhrasingInside.indexOf(e.get(0).nodeName) > -1 ||\n (policy !== \"legacy\" && e.hasClass(\"bb-label\"))\n );\n }\n\n function demoteHeading(m, m1, m2) {\n return m1 + Math.min(6, topLevel + Number(m2));\n }\n\n $(document).on(\"bb:postHandleData\", function (event, data) {\n if (data && data.groups) {\n $(\".bb-md-able\").showdown();\n $(document).trigger(\"bb:md-done\");\n $(document).trigger(\"bb:resized\");\n }\n });\n });\n\n document.addEventListener(\n \"bb:updatedControl\",\n ({ detail: { control, Updates } }) => {\n if (has(\"value\", Updates) && isLabel(control) && updateLabels(conf)) {\n control._elt.classList.remove(\"bb-p-showdown-labels\");\n control.$elt.showdown();\n }\n if (\n has(\"value\", Updates) &&\n control.controltype === \"grid\" &&\n updateLabels(conf)\n ) {\n control.$elt.find(\".bb-md-able\").showdown();\n }\n }\n );\n})(jQuery);\n", "/*\n * This utility can be imported to ease the use\n * of metadata by pulling it from the data provided.\n * The function will return an object containing three\n * properties:\n *\n * props --> a Map() containing a single entry per metadata property\n * with it's respective value of that metadata.\n *\n * groups --> a Map() containing a single property per group\n * which has metadata, and the value of that metadata.\n *\n * controls --> a Map() containing a single property per control\n * which has metadata, and the value of that metadata.\n */\n\nconst getmetadata = data => {\n let fromnode = {\n props: new Map(),\n groups: new Map(),\n controls: new Map()\n };\n\n try {\n data.groups.forEach(group => {\n if (group.metadata !== undefined) {\n fromnode.groups.set(group.groupid, group.metadata);\n Object.keys(group.metadata).forEach(metaprop => {\n fromnode.props.set(metaprop, group.metadata[metaprop]);\n });\n }\n group.controls !== undefined &&\n group.controls.forEach(control => {\n Object.keys(control).forEach(prop => {\n if (prop === \"metadata\") {\n fromnode.controls.set([control.id], control.metadata);\n Object.keys(control.metadata).forEach(metaprop => {\n fromnode.props.set(metaprop, control.metadata[metaprop]);\n });\n }\n });\n });\n });\n return fromnode;\n } catch (err) {\n window.console && window.console.warn(err);\n return fromnode;\n }\n};\n\nexport { getmetadata };\n", "/*\n * metadata-change-navtext\n *\n * Checks for metadata per node, specifically for\n * keys to change the nav button texts.\n *\n * Author: Tim Bauwens\n * Copyright: Berkeley Bridge 2020\n */\n\nimport { has } from \"$json/lib/functional\";\nimport { getmetadata } from \"$json/lib/getmetadata\";\n\n$(document).ready(() => {\n ((doc, $) => {\n let classes = [\"bb-next\", \"bb-prior\", \"bb-skip\", \"bb-restart\"];\n\n let originals = {};\n\n let flagged = [];\n\n classes.forEach(cls => {\n let button = doc.querySelector(`.${cls}`);\n if (!button) {\n // Remove this class, the button doesn't exist.\n flagged.push(cls);\n } else {\n let affected = button.querySelector(\".text\");\n if (!affected) {\n // Remove this class, and warn the user the template is not supportive.\n flagged.push(cls);\n window.console &&\n window.console.warn(\n `Using metadata-change-navtext with a non-supporting template.\n Please wrap nav strings with \"`\n );\n } else {\n originals[cls] = affected.innerText.trim();\n }\n }\n });\n\n classes = classes.filter(cls => !flagged.includes(cls));\n\n const reset = () => {\n // Reset strings to orig. values.\n classes.forEach(cls => {\n replace(cls, originals[cls]);\n });\n };\n\n const replace = (cls, string) => {\n doc.querySelectorAll(`.${cls}`).forEach(btn => {\n btn.querySelector(\".text\").innerText = string;\n });\n };\n\n $(doc).on(\"bb:finalHandleData\", (e, data) => {\n if (data && data.groups && data.groups.length) {\n reset();\n const groups = getmetadata(data).groups;\n let currentgroupid = data.groups.reduce(\n (id, group) => (group.current ? group.groupid : false),\n false\n );\n groups.forEach((group, id) => {\n if (id === currentgroupid) {\n classes.forEach(cls => {\n has(cls)(group) && replace(cls, group[cls]);\n });\n }\n });\n }\n });\n })(document, jQuery);\n});\n", "/*!\n * mustache.js - Logic-less {{mustache}} templates with JavaScript\n * http://github.com/janl/mustache.js\n */\n\n/*global define: false Mustache: true*/\n\nfunction mustacheFactory(mustache) {\n var objectToString = Object.prototype.toString;\n var isArray =\n Array.isArray ||\n function isArrayPolyfill(object) {\n return objectToString.call(object) === \"[object Array]\";\n };\n\n function isFunction(object) {\n return typeof object === \"function\";\n }\n\n /**\n * More correct typeof string handling array\n * which normally returns typeof 'object'\n */\n function typeStr(obj) {\n return isArray(obj) ? \"array\" : typeof obj;\n }\n\n function escapeRegExp(string) {\n return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n }\n\n /**\n * Null safe way of checking whether or not an object,\n * including its prototype, has a given property\n */\n function hasProperty(obj, propName) {\n return obj != null && typeof obj === \"object\" && propName in obj;\n }\n\n // Workaround for https://issues.apache.org/jira/browse/COUCHDB-577\n // See https://github.com/janl/mustache.js/issues/189\n var regExpTest = RegExp.prototype.test;\n function testRegExp(re, string) {\n return regExpTest.call(re, string);\n }\n\n var nonSpaceRe = /\\S/;\n function isWhitespace(string) {\n return !testRegExp(nonSpaceRe, string);\n }\n\n var entityMap = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\",\n \"`\": \"`\",\n \"=\": \"=\"\n };\n\n function escapeHtml(string) {\n return String(string).replace(/[&<>\"'`=\\/]/g, function fromEntityMap(s) {\n return entityMap[s];\n });\n }\n\n var whiteRe = /\\s*/;\n var spaceRe = /\\s+/;\n var equalsRe = /\\s*=/;\n var curlyRe = /\\s*\\}/;\n var tagRe = /#|\\^|\\/|>|\\{|&|=|!/;\n\n /**\n * Breaks up the given `template` string into a tree of tokens. If the `tags`\n * argument is given here it must be an array with two string values: the\n * opening and closing tags used in the template (e.g. [ \"<%\", \"%>\" ]). Of\n * course, the default is to use mustaches (i.e. mustache.tags).\n *\n * A token is an array with at least 4 elements. The first element is the\n * mustache symbol that was used inside the tag, e.g. \"#\" or \"&\". If the tag\n * did not contain a symbol (i.e. {{myValue}}) this element is \"name\". For\n * all text that appears outside a symbol this element is \"text\".\n *\n * The second element of a token is its \"value\". For mustache tags this is\n * whatever else was inside the tag besides the opening symbol. For text tokens\n * this is the text itself.\n *\n * The third and fourth elements of the token are the start and end indices,\n * respectively, of the token in the original template.\n *\n * Tokens that are the root node of a subtree contain two more elements: 1) an\n * array of tokens in the subtree and 2) the index in the original template at\n * which the closing tag for that section begins.\n */\n function parseTemplate(template, tags) {\n if (!template) return [];\n\n var sections = []; // Stack to hold section tokens\n var tokens = []; // Buffer to hold the tokens\n var spaces = []; // Indices of whitespace tokens on the current line\n var hasTag = false; // Is there a {{tag}} on the current line?\n var nonSpace = false; // Is there a non-space char on the current line?\n\n // Strips all whitespace tokens array for the current line\n // if there was a {{#tag}} on it and otherwise only space.\n function stripSpace() {\n if (hasTag && !nonSpace) {\n while (spaces.length) delete tokens[spaces.pop()];\n } else {\n spaces = [];\n }\n\n hasTag = false;\n nonSpace = false;\n }\n\n var openingTagRe, closingTagRe, closingCurlyRe;\n function compileTags(tagsToCompile) {\n if (typeof tagsToCompile === \"string\")\n tagsToCompile = tagsToCompile.split(spaceRe, 2);\n\n if (!isArray(tagsToCompile) || tagsToCompile.length !== 2)\n throw new Error(\"Invalid tags: \" + tagsToCompile);\n\n openingTagRe = new RegExp(escapeRegExp(tagsToCompile[0]) + \"\\\\s*\");\n closingTagRe = new RegExp(\"\\\\s*\" + escapeRegExp(tagsToCompile[1]));\n closingCurlyRe = new RegExp(\n \"\\\\s*\" + escapeRegExp(\"}\" + tagsToCompile[1])\n );\n }\n\n compileTags(tags || mustache.tags);\n\n var scanner = new Scanner(template);\n\n var start, type, value, chr, token, openSection;\n while (!scanner.eos()) {\n start = scanner.pos;\n\n // Match any text between tags.\n value = scanner.scanUntil(openingTagRe);\n\n if (value) {\n for (var i = 0, valueLength = value.length; i < valueLength; ++i) {\n chr = value.charAt(i);\n\n if (isWhitespace(chr)) {\n spaces.push(tokens.length);\n } else {\n nonSpace = true;\n }\n\n tokens.push([\"text\", chr, start, start + 1]);\n start += 1;\n\n // Check for whitespace on the current line.\n if (chr === \"\\n\") stripSpace();\n }\n }\n\n // Match the opening tag.\n if (!scanner.scan(openingTagRe)) break;\n\n hasTag = true;\n\n // Get the tag type.\n type = scanner.scan(tagRe) || \"name\";\n scanner.scan(whiteRe);\n\n // Get the tag value.\n if (type === \"=\") {\n value = scanner.scanUntil(equalsRe);\n scanner.scan(equalsRe);\n scanner.scanUntil(closingTagRe);\n } else if (type === \"{\") {\n value = scanner.scanUntil(closingCurlyRe);\n scanner.scan(curlyRe);\n scanner.scanUntil(closingTagRe);\n type = \"&\";\n } else {\n value = scanner.scanUntil(closingTagRe);\n }\n\n // Match the closing tag.\n if (!scanner.scan(closingTagRe))\n throw new Error(\"Unclosed tag at \" + scanner.pos);\n\n token = [type, value, start, scanner.pos];\n tokens.push(token);\n\n if (type === \"#\" || type === \"^\") {\n sections.push(token);\n } else if (type === \"/\") {\n // Check section nesting.\n openSection = sections.pop();\n\n if (!openSection)\n throw new Error('Unopened section \"' + value + '\" at ' + start);\n\n if (openSection[1] !== value)\n throw new Error(\n 'Unclosed section \"' + openSection[1] + '\" at ' + start\n );\n } else if (type === \"name\" || type === \"{\" || type === \"&\") {\n nonSpace = true;\n } else if (type === \"=\") {\n // Set the tags for the next time around.\n compileTags(value);\n }\n }\n\n // Make sure there are no open sections when we're done.\n openSection = sections.pop();\n\n if (openSection)\n throw new Error(\n 'Unclosed section \"' + openSection[1] + '\" at ' + scanner.pos\n );\n\n return nestTokens(squashTokens(tokens));\n }\n\n /**\n * Combines the values of consecutive text tokens in the given `tokens` array\n * to a single token.\n */\n function squashTokens(tokens) {\n var squashedTokens = [];\n\n var token, lastToken;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n if (token) {\n if (token[0] === \"text\" && lastToken && lastToken[0] === \"text\") {\n lastToken[1] += token[1];\n lastToken[3] = token[3];\n } else {\n squashedTokens.push(token);\n lastToken = token;\n }\n }\n }\n\n return squashedTokens;\n }\n\n /**\n * Forms the given array of `tokens` into a nested tree structure where\n * tokens that represent a section have two additional items: 1) an array of\n * all tokens that appear in that section and 2) the index in the original\n * template that represents the end of that section.\n */\n function nestTokens(tokens) {\n var nestedTokens = [];\n var collector = nestedTokens;\n var sections = [];\n\n var token, section;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n switch (token[0]) {\n case \"#\":\n case \"^\":\n collector.push(token);\n sections.push(token);\n collector = token[4] = [];\n break;\n case \"/\":\n section = sections.pop();\n section[5] = token[2];\n collector =\n sections.length > 0\n ? sections[sections.length - 1][4]\n : nestedTokens;\n break;\n default:\n collector.push(token);\n }\n }\n\n return nestedTokens;\n }\n\n /**\n * A simple string scanner that is used by the template parser to find\n * tokens in template strings.\n */\n function Scanner(string) {\n this.string = string;\n this.tail = string;\n this.pos = 0;\n }\n\n /**\n * Returns `true` if the tail is empty (end of string).\n */\n Scanner.prototype.eos = function eos() {\n return this.tail === \"\";\n };\n\n /**\n * Tries to match the given regular expression at the current position.\n * Returns the matched text if it can match, the empty string otherwise.\n */\n Scanner.prototype.scan = function scan(re) {\n var match = this.tail.match(re);\n\n if (!match || match.index !== 0) return \"\";\n\n var string = match[0];\n\n this.tail = this.tail.substring(string.length);\n this.pos += string.length;\n\n return string;\n };\n\n /**\n * Skips all text until the given regular expression can be matched. Returns\n * the skipped string, which is the entire tail if no match can be made.\n */\n Scanner.prototype.scanUntil = function scanUntil(re) {\n var index = this.tail.search(re),\n match;\n\n switch (index) {\n case -1:\n match = this.tail;\n this.tail = \"\";\n break;\n case 0:\n match = \"\";\n break;\n default:\n match = this.tail.substring(0, index);\n this.tail = this.tail.substring(index);\n }\n\n this.pos += match.length;\n\n return match;\n };\n\n /**\n * Represents a rendering context by wrapping a view object and\n * maintaining a reference to the parent context.\n */\n function Context(view, parentContext) {\n this.view = view;\n this.cache = { \".\": this.view };\n this.parent = parentContext;\n }\n\n /**\n * Creates a new context using the given view with this context\n * as the parent.\n */\n Context.prototype.push = function push(view) {\n return new Context(view, this);\n };\n\n /**\n * Returns the value of the given name in this context, traversing\n * up the context hierarchy if the value is absent in this context's view.\n */\n Context.prototype.lookup = function lookup(name) {\n var cache = this.cache;\n\n var value;\n if (cache.hasOwnProperty(name)) {\n value = cache[name];\n } else {\n var context = this,\n names,\n index,\n lookupHit = false;\n\n while (context) {\n if (name.indexOf(\".\") > 0) {\n value = context.view;\n names = name.split(\".\");\n index = 0;\n\n /**\n * Using the dot notion path in `name`, we descend through the\n * nested objects.\n *\n * To be certain that the lookup has been successful, we have to\n * check if the last object in the path actually has the property\n * we are looking for. We store the result in `lookupHit`.\n *\n * This is specially necessary for when the value has been set to\n * `undefined` and we want to avoid looking up parent contexts.\n **/\n while (value != null && index < names.length) {\n if (index === names.length - 1)\n lookupHit = hasProperty(value, names[index]);\n\n value = value[names[index++]];\n }\n } else {\n value = context.view[name];\n lookupHit = hasProperty(context.view, name);\n }\n\n if (lookupHit) break;\n\n context = context.parent;\n }\n\n cache[name] = value;\n }\n\n if (isFunction(value)) value = value.call(this.view);\n\n return value;\n };\n\n /**\n * A Writer knows how to take a stream of tokens and render them to a\n * string, given a context. It also maintains a cache of templates to\n * avoid the need to parse the same template twice.\n */\n function Writer() {\n this.cache = {};\n }\n\n /**\n * Clears all cached templates in this writer.\n */\n Writer.prototype.clearCache = function clearCache() {\n this.cache = {};\n };\n\n /**\n * Parses and caches the given `template` and returns the array of tokens\n * that is generated from the parse.\n */\n Writer.prototype.parse = function parse(template, tags) {\n var cache = this.cache;\n var tokens = cache[template];\n\n if (tokens == null)\n tokens = cache[template] = parseTemplate(template, tags);\n\n return tokens;\n };\n\n /**\n * High-level method that is used to render the given `template` with\n * the given `view`.\n *\n * The optional `partials` argument may be an object that contains the\n * names and templates of partials that are used in the template. It may\n * also be a function that is used to load partial templates on the fly\n * that takes a single argument: the name of the partial.\n */\n Writer.prototype.render = function render(template, view, partials) {\n var tokens = this.parse(template);\n var context = view instanceof Context ? view : new Context(view);\n return this.renderTokens(tokens, context, partials, template);\n };\n\n /**\n * Low-level method that renders the given array of `tokens` using\n * the given `context` and `partials`.\n *\n * Note: The `originalTemplate` is only ever used to extract the portion\n * of the original template that was contained in a higher-order section.\n * If the template doesn't use higher-order sections, this argument may\n * be omitted.\n */\n Writer.prototype.renderTokens = function renderTokens(\n tokens,\n context,\n partials,\n originalTemplate\n ) {\n var buffer = \"\";\n\n var token, symbol, value;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n value = undefined;\n token = tokens[i];\n symbol = token[0];\n\n if (symbol === \"#\")\n value = this.renderSection(token, context, partials, originalTemplate);\n else if (symbol === \"^\")\n value = this.renderInverted(token, context, partials, originalTemplate);\n else if (symbol === \">\")\n value = this.renderPartial(token, context, partials, originalTemplate);\n else if (symbol === \"&\") value = this.unescapedValue(token, context);\n else if (symbol === \"name\") value = this.escapedValue(token, context);\n else if (symbol === \"text\") value = this.rawValue(token);\n\n if (value !== undefined) buffer += value;\n }\n\n return buffer;\n };\n\n Writer.prototype.renderSection = function renderSection(\n token,\n context,\n partials,\n originalTemplate\n ) {\n var self = this;\n var buffer = \"\";\n var value = context.lookup(token[1]);\n\n // This function is used to render an arbitrary template\n // in the current context by higher-order sections.\n function subRender(template) {\n return self.render(template, context, partials);\n }\n\n if (!value) return;\n\n if (isArray(value)) {\n for (var j = 0, valueLength = value.length; j < valueLength; ++j) {\n buffer += this.renderTokens(\n token[4],\n context.push(value[j]),\n partials,\n originalTemplate\n );\n }\n } else if (\n typeof value === \"object\" ||\n typeof value === \"string\" ||\n typeof value === \"number\"\n ) {\n buffer += this.renderTokens(\n token[4],\n context.push(value),\n partials,\n originalTemplate\n );\n } else if (isFunction(value)) {\n if (typeof originalTemplate !== \"string\")\n throw new Error(\n \"Cannot use higher-order sections without the original template\"\n );\n\n // Extract the portion of the original template that the section contains.\n value = value.call(\n context.view,\n originalTemplate.slice(token[3], token[5]),\n subRender\n );\n\n if (value != null) buffer += value;\n } else {\n buffer += this.renderTokens(\n token[4],\n context,\n partials,\n originalTemplate\n );\n }\n return buffer;\n };\n\n Writer.prototype.renderInverted = function renderInverted(\n token,\n context,\n partials,\n originalTemplate\n ) {\n var value = context.lookup(token[1]);\n\n // Use JavaScript's definition of falsy. Include empty arrays.\n // See https://github.com/janl/mustache.js/issues/186\n if (!value || (isArray(value) && value.length === 0))\n return this.renderTokens(token[4], context, partials, originalTemplate);\n };\n\n Writer.prototype.renderPartial = function renderPartial(\n token,\n context,\n partials\n ) {\n if (!partials) return;\n\n var value = isFunction(partials) ? partials(token[1]) : partials[token[1]];\n if (value != null)\n return this.renderTokens(this.parse(value), context, partials, value);\n };\n\n Writer.prototype.unescapedValue = function unescapedValue(token, context) {\n var value = context.lookup(token[1]);\n if (value != null) return value;\n };\n\n Writer.prototype.escapedValue = function escapedValue(token, context) {\n var value = context.lookup(token[1]);\n if (value != null) return mustache.escape(value);\n };\n\n Writer.prototype.rawValue = function rawValue(token) {\n return token[1];\n };\n\n mustache.name = \"mustache.js\";\n mustache.version = \"2.2.1\";\n mustache.tags = [\"{{\", \"}}\"];\n\n // All high-level mustache.* functions use this writer.\n var defaultWriter = new Writer();\n\n /**\n * Clears all cached templates in the default writer.\n */\n mustache.clearCache = function clearCache() {\n return defaultWriter.clearCache();\n };\n\n /**\n * Parses and caches the given template in the default writer and returns the\n * array of tokens it contains. Doing this ahead of time avoids the need to\n * parse templates on the fly as they are rendered.\n */\n mustache.parse = function parse(template, tags) {\n return defaultWriter.parse(template, tags);\n };\n\n /**\n * Renders the `template` with the given `view` and `partials` using the\n * default writer.\n */\n mustache.render = function render(template, view, partials) {\n if (typeof template !== \"string\") {\n throw new TypeError(\n 'Invalid template! Template should be a \"string\" ' +\n 'but \"' +\n typeStr(template) +\n '\" was given as the first ' +\n \"argument for mustache#render(template, view, partials)\"\n );\n }\n\n return defaultWriter.render(template, view, partials);\n };\n\n // This is here for backwards compatibility with 0.4.x.,\n /*eslint-disable */ // eslint wants camel cased function name\n mustache.to_html = function to_html(template, view, partials, send) {\n /*eslint-enable*/\n\n var result = mustache.render(template, view, partials);\n\n if (isFunction(send)) {\n send(result);\n } else {\n return result;\n }\n };\n\n // Export the escaping function so that the user may override it.\n // See https://github.com/janl/mustache.js/issues/244\n mustache.escape = escapeHtml;\n\n // Export these mainly for testing, but also for advanced usage.\n mustache.Scanner = Scanner;\n mustache.Context = Context;\n mustache.Writer = Writer;\n}\n\nlet Mustache = {};\n\nmustacheFactory(Mustache);\n\nexport default Mustache;\nexport { Mustache };\n", "/*\n * Show preview documents\n *\n * See readme.md in this directory.\n *\n * Author: Niels Giesen\n * Copyright (C) 2014-2019 by Berkeley Bridge\n *\n */\nimport { fromApiServer } from \"$json/lib/location\";\nimport { gt, _, bb } from \"$json\";\nimport Mustache from \"$mustache\";\nlet $ = jQuery;\nconst config = bb.propFinder(bb.conf, \"arbitrary.previews\");\n\n// Text that may be shown when there is no default preview available.\nconst fallBackText = config(\"fallbacktext\");\nlet _snips = [];\n\nconst styleElt = config => {\n let s = document.createElement(\"style\");\n s.textContent = `\nhtml {\n height: 100%;\n}\n${config(\n \"iframe.style\",\n `\nhtml {\n background-color: transparent;\n}\n.bb-path {\n box-shadow: none;\n padding: 0;\n max-width: 100%;\n}\n.bb-p-preview-new {\n border-left: 10px solid #189bd8;\n padding-left: 10px;\n}`\n)}\n`;\n return s;\n};\n\nlet iframeStyle = styleElt(config);\n\nlet uncached = url => url + \"&_nocache=\" + new Date().getTime();\n\ngt.addTranslations({\n // Actually means no preview could be loaded (not in the correct format or some other error).\n \"no preview available\": {\n nl: \"geen preview beschikbaar\",\n fr: \"aucune pr\u00E9visualisation disponible\",\n de: \"keine Vorschau verf\u00FCgbar\",\n ru: \"\u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D\"\n },\n \"open this preview in a new window\": {\n nl: \"open deze preview in een apart venster\",\n fr: \"ouvrir cette pr\u00E9visualisation dans une autre fen\u00EAtre\",\n de: \"\u00F6ffne diese Vorschau in einem neuem Fenster\",\n ru: \"\u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0432 \u043D\u043E\u0432\u043E\u043C \u043E\u043A\u043D\u0435\"\n }\n});\n\nfunction compareSnippets($container, _snips) {\n const snippets = $container.find(\"h1,h2,h3,h4,h5,h6,p,ul\");\n let num = 0;\n const tmpsnips = [];\n $.each(snippets, function () {\n let snip = this.innerHTML;\n if (_snips.indexOf(snip) === -1) {\n this.classList.add(\"bb-p-preview-new\");\n if (++num == 1) $container.scrollTo(this);\n }\n tmpsnips.push(snip);\n });\n return tmpsnips;\n}\n\nconst removeEmptyItems = node => {\n let items = node.querySelectorAll(\"li, p\");\n for (let i = items.length; i > 0; --i) {\n let item = items[i - 1];\n if ($.trim(item.textContent) === \"\") {\n if (!item.nextElementSibling && !item.previousElementSibling)\n item.parentNode.parentNode.removeChild(item.parentNode);\n else item.parentNode.removeChild(item);\n }\n }\n};\n\nconst onLoadHandler = (iframe, portion, config) => () => {\n const doc = iframe.contentDocument;\n if (!doc.querySelector(portion)) {\n bb.Mode.unset(\"hasTextInside\");\n } else {\n bb.Mode.set(\"hasText\");\n bb.Mode.set(\"hasTextInside\");\n removeEmptyItems(doc.body);\n doc.head.appendChild(iframeStyle);\n if (config(\"showChanges\")) {\n _snips = compareSnippets($(doc), _snips);\n }\n if (config(\"iframe.resize\") && \"IntersectionObserver\" in window) {\n let options = {\n root: doc.body.parentElement,\n rootMargin: \"0px\",\n threshold: 1.0\n };\n var callback = function (entries, observer) {\n entries.forEach(entry => {\n if (entry.isIntersecting && entry.intersectionRatio == 1) {\n } else {\n let rect = doc.body.getBoundingClientRect();\n if (rect.height) iframe.style.height = `${rect.height + 200}px`;\n }\n });\n };\n let observer = new IntersectionObserver(callback, options);\n observer.observe(doc.body);\n }\n // Previews.trigger('reloaded', [ doc, iframe ]);\n }\n};\n\n(function (win, doc) {\n $(function () {\n var _document; // which document?\n var _textURL; // which url?\n var _outside = false;\n var $container = $(\"#bb-p-preview\");\n let iframe;\n\n if (config(\"iframe.on\")) {\n iframe = document.createElement(\"iframe\");\n iframe.setAttribute(\"class\", \"p-previews-frame\");\n }\n\n /* Remove all notion of current preview\n */\n function cleanUp(all) {\n bb.Mode.unset(\"hasText\");\n bb.Mode.unset(\"hasTextInside\");\n // Following line seems to have been too blunt:\n all && bb.Mode.unset(\"hasPreviews\");\n $container.empty();\n _textURL = undefined;\n _document = undefined;\n }\n\n /* reload\n * @param (String) href: (optional) URL, Will use cached URL if omitted.\n * @param (Srting) document: (optional) Template name. Cache it so\n * we can check its validity later on.\n */\n function reload(url, document, portion) {\n if (url) _textURL = url;\n if (document) _document = document;\n if (_textURL) loadDoc(_textURL, portion);\n }\n\n let loadInside = config(\"iframe.on\")\n ? (url, portion) => {\n bb.Mode.set(\"hasTextInside\");\n $container.empty();\n $container.append(iframe);\n iframe.src = uncached(url);\n var handler = onLoadHandler(iframe, portion, config);\n iframe.onload = handler;\n }\n : (url, portion) => {\n $container.load(\n url + \"&_nocache=\" + new Date().getTime() + ` ${portion}`,\n function (responseText) {\n // If container is empty, loading has apparently failed.\n if ($container.find(portion).length === 0) {\n // cleanUp()\n $container.text(_(\"no preview available\"));\n bb.Mode.unset(\"hasTextInside\");\n } else {\n bb.Mode.set(\"hasTextInside\");\n var btn = $(outsidebutton);\n $container.prepend(btn);\n btn.on(\"click\", function () {\n loadOutside(url);\n });\n if (config(\"showChanges\")) {\n _snips = compareSnippets($container, _snips);\n }\n removeEmptyItems($container.get(0));\n $(doc).trigger(\"bb-p:previews-rendered\", {\n $container,\n responseText\n });\n }\n }\n );\n };\n\n function loadDoc(url, portion) {\n if (!url) return;\n if (!portion) portion = \"#preview\";\n bb.Mode.set(\"hasText\");\n\n $('#bb-p-previews a[href=\"' + url + '\"]')\n .addClass(\"selected\")\n .siblings()\n .removeClass(\"selected\");\n\n if (!_outside) {\n loadInside(fromApiServer(url), portion);\n }\n if (_outside) {\n loadOutside(fromApiServer(url));\n }\n }\n\n function loadOutside(url) {\n _outside = true;\n bb.Mode.unset(\"hasTextInside\");\n $container.empty();\n\n var w = win.open(\n url + \"&_nocache=\" + new Date().getTime(),\n \"Preview\",\n \"resizable=yes,scrollbars=yes\",\n true\n );\n if (!w.closed)\n var watchClose = win.setInterval(function () {\n try {\n if (w.closed) {\n win.clearTimeout(watchClose);\n //Do something here...\n _outside = false;\n bb.Mode.set(\"hasTextInside\");\n reload();\n }\n } catch (e) {}\n }, 200);\n }\n\n $(document).on(\"click\", \"#bb-p-previews a\", function () {\n if (!$container.length) return true;\n reload(this.getAttribute(\"href\"), this.getAttribute(\"data-document\"));\n return false;\n });\n\n var tmpl = $(\"#bb-p-previews-template\").html() || \"\";\n var outsidetmpl = $(\"#bb-p-preview-outside-template\").html();\n if (!outsidetmpl) {\n outsidetmpl =\n '\";\n }\n Mustache.tags = [\"[[\", \"]]\"];\n var outsidebutton = Mustache.render(outsidetmpl, {\n title: _(\"open this preview in a new window\")\n });\n\n // Each navigatory action w/ documents re-renders links and fetches the document.\n $(document).on(\"bb:postHandleData\", function (event, data) {\n if (!data.documents) {\n if (\n (data && data.status && data.status === \"logout successful\") ||\n (data.models && data.models.length > 0)\n ) {\n cleanUp(true);\n }\n return;\n } else {\n if (data.documents.length > 0) {\n bb.Mode.set(\"hasPreviews\");\n // Some plugins used to remove all but the first document => config option 'singular'.\n if (config(\"singular\") === true) {\n data.documents = [data.documents[0]];\n }\n }\n var gHD = getHref(data);\n var selected = data.documents.find(function (doc) {\n return _document === doc.document;\n // The following is more expensive:\n // return (_textURL === (doc.href && doc.href() || gHD.bind(doc)()))\n });\n // autoload: true: load first model-level document.\n // autoload: 'any': load first document, period (could be audit trail).\n if (!selected && config(\"autoload\")) {\n selected = data.documents.find(function (doc) {\n if (config(\"autoload\") === \"any\") return true;\n if (config(\"autoload\") === true) return !doc.href; // Set by previews-include-audit-trail.\n });\n }\n if (selected) {\n selected.selected = true;\n _document = selected.document;\n _textURL = (selected.href && selected.href()) || gHD.bind(selected)();\n } else {\n cleanUp();\n if (fallBackText) $container.text(fallBackText);\n }\n\n var templatedata = {\n documents: data.documents,\n name: function () {\n return this.document.replace(/_/g, \" \");\n },\n breakablename: function () {\n return this.document.replace(/_/g, \" \");\n },\n href: getHref(data)\n };\n $(\"#bb-p-previews\").html(Mustache.render(tmpl, templatedata));\n\n if (selected) {\n reload();\n }\n }\n });\n\n function getHref(data) {\n return function () {\n return (\n \"preview?\" +\n \"dbname=\" +\n data.dbname +\n \"&sessionid=\" +\n data.sessionid +\n \"&uniqueid=\" +\n data.uniqueid +\n \"&template=\" +\n this.document\n );\n };\n }\n\n /**\n * Export loadDoc function\n */\n bb.Plugins = $.extend({}, bb.Plugins, {\n previews: {\n loadDoc: loadDoc,\n reload: reload\n }\n });\n });\n})(window, document);\n", "import { bb } from \"$json\";\n/* shout-out-resize: post message to parent on resize\n *\n *\n * Author: Niels Giesen\n * Copyright 2013, 2016, 2019, 2021 Berkeley Bridge\n *\n */\n(function pluginShoutOut($, document) {\n const leeway = bb.propFinder(bb.conf, \"arbitrary\")(\n \"shout-out-resize.leeway\",\n 80\n );\n const minheight = bb.propFinder(bb.conf, \"arbitrary\")(\n \"shout-out-resize.minheight\",\n 100\n );\n const timeout = 200;\n let origins;\n\n if (top === self) {\n bb.Mode.unset(\"isEmbedded\");\n if (typeof console != \"undefined\" && console && console.log) {\n console.log(\"Not inside iframe... backing out early\");\n }\n return;\n } else {\n bb.Mode.set(\"isEmbedded\");\n }\n\n if (!(\"postMessage\" in window.parent)) {\n return;\n }\n try {\n origins = bb.conf.arbitrary.parentDomain; //e.g. 'https://bridge-to-knowledge.nl';\n if (typeof origins === \"string\") {\n origins = [origins];\n }\n } catch (e) {\n window.console && window.console.warn(e);\n return;\n }\n\n function callOut(data) {\n bb.Mode.set(\"isNotScrolling\");\n origins.forEach(function (origin) {\n window.parent.postMessage(JSON.stringify(data), origin);\n });\n }\n\n $(function () {\n if (\"ResizeObserver\" in window) {\n const ro = new ResizeObserver(function (entries) {\n const cr = entries[0].contentRect;\n let height = cr.height >= minheight ? cr.height : minheight;\n callOut({ height: height });\n });\n ro.observe(document.body);\n } else {\n const resize = () => {\n callOut({ height: $(document.body).height() + leeway });\n };\n\n $(\"body\").append(\n ''\n );\n\n document.getElementById(\"frame0\").onresize = function () {\n window.setTimeout(resize, timeout);\n };\n\n $(document).on(\"bb:postHandleData\", resize);\n $(document).on(\"bb:resized\", resize);\n $(document).on(\"bb:userError\", resize);\n }\n });\n})(jQuery, document);\n", "import { _ } from \"$json\";\n/* show-server-side-validation:\n *\n * Show errors after server-side validation.\n *\n * Copyright (C) 2011, 2017 by Berkeley Bridge\n *\n */\n(function ($) {\n var options = {\n silent: false,\n justhide: false\n };\n\n $(document).on(\"bb:postHandleData\", function (event, data) {\n if (data && data.lasterrors && data.lasterrors.length > 0) {\n var error;\n for (var i = 0, len = data.lasterrors.length; i < len; i++) {\n error = data.lasterrors[i];\n $(`[id=\"${data.screenid}-${error.name}\"]`).showValidation(\n options,\n false,\n map(error.errortext)\n );\n }\n }\n });\n\n function map(errortext) {\n switch (errortext) {\n case \"Input mandatory\":\n return _(\"Input required\");\n case \"E4004:Choice is mandatory\":\n return _(\"Choice required\");\n default:\n return _(errortext);\n }\n }\n})(jQuery);\n", "/* skip:\n *\n * Stub to include skip button (or not)\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\n(function ($, win, doc) {\n $(function () {});\n})(jQuery, window, document);\n", "import { compose } from \"./functional.js\";\nconst notWithNegIndex = s => s + `:not([tabindex=\"-1\"])`;\nconst notDisabled = s => s + \":not([disabled])\";\nconst notHidden = s => s + \":not([hidden])\";\n\nconst basicElements = [\n \"button\",\n 'input:not([type=\"hidden\"])',\n \"select\",\n \"textarea\",\n \"text-area\",\n \"a[href]\",\n \"summary\"\n];\n\nexport const tabbableSelector = basicElements\n .map(compose(notWithNegIndex, notDisabled, notHidden))\n .concat([`[tabindex=\"0\"]`])\n .join(\", \");\n\nexport const tabbableSelectorIncludingNegIndexed = basicElements\n .map(compose(notDisabled, notHidden))\n .concat([`[tabindex=\"0\"]`])\n .join(\", \");\n", "import { tabbableSelector } from \"$json/lib/keyboard\";\n\n$(document).on(\"bb:userError\", () => {\n const fst = document.querySelector(\n \".group .validatable:not([aria-hidden=true])[aria-invalid=true]\"\n );\n if (fst === null) return;\n if (fst.matches(tabbableSelector)) {\n fst.focus(); // NOTE: fails with complex widgets.\n } else {\n const focusable = fst.querySelector(tabbableSelector);\n focusable && focusable.focus();\n }\n (fst.closest(\".bb-questionlabelgroup\") || fst).scrollIntoView({\n behavior: window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n ? \"auto\"\n : \"smooth\"\n });\n});\n", "/* wrap-table\n *\n * Wrap tables in separate div to be able to scroll horizontally\n *\n * Author: Niels Giesen\n * Copyright 2015, 2016 Berkeley Bridge\n *\n */\n\nimport { bb } from \"$json\";\n\nlet $ = jQuery;\n\nconst config = bb.propFinder(bb.conf, \"arbitrary.wrap-table\");\nconst wrapToggler =\n bb.conf.plugins.includes(\"grids-to-cards-toggle\") &&\n config(\"wrap-toggler\") === true;\n\nfunction wrapHandler(event, data) {\n if (data && data.groups)\n $(\".bb-questionlabelgroup>table, .group>table\").each(function (_, table) {\n let wrap = document.createElement(\"div\");\n let toggler = wrapToggler && table.previousElementSibling;\n wrap.setAttribute(\"class\", \"bb-p-wrap-table\");\n table.parentNode.replaceChild(wrap, table);\n wrap.appendChild(table);\n if (toggler && toggler.classList.contains(\"bb-p-grid-to-card-toggle\"))\n wrap.insertAdjacentElement(\"afterBegin\", toggler);\n });\n}\n\n$(function () {\n $(document).on(\"bb:postHandleData\", wrapHandler);\n});\n"], "mappings": "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", "names": [] }