{"version":3,"file":"admin.js","sources":["../../../assets/js/modules/admin/UserCreationForm.ts","../../../assets/js/utils.ts","../../../assets/js/modules/admin/AdminPageViewLogger.ts","../../../node_modules/path-to-regexp/dist/index.js","../../../assets/js/modules/router.ts","../../../assets/js/modules/heartbeat.ts","../../../assets/js/admin.ts"],"sourcesContent":["export default class UserCreationForm {\n    fieldPassword1: HTMLInputElement;\n    fieldPassword2: HTMLInputElement;\n\n    constructor() {\n        this.fieldPassword1 = <HTMLInputElement>document.getElementById(\"id_password1\");\n        this.fieldPassword2 = <HTMLInputElement>document.getElementById(\"id_password2\");\n    }\n\n    /**\n     * @returns UserCreationForm\n     */\n    public static create(): UserCreationForm {\n        return new UserCreationForm();\n    }\n\n    /**\n     * @returns void\n     */\n    public main(): void {\n        this.toggleRevealPasswords();\n    }\n\n    /**\n     * Toggles the reveal passwords when a password field is focused or blurred.\n     *\n     * @returns void\n     */\n    private toggleRevealPasswords(): void {\n        let togglePassword = function () {\n            if (this.type === \"password\") {\n                this.type = \"text\";\n            } else if (this.type === \"text\") {\n                this.type = \"password\";\n            }\n        };\n\n        this.fieldPassword1.addEventListener(\"focus\", togglePassword);\n        this.fieldPassword1.addEventListener(\"blur\", togglePassword);\n        this.fieldPassword2.addEventListener(\"focus\", togglePassword);\n        this.fieldPassword2.addEventListener(\"blur\", togglePassword);\n    }\n}\n","export function getCookie(name: string) {\n\tlet cookieValue = null;\n\n\tif (document.cookie && document.cookie !== '') {\n\t\tconst cookies = document.cookie.split(';');\n\n\t\tfor (let i = 0; i < cookies.length; i++) {\n\t\t\tconst cookie = cookies[i].trim();\n\n\t\t\t// Does this cookie string begin with the name we want?\n\t\t\tif (cookie.substring(0, name.length + 1) === (name + '=')) {\n\t\t\t\tcookieValue = decodeURIComponent(cookie.substring(name.length + 1));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn cookieValue;\n}","import { getCookie } from \"../../utils\";\n\nlet logUsePageViewStatus = 200; // The status code of the last log ping.\n\nexport default class AdminPageViewLogger {\n    static readonly PAGE_ID_SESSION_KEY: string = \"classroom_viewing_page_id\";\n    static readonly PAGE_ID_SESSION_TAB_KEY: string = \"classroom_viewing_page_tab\";\n    private pageId: number = 0;\n    private tabUUID: string = \"\";\n\n    constructor(pageId: number) {\n        this.pageId = (pageId < 0) ? 0 : pageId;\n\n        let storedTabId = sessionStorage.getItem(AdminPageViewLogger.PAGE_ID_SESSION_TAB_KEY);\n\n        if (storedTabId === null || storedTabId === \"\" || window.name === '') {\n            storedTabId = \"randomUUID\" in crypto ? crypto.randomUUID() : \"tab-\" + Math.floor(Math.random() * 32).toString();\n            sessionStorage.setItem(AdminPageViewLogger.PAGE_ID_SESSION_TAB_KEY, storedTabId);\n            window.name = \"window-\" + this.makeUUID();\n        }\n        this.tabUUID = storedTabId;\n    }\n\n    /**\n     * Factory method for convenience.\n     *\n     * @param pageId\n     * @returns AdminPageViewLogger\n     */\n    public static create(pageId: number): AdminPageViewLogger {\n        return new AdminPageViewLogger(pageId);\n    }\n\n    /**\n     * @returns void\n     */\n    public main() {\n        // Run cleanup first to remove existing viewed page of tab session.\n        AdminPageViewLogger.removeSessionData();\n        if (this.pageId > 0) {\n            // Log the page view.\n            this.logUserPageView();\n\n            // Keep updating log ever 15 seconds while user is on the page.\n            let logInterval = setInterval(() => {\n                this.logUserPageView();\n                if (logUsePageViewStatus < 200 || logUsePageViewStatus > 299) {\n                    clearInterval(logInterval);\n                }\n            }, 5000);\n        }\n    }\n\n    /**\n     * returns either randomUUID or a string with random numbers\n     */\n    public makeUUID() {\n        return \"randomUUID\" in crypto ? crypto.randomUUID() : \"tab-\" + Math.floor(Math.random() * 100000).toString();\n    }\n\n    /**\n     * Cleans up the stored session data for the logger.\n     *\n     * @returns void\n     */\n    public static removeSessionData() {\n        let storedPageId = sessionStorage.getItem(AdminPageViewLogger.PAGE_ID_SESSION_KEY);\n        if (storedPageId !== null) {\n            AdminPageViewLogger.create(parseInt(storedPageId)).deleteUserPageView();\n        }\n    }\n\n    /**\n     * @returns void\n     */\n    public deleteUserPageView() {\n        if (this.pageId > 0) {\n            $.ajax(this.buildApiData(\"DELETE\"));\n        }\n\n        sessionStorage.removeItem(AdminPageViewLogger.PAGE_ID_SESSION_KEY);\n    }\n\n    /**\n     * @returns void\n     */\n    public logUserPageView() {\n        if (this.pageId < 1) {\n            return;\n        }\n        let postAPIData = this.buildApiData(\"POST\");\n\n        $.ajax(postAPIData).done(function (data, textStatus, jqXHR) {\n            sessionStorage.setItem(AdminPageViewLogger.PAGE_ID_SESSION_KEY, data.page_id);\n            if (data.other_users === undefined || data.other_users.length == 0) {\n                $(\".users_editing_warning\").hide();\n            }\n\n            if (data.has_newer_revision && $(\"#messages-revision-warning\").length == 0) {\n                $(\".messages ul\").append('<li class=\"warning\" id=\"messages-revision-warning\"><svg class=\"icon icon-warning messages-icon\" aria-hidden=\"true\"><use href=\"#icon-warning\"></use></svg> Newer revisions have been made. Please refresh your page to receive the latest edits.</li>');\n            }\n\n            let dupTabMessageElem = $(\"#messages-duplicate-tabs-warning\");\n\n            if (data.has_duplicate_tabs && dupTabMessageElem.length == 0) {\n                $(\".messages ul\").append('<li class=\"warning\" id=\"messages-duplicate-tabs-warning\"><svg class=\"icon icon-warning messages-icon\" aria-hidden=\"true\"><use href=\"#icon-warning\"></use></svg> <b>Heads Up!</b> You might have this editor window opened in two different tabs. Data conflicts may occur.</li>');\n            } else if (data.has_duplicate_tabs === false && dupTabMessageElem.length > 0) {\n                dupTabMessageElem.remove();\n            }\n        }).always(function (jqXHR) {\n            logUsePageViewStatus = jqXHR.status;\n        });\n    }\n\n    /**\n     * @param httpMethod\n     * @returns object\n     */\n    private buildApiData(httpMethod: string): object {\n        return {\n            url: \"/newshour/classroom/dashboard/pages/\" + this.pageId + \"/viewers/\" + this.tabUUID + \"/\",\n            method: httpMethod,\n            headers: { \"X-CSRFToken\": getCookie(\"csrftoken\") }\n        }\n    }\n}","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PathError = exports.TokenData = void 0;\nexports.parse = parse;\nexports.compile = compile;\nexports.match = match;\nexports.pathToRegexp = pathToRegexp;\nexports.stringify = stringify;\nconst DEFAULT_DELIMITER = \"/\";\nconst NOOP_VALUE = (value) => value;\nconst ID_START = /^[$_\\p{ID_Start}]$/u;\nconst ID_CONTINUE = /^[$\\u200c\\u200d\\p{ID_Continue}]$/u;\nconst ID = /^[$_\\p{ID_Start}][$\\u200c\\u200d\\p{ID_Continue}]*$/u;\n/**\n * Escape text for stringify to path.\n */\nfunction escapeText(str) {\n    return str.replace(/[{}()\\[\\]+?!:*\\\\]/g, \"\\\\$&\");\n}\n/**\n * Escape a regular expression string.\n */\nfunction escape(str) {\n    return str.replace(/[.+*?^${}()[\\]|/\\\\]/g, \"\\\\$&\");\n}\n/**\n * Tokenized path instance.\n */\nclass TokenData {\n    constructor(tokens, originalPath) {\n        this.tokens = tokens;\n        this.originalPath = originalPath;\n    }\n}\nexports.TokenData = TokenData;\n/**\n * ParseError is thrown when there is an error processing the path.\n */\nclass PathError extends TypeError {\n    constructor(message, originalPath) {\n        let text = message;\n        if (originalPath)\n            text += `: ${originalPath}`;\n        text += `; visit https://git.new/pathToRegexpError for info`;\n        super(text);\n        this.originalPath = originalPath;\n    }\n}\nexports.PathError = PathError;\n/**\n * Parse a string for the raw tokens.\n */\nfunction parse(str, options = {}) {\n    const { encodePath = NOOP_VALUE } = options;\n    const chars = [...str];\n    let index = 0;\n    function consumeUntil(end) {\n        const output = [];\n        let path = \"\";\n        function writePath() {\n            if (!path)\n                return;\n            output.push({\n                type: \"text\",\n                value: encodePath(path),\n            });\n            path = \"\";\n        }\n        while (index < chars.length) {\n            const value = chars[index++];\n            if (value === end) {\n                writePath();\n                return output;\n            }\n            if (value === \"\\\\\") {\n                if (index === chars.length) {\n                    throw new PathError(`Unexpected end after \\\\ at index ${index}`, str);\n                }\n                path += chars[index++];\n                continue;\n            }\n            if (value === \":\" || value === \"*\") {\n                const type = value === \":\" ? \"param\" : \"wildcard\";\n                let name = \"\";\n                if (ID_START.test(chars[index])) {\n                    do {\n                        name += chars[index++];\n                    } while (ID_CONTINUE.test(chars[index]));\n                }\n                else if (chars[index] === '\"') {\n                    let quoteStart = index;\n                    while (index < chars.length) {\n                        if (chars[++index] === '\"') {\n                            index++;\n                            quoteStart = 0;\n                            break;\n                        }\n                        // Increment over escape characters.\n                        if (chars[index] === \"\\\\\")\n                            index++;\n                        name += chars[index];\n                    }\n                    if (quoteStart) {\n                        throw new PathError(`Unterminated quote at index ${quoteStart}`, str);\n                    }\n                }\n                if (!name) {\n                    throw new PathError(`Missing parameter name at index ${index}`, str);\n                }\n                writePath();\n                output.push({ type, name });\n                continue;\n            }\n            if (value === \"{\") {\n                writePath();\n                output.push({\n                    type: \"group\",\n                    tokens: consumeUntil(\"}\"),\n                });\n                continue;\n            }\n            if (value === \"}\" ||\n                value === \"(\" ||\n                value === \")\" ||\n                value === \"[\" ||\n                value === \"]\" ||\n                value === \"+\" ||\n                value === \"?\" ||\n                value === \"!\") {\n                throw new PathError(`Unexpected ${value} at index ${index - 1}`, str);\n            }\n            path += value;\n        }\n        if (end) {\n            throw new PathError(`Unexpected end at index ${index}, expected ${end}`, str);\n        }\n        writePath();\n        return output;\n    }\n    return new TokenData(consumeUntil(\"\"), str);\n}\n/**\n * Compile a string to a template function for the path.\n */\nfunction compile(path, options = {}) {\n    const { encode = encodeURIComponent, delimiter = DEFAULT_DELIMITER } = options;\n    const data = typeof path === \"object\" ? path : parse(path, options);\n    const fn = tokensToFunction(data.tokens, delimiter, encode);\n    return function path(params = {}) {\n        const missing = [];\n        const path = fn(params, missing);\n        if (missing.length) {\n            throw new TypeError(`Missing parameters: ${missing.join(\", \")}`);\n        }\n        return path;\n    };\n}\nfunction tokensToFunction(tokens, delimiter, encode) {\n    const encoders = tokens.map((token) => tokenToFunction(token, delimiter, encode));\n    return (data, missing) => {\n        let result = \"\";\n        for (const encoder of encoders) {\n            result += encoder(data, missing);\n        }\n        return result;\n    };\n}\n/**\n * Convert a single token into a path building function.\n */\nfunction tokenToFunction(token, delimiter, encode) {\n    if (token.type === \"text\")\n        return () => token.value;\n    if (token.type === \"group\") {\n        const fn = tokensToFunction(token.tokens, delimiter, encode);\n        return (data, missing) => {\n            const len = missing.length;\n            const value = fn(data, missing);\n            if (missing.length === len)\n                return value;\n            missing.length = len; // Reset optional group.\n            return \"\";\n        };\n    }\n    const encodeValue = encode || NOOP_VALUE;\n    if (token.type === \"wildcard\" && encode !== false) {\n        return (data, missing) => {\n            const value = data[token.name];\n            if (value == null) {\n                missing.push(token.name);\n                return \"\";\n            }\n            if (!Array.isArray(value) || value.length === 0) {\n                throw new TypeError(`Expected \"${token.name}\" to be a non-empty array`);\n            }\n            let result = \"\";\n            for (let i = 0; i < value.length; i++) {\n                if (typeof value[i] !== \"string\") {\n                    throw new TypeError(`Expected \"${token.name}/${i}\" to be a string`);\n                }\n                if (i > 0)\n                    result += delimiter;\n                result += encodeValue(value[i]);\n            }\n            return result;\n        };\n    }\n    return (data, missing) => {\n        const value = data[token.name];\n        if (value == null) {\n            missing.push(token.name);\n            return \"\";\n        }\n        if (typeof value !== \"string\") {\n            throw new TypeError(`Expected \"${token.name}\" to be a string`);\n        }\n        return encodeValue(value);\n    };\n}\n/**\n * Transform a path into a match function.\n */\nfunction match(path, options = {}) {\n    const { decode = decodeURIComponent, delimiter = DEFAULT_DELIMITER } = options;\n    const { regexp, keys } = pathToRegexp(path, options);\n    const decoders = keys.map((key) => {\n        if (decode === false)\n            return NOOP_VALUE;\n        if (key.type === \"param\")\n            return decode;\n        return (value) => value.split(delimiter).map(decode);\n    });\n    return function match(input) {\n        const m = regexp.exec(input);\n        if (!m)\n            return false;\n        const path = m[0];\n        const params = Object.create(null);\n        for (let i = 1; i < m.length; i++) {\n            if (m[i] === undefined)\n                continue;\n            const key = keys[i - 1];\n            const decoder = decoders[i - 1];\n            params[key.name] = decoder(m[i]);\n        }\n        return { path, params };\n    };\n}\n/**\n * Transform a path into a regular expression and capture keys.\n */\nfunction pathToRegexp(path, options = {}) {\n    const { delimiter = DEFAULT_DELIMITER, end = true, sensitive = false, trailing = true, } = options;\n    const keys = [];\n    let source = \"\";\n    let combinations = 0;\n    function process(path) {\n        if (Array.isArray(path)) {\n            for (const p of path)\n                process(p);\n            return;\n        }\n        const data = typeof path === \"object\" ? path : parse(path, options);\n        flatten(data.tokens, 0, [], (tokens) => {\n            if (combinations >= 256) {\n                throw new PathError(\"Too many path combinations\", data.originalPath);\n            }\n            if (combinations > 0)\n                source += \"|\";\n            source += toRegExpSource(tokens, delimiter, keys, data.originalPath);\n            combinations++;\n        });\n    }\n    process(path);\n    let pattern = `^(?:${source})`;\n    if (trailing)\n        pattern += \"(?:\" + escape(delimiter) + \"$)?\";\n    pattern += end ? \"$\" : \"(?=\" + escape(delimiter) + \"|$)\";\n    return { regexp: new RegExp(pattern, sensitive ? \"\" : \"i\"), keys };\n}\n/**\n * Generate a flat list of sequence tokens from the given tokens.\n */\nfunction flatten(tokens, index, result, callback) {\n    while (index < tokens.length) {\n        const token = tokens[index++];\n        if (token.type === \"group\") {\n            const len = result.length;\n            flatten(token.tokens, 0, result, (seq) => flatten(tokens, index, seq, callback));\n            result.length = len;\n            continue;\n        }\n        result.push(token);\n    }\n    callback(result);\n}\n/**\n * Transform a flat sequence of tokens into a regular expression.\n */\nfunction toRegExpSource(tokens, delimiter, keys, originalPath) {\n    let result = \"\";\n    let backtrack = \"\";\n    let wildcardBacktrack = \"\";\n    let prevCaptureType = 0;\n    let hasSegmentCapture = 0;\n    let index = 0;\n    function hasInSegment(index, type) {\n        while (index < tokens.length) {\n            const token = tokens[index++];\n            if (token.type === type)\n                return true;\n            if (token.type === \"text\") {\n                if (token.value.includes(delimiter))\n                    break;\n            }\n        }\n        return false;\n    }\n    function peekText(index) {\n        let result = \"\";\n        while (index < tokens.length) {\n            const token = tokens[index++];\n            if (token.type !== \"text\")\n                break;\n            result += token.value;\n        }\n        return result;\n    }\n    while (index < tokens.length) {\n        const token = tokens[index++];\n        if (token.type === \"text\") {\n            result += escape(token.value);\n            backtrack += token.value;\n            if (prevCaptureType === 2)\n                wildcardBacktrack += token.value;\n            if (token.value.includes(delimiter))\n                hasSegmentCapture = 0;\n            continue;\n        }\n        if (token.type === \"param\" || token.type === \"wildcard\") {\n            if (prevCaptureType && !backtrack) {\n                throw new PathError(`Missing text before \"${token.name}\" ${token.type}`, originalPath);\n            }\n            if (token.type === \"param\") {\n                result +=\n                    hasSegmentCapture & 2 // Seen wildcard in segment.\n                        ? `(${negate(delimiter, backtrack)}+)`\n                        : hasInSegment(index, \"wildcard\") // See wildcard later in segment.\n                            ? `(${negate(delimiter, peekText(index))}+)`\n                            : hasSegmentCapture & 1 // Seen parameter in segment.\n                                ? `(${negate(delimiter, backtrack)}+|${escape(backtrack)})`\n                                : `(${negate(delimiter, \"\")}+)`;\n                hasSegmentCapture |= prevCaptureType = 1;\n            }\n            else {\n                result +=\n                    hasSegmentCapture & 2 // Seen wildcard in segment.\n                        ? `(${negate(backtrack, \"\")}+)`\n                        : wildcardBacktrack // No capture in segment, seen wildcard in path.\n                            ? `(${negate(wildcardBacktrack, \"\")}+|${negate(delimiter, \"\")}+)`\n                            : `([^]+)`;\n                wildcardBacktrack = \"\";\n                hasSegmentCapture |= prevCaptureType = 2;\n            }\n            keys.push(token);\n            backtrack = \"\";\n            continue;\n        }\n        throw new TypeError(`Unknown token type: ${token.type}`);\n    }\n    return result;\n}\n/**\n * Block backtracking on previous text/delimiter.\n */\nfunction negate(a, b) {\n    if (b.length > a.length)\n        return negate(b, a); // Longest string first.\n    if (a === b)\n        b = \"\"; // Cleaner regex strings, no duplication.\n    if (b.length > 1)\n        return `(?:(?!${escape(a)}|${escape(b)})[^])`;\n    if (a.length > 1)\n        return `(?:(?!${escape(a)})[^${escape(b)}])`;\n    return `[^${escape(a + b)}]`;\n}\n/**\n * Stringify an array of tokens into a path string.\n */\nfunction stringifyTokens(tokens, index) {\n    let value = \"\";\n    while (index < tokens.length) {\n        const token = tokens[index++];\n        if (token.type === \"text\") {\n            value += escapeText(token.value);\n            continue;\n        }\n        if (token.type === \"group\") {\n            value += \"{\" + stringifyTokens(token.tokens, 0) + \"}\";\n            continue;\n        }\n        if (token.type === \"param\") {\n            value += \":\" + stringifyName(token.name, tokens[index]);\n            continue;\n        }\n        if (token.type === \"wildcard\") {\n            value += \"*\" + stringifyName(token.name, tokens[index]);\n            continue;\n        }\n        throw new TypeError(`Unknown token type: ${token.type}`);\n    }\n    return value;\n}\n/**\n * Stringify token data into a path string.\n */\nfunction stringify(data) {\n    return stringifyTokens(data.tokens, 0);\n}\n/**\n * Stringify a parameter name, escaping when it cannot be emitted directly.\n */\nfunction stringifyName(name, next) {\n    if (!ID.test(name))\n        return JSON.stringify(name);\n    if ((next === null || next === void 0 ? void 0 : next.type) === \"text\" && ID_CONTINUE.test(next.value[0])) {\n        return JSON.stringify(name);\n    }\n    return name;\n}\n//# sourceMappingURL=index.js.map","import { match } from \"path-to-regexp\";\n\n/**\n * A very simple router which can match request paths to URLs. It also provides for\n * parameter matching. e.g. /some/path/:param_name/\n */\nexport default class Router {\n    routes: object;\n\n    constructor(routes: object) {\n        this.routes = routes;\n    }\n\n    /**\n     * @param string pathname\n     * @returns any | void\n     */\n    public execute(pathname: string): any {\n        for (const [route, callback] of Object.entries(this.routes)) {\n            let result = this.urlMatch(route, pathname);\n\n            if (typeof result === \"object\" && result !== null) {\n                return callback(result.params);\n            }\n        }\n    }\n\n    /**\n     * @param route\n     * @param pathname\n     * @returns object | void\n     */\n    private urlMatch(route: string, pathname: string) {\n        return match(route, {\n            decode: decodeURIComponent,\n        })(pathname);\n    }\n}","import AdminPageViewLogger from \"./admin/AdminPageViewLogger\";\n\n// Checks if path is a valid dashboard page.\nfunction isHeartbeatAdminPage(requestPath: string) {\n    let invalidPaths = [\n        \"/dashboard/login\",\n        \"/dashboard/logout\",\n        \"/dashboard/password_reset\"\n    ];\n\n    for (var invalidPath of invalidPaths) {\n        if (requestPath.includes(invalidPath)) {\n            return false;\n        }\n    }\n\n    return true;\n}\n\nexport default function heartbeat() {\n    let requestPath: string = window.location.pathname;\n\n    // Check first if we are on a logged in dashboard page (i.e. not login/logout pages).\n    if (!isHeartbeatAdminPage(requestPath)) {\n        return;\n    }\n\n    // Do the heartbeat ping.\n    const doPing = () => {\n        fetch(\n            \"/newshour/classroom/dashboard/heartbeat\"\n        ).catch(err => {\n            console.log(err);\n        })\n\n    };\n\n    doPing();\n    setInterval(doPing, 3000);  // 5 minutes\n\n    // Clear the admin page view session data if needed.\n    if (!(requestPath.includes(\"/edit/\"))) {\n        let prevPageId = sessionStorage.getItem(AdminPageViewLogger.PAGE_ID_SESSION_KEY);\n\n        if (prevPageId !== null) {\n            AdminPageViewLogger.removeSessionData();\n        }\n    }\n}","import \"../css/admin.css\";\nimport UserCreationForm from './modules/admin/UserCreationForm';\nimport AdminPageViewLogger from './modules/admin/AdminPageViewLogger';\nimport Router from './modules/router';\nimport heartbeat from './modules/heartbeat';\n\n// Wagtail ships with jQuery.\n$(function () {\n    // Admin heartbeat to keep session alive.\n    heartbeat();\n\n    // Routes\n    const router = new Router({\n        \"/newshour/classroom/dashboard/users/add/\": function () {\n            UserCreationForm.create().main();\n        },\n        \"/newshour/classroom/dashboard/pages/:id/edit/\": function (params: any) {\n            AdminPageViewLogger.create(params.id).main();\n        }\n    });\n\n    router.execute(window.location.pathname);\n});"],"names":["UserCreationForm","togglePassword","getCookie","name","cookieValue","cookies","i","cookie","logUsePageViewStatus","AdminPageViewLogger","pageId","storedTabId","logInterval","storedPageId","postAPIData","data","textStatus","jqXHR","dupTabMessageElem","httpMethod","dist","parse","compile","match","pathToRegexp","stringify","DEFAULT_DELIMITER","NOOP_VALUE","value","ID_START","ID_CONTINUE","ID","escapeText","str","escape","TokenData","tokens","originalPath","PathError","message","text","options","encodePath","chars","index","consumeUntil","end","output","path","writePath","type","quoteStart","encode","delimiter","fn","tokensToFunction","params","missing","encoders","token","tokenToFunction","result","encoder","len","encodeValue","decode","regexp","keys","decoders","key","input","m","decoder","sensitive","trailing","source","combinations","process","p","flatten","toRegExpSource","pattern","callback","seq","backtrack","wildcardBacktrack","prevCaptureType","hasSegmentCapture","hasInSegment","peekText","negate","a","b","stringifyTokens","stringifyName","next","Router","routes","pathname","route","isHeartbeatAdminPage","requestPath","invalidPaths","invalidPath","heartbeat","doPing","err"],"mappings":"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","x_google_ignoreList":[3]}